From f968faeaf979fe1f5b96fb6e944f5984d116c400 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 2 Mar 2023 02:39:59 -0500 Subject: [PATCH 001/782] Specify manual deployment support for enterprise sponsors [faq] --- frontend/src/app/docs/api-docs/api-docs.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index 8c8d6ac36..2e9a12687 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -267,7 +267,7 @@ - You can manually install Mempool on your own Linux server, but this requires advanced sysadmin skills since you will be manually configuring everything. We do not provide support for manual deployments. + You can manually install Mempool on your own Linux server, but this requires advanced sysadmin skills since you will be manually configuring everything. We only provide support for manual deployments to enterprise sponsors. From e7ad857cc94bbfef3c2d55c94d0cb04eb200f95b Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 2 Mar 2023 03:12:56 -0500 Subject: [PATCH 002/782] Specify manual deployment support for enterprise sponsors [readme] --- backend/README.md | 2 +- production/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/README.md b/backend/README.md index be85d25af..ee934a14f 100644 --- a/backend/README.md +++ b/backend/README.md @@ -2,7 +2,7 @@ These instructions are mostly intended for developers. -If you choose to use these instructions for a production setup, be aware that you will still probably need to do additional configuration for your specific OS, environment, use-case, etc. We do our best here to provide a good starting point, but only proceed if you know what you're doing. Mempool does not provide support for custom setups. +If you choose to use these instructions for a production setup, be aware that you will still probably need to do additional configuration for your specific OS, environment, use-case, etc. We do our best here to provide a good starting point, but only proceed if you know what you're doing. Mempool only provides support for custom setups to [enterprise sponsors](https://mempool.space/enterprise). See other ways to set up Mempool on [the main README](/../../#installation-methods). diff --git a/production/README.md b/production/README.md index 91b087ffa..87b8bb0a1 100644 --- a/production/README.md +++ b/production/README.md @@ -2,7 +2,7 @@ These instructions are for setting up a serious production Mempool website for Bitcoin (mainnet, testnet, signet), Liquid (mainnet, testnet), and Bisq. -Again, this setup is no joke—home users should use [one of the other installation methods](../#installation-methods). +Again, this setup is no joke—home users should use [one of the other installation methods](../#installation-methods). Support is only provided to [enterprise sponsors](https://mempool.space/enterprise). ### Server Hardware From f493da4eac1fafd867cd08fd46675bb22d106a36 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sat, 4 Mar 2023 04:07:23 -0500 Subject: [PATCH 003/782] Generalize faq from linux to any server --- frontend/src/app/docs/api-docs/api-docs-data.ts | 4 ++-- frontend/src/app/docs/api-docs/api-docs.component.html | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/docs/api-docs/api-docs-data.ts b/frontend/src/app/docs/api-docs/api-docs-data.ts index 62d031613..9c5502bf1 100644 --- a/frontend/src/app/docs/api-docs/api-docs-data.ts +++ b/frontend/src/app/docs/api-docs/api-docs-data.ts @@ -8921,8 +8921,8 @@ export const faqData = [ type: "endpoint", category: "self-hosting", showConditions: bitcoinNetworks, - fragment: "host-my-own-instance-linux-server", - title: "How can I host my own instance on a Linux server?", + fragment: "host-my-own-instance-server", + title: "How can I host a Mempool instance on my own server?", }, { type: "endpoint", diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index 2e9a12687..313ff0b52 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -266,8 +266,9 @@ We support one-click installation on a number of Raspberry Pi full-node distros including Umbrel, RaspiBlitz, MyNode, RoninDojo, and Start9's Embassy. - - You can manually install Mempool on your own Linux server, but this requires advanced sysadmin skills since you will be manually configuring everything. We only provide support for manual deployments to enterprise sponsors. + +

You can manually install Mempool on your own server, but this requires advanced sysadmin skills since you will be manually configuring everything. You could also use our Docker images.

In any case, we only provide support for manual deployments to enterprise sponsors.

+

For casual users, we strongly suggest installing Mempool using one of the 1-click install methods.

From 5a5ebe843567fee662ab8e16c07b4fe32affa38f Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 6 Mar 2023 16:16:52 +0900 Subject: [PATCH 004/782] Remove fiat plus space fixes #3240 --- frontend/src/app/components/amount/amount.component.html | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/amount/amount.component.html b/frontend/src/app/components/amount/amount.component.html index 27fd59110..29f61ca41 100644 --- a/frontend/src/app/components/amount/amount.component.html +++ b/frontend/src/app/components/amount/amount.component.html @@ -1,7 +1,6 @@ - {{ addPlus && satoshis >= 0 ? '+' : '' }} - {{ + {{ addPlus && satoshis >= 0 ? '+' : '' }}{{ ( (blockConversion.price[currency] > -1 ? blockConversion.price[currency] : null) ?? (blockConversion.price['USD'] > -1 ? blockConversion.price['USD'] * blockConversion.exchangeRates['USD' + currency] : null) ?? 0 @@ -9,8 +8,7 @@ }} - {{ addPlus && satoshis >= 0 ? '+' : '' }} - {{ (conversions[currency] > -1 ? conversions[currency] : 0) * satoshis / 100000000 | fiatCurrency : digitsInfo : currency }} + {{ addPlus && satoshis >= 0 ? '+' : '' }}{{ (conversions[currency] > -1 ? conversions[currency] : 0) * satoshis / 100000000 | fiatCurrency : digitsInfo : currency }} From 8adacd4a0e4423c402a3abd353639b55b5445e1e Mon Sep 17 00:00:00 2001 From: wiz Date: Wed, 8 Mar 2023 16:14:43 +0900 Subject: [PATCH 005/782] ops: Add missing unfurl route in nginx/server-common.conf --- production/nginx/server-common.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/production/nginx/server-common.conf b/production/nginx/server-common.conf index 1d1bcbcd1..8c2f2bcea 100644 --- a/production/nginx/server-common.conf +++ b/production/nginx/server-common.conf @@ -65,6 +65,9 @@ location ~ ^/([a-z][a-z])/(.+\..+\.(js|css)) { } # cache everything else for 5 minutes location ~ ^/([a-z][a-z])$ { + if ($unfurlbot) { + proxy_pass $mempoolSpaceUnfurler; + } try_files $uri /$1/index.html /en-US/index.html =404; expires 5m; } From 901d32d8f70b263babaa2150dca9b3838e9391f6 Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 8 Mar 2023 16:26:56 +0900 Subject: [PATCH 006/782] Pull from transifex 8/3 --- frontend/src/locale/messages.ar.xlf | 189 ++--- frontend/src/locale/messages.cs.xlf | 686 +++++++++------ frontend/src/locale/messages.da.xlf | 1223 ++++++++++++++++++++------- frontend/src/locale/messages.de.xlf | 2 +- frontend/src/locale/messages.es.xlf | 2 +- frontend/src/locale/messages.fi.xlf | 207 +++-- frontend/src/locale/messages.fr.xlf | 2 +- frontend/src/locale/messages.ja.xlf | 2 +- frontend/src/locale/messages.ka.xlf | 2 +- frontend/src/locale/messages.lt.xlf | 2 +- frontend/src/locale/messages.nb.xlf | 215 +++-- frontend/src/locale/messages.nl.xlf | 190 ++--- frontend/src/locale/messages.pl.xlf | 704 +++++++++------ frontend/src/locale/messages.pt.xlf | 190 ++--- frontend/src/locale/messages.ro.xlf | 194 ++--- frontend/src/locale/messages.ru.xlf | 196 ++--- frontend/src/locale/messages.uk.xlf | 190 ++--- frontend/src/locale/messages.vi.xlf | 190 ++--- frontend/src/locale/messages.zh.xlf | 686 +++++++++------ 19 files changed, 2929 insertions(+), 2143 deletions(-) diff --git a/frontend/src/locale/messages.ar.xlf b/frontend/src/locale/messages.ar.xlf index 20e74f524..98e8c44c6 100644 --- a/frontend/src/locale/messages.ar.xlf +++ b/frontend/src/locale/messages.ar.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ الميم بول و مستكشف سلسلة الكتل خاص لمجتمع البتكوين ، يركز على سوق رسوم المعاملات للأنظمة متعددة الطبقات ، مستضاف ذاتيًا تمامًا دون الثقة بأي جهات خارجية. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ رعاة المشروع 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ رعاة من المجتمع ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ تكاملات (Integrations) مجتمعية src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ التحالفات المجتمعية src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ مترجمو المشروع src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ المساهمون في المشروع src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ أعضاء المشروع src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ فريق صيانة المشروع src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ حول src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -4309,6 +4305,7 @@ Go to "" + انتقل إلى "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4613,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4629,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5368,7 +5365,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5486,7 +5483,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5503,7 +5500,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5520,7 +5517,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5541,7 +5538,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5554,7 +5551,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5588,6 +5585,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5624,11 +5625,11 @@ قناة البرق src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5637,11 +5638,11 @@ آخر تحديث src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5657,11 +5658,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5670,7 +5671,7 @@ تاريخ الاغلاق src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5683,7 +5684,7 @@ مغلقة من src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5692,7 +5693,7 @@ عملية الفتح src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5701,7 +5702,7 @@ عملية الاغلاق src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5783,11 +5784,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -6059,10 +6060,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6116,11 +6113,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6158,7 +6155,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6174,11 +6171,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6216,9 +6213,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6296,11 +6301,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6313,7 +6318,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6326,7 +6331,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6339,21 +6344,12 @@ country - - No node found for public key "" - لم نعثر على نود للعنوان العام &quot' &quot' - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size متوسط حجم القناة src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6362,7 +6358,7 @@ متوسط مسافة القناة src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6371,7 +6367,7 @@ اللون src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6380,7 +6376,7 @@ مزود خدمة الانترنت src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6393,7 +6389,7 @@ حصرية على تور src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6402,7 +6398,7 @@ اشهار سيولة src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6411,7 +6407,7 @@ معدل رسوم العقد src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6421,7 +6417,7 @@ أساس رسوم العقد src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6430,7 +6426,7 @@ وزن التمويل src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6439,7 +6435,7 @@ معدل رسوم القناة src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6449,7 +6445,7 @@ أساس رسوم القناة src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6458,7 +6454,7 @@ عقد سريع src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6467,7 +6463,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6476,7 +6472,7 @@ قنوات مفتوحة src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6485,7 +6481,7 @@ قنوات مغلقة src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6555,9 +6551,8 @@ 112,107 - - Reachable on Clearnet Only - متاح على الكليرنت فقط + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6567,9 +6562,8 @@ 303,302 - - Reachable on Clearnet and Darknet - متاح على الكليرنت والداركنت + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6579,9 +6573,8 @@ 295,294 - - Reachable on Darknet Only - متاح على الداركنت فقط + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6837,24 +6830,6 @@ 27 - - Top 100 nodes liquidity ranking - أعلى 100 نود حسب السيولة - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - أعلى 100 نود حسب الاتصالية - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes أقدم الأنواد diff --git a/frontend/src/locale/messages.cs.xlf b/frontend/src/locale/messages.cs.xlf index 819f45f94..304f3fba4 100644 --- a/frontend/src/locale/messages.cs.xlf +++ b/frontend/src/locale/messages.cs.xlf @@ -359,11 +359,11 @@ src/app/components/block/block.component.html - 303,304 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -384,11 +384,11 @@ src/app/components/block/block.component.html - 304,305 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -598,7 +598,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -775,16 +775,24 @@ src/app/components/about/about.component.html - 385,389 + 375,378 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 88 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -795,14 +803,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 90 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -990,7 +1006,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1038,7 +1054,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1054,11 +1070,11 @@ src/app/components/block/block.component.html - 245,246 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 282,284 transaction.version @@ -1108,7 +1124,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1130,7 +1146,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1142,10 +1158,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1158,11 +1170,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1190,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 256,261 src/app/components/transaction/transaction.component.html - 406,412 + 400,406 transaction.details @@ -1211,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 243,247 src/app/components/transaction/transaction.component.html - 377,383 + 371,377 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1233,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 244,243 @@ -1253,7 +1265,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1269,7 +1281,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1440,7 +1452,7 @@ Náš průzkumník mempoolu a blockchainu pro bitcoinovou komunitu se zaměřením na trh transakčních poplatků a vícevrstvý ekosystém. Je zcela samostatně hostovaný bez nutnosti důvěry třetích stran. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1448,7 +1460,7 @@ Firemní sponzoři 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1457,7 +1469,7 @@ Komunitní sponzoři ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1466,7 +1478,7 @@ Komunitní integrace src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1475,7 +1487,7 @@ Komunitní aliance src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1484,7 +1496,7 @@ Překladatelé projektu src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1493,7 +1505,7 @@ Přispěvatelé projektu src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1502,7 +1514,7 @@ Členové projektu src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1511,7 +1523,7 @@ Správci projektu src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1520,7 +1532,7 @@ O projektu src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1569,7 +1581,7 @@ src/app/components/amount/amount.component.html - 6,9 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -1585,7 +1597,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2049,7 +2061,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -2065,7 +2077,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2077,7 +2089,7 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html @@ -2090,15 +2102,15 @@ Indexování bloků src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -2143,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 478 + 472 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2169,11 +2181,11 @@ src/app/components/transaction/transaction.component.html - 478,479 + 472 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2187,11 +2199,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 481,483 + 475,477 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2221,19 +2233,19 @@ src/app/components/block/block.component.html - 123,126 + 124,127 src/app/components/block/block.component.html - 127 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2273,27 +2285,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 483,486 + 477,480 src/app/components/transaction/transaction.component.html - 494,496 + 488,490 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2301,7 +2313,7 @@ src/app/dashboard/dashboard.component.html - 206,210 + 213,217 sat/vB shared.sat-vbyte @@ -2315,11 +2327,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 268,271 Transaction Virtual Size transaction.vsize @@ -2432,7 +2444,7 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html @@ -2462,11 +2474,11 @@ Velikost src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html @@ -2494,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 264,266 src/app/dashboard/dashboard.component.html @@ -2506,11 +2518,11 @@ Váha src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2522,7 +2534,18 @@ src/app/components/transaction/transaction.component.html - 278,280 + 272,274 + + + + Size per weight + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2538,15 +2561,6 @@ shared.block-title - - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee Střední poplatek @@ -2556,7 +2570,7 @@ src/app/components/block/block.component.html - 126,127 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2573,11 +2587,11 @@ src/app/components/block/block.component.html - 131,133 + 138,140 src/app/components/block/block.component.html - 157,160 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2595,7 +2609,7 @@ src/app/components/block/block.component.html - 166,168 + 173,175 block.miner @@ -2608,7 +2622,7 @@ src/app/components/block/block.component.ts - 234 + 242 @@ -2662,12 +2676,20 @@ 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2684,7 +2706,7 @@ Rozsah poplatků src/app/components/block/block.component.html - 122,123 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2697,7 +2719,7 @@ Na základě průměrné transakce nativního segwitu 140 vBytů src/app/components/block/block.component.html - 127,129 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2721,16 +2743,15 @@ Transaction fee tooltip - - Subsidy + fees: - Vytěžené + poplatky: + + Subsidy + fees src/app/components/block/block.component.html - 146,149 + 153,156 src/app/components/block/block.component.html - 161,165 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees @@ -2740,7 +2761,7 @@ Očekávané src/app/components/block/block.component.html - 209 + 216 block.expected @@ -2749,11 +2770,11 @@ beta src/app/components/block/block.component.html - 209,210 + 216,217 src/app/components/block/block.component.html - 215,217 + 222,224 beta @@ -2762,7 +2783,7 @@ Aktuální src/app/components/block/block.component.html - 211,215 + 218,222 block.actual @@ -2771,7 +2792,7 @@ Očekávaný blok src/app/components/block/block.component.html - 215 + 222 block.expected-block @@ -2780,7 +2801,7 @@ Aktuální blok src/app/components/block/block.component.html - 224 + 231 block.actual-block @@ -2789,7 +2810,7 @@ Bity src/app/components/block/block.component.html - 249,251 + 256,258 block.bits @@ -2798,7 +2819,7 @@ Merklův kořen src/app/components/block/block.component.html - 253,255 + 260,262 block.merkle-root @@ -2807,7 +2828,7 @@ Obtížnost src/app/components/block/block.component.html - 264,267 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2836,7 +2857,7 @@ Nonce src/app/components/block/block.component.html - 268,270 + 275,277 block.nonce @@ -2845,7 +2866,7 @@ Hlavička bloku Hex src/app/components/block/block.component.html - 272,273 + 279,280 block.header @@ -2854,7 +2875,7 @@ Audit src/app/components/block/block.component.html - 290,294 + 297,301 Toggle Audit block.toggle-audit @@ -2864,23 +2885,23 @@ Detaily src/app/components/block/block.component.html - 297,301 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 248,253 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2890,20 +2911,16 @@ Chyba při načítání dat. src/app/components/block/block.component.html - 316,318 + 323,325 src/app/components/block/block.component.html - 355,359 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2919,7 +2936,7 @@ Proč je tento blok prázdný? src/app/components/block/block.component.html - 377,383 + 384,390 block.empty-block-explanation @@ -3028,7 +3045,7 @@ src/app/dashboard/dashboard.component.html - 212,216 + 219,223 dashboard.txs @@ -3267,7 +3284,7 @@ src/app/dashboard/dashboard.component.html - 239,240 + 246,247 dashboard.incoming-transactions @@ -3280,7 +3297,7 @@ src/app/dashboard/dashboard.component.html - 242,245 + 249,252 dashboard.backend-is-synchronizing @@ -3293,7 +3310,7 @@ src/app/dashboard/dashboard.component.html - 247,252 + 254,259 vB/s shared.vbytes-per-second @@ -3307,7 +3324,7 @@ src/app/dashboard/dashboard.component.html - 210,211 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3683,6 +3700,32 @@ dashboard.adjustments + + Broadcast Transaction + Vyslat transakci + + src/app/components/mining-dashboard/mining-dashboard.component.html + 92 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) Štěstí poolů (1 týden) @@ -3750,7 +3793,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3780,12 +3823,24 @@ mining.rank + + Avg Health + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks Prázdné bloky src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3794,7 +3849,7 @@ Všichni těžaři src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3803,7 +3858,7 @@ Štěstí poolů (1t) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3812,7 +3867,7 @@ Počet poolů (1t) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3821,7 +3876,7 @@ Těžební pooly src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 @@ -4048,24 +4103,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - Vyslat transakci - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,162 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex Transakční hex @@ -4075,7 +4112,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 290,291 transaction.hex @@ -4200,6 +4237,71 @@ search-form.search-title + + Bitcoin Block Height + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + Přejít na "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) Mempool v vBytes (sat/vByte) @@ -4484,7 +4586,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4494,11 +4596,11 @@ Poprvé viděna src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4514,11 +4616,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4528,7 +4630,7 @@ ETA src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4538,7 +4640,7 @@ Za několik hodin (nebo více) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4548,11 +4650,11 @@ Potomek src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4562,7 +4664,7 @@ Předek src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4572,11 +4674,11 @@ Tok src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 340,344 Transaction flow transaction.flow @@ -4586,7 +4688,7 @@ Skrýt diagram src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4595,7 +4697,7 @@ Zobrazit více src/app/components/transaction/transaction.component.html - 231,233 + 225,227 src/app/components/transactions-list/transactions-list.component.html @@ -4612,7 +4714,7 @@ Zobrazit méně src/app/components/transaction/transaction.component.html - 233,239 + 227,233 src/app/components/transactions-list/transactions-list.component.html @@ -4625,7 +4727,7 @@ Zobrazit diagram src/app/components/transaction/transaction.component.html - 253,254 + 247,248 show-diagram @@ -4634,7 +4736,7 @@ Locktime src/app/components/transaction/transaction.component.html - 292,294 + 286,288 transaction.locktime @@ -4643,7 +4745,7 @@ Transakce nebyla nalezena. src/app/components/transaction/transaction.component.html - 455,456 + 449,450 transaction.error.transaction-not-found @@ -4652,7 +4754,7 @@ Čekání na to, až se objeví v mempoolu... src/app/components/transaction/transaction.component.html - 456,461 + 450,455 transaction.error.waiting-for-it-to-appear @@ -4661,7 +4763,7 @@ Efektivní poplatek src/app/components/transaction/transaction.component.html - 491,494 + 485,488 Effective transaction fee rate transaction.effective-fee-rate @@ -4810,7 +4912,7 @@ Zobrazit další vstupy pro odhalení údajů o poplatcích src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4819,7 +4921,7 @@ zbývající src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -5070,21 +5172,12 @@ dashboard.latest-transactions - - USD - USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee Minimální poplatek src/app/dashboard/dashboard.component.html - 203,204 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -5094,7 +5187,7 @@ Čištění src/app/dashboard/dashboard.component.html - 204,205 + 211,212 Purgin below fee dashboard.purging @@ -5104,7 +5197,7 @@ Využití paměti src/app/dashboard/dashboard.component.html - 216,217 + 223,224 Memory usage dashboard.memory-usage @@ -5114,10 +5207,18 @@ L-BTC v oběhu src/app/dashboard/dashboard.component.html - 230,232 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + faq.big-disclaimer + REST API service Služba REST API @@ -5254,7 +5355,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5372,7 +5473,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5389,7 +5490,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5406,7 +5507,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5427,7 +5528,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5440,7 +5541,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5452,7 +5553,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5474,6 +5575,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5510,11 +5615,11 @@ Lightning kanál src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5523,11 +5628,11 @@ Poslední aktualizace src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5543,11 +5648,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5556,7 +5661,7 @@ Datum uzavření src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5569,7 +5674,7 @@ Uzavřeno src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5578,7 +5683,7 @@ Otvírací transakce src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5587,7 +5692,7 @@ Uzavírací transakce src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5599,6 +5704,27 @@ 37 + + Mutually closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open Otevřeno @@ -5646,11 +5772,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5725,6 +5851,22 @@ shared.sats + + avg + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity Prům. kapacita @@ -5853,11 +5995,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5906,10 +6048,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5927,11 +6065,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + 28,29 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5963,11 +6101,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6005,7 +6143,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6021,11 +6159,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6063,9 +6201,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6095,6 +6241,28 @@ lightning.node-fee-distribution + + Outgoing Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week Procentuální změna za poslední týden @@ -6104,11 +6272,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -6121,11 +6289,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6138,7 +6306,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6151,7 +6319,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6164,21 +6332,12 @@ country - - No node found for public key "" - Pro veřejný klíč &quot;&quot; nebyl nalezen žádný uzel - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Průměrná velikost kanálu src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6187,7 +6346,7 @@ Průměrná vzdálenost kanálů src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6196,7 +6355,7 @@ Barva src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6205,7 +6364,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6218,7 +6377,7 @@ Výhradně na Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6227,7 +6386,7 @@ Inzerát na likviditu src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6236,7 +6395,7 @@ Sazba poplatku za pronájem src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6246,7 +6405,7 @@ Základní poplatek za pronájem src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6255,7 +6414,7 @@ Váha financování src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6264,7 +6423,7 @@ Sazba poplatku za kanál src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6274,7 +6433,7 @@ Základní poplatek za kanál src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6283,7 +6442,7 @@ Kompaktní pronájem src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6292,7 +6451,7 @@ Záznamy o rozšíření TLV src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6301,7 +6460,7 @@ Otevřené kanály src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6310,7 +6469,7 @@ Uzavřené kanály src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6356,7 +6515,7 @@ Nejsou k dispozici žádné geolokační údaje src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6380,9 +6539,8 @@ 112,107 - - Reachable on Clearnet Only - Dostupné pouze přes Clearnet + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6392,9 +6550,8 @@ 303,302 - - Reachable on Clearnet and Darknet - Dosažitelné na Clearnetu i Darknetu + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6404,9 +6561,8 @@ 295,294 - - Reachable on Darknet Only - Dostupné pouze na Darknetu + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6662,24 +6818,6 @@ 27 - - Top 100 nodes liquidity ranking - Žebříček likvidity 100 nejlepších uzlů - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Žebříček konektivity 100 nejlepších uzlů - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Nejstarší uzly diff --git a/frontend/src/locale/messages.da.xlf b/frontend/src/locale/messages.da.xlf index 4be32e796..da4ef358d 100644 --- a/frontend/src/locale/messages.da.xlf +++ b/frontend/src/locale/messages.da.xlf @@ -11,6 +11,7 @@ Slide of + Slide af node_modules/src/carousel/carousel.ts 175,181 @@ -147,6 +148,7 @@ + node_modules/src/progressbar/progressbar.ts 30,33 @@ -154,6 +156,7 @@ HH + HH node_modules/src/timepicker/timepicker.ts 226 @@ -161,6 +164,7 @@ Hours + Timer node_modules/src/timepicker/timepicker.ts 247,250 @@ -168,6 +172,7 @@ MM + MM node_modules/src/timepicker/timepicker.ts 272,274 @@ -175,6 +180,7 @@ Minutes + Minutter node_modules/src/timepicker/timepicker.ts 288,289 @@ -182,6 +188,7 @@ Increment hours + Juster timer op node_modules/src/timepicker/timepicker.ts 305,309 @@ -189,6 +196,7 @@ Decrement hours + Juster timer ned node_modules/src/timepicker/timepicker.ts 334,337 @@ -196,6 +204,7 @@ Increment minutes + Juster minutter op node_modules/src/timepicker/timepicker.ts 356,358 @@ -203,6 +212,7 @@ Decrement minutes + Juster minutter ned node_modules/src/timepicker/timepicker.ts 383,384 @@ -210,6 +220,7 @@ SS + SS node_modules/src/timepicker/timepicker.ts 410 @@ -217,6 +228,7 @@ Seconds + Sekunder node_modules/src/timepicker/timepicker.ts 429 @@ -224,6 +236,7 @@ Increment seconds + Juster sekunder op node_modules/src/timepicker/timepicker.ts 429 @@ -231,6 +244,7 @@ Decrement seconds + Juster sekunder op node_modules/src/timepicker/timepicker.ts 429 @@ -279,6 +293,7 @@ Total received + Modtaget i alt src/app/bisq/bisq-address/bisq-address.component.html 20 @@ -295,6 +310,7 @@ Total sent + Sent i alt src/app/bisq/bisq-address/bisq-address.component.html 24 @@ -343,11 +359,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -368,11 +384,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -399,6 +415,7 @@ Hash + Hash src/app/bisq/bisq-block/bisq-block.component.html 19 @@ -409,12 +426,13 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash Timestamp + Tidsstempel src/app/bisq/bisq-block/bisq-block.component.html 23 @@ -433,7 +451,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -455,6 +473,7 @@ Previous hash + Forrige hash src/app/bisq/bisq-block/bisq-block.component.html 37 @@ -476,6 +495,7 @@ BSQ Blocks + BSQ Blokke src/app/bisq/bisq-blocks/bisq-blocks.component.html 2,7 @@ -484,6 +504,7 @@ Height + Højde src/app/bisq/bisq-blocks/bisq-blocks.component.html 12,14 @@ -525,6 +546,7 @@ Transactions + Transaktioner src/app/bisq/bisq-blocks/bisq-blocks.component.html 15,18 @@ -553,6 +575,7 @@ Blocks + Blokke src/app/bisq/bisq-blocks/bisq-blocks.component.ts 38 @@ -571,11 +594,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -593,6 +616,7 @@ Markets + Markeder src/app/bisq/bisq-dashboard/bisq-dashboard.component.html 20,21 @@ -605,6 +629,7 @@ Bitcoin Markets + Bitcoin markeder src/app/bisq/bisq-dashboard/bisq-dashboard.component.html 21,24 @@ -714,6 +739,7 @@ View more » + Se mere » src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 92,97 @@ -749,16 +775,24 @@ src/app/components/about/about.component.html - 385,389 + 375,378 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 88 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -769,14 +803,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 90 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -852,6 +894,7 @@ Burnt amount + Destrueret mængde src/app/bisq/bisq-stats/bisq-stats.component.html 20 @@ -872,6 +915,7 @@ Addresses + Adresser src/app/bisq/bisq-stats/bisq-stats.component.html 24 @@ -900,6 +944,7 @@ Unspent TXOs + Ubrugte TXOs src/app/bisq/bisq-stats/bisq-stats.component.html 28 @@ -916,6 +961,7 @@ Spent TXOs + Brugte TXOs src/app/bisq/bisq-stats/bisq-stats.component.html 32 @@ -924,6 +970,7 @@ Market cap + Markedsværdi src/app/bisq/bisq-stats/bisq-stats.component.html 40 @@ -936,6 +983,7 @@ Date + Dato src/app/bisq/bisq-trades/bisq-trades.component.html 4,6 @@ -943,6 +991,7 @@ Amount + Mængde src/app/bisq/bisq-trades/bisq-trades.component.html 9,12 @@ -957,11 +1006,12 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 Inputs + Input src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.html 7 @@ -970,6 +1020,7 @@ Outputs + Output src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.html 11 @@ -978,6 +1029,7 @@ Issued amount + Udstedt mængde src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.html 15 @@ -991,6 +1043,7 @@ Type + Type src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.html 25 @@ -1001,7 +1054,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1010,22 +1063,24 @@ Version + Version src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.html 29 src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 282,284 transaction.version Transaction + Transaktion src/app/bisq/bisq-transaction/bisq-transaction.component.html 6,11 @@ -1054,6 +1109,7 @@ confirmation + bekræftelse src/app/bisq/bisq-transaction/bisq-transaction.component.html 20,21 @@ -1068,13 +1124,14 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular confirmations + bekræftelser src/app/bisq/bisq-transaction/bisq-transaction.component.html 21,22 @@ -1089,43 +1146,42 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural Included in block + Inkluderet i blok src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block Features + Funktioner src/app/bisq/bisq-transaction/bisq-transaction.component.html 49,51 src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features Fee per vByte + Gebyr pr. vByte src/app/bisq/bisq-transaction/bisq-transaction.component.html 69,71 @@ -1135,6 +1191,7 @@ Details + Detaljer src/app/bisq/bisq-transaction/bisq-transaction.component.html 89,92 @@ -1145,16 +1202,17 @@ src/app/components/transaction/transaction.component.html - 262,267 + 256,261 src/app/components/transaction/transaction.component.html - 406,412 + 400,406 transaction.details Inputs & Outputs + Input & Output src/app/bisq/bisq-transaction/bisq-transaction.component.html 97,105 @@ -1165,17 +1223,18 @@ src/app/components/transaction/transaction.component.html - 249,253 + 243,247 src/app/components/transaction/transaction.component.html - 377,383 + 371,377 Transaction inputs and outputs transaction.inputs-and-outputs Transaction: + Transaktion: src/app/bisq/bisq-transaction/bisq-transaction.component.ts 50 @@ -1186,11 +1245,12 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 244,243 BSQ Transactions + BSQ Transaktioner src/app/bisq/bisq-transactions/bisq-transactions.component.html 2,5 @@ -1198,13 +1258,14 @@ TXID + TXID src/app/bisq/bisq-transactions/bisq-transactions.component.html 18,19 src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1213,19 +1274,21 @@ Confirmed + Bekræftet src/app/bisq/bisq-transactions/bisq-transactions.component.html 21,24 src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed Asset listing fee + Noteringsgebyr for asset src/app/bisq/bisq-transactions/bisq-transactions.component.ts 31 @@ -1233,6 +1296,7 @@ Blind vote + Blind stemme src/app/bisq/bisq-transactions/bisq-transactions.component.ts 32 @@ -1240,6 +1304,7 @@ Compensation request + Anmodning om erstatning src/app/bisq/bisq-transactions/bisq-transactions.component.ts 33 @@ -1247,6 +1312,7 @@ Genesis + Tilblivelse src/app/bisq/bisq-transactions/bisq-transactions.component.ts 34 @@ -1262,6 +1328,7 @@ Irregular + Uregelmæssig src/app/bisq/bisq-transactions/bisq-transactions.component.ts 35 @@ -1269,6 +1336,7 @@ Lockup + Fastlåst src/app/bisq/bisq-transactions/bisq-transactions.component.ts 36 @@ -1276,6 +1344,7 @@ Pay trade fee + Betal handelsgebyr src/app/bisq/bisq-transactions/bisq-transactions.component.ts 37 @@ -1283,6 +1352,7 @@ Proof of burn + Bevis for destruktion src/app/bisq/bisq-transactions/bisq-transactions.component.ts 38 @@ -1290,6 +1360,7 @@ Proposal + Forslag src/app/bisq/bisq-transactions/bisq-transactions.component.ts 39 @@ -1297,6 +1368,7 @@ Reimbursement request + Refusionsanmodning src/app/bisq/bisq-transactions/bisq-transactions.component.ts 40 @@ -1304,6 +1376,7 @@ Transfer BSQ + Overfør BSQ src/app/bisq/bisq-transactions/bisq-transactions.component.ts 41 @@ -1311,6 +1384,7 @@ Unlock + Lås op src/app/bisq/bisq-transactions/bisq-transactions.component.ts 42 @@ -1318,6 +1392,7 @@ Vote reveal + Vis stemme src/app/bisq/bisq-transactions/bisq-transactions.component.ts 43 @@ -1325,6 +1400,7 @@ Filter + Filter src/app/bisq/bisq-transactions/bisq-transactions.component.ts 57,56 @@ -1373,40 +1449,45 @@ Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties. + Vores mempool og blockchain opdagelsesværktøj til Bitcoin-communityet, med fokus på markedet for transaktionsgebyrer og alle økosystemets lag. Komplet selv-hostet uden nogen betroede tredjeparter. src/app/components/about/about.component.html - 13,17 + 13,16 Enterprise Sponsors 🚀 + Virksomhedssponsorer 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket Community Sponsors ❤️ + Sponsorer fra communityet ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart Community Integrations + En del af følgende communities src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations Community Alliances + Community alliancer src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1415,7 +1496,7 @@ Oversættere src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1424,7 +1505,7 @@ Bidragsydere src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1433,7 +1514,7 @@ Medlemmer src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1442,7 +1523,7 @@ Vedligeholdere src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1451,7 +1532,7 @@ Om src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1463,11 +1544,12 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 Multisig of + Multisig af src/app/components/address-labels/address-labels.component.ts 107 @@ -1499,7 +1581,7 @@ src/app/components/amount/amount.component.html - 6,9 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -1515,7 +1597,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1568,6 +1650,7 @@ There many transactions on this address, more than your backend can handle. See more on setting up a stronger backend. Consider viewing this address on the official Mempool website instead: + Der er flere transaktioner på denne adresse, end din backend kan håndtere. Læs mere på om opsætning af en kraftigere backend . Du kan i stedet slå adresse op på den officielle Mempool hjemmmeside: src/app/components/address/address.component.html 134,137 @@ -1576,6 +1659,7 @@ Asset + Aktiv src/app/components/asset/asset.component.html 3 @@ -1596,7 +1680,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1606,6 +1690,7 @@ Precision + Præcision src/app/components/asset/asset.component.html 25 @@ -1615,6 +1700,7 @@ Issuer + Udsteder src/app/components/asset/asset.component.html 29 @@ -1624,6 +1710,7 @@ Issuance TX + Udstedelse TX src/app/components/asset/asset.component.html 33 @@ -1633,6 +1720,7 @@ Pegged in + Fastgjort ind src/app/components/asset/asset.component.html 37 @@ -1642,6 +1730,7 @@ Pegged out + Fastgjort ud src/app/components/asset/asset.component.html 41 @@ -1651,6 +1740,7 @@ Burned amount + Destrueret mængde src/app/components/asset/asset.component.html 49 @@ -1660,6 +1750,7 @@ Circulating amount + Cirkulerende mængde src/app/components/asset/asset.component.html 53 @@ -1673,6 +1764,7 @@ of   + af src/app/components/asset/asset.component.html 78 @@ -1681,6 +1773,7 @@ Peg In/Out and Burn Transactions + Fastgjorte ind/ud og destruerede transaktioner src/app/components/asset/asset.component.html 79 @@ -1689,6 +1782,7 @@ Issuance and Burn Transactions + Udstedte og destruerede transaktioner src/app/components/asset/asset.component.html 80 @@ -1697,6 +1791,7 @@ Error loading asset data. + Fejl ved indlæsning af aktivdata. src/app/components/asset/asset.component.html 150 @@ -1705,6 +1800,7 @@ Asset: + Aktiv: src/app/components/asset/asset.component.ts 75 @@ -1712,6 +1808,7 @@ Group of assets + Gruppe af aktiver src/app/components/assets/asset-group/asset-group.component.html 8,9 @@ -1723,6 +1820,7 @@ Assets + Aktiver src/app/components/assets/assets-nav/assets-nav.component.html 3 @@ -1743,6 +1841,7 @@ Featured + Udvalgte src/app/components/assets/assets-nav/assets-nav.component.html 9 @@ -1750,6 +1849,7 @@ All + Alle src/app/components/assets/assets-nav/assets-nav.component.html 13 @@ -1777,6 +1877,7 @@ Search asset + Søg efter aktiv src/app/components/assets/assets-nav/assets-nav.component.html 19 @@ -1785,6 +1886,7 @@ Clear + Ryd src/app/components/assets/assets-nav/assets-nav.component.html 21 @@ -1793,45 +1895,49 @@ Ticker + Ticker src/app/components/assets/assets.component.html 5,6 src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header Issuer domain + Udsteders domæne src/app/components/assets/assets.component.html 6,9 src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header Asset ID + Aktiv-id src/app/components/assets/assets.component.html 7,10 src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header Error loading assets data. + Fejl ved indlæsning af aktivdata. src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -1871,6 +1977,7 @@ Layer 2 Networks + Lag 2 netværk src/app/components/bisq-master-page/bisq-master-page.component.html 50,51 @@ -1887,6 +1994,7 @@ Dashboard + Panel src/app/components/bisq-master-page/bisq-master-page.component.html 60,62 @@ -1903,6 +2011,7 @@ Stats + Stats src/app/components/bisq-master-page/bisq-master-page.component.html 69,71 @@ -1924,6 +2033,7 @@ Block Fee Rates + Blokafgiftssatser src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.html 6,8 @@ -1940,6 +2050,7 @@ At block: + Ved blok: src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts 188 @@ -1950,11 +2061,12 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 Around block: + Omkring blok: src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts 190 @@ -1965,18 +2077,19 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 Block Fees + Blokgebyrer src/app/components/block-fees-graph/block-fees-graph.component.html 6,7 src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html @@ -1986,17 +2099,18 @@ Indexing blocks + Indekserer blokke src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -2021,6 +2135,7 @@ not available + ikke tilgængelig src/app/components/block-overview-graph/block-overview-graph.component.html 5 @@ -2029,6 +2144,7 @@ Fee + Gebyr src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 22 @@ -2039,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 476 + 472 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2065,28 +2181,29 @@ src/app/components/transaction/transaction.component.html - 476,477 + 472 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat Fee rate + Gebyrsats src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 26 src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 475,477 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2098,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,42 Transaction fee rate transaction.fee-rate @@ -2116,19 +2233,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2168,27 +2285,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 477,480 src/app/components/transaction/transaction.component.html - 492,494 + 488,490 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2196,30 +2313,32 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte Virtual size + Virtuel størrelse src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 32 src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 268,271 Transaction Virtual Size transaction.vsize Audit status + Revisionsstatus src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 36 @@ -2228,6 +2347,7 @@ Match + Match src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 38 @@ -2236,6 +2356,7 @@ Removed + Fjernet src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 39 @@ -2244,6 +2365,7 @@ Marginal fee rate + Marginal gebyrsats src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 40 @@ -2256,6 +2378,7 @@ Recently broadcasted + For nylig udsendt src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 41 @@ -2264,6 +2387,7 @@ Added + Tilføjet src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 42 @@ -2272,6 +2396,7 @@ Block Prediction Accuracy + Blokforudsigelsesnøjagtighed src/app/components/block-prediction-graph/block-prediction-graph.component.html 6,8 @@ -2288,6 +2413,7 @@ No data to display yet. Try again later. + Ingen data at vise endnu. Prøv igen senere. src/app/components/block-prediction-graph/block-prediction-graph.component.ts 108,103 @@ -2303,6 +2429,7 @@ Match rate + Match rate src/app/components/block-prediction-graph/block-prediction-graph.component.ts 189,187 @@ -2310,13 +2437,14 @@ Block Rewards + Blokbelønninger src/app/components/block-rewards-graph/block-rewards-graph.component.html 7,8 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html @@ -2326,6 +2454,7 @@ Block Sizes and Weights + Blokstørrelser og -vægte src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.html 5,7 @@ -2342,17 +2471,18 @@ Size + Størrelse src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2376,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 264,266 src/app/dashboard/dashboard.component.html @@ -2385,13 +2515,14 @@ Weight + Vægt src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2399,15 +2530,28 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 272,274 + + + + Size per weight + Størrelse pr. vægt + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 Block + Blok src/app/components/block/block-preview.component.html 3,7 @@ -2418,23 +2562,16 @@ shared.block-title - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee + Mediangebyr src/app/components/block/block-preview.component.html 36,37 src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2451,11 +2588,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2466,29 +2603,32 @@ Miner + Miner src/app/components/block/block-preview.component.html 53,55 src/app/components/block/block.component.html - 168,170 + 173,175 block.miner Block : + Blok : src/app/components/block/block-preview.component.ts 98 src/app/components/block/block.component.ts - 227 + 242 Next Block + Næste blok src/app/components/block/block.component.html 8,9 @@ -2501,38 +2641,56 @@ Previous Block + Forrige blok src/app/components/block/block.component.html 15,16 Previous Block - - Block health + + Health + Helbred src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown Ukendt src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2546,9 +2704,10 @@ Fee span + Gebyrspænd src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2558,9 +2717,10 @@ Based on average native segwit transaction of 140 vBytes + Baseret på en gennemsnitlig "native segwit"-transaktion på 140 vBytes src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2584,56 +2744,75 @@ Transaction fee tooltip - - Subsidy + fees: + + Subsidy + fees + Tilskud + gebyrer src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected + Forventet src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + beta + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual + Faktiske src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block + Forventet blok src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block + Faktisk blok src/app/components/block/block.component.html - 225,227 + 231 block.actual-block Bits + Bits src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2642,7 +2821,7 @@ Merkle-træ src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2651,7 +2830,7 @@ Sværhedsgrad src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2677,42 +2856,54 @@ Nonce + Nonce src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce Block Header Hex + Blokhoved Hex src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + Revision + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details Detaljer src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 248,253 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2722,20 +2913,16 @@ Fejl ved indlæsning af data. src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2748,14 +2935,16 @@ Why is this block empty? + Hvorfor er denne blok tom? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation Pool + Pool src/app/components/blocks-list/blocks-list.component.html 14 @@ -2776,6 +2965,7 @@ Mined + Minet src/app/components/blocks-list/blocks-list.component.html 16,17 @@ -2794,20 +2984,9 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward + Belønning src/app/components/blocks-list/blocks-list.component.html 20,21 @@ -2845,6 +3024,7 @@ TXs + TXs src/app/components/blocks-list/blocks-list.component.html 23,24 @@ -2867,7 +3047,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -2912,6 +3092,7 @@ Remaining + Tilbage src/app/components/difficulty/difficulty.component.html 7,9 @@ -2924,6 +3105,7 @@ blocks + blokke src/app/components/difficulty/difficulty.component.html 10,11 @@ -2948,6 +3130,7 @@ block + blok src/app/components/difficulty/difficulty.component.html 11,12 @@ -2964,6 +3147,7 @@ Estimate + Estimat src/app/components/difficulty/difficulty.component.html 16,17 @@ -2976,6 +3160,7 @@ Previous + Forrige src/app/components/difficulty/difficulty.component.html 31,33 @@ -3006,6 +3191,7 @@ Either 2x the minimum, or the Low Priority rate (whichever is lower) + Enten 2x minimum eller lavprioritetssatsen (alt efter hvad der er lavest) src/app/components/fees-box/fees-box.component.html 4,7 @@ -3027,6 +3213,7 @@ Usually places your transaction in between the second and third mempool blocks + Normalt kommer din transaktion med i enten den anden eller tredje mempool-blok src/app/components/fees-box/fees-box.component.html 8,9 @@ -3048,6 +3235,7 @@ Usually places your transaction in between the first and second mempool blocks + Normalt kommer din transaktion med i den første eller anden mempool-blok src/app/components/fees-box/fees-box.component.html 9,10 @@ -3069,6 +3257,7 @@ Places your transaction in the first mempool block + Placerer din transaktion i den første mempool-blok src/app/components/fees-box/fees-box.component.html 10,14 @@ -3097,7 +3286,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3110,7 +3299,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3123,7 +3312,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3137,13 +3326,14 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed Mempool size + Mempoolens størrelse src/app/components/footer/footer.component.html 23,24 @@ -3153,6 +3343,7 @@ Mining + Mining src/app/components/graphs/graphs.component.html 8 @@ -3161,6 +3352,7 @@ Pools Ranking + Pool rangering src/app/components/graphs/graphs.component.html 11 @@ -3173,6 +3365,7 @@ Pools Dominance + Pool dominans src/app/components/graphs/graphs.component.html 13 @@ -3185,6 +3378,7 @@ Hashrate & Difficulty + Hashrate og sværhedsgrad src/app/components/graphs/graphs.component.html 15,16 @@ -3193,6 +3387,7 @@ Lightning + Lightning src/app/components/graphs/graphs.component.html 31 @@ -3201,6 +3396,7 @@ Lightning Nodes Per Network + Lightningnoder pr. netværk src/app/components/graphs/graphs.component.html 34 @@ -3221,6 +3417,7 @@ Lightning Network Capacity + Lightning Netværkets kapacitet src/app/components/graphs/graphs.component.html 36 @@ -3241,6 +3438,7 @@ Lightning Nodes Per ISP + Lightningnoder pr. internetudbyder src/app/components/graphs/graphs.component.html 38 @@ -3253,6 +3451,7 @@ Lightning Nodes Per Country + Lightningnoder pr. land src/app/components/graphs/graphs.component.html 40 @@ -3269,6 +3468,7 @@ Lightning Nodes World Map + Verdenskort over Lightningnoder src/app/components/graphs/graphs.component.html 42 @@ -3285,6 +3485,7 @@ Lightning Nodes Channels World Map + Verdenskort over lightningnodernes kanaler src/app/components/graphs/graphs.component.html 44 @@ -3297,6 +3498,7 @@ Hashrate + Hashrate src/app/components/hashrate-chart/hashrate-chart.component.html 8,10 @@ -3325,6 +3527,7 @@ Hashrate & Difficulty + Hashrate og sværhedsgrad src/app/components/hashrate-chart/hashrate-chart.component.html 27,29 @@ -3337,6 +3540,7 @@ Hashrate (MA) + Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts 292,291 @@ -3348,6 +3552,7 @@ Pools Historical Dominance + Pools historisk dominans src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts 64 @@ -3355,6 +3560,7 @@ Indexing network hashrate + Indeksering af netværkets hashrate src/app/components/indexing-progress/indexing-progress.component.html 2 @@ -3362,6 +3568,7 @@ Indexing pools hashrate + Indeksering af pools hashrate src/app/components/indexing-progress/indexing-progress.component.html 3 @@ -3369,13 +3576,14 @@ Graphs + Grafer src/app/components/liquid-master-page/liquid-master-page.component.html 71,74 src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3385,6 +3593,7 @@ Mining Dashboard + Mining panel src/app/components/master-page/master-page.component.html 41,43 @@ -3397,9 +3606,10 @@ Lightning Explorer + Lightning Explorer src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3407,19 +3617,12 @@ master-page.lightning - - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation + Dokumentation src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3429,6 +3632,7 @@ Stack of mempool blocks + Stakke af mempool blokke src/app/components/mempool-block/mempool-block.component.ts 77 @@ -3436,6 +3640,7 @@ Mempool block + Mempool blok src/app/components/mempool-block/mempool-block.component.ts 79 @@ -3443,6 +3648,7 @@ Range + Rækkevidde src/app/components/mempool-graph/mempool-graph.component.ts 259 @@ -3450,6 +3656,7 @@ Sum + Sum src/app/components/mempool-graph/mempool-graph.component.ts 261 @@ -3457,6 +3664,7 @@ Reward stats + Belønningsstatistik src/app/components/mining-dashboard/mining-dashboard.component.html 10 @@ -3465,6 +3673,7 @@ (144 blocks) + (144 blokke) src/app/components/mining-dashboard/mining-dashboard.component.html 11 @@ -3473,6 +3682,7 @@ Latest blocks + Seneste blokke src/app/components/mining-dashboard/mining-dashboard.component.html 53 @@ -3485,14 +3695,42 @@ Adjustments + Justeringer src/app/components/mining-dashboard/mining-dashboard.component.html 67 dashboard.adjustments + + Broadcast Transaction + Udsend transaktion + + src/app/components/mining-dashboard/mining-dashboard.component.html + 92 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) + Puljers held (1 uge) src/app/components/pool-ranking/pool-ranking.component.html 9 @@ -3501,6 +3739,7 @@ Pools luck + Pool held src/app/components/pool-ranking/pool-ranking.component.html 9,11 @@ -3509,6 +3748,7 @@ The overall luck of all mining pools over the past week. A luck bigger than 100% means the average block time for the current epoch is less than 10 minutes. + Det overordnede held for alle mining pools i løbet af den seneste uge. Et nummer større end 100% betyder, at den gennemsnitlige tid mellem blokke i den aktuelle epoke er under 10 minutter. src/app/components/pool-ranking/pool-ranking.component.html 11,15 @@ -3517,6 +3757,7 @@ Pools count (1w) + Pool antal (1u) src/app/components/pool-ranking/pool-ranking.component.html 17 @@ -3525,6 +3766,7 @@ Pools count + Pool antal src/app/components/pool-ranking/pool-ranking.component.html 17,19 @@ -3533,6 +3775,7 @@ How many unique pools found at least one block over the past week. + Hvor mange unikke pools fandt mindst én blok i løbet af den seneste uge. src/app/components/pool-ranking/pool-ranking.component.html 19,23 @@ -3541,6 +3784,7 @@ Blocks (1w) + Blokke (1u) src/app/components/pool-ranking/pool-ranking.component.html 25 @@ -3551,12 +3795,13 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks The number of blocks found over the past week. + Antallet af blokke fundet i løbet af den seneste uge. src/app/components/pool-ranking/pool-ranking.component.html 27,31 @@ -3565,6 +3810,7 @@ Rank + Rang src/app/components/pool-ranking/pool-ranking.component.html 90,92 @@ -3579,47 +3825,66 @@ mining.rank - - Empty blocks + + Avg Health + Gns. helbred src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + + + Empty blocks + Tomme blokke + + src/app/components/pool-ranking/pool-ranking.component.html + 97,100 mining.empty-blocks All miners + Alle miners src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners Pools Luck (1w) + Pools held (1u) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck Pools Count (1w) + Antal pools (1w) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count Mining Pools + Mining Pools src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 blocks + blokke src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3631,6 +3896,7 @@ mining pool + mining pool src/app/components/pool/pool-preview.component.html 3,5 @@ -3639,6 +3905,7 @@ Tags + Tags src/app/components/pool/pool-preview.component.html 18,19 @@ -3663,6 +3930,7 @@ Show all + Vis alt src/app/components/pool/pool.component.html 53,55 @@ -3687,6 +3955,7 @@ Hide + Skjul src/app/components/pool/pool.component.html 55,58 @@ -3695,6 +3964,7 @@ Hashrate (24h) + Hashrate (24t) src/app/components/pool/pool.component.html 91,93 @@ -3715,6 +3985,7 @@ Estimated + Anslået src/app/components/pool/pool.component.html 96,97 @@ -3735,6 +4006,7 @@ Reported + Rapporteret src/app/components/pool/pool.component.html 97,98 @@ -3755,6 +4027,7 @@ Luck + Held src/app/components/pool/pool.component.html 98,101 @@ -3775,6 +4048,7 @@ Mined blocks + Minede blokke src/app/components/pool/pool.component.html 141,143 @@ -3795,6 +4069,7 @@ 24h + 24t src/app/components/pool/pool.component.html 147 @@ -3807,6 +4082,7 @@ 1w + 1u src/app/components/pool/pool.component.html 148 @@ -3819,6 +4095,7 @@ Coinbase tag + Coinbase tag src/app/components/pool/pool.component.html 215,217 @@ -3829,37 +4106,22 @@ latest-blocks.coinbasetag - - Broadcast Transaction - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex + Transaktion hex src/app/components/push-transaction/push-transaction.component.html 6 src/app/components/transaction/transaction.component.html - 296,297 + 290,291 transaction.hex Miners Reward + Minernes belønning src/app/components/reward-stats/reward-stats.component.html 5 @@ -3876,6 +4138,7 @@ Amount being paid to miners in the past 144 blocks + Beløb, der blev betalt til miners i de sidste 144 blokke src/app/components/reward-stats/reward-stats.component.html 6,8 @@ -3884,6 +4147,7 @@ Avg Block Fees + Gns. blokgebyrer src/app/components/reward-stats/reward-stats.component.html 17 @@ -3896,6 +4160,7 @@ Average fees per block in the past 144 blocks + Gennemsnitlige gebyrer pr. blok i de seneste 144 blokke src/app/components/reward-stats/reward-stats.component.html 18,20 @@ -3904,6 +4169,7 @@ BTC/block + BTC/blok src/app/components/reward-stats/reward-stats.component.html 21,24 @@ -3913,6 +4179,7 @@ Avg Tx Fee + Gns. Tx-gebyr src/app/components/reward-stats/reward-stats.component.html 30 @@ -3925,6 +4192,7 @@ Fee paid on average for each transaction in the past 144 blocks + Gebyr betalt i gennemsnit for hver transaktion i de seneste 144 blokke src/app/components/reward-stats/reward-stats.component.html 31,32 @@ -3933,6 +4201,7 @@ sats/tx + sats/tx src/app/components/reward-stats/reward-stats.component.html 33,36 @@ -3942,6 +4211,7 @@ Reward Per Tx + Belønning pr. Tx src/app/components/reward-stats/reward-stats.component.html 53,56 @@ -3954,6 +4224,7 @@ Explore the full Bitcoin ecosystem + Udforsk hele Bitcoin-økosystemet src/app/components/search-form/search-form.component.html 4,5 @@ -3962,14 +4233,88 @@ Search + Søg src/app/components/search-form/search-form.component.html 9,16 search-form.search-title + + Bitcoin Block Height + Bitcoin Blokhøjde + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + Bitcoin transaktion + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + Bitcoin adresse + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + Bitcoin blok + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + Bitcoin adresser + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + Lightning noder + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + Lightning kanaler + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + Gå til "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) + Mempool i vBytes (sat/vByte) src/app/components/statistics/statistics.component.html 7 @@ -3978,6 +4323,7 @@ TV view + TV visning src/app/components/statistics/statistics.component.html 18 @@ -3990,6 +4336,7 @@ Filter + Filter src/app/components/statistics/statistics.component.html 57 @@ -3998,6 +4345,7 @@ Invert + Vend om src/app/components/statistics/statistics.component.html 76 @@ -4006,6 +4354,7 @@ Transaction vBytes per second (vB/s) + Transaktion vBytes pr. sekund (vB/s) src/app/components/statistics/statistics.component.html 96 @@ -4014,6 +4363,7 @@ Just now + Lige nu src/app/components/time-since/time-since.component.ts 64 @@ -4025,6 +4375,7 @@ ago + siden src/app/components/time-since/time-since.component.ts 74 @@ -4084,6 +4435,7 @@ After + Efter src/app/components/time-span/time-span.component.ts 67 @@ -4143,6 +4495,7 @@ In ~ + Om ~ src/app/components/time-until/time-until.component.ts 66 @@ -4206,6 +4559,7 @@ This transaction has been replaced by: + Denne transaktion er blevet erstattet af: src/app/components/transaction/transaction.component.html 5,6 @@ -4215,6 +4569,7 @@ This transaction replaced: + Denne transaktion erstattede: src/app/components/transaction/transaction.component.html 10,12 @@ -4224,6 +4579,7 @@ Replaced + Erstattet src/app/components/transaction/transaction.component.html 36,39 @@ -4233,26 +4589,28 @@ Unconfirmed + Ubekræftet src/app/components/transaction/transaction.component.html 39,46 src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed First seen + Først set src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4268,81 +4626,88 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen ETA + ETA src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta In several hours (or more) + Om adskillige timer (eller senere) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours Descendant + Efterkommer src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant Ancestor + Forfader src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor Flow + Flow src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 340,344 Transaction flow transaction.flow Hide diagram + Skjul diagram src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram Show more + Vis mere src/app/components/transaction/transaction.component.html - 231,233 + 225,227 src/app/components/transactions-list/transactions-list.component.html @@ -4356,9 +4721,10 @@ Show less + Vis mindre src/app/components/transaction/transaction.component.html - 233,239 + 227,233 src/app/components/transactions-list/transactions-list.component.html @@ -4368,47 +4734,53 @@ Show diagram + Vis diagram src/app/components/transaction/transaction.component.html - 253,254 + 247,248 show-diagram Locktime + Låsetid src/app/components/transaction/transaction.component.html - 292,294 + 286,288 transaction.locktime Transaction not found. + Transaktionen blev ikke fundet. src/app/components/transaction/transaction.component.html - 455,456 + 449,450 transaction.error.transaction-not-found Waiting for it to appear in the mempool... + Venter på, at den dukker op i mempoolen... src/app/components/transaction/transaction.component.html - 456,461 + 450,455 transaction.error.waiting-for-it-to-appear Effective fee rate + Effektiv gebyrsats src/app/components/transaction/transaction.component.html - 489,492 + 485,488 Effective transaction fee rate transaction.effective-fee-rate Coinbase + Coinbase src/app/components/transactions-list/transactions-list.component.html 52 @@ -4417,6 +4789,7 @@ (Newly Generated Coins) + (Nyligt skabte coins) src/app/components/transactions-list/transactions-list.component.html 52 @@ -4425,6 +4798,7 @@ Peg-in + Peg-in src/app/components/transactions-list/transactions-list.component.html 54,56 @@ -4433,6 +4807,7 @@ ScriptSig (ASM) + ScriptSig (ASM) src/app/components/transactions-list/transactions-list.component.html 101,103 @@ -4442,6 +4817,7 @@ ScriptSig (HEX) + ScriptSig (HEX) src/app/components/transactions-list/transactions-list.component.html 105,108 @@ -4451,6 +4827,7 @@ Witness + Vidne src/app/components/transactions-list/transactions-list.component.html 110,112 @@ -4459,6 +4836,7 @@ P2SH redeem script + P2SH indløse script src/app/components/transactions-list/transactions-list.component.html 128,129 @@ -4467,6 +4845,7 @@ P2TR tapscript + P2TR tapscript src/app/components/transactions-list/transactions-list.component.html 132,134 @@ -4475,6 +4854,7 @@ P2WSH witness script + P2WSH vidne script src/app/components/transactions-list/transactions-list.component.html 134,136 @@ -4483,6 +4863,7 @@ nSequence + nSequence src/app/components/transactions-list/transactions-list.component.html 139,141 @@ -4491,6 +4872,7 @@ Previous output script + Tidligere output script src/app/components/transactions-list/transactions-list.component.html 144,145 @@ -4499,6 +4881,7 @@ Previous output type + Tidligere outputtype src/app/components/transactions-list/transactions-list.component.html 148,149 @@ -4507,6 +4890,7 @@ Peg-out to + Peg-out til src/app/components/transactions-list/transactions-list.component.html 189,190 @@ -4515,6 +4899,7 @@ ScriptPubKey (ASM) + ScriptPubKey (ASM) src/app/components/transactions-list/transactions-list.component.html 248,250 @@ -4524,6 +4909,7 @@ ScriptPubKey (HEX) + ScriptPubKey (HEX) src/app/components/transactions-list/transactions-list.component.html 252,255 @@ -4533,22 +4919,25 @@ Show more inputs to reveal fee data + Vis flere input for at se gebyrdata src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info remaining + tilbage src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining other inputs + andre input src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 12 @@ -4557,6 +4946,7 @@ other outputs + andre output src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 13 @@ -4565,6 +4955,7 @@ Input + Input src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 42 @@ -4577,6 +4968,7 @@ Output + Output src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 43 @@ -4589,6 +4981,7 @@ This transaction saved % on fees by using native SegWit + Denne transaktion sparede % i gebyr ved at bruge native SegWit src/app/components/tx-features/tx-features.component.html 2 @@ -4597,6 +4990,7 @@ SegWit + SegWit src/app/components/tx-features/tx-features.component.html 2 @@ -4614,6 +5008,7 @@ This transaction saved % on fees by using SegWit and could save % more by fully upgrading to native SegWit + Denne transaktion sparede % i gebyr ved at bruge SegWit og kunne spare % mere ved at opgradere til native SegWit src/app/components/tx-features/tx-features.component.html 4 @@ -4622,6 +5017,7 @@ This transaction could save % on fees by upgrading to native SegWit or % by upgrading to SegWit-P2SH + Denne transaktion kunne spare % i gebyr ved at opgradere til native SegWit eller % ved at opgradere til SegWit-P2SH src/app/components/tx-features/tx-features.component.html 6 @@ -4630,6 +5026,7 @@ This transaction uses Taproot and thereby saved at least % on fees + Denne transaktion bruger Taproot og sparer derfor mindst % i gebyr src/app/components/tx-features/tx-features.component.html 12 @@ -4638,6 +5035,7 @@ Taproot + Taproot src/app/components/tx-features/tx-features.component.html 12 @@ -4663,6 +5061,7 @@ This transaction uses Taproot and already saved at least % on fees, but could save an additional % by fully using Taproot + Denne transaktion benytter Taproot og har allerede sparet mindst % i gebyr, men kunne spare yderligere % ved fuldt ud at benytte Taproot src/app/components/tx-features/tx-features.component.html 14 @@ -4671,6 +5070,7 @@ This transaction could save % on fees by using Taproot + Denne transaktion kunne spare % i gebyr ved at bruge Taproot src/app/components/tx-features/tx-features.component.html 16 @@ -4679,6 +5079,7 @@ This transaction does not use Taproot + Denne transaktion bruger ikke Taproot src/app/components/tx-features/tx-features.component.html 18 @@ -4687,6 +5088,7 @@ This transaction uses Taproot + Denne transaktion bruger Taproot src/app/components/tx-features/tx-features.component.html 21 @@ -4695,6 +5097,7 @@ This transaction supports Replace-By-Fee (RBF) allowing fee bumping + Denne transaktion understøtter Replace-By-Fee (RBF), hvilket tillader gebyrbumping src/app/components/tx-features/tx-features.component.html 28 @@ -4703,6 +5106,7 @@ RBF + RBF src/app/components/tx-features/tx-features.component.html 28 @@ -4716,6 +5120,7 @@ This transaction does NOT support Replace-By-Fee (RBF) and cannot be fee bumped using this method + Denne transaktion understøtter IKKE Replace-By-Fee (RBF) og derfor tillades gebyrbumpning ikke. src/app/components/tx-features/tx-features.component.html 29 @@ -4724,6 +5129,7 @@ Optimal + Optimalt src/app/components/tx-fee-rating/tx-fee-rating.component.html 1 @@ -4733,6 +5139,7 @@ Only ~ sat/vB was needed to get into this block + Kun ~ sat/vB var nødvendig for at komme med i denne blok src/app/components/tx-fee-rating/tx-fee-rating.component.html 2 @@ -4745,6 +5152,7 @@ Overpaid x + Overbetalte x src/app/components/tx-fee-rating/tx-fee-rating.component.html 2 @@ -4758,6 +5166,7 @@ Transaction Fees + Transaktionsgebyrer src/app/dashboard/dashboard.component.html 6,9 @@ -4766,96 +5175,107 @@ Latest transactions + Seneste transaktioner src/app/dashboard/dashboard.component.html 120,123 dashboard.latest-transactions - - USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee + Minimumsgebyr src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee Purging + Udrensning src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging Memory usage + Hukommelsesbrug src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage L-BTC in circulation + L-BTC i omløb src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation - - REST API service + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space leverer udelukkende data om Bitcoin-netværket. Siden kan ikke hjælpe dig med at få penge tilbage, bekræfte dine transaktion hurtigere eller lignende. src/app/docs/api-docs/api-docs.component.html - 39,40 + 13 + + faq.big-disclaimer + + + REST API service + REST API service + + src/app/docs/api-docs/api-docs.component.html + 41,42 api-docs.title Endpoint + Endpoint src/app/docs/api-docs/api-docs.component.html - 48,49 + 50,51 src/app/docs/api-docs/api-docs.component.html - 102,105 + 104,107 Api docs endpoint Description + Beskrivelse src/app/docs/api-docs/api-docs.component.html - 67,68 + 69,70 src/app/docs/api-docs/api-docs.component.html - 106,107 + 108,109 Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. + Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 107,108 + 109,110 api-docs.websocket.websocket Code Example + Kode eksempel src/app/docs/code-template/code-template.component.html 6,7 @@ -4876,6 +5296,7 @@ Install Package + Installer pakke src/app/docs/code-template/code-template.component.html 23,24 @@ -4884,6 +5305,7 @@ Response + Svar src/app/docs/code-template/code-template.component.html 43,44 @@ -4892,6 +5314,7 @@ FAQ + FAQ src/app/docs/docs/docs.component.ts 34 @@ -4899,6 +5322,7 @@ API + API src/app/docs/docs/docs.component.ts 37 @@ -4914,6 +5338,7 @@ Base fee + Basisgebyr src/app/lightning/channel/channel-box/channel-box.component.html 29 @@ -4926,6 +5351,7 @@ mSats + mSats src/app/lightning/channel/channel-box/channel-box.component.html 35 @@ -4940,12 +5366,13 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats This channel supports zero base fee routing + Denne kanal understøtter routing uden basisgebyr src/app/lightning/channel/channel-box/channel-box.component.html 44 @@ -4954,6 +5381,7 @@ Zero base fee + Intet basisgebyr src/app/lightning/channel/channel-box/channel-box.component.html 45 @@ -4962,6 +5390,7 @@ This channel does not support zero base fee routing + Denne kanal understøtter ikke routing uden basisgebyr src/app/lightning/channel/channel-box/channel-box.component.html 50 @@ -4970,6 +5399,7 @@ Non-zero base fee + Kræver basisgebyr src/app/lightning/channel/channel-box/channel-box.component.html 51 @@ -4978,6 +5408,7 @@ Min HTLC + Min HTLC src/app/lightning/channel/channel-box/channel-box.component.html 57 @@ -4986,6 +5417,7 @@ Max HTLC + Max HTLC src/app/lightning/channel/channel-box/channel-box.component.html 63 @@ -4994,6 +5426,7 @@ Timelock delta + Timelock delta src/app/lightning/channel/channel-box/channel-box.component.html 69 @@ -5002,18 +5435,20 @@ channels + kanaler src/app/lightning/channel/channel-box/channel-box.component.html 79 src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 lightning.x-channels Starting balance + Balance ved start src/app/lightning/channel/channel-close-box/channel-close-box.component.html 6 @@ -5023,6 +5458,7 @@ Closing balance + Balance ved lukning src/app/lightning/channel/channel-close-box/channel-close-box.component.html 12 @@ -5032,6 +5468,7 @@ lightning channel + lightning kanal src/app/lightning/channel/channel-preview.component.html 3,5 @@ -5040,33 +5477,35 @@ Inactive + Inaktiv src/app/lightning/channel/channel-preview.component.html 10,11 src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html - 65,66 + 68,69 status.inactive Active + Aktiv src/app/lightning/channel/channel-preview.component.html 11,12 src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html - 66,68 + 69,71 status.active @@ -5079,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5087,35 +5526,37 @@ src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed Created + Oprettet src/app/lightning/channel/channel-preview.component.html 23,26 src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created Capacity + Kapacitet src/app/lightning/channel/channel-preview.component.html 27,28 src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 src/app/lightning/node-statistics/node-statistics.component.html @@ -5123,7 +5564,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5145,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5157,6 +5602,7 @@ ppm + ppm src/app/lightning/channel/channel-preview.component.html 34,35 @@ -5177,25 +5623,27 @@ Lightning channel + Lightning kanal src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel Last update + Sidste ændring src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5211,59 +5659,89 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update Closing date + Lukkedato src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,43 lightning.closing_date Closed by + Lukket af src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by Opening transaction + Åbningstransaktion src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction Closing transaction + Lukningstransaktion src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction Channel: + Kanal: src/app/lightning/channel/channel.component.ts 37 + + Mutually closed + Gensidigt lukket + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + Tvangslukket + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + Tvangslukket med straf + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open + Åben src/app/lightning/channels-list/channels-list.component.html 5,7 @@ -5272,17 +5750,19 @@ No channels to display + Ingen kanaler at vise src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list Alias + Alias src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5306,39 +5786,42 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias Status + Status src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status Channel ID + Kanal-id src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id sats + sats src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,67 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5382,8 +5865,27 @@ shared.sats + + avg + gns. + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + med. + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity + Gns. kapacitet src/app/lightning/channels-statistics/channels-statistics.component.html 13,15 @@ -5396,6 +5898,7 @@ Avg Fee Rate + Gns. gebyrsats src/app/lightning/channels-statistics/channels-statistics.component.html 26,28 @@ -5408,6 +5911,7 @@ The average fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + Den gennemsnitlige gebyrsats, der opkræves af routingnoder, fraregnet gebyrer større end 0,5 % eller 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 28,30 @@ -5416,6 +5920,7 @@ Avg Base Fee + Gns. basisgebyr src/app/lightning/channels-statistics/channels-statistics.component.html 41,43 @@ -5428,6 +5933,7 @@ The average base fee charged by routing nodes, ignoring base fees > 5000ppm + Det gennemsnitlige basisgebyr, der opkræves af routingnoder, fraregnet gebyrer over 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 43,45 @@ -5436,6 +5942,7 @@ Med Capacity + Med. kapacitet src/app/lightning/channels-statistics/channels-statistics.component.html 59,61 @@ -5444,6 +5951,7 @@ Med Fee Rate + Med. gebyrsats src/app/lightning/channels-statistics/channels-statistics.component.html 72,74 @@ -5452,6 +5960,7 @@ The median fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + Median gebyrsatsen, der opkræves af routingnoder, fraregnet gebyrer større end 0,5 % eller 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 74,76 @@ -5460,6 +5969,7 @@ Med Base Fee + Med. basisgebyr src/app/lightning/channels-statistics/channels-statistics.component.html 87,89 @@ -5468,6 +5978,7 @@ The median base fee charged by routing nodes, ignoring base fees > 5000ppm + Median basisgebyr, der opkræves af routingnoder, fraregnet gebyrer over 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 89,91 @@ -5476,6 +5987,7 @@ Lightning node group + Lightning node gruppe src/app/lightning/group/group-preview.component.html 3,5 @@ -5488,6 +6000,7 @@ Nodes + Noder src/app/lightning/group/group-preview.component.html 25,29 @@ -5498,11 +6011,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5524,6 +6037,7 @@ Liquidity + Likviditet src/app/lightning/group/group-preview.component.html 29,31 @@ -5550,16 +6064,13 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity Channels + Kanaler src/app/lightning/group/group-preview.component.html 40,43 @@ -5570,11 +6081,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + 28,29 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5606,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -5620,6 +6131,7 @@ Average size + Gennemsnitsstørrelse src/app/lightning/group/group-preview.component.html 44,46 @@ -5632,6 +6144,7 @@ Location + Lokation src/app/lightning/group/group.component.html 74,77 @@ -5646,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5662,16 +6175,17 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location Network Statistics + Netværksstatistik src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 10 @@ -5680,6 +6194,7 @@ Channels Statistics + Kanalstatistik src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 24 @@ -5688,6 +6203,7 @@ Lightning Network History + Lightning Netværk historie src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 49 @@ -5696,13 +6212,22 @@ Liquidity Ranking + Likviditetsrangering src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -5712,6 +6237,7 @@ Connectivity Ranking + Forbindelsesrangering src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 76 @@ -5724,41 +6250,68 @@ Fee distribution + Gebyrfordeling src/app/lightning/node-fee-chart/node-fee-chart.component.html 2 lightning.node-fee-distribution + + Outgoing Fees + Udgående gebyrer + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + Indgående gebyrer + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week + Procentvis ændring sidste uge src/app/lightning/node-statistics/node-statistics.component.html 5,7 src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week Lightning node + Lightning node src/app/lightning/node/node-preview.component.html 3,5 src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -5771,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -5784,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -5797,28 +6350,21 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Gennemsnitlig kanalstørrelse src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg Avg channel distance + Gns. kanalafstand src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -5827,7 +6373,7 @@ Farve src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -5836,7 +6382,7 @@ Internetudbyder src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -5849,73 +6395,81 @@ Udelukkende på Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor Liquidity ad + Likviditetsannonce src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad Lease fee rate + Gebyrsats for leasing src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate Lease base fee + Grundgebyr for leasing src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee Funding weight + Finansieringsvægt src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight Channel fee rate + Kanalgebyrsats src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate Channel base fee + Kanalbasisgebyr src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee Compact lease + Kompakt lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease TLV extension records + TLV-udvidelsesposter src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -5924,7 +6478,7 @@ Åbne kanaler src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -5933,12 +6487,13 @@ Lukkede kanaler src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels Node: + Node: src/app/lightning/node/node.component.ts 60 @@ -5946,6 +6501,7 @@ (Tor nodes excluded) + (Tor-noder ekskluderet) src/app/lightning/nodes-channels-map/nodes-channels-map.component.html 8,11 @@ -5966,6 +6522,7 @@ Lightning Nodes Channels World Map + Verdenskort for Lightning Node-kanaler src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 69 @@ -5973,9 +6530,10 @@ No geolocation data available + Ingen geolokationsdata tilgængelige src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -5989,6 +6547,7 @@ Indexing in progress + Indeksering i gang src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 121,116 @@ -5998,8 +6557,9 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet + Clearnet og Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6009,8 +6569,9 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) + Kun Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6020,8 +6581,9 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) + Kun Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6046,6 +6608,7 @@ nodes + noder src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 103,102 @@ -6069,6 +6632,7 @@ Lightning nodes in + Lightning noder i src/app/lightning/nodes-per-country/nodes-per-country.component.html 3,4 @@ -6086,6 +6650,7 @@ Top ISP + Top internetudbyder src/app/lightning/nodes-per-country/nodes-per-country.component.html 38,40 @@ -6094,6 +6659,7 @@ Lightning nodes in + Lightning noder i src/app/lightning/nodes-per-country/nodes-per-country.component.ts 35 @@ -6101,6 +6667,7 @@ Clearnet Capacity + Clearnet kapacitet src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6113,6 +6680,7 @@ How much liquidity is running on nodes advertising at least one clearnet IP address + Hvor meget likviditet er på noder, der annoncerer mindst én clearnet IP-adresse src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 8,9 @@ -6134,6 +6702,7 @@ How much liquidity is running on nodes which ISP was not identifiable + Hvor meget likviditet er på noder, hvor internetudbyderen ikke var identificerbar src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 15,16 @@ -6155,6 +6724,7 @@ How much liquidity is running on nodes advertising only Tor addresses + Hvor meget likviditet er på noder, der kun annoncerer Tor-adresser src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 22,23 @@ -6163,6 +6733,7 @@ Top 100 ISPs hosting LN nodes + Top 100 internetudbydere, der hoster LN-noder src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 31,33 @@ -6171,6 +6742,7 @@ BTC + BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 158,156 @@ -6182,6 +6754,7 @@ Lightning ISP + Lightning ISP src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 3,5 @@ -6203,6 +6776,7 @@ Top node + Top node src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 45,48 @@ -6211,6 +6785,7 @@ Lightning nodes on ISP: [AS] + Lightning noder på ISP: [AS] src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts 44 @@ -6222,6 +6797,7 @@ Lightning nodes on ISP: + Lightning noder på ISP: src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 2,4 @@ -6239,6 +6815,7 @@ Active nodes + Aktive noder src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 14,18 @@ -6247,6 +6824,7 @@ Top 100 oldest lightning nodes + Top 100 ældste lightning noder src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.html 3,7 @@ -6255,29 +6833,15 @@ Oldest lightning nodes + Ældste lightning noder src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.ts 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes + Ældste noder src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html 36 @@ -6286,6 +6850,7 @@ Top lightning nodes + Top lightning noder src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.ts 22 diff --git a/frontend/src/locale/messages.de.xlf b/frontend/src/locale/messages.de.xlf index c09016a1e..7f6a177eb 100644 --- a/frontend/src/locale/messages.de.xlf +++ b/frontend/src/locale/messages.de.xlf @@ -4305,7 +4305,7 @@ Go to "" - Gehe zu &quot;&quot; + Gehe zu "" src/app/components/search-form/search-results/search-results.component.html 52 diff --git a/frontend/src/locale/messages.es.xlf b/frontend/src/locale/messages.es.xlf index 5bb69bfd9..a4d01ac86 100644 --- a/frontend/src/locale/messages.es.xlf +++ b/frontend/src/locale/messages.es.xlf @@ -4305,7 +4305,7 @@ Go to "" - Ir a &quot;&quot; + Ir a "" src/app/components/search-form/search-results/search-results.component.html 52 diff --git a/frontend/src/locale/messages.fi.xlf b/frontend/src/locale/messages.fi.xlf index 5a95d0dd8..cdec5efd5 100644 --- a/frontend/src/locale/messages.fi.xlf +++ b/frontend/src/locale/messages.fi.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ Mempool- ja lohkoketjuselaimemme Bitcoin yhteisölle, joka keskittyy siirtomaksumarkkinoihin ja monikerroksiseen ekosysteemiin, täysin itse ylläpidetty ilman luotettuja kolmansia osapuolia. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Yrityssponsorit 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Yhteisösponsorit ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Yhteisön integraatiot src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Yhteisöliittoumat src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ Projektin kääntäjät src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ Projektin avustajat src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ Projektin jäsenet src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ Projektin ylläpitäjät src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ Tietoja src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2539,6 +2539,7 @@ Size per weight + Koko painon mukaan src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts 200,199 @@ -2685,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2894,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2922,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -3830,6 +3827,7 @@ Avg Health + Keskimääräinen terveys src/app/components/pool-ranking/pool-ranking.component.html 96,97 @@ -4244,6 +4242,7 @@ Bitcoin Block Height + Bitcoin-lohkon korkeus src/app/components/search-form/search-results/search-results.component.html 3 @@ -4252,6 +4251,7 @@ Bitcoin Transaction + Bitcoin siirtotapahtuma src/app/components/search-form/search-results/search-results.component.html 9 @@ -4260,6 +4260,7 @@ Bitcoin Address + Bitcoin osoite src/app/components/search-form/search-results/search-results.component.html 15 @@ -4268,6 +4269,7 @@ Bitcoin Block + Bitcoin lohko src/app/components/search-form/search-results/search-results.component.html 21 @@ -4276,6 +4278,7 @@ Bitcoin Addresses + Bitcoin osoitteet src/app/components/search-form/search-results/search-results.component.html 27 @@ -4284,6 +4287,7 @@ Lightning Nodes + Lightning osoitteet src/app/components/search-form/search-results/search-results.component.html 35 @@ -4292,6 +4296,7 @@ Lightning Channels + Lightning kanavat src/app/components/search-form/search-results/search-results.component.html 43 @@ -4300,6 +4305,7 @@ Go to "" + Siirry "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4604,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4620,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5217,6 +5223,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space tarjoaa vain tietoja Bitcoin-verkosta. Se ei voi auttaa sinua varojen saamisessa, siirtotapahtuman vahvistamisessa nopeammin jne. src/app/docs/api-docs/api-docs.component.html 13 @@ -5359,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5477,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5494,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5511,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5532,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5545,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5579,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5615,11 +5626,11 @@ Salamakanava src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5628,11 +5639,11 @@ Viimeisin päivitys src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5648,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5661,7 +5672,7 @@ Päättymispäivä src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5674,7 +5685,7 @@ Sulkenut src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5683,7 +5694,7 @@ Avaava transaktio src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5692,7 +5703,7 @@ Sulkeva transaktio src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5706,6 +5717,7 @@ Mutually closed + Molemminpuolisesti suljettu src/app/lightning/channel/closing-type/closing-type.component.ts 20 @@ -5713,6 +5725,7 @@ Force closed + Pakko suljettu src/app/lightning/channel/closing-type/closing-type.component.ts 24 @@ -5720,6 +5733,7 @@ Force closed with penalty + Pakko suljettu rangaistuksella src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -5772,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5853,6 +5867,7 @@ avg + keskimääräinen src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -5861,6 +5876,7 @@ med + kohtalainen src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -6048,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6105,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6147,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6163,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6205,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6287,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6304,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6317,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6330,21 +6350,12 @@ country - - No node found for public key "" - Julkiselle avaimelle &quot;&quot; ei löytynyt solmua - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Kanavan keskimääräinen koko src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6353,7 +6364,7 @@ Keskimääräinen kanavaetäisyys src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6362,7 +6373,7 @@ Väri src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6371,7 +6382,7 @@ Palveluntarjoaja src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6384,7 +6395,7 @@ Ainoastaan Tor-verkossa src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6393,7 +6404,7 @@ Likviditeetti ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6402,7 +6413,7 @@ Vuokra siirtomaksun taso src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6412,7 +6423,7 @@ Vuokra perus siirtokulu src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6421,7 +6432,7 @@ Rahoituspaino src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6430,7 +6441,7 @@ Kanava siirtomaksu taso src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6440,7 +6451,7 @@ Kanava perus siirtomaksu src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6449,7 +6460,7 @@ Kompakti vuokraus src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6458,7 +6469,7 @@ TLV-laajennustiedot src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6467,7 +6478,7 @@ Avoimet kanavat src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6476,7 +6487,7 @@ Suljetut kanavat src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6546,9 +6557,9 @@ 112,107 - - Reachable on Clearnet Only - Tavoitettavissa vain Clearnetistä + + Clearnet and Darknet + Julkinenverkko ja Pimeäverkko src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6558,9 +6569,9 @@ 303,302 - - Reachable on Clearnet and Darknet - Tavoitettavissa Clearnetissä ja Darknetissä + + Clearnet Only (IPv4, IPv6) + Vain Julkinenverkko (IPv4, IPV6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6570,9 +6581,9 @@ 295,294 - - Reachable on Darknet Only - Tavoitettavissa vain Darknetissä + + Darknet Only (Tor, I2P, cjdns) + Vain Pimeäverkko (Tor, I2p, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6828,24 +6839,6 @@ 27 - - Top 100 nodes liquidity ranking - Top 100 solmun likviditeettiluokitus - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Top 100 solmun yhdistettävyysluokitus - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Vanhimmat solmut diff --git a/frontend/src/locale/messages.fr.xlf b/frontend/src/locale/messages.fr.xlf index ccb541bdd..704ba8412 100644 --- a/frontend/src/locale/messages.fr.xlf +++ b/frontend/src/locale/messages.fr.xlf @@ -4305,7 +4305,7 @@ Go to "" - Aller à &quot;&quot; + Aller à "" src/app/components/search-form/search-results/search-results.component.html 52 diff --git a/frontend/src/locale/messages.ja.xlf b/frontend/src/locale/messages.ja.xlf index 84b541b9a..168d9959c 100644 --- a/frontend/src/locale/messages.ja.xlf +++ b/frontend/src/locale/messages.ja.xlf @@ -4305,7 +4305,7 @@ Go to "" - &quot;&quot;へ + ""へ src/app/components/search-form/search-results/search-results.component.html 52 diff --git a/frontend/src/locale/messages.ka.xlf b/frontend/src/locale/messages.ka.xlf index cc0d90a08..d7614a377 100644 --- a/frontend/src/locale/messages.ka.xlf +++ b/frontend/src/locale/messages.ka.xlf @@ -4305,7 +4305,7 @@ Go to "" - Go to &quot;&quot; + Go to "" src/app/components/search-form/search-results/search-results.component.html 52 diff --git a/frontend/src/locale/messages.lt.xlf b/frontend/src/locale/messages.lt.xlf index 1360df21c..08ec17167 100644 --- a/frontend/src/locale/messages.lt.xlf +++ b/frontend/src/locale/messages.lt.xlf @@ -4305,7 +4305,7 @@ Go to "" - Eikite į &quot; &quot; + Eikite į "" src/app/components/search-form/search-results/search-results.component.html 52 diff --git a/frontend/src/locale/messages.nb.xlf b/frontend/src/locale/messages.nb.xlf index 51d719460..c699eff99 100644 --- a/frontend/src/locale/messages.nb.xlf +++ b/frontend/src/locale/messages.nb.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ Vår mempool- og blokkkjede-utforsker for Bitcoin-samfunnet, med fokus på transaksjonsgebyrmarkedet og flerlagsøkosystemet, fullstendig self-hosted uten tredjeparter. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Bedriftssponsorer 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Samfunnssponsorer ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Sammfunnsintegrasjoner src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Samfunnsallianser src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ Oversettere src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ Bidragsytere til prosjektet src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ Prosjektmedlemmer src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ Prosjektvedlikeholdere src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ Om src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -3421,7 +3417,7 @@ Lightning Network Capacity - Lightning-nettverkkapasitet + Lightningnettverk-kapasitet src/app/components/graphs/graphs.component.html 36 @@ -3489,7 +3485,7 @@ Lightning Nodes Channels World Map - Lightning-noder kanaler Verdenskart + Lightning-kanaler Verdenskart src/app/components/graphs/graphs.component.html 44 @@ -4309,7 +4305,7 @@ Go to "" - Gå til &quot; &quot; + Gå til "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4614,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4630,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5370,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5488,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5505,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5522,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5543,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5556,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5590,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5626,11 +5626,11 @@ Lightningkanal src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5639,11 +5639,11 @@ Siste oppdatering src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5659,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5672,7 +5672,7 @@ Sluttdato src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5685,7 +5685,7 @@ Avsluttet av src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5694,16 +5694,16 @@ Åpningstransaksjon src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction Closing transaction - Avsluttningtransaksjon + Avsluttningstransaksjon src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5786,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5920,7 +5920,7 @@ Avg Base Fee - Gjennomsnittlig basisavgift + Gj.sn. basisavgift src/app/lightning/channels-statistics/channels-statistics.component.html 41,43 @@ -6064,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6121,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6148,7 +6144,7 @@ Location - plassering + Plassering src/app/lightning/group/group.component.html 74,77 @@ -6163,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6179,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6221,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6303,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6320,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6333,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6346,30 +6350,21 @@ country - - No node found for public key "" - Ingen node funnet for offentlig nøkkel &quot; &quot; - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size - Gjennomsnittlig kanalstørrelse + Gj.sn. kanalstørrelse src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg Avg channel distance - Gjennomsnittlig kanalavstand + Gj.sn. kanalavstand src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6378,7 +6373,7 @@ Farge src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6387,7 +6382,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6400,7 +6395,7 @@ Eksklusivt på Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6409,7 +6404,7 @@ Likviditetsannonse src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6418,7 +6413,7 @@ Leieavgiftssats src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6428,7 +6423,7 @@ Leiegrunnavgift src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6437,7 +6432,7 @@ Finansieringsvekt src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6446,7 +6441,7 @@ Kanalavgiftssats src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6456,7 +6451,7 @@ Kanalbaseavgift src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6465,7 +6460,7 @@ Kompakt leieavtale src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6474,7 +6469,7 @@ TLV-utvidelsesposter src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6483,16 +6478,16 @@ Åpne kanaler src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels Closed channels - Stengte kanaler + Avsluttede kanaler src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6527,7 +6522,7 @@ Lightning Nodes Channels World Map - Lightning nodekanaler verdenskart + Lightning-kanaler verdenskart src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 69 @@ -6562,9 +6557,9 @@ 112,107 - - Reachable on Clearnet Only - Kun tilgjengelig på Clearnet + + Clearnet and Darknet + Clearnet og Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6574,9 +6569,9 @@ 303,302 - - Reachable on Clearnet and Darknet - Tilgjengelig på Clearnet og Darknet + + Clearnet Only (IPv4, IPv6) + Bare Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6586,9 +6581,9 @@ 295,294 - - Reachable on Darknet Only - Kun tilgjengelig på Darknet + + Darknet Only (Tor, I2P, cjdns) + Bare Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6600,7 +6595,7 @@ Share - Dele + Andel src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html 29,31 @@ -6672,7 +6667,7 @@ Clearnet Capacity - Clearnet-kapasitet + Clearnet kapasitet src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6844,24 +6839,6 @@ 27 - - Top 100 nodes liquidity ranking - Topp 100 noder likviditetsrangering - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Topp 100 noder tilkoblingsrangering - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Eldste noder diff --git a/frontend/src/locale/messages.nl.xlf b/frontend/src/locale/messages.nl.xlf index dd71032ac..c1d10e51c 100644 --- a/frontend/src/locale/messages.nl.xlf +++ b/frontend/src/locale/messages.nl.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ Onze mempool- en blockchainverkenner voor de Bitcoingemeenschap, gericht op de transactiekostenmarkt en het meerlagige ecosysteem, volledig zelf-gehost zonder derde partijen. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Bedrijfssponsoren 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Community Sponsoren ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Community-integraties src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Community-allianties src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ Projectvertalers src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ Projectbijdragers src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ Projectleden src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ Projectonderhouders src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ Over src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -4309,7 +4305,7 @@ Go to "" - Ga naar &quot;&quot; + Ga naar "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4614,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4630,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5370,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5488,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5505,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5522,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5543,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5556,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5590,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5626,11 +5626,11 @@ Lightningkanaal src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5639,11 +5639,11 @@ Laatste update src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5659,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5672,7 +5672,7 @@ Sluitingsdatum src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5685,7 +5685,7 @@ Gesloten door src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5694,7 +5694,7 @@ Openingstransactie src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5703,7 +5703,7 @@ Sluitingstransactie src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5786,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -6064,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6121,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6163,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6179,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6221,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6303,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6320,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6333,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6346,21 +6350,12 @@ country - - No node found for public key "" - Geen node gevonden voor publieke sleutel &quot;&quot; - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Gemiddelde kanaalgrootte src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6369,7 +6364,7 @@ Gemiddelde kanaalafstand src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6378,7 +6373,7 @@ Kleur src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6387,7 +6382,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6400,7 +6395,7 @@ Exclusief op Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6409,7 +6404,7 @@ Liquiditeitsadvertentie src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6418,7 +6413,7 @@ Leasevergoedingstarief src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6428,7 +6423,7 @@ Leasebasisvergoeding src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6437,7 +6432,7 @@ Financieringsgewicht src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6446,7 +6441,7 @@ Kanaalvergoedingstarief src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6456,7 +6451,7 @@ Kanaalbasisvergoeding src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6465,7 +6460,7 @@ Compactlease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6474,7 +6469,7 @@ TLV-extensierecords src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6483,7 +6478,7 @@ Open kanalen src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6492,7 +6487,7 @@ Gesloten kanalen src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6562,9 +6557,8 @@ 112,107 - - Reachable on Clearnet Only - Alleen Bereikbaar op Clearnet + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6574,9 +6568,8 @@ 303,302 - - Reachable on Clearnet and Darknet - Bereikbaar op Clearnet en Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6586,9 +6579,8 @@ 295,294 - - Reachable on Darknet Only - Alleen Bereikbaar op Darknet + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6844,24 +6836,6 @@ 27 - - Top 100 nodes liquidity ranking - Top 100 nodes liquiditeitsrangschikking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Top 100 nodes connectiviteitsrangschikking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Oudste nodes diff --git a/frontend/src/locale/messages.pl.xlf b/frontend/src/locale/messages.pl.xlf index 750b6e79c..77d92e83f 100644 --- a/frontend/src/locale/messages.pl.xlf +++ b/frontend/src/locale/messages.pl.xlf @@ -359,11 +359,11 @@ src/app/components/block/block.component.html - 303,304 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -384,11 +384,11 @@ src/app/components/block/block.component.html - 304,305 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -598,7 +598,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -775,16 +775,24 @@ src/app/components/about/about.component.html - 385,389 + 375,378 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 88 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -795,14 +803,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 90 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -990,7 +1006,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1038,7 +1054,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1054,11 +1070,11 @@ src/app/components/block/block.component.html - 245,246 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 282,284 transaction.version @@ -1108,7 +1124,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1130,7 +1146,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1142,10 +1158,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1158,11 +1170,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1190,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 256,261 src/app/components/transaction/transaction.component.html - 406,412 + 400,406 transaction.details @@ -1211,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 243,247 src/app/components/transaction/transaction.component.html - 377,383 + 371,377 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1233,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 244,243 @@ -1253,7 +1265,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1269,7 +1281,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1440,7 +1452,7 @@ Nasz, koncentrujący się na rynku opłat i wielowarstwowym ekosystemie, eksplorator blockchaina i mempoola dla bitcoinowej społeczności, całkowicie self-hosted, bez zaufanych stron trzecich. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1448,7 +1460,7 @@ Sponsorzy Korporacyjni 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1457,7 +1469,7 @@ Sponsorzy społecznościowi ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1466,7 +1478,7 @@ Integracje społecznościowe src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1475,7 +1487,7 @@ Sojusze społecznościowe src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1484,7 +1496,7 @@ Tłumacze projektu src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1493,7 +1505,7 @@ Współtwórcy projektu src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1502,7 +1514,7 @@ Członkowie projektu src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1511,7 +1523,7 @@ Opiekunowie projektu src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1520,7 +1532,7 @@ O stronie src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1569,7 +1581,7 @@ src/app/components/amount/amount.component.html - 6,9 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -1585,7 +1597,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2049,7 +2061,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -2065,7 +2077,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2077,7 +2089,7 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html @@ -2090,15 +2102,15 @@ Indeksowanie bloków src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -2143,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 478 + 472 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2169,11 +2181,11 @@ src/app/components/transaction/transaction.component.html - 478,479 + 472 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2187,11 +2199,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 481,483 + 475,477 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2221,19 +2233,19 @@ src/app/components/block/block.component.html - 123,126 + 124,127 src/app/components/block/block.component.html - 127 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2273,27 +2285,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 483,486 + 477,480 src/app/components/transaction/transaction.component.html - 494,496 + 488,490 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2301,7 +2313,7 @@ src/app/dashboard/dashboard.component.html - 206,210 + 213,217 sat/vB shared.sat-vbyte @@ -2315,11 +2327,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 268,271 Transaction Virtual Size transaction.vsize @@ -2432,7 +2444,7 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html @@ -2462,11 +2474,11 @@ Rozmiar src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html @@ -2494,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 264,266 src/app/dashboard/dashboard.component.html @@ -2506,11 +2518,11 @@ Waga src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2522,7 +2534,19 @@ src/app/components/transaction/transaction.component.html - 278,280 + 272,274 + + + + Size per weight + Rozmiar na wagę + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2538,15 +2562,6 @@ shared.block-title - - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee Mediana opłat @@ -2556,7 +2571,7 @@ src/app/components/block/block.component.html - 126,127 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2573,11 +2588,11 @@ src/app/components/block/block.component.html - 131,133 + 138,140 src/app/components/block/block.component.html - 157,160 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2595,7 +2610,7 @@ src/app/components/block/block.component.html - 166,168 + 173,175 block.miner @@ -2608,7 +2623,7 @@ src/app/components/block/block.component.ts - 234 + 242 @@ -2662,12 +2677,20 @@ 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2684,7 +2707,7 @@ Zakres opłat src/app/components/block/block.component.html - 122,123 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2697,7 +2720,7 @@ Na podstawie przeciętnej transakcji w natywnym segwit o długości 140 vBajtów src/app/components/block/block.component.html - 127,129 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2721,16 +2744,16 @@ Transaction fee tooltip - - Subsidy + fees: - Subsydium + opłaty: + + Subsidy + fees + Subsydium i opłaty src/app/components/block/block.component.html - 146,149 + 153,156 src/app/components/block/block.component.html - 161,165 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees @@ -2740,7 +2763,7 @@ Prognoza src/app/components/block/block.component.html - 209 + 216 block.expected @@ -2749,11 +2772,11 @@ beta src/app/components/block/block.component.html - 209,210 + 216,217 src/app/components/block/block.component.html - 215,217 + 222,224 beta @@ -2762,7 +2785,7 @@ Wartość aktualna src/app/components/block/block.component.html - 211,215 + 218,222 block.actual @@ -2771,7 +2794,7 @@ Prognozowany blok src/app/components/block/block.component.html - 215 + 222 block.expected-block @@ -2780,7 +2803,7 @@ Rzeczywisty blok src/app/components/block/block.component.html - 224 + 231 block.actual-block @@ -2789,7 +2812,7 @@ Bity src/app/components/block/block.component.html - 249,251 + 256,258 block.bits @@ -2798,7 +2821,7 @@ Korzeń Merkle'a src/app/components/block/block.component.html - 253,255 + 260,262 block.merkle-root @@ -2807,7 +2830,7 @@ Trudność src/app/components/block/block.component.html - 264,267 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2836,7 +2859,7 @@ Unikalna liczba src/app/components/block/block.component.html - 268,270 + 275,277 block.nonce @@ -2845,7 +2868,7 @@ Nagłówek bloku w postaci szesnastkowej src/app/components/block/block.component.html - 272,273 + 279,280 block.header @@ -2854,7 +2877,7 @@ Audyt src/app/components/block/block.component.html - 290,294 + 297,301 Toggle Audit block.toggle-audit @@ -2864,23 +2887,23 @@ Szczegóły src/app/components/block/block.component.html - 297,301 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 248,253 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2890,20 +2913,16 @@ Błąd ładowania danych. src/app/components/block/block.component.html - 316,318 + 323,325 src/app/components/block/block.component.html - 355,359 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2919,7 +2938,7 @@ Czemu ten blok jest pusty? src/app/components/block/block.component.html - 377,383 + 384,390 block.empty-block-explanation @@ -3028,7 +3047,7 @@ src/app/dashboard/dashboard.component.html - 212,216 + 219,223 dashboard.txs @@ -3267,7 +3286,7 @@ src/app/dashboard/dashboard.component.html - 239,240 + 246,247 dashboard.incoming-transactions @@ -3280,7 +3299,7 @@ src/app/dashboard/dashboard.component.html - 242,245 + 249,252 dashboard.backend-is-synchronizing @@ -3293,7 +3312,7 @@ src/app/dashboard/dashboard.component.html - 247,252 + 254,259 vB/s shared.vbytes-per-second @@ -3307,7 +3326,7 @@ src/app/dashboard/dashboard.component.html - 210,211 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3683,6 +3702,32 @@ dashboard.adjustments + + Broadcast Transaction + Rozgłoś transakcję + + src/app/components/mining-dashboard/mining-dashboard.component.html + 92 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) Szczęście kolektywu (1 tydzień) @@ -3750,7 +3795,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3780,12 +3825,25 @@ mining.rank + + Avg Health + Średnie zdrowie + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks Puste bloki src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3794,7 +3852,7 @@ Wszyscy wydobywcy src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3803,7 +3861,7 @@ Szczęście kolektywu (1t) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3812,7 +3870,7 @@ Liczba kolektywów wydobywczych (1t) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3821,7 +3879,7 @@ Kolektywy wydobywcze src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 @@ -4048,24 +4106,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - Rozgłoś transakcję - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,162 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex Postać szestnastkowa transakcji @@ -4075,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 290,291 transaction.hex @@ -4200,6 +4240,78 @@ search-form.search-title + + Bitcoin Block Height + Numer bloku + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + Bitcoinowa transakcja + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + Bitcoinowy adres + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + Bitcoinowy blok + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + Bitcoinowe adresy + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + Węzły Lightning + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + Kanały Lightning + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + Idź do "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) Mempool wg vBytes (sat / vByte) @@ -4484,7 +4596,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4494,11 +4606,11 @@ Pierwszy raz widziano src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4514,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4528,7 +4640,7 @@ Szacowany czas src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4538,7 +4650,7 @@ W ciągu kilku godzin (lub dłużej) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4548,11 +4660,11 @@ Potomek src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4562,7 +4674,7 @@ Przodek src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4572,11 +4684,11 @@ Przepływ src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 340,344 Transaction flow transaction.flow @@ -4586,7 +4698,7 @@ Schowaj diagram src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4595,7 +4707,7 @@ Pokaż więcej src/app/components/transaction/transaction.component.html - 231,233 + 225,227 src/app/components/transactions-list/transactions-list.component.html @@ -4612,7 +4724,7 @@ Pokaż mniej src/app/components/transaction/transaction.component.html - 233,239 + 227,233 src/app/components/transactions-list/transactions-list.component.html @@ -4625,7 +4737,7 @@ Pokaż diagram src/app/components/transaction/transaction.component.html - 253,254 + 247,248 show-diagram @@ -4634,7 +4746,7 @@ Czas blokady src/app/components/transaction/transaction.component.html - 292,294 + 286,288 transaction.locktime @@ -4643,7 +4755,7 @@ Transakcja nie odnaleziona. src/app/components/transaction/transaction.component.html - 455,456 + 449,450 transaction.error.transaction-not-found @@ -4652,7 +4764,7 @@ Oczekiwanie aż pojawi się w mempool... src/app/components/transaction/transaction.component.html - 456,461 + 450,455 transaction.error.waiting-for-it-to-appear @@ -4661,7 +4773,7 @@ Efektywny poziom opłaty src/app/components/transaction/transaction.component.html - 491,494 + 485,488 Effective transaction fee rate transaction.effective-fee-rate @@ -4810,7 +4922,7 @@ Pokaż więcej wejść by ujawnić dane o opłatach src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4819,7 +4931,7 @@ pozostało src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -5070,21 +5182,12 @@ dashboard.latest-transactions - - USD - Wartość w USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee Minimalna opłata src/app/dashboard/dashboard.component.html - 203,204 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -5094,7 +5197,7 @@ Próg odrzucenia src/app/dashboard/dashboard.component.html - 204,205 + 211,212 Purgin below fee dashboard.purging @@ -5104,7 +5207,7 @@ Zużycie pamięci src/app/dashboard/dashboard.component.html - 216,217 + 223,224 Memory usage dashboard.memory-usage @@ -5114,10 +5217,19 @@ L-BTC w obiegu src/app/dashboard/dashboard.component.html - 230,232 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space tylko dostarcza danych o sieci Bitcoin. Nie możemy Ci pomóc z odzyskiwaniem środków, szybszym potwierdzaniem transkacji, itp. + + src/app/docs/api-docs/api-docs.component.html + 13 + + faq.big-disclaimer + REST API service Usługa REST API @@ -5254,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5372,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5389,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5406,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5427,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5440,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5452,7 +5564,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5474,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5510,11 +5626,11 @@ Kanał Lightning src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5523,11 +5639,11 @@ Ostatnia aktualizacja src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5543,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5556,7 +5672,7 @@ Data zamknięcia src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5569,7 +5685,7 @@ Zamknięty przez src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5578,7 +5694,7 @@ Transakcja otwarcia src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5587,7 +5703,7 @@ Transakcja zamknięcia src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5599,6 +5715,30 @@ 37 + + Mutually closed + Obustronnie zamknięty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + Wymuszone zamknięcie + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + Wymuszone zamknięcie z karą + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open Otwarty @@ -5646,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5725,6 +5865,24 @@ shared.sats + + avg + średnia + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + mediana + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity Średnia pojemność @@ -5853,11 +6011,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5906,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5927,11 +6081,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + 28,29 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5963,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6005,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6021,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6063,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6095,6 +6257,30 @@ lightning.node-fee-distribution + + Outgoing Fees + Opłaty wychodzące + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + Opłaty przychodzące + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week Zmiana procentowa w zeszłym tygodniu @@ -6104,11 +6290,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -6121,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6138,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6151,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6164,21 +6350,12 @@ country - - No node found for public key "" - Nie odnaleziono węzła dla klucza publicznego &quot;&quot; - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Średni rozmiar kanału src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6187,7 +6364,7 @@ Średnia odległość kanałów src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6196,7 +6373,7 @@ Kolor src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6205,7 +6382,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6218,7 +6395,7 @@ Wyłącznie na sieci Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6227,7 +6404,7 @@ Reklama płynności src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6236,7 +6413,7 @@ Stawka opłat dzierżawy src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6246,7 +6423,7 @@ Opłata bazowa dzierżawy src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6255,7 +6432,7 @@ Blok finansujący src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6264,7 +6441,7 @@ Stawka opłat kanału src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6274,7 +6451,7 @@ Opłata bazowa kanału src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6283,7 +6460,7 @@ Kompaktowa dzierżawa src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6292,7 +6469,7 @@ Rekordy rozszerzeń TLV src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6301,7 +6478,7 @@ Otwarte kanały src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6310,7 +6487,7 @@ Zamknięte kanały src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6356,7 +6533,7 @@ Brak danych geolokalizacyjnych src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6380,9 +6557,8 @@ 112,107 - - Reachable on Clearnet Only - Osiągalny tylko na sieci jawnej + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6392,9 +6568,8 @@ 303,302 - - Reachable on Clearnet and Darknet - Osiągalny na sieci jawnej i darknecie + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6404,9 +6579,8 @@ 295,294 - - Reachable on Darknet Only - Osiągalny tylko w darknecie + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6662,24 +6836,6 @@ 27 - - Top 100 nodes liquidity ranking - Ranking 100 węzłów wg płynności - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Ranking 100 węzłów wg łączności - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Najstarsze węzły diff --git a/frontend/src/locale/messages.pt.xlf b/frontend/src/locale/messages.pt.xlf index 78cdd9c99..e41cd4ecc 100644 --- a/frontend/src/locale/messages.pt.xlf +++ b/frontend/src/locale/messages.pt.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ Nosso explorador da blockchain e mempool para a comunidade Bitcoin, focando no mercado de taxas de transação e ecossistema multicamadas, completamente auto-hospedado sem confiar em terceiros. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Empresas Patrocinadoras 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Patrocinadores da comunidade ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Integrações da comunidade src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Alianças da comunidade src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ Tradutores do Projeto src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ Contribuidores do projeto src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ Membros do Projeto src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ Mantenedores do projeto src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ Sobre src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -4309,7 +4305,7 @@ Go to "" - Go to &citação; &citação; + Go to "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4614,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4630,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5370,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5488,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5505,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5522,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5543,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5556,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5590,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5626,11 +5626,11 @@ Canal lightning src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5639,11 +5639,11 @@ Última atualização src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5659,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5672,7 +5672,7 @@ Data de fechamento src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5685,7 +5685,7 @@ Fechado por src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5694,7 +5694,7 @@ Transação de abertura src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5703,7 +5703,7 @@ Transação de fechamento src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5786,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -6064,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6121,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6163,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6179,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6221,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6303,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6320,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6333,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6346,21 +6350,12 @@ country - - No node found for public key "" - Nenhum nó encontrado para a chave pública &quot;&quot; - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Tamanho médio de canal src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6369,7 +6364,7 @@ Distância média entre canais src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6378,7 +6373,7 @@ Cor src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6387,7 +6382,7 @@ Provedor src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6400,7 +6395,7 @@ Exclusivamente Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6409,7 +6404,7 @@ Anúncio de liquidez src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6418,7 +6413,7 @@ Taxa de aluguel src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6428,7 +6423,7 @@ Taxa base de aluguel src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6437,7 +6432,7 @@ Peso de financiamento src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6446,7 +6441,7 @@ Taxa do canal src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6456,7 +6451,7 @@ Taxa base do canal src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6465,7 +6460,7 @@ Locação compacta src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6474,7 +6469,7 @@ Registros de extensão de valor alocado total src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6483,7 +6478,7 @@ Canais abertos src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6492,7 +6487,7 @@ Canais fechados src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6562,9 +6557,8 @@ 112,107 - - Reachable on Clearnet Only - Alcançável apenas via Clearnet + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6574,9 +6568,8 @@ 303,302 - - Reachable on Clearnet and Darknet - Alcançável via Clearnet e Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6586,9 +6579,8 @@ 295,294 - - Reachable on Darknet Only - Alcançável apenas via Darknet + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6844,24 +6836,6 @@ 27 - - Top 100 nodes liquidity ranking - Ranking dos Top 100 nós por liquidez - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Ranking dos Top 100 nós por conectividade - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Nós mais antigos diff --git a/frontend/src/locale/messages.ro.xlf b/frontend/src/locale/messages.ro.xlf index 41cab4eea..18051fdbe 100644 --- a/frontend/src/locale/messages.ro.xlf +++ b/frontend/src/locale/messages.ro.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ Exploratorul nostru de mempool și blockchain pentru comunitatea Bitcoin, focusat pe piața comisioanelor de tranzacționat și pe ecosistemul multi-strat, auto-găzduit fără terțe părți. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Sponsori Enterprise 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Sponsori din Comunitate ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Integrări în comunitate src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Alianțe din Comunitate src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ Traducători ai proiectului src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ Contribuitori ai proiectului src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ Membrii Proiectului src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ Întreținători ai proiectului src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ Despre src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -4309,7 +4305,7 @@ Go to "" - Mergi la &quot;&quot; + Mergi la "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4379,7 +4375,7 @@ ago - În urmă cu + Acum src/app/components/time-since/time-since.component.ts 74 @@ -4614,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4630,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5370,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5488,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5505,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5522,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5543,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5556,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5590,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5626,11 +5626,11 @@ Canal lightning src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5639,11 +5639,11 @@ Ultima actualizare src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5659,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5672,7 +5672,7 @@ Data limită src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5685,7 +5685,7 @@ Închis de src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5694,7 +5694,7 @@ Tranzacția inițială src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5703,7 +5703,7 @@ Tranzacția finală src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5786,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -6064,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6121,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6163,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6179,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6221,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6303,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6320,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6333,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6346,21 +6350,12 @@ country - - No node found for public key "" - Nu a fost găsit niciun nod pentru cheia publică &quot; &quot; - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Dimensiunea medie a canalului src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6369,7 +6364,7 @@ Distanța medie a canalului src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6378,7 +6373,7 @@ Culoare src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6387,7 +6382,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6400,7 +6395,7 @@ Exclusiv pe Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6409,7 +6404,7 @@ Anunț de lichiditate src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6418,7 +6413,7 @@ Rata comisionului de închiriere src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6428,7 +6423,7 @@ Comisionul de inchiriere de bază src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6437,7 +6432,7 @@ Greutatea finanțării src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6446,7 +6441,7 @@ Comisionul canalului src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6456,7 +6451,7 @@ Comisionul de bază al canalului src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6465,7 +6460,7 @@ Închiriere compactă src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6474,7 +6469,7 @@ Înregistrări extensiil TLV src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6483,7 +6478,7 @@ Canale deschise src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6492,7 +6487,7 @@ Canale închise src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6562,9 +6557,8 @@ 112,107 - - Reachable on Clearnet Only - Accesibil numai pe Clearnet + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6574,9 +6568,8 @@ 303,302 - - Reachable on Clearnet and Darknet - Accesibil pe Clearnet și Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6586,9 +6579,8 @@ 295,294 - - Reachable on Darknet Only - Accesibil numai pe Darknet + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6694,7 +6686,7 @@ Unknown Capacity - Capacitate necunoscută + Capacitate ascunsă src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 13,15 @@ -6844,24 +6836,6 @@ 27 - - Top 100 nodes liquidity ranking - Top 100 de noduri de lichiditate - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Top 100 de noduri de conectivitate - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Cele mai vechi noduri diff --git a/frontend/src/locale/messages.ru.xlf b/frontend/src/locale/messages.ru.xlf index 8a1c05c27..d9b9221b7 100644 --- a/frontend/src/locale/messages.ru.xlf +++ b/frontend/src/locale/messages.ru.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ Мы сами хостим наш обозреватель мемпула и блокчейна для биткоин-сообщества, сфокусированный на рынке транзакционных комиссий и многоуровневой экосистеме и не прибегаем к услугам доверенных третьих сторон. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Корпоративные спонсоры 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Спонсоры из сообщества ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Интеграции c сообществом src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Обьединения Сообщества src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ Переводы src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ Участники проекта src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ Участники проекта src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ Разработчики проекта src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ О проекте src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -4309,7 +4305,7 @@ Go to "" - Перейти к &quot; &quot; + Перейти к "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4614,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4630,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5370,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5488,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5505,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5522,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5543,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5556,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5590,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5626,11 +5626,11 @@ Лайтнинг-канал src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5639,11 +5639,11 @@ Последнее обновление src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5659,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5672,7 +5672,7 @@ Дата закрытия src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5685,7 +5685,7 @@ Закрыто src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5694,7 +5694,7 @@ Транзакция открытия src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5703,7 +5703,7 @@ Транзакция закрытия src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5786,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5867,7 +5867,7 @@ avg - среднее + сред src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -6064,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6121,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6163,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6179,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6221,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6303,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6320,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6333,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6346,30 +6350,21 @@ country - - No node found for public key "" - Не найден узел для открытого ключа &quot; &quot; - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Средний размер канала src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg Avg channel distance - Среднее расстояние канала + Среднее расстояние между каналами src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6378,7 +6373,7 @@ Цвет src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6387,7 +6382,7 @@ Интернет-провайдер src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6400,7 +6395,7 @@ Исключительно Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6409,7 +6404,7 @@ Объявление ликвидности src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6418,7 +6413,7 @@ Комиссия за аренду src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6428,7 +6423,7 @@ Базовая комиссия за аренду src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6437,16 +6432,16 @@ Вес финансирования src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight Channel fee rate - Ставка комиссии канала + Комиссионная ставка канала src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6456,7 +6451,7 @@ Базовая комиссия канала src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6465,7 +6460,7 @@ Компактная аренда src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6474,7 +6469,7 @@ Записи расширения TLV src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6483,7 +6478,7 @@ Открытые каналы src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6492,7 +6487,7 @@ Закрытые каналы src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6562,9 +6557,8 @@ 112,107 - - Reachable on Clearnet Only - Доступно только в Clearnet + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6574,9 +6568,8 @@ 303,302 - - Reachable on Clearnet and Darknet - Доступно в Clearnet и Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6586,9 +6579,8 @@ 295,294 - - Reachable on Darknet Only - Доступно только в Darknet + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6844,24 +6836,6 @@ 27 - - Top 100 nodes liquidity ranking - Топ-100 узлов по ликвидности - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Топ-100 узлов по подключению - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Самые старые узлы diff --git a/frontend/src/locale/messages.uk.xlf b/frontend/src/locale/messages.uk.xlf index 2a5cb6376..0404aee6e 100644 --- a/frontend/src/locale/messages.uk.xlf +++ b/frontend/src/locale/messages.uk.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ Наш експлорер мемпулу та блоків для ком'юніті Bitcoin з фокусом на ринок транзакцій та багаторівневу екосистему, повністю самостійний без жодних інтеграцій з довіреними третіми сторонами. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Підприємства-спонсори 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Спонсори з спільноти ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Інтеграції спільноти src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Союзи спільноти src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ Перекладачі проекту src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ Учасники проекту src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ Члени проекту src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ Розробники проекту src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ Про src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -4309,7 +4305,7 @@ Go to "" - Перейти до &quot;&quot; + Перейти до "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4614,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4630,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5370,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5488,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5505,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5522,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5543,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5556,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5590,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5626,11 +5626,11 @@ Lightning канал src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5639,11 +5639,11 @@ Востаннє оновлено src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5659,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5672,7 +5672,7 @@ Дата закриття src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5685,7 +5685,7 @@ Закрито src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5694,7 +5694,7 @@ Відкриваюча транзакція src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5703,7 +5703,7 @@ Закриваюча транзакція src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5786,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -6064,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6121,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6163,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6179,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6221,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6303,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6320,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6333,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6346,21 +6350,12 @@ country - - No node found for public key "" - Не знайдено ноду для ключа &quot;&quot; - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Середній розмір каналу src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6369,7 +6364,7 @@ Середня відстань каналу src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6378,7 +6373,7 @@ Колір src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6387,7 +6382,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6400,7 +6395,7 @@ Ексклюзивно для Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6409,7 +6404,7 @@ Реклама ліквідності src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6418,7 +6413,7 @@ Ставка комісії оренди src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6428,7 +6423,7 @@ Базова комісія оренди src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6437,7 +6432,7 @@ Вага фінансування src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6446,7 +6441,7 @@ Ставка комісії каналу src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6456,7 +6451,7 @@ Базова комісія каналу src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6465,7 +6460,7 @@ Компактна оренда src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6474,7 +6469,7 @@ Записи продовження TLV src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6483,7 +6478,7 @@ Відкриті канали src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6492,7 +6487,7 @@ Закриті канали src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6562,9 +6557,8 @@ 112,107 - - Reachable on Clearnet Only - Доступно тільки через Клірнет + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6574,9 +6568,8 @@ 303,302 - - Reachable on Clearnet and Darknet - Доступно через Клірнет та Даркнет + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6586,9 +6579,8 @@ 295,294 - - Reachable on Darknet Only - Доступно тільки через Даркнет + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6844,24 +6836,6 @@ 27 - - Top 100 nodes liquidity ranking - Топ 100 нод за ліквідністю - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Топ 100 нод за кількістю з'єднань - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Найстаріші ноди diff --git a/frontend/src/locale/messages.vi.xlf b/frontend/src/locale/messages.vi.xlf index 41e5e9281..3fea854cf 100644 --- a/frontend/src/locale/messages.vi.xlf +++ b/frontend/src/locale/messages.vi.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ Mempool và blockchain explorer của chúng tôi dành cho cộng đồng Bitcoin, tập trung vào thị trường phí giao dịch và hệ sinh thái nhiều lớp, hoàn toàn tự lưu trữ mà không cần bất kỳ bên thứ ba nào. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Nhà tài trợ doanh nghiệp 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Nhà tài trợ cộng đồng ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Tích hợp cộng đồng src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Liên minh cộng đồng src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ Dịch giả của Dự án src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ Người đóng góp dự án src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ Thành viên Dự án src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ Người bảo trì dự án src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ Về chúng tôi src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -4309,7 +4305,7 @@ Go to "" - Tới &quot; &quot; + Tới "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4614,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4630,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -5370,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5488,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5505,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5522,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5543,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5556,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5590,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5626,11 +5626,11 @@ Kênh lightning src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5639,11 +5639,11 @@ Cập nhật gần nhất src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5659,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5672,7 +5672,7 @@ Ngày đóng cửa src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5685,7 +5685,7 @@ Đóng bởi src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5694,7 +5694,7 @@ Đang mở giao dịch src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5703,7 +5703,7 @@ Đang đóng giao dịch src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5786,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -6064,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6121,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6163,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6179,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6221,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6303,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6320,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6333,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6346,21 +6350,12 @@ country - - No node found for public key "" - Không tìm thấy nút nào cho khóa công khai &quot; &quot; - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Kích thước kênh trung bình src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6369,7 +6364,7 @@ Khoảng cách kênh trung bình src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6378,7 +6373,7 @@ Màu sắc src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6387,7 +6382,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6400,7 +6395,7 @@ Độc quyền trên Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6409,7 +6404,7 @@ Quảng cáo thanh khoản src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6418,7 +6413,7 @@ Giá thuê src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6428,7 +6423,7 @@ Phí thuê cơ sở src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6437,7 +6432,7 @@ Trọng lượng nguồn quỹ src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6446,7 +6441,7 @@ Phí kênh src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6456,7 +6451,7 @@ Phí kênh cơ sở src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6465,7 +6460,7 @@ Thuê gói nhỏ src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6474,7 +6469,7 @@ Hồ sơ gia hạn TLV src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6483,7 +6478,7 @@ Mở các kênh src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6492,7 +6487,7 @@ Các kênh đã đóng src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6562,9 +6557,8 @@ 112,107 - - Reachable on Clearnet Only - Chỉ có thể truy cập trên Clearnet + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6574,9 +6568,8 @@ 303,302 - - Reachable on Clearnet and Darknet - Có thể truy cập trên Clearnet và Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6586,9 +6579,8 @@ 295,294 - - Reachable on Darknet Only - Chỉ có thể truy cập trên Darknet + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6844,24 +6836,6 @@ 27 - - Top 100 nodes liquidity ranking - Xếp hạng thanh khoản 100 nút hàng đầu - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Xếp hạng kết nối 100 nút hàng đầu - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Các nút lâu đời nhất diff --git a/frontend/src/locale/messages.zh.xlf b/frontend/src/locale/messages.zh.xlf index fc2799339..d2cda98c6 100644 --- a/frontend/src/locale/messages.zh.xlf +++ b/frontend/src/locale/messages.zh.xlf @@ -358,11 +358,11 @@ src/app/components/block/block.component.html - 303,304 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -383,11 +383,11 @@ src/app/components/block/block.component.html - 304,305 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -597,7 +597,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -774,16 +774,24 @@ src/app/components/about/about.component.html - 385,389 + 375,378 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 88 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -794,14 +802,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 90 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -989,7 +1005,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1037,7 +1053,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1053,11 +1069,11 @@ src/app/components/block/block.component.html - 245,246 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 282,284 transaction.version @@ -1107,7 +1123,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1129,7 +1145,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1141,10 +1157,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1157,11 +1169,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1189,11 +1201,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 256,261 src/app/components/transaction/transaction.component.html - 406,412 + 400,406 transaction.details @@ -1210,11 +1222,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 243,247 src/app/components/transaction/transaction.component.html - 377,383 + 371,377 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1232,7 +1244,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 244,243 @@ -1252,7 +1264,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1268,7 +1280,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1439,7 +1451,7 @@ 我们是针对比特币社区的内存池与区块链浏览器,专注于交易费用市场和多层交易的生态系统,完全独立运营没有受信的第三方。 src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1447,7 +1459,7 @@ 企业赞助商🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1456,7 +1468,7 @@ 社区赞助商❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1465,7 +1477,7 @@ 社区整合 src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1474,7 +1486,7 @@ 社区联盟 src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1483,7 +1495,7 @@ 项目翻译者 src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1492,7 +1504,7 @@ 项目贡献者 src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1501,7 +1513,7 @@ 项目成员 src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1510,7 +1522,7 @@ 项目维护者 src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1519,7 +1531,7 @@ 关于 src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1568,7 +1580,7 @@ src/app/components/amount/amount.component.html - 6,9 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -1584,7 +1596,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2048,7 +2060,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -2064,7 +2076,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2076,7 +2088,7 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html @@ -2089,15 +2101,15 @@ 引索区块 src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -2142,7 +2154,7 @@ src/app/components/transaction/transaction.component.html - 478 + 472 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2168,11 +2180,11 @@ src/app/components/transaction/transaction.component.html - 478,479 + 472 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2186,11 +2198,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 481,483 + 475,477 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2220,19 +2232,19 @@ src/app/components/block/block.component.html - 123,126 + 124,127 src/app/components/block/block.component.html - 127 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2272,27 +2284,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 483,486 + 477,480 src/app/components/transaction/transaction.component.html - 494,496 + 488,490 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2300,7 +2312,7 @@ src/app/dashboard/dashboard.component.html - 206,210 + 213,217 sat/vB shared.sat-vbyte @@ -2314,11 +2326,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 268,271 Transaction Virtual Size transaction.vsize @@ -2429,7 +2441,7 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html @@ -2459,11 +2471,11 @@ 大小 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html @@ -2491,7 +2503,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 264,266 src/app/dashboard/dashboard.component.html @@ -2503,11 +2515,11 @@ 权重 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2519,7 +2531,18 @@ src/app/components/transaction/transaction.component.html - 278,280 + 272,274 + + + + Size per weight + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2535,15 +2558,6 @@ shared.block-title - - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee 中位矿工手续费 @@ -2553,7 +2567,7 @@ src/app/components/block/block.component.html - 126,127 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2570,11 +2584,11 @@ src/app/components/block/block.component.html - 131,133 + 138,140 src/app/components/block/block.component.html - 157,160 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2592,7 +2606,7 @@ src/app/components/block/block.component.html - 166,168 + 173,175 block.miner @@ -2605,7 +2619,7 @@ src/app/components/block/block.component.ts - 234 + 242 @@ -2659,12 +2673,20 @@ 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2681,7 +2703,7 @@ 费用范围 src/app/components/block/block.component.html - 122,123 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2694,7 +2716,7 @@ 基于平均140字节的本地segwit交易 src/app/components/block/block.component.html - 127,129 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2718,16 +2740,15 @@ Transaction fee tooltip - - Subsidy + fees: - 奖励+手续费: + + Subsidy + fees src/app/components/block/block.component.html - 146,149 + 153,156 src/app/components/block/block.component.html - 161,165 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees @@ -2736,7 +2757,7 @@ Expected src/app/components/block/block.component.html - 209 + 216 block.expected @@ -2745,11 +2766,11 @@ 测试 src/app/components/block/block.component.html - 209,210 + 216,217 src/app/components/block/block.component.html - 215,217 + 222,224 beta @@ -2757,7 +2778,7 @@ Actual src/app/components/block/block.component.html - 211,215 + 218,222 block.actual @@ -2765,7 +2786,7 @@ Expected Block src/app/components/block/block.component.html - 215 + 222 block.expected-block @@ -2773,7 +2794,7 @@ Actual Block src/app/components/block/block.component.html - 224 + 231 block.actual-block @@ -2782,7 +2803,7 @@ 字节 src/app/components/block/block.component.html - 249,251 + 256,258 block.bits @@ -2791,7 +2812,7 @@ 哈希树 src/app/components/block/block.component.html - 253,255 + 260,262 block.merkle-root @@ -2800,7 +2821,7 @@ 难度 src/app/components/block/block.component.html - 264,267 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2829,7 +2850,7 @@ 随机数 src/app/components/block/block.component.html - 268,270 + 275,277 block.nonce @@ -2838,7 +2859,7 @@ 区块头字节 src/app/components/block/block.component.html - 272,273 + 279,280 block.header @@ -2846,7 +2867,7 @@ Audit src/app/components/block/block.component.html - 290,294 + 297,301 Toggle Audit block.toggle-audit @@ -2856,23 +2877,23 @@ 明细 src/app/components/block/block.component.html - 297,301 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 248,253 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2882,20 +2903,16 @@ 加载数据时出错。 src/app/components/block/block.component.html - 316,318 + 323,325 src/app/components/block/block.component.html - 355,359 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2910,7 +2927,7 @@ Why is this block empty? src/app/components/block/block.component.html - 377,383 + 384,390 block.empty-block-explanation @@ -3019,7 +3036,7 @@ src/app/dashboard/dashboard.component.html - 212,216 + 219,223 dashboard.txs @@ -3258,7 +3275,7 @@ src/app/dashboard/dashboard.component.html - 239,240 + 246,247 dashboard.incoming-transactions @@ -3271,7 +3288,7 @@ src/app/dashboard/dashboard.component.html - 242,245 + 249,252 dashboard.backend-is-synchronizing @@ -3284,7 +3301,7 @@ src/app/dashboard/dashboard.component.html - 247,252 + 254,259 vB/s shared.vbytes-per-second @@ -3298,7 +3315,7 @@ src/app/dashboard/dashboard.component.html - 210,211 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3674,6 +3691,32 @@ dashboard.adjustments + + Broadcast Transaction + 广播交易 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 92 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) 矿池幸运度(1 周) @@ -3741,7 +3784,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3771,12 +3814,24 @@ mining.rank + + Avg Health + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks 空区块 src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3785,7 +3840,7 @@ 所有矿工 src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3794,7 +3849,7 @@ 矿池幸运度(近 1 周) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3803,7 +3858,7 @@ 矿池数(近 1 周) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3812,7 +3867,7 @@ 矿池 src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 @@ -4039,24 +4094,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - 广播交易 - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,162 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex 交易源数据 @@ -4066,7 +4103,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 290,291 transaction.hex @@ -4189,6 +4226,71 @@ search-form.search-title + + Bitcoin Block Height + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + 打开"" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) 交易字节/秒 (虚拟字节) @@ -4471,7 +4573,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4481,11 +4583,11 @@ 初次发现时间 src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4501,11 +4603,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4515,7 +4617,7 @@ 预估时间 src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4525,7 +4627,7 @@ 在几个小时内(或更多) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4535,11 +4637,11 @@ 后裔 src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4549,7 +4651,7 @@ 祖先 src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4559,11 +4661,11 @@ 流向 src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 340,344 Transaction flow transaction.flow @@ -4573,7 +4675,7 @@ 隐藏图表 src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4582,7 +4684,7 @@ 展示更多 src/app/components/transaction/transaction.component.html - 231,233 + 225,227 src/app/components/transactions-list/transactions-list.component.html @@ -4599,7 +4701,7 @@ 展示更少 src/app/components/transaction/transaction.component.html - 233,239 + 227,233 src/app/components/transactions-list/transactions-list.component.html @@ -4612,7 +4714,7 @@ 显示图表 src/app/components/transaction/transaction.component.html - 253,254 + 247,248 show-diagram @@ -4621,7 +4723,7 @@ 锁定时间 src/app/components/transaction/transaction.component.html - 292,294 + 286,288 transaction.locktime @@ -4630,7 +4732,7 @@ 交易未找到 src/app/components/transaction/transaction.component.html - 455,456 + 449,450 transaction.error.transaction-not-found @@ -4639,7 +4741,7 @@ 等待交易出现在内存池 src/app/components/transaction/transaction.component.html - 456,461 + 450,455 transaction.error.waiting-for-it-to-appear @@ -4648,7 +4750,7 @@ 有效收费率 src/app/components/transaction/transaction.component.html - 491,494 + 485,488 Effective transaction fee rate transaction.effective-fee-rate @@ -4796,7 +4898,7 @@ Show more inputs to reveal fee data src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4804,7 +4906,7 @@ remaining src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -5054,21 +5156,12 @@ dashboard.latest-transactions - - USD - 美元 - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee 最低费用 src/app/dashboard/dashboard.component.html - 203,204 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -5078,7 +5171,7 @@ 吹扫中 src/app/dashboard/dashboard.component.html - 204,205 + 211,212 Purgin below fee dashboard.purging @@ -5088,7 +5181,7 @@ 内存占用 src/app/dashboard/dashboard.component.html - 216,217 + 223,224 Memory usage dashboard.memory-usage @@ -5098,10 +5191,18 @@ 流通中的L-BTC src/app/dashboard/dashboard.component.html - 230,232 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + faq.big-disclaimer + REST API service REST API 服务 @@ -5238,7 +5339,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5354,7 +5455,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5371,7 +5472,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5388,7 +5489,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5409,7 +5510,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5422,7 +5523,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5434,7 +5535,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5456,6 +5557,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5492,11 +5597,11 @@ 闪电交易频道 src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5505,11 +5610,11 @@ 上次更新 src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5525,11 +5630,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5538,7 +5643,7 @@ 截止日期 src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5550,7 +5655,7 @@ Closed by src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5559,7 +5664,7 @@ 开启交易 src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5568,7 +5673,7 @@ 关闭交易 src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5580,6 +5685,27 @@ 37 + + Mutually closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open 开启 @@ -5627,11 +5753,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5706,6 +5832,22 @@ shared.sats + + avg + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity 平均容量 @@ -5834,11 +5976,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5887,10 +6029,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5908,11 +6046,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + 28,29 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5944,11 +6082,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -5986,7 +6124,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6002,11 +6140,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6044,9 +6182,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6075,6 +6221,28 @@ lightning.node-fee-distribution + + Outgoing Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week 近 1 周中百分比变化 @@ -6084,11 +6252,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -6101,11 +6269,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6118,7 +6286,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6131,7 +6299,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6144,21 +6312,12 @@ country - - No node found for public key "" - 没有找到符合该公钥 的节点 - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size 平均频道大小 src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6166,7 +6325,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6175,7 +6334,7 @@ 颜色 src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6184,7 +6343,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6197,7 +6356,7 @@ 仅在 Tor 网络上 src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6205,7 +6364,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6213,7 +6372,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6222,7 +6381,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6230,7 +6389,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6239,7 +6398,7 @@ 频道费率 src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6249,7 +6408,7 @@ 频道基础费率 src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6257,7 +6416,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6265,7 +6424,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6274,7 +6433,7 @@ 开启频道 src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6283,7 +6442,7 @@ 关闭频道 src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6329,7 +6488,7 @@ 没有可用地理数据 src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6352,9 +6511,8 @@ 112,107 - - Reachable on Clearnet Only - 仅可在公网上访问 + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6364,9 +6522,8 @@ 303,302 - - Reachable on Clearnet and Darknet - 可在公网和暗网上访问 + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6376,9 +6533,8 @@ 295,294 - - Reachable on Darknet Only - 仅可在暗网上访问 + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6633,24 +6789,6 @@ 27 - - Top 100 nodes liquidity ranking - 流动性排名前 100 的节点 - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - 可连接性排名前 100 的节点 - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes 最老的节点 From 2907054a01945d5a13bcd8c540d7d6a71098fec8 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 8 Mar 2023 02:14:41 -0600 Subject: [PATCH 007/782] Update pool ranking block count when new blocks arrive --- .../app/components/pool-ranking/pool-ranking.component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts index a3f23c031..0f2103024 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, Input, NgZone, OnInit, HostBinding import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { EChartsOption, PieSeriesOption } from 'echarts'; -import { concat, Observable } from 'rxjs'; +import { merge, Observable } from 'rxjs'; import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; import { SeoService } from '../../services/seo.service'; import { StorageService } from '../..//services/storage.service'; @@ -73,7 +73,7 @@ export class PoolRankingComponent implements OnInit { } }); - this.miningStatsObservable$ = concat( + this.miningStatsObservable$ = merge( this.radioGroupForm.get('dateSpan').valueChanges .pipe( startWith(this.radioGroupForm.controls.dateSpan.value), // (trigger when the page loads) @@ -89,7 +89,7 @@ export class PoolRankingComponent implements OnInit { return this.miningService.getMiningStats(this.miningWindowPreference); }) ), - this.stateService.blocks$ + this.stateService.chainTip$ .pipe( switchMap(() => { return this.miningService.getMiningStats(this.miningWindowPreference); From c3c0696844445280d2522812981bc66c6b761256 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 8 Mar 2023 02:15:15 -0600 Subject: [PATCH 008/782] Update hashrate estimate when new blocks arrive --- .../hashrate-chart.component.ts | 149 +++++++++--------- 1 file changed, 78 insertions(+), 71 deletions(-) diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts index 53bb33be3..fcff0dddb 100644 --- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts +++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit, HostBinding } from '@angular/core'; import { EChartsOption, graphic } from 'echarts'; -import { Observable } from 'rxjs'; -import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; +import { merge, Observable, of } from 'rxjs'; +import { map, mergeMap, share, startWith, switchMap, tap } from 'rxjs/operators'; import { ApiService } from '../../services/api.service'; import { SeoService } from '../../services/seo.service'; import { formatNumber } from '@angular/common'; @@ -84,77 +84,84 @@ export class HashrateChartComponent implements OnInit { } }); - this.hashrateObservable$ = this.radioGroupForm.get('dateSpan').valueChanges - .pipe( - startWith(this.radioGroupForm.controls.dateSpan.value), - switchMap((timespan) => { - if (!this.widget && !firstRun) { - this.storageService.setValue('miningWindowPreference', timespan); - } - this.timespan = timespan; - firstRun = false; - this.miningWindowPreference = timespan; - this.isLoading = true; - return this.apiService.getHistoricalHashrate$(timespan) - .pipe( - tap((response) => { - const data = response.body; + this.hashrateObservable$ = merge( + this.radioGroupForm.get('dateSpan').valueChanges + .pipe( + startWith(this.radioGroupForm.controls.dateSpan.value), + switchMap((timespan) => { + if (!this.widget && !firstRun) { + this.storageService.setValue('miningWindowPreference', timespan); + } + this.timespan = timespan; + firstRun = false; + this.miningWindowPreference = timespan; + this.isLoading = true; + return this.apiService.getHistoricalHashrate$(this.timespan); + }) + ), + this.stateService.chainTip$ + .pipe( + switchMap(() => { + return this.apiService.getHistoricalHashrate$(this.timespan); + }) + ) + ).pipe( + tap((response: any) => { + const data = response.body; - // We generate duplicated data point so the tooltip works nicely - const diffFixed = []; - let diffIndex = 1; - let hashIndex = 0; - while (hashIndex < data.hashrates.length) { - if (diffIndex >= data.difficulty.length) { - while (hashIndex < data.hashrates.length) { - diffFixed.push({ - timestamp: data.hashrates[hashIndex].timestamp, - difficulty: data.difficulty.length > 0 ? data.difficulty[data.difficulty.length - 1].difficulty : null - }); - ++hashIndex; - } - break; - } - - while (hashIndex < data.hashrates.length && diffIndex < data.difficulty.length && - data.hashrates[hashIndex].timestamp <= data.difficulty[diffIndex].time - ) { - diffFixed.push({ - timestamp: data.hashrates[hashIndex].timestamp, - difficulty: data.difficulty[diffIndex - 1].difficulty - }); - ++hashIndex; - } - ++diffIndex; - } - - let maResolution = 15; - const hashrateMa = []; - for (let i = maResolution - 1; i < data.hashrates.length; ++i) { - let avg = 0; - for (let y = maResolution - 1; y >= 0; --y) { - avg += data.hashrates[i - y].avgHashrate; - } - avg /= maResolution; - hashrateMa.push([data.hashrates[i].timestamp * 1000, avg]); - } - - this.prepareChartOptions({ - hashrates: data.hashrates.map(val => [val.timestamp * 1000, val.avgHashrate]), - difficulty: diffFixed.map(val => [val.timestamp * 1000, val.difficulty]), - hashrateMa: hashrateMa, + // We generate duplicated data point so the tooltip works nicely + const diffFixed = []; + let diffIndex = 1; + let hashIndex = 0; + while (hashIndex < data.hashrates.length) { + if (diffIndex >= data.difficulty.length) { + while (hashIndex < data.hashrates.length) { + diffFixed.push({ + timestamp: data.hashrates[hashIndex].timestamp, + difficulty: data.difficulty.length > 0 ? data.difficulty[data.difficulty.length - 1].difficulty : null }); - this.isLoading = false; - }), - map((response) => { - const data = response.body; - return { - blockCount: parseInt(response.headers.get('x-total-count'), 10), - currentDifficulty: data.currentDifficulty, - currentHashrate: data.currentHashrate, - }; - }), - ); + ++hashIndex; + } + break; + } + + while (hashIndex < data.hashrates.length && diffIndex < data.difficulty.length && + data.hashrates[hashIndex].timestamp <= data.difficulty[diffIndex].time + ) { + diffFixed.push({ + timestamp: data.hashrates[hashIndex].timestamp, + difficulty: data.difficulty[diffIndex - 1].difficulty + }); + ++hashIndex; + } + ++diffIndex; + } + + let maResolution = 15; + const hashrateMa = []; + for (let i = maResolution - 1; i < data.hashrates.length; ++i) { + let avg = 0; + for (let y = maResolution - 1; y >= 0; --y) { + avg += data.hashrates[i - y].avgHashrate; + } + avg /= maResolution; + hashrateMa.push([data.hashrates[i].timestamp * 1000, avg]); + } + + this.prepareChartOptions({ + hashrates: data.hashrates.map(val => [val.timestamp * 1000, val.avgHashrate]), + difficulty: diffFixed.map(val => [val.timestamp * 1000, val.difficulty]), + hashrateMa: hashrateMa, + }); + this.isLoading = false; + }), + map((response) => { + const data = response.body; + return { + blockCount: parseInt(response.headers.get('x-total-count'), 10), + currentDifficulty: data.currentDifficulty, + currentHashrate: data.currentHashrate, + }; }), share() ); From ead7a13ff0d2911f470b357c4f87c1e15dd79c3f Mon Sep 17 00:00:00 2001 From: wiz Date: Wed, 8 Mar 2023 21:07:41 +0900 Subject: [PATCH 009/782] i18n: Enable Danish, disable Catalan --- frontend/src/app/app.constants.ts | 4 ++-- nginx-mempool.conf | 2 +- nginx.conf | 4 ++-- production/nginx/http-language.conf | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/app.constants.ts b/frontend/src/app/app.constants.ts index 779eab62e..bd8fc46eb 100644 --- a/frontend/src/app/app.constants.ts +++ b/frontend/src/app/app.constants.ts @@ -87,9 +87,9 @@ export const languages: Language[] = [ { code: 'ar', name: 'العربية' }, // Arabic // { code: 'bg', name: 'Български' }, // Bulgarian // { code: 'bs', name: 'Bosanski' }, // Bosnian - { code: 'ca', name: 'Català' }, // Catalan +// { code: 'ca', name: 'Català' }, // Catalan { code: 'cs', name: 'Čeština' }, // Czech -// { code: 'da', name: 'Dansk' }, // Danish + { code: 'da', name: 'Dansk' }, // Danish { code: 'de', name: 'Deutsch' }, // German // { code: 'et', name: 'Eesti' }, // Estonian // { code: 'el', name: 'Ελληνικά' }, // Greek diff --git a/nginx-mempool.conf b/nginx-mempool.conf index d4f111d49..67cb15939 100644 --- a/nginx-mempool.conf +++ b/nginx-mempool.conf @@ -35,7 +35,7 @@ # location block using regex are matched in order # used for cookie override - location ~ ^/(ar|bg|bs|ca|cs|da|de|et|el|es|eo|eu|fa|fr|gl|ko|hr|id|it|he|ka|lv|lt|hu|mk|ms|nl|ja|nb|nn|pl|pt|pt-BR|ro|ru|sk|sl|sr|sh|fi|sv|th|tr|uk|vi|zh|hi)/ { + location ~ ^/(ar|bg|bs|cs|da|de|et|el|es|eo|eu|fa|fr|gl|ko|hr|id|it|he|ka|lv|lt|hu|mk|ms|nl|ja|nb|nn|pl|pt|pt-BR|ro|ru|sk|sl|sr|sh|fi|sv|th|tr|uk|vi|zh|hi)/ { try_files $uri $uri/ /$1/index.html =404; } diff --git a/nginx.conf b/nginx.conf index 95d2e8d45..abd7b1269 100644 --- a/nginx.conf +++ b/nginx.conf @@ -78,8 +78,8 @@ http { ~*^en-US en-US; ~*^en en-US; ~*^ar ar; - ~*^ca ca; ~*^cs cs; + ~*^da da; ~*^de de; ~*^es es; ~*^fa fa; @@ -115,8 +115,8 @@ http { ~*^en-US en-US; ~*^en en-US; ~*^ar ar; - ~*^ca ca; ~*^cs cs; + ~*^da da; ~*^de de; ~*^es es; ~*^fa fa; diff --git a/production/nginx/http-language.conf b/production/nginx/http-language.conf index 599ee5d74..c03d776b0 100644 --- a/production/nginx/http-language.conf +++ b/production/nginx/http-language.conf @@ -3,8 +3,8 @@ map $http_accept_language $header_lang { ~*^en-US ''; ~*^en ''; ~*^ar ar; - ~*^ca ca; ~*^cs cs; + ~*^da da; ~*^de de; ~*^es es; ~*^fa fa; @@ -38,8 +38,8 @@ map $cookie_lang $lang { ~*^en-US ''; ~*^en ''; ~*^ar ar; - ~*^ca ca; ~*^cs cs; + ~*^da da; ~*^de de; ~*^es es; ~*^fa fa; From 526e46b8e497c624b442cadbd40aed8fb0b0ac8b Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 9 Mar 2023 11:49:26 +0900 Subject: [PATCH 010/782] Pull from transifex --- frontend/src/locale/messages.fa.xlf | 195 +++-- frontend/src/locale/messages.fi.xlf | 24 +- frontend/src/locale/messages.he.xlf | 1027 ++++++++++++++++++--------- frontend/src/locale/messages.ka.xlf | 2 +- frontend/src/locale/messages.nb.xlf | 24 +- frontend/src/locale/messages.sv.xlf | 2 +- 6 files changed, 784 insertions(+), 490 deletions(-) diff --git a/frontend/src/locale/messages.fa.xlf b/frontend/src/locale/messages.fa.xlf index 38a471409..4f11ea03e 100644 --- a/frontend/src/locale/messages.fa.xlf +++ b/frontend/src/locale/messages.fa.xlf @@ -775,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1452,7 +1452,7 @@ کاوشگر بلاک‌چین و ممپول برای جامعه بیت‌کوین، با تمرکز بر بازار کارمزد تراکنش‌ها و اکوسیستم چند لایه، به صورت کاملا مستقل از خدمات ثالث با امکان خودمیزبانی. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ حامیان سازمانی 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ حامیان جامعه ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ پیاده‌سازی‌ها src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ متحدین جامعه src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1496,7 +1496,7 @@ مترجم‌های پروژه src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1505,7 +1505,7 @@ مشارکت کنندگان src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1514,7 +1514,7 @@ اعضای پروژه src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1523,7 +1523,7 @@ نگهدارندگان پروژه src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1532,7 +1532,7 @@ درباره src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 18,21 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -2686,11 +2686,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2895,15 +2895,15 @@ src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2923,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -4309,7 +4305,7 @@ Go to "" - برو به &quot;&quot; + برو به "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4614,7 +4610,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4630,11 +4626,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4932,7 +4928,7 @@ remaining - عدد باقی مانده است + عدد باقی مانده src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -5370,7 +5366,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5488,7 +5484,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5505,7 +5501,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5522,7 +5518,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5543,7 +5539,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5556,7 +5552,7 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html @@ -5590,6 +5586,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5626,11 +5626,11 @@ کانال لایتنینگ src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5639,11 +5639,11 @@ آخرین بروز رسانی src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5659,11 +5659,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5672,7 +5672,7 @@ تاریخ بسته‌شدن src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5685,7 +5685,7 @@ بسته‌شده توسط src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5694,7 +5694,7 @@ تراکنش بازشدن src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5703,7 +5703,7 @@ تراکنش بسته‌شدن src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5786,11 +5786,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -6064,10 +6064,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6121,11 +6117,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -6163,7 +6159,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6179,11 +6175,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6221,9 +6217,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6303,11 +6307,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6320,7 +6324,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6333,7 +6337,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6346,21 +6350,12 @@ country - - No node found for public key "" - هیچ گرهی برای کلید عمومی &quot;&quot; پیدا نشد - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size متوسط اندازه کانال src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6369,7 +6364,7 @@ متوسط فاصله کانال src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6378,7 +6373,7 @@ رنگ src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6387,7 +6382,7 @@ ارائه کننده اینترنت src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6400,7 +6395,7 @@ فقط بر روی شبکه Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6409,7 +6404,7 @@ اعلان نقدینگی src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6418,7 +6413,7 @@ نرخ کارمزد اجاره src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6428,7 +6423,7 @@ کارمزد پایه اجاره src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6437,7 +6432,7 @@ وزن تأمین موجودی src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6446,7 +6441,7 @@ نرخ کارمزد کانال src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6456,7 +6451,7 @@ کارمزد پایه کانال src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6465,7 +6460,7 @@ چکیده مشخصات اجاره src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6474,7 +6469,7 @@ تاریخچه افزونه TLV src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6483,7 +6478,7 @@ کانال‌های باز src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6492,7 +6487,7 @@ کانال‌های بسته src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6562,9 +6557,9 @@ 112,107 - - Reachable on Clearnet Only - قابل دسترسی در شبکه آشکار + + Clearnet and Darknet + شبکه آشکار و پنهان src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6574,9 +6569,9 @@ 303,302 - - Reachable on Clearnet and Darknet - قابل دسترسی در شبکه‌های آشکار و پنهان + + Clearnet Only (IPv4, IPv6) + فقط شبکه آشکار (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6586,9 +6581,9 @@ 295,294 - - Reachable on Darknet Only - قابل دسترسی فقط در شبکه پنهان + + Darknet Only (Tor, I2P, cjdns) + فقط شبکه پنهان (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6844,24 +6839,6 @@ 27 - - Top 100 nodes liquidity ranking - رتبه‌بندی 100 گره برتر نقدینگی - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - رتبه‌بندی 100 گره برتر اتصال - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes قدیمی‌ترین گره‌ها diff --git a/frontend/src/locale/messages.fi.xlf b/frontend/src/locale/messages.fi.xlf index cdec5efd5..a53a7bf5a 100644 --- a/frontend/src/locale/messages.fi.xlf +++ b/frontend/src/locale/messages.fi.xlf @@ -3182,7 +3182,7 @@ Next Halving - Seuraava puoliintuminen + Puoliintuminen src/app/components/difficulty/difficulty.component.html 50,52 @@ -3827,7 +3827,7 @@ Avg Health - Keskimääräinen terveys + keskim. Terveys src/app/components/pool-ranking/pool-ranking.component.html 96,97 @@ -4147,7 +4147,7 @@ Avg Block Fees - Keskimääräiset lohkomaksut + keskim. Lohkomaksut src/app/components/reward-stats/reward-stats.component.html 17 @@ -4179,7 +4179,7 @@ Avg Tx Fee - Keskimääräinen siirtomaksu + keskim. Siirtomaksu src/app/components/reward-stats/reward-stats.component.html 30 @@ -5867,7 +5867,7 @@ avg - keskimääräinen + keskim. src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -5885,7 +5885,7 @@ Avg Capacity - Keskimääräinen kapasiteetti + keskim. Kapasiteetti src/app/lightning/channels-statistics/channels-statistics.component.html 13,15 @@ -5898,7 +5898,7 @@ Avg Fee Rate - Keskimääräinen siirtomaksu prosentti + keskim. Siirtomaksu prosentti src/app/lightning/channels-statistics/channels-statistics.component.html 26,28 @@ -5920,7 +5920,7 @@ Avg Base Fee - Keskimääräinen perus siirtomaksu + keskim. Perus siirtomaksu src/app/lightning/channels-statistics/channels-statistics.component.html 41,43 @@ -6361,7 +6361,7 @@ Avg channel distance - Keskimääräinen kanavaetäisyys + keskim. Kanavaetäisyys src/app/lightning/node/node.component.html 59,60 @@ -6667,7 +6667,7 @@ Clearnet Capacity - Clearnetin kapasiteetti + Julkinen kapasiteetti src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6680,7 +6680,7 @@ How much liquidity is running on nodes advertising at least one clearnet IP address - Kuinka paljon likviditeettiä on käytössä solmuissa, jotka mainostavat vähintään yhtä clearnet-IP-osoitetta + Kuinka paljon likviditeettiä on käytössä solmuissa, jotka mainostavat vähintään yhtä julkista IP-osoitetta src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 8,9 @@ -6689,7 +6689,7 @@ Unknown Capacity - Tuntematon kapasiteetti + Tuntematon src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 13,15 diff --git a/frontend/src/locale/messages.he.xlf b/frontend/src/locale/messages.he.xlf index 6e34702e5..b58237560 100644 --- a/frontend/src/locale/messages.he.xlf +++ b/frontend/src/locale/messages.he.xlf @@ -11,6 +11,7 @@ Slide of + שקף מתוך node_modules/src/carousel/carousel.ts 175,181 @@ -147,6 +148,7 @@ + node_modules/src/progressbar/progressbar.ts 30,33 @@ -357,11 +359,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -382,11 +384,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -424,7 +426,7 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash @@ -449,7 +451,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -592,11 +594,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -773,16 +775,24 @@ src/app/components/about/about.component.html - 385,389 + 375,378 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 88 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -793,14 +803,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 90 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -988,7 +1006,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1036,7 +1054,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1052,11 +1070,11 @@ src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 282,284 transaction.version @@ -1106,7 +1124,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1128,7 +1146,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1140,10 +1158,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1156,11 +1170,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1188,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 256,261 src/app/components/transaction/transaction.component.html - 406,412 + 400,406 transaction.details @@ -1209,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 243,247 src/app/components/transaction/transaction.component.html - 377,383 + 371,377 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1231,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 244,243 @@ -1251,7 +1265,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1267,7 +1281,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1438,7 +1452,7 @@ חוקר ה-Mempool וה-Blockchain שלנו עבור קהילת הביטקוין, המתמקד בשוק עמלות הטרנזקציות ובאקו-סיסטם הרב-שכבתי, ניתן לאחסון והרצה בעצמו לחלוטין ללא כל צד שלישי מהימן. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1446,7 +1460,7 @@ נותני חסות ארגוניים 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1455,15 +1469,16 @@ נותני חסות מהקהילה ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart Community Integrations + שיתופי פעילות קהילתיים src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1472,7 +1487,7 @@ בני ברית מהקהילה src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1481,7 +1496,7 @@ מתרגמי הפרוייקט src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1490,7 +1505,7 @@ תורמי הפרוייקט src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1499,7 +1514,7 @@ חברי צוות הפרוייקט src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1508,7 +1523,7 @@ מתחזקי הפרוייקט src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1517,7 +1532,7 @@ אודות src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1529,11 +1544,12 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 Multisig of + ארנק מרובה חתימות מתוך src/app/components/address-labels/address-labels.component.ts 107 @@ -1565,7 +1581,7 @@ src/app/components/amount/amount.component.html - 6,9 + 20,23 src/app/components/asset-circulation/asset-circulation.component.html @@ -1581,7 +1597,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1664,7 +1680,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1886,7 +1902,7 @@ src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header @@ -1899,7 +1915,7 @@ src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header @@ -1912,7 +1928,7 @@ src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header @@ -1921,7 +1937,7 @@ שגיאה בטעינת נתוני נכסים. src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -2034,6 +2050,7 @@ At block: + בבלוק: src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts 188 @@ -2044,11 +2061,12 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 Around block: + סביב בלוק: src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts 190 @@ -2059,7 +2077,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2071,7 +2089,7 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html @@ -2084,15 +2102,15 @@ מאנדקס בלוקים src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -2117,6 +2135,7 @@ not available + לא זמין src/app/components/block-overview-graph/block-overview-graph.component.html 5 @@ -2136,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 476 + 472 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2162,11 +2181,11 @@ src/app/components/transaction/transaction.component.html - 476,477 + 472 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2180,11 +2199,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 475,477 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2196,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,42 Transaction fee rate transaction.fee-rate @@ -2214,19 +2233,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2266,27 +2285,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 477,480 src/app/components/transaction/transaction.component.html - 492,494 + 488,490 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2294,7 +2313,7 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte @@ -2308,17 +2327,18 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 268,271 Transaction Virtual Size transaction.vsize Audit status + מצב בדיקה src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 36 @@ -2327,6 +2347,7 @@ Match + התאמה src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 38 @@ -2335,6 +2356,7 @@ Removed + הוסר src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 39 @@ -2343,6 +2365,7 @@ Marginal fee rate + שיעור עמלה שולית src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 40 @@ -2355,6 +2378,7 @@ Recently broadcasted + שודר לאחרונה src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 41 @@ -2363,6 +2387,7 @@ Added + נוסף src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 42 @@ -2371,6 +2396,7 @@ Block Prediction Accuracy + דיוק בלוק חזוי src/app/components/block-prediction-graph/block-prediction-graph.component.html 6,8 @@ -2387,6 +2413,7 @@ No data to display yet. Try again later. + אין מידע זמין להצגה. ניתן לנסות מאוחר יותר. src/app/components/block-prediction-graph/block-prediction-graph.component.ts 108,103 @@ -2402,6 +2429,7 @@ Match rate + שיעור התאמה src/app/components/block-prediction-graph/block-prediction-graph.component.ts 189,187 @@ -2416,7 +2444,7 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html @@ -2446,15 +2474,15 @@ גודל src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2478,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 264,266 src/app/dashboard/dashboard.component.html @@ -2490,11 +2518,11 @@ משקל src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2502,15 +2530,28 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 272,274 + + + + Size per weight + גודל למשקל + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 Block + בלוק src/app/components/block/block-preview.component.html 3,7 @@ -2521,14 +2562,6 @@ shared.block-title - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee עמלה חציונית @@ -2538,7 +2571,7 @@ src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2555,11 +2588,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2577,7 +2610,7 @@ src/app/components/block/block.component.html - 168,170 + 173,175 block.miner @@ -2590,7 +2623,7 @@ src/app/components/block/block.component.ts - 227 + 242 @@ -2615,31 +2648,49 @@ Previous Block - - Block health + + Health + בריאות src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown + לא ידוע src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2656,7 +2707,7 @@ מרווח עמלה src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2669,7 +2720,7 @@ מבוסס על טרנזקציית Native SegWit ממוצעת של 140 בתים src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2693,49 +2744,66 @@ Transaction fee tooltip - - Subsidy + fees: - תגמול כולל + + Subsidy + fees + תגמול + עמלות src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected + צפוי src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + בטא + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual + בפועל src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block + בלוק צפוי src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block + בלוק בפועל src/app/components/block/block.component.html - 225,227 + 231 block.actual-block @@ -2744,7 +2812,7 @@ ביטים src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2753,7 +2821,7 @@ שורש מרקל src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2762,7 +2830,7 @@ קושי src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2791,7 +2859,7 @@ תוספתא src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce @@ -2800,32 +2868,42 @@ קידוד כותר הבלוק src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + בדיקה + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details פרטים src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 248,253 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2835,20 +2913,16 @@ שגיאה בטעינת נתונים src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2861,9 +2935,10 @@ Why is this block empty? + למה בלוק זה ריק? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation @@ -2909,18 +2984,6 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward פרס @@ -2984,7 +3047,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -3150,6 +3213,7 @@ Usually places your transaction in between the second and third mempool blocks + לרב ממקם את הטרנזקציה בטווח שבין הבלוק השני לשלישי שבתור src/app/components/fees-box/fees-box.component.html 8,9 @@ -3171,6 +3235,7 @@ Usually places your transaction in between the first and second mempool blocks + לרב ממקם את הטרנזקציה בטווח שבין הבלוק הראשון לשני שבתור src/app/components/fees-box/fees-box.component.html 9,10 @@ -3221,7 +3286,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3234,7 +3299,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3247,7 +3312,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3261,7 +3326,7 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3313,6 +3378,7 @@ Hashrate & Difficulty + קשי וכמות האשים src/app/components/graphs/graphs.component.html 15,16 @@ -3321,6 +3387,7 @@ Lightning + ברק src/app/components/graphs/graphs.component.html 31 @@ -3329,6 +3396,7 @@ Lightning Nodes Per Network + צמתי ברק לפי רשת src/app/components/graphs/graphs.component.html 34 @@ -3349,6 +3417,7 @@ Lightning Network Capacity + קיבולת רשת הברק src/app/components/graphs/graphs.component.html 36 @@ -3369,6 +3438,7 @@ Lightning Nodes Per ISP + צמתי ברק לפי ספקי תשתית src/app/components/graphs/graphs.component.html 38 @@ -3381,6 +3451,7 @@ Lightning Nodes Per Country + צמתי ברק לפי מדינה src/app/components/graphs/graphs.component.html 40 @@ -3397,6 +3468,7 @@ Lightning Nodes World Map + צמתי ברק במפת העולם src/app/components/graphs/graphs.component.html 42 @@ -3413,6 +3485,7 @@ Lightning Nodes Channels World Map + ערוצי צמתי ברק במפת העולם src/app/components/graphs/graphs.component.html 44 @@ -3467,6 +3540,7 @@ Hashrate (MA) + כמות האשים (ממוצע נע) src/app/components/hashrate-chart/hashrate-chart.component.ts 292,291 @@ -3509,7 +3583,7 @@ src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3534,7 +3608,7 @@ Lightning Explorer src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3542,20 +3616,12 @@ master-page.lightning - - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation דוקיומנטציה src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3635,8 +3701,35 @@ dashboard.adjustments + + Broadcast Transaction + שדר טרנזקציה + + src/app/components/mining-dashboard/mining-dashboard.component.html + 92 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) + מזל הבריכות (1 שבועות) src/app/components/pool-ranking/pool-ranking.component.html 9 @@ -3645,6 +3738,7 @@ Pools luck + מזל הבריכות src/app/components/pool-ranking/pool-ranking.component.html 9,11 @@ -3653,6 +3747,7 @@ The overall luck of all mining pools over the past week. A luck bigger than 100% means the average block time for the current epoch is less than 10 minutes. + מזל בריכות הכירה בשבוע החולף. מזל הגבוה מ100% מציין כי ממוצע זמן מציאת הבלוק קטן מ10 דקות. src/app/components/pool-ranking/pool-ranking.component.html 11,15 @@ -3661,6 +3756,7 @@ Pools count (1w) + ספירת בריכות (שבוע) src/app/components/pool-ranking/pool-ranking.component.html 17 @@ -3669,6 +3765,7 @@ Pools count + ספירת בריכות src/app/components/pool-ranking/pool-ranking.component.html 17,19 @@ -3696,12 +3793,13 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks The number of blocks found over the past week. + מספר הבלוקים שנמצאו בשבוע החולף src/app/components/pool-ranking/pool-ranking.component.html 27,31 @@ -3725,12 +3823,25 @@ mining.rank + + Avg Health + בריאות ממוצעת + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks בלוקים ריקים src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3739,7 +3850,7 @@ כל הכורים src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3748,7 +3859,7 @@ מזל בריכות (שבוע) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3757,7 +3868,7 @@ ספירת בריכות (שבוע) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3766,7 +3877,7 @@ בריכות כרייה src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 @@ -3783,6 +3894,7 @@ mining pool + בריכה כרייה src/app/components/pool/pool-preview.component.html 3,5 @@ -3992,24 +4104,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - שדר טרנזקציה - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex קידוד טרנזקציה @@ -4019,7 +4113,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 290,291 transaction.hex @@ -4051,6 +4145,7 @@ Avg Block Fees + ממוצע עמלות בלוק src/app/components/reward-stats/reward-stats.component.html 17 @@ -4063,6 +4158,7 @@ Average fees per block in the past 144 blocks + ממוצע העמלות לבלוק ב144 הבלוקים האחרונים src/app/components/reward-stats/reward-stats.component.html 18,20 @@ -4071,6 +4167,7 @@ BTC/block + ביטקוין/בלוק src/app/components/reward-stats/reward-stats.component.html 21,24 @@ -4080,6 +4177,7 @@ Avg Tx Fee + ממוצע עמלה לטרנזקציה src/app/components/reward-stats/reward-stats.component.html 30 @@ -4139,6 +4237,78 @@ search-form.search-title + + Bitcoin Block Height + גובה בלוק ביטקוין + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + טרנזקציית ביטקוין + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + כתובת ביטקוין + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + בלוק ביטקוין + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + כתובת ביטקוין + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + צמתי ברק + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + ערוצי ברק + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + עבור ל + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) Mempool by vBytes (sat/vByte) @@ -4396,6 +4566,7 @@ This transaction replaced: + טרנזקציה זו הוחלפה: src/app/components/transaction/transaction.component.html 10,12 @@ -4405,6 +4576,7 @@ Replaced + הוחלפה src/app/components/transaction/transaction.component.html 36,39 @@ -4421,7 +4593,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4431,11 +4603,11 @@ נראה לראשונה src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4451,11 +4623,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4465,7 +4637,7 @@ זמן אישור משוער src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4475,7 +4647,7 @@ בעוד מספר שעות (או יותר) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4485,11 +4657,11 @@ צאצא src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4499,37 +4671,40 @@ אב קדמון src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor Flow + זרימה src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 340,344 Transaction flow transaction.flow Hide diagram + הסתר דיאגרמה src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram Show more + הצג עוד src/app/components/transaction/transaction.component.html - 231,233 + 225,227 src/app/components/transactions-list/transactions-list.component.html @@ -4543,9 +4718,10 @@ Show less + הצג פחות src/app/components/transaction/transaction.component.html - 233,239 + 227,233 src/app/components/transactions-list/transactions-list.component.html @@ -4555,9 +4731,10 @@ Show diagram + הצג דיאגמה src/app/components/transaction/transaction.component.html - 253,254 + 247,248 show-diagram @@ -4566,7 +4743,7 @@ זמן נעילה src/app/components/transaction/transaction.component.html - 292,294 + 286,288 transaction.locktime @@ -4575,7 +4752,7 @@ טרנזקציה לא נמצאה. src/app/components/transaction/transaction.component.html - 455,456 + 449,450 transaction.error.transaction-not-found @@ -4584,7 +4761,7 @@ ממתין להופעתה בממפול.. src/app/components/transaction/transaction.component.html - 456,461 + 450,455 transaction.error.waiting-for-it-to-appear @@ -4593,7 +4770,7 @@ שיעור עמלה אפקטיבי src/app/components/transaction/transaction.component.html - 489,492 + 485,488 Effective transaction fee rate transaction.effective-fee-rate @@ -4739,22 +4916,25 @@ Show more inputs to reveal fee data + הצג עוד קלטים כדי לחשוף מידע אודות עמלה src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info remaining + נותרו src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining other inputs + קלטים אחרים src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 12 @@ -4763,6 +4943,7 @@ other outputs + פלטים אחרים src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 13 @@ -4771,6 +4952,7 @@ Input + קלט src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 42 @@ -4783,6 +4965,7 @@ Output + פלט src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 43 @@ -4795,6 +4978,7 @@ This transaction saved % on fees by using native SegWit + טרנזקציה זו חסכה % בעמלות באמצעות שימוש בnative SegWit src/app/components/tx-features/tx-features.component.html 2 @@ -4821,6 +5005,7 @@ This transaction saved % on fees by using SegWit and could save % more by fully upgrading to native SegWit + טרנזקציה זו חסכה % בעמלות בשימוש בSegWit, אך יכלה לחסוך % יותר בשידרוג לnative SegWit src/app/components/tx-features/tx-features.component.html 4 @@ -4829,6 +5014,7 @@ This transaction could save % on fees by upgrading to native SegWit or % by upgrading to SegWit-P2SH + טרנזקציה זו יכלה לחסוך % בעמלות בשידרוג לnative SegWit או % בשידורג לSegWit-P2SH src/app/components/tx-features/tx-features.component.html 6 @@ -4837,6 +5023,7 @@ This transaction uses Taproot and thereby saved at least % on fees + טרנזקציה זו משתמשת בטאפרוט ולכן חסכה לפחות % בעמלות src/app/components/tx-features/tx-features.component.html 12 @@ -4845,6 +5032,7 @@ Taproot + טאפרוט src/app/components/tx-features/tx-features.component.html 12 @@ -4870,6 +5058,7 @@ This transaction uses Taproot and already saved at least % on fees, but could save an additional % by fully using Taproot + טרנזקציה זו משתמשת בטאפרוט ולכן חסכה לפחות % בעמלות, אך יכלה לחסוך % נוספים בשימוש מלא בטאפרוט src/app/components/tx-features/tx-features.component.html 14 @@ -4878,6 +5067,7 @@ This transaction could save % on fees by using Taproot + טרנזקציה זו יכלה לחסוך % בעמלות בשימוש בטאפרוט src/app/components/tx-features/tx-features.component.html 16 @@ -4886,6 +5076,7 @@ This transaction does not use Taproot + טרנזקציה זו לא השתמשה בטאפרוט src/app/components/tx-features/tx-features.component.html 18 @@ -4903,6 +5094,7 @@ This transaction supports Replace-By-Fee (RBF) allowing fee bumping + טרנזקציה זו תומכת בשינוי עמלות (RBF) המאפשרת להעלות את העמלה src/app/components/tx-features/tx-features.component.html 28 @@ -4987,21 +5179,12 @@ dashboard.latest-transactions - - USD - דולר אמריקאי - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee עמלה מינימלית src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -5011,7 +5194,7 @@ סף עמלה src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging @@ -5021,7 +5204,7 @@ שימוש בזיכרון src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage @@ -5031,15 +5214,23 @@ L-BTC במחזור src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + faq.big-disclaimer + REST API service src/app/docs/api-docs/api-docs.component.html - 39,40 + 41,42 api-docs.title @@ -5048,11 +5239,11 @@ נקודת קצה src/app/docs/api-docs/api-docs.component.html - 48,49 + 50,51 src/app/docs/api-docs/api-docs.component.html - 102,105 + 104,107 Api docs endpoint @@ -5061,11 +5252,11 @@ תיאור src/app/docs/api-docs/api-docs.component.html - 67,68 + 69,70 src/app/docs/api-docs/api-docs.component.html - 106,107 + 108,109 @@ -5073,7 +5264,7 @@ ברירת מחדל דוחף: פעולה ׳רוצה׳, מידע: [׳בלוקים׳,...] לבטא את מה שרצית לדחוף. זמין בלוקים , בלוקי-ממפול , תצוגה חיה-שעתיים-טבלה , ו סטטיסטיקות . דוחף טרנזקציות הקשורות לכתובת: ׳עקוב-כתובת׳: ׳3PbJ...bF9B' לקבלה של כל הטרנזקציות החדשות המכילות את כתובת זו כקלט או פלט. מאחזר מערך של טרנזקציות. טרנזקציות-כתובת לטרנזקציות ממפול חדשות ו בלוקי-טרנזקציות לבלוקים מאושרים חדשים. src/app/docs/api-docs/api-docs.component.html - 107,108 + 109,110 api-docs.websocket.websocket @@ -5142,6 +5333,7 @@ Base fee + עמלה בסיסית src/app/lightning/channel/channel-box/channel-box.component.html 29 @@ -5168,7 +5360,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5230,18 +5422,20 @@ channels + ערוצים src/app/lightning/channel/channel-box/channel-box.component.html 79 src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 lightning.x-channels Starting balance + מאזן התחלתי src/app/lightning/channel/channel-close-box/channel-close-box.component.html 6 @@ -5251,6 +5445,7 @@ Closing balance + מאזן סגירה src/app/lightning/channel/channel-close-box/channel-close-box.component.html 12 @@ -5260,6 +5455,7 @@ lightning channel + ערוץ ברק src/app/lightning/channel/channel-preview.component.html 3,5 @@ -5268,81 +5464,86 @@ Inactive + לא פעיל src/app/lightning/channel/channel-preview.component.html 10,11 - - src/app/lightning/channel/channel.component.html - 11,12 - - - src/app/lightning/channels-list/channels-list.component.html - 65,66 - - status.inactive - - - Active - - src/app/lightning/channel/channel-preview.component.html - 11,12 - - - src/app/lightning/channel/channel.component.html - 12,13 - - - src/app/lightning/channels-list/channels-list.component.html - 66,68 - - status.active - - - Closed - - src/app/lightning/channel/channel-preview.component.html - 12,14 - src/app/lightning/channel/channel.component.html 13,14 + + src/app/lightning/channels-list/channels-list.component.html + 68,69 + + status.inactive + + + Active + פעיל + + src/app/lightning/channel/channel-preview.component.html + 11,12 + + + src/app/lightning/channel/channel.component.html + 14,15 + + + src/app/lightning/channels-list/channels-list.component.html + 69,71 + + status.active + + + Closed + סגור + + src/app/lightning/channel/channel-preview.component.html + 12,14 + + + src/app/lightning/channel/channel.component.html + 15,16 + src/app/lightning/channels-list/channels-list.component.html 8,13 src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed Created + נוצר src/app/lightning/channel/channel-preview.component.html 23,26 src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created Capacity + קיבולת src/app/lightning/channel/channel-preview.component.html 27,28 src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 src/app/lightning/node-statistics/node-statistics.component.html @@ -5350,7 +5551,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5372,6 +5573,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5404,25 +5609,27 @@ Lightning channel + ערוץ ברק src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel Last update + עידכון אחרון src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5438,59 +5645,89 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update Closing date + תאריך סגירה src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,43 lightning.closing_date Closed by + נסגר ע"י src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by Opening transaction + טרנזקציית פתיחה src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction Closing transaction + טרנזקציית סגירה src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction Channel: + ערוץ: src/app/lightning/channel/channel.component.ts 37 + + Mutually closed + סגירה ידנית + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + סגירה כפויה + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + סגירה כפויה עם ענישה + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open + פתוח src/app/lightning/channels-list/channels-list.component.html 5,7 @@ -5499,17 +5736,19 @@ No channels to display + אין ערוצים להצגה src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list Alias + כינוי src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5533,39 +5772,42 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias Status + מצב src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status Channel ID + מזהה ערוץ src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id sats + סאטושיז src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,67 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5609,8 +5851,27 @@ shared.sats + + avg + ממוצע + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + חציון + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity + קיבולת ממוצעת src/app/lightning/channels-statistics/channels-statistics.component.html 13,15 @@ -5623,6 +5884,7 @@ Avg Fee Rate + ממוצע שיעור העמלה src/app/lightning/channels-statistics/channels-statistics.component.html 26,28 @@ -5643,6 +5905,7 @@ Avg Base Fee + ממוצע בסיס העמלה src/app/lightning/channels-statistics/channels-statistics.component.html 41,43 @@ -5663,6 +5926,7 @@ Med Capacity + קיבולת חציונית src/app/lightning/channels-statistics/channels-statistics.component.html 59,61 @@ -5671,6 +5935,7 @@ Med Fee Rate + שיעור חציון העמלה src/app/lightning/channels-statistics/channels-statistics.component.html 72,74 @@ -5687,6 +5952,7 @@ Med Base Fee + בסיס העמלה החציוני src/app/lightning/channels-statistics/channels-statistics.component.html 87,89 @@ -5703,6 +5969,7 @@ Lightning node group + קבוצת צמתי ברק src/app/lightning/group/group-preview.component.html 3,5 @@ -5715,6 +5982,7 @@ Nodes + צמתים src/app/lightning/group/group-preview.component.html 25,29 @@ -5725,11 +5993,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5751,6 +6019,7 @@ Liquidity + נזילות src/app/lightning/group/group-preview.component.html 29,31 @@ -5777,16 +6046,13 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity Channels + ערוצים src/app/lightning/group/group-preview.component.html 40,43 @@ -5797,11 +6063,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + 28,29 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5833,11 +6099,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -5847,6 +6113,7 @@ Average size + גודל ממוצע src/app/lightning/group/group-preview.component.html 44,46 @@ -5859,6 +6126,7 @@ Location + מיקום src/app/lightning/group/group.component.html 74,77 @@ -5873,7 +6141,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5889,16 +6157,17 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location Network Statistics + סטטיסטיקת רשת src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 10 @@ -5907,6 +6176,7 @@ Channels Statistics + סטטיסטיקת ערוצים src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 24 @@ -5915,6 +6185,7 @@ Lightning Network History + היסטוריית רשת הברק src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 49 @@ -5927,9 +6198,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -5951,113 +6230,139 @@ Fee distribution + תפוצת עמלות src/app/lightning/node-fee-chart/node-fee-chart.component.html 2 lightning.node-fee-distribution + + Outgoing Fees + עמלות יוצאות + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + עמלות נכנסות + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week + אחוז השינוי בשבוע החולף src/app/lightning/node-statistics/node-statistics.component.html 5,7 src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week Lightning node + צומת ברק src/app/lightning/node/node-preview.component.html 3,5 src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node Active capacity + קיבולת פעילה src/app/lightning/node/node-preview.component.html 20,22 src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity Active channels + ערוצים פעילים src/app/lightning/node/node-preview.component.html 26,30 src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels Country + מדינה src/app/lightning/node/node-preview.component.html 44,47 country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size + ממוצע גודל ערוץ src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg Avg channel distance + ממוצע מרחק ערוץ src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance Color + צבע src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color ISP + ספק אינטרנט src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6067,9 +6372,10 @@ Exclusively on Tor + ייחודי ברשת תור src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6077,7 +6383,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6085,7 +6391,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6094,7 +6400,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6102,24 +6408,26 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight Channel fee rate + שיעור עמלת הערוץ src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate Channel base fee + בסיס עמלת הערוץ src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6127,7 +6435,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6135,28 +6443,31 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records Open channels + ערוצים פתוחים src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels Closed channels + ערוצים סגורים src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels Node: + צומת: src/app/lightning/node/node.component.ts 60 @@ -6193,11 +6504,12 @@ No geolocation data available src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 Active channels map + מפת ערוצים פעילים src/app/lightning/nodes-channels/node-channels.component.html 2,3 @@ -6206,6 +6518,7 @@ Indexing in progress + מפתוח בתהליך src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 121,116 @@ -6215,8 +6528,9 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet + רשת גלויה ומוסתרת src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6226,8 +6540,9 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) + רשת גלויה בלבד (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6237,8 +6552,9 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) + רשת מוסתרת בלבד (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6250,6 +6566,7 @@ Share + שיתוף src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html 29,31 @@ -6262,6 +6579,7 @@ nodes + צמתים src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 103,102 @@ -6277,6 +6595,7 @@ BTC capacity + קיבולת ביטקוין src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,102 @@ -6284,6 +6603,7 @@ Lightning nodes in + צמתי ברק ב src/app/lightning/nodes-per-country/nodes-per-country.component.html 3,4 @@ -6308,6 +6628,7 @@ Lightning nodes in + צמתי ברק ב src/app/lightning/nodes-per-country/nodes-per-country.component.ts 35 @@ -6315,6 +6636,7 @@ Clearnet Capacity + קיבולת רשת גלויה src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6335,6 +6657,7 @@ Unknown Capacity + קיבולת לא ידועה src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 13,15 @@ -6355,6 +6678,7 @@ Tor Capacity + קיבולת ברשת תור src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 20,22 @@ -6383,6 +6707,7 @@ BTC + ביטקוין src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 158,156 @@ -6402,6 +6727,7 @@ Top country + מדינה מובילה src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 39,41 @@ -6414,6 +6740,7 @@ Top node + צומת מוביל src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 45,48 @@ -6449,6 +6776,7 @@ Active nodes + צמתים פעילים src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 14,18 @@ -6457,6 +6785,7 @@ Top 100 oldest lightning nodes + רשימת 100 צמתי הברק הותיקים ביותר src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.html 3,7 @@ -6465,29 +6794,15 @@ Oldest lightning nodes + צמתי ברק ותיקים ביותר src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.ts 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes + צמתים ישנים ביותר src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html 36 @@ -6496,6 +6811,7 @@ Top lightning nodes + צמתי ברק מובילים src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.ts 22 @@ -6503,6 +6819,7 @@ Indexing in progress + מפתוח בתהליך src/app/lightning/statistics-chart/lightning-statistics-chart.component.html 52,55 diff --git a/frontend/src/locale/messages.ka.xlf b/frontend/src/locale/messages.ka.xlf index d7614a377..762fd754e 100644 --- a/frontend/src/locale/messages.ka.xlf +++ b/frontend/src/locale/messages.ka.xlf @@ -4305,7 +4305,7 @@ Go to "" - Go to "" + ნახვა "" src/app/components/search-form/search-results/search-results.component.html 52 diff --git a/frontend/src/locale/messages.nb.xlf b/frontend/src/locale/messages.nb.xlf index c699eff99..3786617b7 100644 --- a/frontend/src/locale/messages.nb.xlf +++ b/frontend/src/locale/messages.nb.xlf @@ -2347,7 +2347,7 @@ Match - lik + Identisk src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 38 @@ -2944,7 +2944,7 @@ Pool - Gruppe + Utvinningsgruppe src/app/components/blocks-list/blocks-list.component.html 14 @@ -3352,7 +3352,7 @@ Pools Ranking - Grupperangering + Utvinningsgruppe-rangering src/app/components/graphs/graphs.component.html 11 @@ -3365,7 +3365,7 @@ Pools Dominance - Gruppedominans + Utvinningsgruppe-dominans src/app/components/graphs/graphs.component.html 13 @@ -3552,7 +3552,7 @@ Pools Historical Dominance - Gruppe historisk dominans + Utvinningsgruppe historisk dominans src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts 64 @@ -3568,7 +3568,7 @@ Indexing pools hashrate - Indekserer gruppehashrate + Indekserer utvinningsgruppe-hashrate src/app/components/indexing-progress/indexing-progress.component.html 3 @@ -3730,7 +3730,7 @@ Pools luck (1 week) - Grupper flaks (1 uke) + Utvinningsgrupper flaks (1 uke) src/app/components/pool-ranking/pool-ranking.component.html 9 @@ -3739,7 +3739,7 @@ Pools luck - Grupper flaks + Utvinningsgrupper flaks src/app/components/pool-ranking/pool-ranking.component.html 9,11 @@ -3757,7 +3757,7 @@ Pools count (1w) - Antall grupper (1uke) + Antall utvinningsgrupper (1uke) src/app/components/pool-ranking/pool-ranking.component.html 17 @@ -3766,7 +3766,7 @@ Pools count - Antall grupper + Antall utvinningsgrupper src/app/components/pool-ranking/pool-ranking.component.html 17,19 @@ -3858,7 +3858,7 @@ Pools Luck (1w) - Grupper flaks (1uke) + Utvinningsgrupper flaks (1uke) src/app/components/pool-ranking/pool-ranking.component.html 146,148 @@ -3867,7 +3867,7 @@ Pools Count (1w) - Antall grupper (1uke) + Antall utvinningsgrupper (1uke) src/app/components/pool-ranking/pool-ranking.component.html 158,160 diff --git a/frontend/src/locale/messages.sv.xlf b/frontend/src/locale/messages.sv.xlf index 0ba5402ad..13e5ec135 100644 --- a/frontend/src/locale/messages.sv.xlf +++ b/frontend/src/locale/messages.sv.xlf @@ -2667,7 +2667,7 @@ Unknown - Okända + Okänd src/app/components/block/block.component.html 67,70 From a8214bcbbde8ce8100910f1bf2e0da3aff38a13a Mon Sep 17 00:00:00 2001 From: wiz Date: Thu, 9 Mar 2023 14:24:18 +0900 Subject: [PATCH 011/782] Add old special block events to app constants --- frontend/src/app/app.constants.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/app.constants.ts b/frontend/src/app/app.constants.ts index bd8fc46eb..f15733bb0 100644 --- a/frontend/src/app/app.constants.ts +++ b/frontend/src/app/app.constants.ts @@ -136,12 +136,28 @@ export const languages: Language[] = [ ]; export const specialBlocks = { + '0': { + labelEvent: 'Genesis', + labelEventCompleted: 'The Genesis of Bitcoin', + }, + '210000': { + labelEvent: 'Bitcoin\'s 1st Halving', + labelEventCompleted: 'Block Subsidy has halved to 25 BTC per block', + }, + '420000': { + labelEvent: 'Bitcoin\'s 2nd Halving', + labelEventCompleted: 'Block Subsidy has halved to 12.5 BTC per block', + }, + '630000': { + labelEvent: 'Bitcoin\'s 3rd Halving', + labelEventCompleted: 'Block Subsidy has halved to 6.25 BTC per block', + }, '709632': { labelEvent: 'Taproot 🌱 activation', labelEventCompleted: 'Taproot 🌱 has been activated!', }, '840000': { - labelEvent: 'Halving 🥳', + labelEvent: 'Bitcoin\'s 4th Halving', labelEventCompleted: 'Block Subsidy has halved to 3.125 BTC per block', } }; From 37e94249dfe995a86e68ac5946b3ee95944d4356 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 9 Mar 2023 15:30:04 +0900 Subject: [PATCH 012/782] Fixing Channels and Capacity i18n strings --- .../node-statistics-chart.component.ts | 8 +- frontend/src/locale/messages.xlf | 376 +++++++++--------- 2 files changed, 198 insertions(+), 186 deletions(-) diff --git a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts index 91384b31b..7518b33da 100644 --- a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts +++ b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts @@ -146,7 +146,7 @@ export class NodeStatisticsChartComponent implements OnInit { padding: 10, data: [ { - name: 'Channels', + name: $localize`:@@807cf11e6ac1cde912496f764c176bdfdd6b7e19:Channels`, inactiveColor: 'rgb(110, 112, 121)', textStyle: { color: 'white', @@ -154,7 +154,7 @@ export class NodeStatisticsChartComponent implements OnInit { icon: 'roundRect', }, { - name: 'Capacity', + name: $localize`:@@ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa:Capacity`, inactiveColor: 'rgb(110, 112, 121)', textStyle: { color: 'white', @@ -201,7 +201,7 @@ export class NodeStatisticsChartComponent implements OnInit { series: data.channels.length === 0 ? [] : [ { zlevel: 1, - name: 'Channels', + name: $localize`:@@807cf11e6ac1cde912496f764c176bdfdd6b7e19:Channels`, showSymbol: false, symbol: 'none', data: data.channels, @@ -224,7 +224,7 @@ export class NodeStatisticsChartComponent implements OnInit { { zlevel: 0, yAxisIndex: 1, - name: 'Capacity', + name: $localize`:@@ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa:Capacity`, showSymbol: false, symbol: 'none', stack: 'Total', diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index 49d42a2f1..48c7da18d 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -995,7 +995,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1124,11 +1124,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1144,11 +1144,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1165,7 +1165,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1466,7 +1466,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1893,7 +1893,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -1939,7 +1939,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -1959,7 +1959,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -1998,7 +1998,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2023,7 +2023,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2044,7 +2044,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2137,11 +2137,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2170,7 +2170,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2239,7 +2239,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2277,7 +2277,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2293,7 +2293,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2333,7 +2333,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2360,7 +2360,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2651,11 +2651,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2692,7 +2692,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3117,7 +3117,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3125,7 +3125,7 @@ Pools Ranking src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3137,7 +3137,7 @@ Pools Dominance src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3149,7 +3149,7 @@ Hashrate & Difficulty src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3157,7 +3157,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3165,7 +3165,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3185,7 +3185,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3205,7 +3205,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3217,7 +3217,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3233,7 +3233,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3249,7 +3249,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3269,11 +3269,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3301,11 +3301,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3828,7 +3828,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4030,7 +4030,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4038,7 +4038,7 @@ Invert src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4046,200 +4046,192 @@ Transaction vBytes per second (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second Just now - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4363,7 +4355,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4380,7 +4372,7 @@ Show more src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4396,7 +4388,7 @@ Show less src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4408,7 +4400,7 @@ Show diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4416,7 +4408,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4424,7 +4416,7 @@ Transaction not found. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4432,7 +4424,7 @@ Waiting for it to appear in the mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4440,7 +4432,7 @@ Effective fee rate src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4851,13 +4843,17 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -4865,11 +4861,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -4877,18 +4873,18 @@ Description src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5154,6 +5150,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5642,6 +5646,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 From 304089b3d0acc8f8c4983e347490d0f938e4ad90 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 9 Mar 2023 17:27:19 +0900 Subject: [PATCH 013/782] Bump axios from 0.27.2 -> 1.3.4 --- backend/package-lock.json | 34 +++++++++++++++++++++++----------- backend/package.json | 2 +- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 8b5f759f7..5962e01c4 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -12,7 +12,7 @@ "@babel/core": "^7.20.12", "@mempool/electrum-client": "^1.1.7", "@types/node": "^16.18.11", - "axios": "~0.27.2", + "axios": "~1.3.4", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", @@ -2082,12 +2082,13 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/babel-jest": { @@ -5217,6 +5218,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -7869,12 +7875,13 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "babel-jest": { @@ -10227,6 +10234,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index 9c1b3a12a..95309c20e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -37,7 +37,7 @@ "@babel/core": "^7.20.12", "@mempool/electrum-client": "^1.1.7", "@types/node": "^16.18.11", - "axios": "~0.27.2", + "axios": "~1.3.4", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", From 63dd9fd09e81e74c2369891762d5da84191fe197 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 9 Mar 2023 17:45:08 +0900 Subject: [PATCH 014/782] Log a warn if there are lot of 404 from esplora tx api --- backend/src/api/mempool.ts | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 4c475502c..db5de82b2 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -31,6 +31,11 @@ class Mempool { private mempoolProtection = 0; private latestTransactions: any[] = []; + private ESPLORA_MISSING_TX_WARNING_THRESHOLD = 100; + private SAMPLE_TIME = 10000; // In ms + private timer = new Date().getTime(); + private missingTxCount = 0; + constructor() { setInterval(this.updateTxPerSecond.bind(this), 1000); setInterval(this.deleteExpiredTransactions.bind(this), 20000); @@ -128,6 +133,16 @@ class Mempool { loadingIndicators.setProgress('mempool', Object.keys(this.mempoolCache).length / transactions.length * 100); } + // https://github.com/mempool/mempool/issues/3283 + const logEsplora404 = (missingTxCount, threshold, time) => { + const log = `In the past ${time / 1000} seconds, esplora tx API replied ${missingTxCount} times with a 404 error code while updating nodejs backend mempool`; + if (missingTxCount >= threshold) { + logger.warn(log); + } else if (missingTxCount > 0) { + logger.debug(log); + } + }; + for (const txid of transactions) { if (!this.mempoolCache[txid]) { try { @@ -142,7 +157,10 @@ class Mempool { } hasChange = true; newTransactions.push(transaction); - } catch (e) { + } catch (e: any) { + if (config.MEMPOOL.BACKEND === 'esplora' && e.response?.status === 404) { + this.missingTxCount++; + } logger.debug(`Error finding transaction '${txid}' in the mempool: ` + (e instanceof Error ? e.message : e)); } } @@ -152,6 +170,14 @@ class Mempool { } } + // Reset esplora 404 counter and log a warning if needed + const elapsedTime = new Date().getTime() - this.timer; + if (elapsedTime > this.SAMPLE_TIME) { + logEsplora404(this.missingTxCount, this.ESPLORA_MISSING_TX_WARNING_THRESHOLD, elapsedTime); + this.timer = new Date().getTime(); + this.missingTxCount = 0; + } + // Prevent mempool from clear on bitcoind restart by delaying the deletion if (this.mempoolProtection === 0 && currentMempoolSize > 20000 From 42228dc70f397628ef0177a229c8dddec823f425 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 9 Mar 2023 17:46:09 +0900 Subject: [PATCH 015/782] Revert "Bump axios from 0.27.2 -> 1.3.4" --- backend/package-lock.json | 34 +++++++++++----------------------- backend/package.json | 2 +- 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 5962e01c4..8b5f759f7 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -12,7 +12,7 @@ "@babel/core": "^7.20.12", "@mempool/electrum-client": "^1.1.7", "@types/node": "^16.18.11", - "axios": "~1.3.4", + "axios": "~0.27.2", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", @@ -2082,13 +2082,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, "node_modules/babel-jest": { @@ -5218,11 +5217,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -7875,13 +7869,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, "babel-jest": { @@ -10234,11 +10227,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index 95309c20e..9c1b3a12a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -37,7 +37,7 @@ "@babel/core": "^7.20.12", "@mempool/electrum-client": "^1.1.7", "@types/node": "^16.18.11", - "axios": "~1.3.4", + "axios": "~0.27.2", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", From 548a6ea66497677449c93da4f9404885214ea22b Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 9 Mar 2023 18:53:29 +0900 Subject: [PATCH 016/782] Autofocus search input when we load the app for the first time --- .../src/app/components/search-form/search-form.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/search-form/search-form.component.html b/frontend/src/app/components/search-form/search-form.component.html index b881c6ea7..cdfcfe015 100644 --- a/frontend/src/app/components/search-form/search-form.component.html +++ b/frontend/src/app/components/search-form/search-form.component.html @@ -1,7 +1,7 @@
- +
From 6327ce7c899878411d4777151bc0bba425134bfb Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Fri, 10 Mar 2023 09:21:44 +0900 Subject: [PATCH 017/782] Sort asn numerically - add few more top 10 isp in warm cache --- backend/src/api/explorer/nodes.api.ts | 16 ++++++++-------- production/nginx-cache-warmer | 7 +++++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/backend/src/api/explorer/nodes.api.ts b/backend/src/api/explorer/nodes.api.ts index e1949a17c..d86ecf665 100644 --- a/backend/src/api/explorer/nodes.api.ts +++ b/backend/src/api/explorer/nodes.api.ts @@ -417,24 +417,24 @@ class NodesApi { if (!ispList[isp1]) { ispList[isp1] = { - id: channel.isp1ID.toString(), + ids: [channel.isp1ID], capacity: 0, channels: 0, nodes: {}, }; - } else if (ispList[isp1].id.indexOf(channel.isp1ID) === -1) { - ispList[isp1].id += ',' + channel.isp1ID.toString(); + } else if (ispList[isp1].ids.includes(channel.isp1ID) === false) { + ispList[isp1].ids.push(channel.isp1ID); } if (!ispList[isp2]) { ispList[isp2] = { - id: channel.isp2ID.toString(), + ids: [channel.isp2ID], capacity: 0, channels: 0, nodes: {}, }; - } else if (ispList[isp2].id.indexOf(channel.isp2ID) === -1) { - ispList[isp2].id += ',' + channel.isp2ID.toString(); + } else if (ispList[isp2].ids.includes(channel.isp2ID) === false) { + ispList[isp2].ids.push(channel.isp2ID); } ispList[isp1].capacity += channel.capacity; @@ -444,11 +444,11 @@ class NodesApi { ispList[isp2].channels += 1; ispList[isp2].nodes[channel.node2PublicKey] = true; } - + const ispRanking: any[] = []; for (const isp of Object.keys(ispList)) { ispRanking.push([ - ispList[isp].id, + ispList[isp].ids.sort((a, b) => a - b).join(','), isp, ispList[isp].capacity, ispList[isp].channels, diff --git a/production/nginx-cache-warmer b/production/nginx-cache-warmer index 5a298367b..6b58e5b78 100755 --- a/production/nginx-cache-warmer +++ b/production/nginx-cache-warmer @@ -95,7 +95,7 @@ do for url in / \ '/api/v1/lightning/statistics/3y' \ '/api/v1/lightning/statistics/all' \ '/api/v1/lightning/nodes/isp-ranking' \ - '/api/v1/lightning/nodes/isp/396982,15169' `# Google` \ + '/api/v1/lightning/nodes/isp/15169,396982' `# Google` \ '/api/v1/lightning/nodes/isp/14618,16509' `# Amazon` \ '/api/v1/lightning/nodes/isp/39572' `# DataWeb` \ '/api/v1/lightning/nodes/isp/14061' `# Digital Ocean` \ @@ -107,12 +107,15 @@ do for url in / \ '/api/v1/lightning/nodes/isp/34197' `# SHRD SARL` \ '/api/v1/lightning/nodes/isp/42275' `# Three Fourteen SASU` \ '/api/v1/lightning/nodes/isp/16276' `# OVH SAS` \ - '/api/v1/lightning/nodes/isp/11426,11427,20001,20115,11351,10796,33363,12271' `# Spectrum` \ + '/api/v1/lightning/nodes/isp/10796,11351,11426,11427,12271,20001,20115,33363' `# Spectrum` \ '/api/v1/lightning/nodes/isp/701' `# Verizon` \ '/api/v1/lightning/nodes/isp/12876' `# Scaleway` \ '/api/v1/lightning/nodes/isp/33915' `# Ziggo` \ '/api/v1/lightning/nodes/isp/3320' `# Deutsche Telekom AG` \ '/api/v1/lightning/nodes/isp/8075' `# Microsoft Azure` \ + '/api/v1/lightning/nodes/isp/212531', `# UAB Interneto vizija` \ + '/api/v1/lightning/nodes/isp/63949', `# Linode` \ + '/api/v1/lightning/nodes/isp/51167', `# Contabo GmbH` \ '/api/v1/lightning/nodes/countries' \ '/api/v1/lightning/nodes/rankings' \ '/api/v1/lightning/nodes/rankings/liquidity' \ From 778e2f9b6464a5bd5e80e0f7bd193e29fc0ca3ad Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Fri, 10 Mar 2023 10:26:30 +0900 Subject: [PATCH 018/782] Fixes #3217 --- .../blocks-list/blocks-list.component.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 160e0c882..0086ff902 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -87,8 +87,8 @@ export class BlocksList implements OnInit, OnDestroy { this.stateService.blocks$ .pipe( switchMap((block) => { - if (block[0].height < this.lastBlockHeight) { - return []; // Return an empty stream so the last pipe is not executed + if (block[0].height <= this.lastBlockHeight) { + return [null]; // Return an empty stream so the last pipe is not executed } this.lastBlockHeight = block[0].height; return [block]; @@ -101,14 +101,16 @@ export class BlocksList implements OnInit, OnDestroy { this.lastPage = this.page; return blocks[0]; } - this.blocksCount = Math.max(this.blocksCount, blocks[1][0].height) + 1; - if (this.stateService.env.MINING_DASHBOARD) { - // @ts-ignore: Need to add an extra field for the template - blocks[1][0].extras.pool.logo = `/resources/mining-pools/` + - blocks[1][0].extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + if (blocks[1]) { + this.blocksCount = Math.max(this.blocksCount, blocks[1][0].height) + 1; + if (this.stateService.env.MINING_DASHBOARD) { + // @ts-ignore: Need to add an extra field for the template + blocks[1][0].extras.pool.logo = `/resources/mining-pools/` + + blocks[1][0].extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + } + acc.unshift(blocks[1][0]); + acc = acc.slice(0, this.widget ? 6 : 15); } - acc.unshift(blocks[1][0]); - acc = acc.slice(0, this.widget ? 6 : 15); return acc; }, []) ); From 3f234431fbd991dd459cb1f7ae53d2aad3b675ba Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 9 Mar 2023 19:31:53 -0600 Subject: [PATCH 019/782] fix missing fee rating on mobile --- .../src/app/components/transaction/transaction.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 0cd4a86c2..ec08c9303 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -488,7 +488,7 @@
{{ tx.effectiveFeePerVsize | feeRounding }} sat/vB - +
From 796566e7aedcc926b872d7feef291554c4b8ce29 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 9 Mar 2023 19:47:54 -0600 Subject: [PATCH 020/782] Save cache to disk on SIGTERM/SIGINT --- backend/src/api/disk-cache.ts | 63 ++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 01bbb4d3f..584916563 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -16,14 +16,26 @@ class DiskCache { private static CHUNK_FILES = 25; private isWritingCache = false; - constructor() { } + constructor() { + if (!cluster.isMaster) { + return; + } + process.on('SIGINT', (e) => { + this.saveCacheToDiskSync(); + process.exit(2); + }); + process.on('SIGTERM', (e) => { + this.saveCacheToDiskSync(); + process.exit(2); + }); + } async $saveCacheToDisk(): Promise { if (!cluster.isPrimary) { return; } if (this.isWritingCache) { - logger.debug('Saving cache already in progress. Skipping.') + logger.debug('Saving cache already in progress. Skipping.'); return; } try { @@ -61,7 +73,50 @@ class DiskCache { } } - wipeCache() { + saveCacheToDiskSync(): void { + if (!cluster.isPrimary) { + return; + } + if (this.isWritingCache) { + logger.debug('Saving cache already in progress. Skipping.'); + return; + } + try { + logger.debug('Writing mempool and blocks data to disk cache (sync)...'); + this.isWritingCache = true; + + const mempool = memPool.getMempool(); + const mempoolArray: TransactionExtended[] = []; + for (const tx in mempool) { + mempoolArray.push(mempool[tx]); + } + + Common.shuffleArray(mempoolArray); + + const chunkSize = Math.floor(mempoolArray.length / DiskCache.CHUNK_FILES); + + fs.writeFileSync(DiskCache.FILE_NAME, JSON.stringify({ + cacheSchemaVersion: this.cacheSchemaVersion, + blocks: blocks.getBlocks(), + blockSummaries: blocks.getBlockSummaries(), + mempool: {}, + mempoolArray: mempoolArray.splice(0, chunkSize), + }), { flag: 'w' }); + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + fs.writeFileSync(DiskCache.FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ + mempool: {}, + mempoolArray: mempoolArray.splice(0, chunkSize), + }), { flag: 'w' }); + } + logger.debug('Mempool and blocks data saved to disk cache'); + this.isWritingCache = false; + } catch (e) { + logger.warn('Error writing to cache file: ' + (e instanceof Error ? e.message : e)); + this.isWritingCache = false; + } + } + + wipeCache(): void { logger.notice(`Wiping nodejs backend cache/cache*.json files`); try { fs.unlinkSync(DiskCache.FILE_NAME); @@ -83,7 +138,7 @@ class DiskCache { } } - loadMempoolCache() { + loadMempoolCache(): void { if (!fs.existsSync(DiskCache.FILE_NAME)) { return; } From 46d89ac8379c04ceaa1c0988bab62211b4cf86de Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 9 Mar 2023 20:19:22 -0600 Subject: [PATCH 021/782] prevent disk cache file write corruption --- backend/src/api/disk-cache.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 584916563..af04d5acb 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -11,6 +11,8 @@ import { Common } from './common'; class DiskCache { private cacheSchemaVersion = 3; + private static TMP_FILE_NAME = config.MEMPOOL.CACHE_DIR + '/tmp-cache.json'; + private static TMP_FILE_NAMES = config.MEMPOOL.CACHE_DIR + '/tmp-cache{number}.json'; private static FILE_NAME = config.MEMPOOL.CACHE_DIR + '/cache.json'; private static FILE_NAMES = config.MEMPOOL.CACHE_DIR + '/cache{number}.json'; private static CHUNK_FILES = 25; @@ -95,7 +97,7 @@ class DiskCache { const chunkSize = Math.floor(mempoolArray.length / DiskCache.CHUNK_FILES); - fs.writeFileSync(DiskCache.FILE_NAME, JSON.stringify({ + fs.writeFileSync(DiskCache.TMP_FILE_NAME, JSON.stringify({ cacheSchemaVersion: this.cacheSchemaVersion, blocks: blocks.getBlocks(), blockSummaries: blocks.getBlockSummaries(), @@ -103,11 +105,17 @@ class DiskCache { mempoolArray: mempoolArray.splice(0, chunkSize), }), { flag: 'w' }); for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { - fs.writeFileSync(DiskCache.FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ + fs.writeFileSync(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ mempool: {}, mempoolArray: mempoolArray.splice(0, chunkSize), }), { flag: 'w' }); } + + fs.renameSync(DiskCache.TMP_FILE_NAME, DiskCache.FILE_NAME); + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + fs.renameSync(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), DiskCache.FILE_NAMES.replace('{number}', i.toString())); + } + logger.debug('Mempool and blocks data saved to disk cache'); this.isWritingCache = false; } catch (e) { From dd01371b61a3b5b8c998585b4423c0b25a91fe7e Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 10 Mar 2023 12:37:55 +0900 Subject: [PATCH 022/782] Fixes changed after checked error in transaction page --- .../src/app/components/transaction/transaction.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 673743344..e254d131a 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -496,7 +496,9 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { @HostListener('window:resize', ['$event']) setGraphSize(): void { if (this.graphContainer) { - this.graphWidth = this.graphContainer.nativeElement.clientWidth; + setTimeout(() => { + this.graphWidth = this.graphContainer.nativeElement.clientWidth; + }, 1); } } From a22a62836e8cc55a0793349a7fcd88c1a80d8e6e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 21 Feb 2023 21:59:31 -0600 Subject: [PATCH 023/782] pixel-perfect flow diagrams --- .../tx-bowtie-graph/tx-bowtie-graph.component.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts index 1c5ee5391..b402ddea8 100644 --- a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts +++ b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts @@ -208,8 +208,8 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { this.outputs = this.initLines('out', voutWithFee, totalValue, this.maxStrands); this.middle = { - path: `M ${(this.width / 2) - this.midWidth} ${(this.height / 2) + 0.5} L ${(this.width / 2) + this.midWidth} ${(this.height / 2) + 0.5}`, - style: `stroke-width: ${this.combinedWeight + 1}; stroke: ${this.gradient[1]}` + path: `M ${(this.width / 2) - this.midWidth} ${(this.height / 2) + 0.25} L ${(this.width / 2) + this.midWidth} ${(this.height / 2) + 0.25}`, + style: `stroke-width: ${this.combinedWeight + 0.5}; stroke: ${this.gradient[1]}` }; this.hasLine = this.inputs.reduce((line, put) => line || !put.zeroValue, false) @@ -266,7 +266,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { const lineParams = weights.map((w, i) => { return { weight: w, - thickness: xputs[i].value === 0 ? this.zeroValueThickness : Math.max(this.minWeight - 1, w) + 1, + thickness: xputs[i].value === 0 ? this.zeroValueThickness : Math.min(this.combinedWeight + 0.5, Math.max(this.minWeight - 1, w) + 1), offset: 0, innerY: 0, outerY: 0, @@ -278,7 +278,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { // bounds of the middle segment const innerTop = (this.height / 2) - (this.combinedWeight / 2); - const innerBottom = innerTop + this.combinedWeight; + const innerBottom = innerTop + this.combinedWeight + 0.5; // tracks the visual bottom of the endpoints of the previous line let lastOuter = 0; let lastInner = innerTop; @@ -303,7 +303,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { // set the vertical position of the (center of the) outer side of the line line.outerY = lastOuter + (line.thickness / 2); - line.innerY = Math.min(innerBottom + (line.thickness / 2), Math.max(innerTop + (line.thickness / 2), lastInner + (line.weight / 2))); + line.innerY = Math.min(innerBottom - (line.thickness / 2), Math.max(innerTop + (line.thickness / 2), lastInner + (line.weight / 2))); // special case to center single input/outputs if (xputs.length === 1) { From a2d673f9ede75de63026a322c4f9dc3b537b4a7c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 10 Mar 2023 00:27:22 -0600 Subject: [PATCH 024/782] batch address outspend lookups into <50 txids per request --- .../transactions-list.component.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.ts b/frontend/src/app/components/transactions-list/transactions-list.component.ts index afda646d7..f499300c1 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.ts +++ b/frontend/src/app/components/transactions-list/transactions-list.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, Input, ChangeDetectionStrategy, OnChanges, Output, EventEmitter, ChangeDetectorRef } from '@angular/core'; import { StateService } from '../../services/state.service'; import { CacheService } from '../../services/cache.service'; -import { Observable, ReplaySubject, BehaviorSubject, merge, Subscription, of } from 'rxjs'; +import { Observable, ReplaySubject, BehaviorSubject, merge, Subscription, of, forkJoin } from 'rxjs'; import { Outspend, Transaction, Vin, Vout } from '../../interfaces/electrs.interface'; import { ElectrsApiService } from '../../services/electrs-api.service'; import { environment } from '../../../environments/environment'; @@ -70,12 +70,19 @@ export class TransactionsListComponent implements OnInit, OnChanges { .pipe( switchMap((txIds) => { if (!this.cached) { - return this.apiService.getOutspendsBatched$(txIds); + // break list into batches of 50 (maximum supported by esplora) + const batches = []; + for (let i = 0; i < txIds.length; i += 50) { + batches.push(txIds.slice(i, i + 50)); + } + return forkJoin(batches.map(batch => this.apiService.getOutspendsBatched$(batch))); } else { return of([]); } }), - tap((outspends: Outspend[][]) => { + tap((batchedOutspends: Outspend[][][]) => { + // flatten batched results back into a single array + const outspends = batchedOutspends.flat(1); if (!this.transactions) { return; } From 4a0d9cb66f7a18d789e08c15ace3b414b95320ca Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 10 Mar 2023 18:35:26 +0900 Subject: [PATCH 025/782] Fixes arrow position on confirmed blocks fixes #3294 --- .../components/blockchain-blocks/blockchain-blocks.component.ts | 2 +- .../src/app/components/transaction/transaction.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 3feaf6c2d..e3547a569 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -107,7 +107,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.blocks.unshift(block); this.blocks = this.blocks.slice(0, this.dynamicBlocksAmount); - if (txConfirmed) { + if (txConfirmed && this.height === block.height) { this.markHeight = block.height; this.moveArrowToPosition(true, true); } else { diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 673743344..c28525159 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -347,7 +347,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.blocksSubscription = this.stateService.blocks$.subscribe(([block, txConfirmed]) => { this.latestBlock = block; - if (txConfirmed && this.tx) { + if (txConfirmed && this.tx && !this.tx.status.confirmed) { this.tx.status = { confirmed: true, block_height: block.height, From d3d67627f3090a36dff30a145befb3384fb803f3 Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 10 Mar 2023 20:19:37 +0900 Subject: [PATCH 026/782] Remove search bar focus border --- .../app/components/search-form/search-form.component.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/app/components/search-form/search-form.component.scss b/frontend/src/app/components/search-form/search-form.component.scss index d59acadb9..f3d2ee234 100644 --- a/frontend/src/app/components/search-form/search-form.component.scss +++ b/frontend/src/app/components/search-form/search-form.component.scss @@ -53,3 +53,8 @@ form { margin-top: 1px; margin-right: 2px; } + +input:focus { + box-shadow: none; + border-color: #1b1f2c; +} From 5bd9be7ab118bcaf8e71bc534c22f47e95f6cd25 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 10:14:35 +0900 Subject: [PATCH 027/782] Display same fee span on blocks fixes #3282 --- frontend/src/app/components/block/block.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 4c7e4684a..c34a3e523 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -121,7 +121,7 @@ Fee span - {{ block.extras.feeRange[0] | number:'1.0-0' }} - {{ block.extras.feeRange[block.extras.feeRange.length - 1] | number:'1.0-0' }} sat/vB + {{ block.extras.feeRange[1] | number:'1.0-0' }} - {{ block.extras.feeRange[block.extras.feeRange.length - 1] | number:'1.0-0' }} sat/vB Median fee From 4263977d99a6d16abb86c2a7c7a963f1cb0b4543 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 11 Mar 2023 10:52:15 +0900 Subject: [PATCH 028/782] Updated regtest example --- backend/README.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/backend/README.md b/backend/README.md index be85d25af..256dcaa43 100644 --- a/backend/README.md +++ b/backend/README.md @@ -171,52 +171,58 @@ Helpful link: https://gist.github.com/System-Glitch/cb4e87bf1ae3fec9925725bb3ebe Run bitcoind on regtest: ``` - bitcoind -regtest -rpcport=8332 + bitcoind -regtest ``` Create a new wallet, if needed: ``` - bitcoin-cli -regtest -rpcport=8332 createwallet test + bitcoin-cli -regtest createwallet test ``` Load wallet (this command may take a while if you have lot of UTXOs): ``` - bitcoin-cli -regtest -rpcport=8332 loadwallet test + bitcoin-cli -regtest loadwallet test ``` Get a new address: ``` - address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress) + address=$(bitcoin-cli -regtest getnewaddress) ``` Mine blocks to the previously generated address. You need at least 101 blocks before you can spend. This will take some time to execute (~1 min): ``` - bitcoin-cli -regtest -rpcport=8332 generatetoaddress 101 $address + bitcoin-cli -regtest generatetoaddress 101 $address ``` Send 0.1 BTC at 5 sat/vB to another address: ``` - ./src/bitcoin-cli -named -regtest -rpcport=8332 sendtoaddress address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress) amount=0.1 fee_rate=5 + bitcoin-cli -named -regtest sendtoaddress address=$(bitcoin-cli -regtest getnewaddress) amount=0.1 fee_rate=5 ``` See more example of `sendtoaddress`: ``` - ./src/bitcoin-cli sendtoaddress # will print the help + bitcoin-cli sendtoaddress # will print the help ``` -Mini script to generate transactions with random TX fee-rate (between 1 to 100 sat/vB). It's slow so don't expect to use this to test mempool spam, except if you let it run for a long time, or maybe with multiple regtest nodes connected to each other. +Mini script to generate random network activity (random TX count with random tx fee-rate). It's slow so don't expect to use this to test mempool spam, except if you let it run for a long time, or maybe with multiple regtest nodes connected to each other. ``` #!/bin/bash - address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress) + address=$(bitcoin-cli -regtest getnewaddress) + bitcoin-cli -regtest generatetoaddress 101 $address for i in {1..1000000} do - ./src/bitcoin-cli -regtest -rpcport=8332 -named sendtoaddress address=$address amount=0.01 fee_rate=$(jot -r 1 1 100) + for y in $(seq 1 "$(jot -r 1 1 1000)") + do + bitcoin-cli -regtest -named sendtoaddress address=$address amount=0.01 fee_rate=$(jot -r 1 1 100) + done + bitcoin-cli -regtest generatetoaddress 1 $address + sleep 5 done ``` Generate block at regular interval (every 10 seconds in this example): ``` - watch -n 10 "./src/bitcoin-cli -regtest -rpcport=8332 generatetoaddress 1 $address" + watch -n 10 "bitcoin-cli -regtest generatetoaddress 1 $address" ``` ### Mining pools update From 097eed0baaeb49c4e29bb375c59d8f15f4130926 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 17:26:33 +0900 Subject: [PATCH 029/782] Pull from transifex 2023-03-11 --- frontend/src/locale/messages.da.xlf | 378 ++++++++++++++------------- frontend/src/locale/messages.es.xlf | 381 +++++++++++++++------------- frontend/src/locale/messages.fi.xlf | 377 ++++++++++++++------------- frontend/src/locale/messages.fr.xlf | 378 ++++++++++++++------------- frontend/src/locale/messages.he.xlf | 377 ++++++++++++++------------- 5 files changed, 976 insertions(+), 915 deletions(-) diff --git a/frontend/src/locale/messages.da.xlf b/frontend/src/locale/messages.da.xlf index da4ef358d..29f667ed5 100644 --- a/frontend/src/locale/messages.da.xlf +++ b/frontend/src/locale/messages.da.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ Pool rangering src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ Pool dominans src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ Hashrate og sværhedsgrad src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ Lightningnoder pr. netværk src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ Lightning Netværkets kapacitet src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ Lightningnoder pr. internetudbyder src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ Lightningnoder pr. land src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ Verdenskort over Lightningnoder src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ Verdenskort over lightningnodernes kanaler src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4339,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4348,7 @@ Vend om src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4357,7 @@ Transaktion vBytes pr. sekund (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4365,188 @@ Just now Lige nu - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago siden - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + Om ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After Efter - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Om ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4688,7 +4680,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4699,7 @@ Vis mere src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4716,7 @@ Vis mindre src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4729,7 @@ Vis diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4738,7 @@ Låsetid src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4747,7 @@ Transaktionen blev ikke fundet. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4756,7 @@ Venter på, at den dukker op i mempoolen... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4765,7 @@ Effektiv gebyrsats src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5220,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5231,7 @@ REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5240,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5253,11 @@ Beskrivelse src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5265,7 @@ Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5554,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6083,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 diff --git a/frontend/src/locale/messages.es.xlf b/frontend/src/locale/messages.es.xlf index a4d01ac86..66437d4fb 100644 --- a/frontend/src/locale/messages.es.xlf +++ b/frontend/src/locale/messages.es.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ Minado src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ Ranking de pools src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ Dominancia de pools src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ Dificultad y Hashrate src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ Nodos Lightning Por Red src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ Capacidad De Red Lightning src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ Nodos Lightning Por ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ Nodos Lightning Por País src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ Mapa Mundial De Nodos Lightning src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ Mapa Mundial De Canales De Nodos Lightning src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ Tasa de hash (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4339,7 @@ Filtro src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4348,7 @@ Invertir src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4357,7 @@ vBytes de transacciones por segundo (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4365,188 @@ Just now Justo ahora - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago atrás - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + En ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After Después - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - En ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4688,7 +4680,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4699,7 @@ Mostrar más src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4716,7 @@ Mostras menos src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4729,7 @@ Mostrar diagrama src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4738,7 @@ Tiempo de bloque src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4747,7 @@ Transacción no encontrada src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4756,7 @@ Esperando a que aparezca en la mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4765,7 @@ Ratio de tasa efectiva src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5220,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5231,7 @@ servicio REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5240,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5253,11 @@ Descripción src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5265,7 @@ Empujar por defecto: acciona: 'want', data: ['blocks', ...] para expresar lo que quiere empujar. Disponible: blocks, mempool-blocks, live-2h-chart, y stats.Empujar transacciones relaccionadas a la direccion: 'track-address': '3PbJ...bF9B' para recibir todas las nuevas transacciones que contengan la direccion como input o output. Devuelve cualquier formación de transacciones. dirección-transacciones para nuevas transacciones mempool, y bloque-transacciones para nuevas transacciones confirmadas en bloque. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5554,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6083,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6559,6 +6571,7 @@ Clearnet and Darknet + Clearnet y Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6570,6 +6583,7 @@ Clearnet Only (IPv4, IPv6) + Solo Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6581,6 +6595,7 @@ Darknet Only (Tor, I2P, cjdns) + Solo Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 diff --git a/frontend/src/locale/messages.fi.xlf b/frontend/src/locale/messages.fi.xlf index a53a7bf5a..44217e369 100644 --- a/frontend/src/locale/messages.fi.xlf +++ b/frontend/src/locale/messages.fi.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ Louhinta src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ Poolien sijoitus src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ Poolien dominanssi src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ Laskentateho & Vaikeusaste src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ Salamaverkko src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ Salamasolmut per verkko src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ Salamaverkon kapasiteetti src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ Salamasolmut palveluntarjoajaa kohti src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ Salamasolmut maata kohti src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ Salamasolmujen maailmankartta src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ Salamasolmu kanavien maailmankartta src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ Laskentateho (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4339,7 @@ Suodatin src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4348,7 @@ Käänteinen src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4357,7 @@ Siirtotapahtuma vByte:ä sekunnissa (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4365,187 @@ Just now Juuri nyt - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago sitten - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After jälkeen - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4688,7 +4679,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4698,7 @@ Näytä enemmän src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4715,7 @@ Näytä vähemmän src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4728,7 @@ Näytä kaavio src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4737,7 @@ Lukitusaika src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4746,7 @@ Siirtotapahtumaa ei löydy. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4755,7 @@ Odotetaan sen ilmestymistä mempooliin... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4764,7 @@ Todellinen siirtomaksu taso src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5219,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5230,7 @@ REST API-palvelu src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5239,11 @@ Päätepiste src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5252,11 @@ Kuvaus src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5264,7 @@ Oletus työntö: action: 'want', data: ['blocks', ...] ilmaisemaan, mitä haluat työnnettävän. Käytettävissä: blocks, mempool-blocks, live-2h-chart ja stats.Työnnä osoitteeseen liittyvät tapahtumat: 'track-address': '3PbJ...bF9B' vastaanottaa kaikki uudet transaktiot, jotka sisältävät kyseisen osoitteen syötteenä tai tulosteena. Palauttaa transaktioiden joukon. address-transactions uusille mempool-transaktioille ja block-transactions uusille lohkon vahvistetuille transaktioille. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5553,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6082,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 diff --git a/frontend/src/locale/messages.fr.xlf b/frontend/src/locale/messages.fr.xlf index 704ba8412..208b71ce0 100644 --- a/frontend/src/locale/messages.fr.xlf +++ b/frontend/src/locale/messages.fr.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ Minage src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ Classement des pools src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ Dominance des pools src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ Taux de hachage & difficulté src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ Nœuds Lightning par réseau src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ Capacité du réseau Lightning src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ Nœuds Lightning par FAI src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ Nœuds Lightning par pays src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ Carte du monde des nœuds Lightning src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ Carte du monde des canaux Lightning src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ Taux de hachage (moy) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4115,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4339,7 @@ Filtrer src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4348,7 @@ Inverser src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4357,7 @@ Transaction vBytes par seconde (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4365,188 @@ Just now Juste maintenant - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago Il y a - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + Dans ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After Après - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Dans ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4688,7 +4680,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4699,7 @@ Montrer plus src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4716,7 @@ Montrer moins src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4729,7 @@ Afficher le diagramme src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4738,7 @@ Temps de verrouillage src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4747,7 @@ Transaction introuvable. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4756,7 @@ Veuillez patienter pendant que nous attendons qu'elle apparaisse dans le mempool src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4765,7 @@ Taux de frais effectif src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5220,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5231,7 @@ Service d'API REST src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5240,11 @@ Point de terminaison src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5253,11 @@ Description src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5265,7 @@ Pousser par défaut : action: 'want', data: ['blocks', ...] pour exprimer ce que vous voulez pousser. Disponible: blocks, mempool-blocks, live-2h-chart, et stats.Pousse les transactions liées à l'adresse : 'track-address': '3PbJ...bF9B' pour recevoir toutes les nouvelles transactions contenant cette adresse en entrée ou en sortie. Renvoie un tableau de transactions. address-transactions pour les nouvelles transactions mempool, et block-transactions pour les nouvelles transactions confirmées en bloc. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5554,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6083,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 diff --git a/frontend/src/locale/messages.he.xlf b/frontend/src/locale/messages.he.xlf index b58237560..3ab6c3305 100644 --- a/frontend/src/locale/messages.he.xlf +++ b/frontend/src/locale/messages.he.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2846,11 +2846,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2891,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3346,7 +3346,7 @@ כרייה src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3355,7 @@ דירוג בריכות src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3368,7 @@ שליטת בריכות src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3381,7 @@ קשי וכמות האשים src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3390,7 @@ ברק src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3399,7 @@ צמתי ברק לפי רשת src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3420,7 @@ קיבולת רשת הברק src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3441,7 @@ צמתי ברק לפי ספקי תשתית src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3454,7 @@ צמתי ברק לפי מדינה src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3471,7 @@ צמתי ברק במפת העולם src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3488,7 @@ ערוצי צמתי ברק במפת העולם src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3509,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3543,11 @@ כמות האשים (ממוצע נע) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4113,7 +4113,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4336,7 +4336,7 @@ סנן src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4345,7 +4345,7 @@ להפוך src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4354,7 +4354,7 @@ טרנזקציות vBytes לשניה (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4362,196 +4362,187 @@ Just now זה עתה - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 78 ago לפני - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 97 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 98 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 99 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 100 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 101 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 102 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 110 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 111 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 112 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 113 + + + + In ~ + + src/app/components/time/time.component.ts + 120 + + + src/app/components/time/time.component.ts + 121 + + + src/app/components/time/time.component.ts + 122 + + + src/app/components/time/time.component.ts + 123 + + + src/app/components/time/time.component.ts + 124 + + + src/app/components/time/time.component.ts + 125 + + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 133 + + + src/app/components/time/time.component.ts + 134 + + + src/app/components/time/time.component.ts + 135 + + + src/app/components/time/time.component.ts + 136 After לאחר - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 143 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 144 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 145 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 146 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 147 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 148 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 156 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 157 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 158 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - תוך ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 159 @@ -4685,7 +4676,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4704,7 +4695,7 @@ הצג עוד src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4721,7 +4712,7 @@ הצג פחות src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4734,7 +4725,7 @@ הצג דיאגמה src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4743,7 +4734,7 @@ זמן נעילה src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4752,7 +4743,7 @@ טרנזקציה לא נמצאה. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4761,7 +4752,7 @@ ממתין להופעתה בממפול.. src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4770,7 +4761,7 @@ שיעור עמלה אפקטיבי src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5224,13 +5215,17 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5239,11 +5234,11 @@ נקודת קצה src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5252,11 +5247,11 @@ תיאור src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5264,7 +5259,7 @@ ברירת מחדל דוחף: פעולה ׳רוצה׳, מידע: [׳בלוקים׳,...] לבטא את מה שרצית לדחוף. זמין בלוקים , בלוקי-ממפול , תצוגה חיה-שעתיים-טבלה , ו סטטיסטיקות . דוחף טרנזקציות הקשורות לכתובת: ׳עקוב-כתובת׳: ׳3PbJ...bF9B' לקבלה של כל הטרנזקציות החדשות המכילות את כתובת זו כקלט או פלט. מאחזר מערך של טרנזקציות. טרנזקציות-כתובת לטרנזקציות ממפול חדשות ו בלוקי-טרנזקציות לבלוקים מאושרים חדשים. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5545,6 +5540,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6061,6 +6064,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 From 39051e94e3b66850263682555e3d3d7b3302faa2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 7 Mar 2023 19:19:28 -0600 Subject: [PATCH 030/782] Redesign difficulty adjustment dashboard widget --- .../api/difficulty-adjustment.test.ts | 4 + backend/src/api/difficulty-adjustment.ts | 8 +- .../difficulty-mining.component.html | 87 ++++++++++ .../difficulty-mining.component.scss | 154 ++++++++++++++++++ .../difficulty-mining.component.ts | 86 ++++++++++ .../difficulty-tooltip.component.html | 41 +++++ .../difficulty-tooltip.component.scss | 18 ++ .../difficulty-tooltip.component.ts | 66 ++++++++ .../difficulty/difficulty.component.html | 122 ++++++++------ .../difficulty/difficulty.component.scss | 68 +++++++- .../difficulty/difficulty.component.ts | 127 ++++++++++++++- .../mining-dashboard.component.html | 2 +- .../src/app/components/time/time.component.ts | 8 +- .../src/app/interfaces/node-api.interface.ts | 2 + frontend/src/app/shared/shared.module.ts | 6 + 15 files changed, 735 insertions(+), 64 deletions(-) create mode 100644 frontend/src/app/components/difficulty-mining/difficulty-mining.component.html create mode 100644 frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss create mode 100644 frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts create mode 100644 frontend/src/app/components/difficulty/difficulty-tooltip.component.html create mode 100644 frontend/src/app/components/difficulty/difficulty-tooltip.component.scss create mode 100644 frontend/src/app/components/difficulty/difficulty-tooltip.component.ts diff --git a/backend/src/__tests__/api/difficulty-adjustment.test.ts b/backend/src/__tests__/api/difficulty-adjustment.test.ts index eb774d445..5ef1936e0 100644 --- a/backend/src/__tests__/api/difficulty-adjustment.test.ts +++ b/backend/src/__tests__/api/difficulty-adjustment.test.ts @@ -23,9 +23,11 @@ describe('Mempool Difficulty Adjustment', () => { remainingBlocks: 1834, remainingTime: 977591692, previousRetarget: 0.6280047707459726, + previousTime: 1660820820, nextRetargetHeight: 751968, timeAvg: 533038, timeOffset: 0, + expectedBlocks: 161.68833333333333, }, ], [ // Vector 2 (testnet) @@ -43,11 +45,13 @@ describe('Mempool Difficulty Adjustment', () => { estimatedRetargetDate: 1661895424692, remainingBlocks: 1834, remainingTime: 977591692, + previousTime: 1660820820, previousRetarget: 0.6280047707459726, nextRetargetHeight: 751968, timeAvg: 533038, timeOffset: -667000, // 11 min 7 seconds since last block (testnet only) // If we add time avg to abs(timeOffset) it makes exactly 1200000 ms, or 20 minutes + expectedBlocks: 161.68833333333333, }, ], ] as [[number, number, number, number, string, number], DifficultyAdjustment][]; diff --git a/backend/src/api/difficulty-adjustment.ts b/backend/src/api/difficulty-adjustment.ts index a1b6ab70e..c4e2abf31 100644 --- a/backend/src/api/difficulty-adjustment.ts +++ b/backend/src/api/difficulty-adjustment.ts @@ -9,9 +9,11 @@ export interface DifficultyAdjustment { remainingBlocks: number; // Block count remainingTime: number; // Duration of time in ms previousRetarget: number; // Percent: -75 to 300 + previousTime: number; // Unix time in ms nextRetargetHeight: number; // Block Height timeAvg: number; // Duration of time in ms timeOffset: number; // (Testnet) Time since last block (cap @ 20min) in ms + expectedBlocks: number; // Block count } export function calcDifficultyAdjustment( @@ -32,12 +34,12 @@ export function calcDifficultyAdjustment( const progressPercent = (blockHeight >= 0) ? blocksInEpoch / EPOCH_BLOCK_LENGTH * 100 : 100; const remainingBlocks = EPOCH_BLOCK_LENGTH - blocksInEpoch; const nextRetargetHeight = (blockHeight >= 0) ? blockHeight + remainingBlocks : 0; + const expectedBlocks = diffSeconds / BLOCK_SECONDS_TARGET; let difficultyChange = 0; - let timeAvgSecs = BLOCK_SECONDS_TARGET; + let timeAvgSecs = diffSeconds / blocksInEpoch; // Only calculate the estimate once we have 7.2% of blocks in current epoch if (blocksInEpoch >= ESTIMATE_LAG_BLOCKS) { - timeAvgSecs = diffSeconds / blocksInEpoch; difficultyChange = (BLOCK_SECONDS_TARGET / timeAvgSecs - 1) * 100; // Max increase is x4 (+300%) if (difficultyChange > 300) { @@ -74,9 +76,11 @@ export function calcDifficultyAdjustment( remainingBlocks, remainingTime, previousRetarget, + previousTime: DATime, nextRetargetHeight, timeAvg, timeOffset, + expectedBlocks, }; } diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html new file mode 100644 index 000000000..ce0bf7eff --- /dev/null +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html @@ -0,0 +1,87 @@ +
Difficulty Adjustment
+
+
+
+
+
+
Remaining
+
+ + {{ i }} blocks + {{ i }} block +
+
+
+
+
Estimate
+
+ + + + + + + {{ epochData.change | absolute | number: '1.2-2' }} + % +
+ +
+
+
+ Previous: + + + + + + + + {{ epochData.previousRetarget | absolute | number: '1.2-2' }} % +
+
+
+
Current Period
+
{{ epochData.progress | number: '1.2-2' }} %
+
+
 
+
+
+
+
Next Halving
+
+ + {{ i }} blocks + {{ i }} block +
+
+
+
+
+
+
+ + +
+
+
Remaining
+
+
+
+
+
+
+
Estimate
+
+
+
+
+
+
+
Current Period
+
+
+
+
+
+
+
diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss new file mode 100644 index 000000000..c5cd2dc5e --- /dev/null +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss @@ -0,0 +1,154 @@ +.difficulty-adjustment-container { + display: flex; + flex-direction: row; + justify-content: space-around; + height: 76px; + .shared-block { + color: #ffffff66; + font-size: 12px; + } + .item { + padding: 0 5px; + width: 100%; + &:nth-child(1) { + display: none; + @media (min-width: 485px) { + display: table-cell; + } + @media (min-width: 768px) { + display: none; + } + @media (min-width: 992px) { + display: table-cell; + } + } + } + .card-text { + font-size: 22px; + margin-top: -9px; + position: relative; + } +} + + +.difficulty-skeleton { + display: flex; + justify-content: space-between; + @media (min-width: 376px) { + flex-direction: row; + } + .item { + max-width: 150px; + margin: 0; + width: -webkit-fill-available; + @media (min-width: 376px) { + margin: 0 auto 0px; + } + &:first-child{ + display: none; + @media (min-width: 485px) { + display: block; + } + @media (min-width: 768px) { + display: none; + } + @media (min-width: 992px) { + display: block; + } + } + &:last-child { + margin-bottom: 0; + } + } + .card-text { + .skeleton-loader { + width: 100%; + display: block; + &:first-child { + margin: 14px auto 0; + max-width: 80px; + } + &:last-child { + margin: 10px auto 0; + max-width: 120px; + } + } + } +} + +.card { + background-color: #1d1f31; + height: 100%; +} + +.card-title { + color: #4a68b9; + font-size: 1rem; +} + +.progress { + display: inline-flex; + width: 100%; + background-color: #2d3348; + height: 1.1rem; + max-width: 180px; +} + +.skeleton-loader { + max-width: 100%; +} + +.more-padding { + padding: 18px; +} + +.small-bar { + height: 8px; + top: -4px; + max-width: 120px; +} + +.loading-container { + min-height: 76px; +} + +.main-title { + position: relative; + color: #ffffff91; + margin-top: -13px; + font-size: 10px; + text-transform: uppercase; + font-weight: 500; + text-align: center; + padding-bottom: 3px; +} + +.card-wrapper { + .card { + height: auto !important; + } + .card-body { + display: flex; + flex: inherit; + text-align: center; + flex-direction: column; + justify-content: space-around; + padding: 24px 20px; + } +} + +.retarget-sign { + margin-right: -3px; + font-size: 14px; + top: -2px; + position: relative; +} + +.previous-retarget-sign { + margin-right: -2px; + font-size: 10px; +} + +.symbol { + font-size: 13px; +} \ No newline at end of file diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts new file mode 100644 index 000000000..2abb02e22 --- /dev/null +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts @@ -0,0 +1,86 @@ +import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { combineLatest, Observable, timer } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; +import { StateService } from '../../services/state.service'; + +interface EpochProgress { + base: string; + change: number; + progress: number; + remainingBlocks: number; + newDifficultyHeight: number; + colorAdjustments: string; + colorPreviousAdjustments: string; + estimatedRetargetDate: number; + previousRetarget: number; + blocksUntilHalving: number; + timeUntilHalving: number; +} + +@Component({ + selector: 'app-difficulty-mining', + templateUrl: './difficulty-mining.component.html', + styleUrls: ['./difficulty-mining.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DifficultyMiningComponent implements OnInit { + isLoadingWebSocket$: Observable; + difficultyEpoch$: Observable; + + @Input() showProgress = true; + @Input() showHalving = false; + @Input() showTitle = true; + + constructor( + public stateService: StateService, + ) { } + + ngOnInit(): void { + this.isLoadingWebSocket$ = this.stateService.isLoadingWebSocket$; + this.difficultyEpoch$ = combineLatest([ + this.stateService.blocks$.pipe(map(([block]) => block)), + this.stateService.difficultyAdjustment$, + ]) + .pipe( + map(([block, da]) => { + let colorAdjustments = '#ffffff66'; + if (da.difficultyChange > 0) { + colorAdjustments = '#3bcc49'; + } + if (da.difficultyChange < 0) { + colorAdjustments = '#dc3545'; + } + + let colorPreviousAdjustments = '#dc3545'; + if (da.previousRetarget) { + if (da.previousRetarget >= 0) { + colorPreviousAdjustments = '#3bcc49'; + } + if (da.previousRetarget === 0) { + colorPreviousAdjustments = '#ffffff66'; + } + } else { + colorPreviousAdjustments = '#ffffff66'; + } + + const blocksUntilHalving = 210000 - (block.height % 210000); + const timeUntilHalving = new Date().getTime() + (blocksUntilHalving * 600000); + + const data = { + base: `${da.progressPercent.toFixed(2)}%`, + change: da.difficultyChange, + progress: da.progressPercent, + remainingBlocks: da.remainingBlocks - 1, + colorAdjustments, + colorPreviousAdjustments, + newDifficultyHeight: da.nextRetargetHeight, + estimatedRetargetDate: da.estimatedRetargetDate, + previousRetarget: da.previousRetarget, + blocksUntilHalving, + timeUntilHalving, + }; + return data; + }) + ); + } +} diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.html b/frontend/src/app/components/difficulty/difficulty-tooltip.component.html new file mode 100644 index 000000000..57a96cca7 --- /dev/null +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.html @@ -0,0 +1,41 @@ +
+ + + + + {{ i }} blocks expected + {{ i }} block expected + + + + {{ i }} blocks mined + {{ i }} block mined + + + + + {{ i }} blocks remaining + {{ i }} block remaining + + + + {{ i }} blocks ahead + {{ i }} block ahead + + + + {{ i }} blocks behind + {{ i }} block behind + + + next block + + +
\ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss new file mode 100644 index 000000000..82b762acd --- /dev/null +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss @@ -0,0 +1,18 @@ +.difficulty-tooltip { + position: fixed; + background: rgba(#11131f, 0.95); + border-radius: 4px; + box-shadow: 1px 1px 10px rgba(0,0,0,0.5); + color: #b1b1b1; + padding: 10px 15px; + text-align: left; + pointer-events: none; + max-width: 300px; + min-width: 200px; + text-align: center; + + p { + margin: 0; + white-space: nowrap; + } +} \ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.ts b/frontend/src/app/components/difficulty/difficulty-tooltip.component.ts new file mode 100644 index 000000000..c7d26f61a --- /dev/null +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.ts @@ -0,0 +1,66 @@ +import { Component, ElementRef, ViewChild, Input, OnChanges } from '@angular/core'; + +interface EpochProgress { + base: string; + change: number; + progress: number; + minedBlocks: number; + remainingBlocks: number; + expectedBlocks: number; + newDifficultyHeight: number; + colorAdjustments: string; + colorPreviousAdjustments: string; + estimatedRetargetDate: number; + previousRetarget: number; + blocksUntilHalving: number; + timeUntilHalving: number; +} + +const EPOCH_BLOCK_LENGTH = 2016; // Bitcoin mainnet + +@Component({ + selector: 'app-difficulty-tooltip', + templateUrl: './difficulty-tooltip.component.html', + styleUrls: ['./difficulty-tooltip.component.scss'], +}) +export class DifficultyTooltipComponent implements OnChanges { + @Input() status: string | void; + @Input() progress: EpochProgress | void = null; + @Input() cursorPosition: { x: number, y: number }; + + mined: number; + ahead: number; + behind: number; + expected: number; + remaining: number; + isAhead: boolean; + isBehind: boolean; + + tooltipPosition = { x: 0, y: 0 }; + + @ViewChild('tooltip') tooltipElement: ElementRef; + + constructor() {} + + ngOnChanges(changes): void { + if (changes.cursorPosition && changes.cursorPosition.currentValue) { + let x = changes.cursorPosition.currentValue.x; + let y = changes.cursorPosition.currentValue.y - 50; + if (this.tooltipElement) { + const elementBounds = this.tooltipElement.nativeElement.getBoundingClientRect(); + x -= elementBounds.width / 2; + x = Math.min(Math.max(x, 20), (window.innerWidth - 20 - elementBounds.width)); + } + this.tooltipPosition = { x, y }; + } + if ((changes.progress || changes.status) && this.progress && this.status) { + this.remaining = this.progress.remainingBlocks; + this.expected = this.progress.expectedBlocks; + this.mined = this.progress.minedBlocks; + this.ahead = Math.max(0, this.mined - this.expected); + this.behind = Math.max(0, this.expected - this.mined); + this.isAhead = this.ahead > 0; + this.isBehind = this.behind > 0; + } + } +} diff --git a/frontend/src/app/components/difficulty/difficulty.component.html b/frontend/src/app/components/difficulty/difficulty.component.html index ce0bf7eff..5b2f23cf3 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.html +++ b/frontend/src/app/components/difficulty/difficulty.component.html @@ -3,81 +3,100 @@
-
-
Remaining
-
- - {{ i }} blocks - {{ i }} block -
-
+
+ + + + + + + + + + + + + + +
-
-
Estimate
-
- - - - - - - {{ epochData.change | absolute | number: '1.2-2' }} - % +
+
+
+ ~ +
+
Average interval
- -
-
-
- Previous: - - - +
+
+ + - - + + - {{ epochData.previousRetarget | absolute | number: '1.2-2' }} % + {{ epochData.change | absolute | number: '1.2-2' }} + % +
+ +
+
+
+ Previous: + + + + + + + + {{ epochData.previousRetarget | absolute | number: '1.2-2' }} % +
-
-
-
Current Period
-
{{ epochData.progress | number: '1.2-2' }} %
-
-
 
+
+
+
+ {{ epochData.retargetDateString }} +
-
-
Next Halving
-
- - {{ i }} blocks - {{ i }} block -
-
-
+
+
+
-
Remaining
-
Estimate
-
Current Period
@@ -85,3 +104,10 @@
+ + \ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty.component.scss b/frontend/src/app/components/difficulty/difficulty.component.scss index c5cd2dc5e..9828ba8f5 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.scss +++ b/frontend/src/app/components/difficulty/difficulty.component.scss @@ -1,8 +1,14 @@ .difficulty-adjustment-container { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.difficulty-stats { display: flex; flex-direction: row; justify-content: space-around; - height: 76px; + height: 50.5px; .shared-block { color: #ffffff66; font-size: 12px; @@ -24,8 +30,8 @@ } } .card-text { - font-size: 22px; - margin-top: -9px; + font-size: 20px; + margin: auto; position: relative; } } @@ -33,7 +39,9 @@ .difficulty-skeleton { display: flex; - justify-content: space-between; + flex-direction: row; + justify-content: space-around; + height: 50.5px; @media (min-width: 376px) { flex-direction: row; } @@ -65,7 +73,7 @@ width: 100%; display: block; &:first-child { - margin: 14px auto 0; + margin: 10px auto 4px; max-width: 80px; } &:last-child { @@ -109,7 +117,7 @@ } .loading-container { - min-height: 76px; + min-height: 50.5px; } .main-title { @@ -133,7 +141,7 @@ text-align: center; flex-direction: column; justify-content: space-around; - padding: 24px 20px; + padding: 20px; } } @@ -151,4 +159,50 @@ .symbol { font-size: 13px; +} + +.epoch-progress { + width: 100%; + height: 22px; + margin-bottom: 12px; +} + +.epoch-blocks { + display: block; + width: 100%; + background: #2d3348; + + .rect { + fill: #2d3348; + + &.behind { + fill: #D81B60; + } + &.mined { + fill: url(#diff-gradient); + } + &.ahead { + fill: #1a9436; + } + + &.hover { + fill: #535e84; + &.behind { + fill: #e94d86; + } + &.mined { + fill: url(#diff-hover-gradient); + } + &.ahead { + fill: #29d951; + } + } + } +} + +.blocks-ahead { + color: #3bcc49; +} +.blocks-behind { + color: #D81B60; } \ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty.component.ts b/frontend/src/app/components/difficulty/difficulty.component.ts index 76a996acc..910ea1384 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.ts +++ b/frontend/src/app/components/difficulty/difficulty.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; import { combineLatest, Observable, timer } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { StateService } from '../..//services/state.service'; @@ -7,16 +7,33 @@ interface EpochProgress { base: string; change: number; progress: number; + minedBlocks: number; remainingBlocks: number; + expectedBlocks: number; newDifficultyHeight: number; colorAdjustments: string; colorPreviousAdjustments: string; estimatedRetargetDate: number; + retargetDateString: string; previousRetarget: number; blocksUntilHalving: number; timeUntilHalving: number; + timeAvg: number; } +type BlockStatus = 'mined' | 'behind' | 'ahead' | 'next' | 'remaining'; + +interface DiffShape { + x: number; + y: number; + w: number; + h: number; + status: BlockStatus; + expected: boolean; +} + +const EPOCH_BLOCK_LENGTH = 2016; // Bitcoin mainnet + @Component({ selector: 'app-difficulty', templateUrl: './difficulty.component.html', @@ -24,15 +41,27 @@ interface EpochProgress { changeDetection: ChangeDetectionStrategy.OnPush, }) export class DifficultyComponent implements OnInit { - isLoadingWebSocket$: Observable; - difficultyEpoch$: Observable; - @Input() showProgress = true; @Input() showHalving = false; @Input() showTitle = true; + + isLoadingWebSocket$: Observable; + difficultyEpoch$: Observable; + + epochStart: number; + currentHeight: number; + currentIndex: number; + expectedHeight: number; + expectedIndex: number; + difference: number; + shapes: DiffShape[]; + + tooltipPosition = { x: 0, y: 0 }; + hoverSection: DiffShape | void; constructor( public stateService: StateService, + @Inject(LOCALE_ID) private locale: string, ) { } ngOnInit(): void { @@ -65,22 +94,110 @@ export class DifficultyComponent implements OnInit { const blocksUntilHalving = 210000 - (block.height % 210000); const timeUntilHalving = new Date().getTime() + (blocksUntilHalving * 600000); + const newEpochStart = Math.floor(this.stateService.latestBlockHeight / EPOCH_BLOCK_LENGTH) * EPOCH_BLOCK_LENGTH; + const newExpectedHeight = Math.floor(newEpochStart + da.expectedBlocks); + + if (newEpochStart !== this.epochStart || newExpectedHeight !== this.expectedHeight || this.currentHeight !== this.stateService.latestBlockHeight) { + this.epochStart = newEpochStart; + this.expectedHeight = newExpectedHeight; + this.currentHeight = this.stateService.latestBlockHeight; + this.currentIndex = this.currentHeight - this.epochStart; + this.expectedIndex = Math.min(this.expectedHeight - this.epochStart, 2106) - 1; + this.difference = this.currentIndex - this.expectedIndex; + + this.shapes = []; + this.shapes = this.shapes.concat(this.blocksToShapes( + 0, Math.min(this.currentIndex, this.expectedIndex), 'mined', true + )); + this.shapes = this.shapes.concat(this.blocksToShapes( + this.currentIndex + 1, this.expectedIndex, 'behind', true + )); + this.shapes = this.shapes.concat(this.blocksToShapes( + this.expectedIndex + 1, this.currentIndex, 'ahead', false + )); + if (this.currentIndex < 2105) { + this.shapes = this.shapes.concat(this.blocksToShapes( + this.currentIndex + 1, this.currentIndex + 1, 'next', (this.expectedIndex > this.currentIndex) + )); + } + this.shapes = this.shapes.concat(this.blocksToShapes( + Math.max(this.currentIndex + 2, this.expectedIndex + 1), 2105, 'remaining', false + )); + } + + + let retargetDateString; + if (da.remainingBlocks > 1870) { + retargetDateString = (new Date(da.estimatedRetargetDate)).toLocaleDateString(this.locale, { month: 'long', day: 'numeric' }); + } else { + retargetDateString = (new Date(da.estimatedRetargetDate)).toLocaleTimeString(this.locale, { month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' }); + } const data = { base: `${da.progressPercent.toFixed(2)}%`, change: da.difficultyChange, progress: da.progressPercent, - remainingBlocks: da.remainingBlocks, + minedBlocks: this.currentIndex + 1, + remainingBlocks: da.remainingBlocks - 1, + expectedBlocks: Math.floor(da.expectedBlocks), colorAdjustments, colorPreviousAdjustments, newDifficultyHeight: da.nextRetargetHeight, estimatedRetargetDate: da.estimatedRetargetDate, + retargetDateString, previousRetarget: da.previousRetarget, blocksUntilHalving, timeUntilHalving, + timeAvg: da.timeAvg, }; return data; }) ); } + + blocksToShapes(start: number, end: number, status: BlockStatus, expected: boolean = false): DiffShape[] { + const startY = start % 9; + const startX = Math.floor(start / 9); + const endY = (end % 9); + const endX = Math.floor(end / 9); + + if (startX > endX) { + return []; + } + + if (startX === endX) { + return [{ + x: startX, y: startY, w: 1, h: 1 + endY - startY, status, expected + }]; + } + + const shapes = []; + shapes.push({ + x: startX, y: startY, w: 1, h: 9 - startY, status, expected + }); + shapes.push({ + x: endX, y: 0, w: 1, h: endY + 1, status, expected + }); + + if (startX < endX - 1) { + shapes.push({ + x: startX + 1, y: 0, w: endX - startX - 1, h: 9, status, expected + }); + } + + return shapes; + } + + @HostListener('pointermove', ['$event']) + onPointerMove(event) { + this.tooltipPosition = { x: event.clientX, y: event.clientY }; + } + + onHover(event, rect): void { + this.hoverSection = rect; + } + + onBlur(event): void { + this.hoverSection = null; + } } diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html index 1a932567c..a51f90f6c 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html @@ -22,7 +22,7 @@
Difficulty Adjustment
- +
diff --git a/frontend/src/app/components/time/time.component.ts b/frontend/src/app/components/time/time.component.ts index 4cc76975e..061061cc9 100644 --- a/frontend/src/app/components/time/time.component.ts +++ b/frontend/src/app/components/time/time.component.ts @@ -19,6 +19,7 @@ export class TimeComponent implements OnInit, OnChanges, OnDestroy { @Input() fixedRender = false; @Input() relative = false; @Input() forceFloorOnTimeIntervals: string[]; + @Input() fractionDigits: number = 0; constructor( private ref: ChangeDetectorRef, @@ -88,7 +89,12 @@ export class TimeComponent implements OnInit, OnChanges, OnDestroy { } else { counter = Math.round(seconds / this.intervals[i]); } - const dateStrings = dates(counter); + let rounded = counter; + if (this.fractionDigits) { + const roundFactor = Math.pow(10,this.fractionDigits); + rounded = Math.round((seconds / this.intervals[i]) * roundFactor) / roundFactor; + } + const dateStrings = dates(rounded); if (counter > 0) { switch (this.kind) { case 'since': diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 7ed32a9de..cad623f9f 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -33,9 +33,11 @@ export interface DifficultyAdjustment { remainingBlocks: number; remainingTime: number; previousRetarget: number; + previousTime: number; nextRetargetHeight: number; timeAvg: number; timeOffset: number; + expectedBlocks: number; } export interface AddressInformation { diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 52b469836..188942c02 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -58,6 +58,8 @@ import { AssetsNavComponent } from '../components/assets/assets-nav/assets-nav.c import { StatusViewComponent } from '../components/status-view/status-view.component'; import { FeesBoxComponent } from '../components/fees-box/fees-box.component'; import { DifficultyComponent } from '../components/difficulty/difficulty.component'; +import { DifficultyTooltipComponent } from '../components/difficulty/difficulty-tooltip.component'; +import { DifficultyMiningComponent } from '../components/difficulty-mining/difficulty-mining.component'; import { TermsOfServiceComponent } from '../components/terms-of-service/terms-of-service.component'; import { TxBowtieGraphComponent } from '../components/tx-bowtie-graph/tx-bowtie-graph.component'; import { TxBowtieGraphTooltipComponent } from '../components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component'; @@ -133,6 +135,8 @@ import { GeolocationComponent } from '../shared/components/geolocation/geolocati StatusViewComponent, FeesBoxComponent, DifficultyComponent, + DifficultyMiningComponent, + DifficultyTooltipComponent, TxBowtieGraphComponent, TxBowtieGraphTooltipComponent, TermsOfServiceComponent, @@ -234,6 +238,8 @@ import { GeolocationComponent } from '../shared/components/geolocation/geolocati StatusViewComponent, FeesBoxComponent, DifficultyComponent, + DifficultyMiningComponent, + DifficultyTooltipComponent, TxBowtieGraphComponent, TxBowtieGraphTooltipComponent, TermsOfServiceComponent, From ef0cc9d2db0e2b2253dc040890ad7c4a52c8c42f Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 18:04:06 +0900 Subject: [PATCH 031/782] Changing interval to block time --- .../difficulty/difficulty.component.html | 2 +- frontend/src/locale/messages.xlf | 342 +++++++++++------- 2 files changed, 222 insertions(+), 122 deletions(-) diff --git a/frontend/src/app/components/difficulty/difficulty.component.html b/frontend/src/app/components/difficulty/difficulty.component.html index 5b2f23cf3..d23edcfe3 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.html +++ b/frontend/src/app/components/difficulty/difficulty.component.html @@ -39,7 +39,7 @@
~
-
Average interval
+
Average block time
diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index 48c7da18d..e040e7bc9 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -2452,6 +2452,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2870,6 +2874,10 @@ Difficulty Adjustment + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -2883,11 +2891,11 @@ Remaining - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -2896,11 +2904,11 @@ blocks - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -2921,11 +2929,11 @@ block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -2937,11 +2945,11 @@ Estimate - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -2949,19 +2957,23 @@ Previous - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -2969,11 +2981,99 @@ Next Halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) @@ -4054,39 +4154,27 @@ Just now src/app/components/time/time.component.ts - 78 + 79 ago - - src/app/components/time/time.component.ts - 97 - - - src/app/components/time/time.component.ts - 98 - - - src/app/components/time/time.component.ts - 99 - - - src/app/components/time/time.component.ts - 100 - - - src/app/components/time/time.component.ts - 101 - - - src/app/components/time/time.component.ts - 102 - src/app/components/time/time.component.ts 103 + + src/app/components/time/time.component.ts + 104 + + + src/app/components/time/time.component.ts + 105 + + + src/app/components/time/time.component.ts + 106 + src/app/components/time/time.component.ts 107 @@ -4099,53 +4187,53 @@ src/app/components/time/time.component.ts 109 - - src/app/components/time/time.component.ts - 110 - - - src/app/components/time/time.component.ts - 111 - - - src/app/components/time/time.component.ts - 112 - src/app/components/time/time.component.ts 113 + + src/app/components/time/time.component.ts + 114 + + + src/app/components/time/time.component.ts + 115 + + + src/app/components/time/time.component.ts + 116 + + + src/app/components/time/time.component.ts + 117 + + + src/app/components/time/time.component.ts + 118 + + + src/app/components/time/time.component.ts + 119 + In ~ - - src/app/components/time/time.component.ts - 120 - - - src/app/components/time/time.component.ts - 121 - - - src/app/components/time/time.component.ts - 122 - - - src/app/components/time/time.component.ts - 123 - - - src/app/components/time/time.component.ts - 124 - - - src/app/components/time/time.component.ts - 125 - src/app/components/time/time.component.ts 126 + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + src/app/components/time/time.component.ts 130 @@ -4158,53 +4246,53 @@ src/app/components/time/time.component.ts 132 - - src/app/components/time/time.component.ts - 133 - - - src/app/components/time/time.component.ts - 134 - - - src/app/components/time/time.component.ts - 135 - src/app/components/time/time.component.ts 136 + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 + After - - src/app/components/time/time.component.ts - 143 - - - src/app/components/time/time.component.ts - 144 - - - src/app/components/time/time.component.ts - 145 - - - src/app/components/time/time.component.ts - 146 - - - src/app/components/time/time.component.ts - 147 - - - src/app/components/time/time.component.ts - 148 - src/app/components/time/time.component.ts 149 + + src/app/components/time/time.component.ts + 150 + + + src/app/components/time/time.component.ts + 151 + + + src/app/components/time/time.component.ts + 152 + src/app/components/time/time.component.ts 153 @@ -4217,22 +4305,34 @@ src/app/components/time/time.component.ts 155 - - src/app/components/time/time.component.ts - 156 - - - src/app/components/time/time.component.ts - 157 - - - src/app/components/time/time.component.ts - 158 - src/app/components/time/time.component.ts 159 + + src/app/components/time/time.component.ts + 160 + + + src/app/components/time/time.component.ts + 161 + + + src/app/components/time/time.component.ts + 162 + + + src/app/components/time/time.component.ts + 163 + + + src/app/components/time/time.component.ts + 164 + + + src/app/components/time/time.component.ts + 165 + This transaction has been replaced by: From 23ea5d582b4fe200eaf115fa65eb1e2d6947568e Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 18:32:47 +0900 Subject: [PATCH 032/782] Fixes i18n duplicate warning --- .../components/difficulty/difficulty-tooltip.component.html | 2 +- .../components/difficulty/difficulty-tooltip.component.scss | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.html b/frontend/src/app/components/difficulty/difficulty-tooltip.component.html index 57a96cca7..d06bb5e91 100644 --- a/frontend/src/app/components/difficulty/difficulty-tooltip.component.html +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.html @@ -35,7 +35,7 @@ {{ i }} block behind - next block + Next Block
\ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss index 82b762acd..8b7a5eb73 100644 --- a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss @@ -15,4 +15,8 @@ margin: 0; white-space: nowrap; } -} \ No newline at end of file +} + +.next-block { + text-transform: capitalize; +} From 6b4650f3cd24deab416dcb3113f70cbf51286601 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 18:34:51 +0900 Subject: [PATCH 033/782] next block lower case css fix --- .../app/components/difficulty/difficulty-tooltip.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss index 8b7a5eb73..5b4a8a02f 100644 --- a/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss +++ b/frontend/src/app/components/difficulty/difficulty-tooltip.component.scss @@ -18,5 +18,5 @@ } .next-block { - text-transform: capitalize; + text-transform: lowercase; } From c72024b4e38dc3035797dbf3d95365470e38fe70 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 11 Mar 2023 19:31:49 +0900 Subject: [PATCH 034/782] Lightning dashboard overflow titles fixes fixes #3127 --- .../channels-statistics.component.scss | 5 ++++- .../nodes-per-isp-chart.component.html | 12 ++++++------ .../nodes-per-isp-chart.component.scss | 5 ++++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss b/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss index e97f0d0af..30f88f136 100644 --- a/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss +++ b/frontend/src/app/lightning/channels-statistics/channels-statistics.component.scss @@ -2,7 +2,10 @@ color: #4a68b9; font-size: 10px; margin-bottom: 4px; - font-size: 1rem; + font-size: 1rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .card-text { diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html index c73e936c0..a168c032a 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -3,21 +3,21 @@
-
Clearnet Capacity
+
Clearnet Capacity

-
Unknown Capacity
+
Unknown Capacity

-
Tor Capacity
+
Tor Capacity

@@ -80,19 +80,19 @@

-
Clearnet Capacity
+
Clearnet Capacity

-
Unknown Capacity
+
Unknown Capacity

-
Tor Capacity
+
Tor Capacity

diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss index e36747e08..08fb359a6 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss @@ -68,10 +68,13 @@ margin-bottom: 5px; } .item { - max-width: 160px; + max-width: 150px; width: 50%; display: inline-block; margin: 0px auto 20px; + @media (min-width: 485px) { + max-width: 160px; + } &:nth-child(2) { order: 2; @media (min-width: 485px) { From e0e97f0d5e75fc04d007a4ef79b9465b91e3f3f3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 11 Mar 2023 19:32:59 +0900 Subject: [PATCH 035/782] Fix epoch length in difficulty widget --- .../src/app/components/difficulty/difficulty.component.html | 2 +- .../src/app/components/difficulty/difficulty.component.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/difficulty/difficulty.component.html b/frontend/src/app/components/difficulty/difficulty.component.html index 5b2f23cf3..e4a0993a8 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.html +++ b/frontend/src/app/components/difficulty/difficulty.component.html @@ -4,7 +4,7 @@
- + diff --git a/frontend/src/app/components/difficulty/difficulty.component.ts b/frontend/src/app/components/difficulty/difficulty.component.ts index 910ea1384..b246a14fe 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.ts +++ b/frontend/src/app/components/difficulty/difficulty.component.ts @@ -102,7 +102,7 @@ export class DifficultyComponent implements OnInit { this.expectedHeight = newExpectedHeight; this.currentHeight = this.stateService.latestBlockHeight; this.currentIndex = this.currentHeight - this.epochStart; - this.expectedIndex = Math.min(this.expectedHeight - this.epochStart, 2106) - 1; + this.expectedIndex = Math.min(this.expectedHeight - this.epochStart, 2016) - 1; this.difference = this.currentIndex - this.expectedIndex; this.shapes = []; @@ -115,7 +115,7 @@ export class DifficultyComponent implements OnInit { this.shapes = this.shapes.concat(this.blocksToShapes( this.expectedIndex + 1, this.currentIndex, 'ahead', false )); - if (this.currentIndex < 2105) { + if (this.currentIndex < 2015) { this.shapes = this.shapes.concat(this.blocksToShapes( this.currentIndex + 1, this.currentIndex + 1, 'next', (this.expectedIndex > this.currentIndex) )); From 31cfbf6625ba773b548f522e54700a20c668aa5a Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sun, 12 Mar 2023 10:16:49 +0900 Subject: [PATCH 036/782] Fix some responsive issue on the node component --- .../mining-dashboard.component.html | 1 - .../channels-list.component.html | 38 +++++++++---------- .../channels-list.component.scss | 32 ++++++++++++++++ .../app/lightning/node/node.component.html | 2 +- .../app/lightning/node/node.component.scss | 3 +- 5 files changed, 54 insertions(+), 22 deletions(-) diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html index a51f90f6c..2e6cbbada 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html @@ -4,7 +4,6 @@
-
Reward stats  diff --git a/frontend/src/app/lightning/channels-list/channels-list.component.html b/frontend/src/app/lightning/channels-list/channels-list.component.html index 648c8040b..b7b18892e 100644 --- a/frontend/src/app/lightning/channels-list/channels-list.component.html +++ b/frontend/src/app/lightning/channels-list/channels-list.component.html @@ -36,25 +36,25 @@ Alias -   - Status - Fee rate - Closing date - Capacity - Channel ID +   + Status + Fee rate + Closing date + Capacity + Channel ID -
{{ node.alias || '?' }}
+
- +
@@ -64,7 +64,7 @@
- + Inactive Active @@ -74,20 +74,20 @@
- + {{ channel.fee_rate }} ppm ({{ channel.fee_rate / 10000 | number }}%) - + - + {{ channel.capacity | amountShortener: 1 }} sats - - + + {{ channel.short_id }} @@ -100,19 +100,19 @@ - + - + - + - + - + diff --git a/frontend/src/app/lightning/channels-list/channels-list.component.scss b/frontend/src/app/lightning/channels-list/channels-list.component.scss index fa2fe3cf5..80797b550 100644 --- a/frontend/src/app/lightning/channels-list/channels-list.component.scss +++ b/frontend/src/app/lightning/channels-list/channels-list.component.scss @@ -31,4 +31,36 @@ @media (max-width: 435px) { flex-grow: 1; } +} + +.alias { + padding-left: 0; +} + +.feerate { + @media (max-width: 815px) { + display: none; + } +} + +.status { + @media (max-width: 710px) { + display: none; + } +} + +.nodedetails { + @media (max-width: 600px) { + display: none; + } +} + +.liquidity { + @media (max-width: 500px) { + display: none; + } +} + +.channelid { + padding-right: 0; } \ No newline at end of file diff --git a/frontend/src/app/lightning/node/node.component.html b/frontend/src/app/lightning/node/node.component.html index 111dc3bd0..e46a99e21 100644 --- a/frontend/src/app/lightning/node/node.component.html +++ b/frontend/src/app/lightning/node/node.component.html @@ -57,7 +57,7 @@ Avg channel distance - {{ avgDistance | number : '1.0-0' }} km / {{ kmToMiles(avgDistance) | number : '1.0-0' }} mi + {{ avgDistance | amountShortener: 1 }} km ·{{ kmToMiles(avgDistance) | amountShortener: 1 }} mi diff --git a/frontend/src/app/lightning/node/node.component.scss b/frontend/src/app/lightning/node/node.component.scss index ad3304eaf..272de4b09 100644 --- a/frontend/src/app/lightning/node/node.component.scss +++ b/frontend/src/app/lightning/node/node.component.scss @@ -108,5 +108,6 @@ app-fiat { } .separator { - margin: 0 1em; + margin: 0 0.25em; + color: slategrey; } From 8407c07b88f53f6cf939bf68503743fbc00ae928 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 12 Mar 2023 15:44:49 +0900 Subject: [PATCH 037/782] Pull from transifex --- frontend/src/locale/messages.ja.xlf | 527 ++++++++++------- frontend/src/locale/messages.lt.xlf | 503 ++++++++++------ frontend/src/locale/messages.mk.xlf | 884 ++++++++++++++++++---------- frontend/src/locale/messages.pl.xlf | 520 +++++++++------- frontend/src/locale/messages.pt.xlf | 516 ++++++++++------ frontend/src/locale/messages.sv.xlf | 513 ++++++++++------ 6 files changed, 2177 insertions(+), 1286 deletions(-) diff --git a/frontend/src/locale/messages.ja.xlf b/frontend/src/locale/messages.ja.xlf index 168d9959c..56975a922 100644 --- a/frontend/src/locale/messages.ja.xlf +++ b/frontend/src/locale/messages.ja.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,6 +3084,10 @@ Difficulty Adjustment 難易度調整 + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -3094,11 +3102,11 @@ Remaining 残り - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks ブロック - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block ブロック - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate 推定 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous 以前 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period 当期 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving 次の半減 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) 最低手数料率の2倍あるいは低優先手数料率(そのうち低い方) @@ -3346,7 +3446,7 @@ マイニング src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ プールのランキング src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ プールの優勢 src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ ハッシュレートと採掘難易度 src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ ライトニング src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ ネットワーク当たりのライトニングノード src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ ライトニングネットワーク容量 src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ プロバイダー当たりのライトニングノード src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ 国当たりのライトニングノード src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ ライトニングノードの世界地図 src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ ライトニングノードチャンネルの世界地図 src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ ハッシュレート(MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4215,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4439,7 @@ フィルター src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4448,7 @@ 反転 src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4457,7 @@ トランザクションvByte毎秒(vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4465,187 @@ Just now ちょうど今 - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After の後 - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - あと〜 - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4779,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4798,7 @@ 詳細を表示 src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4815,7 @@ 詳細を非表示 src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4828,7 @@ 図表を表示 src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4837,7 @@ ロックタイム src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4846,7 @@ トランザクションが見つかりません。 src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4855,7 @@ mempoolに表示されるのを待っています... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4864,7 @@ 実効手数料レート src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5319,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5330,7 @@ REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5339,11 @@ エンドポイント src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5352,11 @@ 記述 src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5364,7 @@ デフォルト・プッシュ: 行動: 'want', データ: ['ブロック', ...] プッシュしたいことを表現するために. 利用可能: blocksmempool-blockslive-2h-chartstatsこのアドレスと関係するプッシュトランザクション: 'track-address': '3PbJ...bF9B' インプットまたはアウトプットとしてそのアドレスを含む新トランザクションを得るために。トランザクションの配列を返す。 新しいメモリプールトランザクションの場合はaddress-transactions, そして新しいブロック承認済みトランザクションの場合はblock-transactions src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5653,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6182,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6867,7 +6978,7 @@ year - + src/app/shared/i18n/dates.ts 3 @@ -6875,7 +6986,7 @@ years - + src/app/shared/i18n/dates.ts 4 @@ -6891,7 +7002,7 @@ months - か月 + か月 src/app/shared/i18n/dates.ts 6 @@ -6899,7 +7010,7 @@ week - + src/app/shared/i18n/dates.ts 7 @@ -6907,7 +7018,7 @@ weeks - + src/app/shared/i18n/dates.ts 8 @@ -6915,7 +7026,7 @@ day - + src/app/shared/i18n/dates.ts 9 @@ -6923,7 +7034,7 @@ days - + src/app/shared/i18n/dates.ts 10 @@ -6931,7 +7042,7 @@ hour - 時間 + 時間 src/app/shared/i18n/dates.ts 11 @@ -6939,7 +7050,7 @@ hours - 時間 + 時間 src/app/shared/i18n/dates.ts 12 @@ -6947,7 +7058,7 @@ minute - + src/app/shared/i18n/dates.ts 13 @@ -6955,7 +7066,7 @@ minutes - + src/app/shared/i18n/dates.ts 14 @@ -6963,7 +7074,7 @@ second - + src/app/shared/i18n/dates.ts 15 @@ -6971,7 +7082,7 @@ seconds - + src/app/shared/i18n/dates.ts 16 diff --git a/frontend/src/locale/messages.lt.xlf b/frontend/src/locale/messages.lt.xlf index 08ec17167..f809420b4 100644 --- a/frontend/src/locale/messages.lt.xlf +++ b/frontend/src/locale/messages.lt.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,6 +3084,10 @@ Difficulty Adjustment Sudėtingumo Koregavimas + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -3094,11 +3102,11 @@ Remaining Liko - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks blokai - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block blokas - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Prognozė - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Buvęs - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Šis Periodas - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Iki Halvingo Liko - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Arba 2x daugiau už minimalų arba žemo prioriteto tarifas (pagal tai kuris mažesnis) @@ -3346,7 +3446,7 @@ Kasimas src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ Telkinių Reitingas src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ Telkinių Dominavimas src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ Maišos Dažnis ir Sudėtingumas src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ „Lightning“ src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ „Lightning“ Mazgai Tinkle src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ „Lightning“ Tinklo Talpa src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ „Lightning“ Mazgai Tenkantys Vienam IPT src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ „Lightning“ Mazgai Pagal Šalį src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ „Lightning“ Tinklo Žemėlapis src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ „Lightning“ Kanalų Žemėlapis src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ Maišos dažnis (JV) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3704,7 +3804,7 @@ Broadcast Transaction - Transliavimo Sandoris + Transliuoti Sandorį src/app/components/mining-dashboard/mining-dashboard.component.html 92 @@ -4115,7 +4215,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4439,7 @@ Filtruoti src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4448,7 @@ Apversti src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4457,7 @@ Operacijos vBaitai per sekundę (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4465,187 @@ Just now Dabar - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago Prieš - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Po - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Per ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4779,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4798,7 @@ Rodyti daugiau src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4815,7 @@ Rodyti mažiau src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4828,7 @@ Rodyti diagramą src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4837,7 @@ Užrakinimo laikas src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4846,7 @@ Sandoris nerastas. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4855,7 @@ Laukiama pasirodymo atmintinėje... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4864,7 @@ Efektyvus mokesčių tarifas src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5319,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5330,7 @@ REST API paslauga src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5339,11 @@ Galutinis taškas src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5352,11 @@ Apibūdinimas src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5364,7 @@ Numatytas passtūmimas: veiksmas: 'want', data: ['blocks', ...] , išreikšti tai, ką norite pastūmėti. Galimi: blokai , mempool blokai , realaus laiko-2val grafikas , ir statistika . Pastūmėti sandorius susietus su adresu: 'track-address': '3PbJ...bF9B' priimti visus naujus sandorius susietus su adresu kaip įvestis ar išvestis. Pateikiama kaip sandorių rinkinys. adreso-sandoriainaujiems mempool sandoriams, ir bloko sandoriainaujiems bloke patvirtintoms sandoriams. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5653,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6182,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 diff --git a/frontend/src/locale/messages.mk.xlf b/frontend/src/locale/messages.mk.xlf index 8747463ee..c0fe07715 100644 --- a/frontend/src/locale/messages.mk.xlf +++ b/frontend/src/locale/messages.mk.xlf @@ -252,6 +252,7 @@ + node_modules/src/timepicker/timepicker.ts 429 @@ -259,6 +260,7 @@ + node_modules/src/timepicker/timepicker.ts 429 @@ -773,7 +775,7 @@ src/app/components/about/about.component.html - 385,389 + 375,378 src/app/components/mining-dashboard/mining-dashboard.component.html @@ -1072,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1200,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1221,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1243,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1447,9 +1449,10 @@ Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties. + Нашиот mempool и blockchain прелистувач за Bitcoin заедницата, се фокусира на провизиите за трансакциите и повеќе слојниот екосистем, комплетно независно од трети страни. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1457,7 +1460,7 @@ Корпоративни Спонзори 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1466,7 +1469,7 @@ Спонзори од Заедницата ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1475,7 +1478,7 @@ Интеграции од заедницата src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1484,7 +1487,7 @@ Соработка со Заедницата src/app/components/about/about.component.html - 285,287 + 275,277 about.alliances @@ -1493,7 +1496,7 @@ Преведувачи src/app/components/about/about.component.html - 301,303 + 291,293 about.translators @@ -1502,7 +1505,7 @@ Контрибутори src/app/components/about/about.component.html - 315,317 + 305,307 about.contributors @@ -1511,7 +1514,7 @@ Членови на проектот src/app/components/about/about.component.html - 327,329 + 317,319 about.project_members @@ -1520,7 +1523,7 @@ Одржувачи на проектот src/app/components/about/about.component.html - 340,342 + 330,332 about.maintainers @@ -1529,7 +1532,7 @@ За нас src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1647,6 +1650,7 @@ There many transactions on this address, more than your backend can handle. See more on setting up a stronger backend. Consider viewing this address on the official Mempool website instead: + Има премногу трансакции на оваа адреса, повеќе од тоа што твојот сервер може да обработи. Дознај повеќе на конфигурирање на појак сервер. Или разгледај ја оваа адреса на официјалната Мемпул страница: src/app/components/address/address.component.html 134,137 @@ -2029,6 +2033,7 @@ Block Fee Rates + Стапка на Провизии по Блок src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.html 6,8 @@ -2039,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2077,6 +2082,7 @@ Block Fees + Провизии по Блок src/app/components/block-fees-graph/block-fees-graph.component.html 6,7 @@ -2087,12 +2093,13 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees Indexing blocks + Индексирање на блоковите src/app/components/block-fees-graph/block-fees-graph.component.ts 116,111 @@ -2107,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2148,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2174,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2196,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2290,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2324,13 +2331,14 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize Audit status + Статус на ревизија src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 36 @@ -2339,6 +2347,7 @@ Match + Се совпаѓа src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 38 @@ -2368,6 +2377,7 @@ Recently broadcasted + Скоро емитиран src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 41 @@ -2385,6 +2395,7 @@ Block Prediction Accuracy + Точност на предвидување по Блок src/app/components/block-prediction-graph/block-prediction-graph.component.html 6,8 @@ -2395,12 +2406,13 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy No data to display yet. Try again later. + Нема доволно податоци за приказ. Обиди се повторно. src/app/components/block-prediction-graph/block-prediction-graph.component.ts 108,103 @@ -2416,6 +2428,7 @@ Match rate + Стапка на совпаѓање src/app/components/block-prediction-graph/block-prediction-graph.component.ts 189,187 @@ -2423,6 +2436,7 @@ Block Rewards + Награди по Блок src/app/components/block-rewards-graph/block-rewards-graph.component.html 7,8 @@ -2433,12 +2447,13 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards Block Sizes and Weights + Големина и тежина на Блокот src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.html 5,7 @@ -2449,7 +2464,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2490,7 +2505,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2518,11 +2533,12 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 Size per weight + Големина по тежина src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts 200,199 @@ -2534,6 +2550,7 @@ Block + Блок src/app/components/block/block-preview.component.html 3,7 @@ -2615,6 +2632,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2648,6 +2669,7 @@ Unknown + Непознат src/app/components/block/block.component.html 67,70 @@ -2666,11 +2688,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2726,6 +2748,7 @@ Subsidy + fees + Награда + провизии src/app/components/block/block.component.html 153,156 @@ -2739,6 +2762,7 @@ Expected + Очекувано src/app/components/block/block.component.html 216 @@ -2760,6 +2784,7 @@ Actual + Реален src/app/components/block/block.component.html 218,222 @@ -2768,6 +2793,7 @@ Expected Block + Очекуван Блок src/app/components/block/block.component.html 222 @@ -2776,6 +2802,7 @@ Actual Block + Реален Блок src/app/components/block/block.component.html 231 @@ -2821,11 +2848,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2849,6 +2876,7 @@ Audit + Ревизија src/app/components/block/block.component.html 297,301 @@ -2865,25 +2893,26 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details Error loading data. + Грешка при вчитување. src/app/components/block/block.component.html 323,325 @@ -2896,10 +2925,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2912,6 +2937,7 @@ Why is this block empty? + Зошто овој блок е празен? src/app/components/block/block.component.html 384,390 @@ -2920,6 +2946,7 @@ Pool + Пул src/app/components/blocks-list/blocks-list.component.html 14 @@ -2961,6 +2988,7 @@ Reward + Награда src/app/components/blocks-list/blocks-list.component.html 20,21 @@ -2981,6 +3009,7 @@ Fees + Провизии src/app/components/blocks-list/blocks-list.component.html 21,22 @@ -3034,6 +3063,7 @@ Adjusted + Променето src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html 6,8 @@ -3042,6 +3072,7 @@ Change + Промена src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html 8,11 @@ -3050,7 +3081,11 @@ Difficulty Adjustment - Корекција на тежината на копање + Промена на тежината на копање + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -3065,23 +3100,24 @@ Remaining Преостануваат - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining blocks + блокови - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3100,12 +3136,13 @@ block + блок - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3118,11 +3155,11 @@ Estimate Проценка - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3131,34 +3168,139 @@ Previous Претходно - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Моментално - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period Next Halving + Наредно преполовување - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + очекувани блокови + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + очекуван блок + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + пронајдени блокови + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + пронајден блок + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + преостанати блокови + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + преостанат блок + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + блокови напред + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + блок напред + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + блокови назад + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + блок назад + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + Просечно време до блок + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) + 2х од минимумот или стапката за Низок Приоритет (кое и да е пониско) src/app/components/fees-box/fees-box.component.html 4,7 @@ -3167,6 +3309,7 @@ No Priority + Без приоритет src/app/components/fees-box/fees-box.component.html 4,7 @@ -3179,6 +3322,7 @@ Usually places your transaction in between the second and third mempool blocks + Обично ја става вашата трансакција помеѓу вториот и третиот мемпул блок src/app/components/fees-box/fees-box.component.html 8,9 @@ -3187,6 +3331,7 @@ Low Priority + Низок Приоритет src/app/components/fees-box/fees-box.component.html 8,9 @@ -3199,6 +3344,7 @@ Usually places your transaction in between the first and second mempool blocks + Обично ја става вашата трансакција помеѓу првиот и вториот мемпул блок src/app/components/fees-box/fees-box.component.html 9,10 @@ -3207,6 +3353,7 @@ Medium Priority + Среден Приоритет src/app/components/fees-box/fees-box.component.html 9,10 @@ -3219,6 +3366,7 @@ Places your transaction in the first mempool block + Ја става вашата трансакција во првиот мемпул блок src/app/components/fees-box/fees-box.component.html 10,14 @@ -3227,6 +3375,7 @@ High Priority + Висок Приоритет src/app/components/fees-box/fees-box.component.html 10,15 @@ -3303,17 +3452,19 @@ Mining + Копање src/app/components/graphs/graphs.component.html - 8 + 7 mining Pools Ranking + Рангирање на Пулови src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3323,9 +3474,10 @@ Pools Dominance + Доминација на Пулови src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3335,9 +3487,10 @@ Hashrate & Difficulty + Хашрејт & Тежина на копање src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3345,7 +3498,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3353,7 +3506,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3373,7 +3526,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3393,7 +3546,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3405,7 +3558,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3421,7 +3574,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3437,7 +3590,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3447,6 +3600,7 @@ Hashrate + Хашрејт src/app/components/hashrate-chart/hashrate-chart.component.html 8,10 @@ -3457,11 +3611,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3475,6 +3629,7 @@ Hashrate & Difficulty + Хашрејт & Тежина на копање src/app/components/hashrate-chart/hashrate-chart.component.html 27,29 @@ -3487,17 +3642,19 @@ Hashrate (MA) + Хашрејт (МА) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 Pools Historical Dominance + Историска Доминација на Пулови src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts 64 @@ -3505,6 +3662,7 @@ Indexing network hashrate + Хашрејт на мрежата за индексирање src/app/components/indexing-progress/indexing-progress.component.html 2 @@ -3512,6 +3670,7 @@ Indexing pools hashrate + Хашрејт на индексирачките пулови src/app/components/indexing-progress/indexing-progress.component.html 3 @@ -3536,6 +3695,7 @@ Mining Dashboard + Копање src/app/components/master-page/master-page.component.html 41,43 @@ -3548,6 +3708,7 @@ Lightning Explorer + Lightning Прелистувач src/app/components/master-page/master-page.component.html 44,47 @@ -3605,6 +3766,7 @@ Reward stats + Статистика за награди src/app/components/mining-dashboard/mining-dashboard.component.html 10 @@ -3613,6 +3775,7 @@ (144 blocks) + (144 блока) src/app/components/mining-dashboard/mining-dashboard.component.html 11 @@ -3634,6 +3797,7 @@ Adjustments + Промени src/app/components/mining-dashboard/mining-dashboard.component.html 67 @@ -3668,6 +3832,7 @@ Pools luck (1 week) + Среќа на пулови (1 недела) src/app/components/pool-ranking/pool-ranking.component.html 9 @@ -3676,6 +3841,7 @@ Pools luck + Среќа на пулови src/app/components/pool-ranking/pool-ranking.component.html 9,11 @@ -3684,6 +3850,7 @@ The overall luck of all mining pools over the past week. A luck bigger than 100% means the average block time for the current epoch is less than 10 minutes. + Целокупната среќа на сите пулови за копање во текот на изминатата недела. Среќа поголема од 100% значи дека просечното време на пронаоѓање на блок за тековната епоха е помалку од 10 минути. src/app/components/pool-ranking/pool-ranking.component.html 11,15 @@ -3692,6 +3859,7 @@ Pools count (1w) + Број на пулови (1н) src/app/components/pool-ranking/pool-ranking.component.html 17 @@ -3700,6 +3868,7 @@ Pools count + Број на пулови src/app/components/pool-ranking/pool-ranking.component.html 17,19 @@ -3708,6 +3877,7 @@ How many unique pools found at least one block over the past week. + Број на уникатни пулови кои пронајдоа барем еден блок во последната недела. src/app/components/pool-ranking/pool-ranking.component.html 19,23 @@ -3716,6 +3886,7 @@ Blocks (1w) + Блокови (1н) src/app/components/pool-ranking/pool-ranking.component.html 25 @@ -3732,6 +3903,7 @@ The number of blocks found over the past week. + Бројот на блокови пронајдени во последната недела. src/app/components/pool-ranking/pool-ranking.component.html 27,31 @@ -3740,6 +3912,7 @@ Rank + Ранк src/app/components/pool-ranking/pool-ranking.component.html 90,92 @@ -3768,6 +3941,7 @@ Empty blocks + Празни блокови src/app/components/pool-ranking/pool-ranking.component.html 97,100 @@ -3776,6 +3950,7 @@ All miners + Сите мајнери src/app/components/pool-ranking/pool-ranking.component.html 129,130 @@ -3784,6 +3959,7 @@ Pools Luck (1w) + Среќа на пулови (1н) src/app/components/pool-ranking/pool-ranking.component.html 146,148 @@ -3792,6 +3968,7 @@ Pools Count (1w) + Број на пулови (1н) src/app/components/pool-ranking/pool-ranking.component.html 158,160 @@ -3807,6 +3984,7 @@ blocks + блока src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3826,6 +4004,7 @@ Tags + Тагови src/app/components/pool/pool-preview.component.html 18,19 @@ -3850,6 +4029,7 @@ Show all + Покажи ги сите src/app/components/pool/pool.component.html 53,55 @@ -3874,6 +4054,7 @@ Hide + Сокриј src/app/components/pool/pool.component.html 55,58 @@ -3882,6 +4063,7 @@ Hashrate (24h) + Хашрејт (24ч) src/app/components/pool/pool.component.html 91,93 @@ -3902,6 +4084,7 @@ Estimated + Проценето src/app/components/pool/pool.component.html 96,97 @@ -3922,6 +4105,7 @@ Reported + Пријавени src/app/components/pool/pool.component.html 97,98 @@ -3942,6 +4126,7 @@ Luck + Среќа src/app/components/pool/pool.component.html 98,101 @@ -3962,6 +4147,7 @@ Mined blocks + Пронајдени блокови src/app/components/pool/pool.component.html 141,143 @@ -3982,6 +4168,7 @@ 24h + 24ч src/app/components/pool/pool.component.html 147 @@ -3994,6 +4181,7 @@ 1w + src/app/components/pool/pool.component.html 148 @@ -4006,6 +4194,7 @@ Coinbase tag + Таг од ковачницата src/app/components/pool/pool.component.html 215,217 @@ -4018,18 +4207,20 @@ Transaction hex + Трансакциски хекс src/app/components/push-transaction/push-transaction.component.html 6 src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex Miners Reward + Награда за Мајнери src/app/components/reward-stats/reward-stats.component.html 5 @@ -4046,6 +4237,7 @@ Amount being paid to miners in the past 144 blocks + Сума исплатена на мајнерите во последните 144 блокови src/app/components/reward-stats/reward-stats.component.html 6,8 @@ -4054,6 +4246,7 @@ Avg Block Fees + Прос. провизија по Блок src/app/components/reward-stats/reward-stats.component.html 17 @@ -4066,6 +4259,7 @@ Average fees per block in the past 144 blocks + Просечни провизии по блок во последните 144 блокови src/app/components/reward-stats/reward-stats.component.html 18,20 @@ -4074,6 +4268,7 @@ BTC/block + BTC/блок src/app/components/reward-stats/reward-stats.component.html 21,24 @@ -4083,6 +4278,7 @@ Avg Tx Fee + Прос. Провизија на Tx src/app/components/reward-stats/reward-stats.component.html 30 @@ -4095,6 +4291,7 @@ Fee paid on average for each transaction in the past 144 blocks + Провизија платена во просек на секоја трансакција во последните 144 блокови src/app/components/reward-stats/reward-stats.component.html 31,32 @@ -4103,6 +4300,7 @@ sats/tx + sats/tx src/app/components/reward-stats/reward-stats.component.html 33,36 @@ -4112,6 +4310,7 @@ Reward Per Tx + Награда по Tx src/app/components/reward-stats/reward-stats.component.html 53,56 @@ -4124,6 +4323,7 @@ Explore the full Bitcoin ecosystem + Истражете го во целост Bitcoin екосистемот src/app/components/search-form/search-form.component.html 4,5 @@ -4141,6 +4341,7 @@ Bitcoin Block Height + Висина на Блокот src/app/components/search-form/search-results/search-results.component.html 3 @@ -4149,6 +4350,7 @@ Bitcoin Transaction + Bitcoin Трансакција src/app/components/search-form/search-results/search-results.component.html 9 @@ -4157,6 +4359,7 @@ Bitcoin Address + Bitcoin Адреса src/app/components/search-form/search-results/search-results.component.html 15 @@ -4165,6 +4368,7 @@ Bitcoin Block + Bitcoin Блок src/app/components/search-form/search-results/search-results.component.html 21 @@ -4173,6 +4377,7 @@ Bitcoin Addresses + Bitcoin Адреси src/app/components/search-form/search-results/search-results.component.html 27 @@ -4197,6 +4402,7 @@ Go to "" + Оди на &quot;&quot; src/app/components/search-form/search-results/search-results.component.html 52 @@ -4230,7 +4436,7 @@ Филтер src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4239,7 +4445,7 @@ Инвертирај src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4248,7 +4454,7 @@ Трансакциски vBytes во секунда (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4256,196 +4462,188 @@ Just now Штотуку - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago Пред - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + За ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After После - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - За ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4460,6 +4658,7 @@ This transaction replaced: + Оваа трансакција ја замени: src/app/components/transaction/transaction.component.html 10,12 @@ -4469,6 +4668,7 @@ Replaced + Заменето src/app/components/transaction/transaction.component.html 36,39 @@ -4499,7 +4699,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4515,11 +4715,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4570,19 +4770,21 @@ Flow + Тек src/app/components/transaction/transaction.component.html 202,205 src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow Hide diagram + Сокриј го дијаграмот src/app/components/transaction/transaction.component.html 205,210 @@ -4591,9 +4793,10 @@ Show more + Прикажи повеќе src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4607,9 +4810,10 @@ Show less + Прикажи помалку src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4619,9 +4823,10 @@ Show diagram + Прикажи го дијаграмот src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4630,7 +4835,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4639,7 +4844,7 @@ Трансакцијата не е пронајдена src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4648,7 +4853,7 @@ Се чека да се појави во mempool-от... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4657,7 +4862,7 @@ Ефективна профизија src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4729,6 +4934,7 @@ P2TR tapscript + P2TR tapscript src/app/components/transactions-list/transactions-list.component.html 132,134 @@ -4802,6 +5008,7 @@ Show more inputs to reveal fee data + Прикажи повеќе влезови за да ја откриеш провизијата src/app/components/transactions-list/transactions-list.component.html 290,293 @@ -4810,6 +5017,7 @@ remaining + преостанато src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -4818,6 +5026,7 @@ other inputs + други влезови src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 12 @@ -4826,6 +5035,7 @@ other outputs + други излези src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 13 @@ -4834,6 +5044,7 @@ Input + Влез src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 42 @@ -4846,6 +5057,7 @@ Output + Излез src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 43 @@ -4858,6 +5070,7 @@ This transaction saved % on fees by using native SegWit + Оваа трансакција заштеди % на провизии користејќи native SegWit src/app/components/tx-features/tx-features.component.html 2 @@ -4884,6 +5097,7 @@ This transaction saved % on fees by using SegWit and could save % more by fully upgrading to native SegWit + Оваа трансакција заштеди % во провизии користејќи SegWit и може да заштеди уште % доколку користи native SegWit src/app/components/tx-features/tx-features.component.html 4 @@ -4892,6 +5106,7 @@ This transaction could save % on fees by upgrading to native SegWit or % by upgrading to SegWit-P2SH + Оваа трансакција можеше да заштеде % во провизии, доколку користеше native SegWit или % доколку користеше SegWit-P2SH src/app/components/tx-features/tx-features.component.html 6 @@ -4900,6 +5115,7 @@ This transaction uses Taproot and thereby saved at least % on fees + Оваа трансакција користи Taproot и затоа заштеди барем % на провизии src/app/components/tx-features/tx-features.component.html 12 @@ -4908,6 +5124,7 @@ Taproot + Taproot src/app/components/tx-features/tx-features.component.html 12 @@ -4933,6 +5150,7 @@ This transaction uses Taproot and already saved at least % on fees, but could save an additional % by fully using Taproot + Оваа трансакција користи Taproot и веќе заштеди барем % во провизии, но можеше да заштеди дополнителни % доколку целосно користеше Taproot src/app/components/tx-features/tx-features.component.html 14 @@ -4941,6 +5159,7 @@ This transaction could save % on fees by using Taproot + Оваа трансација можеше да заштеди % во провизии доколку користеше Taproot src/app/components/tx-features/tx-features.component.html 16 @@ -4949,6 +5168,7 @@ This transaction does not use Taproot + Оваа трансакција не користи Taproot src/app/components/tx-features/tx-features.component.html 18 @@ -4966,6 +5186,7 @@ This transaction supports Replace-By-Fee (RBF) allowing fee bumping + Оваа трансакција има поддршка за Replace-By-Fee (RBF) кое што овозможува зголемување на провизијата src/app/components/tx-features/tx-features.component.html 28 @@ -5091,17 +5312,23 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space само овозможува информации за Bitcoin мрежата. Во никој случај неможи да ви помогни во повраток на средства, побрзо потврдување на вашата трансакција и сл. src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer REST API service + REST API сервис src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5110,11 +5337,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5123,11 +5350,11 @@ Опис src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5135,7 +5362,7 @@ Објавување: action: 'want', data: ['blocks', ...] за да специфираш што да биде објавено. Достапни полиња: blocks, mempool-blocks, live-2h-chart, и stats.Објави трансакции поврзани со адресса: 'track-address': '3PbJ...bF9B' за да ги добиеш сите нови трансакции што ја содржат таа адреса како влез или излез. Враќа низа од транссакции. address-transactions за нови трансакции во mempool-от, и block-transactions за поврдени трансакции во најновиот блок. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5180,6 +5407,7 @@ FAQ + ЧПП src/app/docs/docs/docs.component.ts 34 @@ -5203,6 +5431,7 @@ Base fee + Основна провизија src/app/lightning/channel/channel-box/channel-box.component.html 29 @@ -5215,6 +5444,7 @@ mSats + mSats src/app/lightning/channel/channel-box/channel-box.component.html 35 @@ -5229,7 +5459,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5267,6 +5497,7 @@ Min HTLC + Мин HTLC src/app/lightning/channel/channel-box/channel-box.component.html 57 @@ -5275,6 +5506,7 @@ Max HTLC + Макс HTLC src/app/lightning/channel/channel-box/channel-box.component.html 63 @@ -5291,6 +5523,7 @@ channels + канали src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -5303,6 +5536,7 @@ Starting balance + Баланс при отварање src/app/lightning/channel/channel-close-box/channel-close-box.component.html 6 @@ -5312,6 +5546,7 @@ Closing balance + Баланс при затварање src/app/lightning/channel/channel-close-box/channel-close-box.component.html 12 @@ -5329,13 +5564,14 @@ Inactive + Неактивен src/app/lightning/channel/channel-preview.component.html 10,11 src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5345,13 +5581,14 @@ Active + Активен src/app/lightning/channel/channel-preview.component.html 11,12 src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5361,13 +5598,14 @@ Closed + Затворен src/app/lightning/channel/channel-preview.component.html 12,14 src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5381,30 +5619,40 @@ Created + Создаден src/app/lightning/channel/channel-preview.component.html 23,26 src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created Capacity + Капацитет src/app/lightning/channel/channel-preview.component.html 27,28 src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5433,6 +5681,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5445,6 +5697,7 @@ ppm + ppm src/app/lightning/channel/channel-preview.component.html 34,35 @@ -5467,23 +5720,24 @@ Lightning channel src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel Last update + Последна промена src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5499,19 +5753,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update Closing date + Дата на затварање src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html @@ -5521,30 +5776,34 @@ Closed by + Затворен од src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by Opening transaction + Трансакција на отварање src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction Closing transaction + Трансакција на затварање src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction Channel: + Канал: src/app/lightning/channel/channel.component.ts 37 @@ -5552,6 +5811,7 @@ Mutually closed + Взаемно затворен src/app/lightning/channel/closing-type/closing-type.component.ts 20 @@ -5559,6 +5819,7 @@ Force closed + Присилно затворен src/app/lightning/channel/closing-type/closing-type.component.ts 24 @@ -5566,6 +5827,7 @@ Force closed with penalty + Присилно затворен со казна src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -5573,6 +5835,7 @@ Open + Отворен src/app/lightning/channels-list/channels-list.component.html 5,7 @@ -5581,6 +5844,7 @@ No channels to display + Нема канали за прикажување src/app/lightning/channels-list/channels-list.component.html 29,37 @@ -5589,6 +5853,7 @@ Alias + Прекар src/app/lightning/channels-list/channels-list.component.html 38,40 @@ -5615,16 +5880,17 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias Status + Статус src/app/lightning/channels-list/channels-list.component.html 40,41 @@ -5633,6 +5899,7 @@ Channel ID + ID на каналот src/app/lightning/channels-list/channels-list.component.html 44,48 @@ -5641,6 +5908,7 @@ sats + sats src/app/lightning/channels-list/channels-list.component.html 63,67 @@ -5693,6 +5961,7 @@ avg + прос. src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -5701,6 +5970,7 @@ med + сред. src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -5709,6 +5979,7 @@ Avg Capacity + Прос. Капацитет src/app/lightning/channels-statistics/channels-statistics.component.html 13,15 @@ -5721,6 +5992,7 @@ Avg Fee Rate + Просечна провизија src/app/lightning/channels-statistics/channels-statistics.component.html 26,28 @@ -5733,6 +6005,7 @@ The average fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + Просечната стапка на провизија што ја наплаќаат рутирачките нодови, игнорирајќи провизиите > 0,5% или 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 28,30 @@ -5741,6 +6014,7 @@ Avg Base Fee + Прос. Основна Провизија src/app/lightning/channels-statistics/channels-statistics.component.html 41,43 @@ -5753,6 +6027,7 @@ The average base fee charged by routing nodes, ignoring base fees > 5000ppm + Просечна онсновна провизија што ја наплаќаат рутирачките нодови, игнорирајќи основни провизии > 5000ppm src/app/lightning/channels-statistics/channels-statistics.component.html 43,45 @@ -5875,16 +6150,13 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity Channels + Канали src/app/lightning/group/group-preview.component.html 40,43 @@ -5893,6 +6165,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -5931,11 +6211,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -5945,6 +6225,7 @@ Average size + Просечна големина src/app/lightning/group/group-preview.component.html 44,46 @@ -5957,6 +6238,7 @@ Location + Локација src/app/lightning/group/group.component.html 74,77 @@ -5971,7 +6253,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5987,16 +6269,17 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location Network Statistics + Статистика за мрежата src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 10 @@ -6005,6 +6288,7 @@ Channels Statistics + Статистика за каналите src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 24 @@ -6025,9 +6309,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6049,6 +6341,7 @@ Fee distribution + Дистрибувија на провизија src/app/lightning/node-fee-chart/node-fee-chart.component.html 2 @@ -6057,6 +6350,7 @@ Outgoing Fees + Излезни провизии src/app/lightning/node-fee-chart/node-fee-chart.component.ts 170 @@ -6068,6 +6362,7 @@ Incoming Fees + Влезни провизии src/app/lightning/node-fee-chart/node-fee-chart.component.ts 178 @@ -6079,6 +6374,7 @@ Percentage change past week + Неделна промена во % src/app/lightning/node-statistics/node-statistics.component.html 5,7 @@ -6101,83 +6397,82 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node Active capacity + Активен капацитет src/app/lightning/node/node-preview.component.html 20,22 src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity Active channels + Активни канали src/app/lightning/node/node-preview.component.html 26,30 src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels Country + Држава src/app/lightning/node/node-preview.component.html 44,47 country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size + Просечна големина на канал src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg Avg channel distance + Прос. одалеченост на каналите src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance Color + Боја src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color ISP + Оператор src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6187,9 +6482,10 @@ Exclusively on Tor + Исклучиво на Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6197,7 +6493,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6205,7 +6501,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6214,15 +6510,16 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee Funding weight + Тежина при основање src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6230,7 +6527,7 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6239,7 +6536,7 @@ Channel base fee src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6247,7 +6544,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6255,23 +6552,25 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records Open channels + Отворени канали src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels Closed channels + Затворени канали src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6311,6 +6610,7 @@ No geolocation data available + Нема информација за геолокацијата src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 219,214 @@ -6318,6 +6618,7 @@ Active channels map + Мапа со активни канали src/app/lightning/nodes-channels/node-channels.component.html 2,3 @@ -6326,6 +6627,7 @@ Indexing in progress + Се индексира src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 121,116 @@ -6335,8 +6637,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6346,8 +6648,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6357,8 +6659,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6370,6 +6672,7 @@ Share + Удел src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html 29,31 @@ -6397,6 +6700,7 @@ BTC capacity + BTC капацитет src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,102 @@ -6412,6 +6716,7 @@ ISP Count + Вкупно ISP src/app/lightning/nodes-per-country/nodes-per-country.component.html 34,38 @@ -6420,6 +6725,7 @@ Top ISP + Најдобри ISP src/app/lightning/nodes-per-country/nodes-per-country.component.html 38,40 @@ -6455,6 +6761,7 @@ Unknown Capacity + Непознат капацитет src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 13,15 @@ -6504,6 +6811,7 @@ BTC + BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 158,156 @@ -6523,6 +6831,7 @@ Top country + Најдобра држава src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 39,41 @@ -6562,6 +6871,7 @@ ASN + ASN src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 11,14 @@ -6592,22 +6902,6 @@ 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Најстари нодови diff --git a/frontend/src/locale/messages.pl.xlf b/frontend/src/locale/messages.pl.xlf index 77d92e83f..7970bfe8b 100644 --- a/frontend/src/locale/messages.pl.xlf +++ b/frontend/src/locale/messages.pl.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,6 +3084,10 @@ Difficulty Adjustment Dostosowanie trudności + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -3094,11 +3102,11 @@ Remaining Pozostało - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks bloków - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block blok - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Estymata - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Poprzednia - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Okres bieżący - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,110 @@ Next Halving Następny halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + spodziewanych bloków + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + spodziewany blok + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + bloków wydobytych + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + blok wydobyty + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + bloków pozostało + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + blok pozostał + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + bloków przed nami + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + blok przed nami + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + bloków za nami + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + blok za nami + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + Średni czas bloku + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Dwukrotność minimalnej wartości lub niski priorytet (w zależności która jest niższa) @@ -3346,7 +3457,7 @@ Wydobycie src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3466,7 @@ Ranking kolektywów wydobywczych src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3479,7 @@ Dominacja kolektywów wydobywczych src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3492,7 @@ Prędkość haszowania i trudność src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3501,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3510,7 @@ Węzły Lightning wg sieci src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3531,7 @@ Pojemność Lightning Network src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3552,7 @@ Węzły Lightning wg ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3565,7 @@ Węzły Lightning wg państw src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3582,7 @@ Mapa światowa węzłów sieci Lightning src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3599,7 @@ Mapa światowa kanałów węzłów sieci Lightning src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3620,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3654,11 @@ Prędkość haszowania (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4226,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4450,7 @@ Filtr src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4459,7 @@ Odwróć src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4468,7 @@ vBytes transkacji na sekundę (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4476,188 @@ Just now Przed chwilą - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago temu - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + Za ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Po - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Za ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4791,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4810,7 @@ Pokaż więcej src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4827,7 @@ Pokaż mniej src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4840,7 @@ Pokaż diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4849,7 @@ Czas blokady src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4858,7 @@ Transakcja nie odnaleziona. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4867,7 @@ Oczekiwanie aż pojawi się w mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4876,7 @@ Efektywny poziom opłaty src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5331,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5342,7 @@ Usługa REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5351,11 @@ Końcówka src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5364,11 @@ Opis src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5376,7 @@ Domyślny push: action: 'want', data: ['blocks', ...] aby wyrazić co chcesz wysłać. Dostępne: blocks, mempool-blocks, live-2h-chart i stats.Wysłanie transakcji związanych z adresem: 'track-address': '3PbJ...bF9B' aby otrzymać wszystkie nowe transakcje zawierające ten adres jako wejście lub wyjście. Zwraca tablicę transakcji. address-transactions dla nowych transakcji mempool, i block-transactions dla nowo potwierdzonych transakcji w bloku. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5665,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6194,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6559,6 +6682,7 @@ Clearnet and Darknet + Clearnet i Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6570,6 +6694,7 @@ Clearnet Only (IPv4, IPv6) + Tylko Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6581,6 +6706,7 @@ Darknet Only (Tor, I2P, cjdns) + Tylko Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6664,7 +6790,7 @@ Clearnet Capacity - Pojemność w jawnej sieci + Pojemność w Clearnecie src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6677,7 +6803,7 @@ How much liquidity is running on nodes advertising at least one clearnet IP address - Jaka jest płynność węzłów ogłaszających co najmniej jeden adres IP w clearnecie + Jaka jest płynność węzłów ogłaszających co najmniej jeden adres IP w Clearnecie src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 8,9 diff --git a/frontend/src/locale/messages.pt.xlf b/frontend/src/locale/messages.pt.xlf index e41cd4ecc..542fe6b24 100644 --- a/frontend/src/locale/messages.pt.xlf +++ b/frontend/src/locale/messages.pt.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,6 +3084,10 @@ Difficulty Adjustment Ajuste de Dificuldade + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -3094,11 +3102,11 @@ Remaining Faltando - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks blocos - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block bloco - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Estimativa - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Anterior - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Período Atual - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,110 @@ Next Halving Próximo Halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + blocos esperados + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + bloco esperado + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + blocos minerados + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + bloco minerado + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + blocos restantes + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + bloco restante + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + blocos adiantados + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + bloco adiantado + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + blocos atrasados + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + bloco atrasado + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + Tempo médio dos blocos + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Ou 2x a taxa mínima ou a de prioridade baixa (o que for menor) @@ -3346,7 +3457,7 @@ Mineração src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3466,7 @@ Ranking dos Pools src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3479,7 @@ Domínio dos Pools src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3492,7 @@ Hashrate & Dificuldade src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3501,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3510,7 @@ Nós Lightning por Rede src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3531,7 @@ Capacidade da Rede Lightning src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3552,7 @@ Nós Lightning por Provedora src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3565,7 @@ Nós Lightning por País src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3582,7 @@ Mapa Mundial de Nós Lightning src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3599,7 @@ Mapa Mundial de Canais Lightning src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3620,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3654,11 @@ Hashrate (Média) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4226,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4450,7 @@ Filtro src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4459,7 @@ Inverter src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4468,7 @@ Transação vBytes por segundo (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4476,188 @@ Just now Agora mesmo - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago atrás - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + Em ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Depois - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Em ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4791,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4810,7 @@ Mostrar mais src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4827,7 @@ Mostrar menos src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4840,7 @@ Mostrar diagrama src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4849,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4858,7 @@ Transação não encontrada. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4867,7 @@ Aguardando que apareça no mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4876,7 @@ Taxa de transação efetiva src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5331,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5342,7 @@ Serviço de API REST src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5351,11 @@ Terminal src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5364,11 @@ Descrição src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5376,7 @@ Push padrão: ação: 'want', data: ['blocks', ...] para expressar o que você deseja push. Disponível: blocks, mempool-blocks, live-2h-chart e stats.Push transações relacionadas ao endereço: 'track-address': '3PbJ ... bF9B' para receber todas as novas transações contendo aquele endereço como entrada ou saída. Retorna uma matriz de transações. address-transactions para novas transações de mempool e block-transactions para novas transações de bloco confirmadas. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5665,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6194,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6559,6 +6682,7 @@ Clearnet and Darknet + Clearnet e Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6570,6 +6694,7 @@ Clearnet Only (IPv4, IPv6) + Somente Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6581,6 +6706,7 @@ Darknet Only (Tor, I2P, cjdns) + Somente Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 diff --git a/frontend/src/locale/messages.sv.xlf b/frontend/src/locale/messages.sv.xlf index 13e5ec135..644b9c248 100644 --- a/frontend/src/locale/messages.sv.xlf +++ b/frontend/src/locale/messages.sv.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,6 +3084,10 @@ Difficulty Adjustment Svårighetsjustering + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -3094,11 +3102,11 @@ Remaining Återstående - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Estimat - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Föregående - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Nuvarande period - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,110 @@ Next Halving Nästa halvering - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + förväntade block + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + förväntade block + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + mineade block + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + mineade block + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + återstående block + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + återstående block + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + block ikapp + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + block ikapp + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + blocks efter + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + block efter + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Antingen 2x minimumavgiften eller Låg prioritet-avgiften (den lägsta) @@ -3346,7 +3457,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3466,7 @@ Poolranking src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3479,7 @@ Pooldominans src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3492,7 @@ Hashrate & svårighetsgrad src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3501,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3510,7 @@ Lightningnoder per nätverk src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3531,7 @@ Lightning nätverkskapacitet src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3552,7 @@ Lightningnoder per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3565,7 @@ Lightningnoder per land src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3582,7 @@ Världskarta över Lightningnoder src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3599,7 @@ Världskarta över Lightningkanaler src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3620,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3654,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4226,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4450,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4459,7 @@ Invertera src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4468,7 @@ Transaktioner i vBytes per sekund (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4476,188 @@ Just now Just nu - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago sedan - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + Om ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Efter - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Om ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4791,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4810,7 @@ Visa mer src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4827,7 @@ Visa mindre src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4840,7 @@ Visa diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4849,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4858,7 @@ Transaktionen hittades inte src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4867,7 @@ Väntar på den att dyka upp i mempoolen... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4876,7 @@ Effektiv avgiftssats src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5331,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5342,7 @@ REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5351,11 @@ Slutpunkt src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5364,11 @@ Beskrivning src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5376,7 @@ Standard push: action: 'want', data: ['blocks', ...] för att uttrycka vad du vill ha pushat. Tillgängligt: blocks, mempool-blocks, live-2h-chart, och stats.Pusha transaktioner relaterat till address: 'track-address': '3PbJ...bF9B' för att ta emot alla nya transaktioner innehållandes den addressen som input eller output. Returnerar en lista av transaktioner. address-transactions för nya mempooltransaktioner, och block-transactions för nya blockbekräftade transaktioner. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5665,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6194,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 From 60bef0eeb6712d47c22c79c794eaa89e7d9f153a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 15:54:39 +0900 Subject: [PATCH 038/782] show tx fee ratings for older blocks --- .../components/tx-fee-rating/tx-fee-rating.component.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.ts b/frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.ts index 1118474cc..cf867bcd7 100644 --- a/frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.ts +++ b/frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.ts @@ -3,6 +3,7 @@ import { Transaction } from '../../interfaces/electrs.interface'; import { StateService } from '../../services/state.service'; import { Subscription } from 'rxjs'; import { BlockExtended } from '../../interfaces/node-api.interface'; +import { CacheService } from '../../services/cache.service'; @Component({ selector: 'app-tx-fee-rating', @@ -23,12 +24,12 @@ export class TxFeeRatingComponent implements OnInit, OnChanges, OnDestroy { constructor( private stateService: StateService, + private cacheService: CacheService, private cd: ChangeDetectorRef, ) { } ngOnInit() { - this.blocksSubscription = this.stateService.blocks$.subscribe(([block]) => { - this.blocks.push(block); + this.blocksSubscription = this.cacheService.loadedBlocks$.subscribe((block) => { if (this.tx.status.confirmed && this.tx.status.block_height === block.height && block?.extras?.medianFee > 0) { this.calculateRatings(block); this.cd.markForCheck(); @@ -41,8 +42,9 @@ export class TxFeeRatingComponent implements OnInit, OnChanges, OnDestroy { if (!this.tx.status.confirmed) { return; } + this.cacheService.loadBlock(this.tx.status.block_height); - const foundBlock = this.blocks.find((b) => b.height === this.tx.status.block_height); + const foundBlock = this.cacheService.getCachedBlock(this.tx.status.block_height) || null; if (foundBlock && foundBlock?.extras?.medianFee > 0) { this.calculateRatings(foundBlock); } From 72a9b71901bb32d051a14bd663ef6fcb06f95d9f Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Tue, 7 Mar 2023 05:01:49 -0500 Subject: [PATCH 039/782] Add youtube and peertube links to about page --- frontend/src/app/components/about/about.component.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 23fed8dcd..9354a7d49 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -383,6 +383,12 @@ + + + + + +
From 513277cef7a7531a9b744fbe8a225eadcac6a15a Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sun, 12 Mar 2023 01:48:22 -0500 Subject: [PATCH 040/782] Replace peertube logo with bitcointv logo --- frontend/src/app/components/about/about.component.html | 4 ++-- frontend/src/app/components/about/about.component.scss | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 9354a7d49..da8eded0c 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -386,8 +386,8 @@ - - + +
diff --git a/frontend/src/app/components/about/about.component.scss b/frontend/src/app/components/about/about.component.scss index 2efd2f73b..e772c07d9 100644 --- a/frontend/src/app/components/about/about.component.scss +++ b/frontend/src/app/components/about/about.component.scss @@ -199,6 +199,16 @@ a { margin: 45px 10px; } + .bitcointv svg { + width: 36px; + height: auto; + vertical-align: bottom; + margin-bottom: 2px; + margin-left: 5px; + } + .bitcointv svg:hover { + opacity: 0.75; + } } } From 4be8016eb1b1590b6f6b161271267c8c2e86f5b2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 16:42:58 +0900 Subject: [PATCH 041/782] Fix repeated new block animation on page navigation --- .../blockchain-blocks/blockchain-blocks.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index e3547a569..5ece6c6ca 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -31,6 +31,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { dynamicBlocksAmount: number = 8; emptyBlocks: BlockExtended[] = this.mountEmptyBlocks(); markHeight: number; + chainTip: number; blocksSubscription: Subscription; blockPageSubscription: Subscription; networkSubscription: Subscription; @@ -73,6 +74,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { } ngOnInit() { + this.chainTip = this.stateService.latestBlockHeight; this.dynamicBlocksAmount = Math.min(8, this.stateService.env.KEEP_BLOCKS_AMOUNT); if (['', 'testnet', 'signet'].includes(this.stateService.network)) { @@ -115,7 +117,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { } this.blockStyles = []; - if (this.blocksFilled) { + if (this.blocksFilled && block.height > this.chainTip) { this.blocks.forEach((b, i) => this.blockStyles.push(this.getStyleForBlock(b, i, i ? -155 : -205))); setTimeout(() => { this.blockStyles = []; @@ -129,6 +131,8 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { if (this.blocks.length === this.dynamicBlocksAmount) { this.blocksFilled = true; } + + this.chainTip = Math.max(this.chainTip, block.height); this.cd.markForCheck(); }); } else { From 19e2d687d07eb14c62113952446ce61f9207e1ea Mon Sep 17 00:00:00 2001 From: wiz Date: Sun, 12 Mar 2023 16:48:23 +0900 Subject: [PATCH 042/782] Use correct BitcoinTV logo --- frontend/src/app/components/about/about.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index da8eded0c..ed4b9db87 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -387,7 +387,7 @@ - +
From b675bd8d55a7eacf5fb2df2ac140d75da595441e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 17:00:36 +0900 Subject: [PATCH 043/782] Fix transaction confirmed arrow animation --- .../blockchain-blocks/blockchain-blocks.component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 5ece6c6ca..30b98813a 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -20,8 +20,8 @@ interface BlockchainBlock extends BlockExtended { export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { @Input() static: boolean = false; @Input() offset: number = 0; - @Input() height: number = 0; - @Input() count: number = 8; + @Input() height: number = 0; // max height of blocks in chunk (dynamic blocks only) + @Input() count: number = 8; // number of blocks in this chunk (dynamic blocks only) @Input() loadingTip: boolean = false; @Input() connected: boolean = true; @@ -109,7 +109,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.blocks.unshift(block); this.blocks = this.blocks.slice(0, this.dynamicBlocksAmount); - if (txConfirmed && this.height === block.height) { + if (txConfirmed && block.height > this.chainTip) { this.markHeight = block.height; this.moveArrowToPosition(true, true); } else { From 6cc2f2063852f663b5f8699aceea9e49b9fddc63 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sun, 12 Mar 2023 04:13:20 -0400 Subject: [PATCH 044/782] Use href for enterprise links --- frontend/src/app/docs/api-docs/api-docs.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index e7e9a5403..7ef56ffaf 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -40,7 +40,7 @@

Below is a reference for the {{ network.val === '' ? 'Bitcoin' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} REST API service.

-

Note that we enforce rate limits. If you exceed these limits, you will get an HTTP 429 error. If you repeatedly exceed the limits, you may be banned from accessing the service altogether. Consider an enterprise sponsorship if you need higher API limits.

+

Note that we enforce rate limits. If you exceed these limits, you will get an HTTP 429 error. If you repeatedly exceed the limits, you may be banned from accessing the service altogether. Consider an enterprise sponsorship if you need higher API limits.

{{ item.title }}

@@ -268,7 +268,7 @@ -

You can manually install Mempool on your own server, but this requires advanced sysadmin skills since you will be manually configuring everything. You could also use our Docker images.

In any case, we only provide support for manual deployments to enterprise sponsors.

+

You can manually install Mempool on your own server, but this requires advanced sysadmin skills since you will be manually configuring everything. You could also use our Docker images.

In any case, we only provide support for manual deployments to enterprise sponsors.

For casual users, we strongly suggest installing Mempool using one of the 1-click install methods.

From 24a8cca7587de4e1b61d3ae932b4924903de94bb Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sat, 11 Mar 2023 01:04:35 -0500 Subject: [PATCH 045/782] Add bitcoin-s and edge to community integrations --- .../app/components/about/about.component.html | 10 +++- .../app/components/about/about.component.scss | 4 ++ frontend/src/resources/profile/bitcoin-s.svg | 52 +++++++++++++++++++ frontend/src/resources/profile/edge.svg | 1 + 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 frontend/src/resources/profile/bitcoin-s.svg create mode 100644 frontend/src/resources/profile/edge.svg diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 23fed8dcd..a96856c9c 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -209,7 +209,7 @@ EmbassyOS - + BTCPay @@ -268,6 +268,14 @@ Nunchuk + + + bitcoin-s + + + + Edge +
diff --git a/frontend/src/app/components/about/about.component.scss b/frontend/src/app/components/about/about.component.scss index 2efd2f73b..fb9a22d61 100644 --- a/frontend/src/app/components/about/about.component.scss +++ b/frontend/src/app/components/about/about.component.scss @@ -11,6 +11,10 @@ line-height: 32px; } + .image.not-rounded { + border-radius: 0; + } + .intro { margin: 25px auto 30px; width: 250px; diff --git a/frontend/src/resources/profile/bitcoin-s.svg b/frontend/src/resources/profile/bitcoin-s.svg new file mode 100644 index 000000000..1f4210e4b --- /dev/null +++ b/frontend/src/resources/profile/bitcoin-s.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + diff --git a/frontend/src/resources/profile/edge.svg b/frontend/src/resources/profile/edge.svg new file mode 100644 index 000000000..1bd8f4e70 --- /dev/null +++ b/frontend/src/resources/profile/edge.svg @@ -0,0 +1 @@ + From 3b080ee5fb444f0fff8420f8281cf1f3da96ba4d Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sun, 12 Mar 2023 04:50:51 -0400 Subject: [PATCH 046/782] Add galoy and boltz to community integrations --- .../app/components/about/about.component.html | 8 +++++++ .../app/components/about/about.component.scss | 5 ++++ frontend/src/resources/profile/boltz.svg | 24 +++++++++++++++++++ frontend/src/resources/profile/galoy.svg | 1 + 4 files changed, 38 insertions(+) create mode 100644 frontend/src/resources/profile/boltz.svg create mode 100644 frontend/src/resources/profile/galoy.svg diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index a96856c9c..e50e54b83 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -276,6 +276,14 @@ Edge + + + Galoy + + + + Boltz +
diff --git a/frontend/src/app/components/about/about.component.scss b/frontend/src/app/components/about/about.component.scss index fb9a22d61..78ec5b6a2 100644 --- a/frontend/src/app/components/about/about.component.scss +++ b/frontend/src/app/components/about/about.component.scss @@ -219,3 +219,8 @@ max-width: 965px; margin: auto; } + +.community-integrations-sponsor img.image { + width: 78px; + height: 78px; +} diff --git a/frontend/src/resources/profile/boltz.svg b/frontend/src/resources/profile/boltz.svg new file mode 100644 index 000000000..713209500 --- /dev/null +++ b/frontend/src/resources/profile/boltz.svg @@ -0,0 +1,24 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/resources/profile/galoy.svg b/frontend/src/resources/profile/galoy.svg new file mode 100644 index 000000000..a833d7d4d --- /dev/null +++ b/frontend/src/resources/profile/galoy.svg @@ -0,0 +1 @@ + From ab96a17e8033b3e6b5ea11730a3ebbebae53f234 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sun, 12 Mar 2023 04:59:37 -0400 Subject: [PATCH 047/782] Make non-rounded icons smaller --- frontend/src/app/components/about/about.component.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/app/components/about/about.component.scss b/frontend/src/app/components/about/about.component.scss index 78ec5b6a2..5e191634c 100644 --- a/frontend/src/app/components/about/about.component.scss +++ b/frontend/src/app/components/about/about.component.scss @@ -13,6 +13,8 @@ .image.not-rounded { border-radius: 0; + width: 74px; + height: 74px; } .intro { From a8ac6aedf75aeba51b506cff936bc91eaa8d46d7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 17:36:45 +0900 Subject: [PATCH 048/782] Fix units in flow diagram tooltips for liquid assets --- .../tx-bowtie-graph-tooltip.component.html | 18 +++++++++++++++++- .../tx-bowtie-graph-tooltip.component.ts | 15 ++++++++++++++- .../tx-bowtie-graph.component.html | 1 + .../tx-bowtie-graph.component.ts | 16 ++++++++++++++-- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html index 395c38f88..427cc7c7c 100644 --- a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html +++ b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -56,9 +56,25 @@

Confidential

-

+

+ +

+ +
+ + {{ line.value }} {{ line.asset | slice : 0 : 7 }} + + + + + +

+ + + {{ item.value / pow(10, assetsMinimal[item.asset][3]) | number: '1.' + assetsMinimal[item.asset][3] + '-' + assetsMinimal[item.asset][3] }} {{ assetsMinimal[item.asset][1] }} + \ No newline at end of file diff --git a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.ts b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.ts index b02637ef0..bd669b897 100644 --- a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.ts +++ b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.ts @@ -1,6 +1,8 @@ import { Component, ElementRef, ViewChild, Input, OnChanges, OnInit } from '@angular/core'; import { tap } from 'rxjs'; import { Price, PriceService } from '../../services/price.service'; +import { StateService } from '../../services/state.service'; +import { environment } from '../../../environments/environment'; interface Xput { type: 'input' | 'output' | 'fee'; @@ -16,6 +18,7 @@ interface Xput { pegout?: string; confidential?: boolean; timestamp?: number; + asset?: string; } @Component({ @@ -27,13 +30,19 @@ export class TxBowtieGraphTooltipComponent implements OnChanges { @Input() line: Xput | void; @Input() cursorPosition: { x: number, y: number }; @Input() isConnector: boolean = false; + @Input() assetsMinimal: any; tooltipPosition = { x: 0, y: 0 }; blockConversion: Price; + nativeAssetId = this.stateService.network === 'liquidtestnet' ? environment.nativeTestAssetId : environment.nativeAssetId; + @ViewChild('tooltip') tooltipElement: ElementRef; - constructor(private priceService: PriceService) {} + constructor( + private priceService: PriceService, + private stateService: StateService, + ) {} ngOnChanges(changes): void { if (changes.line?.currentValue) { @@ -60,4 +69,8 @@ export class TxBowtieGraphTooltipComponent implements OnChanges { this.tooltipPosition = { x, y }; } } + + pow(base: number, exponent: number): number { + return Math.pow(base, exponent); + } } diff --git a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.html b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.html index 9360899e6..14e49e21b 100644 --- a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.html +++ b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.html @@ -172,5 +172,6 @@ [line]="hoverLine" [cursorPosition]="tooltipPosition" [isConnector]="hoverConnector" + [assetsMinimal]="assetsMinimal" >
diff --git a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts index b402ddea8..18f13cc15 100644 --- a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts +++ b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts @@ -6,6 +6,7 @@ import { ReplaySubject, merge, Subscription, of } from 'rxjs'; import { tap, switchMap } from 'rxjs/operators'; import { ApiService } from '../../services/api.service'; import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; +import { AssetsService } from '../../services/assets.service'; interface SvgLine { path: string; @@ -30,6 +31,7 @@ interface Xput { pegout?: string; confidential?: boolean; timestamp?: number; + asset?: string; } @Component({ @@ -71,6 +73,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { zeroValueWidth = 60; zeroValueThickness = 20; hasLine: boolean; + assetsMinimal: any; outspendsSubscription: Subscription; refreshOutspends$: ReplaySubject = new ReplaySubject(); @@ -95,6 +98,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { private relativeUrlPipe: RelativeUrlPipe, private stateService: StateService, private apiService: ApiService, + private assetsService: AssetsService, @Inject(LOCALE_ID) private locale: string, ) { if (this.locale.startsWith('ar') || this.locale.startsWith('fa') || this.locale.startsWith('he')) { @@ -105,6 +109,12 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { ngOnInit(): void { this.initGraph(); + if (this.network === 'liquid' || this.network === 'liquidtestnet') { + this.assetsService.getAssetsMinimalJson$.subscribe((assets) => { + this.assetsMinimal = assets; + }); + } + this.outspendsSubscription = merge( this.refreshOutspends$ .pipe( @@ -162,7 +172,8 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { index: i, pegout: v?.pegout?.scriptpubkey_address, confidential: (this.isLiquid && v?.value === undefined), - timestamp: this.tx.status.block_time + timestamp: this.tx.status.block_time, + asset: v?.asset, } as Xput; }); @@ -182,7 +193,8 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { coinbase: v?.is_coinbase, pegin: v?.is_pegin, confidential: (this.isLiquid && v?.prevout?.value === undefined), - timestamp: this.tx.status.block_time + timestamp: this.tx.status.block_time, + asset: v?.prevout?.asset, } as Xput; }); From 8995283a585ff1c7020acf36b8a9dffd0cd4e56a Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sun, 12 Mar 2023 05:12:25 -0400 Subject: [PATCH 049/782] Remove trailing slash --- frontend/src/app/components/about/about.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index cff78a96a..73e7a17a2 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -280,7 +280,7 @@ Galoy - + Boltz From 8bd05987e5ad634ab5f0a588aeb6e63abb9c9642 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 19:03:19 +0900 Subject: [PATCH 050/782] Save cache to disk every 6 blocks --- backend/src/api/blocks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index ea2985b4f..15c8590e9 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -641,7 +641,7 @@ class Blocks { if (this.newBlockCallbacks.length) { this.newBlockCallbacks.forEach((cb) => cb(blockExtended, txIds, transactions)); } - if (!memPool.hasPriority()) { + if (!memPool.hasPriority() && (block.height % 6 === 0)) { diskCache.$saveCacheToDisk(); } From 97d82042c0d3846c239eabb3e8f91b471348a2fa Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sun, 12 Mar 2023 06:03:23 -0400 Subject: [PATCH 051/782] Add mutiny to community integrations --- frontend/src/app/components/about/about.component.html | 4 ++++ frontend/src/resources/profile/mutiny.svg | 3 +++ 2 files changed, 7 insertions(+) create mode 100644 frontend/src/resources/profile/mutiny.svg diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 73e7a17a2..8823f4aa8 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -284,6 +284,10 @@ Boltz + + + Mutiny +
diff --git a/frontend/src/resources/profile/mutiny.svg b/frontend/src/resources/profile/mutiny.svg new file mode 100644 index 000000000..676c4d72c --- /dev/null +++ b/frontend/src/resources/profile/mutiny.svg @@ -0,0 +1,3 @@ + + + From eba0e1c25aae6f022a6c2a941c7aebcd3cf7a811 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sun, 12 Mar 2023 19:13:39 +0900 Subject: [PATCH 052/782] Show cumulated fee on last mempool block --- .../app/components/mempool-blocks/mempool-blocks.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index e1a443680..8a0a06f0c 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -214,6 +214,7 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { lastBlock.feeRange = lastBlock.feeRange.concat(block.feeRange); lastBlock.feeRange.sort((a, b) => a - b); lastBlock.medianFee = this.median(lastBlock.feeRange); + lastBlock.totalFees += block.totalFees; } return blocks; } From a5e281706f2962cfc99305d3ca9f0149576f33a3 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sun, 12 Mar 2023 06:17:50 -0400 Subject: [PATCH 053/782] Make community integration rows symmetric and full --- frontend/src/app/components/about/about.component.scss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/components/about/about.component.scss b/frontend/src/app/components/about/about.component.scss index e538d724b..6873c9437 100644 --- a/frontend/src/app/components/about/about.component.scss +++ b/frontend/src/app/components/about/about.component.scss @@ -13,8 +13,8 @@ .image.not-rounded { border-radius: 0; - width: 74px; - height: 74px; + width: 60px; + height: 60px; } .intro { @@ -228,11 +228,11 @@ } .community-integrations-sponsor { - max-width: 965px; + max-width: 1110px; margin: auto; } .community-integrations-sponsor img.image { - width: 78px; - height: 78px; + width: 64px; + height: 64px; } From 3bf96dafde8333c7c2616e567e6d71a5502e7824 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 19:20:29 +0900 Subject: [PATCH 054/782] Add network versioning to disk cache --- backend/src/api/disk-cache.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index af04d5acb..74b68b6be 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -55,6 +55,7 @@ class DiskCache { const chunkSize = Math.floor(mempoolArray.length / DiskCache.CHUNK_FILES); await fsPromises.writeFile(DiskCache.FILE_NAME, JSON.stringify({ + network: config.MEMPOOL.NETWORK, cacheSchemaVersion: this.cacheSchemaVersion, blocks: blocks.getBlocks(), blockSummaries: blocks.getBlockSummaries(), @@ -98,6 +99,7 @@ class DiskCache { const chunkSize = Math.floor(mempoolArray.length / DiskCache.CHUNK_FILES); fs.writeFileSync(DiskCache.TMP_FILE_NAME, JSON.stringify({ + network: config.MEMPOOL.NETWORK, cacheSchemaVersion: this.cacheSchemaVersion, blocks: blocks.getBlocks(), blockSummaries: blocks.getBlockSummaries(), @@ -160,6 +162,10 @@ class DiskCache { logger.notice('Disk cache contains an outdated schema version. Clearing it and skipping the cache loading.'); return this.wipeCache(); } + if (data.network && data.network !== config.MEMPOOL.NETWORK) { + logger.notice('Disk cache contains data from a different network. Clearing it and skipping the cache loading.'); + return this.wipeCache(); + } if (data.mempoolArray) { for (const tx of data.mempoolArray) { From 9030d952070345865defc0b308e2953047fdb457 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 13 Mar 2023 10:28:26 +0900 Subject: [PATCH 055/782] Fix difficulty skeleton width on firefox --- .../difficulty-mining/difficulty-mining.component.scss | 1 + frontend/src/app/components/difficulty/difficulty.component.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss index c5cd2dc5e..0530bc0cf 100644 --- a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss @@ -38,6 +38,7 @@ flex-direction: row; } .item { + min-width: 120px; max-width: 150px; margin: 0; width: -webkit-fill-available; diff --git a/frontend/src/app/components/difficulty/difficulty.component.scss b/frontend/src/app/components/difficulty/difficulty.component.scss index 9828ba8f5..00085a49c 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.scss +++ b/frontend/src/app/components/difficulty/difficulty.component.scss @@ -46,6 +46,7 @@ flex-direction: row; } .item { + min-width: 120px; max-width: 150px; margin: 0; width: -webkit-fill-available; From 477d09412bdad32a9a64d21426519f7a0767a9aa Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 13 Mar 2023 12:36:00 +0900 Subject: [PATCH 056/782] Pull from transifex --- frontend/src/locale/messages.de.xlf | 513 +++++++++++++++++----------- frontend/src/locale/messages.mk.xlf | 68 +++- frontend/src/locale/messages.pt.xlf | 8 +- 3 files changed, 386 insertions(+), 203 deletions(-) diff --git a/frontend/src/locale/messages.de.xlf b/frontend/src/locale/messages.de.xlf index 7f6a177eb..398f4f60e 100644 --- a/frontend/src/locale/messages.de.xlf +++ b/frontend/src/locale/messages.de.xlf @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,6 +3084,10 @@ Difficulty Adjustment Schwierigkeitsanpassung + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 @@ -3094,11 +3102,11 @@ Remaining Verbleibend - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks Blöcke - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block Block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Schätzung - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Vorherige - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Laufende Periode - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,110 @@ Next Halving Nächste Halbierung - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + Blöcke erwartet + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + Block erwartet + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + Blöcke gefunden + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + Block gefunden + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + verbleibende Blöcke + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + verbleibender Block + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + Blöcke voraus + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + Block voraus + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + Blöcke dahinter + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + Block dahinter + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + Durchschnittliche Blockzeit + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Entweder das 2-fache des Minimums oder die niedrige Prioritätsrate (je nachdem, welcher Wert niedriger ist) @@ -3346,7 +3457,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3466,7 @@ Pool-Ranking src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3479,7 @@ Pool-Dominanz src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3492,7 @@ Hashrate & Schwierigkeit src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3501,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3510,7 @@ Lightning Nodes Pro Netzwerk src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3531,7 @@ Lightning Netzwerk Kapazität src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3552,7 @@ Lightning Nodes Pro ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3565,7 @@ Lightning Nodes Pro Land src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3582,7 @@ Lightning Nodes Weltkarte src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3599,7 @@ Lightning Nodes Kanäle Weltkarte src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3620,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3654,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -4115,7 +4226,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4450,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4459,7 @@ Umkehren src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4468,7 @@ Transaktion vBytes pro Sekunde (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4476,188 @@ Just now Gerade eben - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago Vor - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Nach - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - In ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4791,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4810,7 @@ Mehr anzeigen src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4827,7 @@ Weniger anzeigen src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4840,7 @@ Diagramm anzeigen src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4849,7 @@ Sperrzeit src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4858,7 @@ Transaktion nicht gefunden. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4867,7 @@ Warten bis sie im Mempool erscheint... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4876,7 @@ Effektiver Gebührensatz src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5331,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5342,7 @@ REST-API-Dienst src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5351,11 @@ Endpunkt src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5364,11 @@ Beschreibung src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5376,7 @@ Standard Senden: action: 'want', data: ['blocks', ...] um auszudrücken, was gepusht werden soll. Verfügbar: blocks, mempool-blocks, live-2h-chart, und stats.Sende Transaktionen bezogen auf die Adresse: 'track-address': '3PbJ...bF9B' um alle neuen Transaktionen mit der Adresse als Input oder Output enthalten zu empfangen. Gibt Array von Tansaktionen zurück. address-transactions für neue Mempool-Transaktionen, und block-transactions src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5558,6 +5665,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -6079,6 +6194,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 diff --git a/frontend/src/locale/messages.mk.xlf b/frontend/src/locale/messages.mk.xlf index c0fe07715..7ee9b19ae 100644 --- a/frontend/src/locale/messages.mk.xlf +++ b/frontend/src/locale/messages.mk.xlf @@ -2365,6 +2365,7 @@ Marginal fee rate + Маргинална стапка на провизија src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 40 @@ -2653,6 +2654,7 @@ Health + Вистинитост src/app/components/block/block.component.html 56 @@ -3072,7 +3074,7 @@ Change - Промена + Промена во % src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html 8,11 @@ -3496,6 +3498,7 @@ Lightning + Lightning src/app/components/graphs/graphs.component.html 30 @@ -3504,6 +3507,7 @@ Lightning Nodes Per Network + Lightning Нодови по Мрежа src/app/components/graphs/graphs.component.html 33 @@ -3524,6 +3528,7 @@ Lightning Network Capacity + Капацитет на Lightning Мрежата src/app/components/graphs/graphs.component.html 35 @@ -3544,6 +3549,7 @@ Lightning Nodes Per ISP + Lightning Нодови по ISP src/app/components/graphs/graphs.component.html 37 @@ -3556,6 +3562,7 @@ Lightning Nodes Per Country + Lightning Нодови по Држава src/app/components/graphs/graphs.component.html 39 @@ -3572,6 +3579,7 @@ Lightning Nodes World Map + Мапа на Lightning Нодови src/app/components/graphs/graphs.component.html 41 @@ -3588,6 +3596,7 @@ Lightning Nodes Channels World Map + Мапа на Lightning Канали src/app/components/graphs/graphs.component.html 43 @@ -3850,7 +3859,7 @@ The overall luck of all mining pools over the past week. A luck bigger than 100% means the average block time for the current epoch is less than 10 minutes. - Целокупната среќа на сите пулови за копање во текот на изминатата недела. Среќа поголема од 100% значи дека просечното време на пронаоѓање на блок за тековната епоха е помалку од 10 минути. + Целокупната среќа на сите мајнинг пулови во текот на изминатата недела. Среќа поголема од 100% значи дека просечното време на пронаоѓање на блок за тековната епоха е помалку од 10 минути. src/app/components/pool-ranking/pool-ranking.component.html 11,15 @@ -3929,6 +3938,7 @@ Avg Health + Прос. Вистинитост src/app/components/pool-ranking/pool-ranking.component.html 96,97 @@ -3977,6 +3987,7 @@ Mining Pools + Мајнинг Пул src/app/components/pool-ranking/pool-ranking.component.ts 58 @@ -3996,6 +4007,7 @@ mining pool + мајнинг пул src/app/components/pool/pool-preview.component.html 3,5 @@ -4386,6 +4398,7 @@ Lightning Nodes + Lightning Нодови src/app/components/search-form/search-results/search-results.component.html 35 @@ -4394,6 +4407,7 @@ Lightning Channels + Lightning Канали src/app/components/search-form/search-results/search-results.component.html 43 @@ -4402,7 +4416,7 @@ Go to "" - Оди на &quot;&quot; + Оди на "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -5465,6 +5479,7 @@ This channel supports zero base fee routing + Овој канал поддржува рутирање со нулта основна провизија src/app/lightning/channel/channel-box/channel-box.component.html 44 @@ -5473,6 +5488,7 @@ Zero base fee + Нулта основна провизија src/app/lightning/channel/channel-box/channel-box.component.html 45 @@ -5481,6 +5497,7 @@ This channel does not support zero base fee routing + Овој канал не поддржува рутирање со нулта основна провизија src/app/lightning/channel/channel-box/channel-box.component.html 50 @@ -5489,6 +5506,7 @@ Non-zero base fee + Не-нулта основна провизија src/app/lightning/channel/channel-box/channel-box.component.html 51 @@ -5515,6 +5533,7 @@ Timelock delta + Делта за временско заклучување src/app/lightning/channel/channel-box/channel-box.component.html 69 @@ -5556,6 +5575,7 @@ lightning channel + lightning канал src/app/lightning/channel/channel-preview.component.html 3,5 @@ -5718,6 +5738,7 @@ Lightning channel + Lightning канал src/app/lightning/channel/channel.component.html 4,7 @@ -6036,6 +6057,7 @@ Med Capacity + Среден Капацитет src/app/lightning/channels-statistics/channels-statistics.component.html 59,61 @@ -6044,6 +6066,7 @@ Med Fee Rate + Средна Стапка на Провизија src/app/lightning/channels-statistics/channels-statistics.component.html 72,74 @@ -6052,6 +6075,7 @@ The median fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + Средна стапка на провизија наплатена од рутирачките нодови, игнорирајќи ги стапките на провизија > 0,5% или 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 74,76 @@ -6060,6 +6084,7 @@ Med Base Fee + Средна Основна Провизија src/app/lightning/channels-statistics/channels-statistics.component.html 87,89 @@ -6068,6 +6093,7 @@ The median base fee charged by routing nodes, ignoring base fees > 5000ppm + Средна стапка на основна провизија наплатена од рутирачките нодови, игнорирајќи основни провизии > 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 89,91 @@ -6076,6 +6102,7 @@ Lightning node group + Група на lightning нодови src/app/lightning/group/group-preview.component.html 3,5 @@ -6088,6 +6115,7 @@ Nodes + Нодови src/app/lightning/group/group-preview.component.html 25,29 @@ -6124,6 +6152,7 @@ Liquidity + Ликвидност src/app/lightning/group/group-preview.component.html 29,31 @@ -6297,6 +6326,7 @@ Lightning Network History + Историја на Lightning Мрежата src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 49 @@ -6305,6 +6335,7 @@ Liquidity Ranking + Рангирање по Ликвидност src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 @@ -6329,6 +6360,7 @@ Connectivity Ranking + Рангирање по Поврзаност src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 76 @@ -6391,6 +6423,7 @@ Lightning node + Lightning нод src/app/lightning/node/node-preview.component.html 3,5 @@ -6469,7 +6502,7 @@ ISP - Оператор + ISP src/app/lightning/node/node.component.html 89,90 @@ -6491,6 +6524,7 @@ Liquidity ad + Реклама за ликвидност src/app/lightning/node/node.component.html 141,144 @@ -6499,6 +6533,7 @@ Lease fee rate + Стапка на провизија за наем src/app/lightning/node/node.component.html 147,150 @@ -6508,6 +6543,7 @@ Lease base fee + Основна провизија за наем src/app/lightning/node/node.component.html 155,157 @@ -6525,6 +6561,7 @@ Channel fee rate + Стапка на провизија за канал src/app/lightning/node/node.component.html 171,174 @@ -6534,6 +6571,7 @@ Channel base fee + Основна провизија за канал src/app/lightning/node/node.component.html 179,181 @@ -6542,6 +6580,7 @@ Compact lease + Компактен наем src/app/lightning/node/node.component.html 191,193 @@ -6550,6 +6589,7 @@ TLV extension records + Записи за продолжување на TLV src/app/lightning/node/node.component.html 202,205 @@ -6576,6 +6616,7 @@ Node: + Нод: src/app/lightning/node/node.component.ts 60 @@ -6583,6 +6624,7 @@ (Tor nodes excluded) + (Без Tor нодовите) src/app/lightning/nodes-channels-map/nodes-channels-map.component.html 8,11 @@ -6603,6 +6645,7 @@ Lightning Nodes Channels World Map + Мапа на Lightning Канали src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 69 @@ -6639,6 +6682,7 @@ Clearnet and Darknet + Clearnet и Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6650,6 +6694,7 @@ Clearnet Only (IPv4, IPv6) + Само Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6661,6 +6706,7 @@ Darknet Only (Tor, I2P, cjdns) + Само Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6685,6 +6731,7 @@ nodes + нодови src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 103,102 @@ -6708,6 +6755,7 @@ Lightning nodes in + Lightning нодови во src/app/lightning/nodes-per-country/nodes-per-country.component.html 3,4 @@ -6734,6 +6782,7 @@ Lightning nodes in + Lightning нодови во src/app/lightning/nodes-per-country/nodes-per-country.component.ts 35 @@ -6741,6 +6790,7 @@ Clearnet Capacity + Капацитет на Clearnet src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6753,6 +6803,7 @@ How much liquidity is running on nodes advertising at least one clearnet IP address + Колку ликвидност има на нодовите кои имаат барем една clearnert IP адреса src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 8,9 @@ -6774,6 +6825,7 @@ How much liquidity is running on nodes which ISP was not identifiable + Колку ликвидност има на нодовите на кои интернет провајдерот не може да се идентификува src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 15,16 @@ -6795,6 +6847,7 @@ How much liquidity is running on nodes advertising only Tor addresses + Колку ликвидност има на нодовите кои се на Tor мрежата src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 22,23 @@ -6803,6 +6856,7 @@ Top 100 ISPs hosting LN nodes + Топ 100 ISPs кои хостираат LN нодови src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 31,33 @@ -6823,6 +6877,7 @@ Lightning ISP + Lightning ISP src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 3,5 @@ -6844,6 +6899,7 @@ Top node + Топ нод src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 45,48 @@ -6852,6 +6908,7 @@ Lightning nodes on ISP: [AS] + Lightning нодови на ISP: [AS] src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts 44 @@ -6863,6 +6920,7 @@ Lightning nodes on ISP: + Lightning нодови на ISP: src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 2,4 @@ -6889,6 +6947,7 @@ Top 100 oldest lightning nodes + Топ 100 најстари lightning нодови src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.html 3,7 @@ -6897,6 +6956,7 @@ Oldest lightning nodes + Најстари lightning нодови src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.ts 27 diff --git a/frontend/src/locale/messages.pt.xlf b/frontend/src/locale/messages.pt.xlf index 542fe6b24..1d7764f84 100644 --- a/frontend/src/locale/messages.pt.xlf +++ b/frontend/src/locale/messages.pt.xlf @@ -1440,7 +1440,7 @@ The Mempool Open Source Project - O Projeto de código aberto da Mempool + O Projeto de código aberto Mempool src/app/components/about/about.component.html 12,13 @@ -3921,7 +3921,7 @@ Rank - Rank + Ranking src/app/components/pool-ranking/pool-ranking.component.html 90,92 @@ -4416,7 +4416,7 @@ Go to "" - Go to "" + Ir para "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -6812,7 +6812,7 @@ Unknown Capacity - Capacidade Desconhecida + Capacidade Oculta src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 13,15 From 130ae8c3a5562ad38a0015b89d8f40f665c728a2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 13 Mar 2023 12:48:01 +0900 Subject: [PATCH 057/782] Hide features row if tx has no features --- .../transaction/transaction.component.html | 3 ++- .../transaction/transaction.component.ts | 23 +++++++++++++++++++ .../tx-features/tx-features.component.html | 6 ++--- .../tx-features/tx-features.component.ts | 7 ++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index ec08c9303..04d13b07a 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -67,7 +67,7 @@
- + Features @@ -468,6 +468,7 @@ + diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 899f5ee6b..c60d796e4 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -74,6 +74,12 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { flowEnabled: boolean; blockConversion: Price; tooltipPosition: { x: number, y: number }; + isMobile: boolean; + + featuresEnabled: boolean; + segwitEnabled: boolean; + rbfEnabled: boolean; + taprootEnabled: boolean; @ViewChild('graphContainer') graphContainer: ElementRef; @@ -197,6 +203,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } this.tx = tx; + this.setFeatures(); this.isCached = true; if (tx.fee === undefined) { this.tx.fee = 0; @@ -291,6 +298,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } this.tx = tx; + this.setFeatures(); this.isCached = false; if (tx.fee === undefined) { this.tx.fee = 0; @@ -428,9 +436,23 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { }); } + setFeatures(): void { + if (this.tx) { + this.segwitEnabled = !this.tx.status.confirmed || this.tx.status.block_height >= 477120; + this.taprootEnabled = !this.tx.status.confirmed || this.tx.status.block_height >= 709632; + this.rbfEnabled = !this.tx.status.confirmed || this.tx.status.block_height > 399700; + } else { + this.segwitEnabled = false; + this.taprootEnabled = false; + this.rbfEnabled = false; + } + this.featuresEnabled = this.segwitEnabled || this.taprootEnabled || this.rbfEnabled; + } + resetTransaction() { this.error = undefined; this.tx = null; + this.setFeatures(); this.waitingForTransaction = false; this.isLoadingTx = true; this.rbfTransaction = undefined; @@ -495,6 +517,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { @HostListener('window:resize', ['$event']) setGraphSize(): void { + this.isMobile = window.innerWidth < 850; if (this.graphContainer) { setTimeout(() => { this.graphWidth = this.graphContainer.nativeElement.clientWidth; diff --git a/frontend/src/app/components/tx-features/tx-features.component.html b/frontend/src/app/components/tx-features/tx-features.component.html index 54df244b2..e9e7a3b53 100644 --- a/frontend/src/app/components/tx-features/tx-features.component.html +++ b/frontend/src/app/components/tx-features/tx-features.component.html @@ -1,4 +1,4 @@ - + SegWit SegWit @@ -8,7 +8,7 @@ - + Taproot Taproot @@ -24,7 +24,7 @@ - + RBF RBF diff --git a/frontend/src/app/components/tx-features/tx-features.component.ts b/frontend/src/app/components/tx-features/tx-features.component.ts index 8f7d30b12..9376a0c7c 100644 --- a/frontend/src/app/components/tx-features/tx-features.component.ts +++ b/frontend/src/app/components/tx-features/tx-features.component.ts @@ -21,12 +21,19 @@ export class TxFeaturesComponent implements OnChanges { isRbfTransaction: boolean; isTaproot: boolean; + segwitEnabled: boolean; + rbfEnabled: boolean; + taprootEnabled: boolean; + constructor() { } ngOnChanges() { if (!this.tx) { return; } + this.segwitEnabled = !this.tx.status.confirmed || this.tx.status.block_height >= 477120; + this.taprootEnabled = !this.tx.status.confirmed || this.tx.status.block_height >= 709632; + this.rbfEnabled = !this.tx.status.confirmed || this.tx.status.block_height > 399700; this.segwitGains = calcSegwitFeeGains(this.tx); this.isRbfTransaction = this.tx.vin.some((v) => v.sequence < 0xfffffffe); this.isTaproot = this.tx.vin.some((v) => v.prevout && v.prevout.scriptpubkey_type === 'v1_p2tr'); From 739253518203974f68f063a226ddd6048a74059f Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 13 Mar 2023 12:58:35 +0900 Subject: [PATCH 058/782] i18n extract --- frontend/src/locale/messages.xlf | 38 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index e040e7bc9..3e1521b92 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -691,11 +691,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -715,11 +715,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -744,7 +744,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1380,7 +1380,7 @@ Community Alliances src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1388,7 +1388,7 @@ Project Translators src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1396,7 +1396,7 @@ Project Contributors src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1404,7 +1404,7 @@ Project Members src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1412,7 +1412,7 @@ Project Maintainers src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2056,7 +2056,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2884,7 +2884,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3513,7 +3513,7 @@ Reward stats src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3521,7 +3521,7 @@ (144 blocks) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3529,7 +3529,7 @@ Latest blocks src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3541,7 +3541,7 @@ Adjustments src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3549,7 +3549,7 @@ Broadcast Transaction src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -5372,7 +5372,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5500,7 +5500,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html From 99b7fc8814637843057d655c3e2f6b4c5ccd2135 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 13 Mar 2023 13:03:57 +0900 Subject: [PATCH 059/782] Ninja i18n pull --- frontend/src/locale/messages.sv.xlf | 42 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/frontend/src/locale/messages.sv.xlf b/frontend/src/locale/messages.sv.xlf index 644b9c248..9d7689760 100644 --- a/frontend/src/locale/messages.sv.xlf +++ b/frontend/src/locale/messages.sv.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1449,7 +1449,7 @@ Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties. - Vår mempool- och blockchainutforskare för bitcoincommunitit, med fokus på marknaden för transaktionsavgifter och multilagerekosystemet, helt självhostad utan betrodda tredjeparttjänster. + Mempool- och blockchainutforskare för bitcoiners, med fokus på marknaden för transaktionsavgifter och flerlagerekosystemet, helt självhostad utan betrodda tredjeparttjänster. src/app/components/about/about.component.html 13,16 @@ -1487,7 +1487,7 @@ Communityallianser src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Projektöversättare src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Projektbidragare src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Projektmedlemmar src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Projektunderhållare src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -3094,7 +3094,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3293,7 +3293,7 @@ Average block time - Average block time + Genomsnittlig blocktid src/app/components/difficulty/difficulty.component.html 42,45 @@ -3778,7 +3778,7 @@ Belöningsstats src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3787,7 +3787,7 @@ (144 block) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3796,7 +3796,7 @@ Senaste blocken src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3809,7 +3809,7 @@ Justeringar src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3818,7 +3818,7 @@ Publicera transaktion src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -5791,7 +5791,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5932,7 +5932,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html From 96a41400f4b915e27fed2e52c436076300672275 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 9 Mar 2023 03:36:14 -0600 Subject: [PATCH 060/782] Add axios support for esplora unix sockets --- backend/mempool-config.sample.json | 3 ++- backend/src/__fixtures__/mempool-config.template.json | 3 ++- backend/src/__tests__/config.test.ts | 2 +- backend/src/api/bitcoin/esplora-api.ts | 7 +++++-- backend/src/config.ts | 2 ++ docker/README.md | 4 +++- docker/backend/mempool-config.json | 3 ++- docker/backend/start.sh | 2 ++ 8 files changed, 19 insertions(+), 7 deletions(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index 2369b64b5..cd2afb0bd 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -41,7 +41,8 @@ "TLS_ENABLED": true }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:3000" + "REST_API_URL": "http://127.0.0.1:3000", + "UNIX_SOCKET_PATH": "/tmp/esplora-bitcoin-mainnet" }, "SECOND_CORE_RPC": { "HOST": "127.0.0.1", diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 2bf52cbcf..ab0e40416 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -42,7 +42,8 @@ "TLS_ENABLED": true }, "ESPLORA": { - "REST_API_URL": "__ESPLORA_REST_API_URL__" + "REST_API_URL": "__ESPLORA_REST_API_URL__", + "UNIX_SOCKET_PATH": "__ESPLORA_UNIX_SOCKET_PATH__" }, "SECOND_CORE_RPC": { "HOST": "__SECOND_CORE_RPC_HOST__", diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 5717808dd..d28f144ce 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -46,7 +46,7 @@ describe('Mempool Backend Config', () => { expect(config.ELECTRUM).toStrictEqual({ HOST: '127.0.0.1', PORT: 3306, TLS_ENABLED: true }); - expect(config.ESPLORA).toStrictEqual({ REST_API_URL: 'http://127.0.0.1:3000' }); + expect(config.ESPLORA).toStrictEqual({ REST_API_URL: 'http://127.0.0.1:3000', UNIX_SOCKET_PATH: null }); expect(config.CORE_RPC).toStrictEqual({ HOST: '127.0.0.1', diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 0366695d1..ff6219587 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -5,11 +5,14 @@ import { AbstractBitcoinApi } from './bitcoin-api-abstract-factory'; import { IEsploraApi } from './esplora-api.interface'; const axiosConnection = axios.create({ - httpAgent: new http.Agent({ keepAlive: true }) + httpAgent: new http.Agent({ keepAlive: true, }) }); class ElectrsApi implements AbstractBitcoinApi { - axiosConfig: AxiosRequestConfig = { + axiosConfig: AxiosRequestConfig = config.ESPLORA.UNIX_SOCKET_PATH ? { + socketPath: config.ESPLORA.UNIX_SOCKET_PATH, + timeout: 10000, + } : { timeout: 10000, }; diff --git a/backend/src/config.ts b/backend/src/config.ts index 8ccd7e2e4..c0e3d297c 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -36,6 +36,7 @@ interface IConfig { }; ESPLORA: { REST_API_URL: string; + UNIX_SOCKET_PATH: string | void | null; }; LIGHTNING: { ENABLED: boolean; @@ -158,6 +159,7 @@ const defaults: IConfig = { }, 'ESPLORA': { 'REST_API_URL': 'http://127.0.0.1:3000', + 'UNIX_SOCKET_PATH': null, }, 'ELECTRUM': { 'HOST': '127.0.0.1', diff --git a/docker/README.md b/docker/README.md index 468d8069b..9389d32c0 100644 --- a/docker/README.md +++ b/docker/README.md @@ -199,7 +199,8 @@ Corresponding `docker-compose.yml` overrides: `mempool-config.json`: ```json "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:3000" + "REST_API_URL": "http://127.0.0.1:3000", + "UNIX_SOCKET_PATH": "/tmp/esplora-socket" }, ``` @@ -208,6 +209,7 @@ Corresponding `docker-compose.yml` overrides: api: environment: ESPLORA_REST_API_URL: "" + ESPLORA_UNIX_SOCKET_PATH: "" ... ``` diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 78a2c116b..e8ab87d92 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -40,7 +40,8 @@ "TLS_ENABLED": __ELECTRUM_TLS_ENABLED__ }, "ESPLORA": { - "REST_API_URL": "__ESPLORA_REST_API_URL__" + "REST_API_URL": "__ESPLORA_REST_API_URL__", + "UNIX_SOCKET_PATH": "__ESPLORA_UNIX_SOCKET_PATH__" }, "SECOND_CORE_RPC": { "HOST": "__SECOND_CORE_RPC_HOST__", diff --git a/docker/backend/start.sh b/docker/backend/start.sh index ee5069386..76a89610b 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -45,6 +45,7 @@ __ELECTRUM_TLS_ENABLED__=${ELECTRUM_TLS_ENABLED:=false} # ESPLORA __ESPLORA_REST_API_URL__=${ESPLORA_REST_API_URL:=http://127.0.0.1:3000} +__ESPLORA_UNIX_SOCKET_PATH__=${ESPLORA_UNIX_SOCKET_PATH:=null} # SECOND_CORE_RPC __SECOND_CORE_RPC_HOST__=${SECOND_CORE_RPC_HOST:=127.0.0.1} @@ -155,6 +156,7 @@ sed -i "s/__ELECTRUM_PORT__/${__ELECTRUM_PORT__}/g" mempool-config.json sed -i "s/__ELECTRUM_TLS_ENABLED__/${__ELECTRUM_TLS_ENABLED__}/g" mempool-config.json sed -i "s!__ESPLORA_REST_API_URL__!${__ESPLORA_REST_API_URL__}!g" mempool-config.json +sed -i "s!__ESPLORA_UNIX_SOCKET_PATH__!${__ESPLORA_UNIX_SOCKET_PATH__}!g" mempool-config.json sed -i "s/__SECOND_CORE_RPC_HOST__/${__SECOND_CORE_RPC_HOST__}/g" mempool-config.json sed -i "s/__SECOND_CORE_RPC_PORT__/${__SECOND_CORE_RPC_PORT__}/g" mempool-config.json From 7970f4ae8813333458e2736a62ae0f9ac93d27d1 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 7 Mar 2023 17:19:16 +0900 Subject: [PATCH 061/782] ops: Use unix sockets to query esplora from nginx --- production/electrs-start-liquid | 2 +- production/electrs-start-liquidtestnet | 2 +- production/electrs-start-mainnet | 2 +- production/electrs-start-signet | 2 +- production/electrs-start-testnet | 2 +- production/install | 150 +++++++++---------- production/mempool-config.liquid.json | 2 +- production/mempool-config.liquidtestnet.json | 2 +- production/mempool-config.mainnet.json | 2 +- production/mempool-config.signet.json | 2 +- production/mempool-config.testnet.json | 2 +- production/newsyslog-mempool-nginx.conf | 16 +- production/nginx/upstream-esplora.conf | 10 +- 13 files changed, 97 insertions(+), 99 deletions(-) diff --git a/production/electrs-start-liquid b/production/electrs-start-liquid index a59004478..a28135836 100755 --- a/production/electrs-start-liquid +++ b/production/electrs-start-liquid @@ -17,7 +17,7 @@ do --db-dir __ELECTRS_DATA_ROOT__ \ --network liquid \ --daemon-dir "${HOME}" \ - --http-addr '[::]:3001' \ + --http-socket-file '/elements/socket/esplora-liquid-mainnet' \ --cookie '__ELEMENTS_RPC_USER__:__ELEMENTS_RPC_PASS__' \ --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" sleep 1 diff --git a/production/electrs-start-liquidtestnet b/production/electrs-start-liquidtestnet index a3da2c2b4..828e96533 100755 --- a/production/electrs-start-liquidtestnet +++ b/production/electrs-start-liquidtestnet @@ -17,7 +17,7 @@ do --db-dir __ELECTRS_DATA_ROOT__ \ --network liquidtestnet \ --daemon-dir "${HOME}" \ - --http-addr '[::]:3004' \ + --http-socket-file '/elements/socket/esplora-liquid-testnet' \ --cookie '__ELEMENTS_RPC_USER__:__ELEMENTS_RPC_PASS__' \ --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" sleep 1 diff --git a/production/electrs-start-mainnet b/production/electrs-start-mainnet index 32227afd2..c6a8c4d54 100755 --- a/production/electrs-start-mainnet +++ b/production/electrs-start-mainnet @@ -14,7 +14,7 @@ do --cors '*' \ --db-dir __ELECTRS_DATA_ROOT__ \ --daemon-dir "${HOME}" \ - --http-addr '[::]:3000' \ + --http-socket-file '/bitcoin/socket/esplora-bitcoin-mainnet' \ --cookie '__BITCOIN_RPC_USER__:__BITCOIN_RPC_PASS__' \ --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" diff --git a/production/electrs-start-signet b/production/electrs-start-signet index c37b670f6..40e1d1115 100755 --- a/production/electrs-start-signet +++ b/production/electrs-start-signet @@ -16,7 +16,7 @@ do --db-dir __ELECTRS_DATA_ROOT__ \ --daemon-rpc-addr '127.0.0.1:38332' \ --daemon-dir "${HOME}" \ - --http-addr '[::]:3003' \ + --http-socket-file '/bitcoin/socket/esplora-bitcoin-signet' \ --cookie '__BITCOIN_RPC_USER__:__BITCOIN_RPC_PASS__' \ --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" sleep 1 diff --git a/production/electrs-start-testnet b/production/electrs-start-testnet index 42e057a52..ce05de2de 100755 --- a/production/electrs-start-testnet +++ b/production/electrs-start-testnet @@ -15,7 +15,7 @@ do --cors '*' \ --db-dir __ELECTRS_DATA_ROOT__ \ --daemon-dir "${HOME}" \ - --http-addr '[::]:3002' \ + --http-socket-file '/bitcoin/socket/esplora-bitcoin-testnet' \ --cookie '__BITCOIN_RPC_USER__:__BITCOIN_RPC_PASS__' \ --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" diff --git a/production/install b/production/install index fb47629d4..d4f72c03c 100755 --- a/production/install +++ b/production/install @@ -192,6 +192,7 @@ case $OS in TOR_USER=_tor TOR_GROUP=_tor NGINX_USER=www + NGINX_GROUP=www NGINX_ETC_FOLDER=/usr/local/etc/nginx NGINX_CONFIGURATION=/usr/local/etc/nginx/nginx.conf CERTBOT_PKG=py39-certbot @@ -209,6 +210,7 @@ case $OS in TOR_GROUP=debian-tor CERTBOT_PKG=python3-certbot-nginx NGINX_USER=www-data + NGINX_GROUP=www-data NGINX_ETC_FOLDER=/etc/nginx NGINX_CONFIGURATION=/etc/nginx/nginx.conf ;; @@ -301,12 +303,6 @@ BISQ_HOME=/bisq # tor HS folder BISQ_TOR_HS=bisq -# Unfurl user/group -UNFURL_USER=unfurl -UNFURL_GROUP=unfurl -# Unfurl home folder -UNFURL_HOME=/unfurl - # liquid user/group ELEMENTS_USER=elements ELEMENTS_GROUP=elements @@ -396,7 +392,7 @@ DEBIAN_UNFURL_PKG+=(libxdamage-dev libxrandr-dev libgbm-dev libpango1.0-dev liba # packages needed for mempool ecosystem FREEBSD_PKG=() FREEBSD_PKG+=(zsh sudo git git-lfs screen curl wget calc neovim) -FREEBSD_PKG+=(openssh-portable py39-pip rust llvm90 jq base64 libzmq4) +FREEBSD_PKG+=(openssh-portable py39-pip rust llvm10 jq base64 libzmq4) FREEBSD_PKG+=(boost-libs autoconf automake gmake gcc libevent libtool pkgconf) FREEBSD_PKG+=(nginx rsync py39-certbot-nginx mariadb105-server keybase) FREEBSD_PKG+=(geoipupdate) @@ -547,6 +543,12 @@ zfsCreateFilesystems() zfs create -o "mountpoint=${ELEMENTS_HOME}/liquidv1" "${ZPOOL}/elements/liquidv1" zfs create -o "mountpoint=${ELEMENTS_ELECTRS_HOME}" "${ZPOOL}/elements/electrs" + # create /bitcoin/socket with custom ACL for electrs unix sockets + zfs create -o "mountpoint=${BITCOIN_HOME}/socket" "${ZPOOL}/bitcoin/socket" + + # create /elements/socket with custom ACL for electrs unix sockets + zfs create -o "mountpoint=${ELEMENTS_HOME}/socket" "${ZPOOL}/elements/socket" + # Bitcoin Mainnet if [ "${BITCOIN_MAINNET_ENABLE}" = ON ];then for folder in chainstate indexes blocks @@ -630,6 +632,7 @@ zfsCreateFilesystems() ext4CreateDir() { mkdir -p "/backup" "${ELEMENTS_HOME}" "${BITCOIN_HOME}" "${MINFEE_HOME}" "${ELECTRS_HOME}" "${MEMPOOL_HOME}" "${MYSQL_HOME}" "${BITCOIN_ELECTRS_HOME}" "${ELEMENTS_HOME}/liquidv1" "${ELEMENTS_ELECTRS_HOME}" + # Bitcoin Mainnet if [ "${BITCOIN_MAINNET_ENABLE}" = ON ];then for folder in chainstate indexes blocks @@ -1019,7 +1022,7 @@ case $OS in osSudo "${ROOT_USER}" mkdir -p /usr/local/etc/syslog.d osSudo "${ROOT_USER}" install -c -m 755 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/mempool-logger" /usr/local/bin/mempool-logger osSudo "${ROOT_USER}" install -c -m 644 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/syslog.conf" /usr/local/etc/syslog.d/mempool.conf - + echo "[*] Installing newsyslog configuration" osSudo "${ROOT_USER}" mkdir -p /usr/local/etc/newsyslog.conf.d osSudo "${ROOT_USER}" install -c -m 644 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/newsyslog-mempool-backend.conf" /usr/local/etc/newsyslog.conf.d/newsyslog-mempool-backend.conf @@ -1057,17 +1060,8 @@ if [ "${TOR_INSTALL}" = ON ];then osSudo "${ROOT_USER}" install -c -m 644 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/torrc" "${TOR_CONFIGURATION}" osSudo "${ROOT_USER}" sed -i.orig "s!__TOR_RESOURCES__!${TOR_RESOURCES}!" "${TOR_CONFIGURATION}" - echo "[*] Adding Tor HS configuration for Mempool" - if [ "${MEMPOOL_ENABLE}" = "ON" ];then - if ! grep "${MEMPOOL_TOR_HS}" "${TOR_CONFIGURATION}" >/dev/null 2>&1;then - osSudo "${ROOT_USER}" /bin/sh -c "echo HiddenServiceDir ${TOR_RESOURCES}/${MEMPOOL_TOR_HS}/ >> ${TOR_CONFIGURATION}" - osSudo "${ROOT_USER}" /bin/sh -c "echo HiddenServicePort 80 127.0.0.1:81 >> ${TOR_CONFIGURATION}" - osSudo "${ROOT_USER}" /bin/sh -c "echo HiddenServiceVersion 3 >> ${TOR_CONFIGURATION}" - fi - fi - echo "[*] Adding Tor HS configuration for Bisq" - if [ "${BISQ_ENABLE}" = "ON" ];then + if [ "${BISQ_MAINNET_ENABLE}" = "ON" ];then if ! grep "${BISQ_TOR_HS}" "${TOR_CONFIGURATION}" >/dev/null 2>&1;then osSudo "${ROOT_USER}" /bin/sh -c "echo HiddenServiceDir ${TOR_RESOURCES}/${BISQ_TOR_HS}/ >> ${TOR_CONFIGURATION}" osSudo "${ROOT_USER}" /bin/sh -c "echo HiddenServicePort 80 127.0.0.1:82 >> ${TOR_CONFIGURATION}" @@ -1076,7 +1070,7 @@ if [ "${TOR_INSTALL}" = ON ];then fi echo "[*] Adding Tor HS configuration for Liquid" - if [ "${LIQUID_ENABLE}" = "ON" ];then + if [ "${ELEMENTS_LIQUID_ENABLE}" = "ON" ];then if ! grep "${LIQUID_TOR_HS}" "${TOR_CONFIGURATION}" >/dev/null 2>&1;then osSudo "${ROOT_USER}" /bin/sh -c "echo HiddenServiceDir ${TOR_RESOURCES}/${LIQUID_TOR_HS}/ >> ${TOR_CONFIGURATION}" osSudo "${ROOT_USER}" /bin/sh -c "echo HiddenServicePort 80 127.0.0.1:83 >> ${TOR_CONFIGURATION}" @@ -1273,25 +1267,25 @@ if [ "${ELEMENTS_ELECTRS_INSTALL}" = ON ];then if [ "${ELEMENTS_LIQUIDTESTNET_ENABLE}" = ON ];then osSudo "${ROOT_USER}" chown -R "${ELEMENTS_USER}:${ELEMENTS_GROUP}" "${ELECTRS_LIQUIDTESTNET_DATA}" fi - + echo "[*] Cloning Liquid Electrs repo from ${ELEMENTS_ELECTRS_REPO_URL}" osSudo "${ELEMENTS_USER}" git config --global advice.detachedHead false osSudo "${ELEMENTS_USER}" git clone --branch "${ELEMENTS_ELECTRS_REPO_BRANCH}" "${ELEMENTS_ELECTRS_REPO_URL}" "${ELEMENTS_HOME}/${ELEMENTS_ELECTRS_REPO_NAME}" - + echo "[*] Checking out Liquid Electrs ${ELEMENTS_ELECTRS_LATEST_RELEASE}" osSudo "${ELEMENTS_USER}" sh -c "cd ${ELEMENTS_HOME}/${ELEMENTS_ELECTRS_REPO_NAME} && git checkout ${ELEMENTS_ELECTRS_LATEST_RELEASE}" - + echo "[*] Cloning Liquid Asset Registry repo from ${LIQUID_ASSET_REGISTRY_DB_URL}" osSudo "${ELEMENTS_USER}" git config --global advice.detachedHead false osSudo "${ELEMENTS_USER}" git clone "${LIQUID_ASSET_REGISTRY_DB_URL}" "${ELEMENTS_HOME}/${LIQUID_ASSET_REGISTRY_DB_NAME}" - + echo "[*] Cloning Liquid Asset Registry testnet repo from ${LIQUIDTESTNET_ASSET_REGISTRY_DB_URL}" osSudo "${ELEMENTS_USER}" git config --global advice.detachedHead false osSudo "${ELEMENTS_USER}" git clone "${LIQUIDTESTNET_ASSET_REGISTRY_DB_URL}" "${ELEMENTS_HOME}/${LIQUIDTESTNET_ASSET_REGISTRY_DB_NAME}" - + echo "[*] Building Liquid Electrs release binary" osSudo "${ELEMENTS_USER}" sh -c "cd ${ELEMENTS_ELECTRS_HOME} && cargo run --release --features liquid --bin electrs -- --network liquid --version" || true - + case $OS in FreeBSD) echo "[*] Patching Liquid Electrs code for FreeBSD" @@ -1300,11 +1294,11 @@ if [ "${ELEMENTS_ELECTRS_INSTALL}" = ON ];then Debian) ;; esac - + echo "[*] Building Liquid Electrs release binary" osSudo "${ELEMENTS_USER}" sh -c "cd ${ELEMENTS_ELECTRS_HOME} && cargo run --release --features liquid --bin electrs -- --network liquid --version" || true fi - + ############################## # Core Lightning for Bitcoin # ############################## @@ -1430,16 +1424,6 @@ fi if [ "${UNFURL_INSTALL}" = ON ];then - echo "[*] Creating Unfurl user" - osGroupCreate "${UNFURL_GROUP}" - osUserCreate "${UNFURL_USER}" "${UNFURL_HOME}" "${UNFURL_GROUP}" - osSudo "${ROOT_USER}" chsh -s `which zsh` "${UNFURL_USER}" - - echo "[*] Creating Unfurl folder" - osSudo "${ROOT_USER}" mkdir -p "${UNFURL_HOME}" - osSudo "${ROOT_USER}" chown -R "${UNFURL_USER}:${UNFURL_GROUP}" "${UNFURL_HOME}" - osSudo "${UNFURL_USER}" touch "${UNFURL_HOME}/.zshrc" - echo "[*] Insalling Unfurl source" case $OS in @@ -1530,7 +1514,6 @@ if [ "${BITCOIN_TESTNET_ENABLE}" = ON ];then case $OS in FreeBSD) - echo "[*] FIXME: Bitcoin Minfee service must be installed manually on FreeBSD" ;; Debian) @@ -1548,7 +1531,6 @@ if [ "${BITCOIN_TESTNET_ENABLE}" = ON ];then case $OS in FreeBSD) - echo "[*] FIXME: Bitcoin Testnet service must be installed manually on FreeBSD" ;; Debian) @@ -1566,7 +1548,6 @@ if [ "${BITCOIN_SIGNET_ENABLE}" = ON ];then case $OS in FreeBSD) - echo "[*] FIXME: Bitcoin Signet service must be installed manually on FreeBSD" ;; Debian) @@ -1584,7 +1565,6 @@ if [ "${ELEMENTS_LIQUID_ENABLE}" = ON ];then case $OS in FreeBSD) - echo "[*] FIXME: Bitcoin Liquid service must be installed manually on FreeBSD" ;; Debian) @@ -1602,7 +1582,6 @@ if [ "${ELEMENTS_LIQUID_ENABLE}" = ON ];then case $OS in FreeBSD) - echo "[*] FIXME: Bitcoin Liquid service must be installed manually on FreeBSD" ;; Debian) @@ -1841,6 +1820,9 @@ case $OS in ;; esac +# wait for mysql to start +sleep 5 + mysql << _EOF_ create database mempool; grant all on mempool.* to '${MEMPOOL_MAINNET_USER}'@'localhost' identified by '${MEMPOOL_MAINNET_PASS}'; @@ -1895,39 +1877,60 @@ chown "${MEMPOOL_USER}:${MEMPOOL_GROUP}" "${MEMPOOL_MYSQL_CREDENTIALS}" ##### nginx +echo "[*] Adding Nginx configuration" +osSudo "${ROOT_USER}" install -c -o "${ROOT_USER}" -g "${ROOT_GROUP}" -m 644 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/nginx/nginx.conf" "${NGINX_CONFIGURATION}" +mkdir -p /var/cache/nginx/services /var/cache/nginx/api +chown "${NGINX_USER}:${NGINX_GROUP}" /var/cache/nginx/services /var/cache/nginx/api +ln -s "${MEMPOOL_HOME}/mempool" "${NGINX_ETC_FOLDER}/mempool" +osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_USER__!${NGINX_USER}!" "${NGINX_CONFIGURATION}" +osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_ETC_FOLDER__!${NGINX_ETC_FOLDER}!" "${NGINX_CONFIGURATION}" + +if [ "${TOR_INSTALL}" = ON ];then + echo "[*] Read tor v3 onion hostnames" + + NGINX_MEMPOOL_ONION=$(cat "${TOR_RESOURCES}/mempool/hostname") + osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_MEMPOOL_ONION__!${NGINX_MEMPOOL_ONION%.onion}!" "${NGINX_CONFIGURATION}" + + if [ "${ELEMENTS_LIQUID_ENABLE}" = "ON" ];then + NGINX_LIQUID_ONION=$(cat "${TOR_RESOURCES}/liquid/hostname") + osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_LIQUID_ONION__!${NGINX_LIQUID_ONIONi%.onion}!" "${NGINX_CONFIGURATION}" + fi + + if [ "${BISQ_MAINNET_ENABLE}" = "ON" ];then + NGINX_BISQ_ONION=$(cat "${TOR_RESOURCES}/bisq/hostname") + osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_BISQ_ONION__!${NGINX_BISQ_ONION%.onion}!" "${NGINX_CONFIGURATION}" + fi +fi + +##### OS systemd + +echo "[*] Setting permissions for electrs sockets" case $OS in FreeBSD) + setfacl -m "user:bitcoin:full_set:f:allow,user:mempool:full_set:f:allow,user:www:full_set:f:allow,everyone@::f:allow" "${BITCOIN_HOME}/socket" + chown "${BITCOIN_USER}:${BITCOIN_GROUP}" "${BITCOIN_HOME}/socket" + setfacl -m "user:elements:full_set:f:allow,user:mempool:full_set:f:allow,user:www:full_set:f:allow,everyone@::f:allow" "${ELEMENTS_HOME}/socket" + chown "${ELEMENTS_USER}:${ELEMENTS_GROUP}" "${ELEMENTS_HOME}/socket" ;; -Debian) - echo "[*] Adding Nginx configuration" - osSudo "${ROOT_USER}" install -c -o "${ROOT_USER}" -g "${ROOT_GROUP}" -m 644 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/nginx/nginx.conf" "${NGINX_CONFIGURATION}" - mkdir -p /var/cache/nginx/services /var/cache/nginx/api - chown ${NGINX_USER}: /var/cache/nginx/services /var/cache/nginx/api - ln -s /mempool/mempool /etc/nginx/mempool - osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_USER__!${NGINX_USER}!" "${NGINX_CONFIGURATION}" - osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_ETC_FOLDER__!${NGINX_ETC_FOLDER}!" "${NGINX_CONFIGURATION}" - if [ "${TOR_INSTALL}" = ON ];then - echo "[*] Read tor v3 onion hostnames" - NGINX_MEMPOOL_ONION=$(cat "${TOR_RESOURCES}/mempool/hostname") - NGINX_BISQ_ONION=$(cat "${TOR_RESOURCES}/bisq/hostname") - NGINX_LIQUID_ONION=$(cat "${TOR_RESOURCES}/liquid/hostname") - osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_MEMPOOL_ONION__!${NGINX_MEMPOOL_ONION%.onion}!" "${NGINX_CONFIGURATION}" - osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_BISQ_ONION__!${NGINX_BISQ_ONION%.onion}!" "${NGINX_CONFIGURATION}" - osSudo "${ROOT_USER}" sed -i.orig "s!__NGINX_LIQUID_ONION__!${NGINX_LIQUID_ONIONi%.onion}!" "${NGINX_CONFIGURATION}" - fi - echo "[*] Restarting Nginx" - osSudo "${ROOT_USER}" service nginx restart + Debian) ;; esac ##### OS systemd -echo "[*] Updating systemd daemon configuration" +echo "[*] Updating system startup configuration" case $OS in FreeBSD) + echo 'nginx_enable="YES"' >> /etc/rc.conf + echo 'bitcoin_enable="YES"' >> /etc/rc.conf + echo 'tor_enable="YES"' >> /etc/rc.conf + echo 'postfix_enable="YES"' >> /etc/rc.conf + echo 'mysql_enable="YES"' >> /etc/rc.conf + echo 'mysql_dbdir="/mysql"' >> /etc/rc.conf + echo 'tor_enable="YES"' >> /etc/rc.conf ;; Debian) @@ -1959,6 +1962,9 @@ case $OS in ;; esac +echo "[*] Restarting Nginx" +osSudo "${ROOT_USER}" service nginx restart + ##### OS set Linux user ulimits echo "[*] Setting ulimits for users" @@ -2060,20 +2066,12 @@ osSudo "${MEMPOOL_USER}" sh -c "cd ${MEMPOOL_HOME} && ./upgrade" || true ##### finish -case $OS in - - FreeBSD) - ;; - - Debian) - if [ "${TOR_INSTALL}" = ON ];then - echo "This are the generated Tor addresses:" - echo "${NGINX_MEMPOOL_ONION}" - echo "${NGINX_BISQ_ONION}" - echo "${NGINX_LIQUID_ONION}" - fi - ;; -esac +if [ "${TOR_INSTALL}" = ON ];then + echo "Your auto-generated Tor addresses are:" + echo "${NGINX_MEMPOOL_ONION}" + echo "${NGINX_BISQ_ONION}" + echo "${NGINX_LIQUID_ONION}" +fi echo echo 'Please reboot to start all the services.' diff --git a/production/mempool-config.liquid.json b/production/mempool-config.liquid.json index 11ad8ffcd..30c010835 100644 --- a/production/mempool-config.liquid.json +++ b/production/mempool-config.liquid.json @@ -22,7 +22,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4001" + "UNIX_SOCKET_PATH": "/elements/socket/esplora-liquid-mainnet" }, "DATABASE": { "ENABLED": true, diff --git a/production/mempool-config.liquidtestnet.json b/production/mempool-config.liquidtestnet.json index 7769bfb53..6ea6c9071 100644 --- a/production/mempool-config.liquidtestnet.json +++ b/production/mempool-config.liquidtestnet.json @@ -22,7 +22,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4004" + "UNIX_SOCKET_PATH": "/elements/socket/esplora-liquid-testnet" }, "DATABASE": { "ENABLED": true, diff --git a/production/mempool-config.mainnet.json b/production/mempool-config.mainnet.json index cca43d7e3..a75102c7f 100644 --- a/production/mempool-config.mainnet.json +++ b/production/mempool-config.mainnet.json @@ -30,7 +30,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4000" + "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-mainnet" }, "DATABASE": { "ENABLED": true, diff --git a/production/mempool-config.signet.json b/production/mempool-config.signet.json index 87f8e2650..1f5522e6d 100644 --- a/production/mempool-config.signet.json +++ b/production/mempool-config.signet.json @@ -21,7 +21,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4003" + "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-signet" }, "DATABASE": { "ENABLED": true, diff --git a/production/mempool-config.testnet.json b/production/mempool-config.testnet.json index 5c1695e62..0c21f785b 100644 --- a/production/mempool-config.testnet.json +++ b/production/mempool-config.testnet.json @@ -21,7 +21,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4002" + "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-testnet" }, "DATABASE": { "ENABLED": true, diff --git a/production/newsyslog-mempool-nginx.conf b/production/newsyslog-mempool-nginx.conf index 4817ec6bd..876613e1c 100644 --- a/production/newsyslog-mempool-nginx.conf +++ b/production/newsyslog-mempool-nginx.conf @@ -1,8 +1,8 @@ -/var/log/nginx/access.log nobody:nobody 644 10 * @T00 C /var/run/mempool.pid 30 -/var/log/nginx/error.log nobody:nobody 644 10 * @T00 C /var/run/mempool.pid 30 -/var/log/nginx/bisq-access.log nobody:nobody 644 10 * @T00 C /var/run/mempool.pid 30 -/var/log/nginx/bisq-error.log nobody:nobody 644 10 * @T00 C /var/run/mempool.pid 30 -/var/log/nginx/liquid-access.log nobody:nobody 644 10 * @T00 C /var/run/mempool.pid 30 -/var/log/nginx/liquid-error.log nobody:nobody 644 10 * @T00 C /var/run/mempool.pid 30 -/var/log/nginx/mempool-access.log nobody:nobody 644 10 * @T00 C /var/run/mempool.pid 30 -/var/log/nginx/mempool-error.log nobody:nobody 644 10 * @T00 C /var/run/mempool.pid 30 +/var/log/nginx/access.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 +/var/log/nginx/error.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 +/var/log/nginx/bisq-access.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 +/var/log/nginx/bisq-error.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 +/var/log/nginx/liquid-access.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 +/var/log/nginx/liquid-error.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 +/var/log/nginx/mempool-access.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 +/var/log/nginx/mempool-error.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 diff --git a/production/nginx/upstream-esplora.conf b/production/nginx/upstream-esplora.conf index 6cad0730b..941f43566 100644 --- a/production/nginx/upstream-esplora.conf +++ b/production/nginx/upstream-esplora.conf @@ -1,15 +1,15 @@ upstream esplora-bitcoin-mainnet { - server [::1]:3000 fail_timeout=10s max_fails=10 weight=99999; + server unix:/bitcoin/socket/esplora-bitcoin-mainnet fail_timeout=10s max_fails=10 weight=99999; } upstream esplora-liquid-mainnet { - server [::1]:3001 fail_timeout=10s max_fails=10 weight=99999; + server unix:/elements/socket/esplora-liquid-mainnet fail_timeout=10s max_fails=10 weight=99999; } upstream esplora-bitcoin-testnet { - server [::1]:3002 fail_timeout=10s max_fails=10 weight=99999; + server unix:/bitcoin/socket/esplora-bitcoin-testnet fail_timeout=10s max_fails=10 weight=99999; } upstream esplora-bitcoin-signet { - server [::1]:3003 fail_timeout=10s max_fails=10 weight=99999; + server unix:/bitcoin/socket/esplora-bitcoin-signet fail_timeout=10s max_fails=10 weight=99999; } upstream esplora-liquid-testnet { - server [::1]:3004 fail_timeout=10s max_fails=10 weight=99999; + server unix:/elements/socket/esplora-liquid-testnet fail_timeout=10s max_fails=10 weight=99999; } From 070ee10fb063677cddb0cc930adac88d020b57e0 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 13 Mar 2023 17:08:27 +0900 Subject: [PATCH 062/782] Fixing more missing i18n keys fixes #3339 fixes #3337 --- .../pool-ranking/pool-ranking.component.ts | 13 ++-- .../nodes-per-country-chart.component.ts | 10 +-- .../nodes-per-isp-chart.component.ts | 10 +-- .../lightning-statistics-chart.component.ts | 2 +- frontend/src/locale/messages.xlf | 62 +++++++++++++++---- 5 files changed, 71 insertions(+), 26 deletions(-) diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts index 0f2103024..a5349ee7c 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts @@ -162,10 +162,10 @@ export class PoolRankingComponent implements OnInit { if (this.miningWindowPreference === '24h') { return `${pool.name} (${pool.share}%)
` + pool.lastEstimatedHashrate.toString() + ' PH/s' + - `
` + $localize`${i} blocks`; + `
` + $localize`:@@1bb6965f8e1bbe40c076528ffd841da86f57f119:${ i }:INTERPOLATION: blocks`; } else { return `${pool.name} (${pool.share}%)
` + - $localize`${i} blocks`; + $localize`:@@1bb6965f8e1bbe40c076528ffd841da86f57f119:${ i }:INTERPOLATION: blocks`; } } }, @@ -195,13 +195,14 @@ export class PoolRankingComponent implements OnInit { }, borderColor: '#000', formatter: () => { + const percentage = totalShareOther.toFixed(2) + '%'; if (this.miningWindowPreference === '24h') { - return `${'Other'} (${totalShareOther.toFixed(2)}%)
` + + return `` + $localize`Other (${percentage})` + `
` + totalEstimatedHashrateOther.toString() + ' PH/s' + - `
` + totalBlockOther.toString() + ` blocks`; + `
` + $localize`:@@1bb6965f8e1bbe40c076528ffd841da86f57f119:${ totalBlockOther.toString() }:INTERPOLATION: blocks`; } else { - return `${'Other'} (${totalShareOther.toFixed(2)}%)
` + - totalBlockOther.toString() + ` blocks`; + return `` + $localize`Other (${percentage})` + `
` + + $localize`:@@1bb6965f8e1bbe40c076528ffd841da86f57f119:${ totalBlockOther.toString() }:INTERPOLATION: blocks`; } } }, diff --git a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts index 681688842..b4621d7bf 100644 --- a/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts +++ b/frontend/src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts @@ -99,8 +99,9 @@ export class NodesPerCountryChartComponent implements OnInit { }, borderColor: '#000', formatter: () => { + const nodeCount = country.count.toString(); return `${country.name.en} (${country.share}%)
` + - $localize`${country.count.toString()} nodes` + `
` + + $localize`${nodeCount} nodes` + `
` + $localize`${this.amountShortenerPipe.transform(country.capacity / 100000000, 2)} BTC capacity` ; } @@ -115,7 +116,7 @@ export class NodesPerCountryChartComponent implements OnInit { color: 'grey', }, value: totalShareOther, - name: 'Other' + (this.isMobile() ? `` : ` (${totalShareOther.toFixed(2)}%)`), + name: $localize`Other (${totalShareOther.toFixed(2) + '%'})`, label: { overflow: 'truncate', color: '#b1b1b1', @@ -131,8 +132,9 @@ export class NodesPerCountryChartComponent implements OnInit { }, borderColor: '#000', formatter: () => { - return `${'Other'} (${totalShareOther.toFixed(2)}%)
` + - totalNodeOther.toString() + ` nodes`; + const nodeCount = totalNodeOther.toString(); + return `` + $localize`Other (${totalShareOther.toFixed(2) + '%'})` + `
` + + $localize`${nodeCount} nodes`; }, }, data: 9999 as any diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts index caaa350d6..614704ed6 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -153,8 +153,9 @@ export class NodesPerISPChartComponent implements OnInit { }, borderColor: '#000', formatter: () => { + const nodeCount = isp[4].toString(); return `${isp[1]} (${this.sortBy === 'capacity' ? isp[7] : isp[6]}%)
` + - $localize`${isp[4].toString()} nodes` + `
` + + $localize`${nodeCount} nodes` + `
` + $localize`${this.amountShortenerPipe.transform(isp[2] / 100000000, 2)} BTC` ; } @@ -169,7 +170,7 @@ export class NodesPerISPChartComponent implements OnInit { color: 'grey', }, value: totalShareOther, - name: 'Other' + (isMobile() || this.widget ? `` : ` (${totalShareOther.toFixed(2)}%)`), + name: $localize`Other (${totalShareOther.toFixed(2) + '%'})`, label: { overflow: 'truncate', color: '#b1b1b1', @@ -185,8 +186,9 @@ export class NodesPerISPChartComponent implements OnInit { }, borderColor: '#000', formatter: () => { - return `Other (${totalShareOther.toFixed(2)}%)
` + - $localize`${nodeCountOther.toString()} nodes` + `
` + + const nodeCount = nodeCountOther.toString(); + return `` + $localize`Other (${totalShareOther.toFixed(2) + '%'})` + `
` + + $localize`${nodeCount} nodes` + `
` + $localize`${this.amountShortenerPipe.transform(capacityOther / 100000000, 2)} BTC`; } }, diff --git a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts index b93ee1f3d..dd034eabd 100644 --- a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts +++ b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts @@ -256,7 +256,7 @@ export class LightningStatisticsChartComponent implements OnInit { series: data.channel_count.length === 0 ? [] : [ { zlevel: 1, - name: 'Channels', + name: $localize`:@@807cf11e6ac1cde912496f764c176bdfdd6b7e19:Channels`, showSymbol: false, symbol: 'none', data: data.channel_count, diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index 3e1521b92..b74f94c26 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -2919,6 +2919,22 @@ src/app/components/mempool-blocks/mempool-blocks.component.html 35,36
+ + src/app/components/pool-ranking/pool-ranking.component.ts + 165,163 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 168,167 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 202,200 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205,204 + src/app/lightning/channel/channel-box/channel-box.component.html 78 @@ -3709,15 +3725,31 @@ 58 - - blocks + + Other () src/app/components/pool-ranking/pool-ranking.component.ts - 165,163 + 200 src/app/components/pool-ranking/pool-ranking.component.ts - 168,167 + 204 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 @@ -5802,6 +5834,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193
+ + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6242,25 +6278,29 @@ lightning.share - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6366,11 +6406,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 From cfdbd30956ff711124c3a463b9faf8a2afd9c1c0 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 13 Mar 2023 17:18:09 +0900 Subject: [PATCH 063/782] Correct video height on mobile #3342 --- frontend/src/app/components/about/about.component.scss | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/about/about.component.scss b/frontend/src/app/components/about/about.component.scss index e538d724b..f2d4328b7 100644 --- a/frontend/src/app/components/about/about.component.scss +++ b/frontend/src/app/components/about/about.component.scss @@ -42,9 +42,11 @@ video { width: 640px; - height: 360px; max-width: 90%; margin-top: 0; + @media (min-width: 768px) { + height: 360px; + } } .social-icons { @@ -57,9 +59,13 @@ .enterprise-sponsor, .community-integrations-sponsor, .maintainers { - margin-top: 68px; + margin-top: 30px; margin-bottom: 68px; scroll-margin: 30px; + + @media (min-width: 768px) { + margin-top: 68px; + } } .maintainers { From ecfb980e759bf18d498eac69cb5c697ecf38d253 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 13 Mar 2023 17:24:23 +0900 Subject: [PATCH 064/782] Disable pool update when running lightning only --- backend/src/tasks/pools-updater.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/tasks/pools-updater.ts b/backend/src/tasks/pools-updater.ts index dc76382d6..fb86d03be 100644 --- a/backend/src/tasks/pools-updater.ts +++ b/backend/src/tasks/pools-updater.ts @@ -17,7 +17,9 @@ class PoolsUpdater { treeUrl: string = config.MEMPOOL.POOLS_JSON_TREE_URL; public async updatePoolsJson(): Promise { - if (['mainnet', 'testnet', 'signet'].includes(config.MEMPOOL.NETWORK) === false) { + if (['mainnet', 'testnet', 'signet'].includes(config.MEMPOOL.NETWORK) === false || + config.MEMPOOL.ENABLED === false + ) { return; } From d015ee78240ed5327723808f8d0a7df18aa4206a Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 13 Mar 2023 17:40:17 +0900 Subject: [PATCH 065/782] Fixes i18n string error --- .../pool-ranking/pool-ranking.component.ts | 9 +++-- frontend/src/locale/messages.xlf | 39 ++++++++++--------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts index a5349ee7c..ea3a52e8e 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.ts +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.ts @@ -162,10 +162,10 @@ export class PoolRankingComponent implements OnInit { if (this.miningWindowPreference === '24h') { return `${pool.name} (${pool.share}%)
` + pool.lastEstimatedHashrate.toString() + ' PH/s' + - `
` + $localize`:@@1bb6965f8e1bbe40c076528ffd841da86f57f119:${ i }:INTERPOLATION: blocks`; + `
` + $localize`${ i }:INTERPOLATION: blocks`; } else { return `${pool.name} (${pool.share}%)
` + - $localize`:@@1bb6965f8e1bbe40c076528ffd841da86f57f119:${ i }:INTERPOLATION: blocks`; + $localize`${ i }:INTERPOLATION: blocks`; } } }, @@ -196,13 +196,14 @@ export class PoolRankingComponent implements OnInit { borderColor: '#000', formatter: () => { const percentage = totalShareOther.toFixed(2) + '%'; + const i = totalBlockOther.toString(); if (this.miningWindowPreference === '24h') { return `` + $localize`Other (${percentage})` + `
` + totalEstimatedHashrateOther.toString() + ' PH/s' + - `
` + $localize`:@@1bb6965f8e1bbe40c076528ffd841da86f57f119:${ totalBlockOther.toString() }:INTERPOLATION: blocks`; + `
` + $localize`${ i }:INTERPOLATION: blocks`; } else { return `` + $localize`Other (${percentage})` + `
` + - $localize`:@@1bb6965f8e1bbe40c076528ffd841da86f57f119:${ totalBlockOther.toString() }:INTERPOLATION: blocks`; + $localize`${ i }:INTERPOLATION: blocks`; } } }, diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index b74f94c26..0fd5bdcd7 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -2919,22 +2919,6 @@ src/app/components/mempool-blocks/mempool-blocks.component.html 35,36 - - src/app/components/pool-ranking/pool-ranking.component.ts - 165,163 - - - src/app/components/pool-ranking/pool-ranking.component.ts - 168,167 - - - src/app/components/pool-ranking/pool-ranking.component.ts - 202,200 - - - src/app/components/pool-ranking/pool-ranking.component.ts - 205,204 - src/app/lightning/channel/channel-box/channel-box.component.html 78 @@ -3725,15 +3709,34 @@ 58
+ + blocks + + src/app/components/pool-ranking/pool-ranking.component.ts + 165,163 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 168,167 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + Other () src/app/components/pool-ranking/pool-ranking.component.ts - 200 + 201 src/app/components/pool-ranking/pool-ranking.component.ts - 204 + 205 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts From 0b88d94573abaa194424c4f1bf6613c732cf3dd8 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 13 Mar 2023 18:42:43 +0900 Subject: [PATCH 066/782] Fix channels i18n string on world map fixes #3336 --- frontend/src/app/lightning/nodes-map/nodes-map.component.ts | 4 ++-- frontend/src/locale/messages.xlf | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/lightning/nodes-map/nodes-map.component.ts b/frontend/src/app/lightning/nodes-map/nodes-map.component.ts index db13ca6fe..e0fd80a53 100644 --- a/frontend/src/app/lightning/nodes-map/nodes-map.component.ts +++ b/frontend/src/app/lightning/nodes-map/nodes-map.component.ts @@ -207,8 +207,8 @@ export class NodesMap implements OnInit, OnChanges { return ` ${alias}
- ${liquidity}
- ${data[5]} channels
+ ${liquidity}
` + + $localize`:@@205c1b86ac1cc419c4d0cca51fdde418c4ffdc20:${data[5]}:INTERPOLATION: channels` + `
${getFlagEmoji(data[7])} ${data[6]} `; } diff --git a/frontend/src/locale/messages.xlf b/frontend/src/locale/messages.xlf index 0fd5bdcd7..be88e0b2e 100644 --- a/frontend/src/locale/messages.xlf +++ b/frontend/src/locale/messages.xlf @@ -5179,6 +5179,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124
+ + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels
From 9f453decebf1efc37c4b09e67d88d18f05889bc9 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 14 Mar 2023 13:02:50 +0900 Subject: [PATCH 067/782] Use network-specific feature activation dates --- frontend/src/app/bitcoin.utils.ts | 27 +++++++++++++++++++ .../transaction/transaction.component.ts | 7 ++--- .../tx-features/tx-features.component.ts | 13 +++++---- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/bitcoin.utils.ts b/frontend/src/app/bitcoin.utils.ts index 25432565c..5419464a9 100644 --- a/frontend/src/app/bitcoin.utils.ts +++ b/frontend/src/app/bitcoin.utils.ts @@ -254,3 +254,30 @@ export function selectPowerOfTen(val: number): { divider: number, unit: string } return selectedPowerOfTen; } + +const featureActivation = { + mainnet: { + rbf: 399701, + segwit: 477120, + taproot: 709632, + }, + testnet: { + rbf: 720255, + segwit: 872730, + taproot: 2032291, + }, + signet: { + rbf: 0, + segwit: 0, + taproot: 0, + }, +}; + +export function isFeatureActive(network: string, height: number, feature: 'rbf' | 'segwit' | 'taproot'): boolean { + const activationHeight = featureActivation[network || 'mainnet']?.[feature]; + if (activationHeight != null) { + return height >= activationHeight; + } else { + return false; + } +} diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index c60d796e4..5f23633bf 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -23,6 +23,7 @@ import { BlockExtended, CpfpInfo } from '../../interfaces/node-api.interface'; import { LiquidUnblinding } from './liquid-ublinding'; import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; import { Price, PriceService } from '../../services/price.service'; +import { isFeatureActive } from '../../bitcoin.utils'; @Component({ selector: 'app-transaction', @@ -438,9 +439,9 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { setFeatures(): void { if (this.tx) { - this.segwitEnabled = !this.tx.status.confirmed || this.tx.status.block_height >= 477120; - this.taprootEnabled = !this.tx.status.confirmed || this.tx.status.block_height >= 709632; - this.rbfEnabled = !this.tx.status.confirmed || this.tx.status.block_height > 399700; + this.segwitEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'segwit'); + this.taprootEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'taproot'); + this.rbfEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'rbf'); } else { this.segwitEnabled = false; this.taprootEnabled = false; diff --git a/frontend/src/app/components/tx-features/tx-features.component.ts b/frontend/src/app/components/tx-features/tx-features.component.ts index 9376a0c7c..ffc2f291d 100644 --- a/frontend/src/app/components/tx-features/tx-features.component.ts +++ b/frontend/src/app/components/tx-features/tx-features.component.ts @@ -1,6 +1,7 @@ import { Component, ChangeDetectionStrategy, OnChanges, Input } from '@angular/core'; -import { calcSegwitFeeGains } from '../../bitcoin.utils'; +import { calcSegwitFeeGains, isFeatureActive } from '../../bitcoin.utils'; import { Transaction } from '../../interfaces/electrs.interface'; +import { StateService } from '../../services/state.service'; @Component({ selector: 'app-tx-features', @@ -25,15 +26,17 @@ export class TxFeaturesComponent implements OnChanges { rbfEnabled: boolean; taprootEnabled: boolean; - constructor() { } + constructor( + private stateService: StateService, + ) { } ngOnChanges() { if (!this.tx) { return; } - this.segwitEnabled = !this.tx.status.confirmed || this.tx.status.block_height >= 477120; - this.taprootEnabled = !this.tx.status.confirmed || this.tx.status.block_height >= 709632; - this.rbfEnabled = !this.tx.status.confirmed || this.tx.status.block_height > 399700; + this.segwitEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'segwit'); + this.taprootEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'taproot'); + this.rbfEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'rbf'); this.segwitGains = calcSegwitFeeGains(this.tx); this.isRbfTransaction = this.tx.vin.some((v) => v.sequence < 0xfffffffe); this.isTaproot = this.tx.vin.some((v) => v.prevout && v.prevout.scriptpubkey_type === 'v1_p2tr'); From 2b9e63dbc58a2c9c5064675afc266acf203cfda2 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 14 Mar 2023 14:31:20 +0900 Subject: [PATCH 068/782] i18n: Enable Danish --- frontend/angular.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/angular.json b/frontend/angular.json index d157cc443..792f59443 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -38,6 +38,10 @@ "translation": "src/locale/messages.de.xlf", "baseHref": "/de/" }, + "da": { + "translation": "src/locale/messages.da.xlf", + "baseHref": "/da/" + }, "es": { "translation": "src/locale/messages.es.xlf", "baseHref": "/es/" From 881af309abc80543d4124c834acaf7fbfc0be5c1 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 14 Mar 2023 14:54:49 +0900 Subject: [PATCH 069/782] Pull from transifex --- frontend/src/locale/messages.ar.xlf | 606 +++++++----- frontend/src/locale/messages.cs.xlf | 628 +++++++----- frontend/src/locale/messages.da.xlf | 479 +++++---- frontend/src/locale/messages.de.xlf | 105 +- frontend/src/locale/messages.es.xlf | 451 ++++++--- frontend/src/locale/messages.fa.xlf | 621 +++++++----- frontend/src/locale/messages.fi.xlf | 447 ++++++--- frontend/src/locale/messages.fr.xlf | 465 ++++++--- frontend/src/locale/messages.he.xlf | 447 ++++++--- frontend/src/locale/messages.hu.xlf | 788 +++++++++------ frontend/src/locale/messages.it.xlf | 771 +++++++++------ frontend/src/locale/messages.ja.xlf | 126 ++- frontend/src/locale/messages.ka.xlf | 606 +++++++----- frontend/src/locale/messages.ko.xlf | 605 +++++++----- frontend/src/locale/messages.lt.xlf | 105 +- frontend/src/locale/messages.mk.xlf | 107 +- frontend/src/locale/messages.nb.xlf | 606 +++++++----- frontend/src/locale/messages.ne.xlf | 1334 +++++++++++++++---------- frontend/src/locale/messages.nl.xlf | 607 +++++++----- frontend/src/locale/messages.pl.xlf | 108 ++- frontend/src/locale/messages.pt.xlf | 105 +- frontend/src/locale/messages.ro.xlf | 607 +++++++----- frontend/src/locale/messages.ru.xlf | 606 +++++++----- frontend/src/locale/messages.sl.xlf | 1330 +++++++++++++++---------- frontend/src/locale/messages.th.xlf | 1335 +++++++++++++++---------- frontend/src/locale/messages.tr.xlf | 1402 +++++++++++++++++---------- frontend/src/locale/messages.uk.xlf | 606 +++++++----- frontend/src/locale/messages.vi.xlf | 606 +++++++----- frontend/src/locale/messages.zh.xlf | 606 +++++++----- 29 files changed, 10873 insertions(+), 6342 deletions(-) diff --git a/frontend/src/locale/messages.ar.xlf b/frontend/src/locale/messages.ar.xlf index 98e8c44c6..6c00d6e07 100644 --- a/frontend/src/locale/messages.ar.xlf +++ b/frontend/src/locale/messages.ar.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ التحالفات المجتمعية src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ مترجمو المشروع src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ المساهمون في المشروع src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ أعضاء المشروع src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ فريق صيانة المشروع src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment تعديل الصعوبة + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining متبقي - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks كتل - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block كتله - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate متوقعة - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous السابق - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period الفترة الحالية - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving الانقسام التالي - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) إما ضعف الحد الأدنى أو معدل الأولوية المنخفضة (أيهما أقل) @@ -3346,7 +3446,7 @@ التعدين src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ ترتيب التجمعات src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ هيمنة التجمعات src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ معدل التجزئة & معدل الصعوبة src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ البرق src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ أنواد برق لكل شبكة src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ سعة شبكة البرق src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ شبكات البرق حسب مزود خدمة انترنت src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ شبكات البرق حسب الدولة src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ أنواد البرق على خريطة العالم src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ قنوات البرق على خريطة العالم src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ (متوسط) معدل التجزئة src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3767,7 @@ إحصائيات المكافأة src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (١٤٤ كتله) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ احدث الكتل src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ التعديلات src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ بث معاملة src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - كتل + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4473,7 @@ تصفية src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4482,7 @@ عكس src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4491,7 @@ حجم التحويلات في الثانية (بايت افتراضي/ثانية) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4499,187 @@ Just now الآن - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago منذ - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After بعد - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - خلال ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4813,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4832,7 @@ اعرض المزيد src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4849,7 @@ قلل العرض src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4862,7 @@ اعرض الرسم االبياني src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4871,7 @@ وقت القفل src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4880,7 @@ الحوالة غير موجودة. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4889,7 @@ في انتظار ظهورها على mempool src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4898,7 @@ معدل الرسوم الفعلي src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5227,6 +5352,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5234,7 +5363,7 @@ اعادة تشغيل خادم API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5243,11 +5372,11 @@ نقطة النهاية src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5256,11 +5385,11 @@ وصف src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5268,7 +5397,7 @@ الدفع الإعتيادي:إجراء:أريد, بيانات:[’الكتل’،...]لتحدديد ما تريد دفعه.متوفر:كتل،;كتل عقود للعمليات غير المعلنة،جدول-2h-مباشر،وإحصاءات .دفع المعاملات المرتبطة بالعنوان:’إتبع-عنوان’: ’3PbJ...bF98’للحصول على معاملة جديدة تحتوي ذلك العنوان كإدخال و إخراج. إرجاع مصفوف المعاملات.عنوان المعاملاتلكتل العقود غير المعلنة الجديدة، و معاملات الكتللالمعاملات المؤكدة في الكتل الجديدة. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5443,6 +5572,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5557,6 +5690,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5675,7 +5816,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5815,7 +5956,7 @@ ساتوشي src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6075,6 +6216,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6123,6 +6272,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6598,19 +6751,22 @@ lightning.share - nodes - أنواد + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6618,7 +6774,7 @@ سعة BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6736,11 +6892,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.cs.xlf b/frontend/src/locale/messages.cs.xlf index 304f3fba4..fb249f4a1 100644 --- a/frontend/src/locale/messages.cs.xlf +++ b/frontend/src/locale/messages.cs.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ Komunitní aliance src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Překladatelé projektu src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Přispěvatelé projektu src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Členové projektu src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Správci projektu src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,11 +2534,12 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 Size per weight + Velikost dle váhy src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts 200,199 @@ -2632,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2745,6 +2750,7 @@ Subsidy + fees + Vytěžené + poplatky src/app/components/block/block.component.html 153,156 @@ -2844,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2889,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3078,13 +3084,17 @@ Difficulty Adjustment Změna obtížnosti + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3092,11 +3102,11 @@ Remaining Zbývá - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3105,11 +3115,11 @@ blocks bloky - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3130,11 +3140,11 @@ block blok - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3147,11 +3157,11 @@ Estimate Odhad - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3160,20 +3170,24 @@ Previous Předchozí - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Současné období - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3182,11 +3196,99 @@ Next Halving Další půlení - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Buď dvojnásobek minimální sazby, nebo sazba Nízká priorita (podle toho, která je nižší). @@ -3344,7 +3446,7 @@ Těžba src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3353,7 +3455,7 @@ Hodnocení poolů src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3366,7 +3468,7 @@ Dominance poolů src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3379,7 +3481,7 @@ Hashrate & obtížnost src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3388,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3397,7 +3499,7 @@ Lightning uzly v síti src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3418,7 +3520,7 @@ Kapacita Lightning sítě src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3439,7 +3541,7 @@ Lightning uzly na jednoho ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3452,7 +3554,7 @@ Lightning uzly podle zemí src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3469,7 +3571,7 @@ Světová mapa Lightning uzlů src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3486,7 +3588,7 @@ Světová mapa kanálů Lightning uzlů src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3507,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3541,11 +3643,11 @@ Hashrate (KP) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3665,7 +3767,7 @@ Statistiky odměn src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3674,7 +3776,7 @@ (144 bloků) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3683,7 +3785,7 @@ Poslední bloky src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3696,7 +3798,7 @@ Úpravy src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3705,7 +3807,7 @@ Vyslat transakci src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3825,6 +3927,7 @@ Avg Health + Průměrné zdraví src/app/components/pool-ranking/pool-ranking.component.html 96,97 @@ -3879,9 +3982,8 @@ 58 - - blocks - bloků + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3890,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4112,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4239,6 +4376,7 @@ Bitcoin Block Height + Výška bitcoinového bloku src/app/components/search-form/search-results/search-results.component.html 3 @@ -4247,6 +4385,7 @@ Bitcoin Transaction + Bitcoinová transakce src/app/components/search-form/search-results/search-results.component.html 9 @@ -4255,6 +4394,7 @@ Bitcoin Address + Bitcoinová adresa src/app/components/search-form/search-results/search-results.component.html 15 @@ -4263,6 +4403,7 @@ Bitcoin Block + Bitcoinový blok src/app/components/search-form/search-results/search-results.component.html 21 @@ -4271,6 +4412,7 @@ Bitcoin Addresses + Bitcoinové adresy src/app/components/search-form/search-results/search-results.component.html 27 @@ -4279,6 +4421,7 @@ Lightning Nodes + Lightningové uzly src/app/components/search-form/search-results/search-results.component.html 35 @@ -4287,6 +4430,7 @@ Lightning Channels + Lightningové kanály src/app/components/search-form/search-results/search-results.component.html 43 @@ -4329,7 +4473,7 @@ Filtr src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4338,7 +4482,7 @@ Převrátit src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4347,7 +4491,7 @@ Transakce vBytů za sekundu (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4355,196 +4499,188 @@ Just now Právě teď - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago před - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Po - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Za ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4678,7 +4814,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4697,7 +4833,7 @@ Zobrazit více src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4714,7 +4850,7 @@ Zobrazit méně src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4727,7 +4863,7 @@ Zobrazit diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4736,7 +4872,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4745,7 +4881,7 @@ Transakce nebyla nalezena. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4754,7 +4890,7 @@ Čekání na to, až se objeví v mempoolu... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4763,7 +4899,7 @@ Efektivní poplatek src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5213,10 +5349,15 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space pouze poskytuje údaje o Bitcoinové síti. Nemůže vám pomoci při získávání finančních prostředků, rychlejším potvrzování transakcí atd. src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5224,7 +5365,7 @@ Služba REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5233,11 +5374,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5246,11 +5387,11 @@ Popis src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5258,7 +5399,7 @@ Výchozí push: akce: 'want', data: ['blocks', ...] pro vyjádření toho, co chcete pushnout. K dispozici: blocks, mempool-blocks, live-2h-chart a stats. Push transakce související s adresou: 'track-address': '3PbJ...bF9B' pro příjem všech nových transakcí obsahujících tuto adresu jako vstup nebo výstup. Vrací pole transakcí. address-transactions pro nové transakce mempoolu a block-transactions pro nové transakce potvrzené blokem. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5433,6 +5574,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5547,6 +5692,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5665,7 +5818,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5706,6 +5859,7 @@ Mutually closed + Vzájemně uzavřeno src/app/lightning/channel/closing-type/closing-type.component.ts 20 @@ -5713,6 +5867,7 @@ Force closed + Uzavřeno vynuceně src/app/lightning/channel/closing-type/closing-type.component.ts 24 @@ -5720,6 +5875,7 @@ Force closed with penalty + Uzavřeno vynuceně s pokutou src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -5803,7 +5959,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -5853,6 +6009,7 @@ avg + prům src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -5861,6 +6018,7 @@ med + med src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -6063,6 +6221,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6111,6 +6277,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6243,6 +6413,7 @@ Outgoing Fees + Odchozí poplatky src/app/lightning/node-fee-chart/node-fee-chart.component.ts 170 @@ -6254,6 +6425,7 @@ Incoming Fees + Příchozí poplatky src/app/lightning/node-fee-chart/node-fee-chart.component.ts 178 @@ -6541,6 +6713,7 @@ Clearnet and Darknet + Clearnet a Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6552,6 +6725,7 @@ Clearnet Only (IPv4, IPv6) + Pouze Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6563,6 +6737,7 @@ Darknet Only (Tor, I2P, cjdns) + Pouze Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6586,19 +6761,22 @@ lightning.share - nodes - uzlů + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6606,7 +6784,7 @@ BTC kapacita src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6724,11 +6902,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.da.xlf b/frontend/src/locale/messages.da.xlf index 29f667ed5..57f4c2cf4 100644 --- a/frontend/src/locale/messages.da.xlf +++ b/frontend/src/locale/messages.da.xlf @@ -487,7 +487,7 @@ Block : - Blok : + Blok : src/app/bisq/bisq-block/bisq-block.component.ts 89 @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Community alliancer src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Oversættere src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Bidragsydere src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Medlemmer src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Vedligeholdere src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -3080,13 +3084,17 @@ Difficulty Adjustment Sværhedsgrad justering + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Tilbage - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks blokke - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block blok - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Estimat - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Forrige - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Nuværende periode - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Næste Halvering - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Enten 2x minimum eller lavprioritetssatsen (alt efter hvad der er lavest) @@ -3667,7 +3767,7 @@ Belønningsstatistik src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 blokke) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ Seneste blokke src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ Justeringer src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Udsend transaktion src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,9 @@ 58 - - blocks - blokke + + blocks + blokke src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3993,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4366,40 +4501,28 @@ Lige nu src/app/components/time/time.component.ts - 78 + 79 ago siden - - src/app/components/time/time.component.ts - 97 - - - src/app/components/time/time.component.ts - 98 - - - src/app/components/time/time.component.ts - 99 - - - src/app/components/time/time.component.ts - 100 - - - src/app/components/time/time.component.ts - 101 - - - src/app/components/time/time.component.ts - 102 - src/app/components/time/time.component.ts 103 + + src/app/components/time/time.component.ts + 104 + + + src/app/components/time/time.component.ts + 105 + + + src/app/components/time/time.component.ts + 106 + src/app/components/time/time.component.ts 107 @@ -4412,54 +4535,54 @@ src/app/components/time/time.component.ts 109 - - src/app/components/time/time.component.ts - 110 - - - src/app/components/time/time.component.ts - 111 - - - src/app/components/time/time.component.ts - 112 - src/app/components/time/time.component.ts 113 + + src/app/components/time/time.component.ts + 114 + + + src/app/components/time/time.component.ts + 115 + + + src/app/components/time/time.component.ts + 116 + + + src/app/components/time/time.component.ts + 117 + + + src/app/components/time/time.component.ts + 118 + + + src/app/components/time/time.component.ts + 119 + In ~ Om ~ - - src/app/components/time/time.component.ts - 120 - - - src/app/components/time/time.component.ts - 121 - - - src/app/components/time/time.component.ts - 122 - - - src/app/components/time/time.component.ts - 123 - - - src/app/components/time/time.component.ts - 124 - - - src/app/components/time/time.component.ts - 125 - src/app/components/time/time.component.ts 126 + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + src/app/components/time/time.component.ts 130 @@ -4472,54 +4595,54 @@ src/app/components/time/time.component.ts 132 - - src/app/components/time/time.component.ts - 133 - - - src/app/components/time/time.component.ts - 134 - - - src/app/components/time/time.component.ts - 135 - src/app/components/time/time.component.ts 136 + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 + After Efter - - src/app/components/time/time.component.ts - 143 - - - src/app/components/time/time.component.ts - 144 - - - src/app/components/time/time.component.ts - 145 - - - src/app/components/time/time.component.ts - 146 - - - src/app/components/time/time.component.ts - 147 - - - src/app/components/time/time.component.ts - 148 - src/app/components/time/time.component.ts 149 + + src/app/components/time/time.component.ts + 150 + + + src/app/components/time/time.component.ts + 151 + + + src/app/components/time/time.component.ts + 152 + src/app/components/time/time.component.ts 153 @@ -4532,22 +4655,34 @@ src/app/components/time/time.component.ts 155 - - src/app/components/time/time.component.ts - 156 - - - src/app/components/time/time.component.ts - 157 - - - src/app/components/time/time.component.ts - 158 - src/app/components/time/time.component.ts 159 + + src/app/components/time/time.component.ts + 160 + + + src/app/components/time/time.component.ts + 161 + + + src/app/components/time/time.component.ts + 162 + + + src/app/components/time/time.component.ts + 163 + + + src/app/components/time/time.component.ts + 164 + + + src/app/components/time/time.component.ts + 165 + This transaction has been replaced by: @@ -5440,6 +5575,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5680,7 +5819,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5821,7 +5960,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6139,6 +6278,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6619,19 +6762,23 @@ lightning.share - nodes - noder + nodes + noder src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6639,7 +6786,7 @@ BTC kapacitet src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6757,11 +6904,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6879,7 +7026,7 @@ year - år + år src/app/shared/i18n/dates.ts 3 @@ -6887,7 +7034,7 @@ years - år + år src/app/shared/i18n/dates.ts 4 @@ -6895,7 +7042,7 @@ month - måned + måned src/app/shared/i18n/dates.ts 5 @@ -6903,7 +7050,7 @@ months - måneder + måneder src/app/shared/i18n/dates.ts 6 @@ -6911,7 +7058,7 @@ week - uge + uge src/app/shared/i18n/dates.ts 7 @@ -6919,7 +7066,7 @@ weeks - uger + uger src/app/shared/i18n/dates.ts 8 @@ -6927,7 +7074,7 @@ day - dag + dag src/app/shared/i18n/dates.ts 9 @@ -6935,7 +7082,7 @@ days - dage + dage src/app/shared/i18n/dates.ts 10 @@ -6943,7 +7090,7 @@ hour - time + time src/app/shared/i18n/dates.ts 11 @@ -6951,7 +7098,7 @@ hours - timer + timer src/app/shared/i18n/dates.ts 12 @@ -6959,7 +7106,7 @@ minute - minut + minut src/app/shared/i18n/dates.ts 13 @@ -6967,7 +7114,7 @@ minutes - minutter + minutter src/app/shared/i18n/dates.ts 14 @@ -6975,7 +7122,7 @@ second - sekund + sekund src/app/shared/i18n/dates.ts 15 @@ -6983,7 +7130,7 @@ seconds - sekunder + sekunder src/app/shared/i18n/dates.ts 16 diff --git a/frontend/src/locale/messages.de.xlf b/frontend/src/locale/messages.de.xlf index 398f4f60e..a78568ca1 100644 --- a/frontend/src/locale/messages.de.xlf +++ b/frontend/src/locale/messages.de.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Community-Allianzen src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Projektübersetzer src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Projektmitwirkende src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Projektmitglieder src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Projektbetreuer src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -3094,7 +3094,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3778,7 +3778,7 @@ Belohnungsstatistiken src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3787,7 +3787,7 @@ (144 Blöcke) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3796,7 +3796,7 @@ Neueste Blöcke src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3809,7 +3809,7 @@ Anpassungen src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3818,7 +3818,7 @@ Transaktion senden src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3993,9 +3993,8 @@ 58 - - blocks - Blocks + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4004,6 +4003,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -5551,6 +5585,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5791,7 +5829,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5932,7 +5970,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6250,6 +6288,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6730,19 +6772,22 @@ lightning.share - nodes - Nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6750,7 +6795,7 @@ BTC Kapazität src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6868,11 +6913,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.es.xlf b/frontend/src/locale/messages.es.xlf index 66437d4fb..e0cc2d847 100644 --- a/frontend/src/locale/messages.es.xlf +++ b/frontend/src/locale/messages.es.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Alianzas de la comunidad src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Traductores del proyecto src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Contribuyentes al proyecto src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Miembros del proyecto src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Mantenedores del proyecto src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -3080,13 +3084,17 @@ Difficulty Adjustment Ajuste de Dificultad + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Restante - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks bloques - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block bloque - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Estimada - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Previo - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Período Actual - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,101 @@ Next Halving Siguiente halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + bloques minados + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + bloque minado + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) O bien 2x el mínimo, o la tasa de prioridad baja (lo que resulte menor) @@ -3667,7 +3769,7 @@ Estadísticas de recompensa src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3778,7 @@ (144 bloques) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3787,7 @@ Últimos bloques src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3800,7 @@ Ajustes src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3809,7 @@ Transmitir transacción src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3984,8 @@ 58 - - blocks - bloques + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3994,42 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + Otros () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4366,40 +4503,28 @@ Justo ahora src/app/components/time/time.component.ts - 78 + 79 ago atrás - - src/app/components/time/time.component.ts - 97 - - - src/app/components/time/time.component.ts - 98 - - - src/app/components/time/time.component.ts - 99 - - - src/app/components/time/time.component.ts - 100 - - - src/app/components/time/time.component.ts - 101 - - - src/app/components/time/time.component.ts - 102 - src/app/components/time/time.component.ts 103 + + src/app/components/time/time.component.ts + 104 + + + src/app/components/time/time.component.ts + 105 + + + src/app/components/time/time.component.ts + 106 + src/app/components/time/time.component.ts 107 @@ -4412,54 +4537,54 @@ src/app/components/time/time.component.ts 109 - - src/app/components/time/time.component.ts - 110 - - - src/app/components/time/time.component.ts - 111 - - - src/app/components/time/time.component.ts - 112 - src/app/components/time/time.component.ts 113 + + src/app/components/time/time.component.ts + 114 + + + src/app/components/time/time.component.ts + 115 + + + src/app/components/time/time.component.ts + 116 + + + src/app/components/time/time.component.ts + 117 + + + src/app/components/time/time.component.ts + 118 + + + src/app/components/time/time.component.ts + 119 + In ~ En ~ - - src/app/components/time/time.component.ts - 120 - - - src/app/components/time/time.component.ts - 121 - - - src/app/components/time/time.component.ts - 122 - - - src/app/components/time/time.component.ts - 123 - - - src/app/components/time/time.component.ts - 124 - - - src/app/components/time/time.component.ts - 125 - src/app/components/time/time.component.ts 126 + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + src/app/components/time/time.component.ts 130 @@ -4472,54 +4597,54 @@ src/app/components/time/time.component.ts 132 - - src/app/components/time/time.component.ts - 133 - - - src/app/components/time/time.component.ts - 134 - - - src/app/components/time/time.component.ts - 135 - src/app/components/time/time.component.ts 136 + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 + After Después - - src/app/components/time/time.component.ts - 143 - - - src/app/components/time/time.component.ts - 144 - - - src/app/components/time/time.component.ts - 145 - - - src/app/components/time/time.component.ts - 146 - - - src/app/components/time/time.component.ts - 147 - - - src/app/components/time/time.component.ts - 148 - src/app/components/time/time.component.ts 149 + + src/app/components/time/time.component.ts + 150 + + + src/app/components/time/time.component.ts + 151 + + + src/app/components/time/time.component.ts + 152 + src/app/components/time/time.component.ts 153 @@ -4532,22 +4657,34 @@ src/app/components/time/time.component.ts 155 - - src/app/components/time/time.component.ts - 156 - - - src/app/components/time/time.component.ts - 157 - - - src/app/components/time/time.component.ts - 158 - src/app/components/time/time.component.ts 159 + + src/app/components/time/time.component.ts + 160 + + + src/app/components/time/time.component.ts + 161 + + + src/app/components/time/time.component.ts + 162 + + + src/app/components/time/time.component.ts + 163 + + + src/app/components/time/time.component.ts + 164 + + + src/app/components/time/time.component.ts + 165 + This transaction has been replaced by: @@ -5440,6 +5577,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5680,7 +5821,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5821,7 +5962,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6139,6 +6280,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6619,19 +6764,23 @@ lightning.share - nodes - nodos + nodes + nodos src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6639,7 +6788,7 @@ capacidad BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6757,11 +6906,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.fa.xlf b/frontend/src/locale/messages.fa.xlf index 4f11ea03e..e4bec8dbc 100644 --- a/frontend/src/locale/messages.fa.xlf +++ b/frontend/src/locale/messages.fa.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ متحدین جامعه src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ مترجم‌های پروژه src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ مشارکت کنندگان src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ اعضای پروژه src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ نگهدارندگان پروژه src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment تنظیم سختی بلاک‌ها + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining باقیمانده - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks بلاک - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block بلاک - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate تخمین - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous قبلی - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period دوره فعلی - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,110 @@ Next Halving نصف‌شدن یارانهٔ بلاک بعدی - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + بلاک مورد انتظار + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + بلاک مورد انتظار + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + بلاک استخراج‌شده + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + بلاک استخراج‌شده + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + بلاک باقی‌مانده + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + بلاک باقی‌مانده + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + بلاک جلوتر از پیش‌بینی + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + بلاک جلوتر از پیش‌بینی + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + بلاک عقب‌تر از پیش‌بینی + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + بلاک عقب‌تر از پیش‌بینی + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + متوسط زمان ایجاد بلاک + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) «2 برابر نرخ کمینه» یا «اولویت پایین» (هر کدام که کمتر است) @@ -3346,7 +3457,7 @@ استخراج src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3466,7 @@ رتبه‌بندی استخرها src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3479,7 @@ سهم استخرها src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3492,7 @@ نرخ تولید هش و سختی src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3501,7 @@ لایتنینگ src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3510,7 @@ نسبت گره‌های لایتنینگ به شبکه src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3531,7 @@ ظرفیت شبکه لایتنینگ src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3552,7 @@ نسبت گره‌های لایتنینگ به ارائه کننده اینترنت src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3565,7 @@ نسبت گره‌های لایتنینگ به کشور src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3582,7 @@ نقشه گره‌های لایتنینگ دنیا src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3599,7 @@ نقشه کانال‌های گره‌های لایتنینگ دنیا src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3620,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3654,11 @@ نرخ تولید هش (میانگین متحرک) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3778,7 @@ وضعیت پاداش src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3787,7 @@ (144 بلاک) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3796,7 @@ آخرین بلاک‌ها src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3809,7 @@ تنظیم‌سختی‌ها src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3818,7 @@ انتشار تراکنش src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3993,9 @@ 58 - - blocks - بلاک + + blocks + بلاک src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +4004,42 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + دیگر () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4262,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4486,7 @@ پالایش src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4495,7 @@ معکوس src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4504,7 @@ تراکنش vByte بر ثانیه (vB بر ثانیه) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4512,188 @@ Just now همین الان - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago پیش - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + در حدود + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After بعد از - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - در حدود - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4827,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4846,7 @@ بیشتر src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4863,7 @@ کمتر src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4876,7 @@ نمایش نمودار src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4885,7 @@ قفل‌زمانی src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4894,7 @@ تراکنش پیدا نشد. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4903,7 @@ منتظر دیده‌شدن در mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4912,7 @@ نرخ کارمزد مؤثر src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5367,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5378,7 @@ خدمات REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5387,11 @@ نقطه اتصال src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5400,11 @@ توضیحات src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5412,7 @@ دستور پیش‌فرض: action: 'want', data: ['blocks', ...] که نشان می‌دهد چه چیزی باید ارسال شود. گزینه‌های در دسترس: blocks, mempool-blocks, live-2h-chart و stats. دستورهای مربوط به آدرس: 'track-address': '3PbJ...bF9B' جهت دریافت تمام تراکنش‌های جدیدی که خروجی یا ورودی‌های آنها شامل این آدرس می‌شود. آرایه‌ای از تراکنش‌ها برمی‌گرداند. address-transactions برای تراکنش‌های جدید ممپول و block-transactions برای تراکنش‌های بلاک تایید شده‌ی جدید. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5444,6 +5587,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5558,6 +5705,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5676,7 +5831,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5817,7 +5972,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6079,6 +6234,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6127,6 +6290,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6607,19 +6774,23 @@ lightning.share - nodes - گره + nodes + گره src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6627,7 +6798,7 @@ ظرفیت BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6745,11 +6916,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.fi.xlf b/frontend/src/locale/messages.fi.xlf index 44217e369..438fdde54 100644 --- a/frontend/src/locale/messages.fi.xlf +++ b/frontend/src/locale/messages.fi.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Yhteisöliittoumat src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Projektin kääntäjät src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Projektin avustajat src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Projektin jäsenet src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Projektin ylläpitäjät src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -3080,13 +3084,17 @@ Difficulty Adjustment Vaikeudensäätö + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Jäljellä - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks lohkoa - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block lohko - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Arvio - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Edellinen - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Nykyinen jakso - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Puoliintuminen - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Joko 2x vähimmäismäärä tai alhaisen prioriteetin määrä (riippuen siitä, kumpi on alhaisempi) @@ -3667,7 +3767,7 @@ Palkkiotilastot src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 lohkoa) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ Viimeisimmät lohkot src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ Vaikeudensäädöt src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Siirtotapahtuman kuulutus src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - lohkoa + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4366,40 +4500,28 @@ Juuri nyt src/app/components/time/time.component.ts - 78 + 79 ago sitten - - src/app/components/time/time.component.ts - 97 - - - src/app/components/time/time.component.ts - 98 - - - src/app/components/time/time.component.ts - 99 - - - src/app/components/time/time.component.ts - 100 - - - src/app/components/time/time.component.ts - 101 - - - src/app/components/time/time.component.ts - 102 - src/app/components/time/time.component.ts 103 + + src/app/components/time/time.component.ts + 104 + + + src/app/components/time/time.component.ts + 105 + + + src/app/components/time/time.component.ts + 106 + src/app/components/time/time.component.ts 107 @@ -4412,53 +4534,53 @@ src/app/components/time/time.component.ts 109 - - src/app/components/time/time.component.ts - 110 - - - src/app/components/time/time.component.ts - 111 - - - src/app/components/time/time.component.ts - 112 - src/app/components/time/time.component.ts 113 + + src/app/components/time/time.component.ts + 114 + + + src/app/components/time/time.component.ts + 115 + + + src/app/components/time/time.component.ts + 116 + + + src/app/components/time/time.component.ts + 117 + + + src/app/components/time/time.component.ts + 118 + + + src/app/components/time/time.component.ts + 119 + In ~ - - src/app/components/time/time.component.ts - 120 - - - src/app/components/time/time.component.ts - 121 - - - src/app/components/time/time.component.ts - 122 - - - src/app/components/time/time.component.ts - 123 - - - src/app/components/time/time.component.ts - 124 - - - src/app/components/time/time.component.ts - 125 - src/app/components/time/time.component.ts 126 + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + src/app/components/time/time.component.ts 130 @@ -4471,54 +4593,54 @@ src/app/components/time/time.component.ts 132 - - src/app/components/time/time.component.ts - 133 - - - src/app/components/time/time.component.ts - 134 - - - src/app/components/time/time.component.ts - 135 - src/app/components/time/time.component.ts 136 + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 + After jälkeen - - src/app/components/time/time.component.ts - 143 - - - src/app/components/time/time.component.ts - 144 - - - src/app/components/time/time.component.ts - 145 - - - src/app/components/time/time.component.ts - 146 - - - src/app/components/time/time.component.ts - 147 - - - src/app/components/time/time.component.ts - 148 - src/app/components/time/time.component.ts 149 + + src/app/components/time/time.component.ts + 150 + + + src/app/components/time/time.component.ts + 151 + + + src/app/components/time/time.component.ts + 152 + src/app/components/time/time.component.ts 153 @@ -4531,22 +4653,34 @@ src/app/components/time/time.component.ts 155 - - src/app/components/time/time.component.ts - 156 - - - src/app/components/time/time.component.ts - 157 - - - src/app/components/time/time.component.ts - 158 - src/app/components/time/time.component.ts 159 + + src/app/components/time/time.component.ts + 160 + + + src/app/components/time/time.component.ts + 161 + + + src/app/components/time/time.component.ts + 162 + + + src/app/components/time/time.component.ts + 163 + + + src/app/components/time/time.component.ts + 164 + + + src/app/components/time/time.component.ts + 165 + This transaction has been replaced by: @@ -5439,6 +5573,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5679,7 +5817,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5820,7 +5958,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6138,6 +6276,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6618,19 +6760,22 @@ lightning.share - nodes - solmua + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6638,7 +6783,7 @@ BTC kapasiteetti src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6756,11 +6901,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.fr.xlf b/frontend/src/locale/messages.fr.xlf index 208b71ce0..d4158fdaa 100644 --- a/frontend/src/locale/messages.fr.xlf +++ b/frontend/src/locale/messages.fr.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Alliances communautaires src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Traducteurs src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Contributeurs au projet src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Membres du projet src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Mainteneurs de projet src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -3080,13 +3084,17 @@ Difficulty Adjustment Ajustement de la difficulté + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Restant - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks blocs - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block bloc - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Estimation - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Précédent - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Période actuelle - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,110 @@ Next Halving Prochain halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + blocs attendus + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + bloc attendu + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + blocs trouvés + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + bloc trouvé + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + blocs restants + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + bloc restant + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + blocs d'avance + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + bloc d'avance + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + blocs de retard + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + bloc de retard + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + Temps de bloc moyen + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Soit 2x les frais minimum, soit les frais de faible priorité (selon le plus bas) @@ -3667,7 +3778,7 @@ Statistiques de récompense src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3787,7 @@ (144 blocs) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3796,7 @@ Derniers blocs src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3809,7 @@ Ajustements src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3818,7 @@ Émettre une transaction src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3993,9 @@ 58 - - blocks - blocs + + blocks + blocs src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +4004,42 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + Autre ( ) + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4366,40 +4513,28 @@ Juste maintenant src/app/components/time/time.component.ts - 78 + 79 ago Il y a - - src/app/components/time/time.component.ts - 97 - - - src/app/components/time/time.component.ts - 98 - - - src/app/components/time/time.component.ts - 99 - - - src/app/components/time/time.component.ts - 100 - - - src/app/components/time/time.component.ts - 101 - - - src/app/components/time/time.component.ts - 102 - src/app/components/time/time.component.ts 103 + + src/app/components/time/time.component.ts + 104 + + + src/app/components/time/time.component.ts + 105 + + + src/app/components/time/time.component.ts + 106 + src/app/components/time/time.component.ts 107 @@ -4412,54 +4547,54 @@ src/app/components/time/time.component.ts 109 - - src/app/components/time/time.component.ts - 110 - - - src/app/components/time/time.component.ts - 111 - - - src/app/components/time/time.component.ts - 112 - src/app/components/time/time.component.ts 113 + + src/app/components/time/time.component.ts + 114 + + + src/app/components/time/time.component.ts + 115 + + + src/app/components/time/time.component.ts + 116 + + + src/app/components/time/time.component.ts + 117 + + + src/app/components/time/time.component.ts + 118 + + + src/app/components/time/time.component.ts + 119 + In ~ Dans ~ - - src/app/components/time/time.component.ts - 120 - - - src/app/components/time/time.component.ts - 121 - - - src/app/components/time/time.component.ts - 122 - - - src/app/components/time/time.component.ts - 123 - - - src/app/components/time/time.component.ts - 124 - - - src/app/components/time/time.component.ts - 125 - src/app/components/time/time.component.ts 126 + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + src/app/components/time/time.component.ts 130 @@ -4472,54 +4607,54 @@ src/app/components/time/time.component.ts 132 - - src/app/components/time/time.component.ts - 133 - - - src/app/components/time/time.component.ts - 134 - - - src/app/components/time/time.component.ts - 135 - src/app/components/time/time.component.ts 136 + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 + After Après - - src/app/components/time/time.component.ts - 143 - - - src/app/components/time/time.component.ts - 144 - - - src/app/components/time/time.component.ts - 145 - - - src/app/components/time/time.component.ts - 146 - - - src/app/components/time/time.component.ts - 147 - - - src/app/components/time/time.component.ts - 148 - src/app/components/time/time.component.ts 149 + + src/app/components/time/time.component.ts + 150 + + + src/app/components/time/time.component.ts + 151 + + + src/app/components/time/time.component.ts + 152 + src/app/components/time/time.component.ts 153 @@ -4532,22 +4667,34 @@ src/app/components/time/time.component.ts 155 - - src/app/components/time/time.component.ts - 156 - - - src/app/components/time/time.component.ts - 157 - - - src/app/components/time/time.component.ts - 158 - src/app/components/time/time.component.ts 159 + + src/app/components/time/time.component.ts + 160 + + + src/app/components/time/time.component.ts + 161 + + + src/app/components/time/time.component.ts + 162 + + + src/app/components/time/time.component.ts + 163 + + + src/app/components/time/time.component.ts + 164 + + + src/app/components/time/time.component.ts + 165 + This transaction has been replaced by: @@ -5440,6 +5587,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5680,7 +5831,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5821,7 +5972,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6139,6 +6290,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6619,19 +6774,23 @@ lightning.share - nodes - nœuds + nodes + nœuds src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6639,7 +6798,7 @@ Capacité de BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6757,11 +6916,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6911,7 +7070,7 @@ week - semaine + sem src/app/shared/i18n/dates.ts 7 @@ -6919,7 +7078,7 @@ weeks - semaines + sem src/app/shared/i18n/dates.ts 8 diff --git a/frontend/src/locale/messages.he.xlf b/frontend/src/locale/messages.he.xlf index 3ab6c3305..a7e3962da 100644 --- a/frontend/src/locale/messages.he.xlf +++ b/frontend/src/locale/messages.he.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ בני ברית מהקהילה src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ מתרגמי הפרוייקט src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ תורמי הפרוייקט src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ חברי צוות הפרוייקט src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ מתחזקי הפרוייקט src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -3080,13 +3084,17 @@ Difficulty Adjustment התאמת קשי + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining נותרו - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks בלוקים - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block בלוק - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate הערכה - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous הקודם - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period מחזור נוכחי - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving חצייה הבאה - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) או כפול מהמינימום או בעמלת עדיפות נמוכה (הנמוך מבין השניים) @@ -3666,7 +3766,7 @@ סטטיסטיקת פרסים src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3675,7 +3775,7 @@ (144 בלוקים) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3684,7 +3784,7 @@ בלוקים אחרונים src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3697,7 +3797,7 @@ התאמות src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3706,7 +3806,7 @@ שדר טרנזקציה src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3880,9 +3980,8 @@ 58 - - blocks - בלוקים + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3891,6 +3990,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4363,40 +4497,28 @@ זה עתה src/app/components/time/time.component.ts - 78 + 79 ago לפני - - src/app/components/time/time.component.ts - 97 - - - src/app/components/time/time.component.ts - 98 - - - src/app/components/time/time.component.ts - 99 - - - src/app/components/time/time.component.ts - 100 - - - src/app/components/time/time.component.ts - 101 - - - src/app/components/time/time.component.ts - 102 - src/app/components/time/time.component.ts 103 + + src/app/components/time/time.component.ts + 104 + + + src/app/components/time/time.component.ts + 105 + + + src/app/components/time/time.component.ts + 106 + src/app/components/time/time.component.ts 107 @@ -4409,53 +4531,53 @@ src/app/components/time/time.component.ts 109 - - src/app/components/time/time.component.ts - 110 - - - src/app/components/time/time.component.ts - 111 - - - src/app/components/time/time.component.ts - 112 - src/app/components/time/time.component.ts 113 + + src/app/components/time/time.component.ts + 114 + + + src/app/components/time/time.component.ts + 115 + + + src/app/components/time/time.component.ts + 116 + + + src/app/components/time/time.component.ts + 117 + + + src/app/components/time/time.component.ts + 118 + + + src/app/components/time/time.component.ts + 119 + In ~ - - src/app/components/time/time.component.ts - 120 - - - src/app/components/time/time.component.ts - 121 - - - src/app/components/time/time.component.ts - 122 - - - src/app/components/time/time.component.ts - 123 - - - src/app/components/time/time.component.ts - 124 - - - src/app/components/time/time.component.ts - 125 - src/app/components/time/time.component.ts 126 + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + src/app/components/time/time.component.ts 130 @@ -4468,54 +4590,54 @@ src/app/components/time/time.component.ts 132 - - src/app/components/time/time.component.ts - 133 - - - src/app/components/time/time.component.ts - 134 - - - src/app/components/time/time.component.ts - 135 - src/app/components/time/time.component.ts 136 + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 + After לאחר - - src/app/components/time/time.component.ts - 143 - - - src/app/components/time/time.component.ts - 144 - - - src/app/components/time/time.component.ts - 145 - - - src/app/components/time/time.component.ts - 146 - - - src/app/components/time/time.component.ts - 147 - - - src/app/components/time/time.component.ts - 148 - src/app/components/time/time.component.ts 149 + + src/app/components/time/time.component.ts + 150 + + + src/app/components/time/time.component.ts + 151 + + + src/app/components/time/time.component.ts + 152 + src/app/components/time/time.component.ts 153 @@ -4528,22 +4650,34 @@ src/app/components/time/time.component.ts 155 - - src/app/components/time/time.component.ts - 156 - - - src/app/components/time/time.component.ts - 157 - - - src/app/components/time/time.component.ts - 158 - src/app/components/time/time.component.ts 159 + + src/app/components/time/time.component.ts + 160 + + + src/app/components/time/time.component.ts + 161 + + + src/app/components/time/time.component.ts + 162 + + + src/app/components/time/time.component.ts + 163 + + + src/app/components/time/time.component.ts + 164 + + + src/app/components/time/time.component.ts + 165 + This transaction has been replaced by: @@ -5426,6 +5560,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5665,7 +5803,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5806,7 +5944,7 @@ סאטושיז src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6120,6 +6258,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6589,19 +6731,22 @@ lightning.share - nodes - צמתים + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6609,7 +6754,7 @@ קיבולת ביטקוין src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6721,11 +6866,11 @@ ביטקוין src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.hu.xlf b/frontend/src/locale/messages.hu.xlf index 2cbb07923..9b07c7917 100644 --- a/frontend/src/locale/messages.hu.xlf +++ b/frontend/src/locale/messages.hu.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 385,389 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1451,7 +1451,7 @@ Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1459,7 +1459,7 @@ Céges Szponzorok 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1468,7 +1468,7 @@ Közösségi Szponzorok ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1477,7 +1477,7 @@ Közösségi Integrációk src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1486,7 +1486,7 @@ Közösségi Szövetségesek src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1495,7 +1495,7 @@ Projekt Fordítók src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1504,7 +1504,7 @@ Projekt Kontribútorok src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1513,7 +1513,7 @@ Projekt Tagok src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1522,7 +1522,7 @@ Projekt Fenntartók src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1531,7 +1531,7 @@ Részletek src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -2042,7 +2042,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2091,7 +2091,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2112,7 +2112,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2153,7 +2153,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2179,7 +2179,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2201,7 +2201,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2213,7 +2213,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2295,11 +2295,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2329,7 +2329,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2405,7 +2405,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2446,7 +2446,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2463,7 +2463,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2504,7 +2504,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2532,11 +2532,12 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 Size per weight + Méret súlyonként src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts 200,199 @@ -2630,6 +2631,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2683,11 +2688,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2843,11 +2848,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2888,19 +2893,19 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2920,10 +2925,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -3081,13 +3082,17 @@ Difficulty Adjustment Bányászási Nehézségifok + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3095,11 +3100,11 @@ Remaining Hátramaradt - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3112,11 @@ blocks - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3131,11 +3136,11 @@ block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3148,11 +3153,11 @@ Estimate Becslés - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3161,20 +3166,24 @@ Previous Előző - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Mostani Periódus - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3183,11 +3192,99 @@ Next Halving Következő Felezés - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) @@ -3343,7 +3440,7 @@ Bányászat src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3352,7 +3449,7 @@ Pool Rangsorolás src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3365,7 +3462,7 @@ Pool Fölény src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3378,7 +3475,7 @@ Hashráta és Nehézség src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3387,7 +3484,7 @@ Villám src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3396,7 +3493,7 @@ Villám Nodeok Hálózatonként src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3417,7 +3514,7 @@ Villám Hálózati Kapacítás src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3438,7 +3535,7 @@ Villám Node Szolgáltatónként src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3451,7 +3548,7 @@ Villám Nodeok Országonként src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3468,7 +3565,7 @@ Villám Node Világ Térkép src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3485,7 +3582,7 @@ Villám Node Csatorna Világ Térkép src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3506,11 +3603,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3540,11 +3637,11 @@ Hashráta (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3661,7 +3758,7 @@ Jutalmi statisztikák src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3670,7 +3767,7 @@ (144 blokk) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3679,7 +3776,7 @@ Legutóbbi blokkok src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3692,7 +3789,7 @@ Módosítás src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3701,7 +3798,7 @@ Tranzakció Küldése src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3869,9 +3966,8 @@ 58 - - blocks - blokk + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3880,6 +3976,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4099,12 +4230,13 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex Miners Reward + Bányász Jutalma src/app/components/reward-stats/reward-stats.component.html 5 @@ -4308,7 +4440,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4317,7 +4449,7 @@ Invertál src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4326,7 +4458,7 @@ vBájtnyi tranzakciók másodpercenként (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4334,196 +4466,187 @@ Just now Épp most - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After után - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4578,7 +4701,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4594,11 +4717,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4656,7 +4779,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4675,7 +4798,7 @@ Továbbiak megjelenítése src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4692,7 +4815,7 @@ Kevesebb megjelenítése src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4705,7 +4828,7 @@ Diagram megjelenítése src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4714,7 +4837,7 @@ Zárolási idő src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4723,7 +4846,7 @@ Nem található tranzakció. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4732,7 +4855,7 @@ Várakozás arra hogy a mempoolban feltünjön... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4741,7 +4864,7 @@ Effektív díj ráta src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5186,6 +5309,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5193,7 +5320,7 @@ REST API szolgáltatás src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5202,11 +5329,11 @@ Végpont src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5215,11 +5342,11 @@ Leírás src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5227,7 +5354,7 @@ Alaphelyzeti push: művelet: 'kell', data: ['blocks', ...] hogy kifejezd mit szeretnél pusholni. Elérhető: blocks, mempool-blocks, live-2h-chart, and stats.Pusholjon tranzakciókat címekhez fogva: 'cím-követés': '3PbJ...bF9B' az összes új tranzakció fogadásához, amely ezt a címet tartalmazza bemenetként vagy kimenetként. Tranzakciók tömbjét adja vissza. cím-tranzakciókúj mempool tranzakciókhoz , és block-tranzakciók az új blokk megerősített tranzakciókhoz. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5324,7 +5451,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5400,6 +5527,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5440,7 +5571,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5457,7 +5588,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5474,7 +5605,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5495,7 +5626,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5508,12 +5639,20 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5542,6 +5681,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5578,11 +5721,11 @@ Villám csatorna src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5591,11 +5734,11 @@ Utolsó frissítés src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5611,11 +5754,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5624,11 +5767,11 @@ Zárási dátum src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5637,7 +5780,7 @@ Lezárva átala src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5646,7 +5789,7 @@ Nyitó tranzakció src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5655,7 +5798,7 @@ Záró tranzakció src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5677,6 +5820,7 @@ Force closed + Kényszer zárva src/app/lightning/channel/closing-type/closing-type.component.ts 24 @@ -5684,6 +5828,7 @@ Force closed with penalty + Kényszer zárva büntető díjjal src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -5736,11 +5881,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5767,7 +5912,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -5817,6 +5962,7 @@ avg + átlag src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -5825,6 +5971,7 @@ med + közép src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -6005,10 +6152,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -6024,6 +6167,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6062,16 +6213,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6104,7 +6259,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6120,11 +6275,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6158,9 +6313,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6182,6 +6345,7 @@ Fee distribution + Díj eloszlás src/app/lightning/node-fee-chart/node-fee-chart.component.html 2 @@ -6190,6 +6354,7 @@ Outgoing Fees + Kimenő Díjak src/app/lightning/node-fee-chart/node-fee-chart.component.ts 170 @@ -6201,6 +6366,7 @@ Incoming Fees + Beérkező Díjak src/app/lightning/node-fee-chart/node-fee-chart.component.ts 178 @@ -6235,11 +6401,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6252,19 +6418,20 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity Active channels + Aktív csatornák src/app/lightning/node/node-preview.component.html 26,30 src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6277,19 +6444,11 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6297,7 +6456,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6306,7 +6465,7 @@ Szín src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6315,7 +6474,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6327,7 +6486,7 @@ Exclusively on Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6335,7 +6494,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6343,7 +6502,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6352,7 +6511,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6360,7 +6519,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6368,16 +6527,17 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate Channel base fee + Csatorna alapdíj src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6385,7 +6545,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6394,7 +6554,7 @@ TLV kiterjesztési esemény src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6403,7 +6563,7 @@ Nyitott csatornák src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6412,7 +6572,7 @@ Lezárt csatornák src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6453,6 +6613,7 @@ No geolocation data available + Geolokációs adat nem elérhető src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 219,214 @@ -6460,6 +6621,7 @@ Active channels map + Aktív csatorna térkép src/app/lightning/nodes-channels/node-channels.component.html 2,3 @@ -6468,6 +6630,7 @@ Indexing in progress + Indexelés folyamatban src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 121,116 @@ -6477,8 +6640,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6488,8 +6651,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6499,8 +6662,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6524,26 +6687,30 @@ lightning.share - nodes - nódok + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity + BTC kapacitás src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6656,11 +6823,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6741,27 +6908,12 @@ Oldest lightning nodes + Legidősebb villám nodeok src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.ts 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes Legrégebbi nodeok diff --git a/frontend/src/locale/messages.it.xlf b/frontend/src/locale/messages.it.xlf index d48ce0dcb..22d7cf978 100644 --- a/frontend/src/locale/messages.it.xlf +++ b/frontend/src/locale/messages.it.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 385,389 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1452,7 +1452,7 @@ I nostri mempool e blockchain explorer per la community di Bitcoin, con attenzione su costi di transazione di mercato e ecosistema multi-strato, completamente self-hosted senza bisogno di terze parti. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1460,7 +1460,7 @@ Sponsor Aziendali 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1469,7 +1469,7 @@ Sponsor comunitari ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1478,7 +1478,7 @@ Integrazioni della comunità src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1487,7 +1487,7 @@ Alleanze della comunità src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Traduttori del progetto src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Hanno contribuito al progetto src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Membri del Progetto src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Manutentori del progetto src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1532,7 +1532,7 @@ Su di noi src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2686,11 +2690,11 @@ src/app/lightning/node/node.component.html - 52,55 + 55,58 src/app/lightning/node/node.component.html - 96,100 + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,19 +2895,19 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2923,10 +2927,6 @@ src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -3084,13 +3084,17 @@ Difficulty Adjustment Aggiustamento della Difficoltà + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3098,11 +3102,11 @@ Remaining Rimanente - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3111,11 +3115,11 @@ blocks blocchi - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3136,11 +3140,11 @@ block blocco - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3153,11 +3157,11 @@ Estimate Stima - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3166,20 +3170,24 @@ Previous Precedente - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Periodo Attuale - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3188,11 +3196,99 @@ Next Halving Prossimo Halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) O 2x il minimo o il tasso di Bassa Priorità (in base a quale sia il più basso) @@ -3350,7 +3446,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3359,7 +3455,7 @@ Classifica Pool src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3372,7 +3468,7 @@ Predominanza Pool src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3385,7 +3481,7 @@ Hashrate & Difficoltà src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3394,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3403,7 +3499,7 @@ Nodi Lightning Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3424,7 +3520,7 @@ Capacità Lightning Network src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3445,7 +3541,7 @@ Nodi Lightning Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3458,7 +3554,7 @@ Nodi Lightning Per Paese src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3474,7 +3570,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3490,7 +3586,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3511,11 +3607,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3545,11 +3641,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3668,7 +3764,7 @@ Statistiche di ricompensa src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3677,7 +3773,7 @@ (144 blocchi) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3686,7 +3782,7 @@ Ultimi blocchi src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3699,7 +3795,7 @@ Adeguamenti src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3708,7 +3804,7 @@ Trasmetti Transazione src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3978,8 @@ 58 - - blocks - blocchi + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3988,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4114,7 +4244,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4325,7 +4455,7 @@ Filtro src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4334,7 +4464,7 @@ Invertire src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4343,7 +4473,7 @@ vByte transati al secondo (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4351,196 +4481,187 @@ Just now Proprio adesso - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago fa - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Dopo - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - In ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4594,7 +4715,7 @@ src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4610,11 +4731,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4671,7 +4792,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4688,7 +4809,7 @@ Show more src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4704,7 +4825,7 @@ Show less src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4716,7 +4837,7 @@ Show diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4725,7 +4846,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4734,7 +4855,7 @@ Transazione non trovata. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4743,7 +4864,7 @@ Aspettando che appaia nella mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4752,7 +4873,7 @@ Prezzo effettivo della commissione src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5191,6 +5312,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5198,7 +5323,7 @@ Servizio REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5207,11 +5332,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5220,11 +5345,11 @@ Descrizione src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5232,7 +5357,7 @@ Push predefinito: action: 'want', data: ['blocks', ...] per esprimere cosa vuoi spingere. Disponibile: blocks, mempool-blocks, live-2h-chart, and stats.Spingi transazioni collegate all'indirizzo: 'track-address': '3PbJ...bF9B' per ricevere tutte le nuove transazioni contenenti quell'indirizzo come input o output. Restituisce un array di transazioni. address-transactions per nuove transazioni di mempool e block-transactions per le nuove transazioni confermate nel blocco. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5327,7 +5452,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5397,6 +5522,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5433,7 +5562,7 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html @@ -5449,7 +5578,7 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html @@ -5465,7 +5594,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5485,7 +5614,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5497,12 +5626,20 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5531,6 +5668,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5565,11 +5706,11 @@ Lightning channel src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5577,11 +5718,11 @@ Last update src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5597,11 +5738,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5609,11 +5750,11 @@ Closing date src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5621,7 +5762,7 @@ Closed by src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5629,7 +5770,7 @@ Opening transaction src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5637,7 +5778,7 @@ Closing transaction src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5713,11 +5854,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5741,7 +5882,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -5973,10 +6114,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5991,6 +6128,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6029,16 +6174,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6069,7 +6218,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -6085,11 +6234,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6123,9 +6272,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6199,11 +6356,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6215,7 +6372,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6227,7 +6384,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6239,19 +6396,11 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6259,7 +6408,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6267,7 +6416,7 @@ Color src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6275,7 +6424,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6287,7 +6436,7 @@ Exclusively on Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6295,7 +6444,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6303,7 +6452,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6312,7 +6461,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6320,7 +6469,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6328,7 +6477,7 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6337,7 +6486,7 @@ Channel base fee src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6345,7 +6494,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6353,7 +6502,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6361,7 +6510,7 @@ Open channels src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6369,7 +6518,7 @@ Closed channels src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6433,8 +6582,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6444,8 +6593,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6455,8 +6604,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6479,25 +6628,29 @@ lightning.share - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6603,11 +6756,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6688,22 +6841,6 @@ 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes diff --git a/frontend/src/locale/messages.ja.xlf b/frontend/src/locale/messages.ja.xlf index 56975a922..cf9d860dd 100644 --- a/frontend/src/locale/messages.ja.xlf +++ b/frontend/src/locale/messages.ja.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ コミュニティーの提携 src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ プロジェクト翻訳者 src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ プロジェクト貢献者 src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ プロジェクトメンバー src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ プロジェクトメンテナー src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -3094,7 +3094,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3203,6 +3203,7 @@ blocks expected + 個のブロック - 期待値 src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + 個のブロック - 期待値 src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + 個のブロック - 採掘済 src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + 個のブロック - 採掘済 src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + 個のブロック - 残り src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + 個のブロック - 残り src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + 個のブロック - 早い src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + 個のブロック - 早い src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + 個のブロック - 遅い src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + 個のブロック - 遅い src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + 平均ブロック生成時間 src/app/components/difficulty/difficulty.component.html 42,45 @@ -3767,7 +3778,7 @@ 報酬の統計値 src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3776,7 +3787,7 @@ (144つのブロック) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3785,7 +3796,7 @@ 最新のブロック src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3798,7 +3809,7 @@ 補正 src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3807,7 +3818,7 @@ ブロードキャストトランザクション src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3982,9 +3993,9 @@ 58 - - blocks - のブロック + + blocks + ブロック src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3993,6 +4004,42 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + その他 ( ) + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4148,7 +4195,7 @@ Mined blocks - マイニングされたブロック + 採掘されたブロック src/app/components/pool/pool.component.html 141,143 @@ -4269,7 +4316,7 @@ BTC/block - BTC/ブロック + BTC/ブロック src/app/components/reward-stats/reward-stats.component.html 21,24 @@ -4279,7 +4326,7 @@ Avg Tx Fee - 平均トランザクション手数料 + 平均取引手数料 src/app/components/reward-stats/reward-stats.component.html 30 @@ -4531,6 +4578,7 @@ In ~ + あと〜 src/app/components/time/time.component.ts 126 @@ -5539,6 +5587,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5779,7 +5831,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5920,7 +5972,7 @@ サトシ src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6238,6 +6290,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6718,19 +6774,23 @@ lightning.share - nodes - + nodes + ノード src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6738,7 +6798,7 @@ BTC 容量 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6856,11 +6916,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.ka.xlf b/frontend/src/locale/messages.ka.xlf index 762fd754e..ae1ba6c6d 100644 --- a/frontend/src/locale/messages.ka.xlf +++ b/frontend/src/locale/messages.ka.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ ალიანსი src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ მთარგმნელები src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ მოხალისეები src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ პროექტის წევრები src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ პროექტის შემქმნელები src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment სირთულე + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining დარჩა - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks ბლოკი - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block ბლოკი - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate დაახლოებით - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous წინა - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period ეს პერიოდი - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving შემდეგი ჰალვინგი - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) ან მინიმუმის 2x ან დაბალ პრიორიტეტული საკომისიო (რომელიც უფრო დაბალია) @@ -3346,7 +3446,7 @@ მაინინგი src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ Pools ის რეიტინგი src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ Pools ის დომინურობა src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ ჰაშრეიტი და სირთულე src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ Lightning ნოდა ყოველ ნეთვორქზე src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ Lightning ის შესაძლებლობა src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ Lightning ის ნოდა ქვეყნების მიხედვით src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ Lightning ის ნოდები მსოფლიოს რუქაზე src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ Lightning ის ნოდის ჩანელები მსოფლიო რუქაზე src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ ჰაშრეიტი src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3767,7 @@ ანაზღაურების სტატისტიკა src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 ბლოკი) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ ბოლო ბლოკები src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ ცვლილებები src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Broadcast Transaction src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - ბლოკები + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4473,7 @@ გაფილტვრა src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4482,7 @@ შებრუნება src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4491,7 @@ ტრანზაქცია vBytes წამში (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4499,187 @@ Just now ახლა - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago წინ - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After შემდეგ - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - ~-ში - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4813,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4832,7 @@ მეტის ჩვენება src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4849,7 @@ ნაკლების ჩვენება src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4862,7 @@ დიაგრამის ჩვენება src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4871,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4880,7 @@ ტრანსაქცია ვერ მოიძებნა. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4889,7 @@ დაელოდეთ mempool-ში რომ გამოჩნდეს... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4898,7 @@ ეფექტური საკომისიო src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5353,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5364,7 @@ REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5373,11 @@ დასასრული src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5386,11 @@ აღწერა src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5398,7 @@ Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5444,6 +5573,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5558,6 +5691,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5676,7 +5817,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5817,7 +5958,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6079,6 +6220,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6127,6 +6276,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6607,19 +6760,22 @@ lightning.share - nodes - ნოდა + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6627,7 +6783,7 @@ BTC სიმძლავრე src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6745,11 +6901,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.ko.xlf b/frontend/src/locale/messages.ko.xlf index 1d2be3910..c8ba64090 100644 --- a/frontend/src/locale/messages.ko.xlf +++ b/frontend/src/locale/messages.ko.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1486,7 +1486,7 @@ 커뮤니티 연합 src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1495,7 +1495,7 @@ 프로젝트 번역자 src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1504,7 +1504,7 @@ 프로젝트 참여자 목록 src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1513,7 +1513,7 @@ 프로젝트 멤버들 src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1522,7 +1522,7 @@ 프로젝트 관리자 목록 src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1580,7 +1580,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2043,7 +2043,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2092,7 +2092,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2113,7 +2113,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2153,7 +2153,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2179,7 +2179,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2201,7 +2201,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2213,7 +2213,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2295,11 +2295,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2329,7 +2329,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2398,7 +2398,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2437,7 +2437,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2454,7 +2454,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2495,7 +2495,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2523,7 +2523,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2621,6 +2621,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2828,11 +2832,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2872,7 +2876,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3061,13 +3065,17 @@ Difficulty Adjustment 난이도 조정 + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3075,11 +3083,11 @@ Remaining 남은 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3088,11 +3096,11 @@ blocks 블록 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3113,11 +3121,11 @@ block 블록 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3130,11 +3138,11 @@ Estimate 추정 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3143,20 +3151,24 @@ Previous 이전 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period 현재 기간 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3165,11 +3177,99 @@ Next Halving 다음 반감기 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) 최소 수수료의 2배 또는 낮은 우선 순위 금액(낮은 금액 선택) @@ -3325,7 +3425,7 @@ 채굴 src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3334,7 +3434,7 @@ 채굴풀 순위 src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3347,7 +3447,7 @@ 채굴풀 도미넌스 src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3359,7 +3459,7 @@ Hashrate & Difficulty src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3368,7 +3468,7 @@ 라이트닝 src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3377,7 +3477,7 @@ 네트워크당 라이트닝 노드 src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3397,7 +3497,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3417,7 +3517,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3429,7 +3529,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3445,7 +3545,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3461,7 +3561,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3482,11 +3582,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3515,11 +3615,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3638,7 +3738,7 @@ 보상 관련 데이터 src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3647,7 +3747,7 @@ (144 블록) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3656,7 +3756,7 @@ 최신 블록 src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3669,7 +3769,7 @@ 조정 src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3678,7 +3778,7 @@ 트랜잭션을 비트코인 네트워크에 전송하기 src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3845,9 +3945,8 @@ 58 - - blocks - 블록 + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3856,6 +3955,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4077,7 +4211,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4295,7 +4429,7 @@ 필터 src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4304,7 +4438,7 @@ 뒤집기 src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4313,7 +4447,7 @@ 초당 트랜잭션 vByte (vB / s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4321,196 +4455,187 @@ Just now 방금 전 - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After 이후 - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - ~ 안에 - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4641,7 +4766,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4659,7 +4784,7 @@ 더 보기 src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4676,7 +4801,7 @@ 숨기기 src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4689,7 +4814,7 @@ 도표 보기 src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4698,7 +4823,7 @@ 잠금 시간 src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4707,7 +4832,7 @@ 트랜잭션을 찾을 수 없음 src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4716,7 +4841,7 @@ 멤풀에 포함될때까지 대기하는 중... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4725,7 +4850,7 @@ 유효 수수료율 src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5164,13 +5289,17 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5179,11 +5308,11 @@ 엔드포인트 src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5192,11 +5321,11 @@ 설명 src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5204,7 +5333,7 @@ 기본 푸시: 작업: 'want', 데이터 : [ 'blocks', ...] 을 사용하여 푸시하려는 것을 표시할 수 있습니다. 사용 가능: blocks, mempool-blocks, live-2h-chart, 및stats.주소와 관련된 트랜잭션을 푸시:’track-address’: ‘3PbJ…bF9B’을 사용하여 인풋 또는 아웃풋 주소를 포함한 새로운 트랜잭션을 받을 수 있습니다. 트랜잭션들은 행렬로 반환합니다. 새로운 트랜잭션일 경우address-transactions이고, 새롭게 컨펌된 트랜잭션일 경우block-transactions입니다. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5369,6 +5498,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5475,6 +5608,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5589,7 +5730,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5717,7 +5858,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -5963,6 +6104,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6011,6 +6160,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6454,25 +6607,29 @@ lightning.share - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6578,11 +6735,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.lt.xlf b/frontend/src/locale/messages.lt.xlf index f809420b4..d10094194 100644 --- a/frontend/src/locale/messages.lt.xlf +++ b/frontend/src/locale/messages.lt.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Bendruomenės Aljansai src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Projekto Vertėjai src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Projekto Pagalbininkai src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Projekto Nariai src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Projekto Prižiūrėtojai src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -3094,7 +3094,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3767,7 +3767,7 @@ Atlygio statistika src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3776,7 +3776,7 @@ (144 blokai) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3785,7 +3785,7 @@ Naujausi blokai src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3798,7 +3798,7 @@ Koregavimai src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3807,7 +3807,7 @@ Transliuoti Sandorį src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3982,9 +3982,8 @@ 58 - - blocks - blokai + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3993,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -5539,6 +5573,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5779,7 +5817,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5920,7 +5958,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6238,6 +6276,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6718,19 +6760,22 @@ lightning.share - nodes - mazgai + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6738,7 +6783,7 @@ BTC talpumas src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6856,11 +6901,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.mk.xlf b/frontend/src/locale/messages.mk.xlf index 7ee9b19ae..9b2cbd58f 100644 --- a/frontend/src/locale/messages.mk.xlf +++ b/frontend/src/locale/messages.mk.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Соработка со Заедницата src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Преведувачи src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Контрибутори src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Членови на проектот src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Одржувачи на проектот src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -3094,7 +3094,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3778,7 +3778,7 @@ Статистика за награди src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3787,7 +3787,7 @@ (144 блока) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3796,7 +3796,7 @@ Последни блокови src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3809,7 +3809,7 @@ Промени src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3818,7 +3818,7 @@ Емитирај ја Трансакцијата src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3993,9 +3993,8 @@ 58 - - blocks - блока + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4004,6 +4003,42 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + Други () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -5551,6 +5586,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5791,7 +5830,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5932,7 +5971,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6250,6 +6289,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6730,19 +6773,23 @@ lightning.share - nodes - нодови + nodes + нодови src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6750,7 +6797,7 @@ BTC капацитет src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6868,11 +6915,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.nb.xlf b/frontend/src/locale/messages.nb.xlf index 3786617b7..d4fdbce21 100644 --- a/frontend/src/locale/messages.nb.xlf +++ b/frontend/src/locale/messages.nb.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ Samfunnsallianser src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Oversettere src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Bidragsytere til prosjektet src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Prosjektmedlemmer src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Prosjektvedlikeholdere src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment Vanskelighetsgradjustering + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Gjenstående - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks blokker - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block blokk - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Anslag - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Forrige - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Nåværende periode - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Neste halvering - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Enten 2x av minimum eller lav prioritetsrate (den som er lavest) @@ -3346,7 +3446,7 @@ Utvinning src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ Utvinningsgruppe-rangering src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ Utvinningsgruppe-dominans src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ Hashrate og vanskelighetsgrad src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ Lightning-noder per nettverk src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ Lightningnettverk-kapasitet src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ Lightning-noder per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ Lightning-noder per land src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ Lightning-noder verdenskart src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ Lightning-kanaler Verdenskart src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3767,7 @@ Belonnings-statistikk src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 blokker) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ Nyeste blokker src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ Justeringer src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Send transaksjon src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - blokker + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4473,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4482,7 @@ Inverter src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4491,7 @@ Transaksjoner per sekund (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4499,187 @@ Just now Akkurat nå - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago siden - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Etter - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Om ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4813,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4832,7 @@ Vis mer src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4849,7 @@ Vis mindre src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4862,7 @@ Vis diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4871,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4880,7 @@ Transaksjon ikke funnet src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4889,7 @@ Venter på at den kommer inn i mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4898,7 @@ Effektiv avgift src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5353,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5364,7 @@ REST API-tjeneste src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5373,11 @@ Endepunkt src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5386,11 @@ Beskrivelse src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5398,7 @@ Standard push: handling: 'want', data: ['blocks', ...] for å uttrykke hva du vil ha pushet. Tilgjengelig: blocks , mempool-blocks , live-2h-chart , og stats . Push-transaksjoner relatert til adresse: 'track-address': '3PbJ...bF9B' for å motta alle nye transaksjoner som inneholder den adressen som inngang eller utgang. Returnerer en tabell av transaksjoner. adress-transactions for nye mempool-transaksjoner, og block-transactions for nye blokkbekreftede transaksjoner. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5444,6 +5573,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5558,6 +5691,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5676,7 +5817,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5817,7 +5958,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6079,6 +6220,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6127,6 +6276,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6607,19 +6760,22 @@ lightning.share - nodes - noder + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6627,7 +6783,7 @@ BTC-kapasitet src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6745,11 +6901,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.ne.xlf b/frontend/src/locale/messages.ne.xlf index 92be31844..1408a0225 100644 --- a/frontend/src/locale/messages.ne.xlf +++ b/frontend/src/locale/messages.ne.xlf @@ -357,11 +357,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -382,11 +382,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -424,7 +424,7 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash @@ -449,7 +449,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -592,11 +592,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -748,11 +748,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -773,16 +773,24 @@ src/app/components/about/about.component.html - 385,389 + 391,394 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 87 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -793,14 +801,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 89 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -988,7 +1004,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1036,7 +1052,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1052,11 +1068,11 @@ src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 283,285 transaction.version @@ -1106,7 +1122,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1128,7 +1144,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1140,10 +1156,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1156,11 +1168,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1188,11 +1200,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 257,262 src/app/components/transaction/transaction.component.html - 406,412 + 401,407 transaction.details @@ -1209,11 +1221,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 244,248 src/app/components/transaction/transaction.component.html - 377,383 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1231,7 +1243,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 246,245 @@ -1251,7 +1263,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1267,7 +1279,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1438,7 +1450,7 @@ Bitcoin समुदायको लागि हाम्रो mempool र blockchain अन्वेषक, लेनदेन शुल्क बजार र बहु-तह इकोसिस्टममा ध्यान केन्द्रित गर्दै, कुनै पनि विश्वसनीय तेस्रो-पक्ष बिना पूर्ण रूपमा स्व-होस्ट गरिएको। src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1446,7 +1458,7 @@ एंटरप्राइज़ प्रायोजक 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1455,7 +1467,7 @@ समुदाय प्रायोजक ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1464,7 +1476,7 @@ समुदाय एकीकरण src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1473,7 +1485,7 @@ सामुदायिक गठबन्धनहरू src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1482,7 +1494,7 @@ परियोजना अनुवादकहरू src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1491,7 +1503,7 @@ परियोजना योगदानकर्ताहरू src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1500,7 +1512,7 @@ परियोजना सदस्यहरू src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1509,7 +1521,7 @@ परियोजना संरक्षकहरू src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1518,7 +1530,7 @@ विवरण src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1530,7 +1542,7 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 @@ -1567,7 +1579,7 @@ src/app/components/amount/amount.component.html - 6,9 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1583,7 +1595,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1665,7 +1677,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1886,7 +1898,7 @@ src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header @@ -1899,7 +1911,7 @@ src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header @@ -1912,7 +1924,7 @@ src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header @@ -1921,7 +1933,7 @@ एसेट/सम्पत्ति डेटा लोड गर्दा त्रुटि। src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -2028,7 +2040,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2045,7 +2057,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -2061,7 +2073,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2073,11 +2085,11 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2085,19 +2097,19 @@ Indexing blocks src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2137,7 +2149,7 @@ src/app/components/transaction/transaction.component.html - 476 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2163,11 +2175,11 @@ src/app/components/transaction/transaction.component.html - 476,477 + 473 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2181,11 +2193,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2197,7 +2209,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,43 Transaction fee rate transaction.fee-rate @@ -2215,19 +2227,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2267,27 +2279,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 478,481 src/app/components/transaction/transaction.component.html - 492,494 + 489,491 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2295,7 +2307,7 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte @@ -2309,11 +2321,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 269,272 Transaction Virtual Size transaction.vsize @@ -2384,7 +2396,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2421,11 +2433,11 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2442,7 +2454,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2451,15 +2463,15 @@ साइज src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2483,7 +2495,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 265,267 src/app/dashboard/dashboard.component.html @@ -2495,11 +2507,11 @@ वजन src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2507,11 +2519,22 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 273,275 + + + + Size per weight + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2527,15 +2550,6 @@ shared.block-title - - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee मध्य शुल्क @@ -2545,7 +2559,7 @@ src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2562,11 +2576,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2584,7 +2598,7 @@ src/app/components/block/block.component.html - 168,170 + 173,175 block.miner @@ -2597,7 +2611,7 @@ src/app/components/block/block.component.ts - 227 + 242 @@ -2607,6 +2621,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2622,32 +2640,48 @@ Previous Block - - Block health + + Health src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown अज्ञात src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2664,7 +2698,7 @@ शुल्क अवधि src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2677,7 +2711,7 @@ 140 vBytes नेटिव सेगविट ट्रांसेक्शन सरदर को अनुसार src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2701,49 +2735,60 @@ Transaction fee tooltip - - Subsidy + fees: - अनुदान + शुल्क: + + Subsidy + fees src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block src/app/components/block/block.component.html - 225,227 + 231 block.actual-block @@ -2752,7 +2797,7 @@ बिट्स src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2761,7 +2806,7 @@ मर्कल रुट src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2770,7 +2815,7 @@ कठिनाई src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2786,11 +2831,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2799,7 +2844,7 @@ नोन्स src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce @@ -2808,32 +2853,41 @@ ब्लक हेडर हेक्स src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details विवरण src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2843,20 +2897,16 @@ डाटा लोड गर्दा त्रुटि भयो। src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2871,7 +2921,7 @@ Why is this block empty? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation @@ -2917,18 +2967,6 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward इनाम @@ -2992,7 +3030,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -3025,13 +3063,17 @@ Difficulty Adjustment कठिनाई समायोजन / डिफीकल्टी एडजस्टमेंट + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3039,11 +3081,11 @@ Remaining बाँकी - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3052,11 +3094,11 @@ blocks ब्लकहरू - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3077,11 +3119,11 @@ block ब्लक - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3094,11 +3136,11 @@ Estimate अनुमान - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3107,20 +3149,24 @@ Previous अघिल्लो - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period वर्तमान अवधि - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3129,11 +3175,99 @@ Next Halving अर्को हल्विंग - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) या त 2x न्यूनतम, वा कम प्राथमिकता दर (जुन कम छ) @@ -3231,7 +3365,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3244,7 +3378,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3256,7 +3390,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3270,7 +3404,7 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3290,7 +3424,7 @@ माईनिंग src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3299,7 +3433,7 @@ पूल रैंकिंग src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3312,7 +3446,7 @@ पूल सर्वोच्चता src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3325,7 +3459,7 @@ हैसरेट र कठिनाई src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3334,7 +3468,7 @@ लाइटनिंग src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3342,7 +3476,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3363,7 +3497,7 @@ लाइटनिंग नेटवर्क क्षमता src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3384,7 +3518,7 @@ प्रति ISP लाइटनिंग नोडहरू src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3397,7 +3531,7 @@ प्रति देश लाइटनिंग नोड्स src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3414,7 +3548,7 @@ लाइटनिंग नोड्स विश्व नक्सा src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3431,7 +3565,7 @@ लाइटनिङ नोड्स च्यानल विश्व नक्सा src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3452,11 +3586,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3486,11 +3620,11 @@ हसरेट (एमए) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3524,7 +3658,7 @@ src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3550,7 +3684,7 @@ लाइटनिङ एक्सप्लोरर src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3558,20 +3692,12 @@ master-page.lightning - - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation कागजात src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3616,7 +3742,7 @@ इनाम तथ्याङ्क src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3625,7 +3751,7 @@ (144 ब्लकहरू) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3634,7 +3760,7 @@ भर्खरका ब्लकहरू src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3647,10 +3773,36 @@ समायोजनहरू src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments + + Broadcast Transaction + ट्रांसेक्शन प्रसारण गर्नुहोस् + + src/app/components/mining-dashboard/mining-dashboard.component.html + 91 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) पूल भाग्य (1 हप्ता) @@ -3717,7 +3869,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3747,12 +3899,24 @@ mining.rank + + Avg Health + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks खाली ब्लकहरू src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3761,7 +3925,7 @@ सबै माईनर्स हरू src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3770,7 +3934,7 @@ पूल भाग्य (1w) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3779,7 +3943,7 @@ पूल गणना (1w) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3788,12 +3952,11 @@ माईनिंग पुलहरू src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 - - blocks - ब्लकहरू + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3802,6 +3965,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4013,24 +4211,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - ट्रांसेक्शन प्रसारण गर्नुहोस् - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex ट्रांसेक्शन हेक्स @@ -4040,7 +4220,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 291,292 transaction.hex @@ -4161,6 +4341,70 @@ search-form.search-title + + Bitcoin Block Height + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) vBytes द्वारा मेम्पपुल (sat/vByte) @@ -4188,7 +4432,7 @@ फिल्टर src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4197,7 +4441,7 @@ उल्टो src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4206,7 +4450,7 @@ ट्रांसेक्शन vBytes प्रति सेकेन्ड (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4214,196 +4458,187 @@ Just now भर्खरै - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago पहिले - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After पछि - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - ~ मा - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4443,7 +4678,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4453,11 +4688,11 @@ पहिलो पटक देखियो src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4473,11 +4708,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4487,7 +4722,7 @@ अनुमानित समय src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4497,7 +4732,7 @@ केहि घण्टामा (वा बढी) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4507,11 +4742,11 @@ वंशज src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4521,7 +4756,7 @@ पुर्खा src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4531,11 +4766,11 @@ प्रवाह src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 341,345 Transaction flow transaction.flow @@ -4545,7 +4780,7 @@ रेखाचित्र लुकाउनुहोस् src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4554,7 +4789,7 @@ थप देखाउनुहोस् src/app/components/transaction/transaction.component.html - 231,233 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4571,7 +4806,7 @@ कम देखाउनुहोस् src/app/components/transaction/transaction.component.html - 233,239 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4584,7 +4819,7 @@ रेखाचित्र देखाउनुहोस् src/app/components/transaction/transaction.component.html - 253,254 + 248,249 show-diagram @@ -4593,7 +4828,7 @@ लकटाइम src/app/components/transaction/transaction.component.html - 292,294 + 287,289 transaction.locktime @@ -4602,7 +4837,7 @@ ट्रांसेक्शन फेला परेन। src/app/components/transaction/transaction.component.html - 455,456 + 450,451 transaction.error.transaction-not-found @@ -4611,7 +4846,7 @@ मेम्पपुल मा देखिन को लागी प्रतिक्षा गर्दै ... src/app/components/transaction/transaction.component.html - 456,461 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4620,7 +4855,7 @@ प्रभावकारी शुल्क दर src/app/components/transaction/transaction.component.html - 489,492 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4768,7 +5003,7 @@ Show more inputs to reveal fee data src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4776,7 +5011,7 @@ remaining src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -5026,21 +5261,12 @@ dashboard.latest-transactions - - USD - USD / अमेरिकी डलर - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee न्यूनतम शुल्क src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -5050,7 +5276,7 @@ पर्जिंग / सफा src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging @@ -5060,7 +5286,7 @@ मेमोरी उपयोग src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage @@ -5069,15 +5295,27 @@ L-BTC in circulation src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + + src/app/docs/api-docs/api-docs.component.html + 14 + + faq.big-disclaimer + REST API service src/app/docs/api-docs/api-docs.component.html - 39,40 + 42,43 api-docs.title @@ -5085,11 +5323,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 48,49 + 51,52 src/app/docs/api-docs/api-docs.component.html - 102,105 + 105,108 Api docs endpoint @@ -5098,18 +5336,18 @@ विवरण src/app/docs/api-docs/api-docs.component.html - 67,68 + 70,71 src/app/docs/api-docs/api-docs.component.html - 106,107 + 109,110 Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 107,108 + 110,111 api-docs.websocket.websocket @@ -5202,7 +5440,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5275,7 +5513,11 @@ src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 + + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 lightning.x-channels @@ -5315,11 +5557,11 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html - 65,66 + 68,69 status.inactive @@ -5332,11 +5574,11 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html - 66,68 + 69,71 status.active @@ -5349,7 +5591,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5357,7 +5599,7 @@ src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed @@ -5370,7 +5612,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5383,11 +5625,19 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 src/app/lightning/node-statistics/node-statistics.component.html @@ -5395,7 +5645,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5417,6 +5667,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5452,11 +5706,11 @@ लाइटनिंग च्यानल src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5465,11 +5719,11 @@ अन्तिम अपडेट src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5485,11 +5739,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5498,11 +5752,11 @@ बन्द हुने मिति src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,44 lightning.closing_date @@ -5510,7 +5764,7 @@ Closed by src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5519,7 +5773,7 @@ ट्रांसेक्शन खोल्दै src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5528,7 +5782,7 @@ बन्द ट्रांसेक्शन src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5540,6 +5794,27 @@ 37 + + Mutually closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open खोल्नु @@ -5554,7 +5829,7 @@ देखाउन कुनै च्यानलहरू छैनन् src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list @@ -5563,7 +5838,7 @@ उपनाम src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5587,11 +5862,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5600,7 +5875,7 @@ स्थिति src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status @@ -5609,7 +5884,7 @@ च्यानल आईडी src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id @@ -5618,11 +5893,11 @@ sats / सैटस src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,68 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5666,6 +5941,22 @@ shared.sats + + avg + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity औसत क्षमता @@ -5790,11 +6081,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5843,10 +6134,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5863,12 +6150,20 @@ 40,44 - src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 28,29 + + + src/app/lightning/node-statistics/node-statistics.component.html + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5900,16 +6195,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -5942,7 +6241,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5958,11 +6257,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6000,9 +6299,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6031,6 +6338,28 @@ lightning.node-fee-distribution + + Outgoing Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week गत हप्ता प्रतिशत परिवर्तन @@ -6040,11 +6369,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -6057,11 +6386,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6074,7 +6403,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6087,7 +6416,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6100,20 +6429,12 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size सरदर च्यानल साइज src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6121,7 +6442,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6130,7 +6451,7 @@ रङ src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6138,7 +6459,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6150,7 +6471,7 @@ Exclusively on Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6158,7 +6479,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6166,7 +6487,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6175,7 +6496,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6183,7 +6504,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6191,7 +6512,7 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6200,7 +6521,7 @@ Channel base fee src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6208,7 +6529,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6216,7 +6537,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6225,7 +6546,7 @@ खुल्ला च्यानलहरू src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6234,7 +6555,7 @@ बन्द च्यानलहरू src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6278,7 +6599,7 @@ कुनै जियोलोकेशन डाटा उपलब्ध छैन src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6300,8 +6621,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6311,8 +6632,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6322,8 +6643,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6347,19 +6668,22 @@ lightning.share - nodes - नोडहरू + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6367,7 +6691,7 @@ BTC क्षमता src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6482,11 +6806,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6575,24 +6899,6 @@ 27 - - Top 100 nodes liquidity ranking - शीर्ष 100 नोड्स तरलता रैंकिंग - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - शीर्ष 100 नोड कनेक्टिविटी रैंकिंग - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes सबैभन्दा पुरानो नोड्स diff --git a/frontend/src/locale/messages.nl.xlf b/frontend/src/locale/messages.nl.xlf index c1d10e51c..999a63145 100644 --- a/frontend/src/locale/messages.nl.xlf +++ b/frontend/src/locale/messages.nl.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ Community-allianties src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Projectvertalers src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Projectbijdragers src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Projectleden src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Projectonderhouders src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment Moeilijkheidsaanpassing + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Resterend - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks blokken - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block blok - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Schatting - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Vorige - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Huidige Periode - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Volgende Halvering - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Of 2x het minimum, of het lage prioriteitstarief (welke van beide lager is) @@ -3346,7 +3446,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ Poolrankering src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ Pooldominatie src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ Hashrate & Moeilijkheid src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ Lightning Nodes Per Netwerk src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ Lightning Netwerk Capaciteit src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ Lightning Nodes Per Land src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ Lightningnodes Wereldkaart src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ Lightningnodekanalen Wereldkaart src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ Hashrate (MG) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3767,7 @@ Beloningstatistieken src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 blokken) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ Laatste blokken src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ Aanpassingen src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Transactie Uitzenden src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - blokken + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4473,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4482,7 @@ Omkeren src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4491,7 @@ Transactie-vBytes per seconde (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4499,188 @@ Just now Zojuist - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago geleden - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + Over ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Na - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - In ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4814,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4833,7 @@ Toon meer src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4850,7 @@ Toon minder src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4863,7 @@ Toon diagram src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4872,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4881,7 @@ Transactie niet gevonden. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4890,7 @@ Wachten tot het in de mempool verschijnt... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4899,7 @@ Effectief vergoedingstarief src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5354,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5365,7 @@ REST API service src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5374,11 @@ Eindpunt src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5387,11 @@ Omschrijving src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5399,7 @@ Default push: actie: 'want', data: ['blocks', ...] om uit te drukken wat je gepushed wilt hebben. Beschikbaar: blocks, mempool-blocks, live-2h-chart, en stats.Pushtransacties gerelateerd aan adres: 'track-address': '3PbJ...bF9B' om alle nieuwe transacties met dat adres als invoer of uitvoer te ontvangen. Retourneert een reeks transacties. address-transactions voor nieuwe mempooltransacties, en block-transactions voor nieuwe blokbevestigde transacties. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5444,6 +5574,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5558,6 +5692,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5676,7 +5818,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5817,7 +5959,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6079,6 +6221,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6127,6 +6277,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6604,19 +6758,22 @@ lightning.share - nodes - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6624,7 +6781,7 @@ BTC-capaciteit src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6742,11 +6899,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.pl.xlf b/frontend/src/locale/messages.pl.xlf index 7970bfe8b..5e0e5ad44 100644 --- a/frontend/src/locale/messages.pl.xlf +++ b/frontend/src/locale/messages.pl.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Sojusze społecznościowe src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Tłumacze projektu src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Współtwórcy projektu src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Członkowie projektu src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Opiekunowie projektu src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -3094,7 +3094,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3778,7 +3778,7 @@ Statystyki nagród src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3787,7 +3787,7 @@ (144 bloków) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3796,7 +3796,7 @@ Ostatnie bloki src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3809,7 +3809,7 @@ Dostosowania src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3818,7 +3818,7 @@ Rozgłoś transakcję src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3993,9 +3993,9 @@ 58 - - blocks - bloków + + blocks + bloków src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4004,6 +4004,42 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + Inne () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -5551,6 +5587,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5791,7 +5831,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5932,7 +5972,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6250,6 +6290,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6730,19 +6774,23 @@ lightning.share - nodes - węzłów + nodes + węzłów src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6750,7 +6798,7 @@ pojemność BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6868,11 +6916,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.pt.xlf b/frontend/src/locale/messages.pt.xlf index 1d7764f84..e6ef0f346 100644 --- a/frontend/src/locale/messages.pt.xlf +++ b/frontend/src/locale/messages.pt.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1487,7 +1487,7 @@ Alianças da comunidade src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Tradutores do Projeto src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Contribuidores do projeto src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Membros do Projeto src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Mantenedores do projeto src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -3094,7 +3094,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3778,7 +3778,7 @@ Estatisticas de recompensas src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3787,7 +3787,7 @@ (144 blocos) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3796,7 +3796,7 @@ Últimos blocos src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3809,7 +3809,7 @@ Ajustes src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3818,7 +3818,7 @@ Transmitir Transação src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3993,9 +3993,8 @@ 58 - - blocks - blocos + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4004,6 +4003,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -5551,6 +5585,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5791,7 +5829,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5932,7 +5970,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6250,6 +6288,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6730,19 +6772,22 @@ lightning.share - nodes - nós + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6750,7 +6795,7 @@ Capacidade de BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6868,11 +6913,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.ro.xlf b/frontend/src/locale/messages.ro.xlf index 18051fdbe..2dfca47ad 100644 --- a/frontend/src/locale/messages.ro.xlf +++ b/frontend/src/locale/messages.ro.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ Alianțe din Comunitate src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Traducători ai proiectului src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Contribuitori ai proiectului src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Membrii Proiectului src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Întreținători ai proiectului src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment Ajustarea Dificultății + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Rămas - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks blocuri - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block bloc - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Estimare - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Anterior - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Perioada Curentă - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Înjumătățirea următoare - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) 2x minimum sau valoarea Prioritate Scăzută (oricare este mai mică) @@ -3346,7 +3446,7 @@ Minerit src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ Clasament Fonduri src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ Dominanță Fonduri src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ Rată hash & Dificultate src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ Noduri Lightning Per Rețea src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ Capacitatea rețelei Lightning src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ Noduri Lightning Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ Noduri Lightning per țară src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ Harta lumii cu Noduri Lightning src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ Harta lumii cu canale ale nodurilor Lightning src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ Rată hash (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3767,7 @@ Statistici Recompense src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 blocuri) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ Ultimele blocuri src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ Ajustări src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Transmite Tranzacție src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - blocuri + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4473,7 @@ Filtru src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4482,7 @@ Inversează src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4491,7 @@ Tranzacție vBytes pe secundă (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4499,188 @@ Just now Chiar acum - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago Acum - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + În ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After După - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - În ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4814,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4833,7 @@ Arată mai multe src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4850,7 @@ Arată mai puțin src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4863,7 @@ Arată diagrama src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4872,7 @@ Locktime src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4881,7 @@ Tranzacția nu a fost găsită. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4890,7 @@ Se așteaptă să apară în mempool... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4899,7 @@ Rata efectivă a comisionului src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5354,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5365,7 @@ Serviciu REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5374,11 @@ Terminație src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5387,11 @@ Descriere src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5399,7 @@ Trimitere implicită: acțiune: 'want', data: ['blocks', ...] pentru a exprima ce dorești să trimiți. Disponibil: blocks, mempool-blocks, live-2h-chart, și stats.Tranzacții de trimitere pentru adresa: 'track-address': '3PbJ...bF9B' pentru a primi toate tranzacțiile noi care conțin acea adresă ca intrare sau iesire. Returnează un șir de tranzacții. address-transactions pentru tranzacții noi din mempool, și block-transactions pentru tranzacții confirmate din blocuri noi. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5444,6 +5574,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5558,6 +5692,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5676,7 +5818,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5817,7 +5959,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6079,6 +6221,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6127,6 +6277,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6604,19 +6758,22 @@ lightning.share - nodes - noduri + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6624,7 +6781,7 @@ capacitate BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6742,11 +6899,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.ru.xlf b/frontend/src/locale/messages.ru.xlf index d9b9221b7..ef455e2a5 100644 --- a/frontend/src/locale/messages.ru.xlf +++ b/frontend/src/locale/messages.ru.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ Обьединения Сообщества src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Переводы src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Участники проекта src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Участники проекта src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Разработчики проекта src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment Корректировка сложности + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Осталось - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks блоков - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block блоков - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Приблизительно - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Предыдущий - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Текущий период - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Следующий халвинг - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Введите как минимум ×2 или ставку низкого приоритета (меньшее из двух) @@ -3346,7 +3446,7 @@ Майнинг src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ Рейтинг пулов src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ Доминация пулов src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ Хэшрейт и сложность src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ Лайтнинг src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ Узлы Лайтнинг на сеть src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ Объем сети Лайтнинг src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ Узлов Лайтнинг на провайдера src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ Узлов Лайтнинг на страну src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ Мировая карта узлов Лайтнинг src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ Мировая карта лайтнинг-каналов src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ Хэшрейт (ср.) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3767,7 @@ Статистика вознаграждений src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 блока) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ Последние блоки src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ Корректировки src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Транслировать транзакцию src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - блоки + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4473,7 @@ Фильтр src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4482,7 @@ Инвертировать src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4491,7 @@ Транзакционные vBytes в секунду (vB / s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4499,187 @@ Just now Только что - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago назад - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After После - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Через ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4813,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4832,7 @@ Показать больше src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4849,7 @@ Показывай меньше src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4862,7 @@ Показать схему src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4871,7 @@ Время блокировки src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4880,7 @@ Транзакция не найдена. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4889,7 @@ Ожидаем ее появления в мемпуле ... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4898,7 @@ Эффективная комиссионная ставка src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5353,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5364,7 @@ Служба REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5373,11 @@ Конечная точка src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5386,11 @@ Описание src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5398,7 @@ Пуш по умолчанию: действие: 'want', data: ['blocks', ...] , чтобы выразить то, что вы хотите запушить. Доступно: блоки , mempool-blocks , live-2h-chart иstats Пуш-транзакций, связанных с адресом: 'track-address': '3PbJ ... bF9B' для получения всех новых транзакционных входных или выходных данных, относящихся к данному адресу. Предоставляет массив транзакций. транзакций данного адреса, для новых транзакций мемпула и транзакций блока для транзакций, подтвержденных в новом блоке. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5444,6 +5573,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5558,6 +5691,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5676,7 +5817,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5817,7 +5958,7 @@ сат src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6079,6 +6220,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6127,6 +6276,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6604,19 +6757,22 @@ lightning.share - nodes - узлы + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6624,7 +6780,7 @@ Емкость BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6742,11 +6898,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.sl.xlf b/frontend/src/locale/messages.sl.xlf index 6c5bfc3bb..0ab3be00c 100644 --- a/frontend/src/locale/messages.sl.xlf +++ b/frontend/src/locale/messages.sl.xlf @@ -357,11 +357,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -382,11 +382,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -424,7 +424,7 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash @@ -449,7 +449,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -592,11 +592,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -748,11 +748,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -773,16 +773,24 @@ src/app/components/about/about.component.html - 385,389 + 391,394 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 87 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -793,14 +801,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 89 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -988,7 +1004,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1036,7 +1052,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1052,11 +1068,11 @@ src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 283,285 transaction.version @@ -1106,7 +1122,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1128,7 +1144,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1140,10 +1156,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1156,11 +1168,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1188,11 +1200,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 257,262 src/app/components/transaction/transaction.component.html - 406,412 + 401,407 transaction.details @@ -1209,11 +1221,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 244,248 src/app/components/transaction/transaction.component.html - 377,383 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1231,7 +1243,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 246,245 @@ -1251,7 +1263,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1267,7 +1279,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1438,7 +1450,7 @@ Raziskovalec blokov in mempool-a razvit za Bitcoin skupnost, osredotočen na trg omrežnin za transakcije in večplastni ekosistem. Samogostovanje brez zaupanja vrednih tretjih oseb. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1446,7 +1458,7 @@ Sponzorji - podjetja 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1455,7 +1467,7 @@ Sponzorji - posamezniki ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1463,7 +1475,7 @@ Community Integrations src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1472,7 +1484,7 @@ Zavezništva skupnosti src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1481,7 +1493,7 @@ Prevajalci src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1490,7 +1502,7 @@ Sodelujoči src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1499,7 +1511,7 @@ Člani projekta src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1508,7 +1520,7 @@ Vzdrževalci src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1517,7 +1529,7 @@ O projektu src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1529,7 +1541,7 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 @@ -1565,7 +1577,7 @@ src/app/components/amount/amount.component.html - 6,9 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1581,7 +1593,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1664,7 +1676,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1886,7 +1898,7 @@ src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header @@ -1899,7 +1911,7 @@ src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header @@ -1912,7 +1924,7 @@ src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header @@ -1921,7 +1933,7 @@ Napaka pri nalaganju podatkov o sredstvih. src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -2028,7 +2040,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2045,7 +2057,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -2061,7 +2073,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2073,11 +2085,11 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2086,19 +2098,19 @@ Indeksiranje blokov src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2138,7 +2150,7 @@ src/app/components/transaction/transaction.component.html - 476 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2164,11 +2176,11 @@ src/app/components/transaction/transaction.component.html - 476,477 + 473 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2182,11 +2194,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2198,7 +2210,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,43 Transaction fee rate transaction.fee-rate @@ -2216,19 +2228,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2268,27 +2280,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 478,481 src/app/components/transaction/transaction.component.html - 492,494 + 489,491 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2296,7 +2308,7 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte @@ -2310,11 +2322,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 269,272 Transaction Virtual Size transaction.vsize @@ -2384,7 +2396,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2420,11 +2432,11 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2441,7 +2453,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2450,15 +2462,15 @@ Velikost src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2482,7 +2494,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 265,267 src/app/dashboard/dashboard.component.html @@ -2494,11 +2506,11 @@ Utež src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2506,11 +2518,22 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 273,275 + + + + Size per weight + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2525,14 +2548,6 @@ shared.block-title - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee Mediana omrežnin @@ -2542,7 +2557,7 @@ src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2559,11 +2574,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2581,7 +2596,7 @@ src/app/components/block/block.component.html - 168,170 + 173,175 block.miner @@ -2594,7 +2609,7 @@ src/app/components/block/block.component.ts - 227 + 242 @@ -2604,6 +2619,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2619,31 +2638,47 @@ Previous Block - - Block health + + Health src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2660,7 +2695,7 @@ Razpon omrežnin src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2673,7 +2708,7 @@ Na podlagi povprečne native segwit transakcije (140 vBajtov). src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2697,49 +2732,60 @@ Transaction fee tooltip - - Subsidy + fees: - Novi kovanci + omrežnine: + + Subsidy + fees src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block src/app/components/block/block.component.html - 225,227 + 231 block.actual-block @@ -2748,7 +2794,7 @@ Bits src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2757,7 +2803,7 @@ Merkle koren src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2766,7 +2812,7 @@ Težavnost src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2782,11 +2828,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2795,7 +2841,7 @@ Nonce src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce @@ -2804,32 +2850,41 @@ Glava bloka (Hex) src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details Podrobnosti src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2839,20 +2894,16 @@ Napaka pri nalaganju podatkov. src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2867,7 +2918,7 @@ Why is this block empty? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation @@ -2913,18 +2964,6 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward Nagrada @@ -2988,7 +3027,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -3021,13 +3060,17 @@ Difficulty Adjustment Prilagoditev težavnosti + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3035,11 +3078,11 @@ Remaining Preostalo - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3048,11 +3091,11 @@ blocks blokov - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3073,11 +3116,11 @@ block blok - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3090,11 +3133,11 @@ Estimate Ocena - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3103,20 +3146,24 @@ Previous Prejšnja - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Trenutno obdobje - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3125,11 +3172,99 @@ Next Halving Naslednja razpolovitev - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Bodisi 2-kratnik najnižje omrežnine ali stopnja nizke prioritete (kar je nižje) @@ -3227,7 +3362,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3240,7 +3375,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3253,7 +3388,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3267,7 +3402,7 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3287,7 +3422,7 @@ Rudarjenje src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3296,7 +3431,7 @@ Porazdelitev združenj src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3309,7 +3444,7 @@ Zgodovinska porazdelitev združenj src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3321,7 +3456,7 @@ Hashrate & Difficulty src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3329,7 +3464,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3337,7 +3472,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3357,7 +3492,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3377,7 +3512,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3389,7 +3524,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3405,7 +3540,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3421,7 +3556,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3442,11 +3577,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3476,11 +3611,11 @@ Procesorska moč (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3516,7 +3651,7 @@ src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3541,7 +3676,7 @@ Lightning Explorer src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3549,20 +3684,12 @@ master-page.lightning - - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation Dokumentacija src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3607,7 +3734,7 @@ Statistika nagrad src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3616,7 +3743,7 @@ (144 blokov) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3625,7 +3752,7 @@ Najnovejši bloki src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3638,10 +3765,36 @@ Prilagoditve src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments + + Broadcast Transaction + Objava transakcije + + src/app/components/mining-dashboard/mining-dashboard.component.html + 91 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) Sreča združenj (1 teden) @@ -3709,7 +3862,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3739,12 +3892,24 @@ mining.rank + + Avg Health + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks Prazni bloki src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3753,7 +3918,7 @@ Skupaj src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3762,7 +3927,7 @@ Sreča združenj (1 teden) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3771,7 +3936,7 @@ Število združenj (1 teden) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3780,12 +3945,11 @@ Rudarska združenja src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 - - blocks - blokov + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3794,6 +3958,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4006,24 +4205,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - Objava transakcije - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex Šestnajstiški zapis @@ -4033,7 +4214,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 291,292 transaction.hex @@ -4153,6 +4334,70 @@ search-form.search-title + + Bitcoin Block Height + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) Mempool v vBajtih (sat/vBajt) @@ -4180,7 +4425,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4189,7 +4434,7 @@ Obrni src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4198,7 +4443,7 @@ Pretočnost, vBajtov na sekundo (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4206,196 +4451,187 @@ Just now Pravkar - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago nazaj - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Po - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Čez ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4435,7 +4671,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4445,11 +4681,11 @@ Prejeto src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4465,11 +4701,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4479,7 +4715,7 @@ ETA src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4489,7 +4725,7 @@ V nekaj urah (ali več) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4499,11 +4735,11 @@ Potomec src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4513,7 +4749,7 @@ Prednik src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4522,11 +4758,11 @@ Flow src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 341,345 Transaction flow transaction.flow @@ -4535,7 +4771,7 @@ Hide diagram src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4543,7 +4779,7 @@ Show more src/app/components/transaction/transaction.component.html - 231,233 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4559,7 +4795,7 @@ Show less src/app/components/transaction/transaction.component.html - 233,239 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4571,7 +4807,7 @@ Show diagram src/app/components/transaction/transaction.component.html - 253,254 + 248,249 show-diagram @@ -4580,7 +4816,7 @@ Locktime src/app/components/transaction/transaction.component.html - 292,294 + 287,289 transaction.locktime @@ -4589,7 +4825,7 @@ Transakcije ni mogoče najti. src/app/components/transaction/transaction.component.html - 455,456 + 450,451 transaction.error.transaction-not-found @@ -4598,7 +4834,7 @@ Čakanje, da se prikaže v mempool-u... src/app/components/transaction/transaction.component.html - 456,461 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4607,7 +4843,7 @@ Efektivna stopnja omrežnine src/app/components/transaction/transaction.component.html - 489,492 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4755,7 +4991,7 @@ Show more inputs to reveal fee data src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4763,7 +4999,7 @@ remaining src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -5001,21 +5237,12 @@ dashboard.latest-transactions - - USD - USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee Najnižja omrežnina src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -5025,7 +5252,7 @@ Prag src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging @@ -5035,7 +5262,7 @@ Velikost src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage @@ -5045,16 +5272,28 @@ L-BTC v obtoku src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + + src/app/docs/api-docs/api-docs.component.html + 14 + + faq.big-disclaimer + REST API service REST API storitev src/app/docs/api-docs/api-docs.component.html - 39,40 + 42,43 api-docs.title @@ -5063,11 +5302,11 @@ Končna točka src/app/docs/api-docs/api-docs.component.html - 48,49 + 51,52 src/app/docs/api-docs/api-docs.component.html - 102,105 + 105,108 Api docs endpoint @@ -5076,11 +5315,11 @@ Opis src/app/docs/api-docs/api-docs.component.html - 67,68 + 70,71 src/app/docs/api-docs/api-docs.component.html - 106,107 + 109,110 @@ -5088,7 +5327,7 @@ Začetni potisk: action: 'want', data: ['blocks', ...] za izbiro potisnih podatkov. Razpoložljivo: blocks, mempool-blocks, live-2h-chart in stats.Potisk transakcij povezanih z naslovom: 'track-address': '3PbJ...bF9B' za prejem vseh novih transakcij, ki vsebujejo ta naslov v vhodu ali izhodu. Vrne polje transakcij. address-transactions za nove transakcije v mempool-u in block-transactions za potrjene transakcije v novem bloku. src/app/docs/api-docs/api-docs.component.html - 107,108 + 110,111 api-docs.websocket.websocket @@ -5183,7 +5422,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5251,7 +5490,11 @@ src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 + + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 lightning.x-channels @@ -5289,11 +5532,11 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html - 65,66 + 68,69 status.inactive @@ -5305,11 +5548,11 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html - 66,68 + 69,71 status.active @@ -5321,7 +5564,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5329,7 +5572,7 @@ src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed @@ -5341,7 +5584,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5353,11 +5596,19 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 src/app/lightning/node-statistics/node-statistics.component.html @@ -5365,7 +5616,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5387,6 +5638,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5421,11 +5676,11 @@ Lightning channel src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5433,11 +5688,11 @@ Last update src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5453,11 +5708,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5465,11 +5720,11 @@ Closing date src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,44 lightning.closing_date @@ -5477,7 +5732,7 @@ Closed by src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5485,7 +5740,7 @@ Opening transaction src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5493,7 +5748,7 @@ Closing transaction src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5504,6 +5759,27 @@ 37 + + Mutually closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open @@ -5516,7 +5792,7 @@ No channels to display src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list @@ -5524,7 +5800,7 @@ Alias src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5548,11 +5824,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5560,7 +5836,7 @@ Status src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status @@ -5568,7 +5844,7 @@ Channel ID src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id @@ -5576,11 +5852,11 @@ sats src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,68 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5624,6 +5900,22 @@ shared.sats + + avg + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity @@ -5740,11 +6032,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5792,10 +6084,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5811,12 +6099,20 @@ 40,44 - src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 28,29 + + + src/app/lightning/node-statistics/node-statistics.component.html + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5848,16 +6144,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -5888,7 +6188,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5904,11 +6204,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -5942,9 +6242,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -5972,6 +6280,28 @@ lightning.node-fee-distribution + + Outgoing Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week @@ -5980,11 +6310,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -5996,11 +6326,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6012,7 +6342,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6024,7 +6354,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6036,19 +6366,11 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6056,7 +6378,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6064,7 +6386,7 @@ Color src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6072,7 +6394,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6084,7 +6406,7 @@ Exclusively on Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6092,7 +6414,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6100,7 +6422,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6109,7 +6431,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6117,7 +6439,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6125,7 +6447,7 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6134,7 +6456,7 @@ Channel base fee src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6142,7 +6464,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6150,7 +6472,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6158,7 +6480,7 @@ Open channels src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6166,7 +6488,7 @@ Closed channels src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6208,7 +6530,7 @@ No geolocation data available src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6230,8 +6552,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6241,8 +6563,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6252,8 +6574,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6276,25 +6598,29 @@ lightning.share - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6400,11 +6726,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6485,22 +6811,6 @@ 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes diff --git a/frontend/src/locale/messages.th.xlf b/frontend/src/locale/messages.th.xlf index 8aea81ea2..a0adc00e4 100644 --- a/frontend/src/locale/messages.th.xlf +++ b/frontend/src/locale/messages.th.xlf @@ -11,6 +11,7 @@ Slide of + สไลด์ จาก node_modules/src/carousel/carousel.ts 175,181 @@ -147,6 +148,7 @@ + node_modules/src/progressbar/progressbar.ts 30,33 @@ -357,11 +359,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -382,11 +384,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -424,7 +426,7 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash @@ -449,7 +451,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -592,11 +594,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -748,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -773,16 +775,24 @@ src/app/components/about/about.component.html - 385,389 + 391,394 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 87 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -793,14 +803,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 89 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -988,7 +1006,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1036,7 +1054,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1052,11 +1070,11 @@ src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 283,285 transaction.version @@ -1106,7 +1124,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1128,7 +1146,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1140,10 +1158,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1156,11 +1170,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1188,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 257,262 src/app/components/transaction/transaction.component.html - 406,412 + 401,407 transaction.details @@ -1209,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 244,248 src/app/components/transaction/transaction.component.html - 377,383 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1231,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 246,245 @@ -1251,7 +1265,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1267,7 +1281,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1438,7 +1452,7 @@ ระบบ mempool และระบบสำรวจ blockchain สำหรับคอมมูนิตี้ Bitcoin โดยมุ่งเป้าไปที่ค่าธรรมเนียมการทำธุรกรรมต่างๆบนระบบและระบบนิเวศหลายชั้น อีกทั้งยังสามารถโฮสได้ด้วยตัวเองโดยปราศจากบุคคลที่สาม src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1446,7 +1460,7 @@ ผู้สนับสนุนระดับองค์กร 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1455,7 +1469,7 @@ ผู้สนับสนุน ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1463,7 +1477,7 @@ Community Integrations src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1472,7 +1486,7 @@ พันธมิตรของเรา src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1481,7 +1495,7 @@ ผู้แปลโปรเจค src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1490,7 +1504,7 @@ ผู้พัฒนาโปรเจค src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1499,7 +1513,7 @@ สมาชิกในโปรเจคนี้ src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1508,7 +1522,7 @@ ผู้ดูแลโปรเจค src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1517,7 +1531,7 @@ เกี่ยวกับ src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1529,11 +1543,12 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 Multisig of + Multisig จาก src/app/components/address-labels/address-labels.component.ts 107 @@ -1565,7 +1580,7 @@ src/app/components/amount/amount.component.html - 6,9 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1581,7 +1596,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1664,7 +1679,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1886,7 +1901,7 @@ src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header @@ -1899,7 +1914,7 @@ src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header @@ -1912,7 +1927,7 @@ src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header @@ -1921,7 +1936,7 @@ เกิดข้อผิดพลาดในการโหลดข้อมูลสินทรัพย์ src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -2028,12 +2043,13 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates At block: + บล็อกที่: src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts 188 @@ -2044,11 +2060,12 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 Around block: + ประมาณบล็อกที่: src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts 190 @@ -2059,7 +2076,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2071,11 +2088,11 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2084,19 +2101,19 @@ กำลังจัดเรียงบล็อก src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2136,7 +2153,7 @@ src/app/components/transaction/transaction.component.html - 476 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2162,11 +2179,11 @@ src/app/components/transaction/transaction.component.html - 476,477 + 473 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2180,11 +2197,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2196,7 +2213,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,43 Transaction fee rate transaction.fee-rate @@ -2214,19 +2231,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2266,27 +2283,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 478,481 src/app/components/transaction/transaction.component.html - 492,494 + 489,491 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2294,7 +2311,7 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte @@ -2308,11 +2325,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 269,272 Transaction Virtual Size transaction.vsize @@ -2381,7 +2398,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2416,11 +2433,11 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2437,7 +2454,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2446,15 +2463,15 @@ ขนาด src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2478,7 +2495,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 265,267 src/app/dashboard/dashboard.component.html @@ -2490,11 +2507,11 @@ น้ำหนัก src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2502,11 +2519,22 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 273,275 + + + + Size per weight + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2521,14 +2549,6 @@ shared.block-title - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee ค่าธรรมเนียมกลาง @@ -2538,7 +2558,7 @@ src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2555,11 +2575,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2577,7 +2597,7 @@ src/app/components/block/block.component.html - 168,170 + 173,175 block.miner @@ -2590,7 +2610,7 @@ src/app/components/block/block.component.ts - 227 + 242 @@ -2600,6 +2620,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2615,31 +2639,47 @@ Previous Block - - Block health + + Health src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2656,7 +2696,7 @@ ช่วงของค่าธรรมเนียม src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2669,7 +2709,7 @@ อิงตามธุรกรรม Segwit ดั้งเดิมที่มีค่าเฉลี่ย 140 vBytes src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2693,49 +2733,60 @@ Transaction fee tooltip - - Subsidy + fees: - ธุรกรรม + ค่าธรรมเนียม: + + Subsidy + fees src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block src/app/components/block/block.component.html - 225,227 + 231 block.actual-block @@ -2744,7 +2795,7 @@ บิต src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2753,7 +2804,7 @@ Merkle root src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2762,7 +2813,7 @@ ความยาก src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2778,11 +2829,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2791,7 +2842,7 @@ Nonce src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce @@ -2800,32 +2851,41 @@ Hex ส่วนหัวบล็อก src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details รายละเอียด src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2835,20 +2895,16 @@ เกิดข้อผิดพลาดในการโหลดข้อมูล src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2863,7 +2919,7 @@ Why is this block empty? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation @@ -2909,18 +2965,6 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward ค่าตอบแทน @@ -2984,7 +3028,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -3017,13 +3061,17 @@ Difficulty Adjustment การเปลี่ยนแปลงระดับความยาก + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3031,11 +3079,11 @@ Remaining คงเหลือ - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3044,11 +3092,11 @@ blocks บล็อก - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3069,11 +3117,11 @@ block บล็อก - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3086,11 +3134,11 @@ Estimate ประมาณ - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3099,20 +3147,24 @@ Previous ก่อนหน้า - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period ช่วงเวลาปัจจุบัน - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3121,11 +3173,99 @@ Next Halving การลดผลตอบแทนครั้งถัดไป - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) 2 เท่าของค่าต่ำสุดหรือความสำคัญต่ำ (อะไรก็ได้ที่ต่ำกว่า) @@ -3221,7 +3361,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3234,7 +3374,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3247,7 +3387,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3261,7 +3401,7 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3281,7 +3421,7 @@ กำลังขุด src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3290,7 +3430,7 @@ อันดับพูล src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3303,7 +3443,7 @@ การครองระบบพูล src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3315,7 +3455,7 @@ Hashrate & Difficulty src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3323,7 +3463,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3331,7 +3471,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3351,7 +3491,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3371,7 +3511,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3383,7 +3523,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3399,7 +3539,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3415,7 +3555,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3436,11 +3576,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3469,11 +3609,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3509,7 +3649,7 @@ src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3534,7 +3674,7 @@ Lightning Explorer src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3542,20 +3682,12 @@ master-page.lightning - - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation เอกสารคำอภิบาย src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3600,7 +3732,7 @@ สถานะค่าตอบแทน src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3609,7 +3741,7 @@ (144 บล็อก) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3618,7 +3750,7 @@ บล็อกล่าสุด src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3631,10 +3763,36 @@ การเปลี่ยนแปลง src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments + + Broadcast Transaction + ประกาศธุรกรรม + + src/app/components/mining-dashboard/mining-dashboard.component.html + 91 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) @@ -3696,7 +3854,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3725,12 +3883,24 @@ mining.rank + + Avg Health + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks บล็อกว่างเปล่า src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3739,7 +3909,7 @@ ผู้ขุดทั้งหมด src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3748,7 +3918,7 @@ ความโชคดีของพูล (1 สัปดาห์) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3757,7 +3927,7 @@ จำนวนผู้ขุดในพูล (1 สัปดาห์) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3766,12 +3936,11 @@ พูลขุด src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 - - blocks - บล็อก + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3780,6 +3949,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -3992,24 +4196,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - ประกาศธุรกรรม - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex hex ของธุรกรรม @@ -4019,7 +4205,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 291,292 transaction.hex @@ -4139,6 +4325,70 @@ search-form.search-title + + Bitcoin Block Height + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) ขนาดหน่วยความจำ vBytes (sat/vByte) @@ -4166,7 +4416,7 @@ ตัวกรอง src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4175,7 +4425,7 @@ กลับ src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4184,7 +4434,7 @@ ธุรกรรมต่อวินาที (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4192,196 +4442,187 @@ Just now ตอนนี้ - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago ที่ผ่านมา - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After หลังจาก - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - ภายใน ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4421,7 +4662,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4431,11 +4672,11 @@ พบเห็นครั้งแรก src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4451,11 +4692,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4465,7 +4706,7 @@ ETA src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4475,7 +4716,7 @@ ภายในหลายชั่วโมง (หรือมากกว่า) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4485,11 +4726,11 @@ ผู้สืบทอด src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4499,7 +4740,7 @@ บรรพบุรุษ src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4508,11 +4749,11 @@ Flow src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 341,345 Transaction flow transaction.flow @@ -4521,7 +4762,7 @@ Hide diagram src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4529,7 +4770,7 @@ Show more src/app/components/transaction/transaction.component.html - 231,233 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4545,7 +4786,7 @@ Show less src/app/components/transaction/transaction.component.html - 233,239 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4557,7 +4798,7 @@ Show diagram src/app/components/transaction/transaction.component.html - 253,254 + 248,249 show-diagram @@ -4566,7 +4807,7 @@ เวลาล็อก src/app/components/transaction/transaction.component.html - 292,294 + 287,289 transaction.locktime @@ -4575,7 +4816,7 @@ ไม่พบเจอธุรกรรมนี้ src/app/components/transaction/transaction.component.html - 455,456 + 450,451 transaction.error.transaction-not-found @@ -4584,7 +4825,7 @@ กำลังรอให้ปรากฏใน mempool... src/app/components/transaction/transaction.component.html - 456,461 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4593,7 +4834,7 @@ อัตราค่าธรรมเนียมที่เหมาะสม src/app/components/transaction/transaction.component.html - 489,492 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4741,7 +4982,7 @@ Show more inputs to reveal fee data src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4749,7 +4990,7 @@ remaining src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -4987,21 +5228,12 @@ dashboard.latest-transactions - - USD - USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee ค่าธรรมเนียมขั้นต่ำ src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -5011,7 +5243,7 @@ กำลังล้าง src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging @@ -5021,7 +5253,7 @@ หน่วยความจำที่ใช้ไป src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage @@ -5031,15 +5263,27 @@ อุปทานหมุนเวียน L-BTC src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + + src/app/docs/api-docs/api-docs.component.html + 14 + + faq.big-disclaimer + REST API service src/app/docs/api-docs/api-docs.component.html - 39,40 + 42,43 api-docs.title @@ -5048,11 +5292,11 @@ ปลายทาง src/app/docs/api-docs/api-docs.component.html - 48,49 + 51,52 src/app/docs/api-docs/api-docs.component.html - 102,105 + 105,108 Api docs endpoint @@ -5061,11 +5305,11 @@ คำอธิบาย src/app/docs/api-docs/api-docs.component.html - 67,68 + 70,71 src/app/docs/api-docs/api-docs.component.html - 106,107 + 109,110 @@ -5073,7 +5317,7 @@ ค่าตอบกลับพื้นฐาน: การกระทำ: 'ต้องการ', ข้อมูล: ['บล็อก', ...] เพื่ออธิบายค่าที่ต้องการตอบกลับ. ที่ใช้งานได้: บล็อก, บล็อก-mempool, ชาตสด-2h, และ สถิติ.ส่งธุรกรรมไปยังแอดเดรส: 'track-address': '3PbJ...bF9B' เพื่อที่จะได้รับธุรกรรมใหม่ทั้งหมดที่มี input/output ของแอดเดรสนั้น. ตอบกลับเป็นอาเรย์ของธุรกรรม. แอดเดรส-ธุรกรรม สำหรับธุรกรรม mempool ใหม่, และ ธุรกรรม-บล็อก สำหรับธุรกรรมที่ถูกยืนยันในบล็อกใหม่ src/app/docs/api-docs/api-docs.component.html - 107,108 + 110,111 api-docs.websocket.websocket @@ -5168,7 +5412,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5236,7 +5480,11 @@ src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 + + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 lightning.x-channels @@ -5274,11 +5522,11 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html - 65,66 + 68,69 status.inactive @@ -5290,11 +5538,11 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html - 66,68 + 69,71 status.active @@ -5306,7 +5554,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5314,7 +5562,7 @@ src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed @@ -5326,7 +5574,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5338,11 +5586,19 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 src/app/lightning/node-statistics/node-statistics.component.html @@ -5350,7 +5606,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5372,6 +5628,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5406,11 +5666,11 @@ Lightning channel src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5418,11 +5678,11 @@ Last update src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5438,11 +5698,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5450,11 +5710,11 @@ Closing date src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,44 lightning.closing_date @@ -5462,7 +5722,7 @@ Closed by src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5470,7 +5730,7 @@ Opening transaction src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5478,7 +5738,7 @@ Closing transaction src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5489,6 +5749,27 @@ 37 + + Mutually closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open @@ -5501,7 +5782,7 @@ No channels to display src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list @@ -5509,7 +5790,7 @@ Alias src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5533,11 +5814,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5545,7 +5826,7 @@ Status src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status @@ -5553,7 +5834,7 @@ Channel ID src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id @@ -5561,11 +5842,11 @@ sats src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,68 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5609,6 +5890,22 @@ shared.sats + + avg + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity @@ -5725,11 +6022,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5777,10 +6074,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5796,12 +6089,20 @@ 40,44 - src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 28,29 + + + src/app/lightning/node-statistics/node-statistics.component.html + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5833,16 +6134,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -5873,7 +6178,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5889,11 +6194,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -5927,9 +6232,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -5957,6 +6270,28 @@ lightning.node-fee-distribution + + Outgoing Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week @@ -5965,11 +6300,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -5981,11 +6316,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -5997,7 +6332,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6009,7 +6344,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6021,19 +6356,11 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -6041,7 +6368,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6049,7 +6376,7 @@ Color src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6057,7 +6384,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6069,7 +6396,7 @@ Exclusively on Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6077,7 +6404,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6085,7 +6412,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6094,7 +6421,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6102,7 +6429,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6110,7 +6437,7 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6119,7 +6446,7 @@ Channel base fee src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6127,7 +6454,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6135,7 +6462,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6143,7 +6470,7 @@ Open channels src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6151,7 +6478,7 @@ Closed channels src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6193,7 +6520,7 @@ No geolocation data available src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6215,8 +6542,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6226,8 +6553,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6237,8 +6564,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6261,25 +6588,29 @@ lightning.share - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6385,11 +6716,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6470,22 +6801,6 @@ 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes diff --git a/frontend/src/locale/messages.tr.xlf b/frontend/src/locale/messages.tr.xlf index b74f46bc4..3ef9c25ba 100644 --- a/frontend/src/locale/messages.tr.xlf +++ b/frontend/src/locale/messages.tr.xlf @@ -11,6 +11,7 @@ Slide of + Slayt 'nin 'i node_modules/src/carousel/carousel.ts 175,181 @@ -147,6 +148,7 @@ + node_modules/src/progressbar/progressbar.ts 30,33 @@ -357,11 +359,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -382,11 +384,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -424,7 +426,7 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash @@ -449,7 +451,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -592,11 +594,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -748,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -773,16 +775,24 @@ src/app/components/about/about.component.html - 385,389 + 391,394 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 87 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -793,14 +803,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 89 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -988,7 +1006,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1036,7 +1054,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1052,11 +1070,11 @@ src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 283,285 transaction.version @@ -1106,7 +1124,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1128,7 +1146,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1140,10 +1158,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1156,11 +1170,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1188,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 257,262 src/app/components/transaction/transaction.component.html - 406,412 + 401,407 transaction.details @@ -1209,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 244,248 src/app/components/transaction/transaction.component.html - 377,383 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1231,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 246,245 @@ -1251,7 +1265,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1267,7 +1281,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1438,7 +1452,7 @@ Mempool, üçüncü partilere güvenmek zorunda kalmadan kendi bilgisayarınızda barındırabileceğiniz, Bitcoin ve ikinci katman çözümleri için işlem ücreti piyasasını önünüze sunan açık kaynak kodlu bir blok kaşifi yazılımıdır. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1446,7 +1460,7 @@ Kurumsal sponsorlar src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1455,7 +1469,7 @@ Topluluk sponsorlarımız src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1464,7 +1478,7 @@ Topluluk İntegrasyonları src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1473,7 +1487,7 @@ Topluluk İşbirlikleri src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1482,7 +1496,7 @@ Proje Çeviricileri src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1491,7 +1505,7 @@ Proje Destekçileri src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1500,7 +1514,7 @@ Proje Üyeleri src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1509,7 +1523,7 @@ Projeyi ayakta tutanlar src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1518,7 +1532,7 @@ Hakkında src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1530,7 +1544,7 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 @@ -1567,7 +1581,7 @@ src/app/components/amount/amount.component.html - 6,9 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1583,7 +1597,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1666,7 +1680,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1888,7 +1902,7 @@ src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header @@ -1901,7 +1915,7 @@ src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header @@ -1914,7 +1928,7 @@ src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header @@ -1923,7 +1937,7 @@ Varlık datasını yüklerken hata oldu src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -2030,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2047,7 +2061,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -2063,7 +2077,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2075,11 +2089,11 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2088,19 +2102,19 @@ Bloklar İndeksleniyor src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2121,6 +2135,7 @@ not available + Müsait değil src/app/components/block-overview-graph/block-overview-graph.component.html 5 @@ -2140,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 476 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2166,11 +2181,11 @@ src/app/components/transaction/transaction.component.html - 476,477 + 473 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2184,11 +2199,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2200,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,43 Transaction fee rate transaction.fee-rate @@ -2218,19 +2233,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2270,27 +2285,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 478,481 src/app/components/transaction/transaction.component.html - 492,494 + 489,491 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2298,7 +2313,7 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte @@ -2312,17 +2327,18 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 269,272 Transaction Virtual Size transaction.vsize Audit status + Denetlenme durumu src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 36 @@ -2331,6 +2347,7 @@ Match + Eşleşti src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 38 @@ -2339,6 +2356,7 @@ Removed + Kaldırıldı src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 39 @@ -2347,6 +2365,7 @@ Marginal fee rate + Marjinal Ücret Değeri src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 40 @@ -2359,6 +2378,7 @@ Recently broadcasted + Yakın zamanda yayınlanan src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 41 @@ -2387,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2424,11 +2444,11 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2445,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2454,15 +2474,15 @@ Boyut src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2486,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 265,267 src/app/dashboard/dashboard.component.html @@ -2498,11 +2518,11 @@ Ağırlık src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2510,11 +2530,23 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 273,275 + + + + Size per weight + Ağırlık başına düşen boyut + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2530,15 +2562,6 @@ shared.block-title - - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee Medyan ücret @@ -2548,7 +2571,7 @@ src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2565,11 +2588,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2587,7 +2610,7 @@ src/app/components/block/block.component.html - 168,170 + 173,175 block.miner @@ -2600,7 +2623,7 @@ src/app/components/block/block.component.ts - 227 + 242 @@ -2610,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2625,32 +2652,49 @@ Previous Block - - Block health + + Health + Sağlık src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown Bilinmiyor src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2667,7 +2711,7 @@ Ücret aralığı src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2680,7 +2724,7 @@ 140 vbytelık ortalama native segwit ücreti baz alınmıştır src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2704,49 +2748,66 @@ Transaction fee tooltip - - Subsidy + fees: - Ödül + ücretler: + + Subsidy + fees + Ödül + ücretler src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected + Beklenen src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + beta + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual + Aktüel src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block + Beklenen blok src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block + Gerçekleşen blok src/app/components/block/block.component.html - 225,227 + 231 block.actual-block @@ -2755,7 +2816,7 @@ Bit src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2764,7 +2825,7 @@ Merkle kökü src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2773,7 +2834,7 @@ Zorluk src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2789,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2802,7 +2863,7 @@ Nonce src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce @@ -2811,32 +2872,42 @@ Block Başlığı Hex'i src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + Denetleme + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details Detaylar src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2846,20 +2917,16 @@ Veriyi yüklerken hata oluştu src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2872,9 +2939,10 @@ Why is this block empty? + Blok neden boş? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation @@ -2920,18 +2988,6 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward Ödüller @@ -2995,7 +3051,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -3028,13 +3084,17 @@ Difficulty Adjustment Zorluk Seviyesi + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3042,11 +3102,11 @@ Remaining Kalan - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3055,11 +3115,11 @@ blocks bloklar - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3080,11 +3140,11 @@ block blok - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3097,11 +3157,11 @@ Estimate Tahmini - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3110,20 +3170,24 @@ Previous Önceki - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Şimdiki periyod - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3132,11 +3196,99 @@ Next Halving Bir Sonraki Yarılanma Dönemi - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Minimum önceliğin 2x katı ya da minimum işlem önceliği (hangisi daha düşük ise) @@ -3234,7 +3386,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3247,7 +3399,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3260,7 +3412,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3274,7 +3426,7 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3294,7 +3446,7 @@ Madencilik src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3303,7 +3455,7 @@ Havuz Sıralaması src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3316,7 +3468,7 @@ Havuz Dominansı src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3329,7 +3481,7 @@ Hash gücü & Zorluk src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3338,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3347,7 +3499,7 @@ Ağ başına düşen Lightning Node'u src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3368,7 +3520,7 @@ Lightning ağı kapasitesi src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3389,7 +3541,7 @@ ISP başına düşen Lightning Node'u src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3402,7 +3554,7 @@ Ülkelere göre Lightning Node'ları src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3419,7 +3571,7 @@ Lightning Node'u Dünya Haritası src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3436,7 +3588,7 @@ Lightning Kanalları Dünya Haritası src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3457,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3491,11 +3643,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3531,7 +3683,7 @@ src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3557,7 +3709,7 @@ Lightning tarayıcı src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3565,21 +3717,12 @@ master-page.lightning - - beta - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation Dökümentasyon src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3624,7 +3767,7 @@ Ödül İstatistikleri src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3633,7 +3776,7 @@ (144 blok) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3642,7 +3785,7 @@ Son bloklar src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3655,10 +3798,36 @@ Düzenlemeler src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments + + Broadcast Transaction + İşlemi Ağa Sal + + src/app/components/mining-dashboard/mining-dashboard.component.html + 91 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) Havuz Şansı (1 hafta) @@ -3726,7 +3895,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3756,12 +3925,25 @@ mining.rank + + Avg Health + Ortalama sağlık + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks Boş Bloklar src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3770,7 +3952,7 @@ Tüm madenciler src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3779,7 +3961,7 @@ Havuzun Talihi (1h) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3788,7 +3970,7 @@ Toplam Havuzlar (1h) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3797,12 +3979,11 @@ Madenci Havuzları src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 - - blocks - blok + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3811,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4024,24 +4240,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - İşlemi Ağa Sal - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex Hex İşlem @@ -4051,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 291,292 transaction.hex @@ -4083,6 +4281,7 @@ Avg Block Fees + Ortalama Blok Ücreti src/app/components/reward-stats/reward-stats.component.html 17 @@ -4095,6 +4294,7 @@ Average fees per block in the past 144 blocks + Son 144 blok için ortalama ücret src/app/components/reward-stats/reward-stats.component.html 18,20 @@ -4103,6 +4303,7 @@ BTC/block + BTC/blok src/app/components/reward-stats/reward-stats.component.html 21,24 @@ -4112,6 +4313,7 @@ Avg Tx Fee + Ortalama gönderi ücreti src/app/components/reward-stats/reward-stats.component.html 30 @@ -4172,6 +4374,78 @@ search-form.search-title + + Bitcoin Block Height + Bitcoin Blok Yüksekliği + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + Bitcoin İşlemi + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + Bitcoin Adresi + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + Bitcoin bloğu + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + Bitcoin adresleri + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + Lightning düğümleri + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + Lightning kanalları + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + "" 'a git; + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) Mempool vByte (sat/vByte) görünümü @@ -4199,7 +4473,7 @@ Filtre src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4208,7 +4482,7 @@ Ters çevir src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4217,7 +4491,7 @@ Saniye başı vBytes (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4225,196 +4499,188 @@ Just now Az önce - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago önce - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + Yaklaşık + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After sonrası - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Yaklaşık ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4429,6 +4695,7 @@ This transaction replaced: + Bu işlem değiştirildi: src/app/components/transaction/transaction.component.html 10,12 @@ -4438,6 +4705,7 @@ Replaced + Değiştirildi src/app/components/transaction/transaction.component.html 36,39 @@ -4454,7 +4722,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4464,11 +4732,11 @@ İlk görüldüğü an src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4484,11 +4752,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4498,7 +4766,7 @@ Tahmini Varış Süresi src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4508,7 +4776,7 @@ Bir kaç saat içinde (veya daha sonra) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4518,11 +4786,11 @@ Azalan src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4532,7 +4800,7 @@ Ata src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4542,11 +4810,11 @@ Akış src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 341,345 Transaction flow transaction.flow @@ -4556,7 +4824,7 @@ Diyagramı kapat src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4565,7 +4833,7 @@ Daha fazla göster src/app/components/transaction/transaction.component.html - 231,233 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4582,7 +4850,7 @@ Daha az göster src/app/components/transaction/transaction.component.html - 233,239 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4595,7 +4863,7 @@ Diyagramı göster src/app/components/transaction/transaction.component.html - 253,254 + 248,249 show-diagram @@ -4604,7 +4872,7 @@ Kilit Süresi src/app/components/transaction/transaction.component.html - 292,294 + 287,289 transaction.locktime @@ -4613,7 +4881,7 @@ İşlem bulunamadı. src/app/components/transaction/transaction.component.html - 455,456 + 450,451 transaction.error.transaction-not-found @@ -4622,7 +4890,7 @@ Mempool'a dahil olmayı bekliyor. src/app/components/transaction/transaction.component.html - 456,461 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4631,7 +4899,7 @@ Efektiv işlem ücreti oranı src/app/components/transaction/transaction.component.html - 489,492 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4777,17 +5045,19 @@ Show more inputs to reveal fee data + Ücret datasının için daha çok girdi göster src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info remaining + Kalan src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -4935,6 +5205,7 @@ This transaction does not use Taproot + Bu işlem Taproot kullanmıyor src/app/components/tx-features/tx-features.component.html 18 @@ -5037,21 +5308,12 @@ dashboard.latest-transactions - - USD - USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee Minimum ücret src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -5061,7 +5323,7 @@ Temizleme src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging @@ -5071,7 +5333,7 @@ Hafıza kullanımı src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage @@ -5081,16 +5343,29 @@ Dolaşımdaki L-BTC miktarı src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space sadece Bitcoin ağı ile ilgili bilgi sağlar. Kayıp gönderilerinize ulaşmanız veya işlemleri hızlandırmanız gibi istekleriniz için size çözüm sağlayamaz. + + src/app/docs/api-docs/api-docs.component.html + 13 + + + src/app/docs/api-docs/api-docs.component.html + 14 + + faq.big-disclaimer + REST API service REST API servisi src/app/docs/api-docs/api-docs.component.html - 39,40 + 42,43 api-docs.title @@ -5099,11 +5374,11 @@ Çıkış Noktası src/app/docs/api-docs/api-docs.component.html - 48,49 + 51,52 src/app/docs/api-docs/api-docs.component.html - 102,105 + 105,108 Api docs endpoint @@ -5112,11 +5387,11 @@ Tanım src/app/docs/api-docs/api-docs.component.html - 67,68 + 70,71 src/app/docs/api-docs/api-docs.component.html - 106,107 + 109,110 @@ -5124,7 +5399,7 @@ Varsayılan ileti: action: 'want', data: ['blocks', ...] iletmek istediğini belirt. Kullanılabilir alanlar: blocks, mempool-blocks, live-2h-chart ve stats. Takip eden adresle ilişkili işlemleri ileterek: 'track-address': '3PbJ...bF9B' bu adresi içeren bütün giriş ve çıkış işlemlerini al. İşlemleri sırala. Yeni mempool işlemleri içinaddress-transactions ve yeni onaylı blok işlemleri için block-transcations kullan. src/app/docs/api-docs/api-docs.component.html - 107,108 + 110,111 api-docs.websocket.websocket @@ -5221,7 +5496,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5297,12 +5572,17 @@ src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 + + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 lightning.x-channels Starting balance + Başlangıç balansı src/app/lightning/channel/channel-close-box/channel-close-box.component.html 6 @@ -5312,6 +5592,7 @@ Closing balance + Kapanış balansı src/app/lightning/channel/channel-close-box/channel-close-box.component.html 12 @@ -5337,11 +5618,11 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html - 65,66 + 68,69 status.inactive @@ -5354,11 +5635,11 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html - 66,68 + 69,71 status.active @@ -5371,7 +5652,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5379,7 +5660,7 @@ src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed @@ -5392,7 +5673,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5405,11 +5686,19 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 src/app/lightning/node-statistics/node-statistics.component.html @@ -5417,7 +5706,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5439,6 +5728,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5475,11 +5768,11 @@ Lightning kanalı src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5488,11 +5781,11 @@ Son güncelleme src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5508,11 +5801,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5521,19 +5814,20 @@ Kapanış tarihi src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,44 lightning.closing_date Closed by + Kapayan src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5542,7 +5836,7 @@ Açılış işlemi src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5551,7 +5845,7 @@ Kapanış işlemi src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5563,6 +5857,30 @@ 37 + + Mutually closed + Ortaklaşa kapatıldı + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + Kapanmaya zorlandı + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + Ceza ödeyerek zorla kapatıldı + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open Açık @@ -5577,7 +5895,7 @@ Gösterilecek kanal bulunamadı src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list @@ -5586,7 +5904,7 @@ Takma ad src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5610,11 +5928,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5623,7 +5941,7 @@ Durum src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status @@ -5632,7 +5950,7 @@ Kanal ID src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id @@ -5641,11 +5959,11 @@ sats src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,68 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5689,6 +6007,24 @@ shared.sats + + avg + ortalama + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + orta + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity Ortalama Kapasite @@ -5817,11 +6153,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5870,10 +6206,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5890,12 +6222,20 @@ 40,44 - src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 28,29 + + + src/app/lightning/node-statistics/node-statistics.component.html + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5927,16 +6267,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -5969,7 +6313,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5985,11 +6329,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -6027,9 +6371,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -6052,12 +6404,37 @@ Fee distribution + Ücret dağılımı src/app/lightning/node-fee-chart/node-fee-chart.component.html 2 lightning.node-fee-distribution + + Outgoing Fees + Giden ücretler + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + Gelen ücretler + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week Geçen haftaya göre yüzdelik değişim @@ -6067,11 +6444,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -6084,11 +6461,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -6101,7 +6478,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -6114,7 +6491,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -6127,29 +6504,21 @@ country - - No node found for public key "" - &quot;&quot; halka açık anahtar için Node bulunamadı - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size Ortalama kanal büyüklüğü src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg Avg channel distance + Ortalama kanal uzaklığı src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -6158,7 +6527,7 @@ Renk src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -6167,7 +6536,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -6180,73 +6549,81 @@ Sadece Tor üzerinde src/app/lightning/node/node.component.html - 93,95 + 96,98 tor Liquidity ad + Likidite reklamı src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad Lease fee rate + Kiralama ücreti src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate Lease base fee + Kiralama için baz ücret src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee Funding weight + Fonlama ağırlığı src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight Channel fee rate + Kanal ücreti src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate Channel base fee + Kanal baz ücreti src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee Compact lease + Kompakt kiralama src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease TLV extension records + TLV uzatma kayıtları src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6255,7 +6632,7 @@ Açık kanallar src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6264,7 +6641,7 @@ Kapanan kanallar src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6310,7 +6687,7 @@ Geolokasyon datasına ulaşılamıyor src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6324,6 +6701,7 @@ Indexing in progress + İndeksleniyor src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 121,116 @@ -6333,9 +6711,9 @@ 112,107 - - Reachable on Clearnet Only - Sadece clearnet üzerinden ulaşılanlar + + Clearnet and Darknet + Şeffaf İnternet ve Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6345,9 +6723,9 @@ 303,302 - - Reachable on Clearnet and Darknet - Clearnet ve Tor üzerinden ulaşılanlar + + Clearnet Only (IPv4, IPv6) + Sadece Şeffaf İnternet (IPV4, IPV6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6357,9 +6735,9 @@ 295,294 - - Reachable on Darknet Only - Sadece Tor üzerinden ulaşılanlar + + Darknet Only (Tor, I2P, cjdns) + Sadece Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6383,19 +6761,22 @@ lightning.share - nodes - Node'lar + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6403,7 +6784,7 @@ BTC kapasite src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6521,11 +6902,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6591,6 +6972,7 @@ Active nodes + Aktif düğümler src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 14,18 @@ -6614,24 +6996,6 @@ 27 - - Top 100 nodes liquidity ranking - Likidite sıralamasına göre en iyi 100 Node - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - Bağlantı sıralamasına göre en iyi 100 Node - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes En eski Node'lar diff --git a/frontend/src/locale/messages.uk.xlf b/frontend/src/locale/messages.uk.xlf index 0404aee6e..5794afcc5 100644 --- a/frontend/src/locale/messages.uk.xlf +++ b/frontend/src/locale/messages.uk.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ Союзи спільноти src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Перекладачі проекту src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Учасники проекту src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Члени проекту src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Розробники проекту src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment Регулювання складності + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Лишається - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks блоків - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block блок - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Приблизно - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Попередня - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Поточний період - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Наступне зменшення винагороди - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Або 2x мініуму, або повільна ставка (що менше) @@ -3346,7 +3446,7 @@ Майнінг src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ Рейтинг пулів src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ Домінування пулу src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ Хешрейт та складність src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ Lightning нод на мережу src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ Пропускна спроможність Lightning src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ Lightning нод на ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ Lightning нод на країну src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ Мапа Lightning нод src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ Мапа Lightning каналів src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ Хешрейт (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3767,7 @@ Статистика нагороди src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 блоки) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ Останні блоки src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ Регулювання src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Надіслати транзакцію src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - блоків + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4473,7 @@ Фільтрувати src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4482,7 @@ Інвертувати src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4491,7 @@ vBytes за секунду транзакції (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4499,187 @@ Just now Щойно - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago тому - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Після - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Через ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4813,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4832,7 @@ Показати більше src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4849,7 @@ Показати менше src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4862,7 @@ Показати діаграму src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4871,7 @@ Час блокування src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4880,7 @@ Транзакція не знайдена. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4889,7 @@ Чекаємо її появи в мемпулі... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4898,7 @@ Поточна ставка комісії src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5353,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5364,7 @@ Сервіс REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5373,11 @@ Ендпоїнт src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5386,11 @@ Опис src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5398,7 @@ Надсилання за замовчуванням за замовчуванням: action: 'want', data: ['blocks', ...] щоб вказати, що має бути надіслано. Доступно: blocks, mempool-blocks, live-2h-chart та stats.Надіслати транзакції пов'язані з адресою: 'track-address': '3PbJ...bF9B' щоб отримати всі нові транзакції які містять дану адресу у входах чи виходах. Повертає масив транзакцій. address-transactions для нових мемпул транзакцій та block-transactions для нових підтверджених транзакцій. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5444,6 +5573,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5558,6 +5691,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5676,7 +5817,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5817,7 +5958,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6079,6 +6220,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6127,6 +6276,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6604,19 +6757,22 @@ lightning.share - nodes - нод + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6624,7 +6780,7 @@ BTC пропускної спроможності src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6742,11 +6898,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.vi.xlf b/frontend/src/locale/messages.vi.xlf index 3fea854cf..5c4ebe759 100644 --- a/frontend/src/locale/messages.vi.xlf +++ b/frontend/src/locale/messages.vi.xlf @@ -750,11 +750,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -775,11 +775,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -805,7 +805,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1074,7 +1074,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1202,11 +1202,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1223,11 +1223,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1245,7 +1245,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1487,7 +1487,7 @@ Liên minh cộng đồng src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1496,7 +1496,7 @@ Dịch giả của Dự án src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1505,7 +1505,7 @@ Người đóng góp dự án src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1514,7 +1514,7 @@ Thành viên Dự án src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1523,7 +1523,7 @@ Người bảo trì dự án src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1581,7 +1581,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2044,7 +2044,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2093,7 +2093,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2114,7 +2114,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2155,7 +2155,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2181,7 +2181,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2203,7 +2203,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2215,7 +2215,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2297,11 +2297,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2331,7 +2331,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2407,7 +2407,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2448,7 +2448,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2465,7 +2465,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2506,7 +2506,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2534,7 +2534,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2633,6 +2633,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2846,11 +2850,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2891,7 +2895,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3080,13 +3084,17 @@ Difficulty Adjustment Điều chỉnh Độ khó + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3094,11 +3102,11 @@ Remaining Còn lại - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3107,11 +3115,11 @@ blocks khối - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3132,11 +3140,11 @@ block khối - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3149,11 +3157,11 @@ Estimate Ước tính - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3162,20 +3170,24 @@ Previous Trước - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period Giai đoạn hiện tại - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3184,11 +3196,99 @@ Next Halving Halving Tiếp theo - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) Hai lần số lượng tối thiểu hoặc Tỷ lệ ưu tiên thấp (tùy theo tỷ lệ nào thấp hơn) @@ -3346,7 +3446,7 @@ Đào src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3355,7 +3455,7 @@ Xếp hạng pool src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3368,7 +3468,7 @@ Dominance của các Pool src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3381,7 +3481,7 @@ Hashrate & độ khó src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3390,7 +3490,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3399,7 +3499,7 @@ Các nút Lightning trên mỗi mạng src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3420,7 +3520,7 @@ Năng lực mạng Lightning src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3441,7 +3541,7 @@ Nút Lightning trên mỗi ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3454,7 +3554,7 @@ Nút Lightning trên mỗi quốc gia src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3471,7 +3571,7 @@ Bản đồ thế giới nút Lightning src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3488,7 +3588,7 @@ Bản đồ thế giới các kênh nút Lightning src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3509,11 +3609,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3543,11 +3643,11 @@ Tỷ lệ băm (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3667,7 +3767,7 @@ Các chỉ số phần thưởng src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3676,7 +3776,7 @@ (144 khối) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3685,7 +3785,7 @@ Khối mới nhất src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3698,7 +3798,7 @@ Sự điều chỉnh src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3707,7 +3807,7 @@ Truyền tải Giao dịch src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3882,9 +3982,8 @@ 58 - - blocks - khối + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3893,6 +3992,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4115,7 +4249,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4339,7 +4473,7 @@ Lọc src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4348,7 +4482,7 @@ Đảo ngược src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4357,7 +4491,7 @@ Giao dịch vBytes mỗi giây (vB / s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4365,196 +4499,187 @@ Just now Vừa mới đây - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago trước - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After Sau - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - Trong ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4688,7 +4813,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4707,7 +4832,7 @@ Hiển thị nhiều hơn src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4724,7 +4849,7 @@ Hiển thị ít hơn src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4737,7 +4862,7 @@ Hiển thị sơ đồ src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4746,7 +4871,7 @@ Thời gian khóa src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4755,7 +4880,7 @@ Không tìm thấy giao dịch. src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4764,7 +4889,7 @@ Đang đợi nó xuất hiện trong mempool ... src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4773,7 +4898,7 @@ Tỷ lệ phí hiệu quả src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5228,6 +5353,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5235,7 +5364,7 @@ Dịch vụ REST API src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5244,11 +5373,11 @@ Điểm cuối src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5257,11 +5386,11 @@ Sự miêu tả src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5269,7 +5398,7 @@ Push mặc định: hành động: 'want', dữ liệu: ['blocks', ...] để thể hiện những gì bạn muốn đẩy. Có sẵn: khối , mempool-khối , live-2h-chart c195a641ez0c195ez0. Đẩy các giao dịch liên quan đến địa chỉ: 'track-address': '3PbJ ... bF9B' a0c95ez0 đầu vào để nhận các giao dịch đầu vào a0c95ez0 a0c95ez0 đó để nhận địa chỉ đầu vào là all95ez0. Trả về một mảng các giao dịch. địa chỉ-giao dịch cho các giao dịch mempool mới và giao dịch khối cho các giao dịch được xác nhận khối mới. src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5444,6 +5573,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5558,6 +5691,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5676,7 +5817,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5817,7 +5958,7 @@ satoshi src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6079,6 +6220,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6127,6 +6276,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6604,19 +6757,22 @@ lightning.share - nodes - nút + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6624,7 +6780,7 @@ công suất BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6742,11 +6898,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.zh.xlf b/frontend/src/locale/messages.zh.xlf index d2cda98c6..d2ec0f162 100644 --- a/frontend/src/locale/messages.zh.xlf +++ b/frontend/src/locale/messages.zh.xlf @@ -749,11 +749,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -774,11 +774,11 @@ src/app/components/about/about.component.html - 375,378 + 391,394 src/app/components/mining-dashboard/mining-dashboard.component.html - 88 + 87 src/app/dashboard/dashboard.component.html @@ -804,7 +804,7 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 90 + 89 src/app/dashboard/dashboard.component.html @@ -1073,7 +1073,7 @@ src/app/components/transaction/transaction.component.html - 282,284 + 283,285 transaction.version @@ -1201,11 +1201,11 @@ src/app/components/transaction/transaction.component.html - 256,261 + 257,262 src/app/components/transaction/transaction.component.html - 400,406 + 401,407 transaction.details @@ -1222,11 +1222,11 @@ src/app/components/transaction/transaction.component.html - 243,247 + 244,248 src/app/components/transaction/transaction.component.html - 371,377 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1244,7 +1244,7 @@ src/app/components/transaction/transaction.component.ts - 244,243 + 246,245 @@ -1486,7 +1486,7 @@ 社区联盟 src/app/components/about/about.component.html - 275,277 + 291,293 about.alliances @@ -1495,7 +1495,7 @@ 项目翻译者 src/app/components/about/about.component.html - 291,293 + 307,309 about.translators @@ -1504,7 +1504,7 @@ 项目贡献者 src/app/components/about/about.component.html - 305,307 + 321,323 about.contributors @@ -1513,7 +1513,7 @@ 项目成员 src/app/components/about/about.component.html - 317,319 + 333,335 about.project_members @@ -1522,7 +1522,7 @@ 项目维护者 src/app/components/about/about.component.html - 330,332 + 346,348 about.maintainers @@ -1580,7 +1580,7 @@ src/app/components/amount/amount.component.html - 20,23 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -2043,7 +2043,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2092,7 +2092,7 @@ src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2113,7 +2113,7 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2154,7 +2154,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2180,7 +2180,7 @@ src/app/components/transaction/transaction.component.html - 472 + 473 src/app/components/transactions-list/transactions-list.component.html @@ -2202,7 +2202,7 @@ src/app/components/transaction/transaction.component.html - 475,477 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2214,7 +2214,7 @@ src/app/lightning/channels-list/channels-list.component.html - 41,42 + 41,43 Transaction fee rate transaction.fee-rate @@ -2296,11 +2296,11 @@ src/app/components/transaction/transaction.component.html - 477,480 + 478,481 src/app/components/transaction/transaction.component.html - 488,490 + 489,491 src/app/components/transactions-list/transactions-list.component.html @@ -2330,7 +2330,7 @@ src/app/components/transaction/transaction.component.html - 268,271 + 269,272 Transaction Virtual Size transaction.vsize @@ -2404,7 +2404,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2445,7 +2445,7 @@ src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2462,7 +2462,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2503,7 +2503,7 @@ src/app/components/transaction/transaction.component.html - 264,266 + 265,267 src/app/dashboard/dashboard.component.html @@ -2531,7 +2531,7 @@ src/app/components/transaction/transaction.component.html - 272,274 + 273,275 @@ -2629,6 +2629,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2837,11 +2841,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2881,7 +2885,7 @@ src/app/components/transaction/transaction.component.html - 248,253 + 249,254 src/app/lightning/channel/channel.component.html @@ -3069,13 +3073,17 @@ Difficulty Adjustment 难度调整 + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3083,11 +3091,11 @@ Remaining 距离下次调整 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3096,11 +3104,11 @@ blocks 区块 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3121,11 +3129,11 @@ block 区块 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3138,11 +3146,11 @@ Estimate 预估调整量 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3151,20 +3159,24 @@ Previous 之前 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period 当前阶段 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3173,11 +3185,99 @@ Next Halving 距离下次奖励减半 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) 最低 2 倍最小值或低优先率(以较低者为准) @@ -3335,7 +3435,7 @@ 挖矿 src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3344,7 +3444,7 @@ 矿池排名 src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3357,7 +3457,7 @@ 矿池优势 src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3370,7 +3470,7 @@ 哈希率与难度 src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3379,7 +3479,7 @@ 闪电网络 src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3388,7 +3488,7 @@ 闪电网络节点网络分布 src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3409,7 +3509,7 @@ 闪电网络容量 src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3430,7 +3530,7 @@ 闪电网络节点按 ISP 排序 src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3443,7 +3543,7 @@ 闪电网络节点按国家或地区排序 src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3460,7 +3560,7 @@ 闪电网络节点全球地图 src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3477,7 +3577,7 @@ 闪电网络频率世界地图 src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3498,11 +3598,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3532,11 +3632,11 @@ 哈希率(MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3656,7 +3756,7 @@ 奖励统计 src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3665,7 +3765,7 @@ (近 144 个区块) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3674,7 +3774,7 @@ 最新区块 src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3687,7 +3787,7 @@ 难度调整 src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments @@ -3696,7 +3796,7 @@ 广播交易 src/app/components/mining-dashboard/mining-dashboard.component.html - 92 + 91 src/app/components/push-transaction/push-transaction.component.html @@ -3870,9 +3970,8 @@ 58 - - blocks - 区块 + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3881,6 +3980,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -4103,7 +4237,7 @@ src/app/components/transaction/transaction.component.html - 290,291 + 291,292 transaction.hex @@ -4318,7 +4452,7 @@ 过滤 src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4327,7 +4461,7 @@ 倒置 src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4336,7 +4470,7 @@ 交易字节/秒 (虚拟字节) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4344,196 +4478,187 @@ Just now 现在 - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago 之前 - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After 之后 - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - 之内 - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4665,7 +4790,7 @@ src/app/components/transaction/transaction.component.html - 340,344 + 341,345 Transaction flow transaction.flow @@ -4684,7 +4809,7 @@ 展示更多 src/app/components/transaction/transaction.component.html - 225,227 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4701,7 +4826,7 @@ 展示更少 src/app/components/transaction/transaction.component.html - 227,233 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4714,7 +4839,7 @@ 显示图表 src/app/components/transaction/transaction.component.html - 247,248 + 248,249 show-diagram @@ -4723,7 +4848,7 @@ 锁定时间 src/app/components/transaction/transaction.component.html - 286,288 + 287,289 transaction.locktime @@ -4732,7 +4857,7 @@ 交易未找到 src/app/components/transaction/transaction.component.html - 449,450 + 450,451 transaction.error.transaction-not-found @@ -4741,7 +4866,7 @@ 等待交易出现在内存池 src/app/components/transaction/transaction.component.html - 450,455 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4750,7 +4875,7 @@ 有效收费率 src/app/components/transaction/transaction.component.html - 485,488 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -5201,6 +5326,10 @@ src/app/docs/api-docs/api-docs.component.html 13 + + src/app/docs/api-docs/api-docs.component.html + 14 + faq.big-disclaimer @@ -5208,7 +5337,7 @@ REST API 服务 src/app/docs/api-docs/api-docs.component.html - 41,42 + 42,43 api-docs.title @@ -5217,11 +5346,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 50,51 + 51,52 src/app/docs/api-docs/api-docs.component.html - 104,107 + 105,108 Api docs endpoint @@ -5230,11 +5359,11 @@ 描述 src/app/docs/api-docs/api-docs.component.html - 69,70 + 70,71 src/app/docs/api-docs/api-docs.component.html - 108,109 + 109,110 @@ -5242,7 +5371,7 @@ 默认推送:操作: 'want', 数据: ['blocks', ...] 来表达你想要推送的内容。可用字段:blocksmempool-blockslive-2h-chart,和stats推送与地址有关的事务。'track-address': '3PbJ...bF9B' 接收所有包含该地址的新事务作为输入或输出。返回一个交易数组。address-transactions用于新的mempool交易,block-transactions用于新的块确认交易。 src/app/docs/api-docs/api-docs.component.html - 109,110 + 110,111 api-docs.websocket.websocket @@ -5417,6 +5546,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -5529,6 +5662,14 @@ src/app/lightning/channels-list/channels-list.component.html 43,46 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 + src/app/lightning/node-statistics/node-statistics.component.html 4,5 @@ -5647,7 +5788,7 @@ src/app/lightning/channels-list/channels-list.component.html - 42,43 + 42,44 lightning.closing_date @@ -5784,7 +5925,7 @@ sats src/app/lightning/channels-list/channels-list.component.html - 63,67 + 63,68 src/app/lightning/channels-list/channels-list.component.html @@ -6044,6 +6185,14 @@ src/app/lightning/group/group.component.html 40,44 + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 + src/app/lightning/node-statistics/node-statistics.component.html 28,29 @@ -6092,6 +6241,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6558,19 +6711,22 @@ lightning.share - nodes - 节点 + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6578,7 +6734,7 @@ BTC 容量 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6696,11 +6852,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 From a5dd141934ec536f5733192584f071d0fc6a16d8 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Tue, 14 Mar 2023 15:39:15 +0900 Subject: [PATCH 070/782] Don't fetch prices on signet/testnet, always show 0 --- backend/src/api/database-migration.ts | 7 ++++++- backend/src/tasks/price-updater.ts | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index 1ef31c90b..ab38b0543 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository'; import { RowDataPacket } from 'mysql2'; class DatabaseMigration { - private static currentVersion = 58; + private static currentVersion = 59; private queryTimeout = 3600_000; private statisticsAddedIndexed = false; private uniqueLogs: string[] = []; @@ -510,6 +510,11 @@ class DatabaseMigration { // We only run some migration queries for this version await this.updateToSchemaVersion(58); } + + if (databaseSchemaVersion < 59 && (config.MEMPOOL.NETWORK === 'signet' || config.MEMPOOL.NETWORK === 'testnet')) { + // https://github.com/mempool/mempool/issues/3360 + await this.$executeQuery(`TRUNCATE prices`); + } } /** diff --git a/backend/src/tasks/price-updater.ts b/backend/src/tasks/price-updater.ts index ccb8d3e68..716ac9ee6 100644 --- a/backend/src/tasks/price-updater.ts +++ b/backend/src/tasks/price-updater.ts @@ -73,6 +73,11 @@ class PriceUpdater { } public async $run(): Promise { + if (config.MEMPOOL.NETWORK === 'signet' || config.MEMPOOL.NETWORK === 'testnet') { + // Coins have no value on testnet/signet, so we want to always show 0 + return; + } + if (this.running === true) { return; } @@ -88,7 +93,7 @@ class PriceUpdater { if (this.historyInserted === false && config.DATABASE.ENABLED === true) { await this.$insertHistoricalPrices(); } - } catch (e) { + } catch (e: any) { logger.err(`Cannot save BTC prices in db. Reason: ${e instanceof Error ? e.message : e}`, logger.tags.mining); } From 7bf8fea9f2d18260f8d36471fa2fb92aff834840 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 14 Mar 2023 16:58:02 +0900 Subject: [PATCH 071/782] Limit special blocks by network, add future halvings --- frontend/src/app/app.constants.ts | 61 +++++++++++++++++++ .../blockchain-blocks.component.html | 2 +- .../blockchain-blocks.component.ts | 4 ++ .../mempool-blocks.component.ts | 4 +- .../app/components/start/start.component.ts | 17 +++--- 5 files changed, 75 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/app.constants.ts b/frontend/src/app/app.constants.ts index f15733bb0..8a091706a 100644 --- a/frontend/src/app/app.constants.ts +++ b/frontend/src/app/app.constants.ts @@ -139,26 +139,87 @@ export const specialBlocks = { '0': { labelEvent: 'Genesis', labelEventCompleted: 'The Genesis of Bitcoin', + networks: ['mainnet', 'testnet'], }, '210000': { labelEvent: 'Bitcoin\'s 1st Halving', labelEventCompleted: 'Block Subsidy has halved to 25 BTC per block', + networks: ['mainnet', 'testnet'], }, '420000': { labelEvent: 'Bitcoin\'s 2nd Halving', labelEventCompleted: 'Block Subsidy has halved to 12.5 BTC per block', + networks: ['mainnet', 'testnet'], }, '630000': { labelEvent: 'Bitcoin\'s 3rd Halving', labelEventCompleted: 'Block Subsidy has halved to 6.25 BTC per block', + networks: ['mainnet', 'testnet'], }, '709632': { labelEvent: 'Taproot 🌱 activation', labelEventCompleted: 'Taproot 🌱 has been activated!', + networks: ['mainnet'], }, '840000': { labelEvent: 'Bitcoin\'s 4th Halving', labelEventCompleted: 'Block Subsidy has halved to 3.125 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '1050000': { + labelEvent: 'Bitcoin\'s 5th Halving', + labelEventCompleted: 'Block Subsidy has halved to 1.5625 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '1260000': { + labelEvent: 'Bitcoin\'s 6th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.78125 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '1470000': { + labelEvent: 'Bitcoin\'s 7th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.390625 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '1680000': { + labelEvent: 'Bitcoin\'s 8th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.1953125 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '1890000': { + labelEvent: 'Bitcoin\'s 9th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.09765625 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '2100000': { + labelEvent: 'Bitcoin\'s 10th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.04882812 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '2310000': { + labelEvent: 'Bitcoin\'s 11th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.02441406 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '2520000': { + labelEvent: 'Bitcoin\'s 12th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.01220703 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '2730000': { + labelEvent: 'Bitcoin\'s 13th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.00610351 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '2940000': { + labelEvent: 'Bitcoin\'s 14th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.00305175 BTC per block', + networks: ['mainnet', 'testnet'], + }, + '3150000': { + labelEvent: 'Bitcoin\'s 15th Halving', + labelEventCompleted: 'Block Subsidy has halved to 0.00152587 BTC per block', + networks: ['mainnet', 'testnet'], } }; diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html index 8323cf8c6..6cdb895ff 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -6,7 +6,7 @@
+ [class.blink-bg]="isSpecial(block.height)">  
diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 30b98813a..9c0049c4d 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -269,6 +269,10 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.cd.markForCheck(); } + isSpecial(height: number): boolean { + return this.specialBlocks[height]?.networks.includes(this.stateService.network || 'mainnet') ? true : false; + } + getStyleForBlock(block: BlockchainBlock, index: number, animateEnterFrom: number = 0) { if (!block || block.placeholder) { return this.getStyleForPlaceholderBlock(index, animateEnterFrom); diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 8a0a06f0c..57fba7966 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -116,9 +116,7 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { mempoolBlocks.forEach((block, i) => { block.index = this.blockIndex + i; block.height = lastBlock.height + i + 1; - if (this.stateService.network === '') { - block.blink = specialBlocks[block.height] ? true : false; - } + block.blink = specialBlocks[block.height]?.networks.includes(this.stateService.network || 'mainnet') ? true : false; }); const stringifiedBlocks = JSON.stringify(mempoolBlocks); diff --git a/frontend/src/app/components/start/start.component.ts b/frontend/src/app/components/start/start.component.ts index 77c8fd7f2..dde7bc234 100644 --- a/frontend/src/app/components/start/start.component.ts +++ b/frontend/src/app/components/start/start.component.ts @@ -85,21 +85,20 @@ export class StartComponent implements OnInit, OnDestroy { }); this.stateService.blocks$ .subscribe((blocks: any) => { - if (this.stateService.network !== '') { - return; - } this.countdown = 0; const block = blocks[0]; for (const sb in specialBlocks) { - const height = parseInt(sb, 10); - const diff = height - block.height; - if (diff > 0 && diff <= 1008) { - this.countdown = diff; - this.eventName = specialBlocks[sb].labelEvent; + if (specialBlocks[sb].networks.includes(this.stateService.network || 'mainnet')) { + const height = parseInt(sb, 10); + const diff = height - block.height; + if (diff > 0 && diff <= 1008) { + this.countdown = diff; + this.eventName = specialBlocks[sb].labelEvent; + } } } - if (specialBlocks[block.height]) { + if (specialBlocks[block.height] && specialBlocks[block.height].networks.includes(this.stateService.network || 'mainnet')) { this.specialEvent = true; this.eventName = specialBlocks[block.height].labelEventCompleted; setTimeout(() => { From cdfde05452b78c18a11b5932eddd3df3fca05296 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Wed, 15 Mar 2023 02:25:41 -0400 Subject: [PATCH 072/782] Make new folder for promo video assets Video, cover image, and subtitle files. --- .../app/components/about/about.component.html | 6 +++++- .../src/resources/promo-video/mempool-promo.jpg | Bin 0 -> 47149 bytes frontend/sync-assets.js | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 frontend/src/resources/promo-video/mempool-promo.jpg diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 73e7a17a2..a0ea005dd 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -13,7 +13,11 @@

Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties.

- +

Enterprise Sponsors 🚀

diff --git a/frontend/src/resources/promo-video/mempool-promo.jpg b/frontend/src/resources/promo-video/mempool-promo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40715b507fb0866f505807c7eb7bc59225d32e92 GIT binary patch literal 47149 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%0DPl2?p0sejo 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 N=KN>Fec Date: Wed, 15 Mar 2023 04:49:06 -0400 Subject: [PATCH 073/782] Fetch subtitles files from github For en, sv, and ja. --- frontend/src/resources/mempool-promo.jpg | Bin 47149 -> 0 bytes frontend/sync-assets.js | 12 +++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) delete mode 100644 frontend/src/resources/mempool-promo.jpg diff --git a/frontend/src/resources/mempool-promo.jpg b/frontend/src/resources/mempool-promo.jpg deleted file mode 100644 index 40715b507fb0866f505807c7eb7bc59225d32e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47149 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%0DPl2?p0sejo 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 N=KN>Fec Date: Wed, 15 Mar 2023 04:51:44 -0400 Subject: [PATCH 074/782] Make git ignore mp4 and vtt files in /resources --- frontend/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/.gitignore b/frontend/.gitignore index 9c4b5d5e8..8159e7c7b 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -54,7 +54,8 @@ src/resources/assets-testnet.json src/resources/assets-testnet.minimal.json src/resources/pools.json src/resources/mining-pools/* -src/resources/*.mp4 +src/resources/**/*.mp4 +src/resources/**/*.vtt # environment config mempool-frontend-config.json From 4c294b010d158237b329bcebfa65670b80dc5b6a Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Wed, 15 Mar 2023 06:08:57 -0400 Subject: [PATCH 075/782] Make subtitles default to current locale --- .../src/app/components/about/about.component.html | 6 +++--- frontend/src/app/components/about/about.component.ts | 11 ++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index a0ea005dd..6e459cbac 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -14,9 +14,9 @@
diff --git a/frontend/src/app/components/about/about.component.ts b/frontend/src/app/components/about/about.component.ts index 0f71645d6..4bf70e435 100644 --- a/frontend/src/app/components/about/about.component.ts +++ b/frontend/src/app/components/about/about.component.ts @@ -68,7 +68,7 @@ export class AboutComponent implements OnInit { tap(() => this.goToAnchor()) ); } - + ngAfterViewInit() { this.goToAnchor(); } @@ -90,4 +90,13 @@ export class AboutComponent implements OnInit { this.showNavigateToSponsor = true; } } + + showSubtitles(language) { + console.log(this.locale); + if( this.locale.startsWith( language ) ) { + return true; + } else { + return false; + } + } } From 599881366b94c5e4e6221c4a55bf86234c32f1ad Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Wed, 15 Mar 2023 22:43:41 -0700 Subject: [PATCH 076/782] Add GHA for Docker digest --- .github/workflows/get_image_digest.yml | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/get_image_digest.yml diff --git a/.github/workflows/get_image_digest.yml b/.github/workflows/get_image_digest.yml new file mode 100644 index 000000000..1fcc16d0e --- /dev/null +++ b/.github/workflows/get_image_digest.yml @@ -0,0 +1,27 @@ +name: 'Print images digest' + +on: + push: + workflow_dispatch: + inputs: + version: + description: 'Image Version' + required: false + default: 'latest' + type: string +jobs: + print-images-sha: + runs-on: 'ubuntu-latest' + name: Print digest for images + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + path: digest + + - name: Run script + working-directory: digest + run: | + sh ./docker/scripts/get_image_digest.sh $VERSION + env: + VERSION: ${{ github.event.inputs.version }} From 5fbdd0bb2a1086019bb31fd4bc02874fa3112857 Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Wed, 15 Mar 2023 22:48:28 -0700 Subject: [PATCH 077/782] Remove push trigger --- .github/workflows/get_image_digest.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/get_image_digest.yml b/.github/workflows/get_image_digest.yml index 1fcc16d0e..7414eeb08 100644 --- a/.github/workflows/get_image_digest.yml +++ b/.github/workflows/get_image_digest.yml @@ -1,7 +1,6 @@ name: 'Print images digest' on: - push: workflow_dispatch: inputs: version: From c683a52a01605f81848a3367a15e2c05910b93af Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 16 Mar 2023 02:29:33 -0400 Subject: [PATCH 078/782] Show captions for non-english locales --- frontend/src/app/components/about/about.component.html | 6 +++--- frontend/src/app/components/about/about.component.ts | 7 +------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 6e459cbac..17920157f 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -14,9 +14,9 @@
diff --git a/frontend/src/app/components/about/about.component.ts b/frontend/src/app/components/about/about.component.ts index 4bf70e435..2bc42bde9 100644 --- a/frontend/src/app/components/about/about.component.ts +++ b/frontend/src/app/components/about/about.component.ts @@ -92,11 +92,6 @@ export class AboutComponent implements OnInit { } showSubtitles(language) { - console.log(this.locale); - if( this.locale.startsWith( language ) ) { - return true; - } else { - return false; - } + return ( this.locale.startsWith( language ) && !this.locale.startsWith('en') ); } } From 0ebe0a5dc9985866c1c2efb2a5455fac5d6dffef Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 16 Mar 2023 16:13:11 +0900 Subject: [PATCH 079/782] Add new stats in mining pool page --- backend/src/api/mining/mining.ts | 6 + backend/src/repositories/BlocksRepository.ts | 49 ++++++++ .../components/pool/pool-preview.component.ts | 5 - .../app/components/pool/pool.component.html | 106 ++++++++++-------- .../app/components/pool/pool.component.scss | 13 ++- .../src/app/components/pool/pool.component.ts | 10 +- .../src/app/interfaces/node-api.interface.ts | 4 +- 7 files changed, 128 insertions(+), 65 deletions(-) diff --git a/backend/src/api/mining/mining.ts b/backend/src/api/mining/mining.ts index 8b4abb0d6..58626df65 100644 --- a/backend/src/api/mining/mining.ts +++ b/backend/src/api/mining/mining.ts @@ -13,6 +13,7 @@ import BlocksAuditsRepository from '../../repositories/BlocksAuditsRepository'; import PricesRepository from '../../repositories/PricesRepository'; import { bitcoinCoreApi } from '../bitcoin/bitcoin-api-factory'; import { IEsploraApi } from '../bitcoin/esplora-api.interface'; +import database from '../../database'; class Mining { private blocksPriceIndexingRunning = false; @@ -141,6 +142,9 @@ class Mining { const blockCount1w: number = await BlocksRepository.$blockCount(pool.id, '1w'); const totalBlock1w: number = await BlocksRepository.$blockCount(null, '1w'); + const avgHealth = await BlocksRepository.$getAvgBlockHealthPerPoolId(pool.id); + const totalReward = await BlocksRepository.$getTotalRewardForPoolId(pool.id); + let currentEstimatedHashrate = 0; try { currentEstimatedHashrate = await bitcoinClient.getNetworkHashPs(totalBlock24h); @@ -162,6 +166,8 @@ class Mining { }, estimatedHashrate: currentEstimatedHashrate * (blockCount24h / totalBlock24h), reportedHashrate: null, + avgBlockHealth: avgHealth, + totalReward: totalReward, }; } diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index f2d0a283e..04dcd4b56 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -330,6 +330,55 @@ class BlocksRepository { } } + /** + * Get average block health for all blocks for a single pool + */ + public async $getAvgBlockHealthPerPoolId(poolId: number): Promise { + const params: any[] = []; + const query = ` + SELECT AVG(blocks_audits.match_rate) AS avg_match_rate + FROM blocks + JOIN blocks_audits ON blocks.height = blocks_audits.height + WHERE blocks.pool_id = ? + `; + params.push(poolId); + + try { + const [rows] = await DB.query(query, params); + if (!rows[0] || !rows[0].avg_match_rate) { + return 0; + } + return Math.round(rows[0].avg_match_rate * 100) / 100; + } catch (e) { + logger.err(`Cannot get average block health for pool id ${poolId}. Reason: ` + (e instanceof Error ? e.message : e)); + throw e; + } + } + + /** + * Get average block health for all blocks for a single pool + */ + public async $getTotalRewardForPoolId(poolId: number): Promise { + const params: any[] = []; + const query = ` + SELECT sum(reward) as total_reward + FROM blocks + WHERE blocks.pool_id = ? + `; + params.push(poolId); + + try { + const [rows] = await DB.query(query, params); + if (!rows[0] || !rows[0].total_reward) { + return 0; + } + return rows[0].total_reward; + } catch (e) { + logger.err(`Cannot get total reward for pool id ${poolId}. Reason: ` + (e instanceof Error ? e.message : e)); + throw e; + } + } + /** * Get the oldest indexed block */ diff --git a/frontend/src/app/components/pool/pool-preview.component.ts b/frontend/src/app/components/pool/pool-preview.component.ts index 277bacb33..0431686d6 100644 --- a/frontend/src/app/components/pool/pool-preview.component.ts +++ b/frontend/src/app/components/pool/pool-preview.component.ts @@ -86,11 +86,6 @@ export class PoolPreviewComponent implements OnInit { regexes += regex + '", "'; } poolStats.pool.regexes = regexes.slice(0, -3); - poolStats.pool.addresses = poolStats.pool.addresses; - - if (poolStats.reportedHashrate) { - poolStats.luck = poolStats.estimatedHashrate / poolStats.reportedHashrate * 100; - } this.openGraphService.waitOver('pool-stats-' + this.slug); diff --git a/frontend/src/app/components/pool/pool.component.html b/frontend/src/app/components/pool/pool.component.html index 0ae32ccb8..d7c791db9 100644 --- a/frontend/src/app/components/pool/pool.component.html +++ b/frontend/src/app/components/pool/pool.component.html @@ -37,13 +37,13 @@
- @@ -88,22 +88,25 @@ - @@ -111,49 +114,46 @@ - - - - - - + - + @@ -234,10 +234,24 @@ {{ block.extras.coinbaseRaw | hex2ascii }} + - - - + + + + loading... + diff --git a/frontend/src/app/lightning/justice-list/justice-list.component.scss b/frontend/src/app/lightning/justice-list/justice-list.component.scss new file mode 100644 index 000000000..3547c447f --- /dev/null +++ b/frontend/src/app/lightning/justice-list/justice-list.component.scss @@ -0,0 +1,52 @@ +.container-xl { + max-width: 1400px; +} +.container-xl.widget { + padding-right: 0px; + padding-left: 0px; + padding-bottom: 0px; +} + +tr, td, th { + border: 0px; + padding-top: 0.65rem !important; + padding-bottom: 0.7rem !important; +} + +.clear-link { + color: white; +} + +.pool { + width: 15%; + @media (max-width: 575px) { + width: 75%; + } + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 160px; +} +.pool-name { + display: inline-block; + vertical-align: text-top; + text-overflow: ellipsis; + overflow: hidden; +} + +.liquidity { + width: 10%; + @media (max-width: 575px) { + width: 25%; + } +} + +.fiat { + width: 15%; + @media (min-width: 768px) and (max-width: 991px) { + display: none !important; + } + @media (max-width: 575px) { + display: none !important; + } +} diff --git a/frontend/src/app/lightning/justice-list/justice-list.component.ts b/frontend/src/app/lightning/justice-list/justice-list.component.ts new file mode 100644 index 000000000..d48cdb7ea --- /dev/null +++ b/frontend/src/app/lightning/justice-list/justice-list.component.ts @@ -0,0 +1,60 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { map, Observable, of, Subject, Subscription, switchMap, tap, zip } from 'rxjs'; +import { IChannel } from '../../interfaces/node-api.interface'; +import { LightningApiService } from '../lightning-api.service'; +import { Transaction } from '../../interfaces/electrs.interface'; +import { ElectrsApiService } from '../../services/electrs-api.service'; + +@Component({ + selector: 'app-justice-list', + templateUrl: './justice-list.component.html', + styleUrls: ['./justice-list.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class JusticeList implements OnInit, OnDestroy { + justiceChannels$: Observable; + fetchTransactions$: Subject = new Subject(); + transactionsSubscription: Subscription; + transactions: Transaction[]; + expanded: string = null; + loadingTransactions: boolean = true; + + constructor( + private apiService: LightningApiService, + private electrsApiService: ElectrsApiService, + private cd: ChangeDetectorRef, + ) {} + + ngOnInit(): void { + this.justiceChannels$ = this.apiService.getPenaltyClosedChannels$(); + + this.transactionsSubscription = this.fetchTransactions$.pipe( + tap(() => { + this.loadingTransactions = true; + }), + switchMap((channel: IChannel) => { + return zip([ + channel.transaction_id ? this.electrsApiService.getTransaction$(channel.transaction_id) : of(null), + channel.closing_transaction_id ? this.electrsApiService.getTransaction$(channel.closing_transaction_id) : of(null), + ]); + }), + ).subscribe((transactions) => { + this.transactions = transactions; + this.loadingTransactions = false; + this.cd.markForCheck(); + }); + } + + toggleDetails(channel: any): void { + if (this.expanded === channel.short_id) { + this.expanded = null; + } else { + this.expanded = channel.short_id; + this.fetchTransactions$.next(channel); + } + } + + ngOnDestroy(): void { + this.transactionsSubscription.unsubscribe(); + } +} diff --git a/frontend/src/app/lightning/lightning-api.service.ts b/frontend/src/app/lightning/lightning-api.service.ts index 6ea550591..bdcc78f3f 100644 --- a/frontend/src/app/lightning/lightning-api.service.ts +++ b/frontend/src/app/lightning/lightning-api.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { StateService } from '../services/state.service'; -import { INodesRanking, IOldestNodes, ITopNodesPerCapacity, ITopNodesPerChannels } from '../interfaces/node-api.interface'; +import { IChannel, INodesRanking, IOldestNodes, ITopNodesPerCapacity, ITopNodesPerChannels } from '../interfaces/node-api.interface'; @Injectable({ providedIn: 'root' @@ -84,6 +84,12 @@ export class LightningApiService { ); } + getPenaltyClosedChannels$(): Observable { + return this.httpClient.get( + this.apiBasePath + '/api/v1/lightning/penalties' + ); + } + getOldestNodes$(): Observable { return this.httpClient.get( this.apiBasePath + '/api/v1/lightning/nodes/rankings/age' diff --git a/frontend/src/app/lightning/lightning.module.ts b/frontend/src/app/lightning/lightning.module.ts index 5d67433c7..0b824ad78 100644 --- a/frontend/src/app/lightning/lightning.module.ts +++ b/frontend/src/app/lightning/lightning.module.ts @@ -29,6 +29,7 @@ import { NodesChannelsMap } from '../lightning/nodes-channels-map/nodes-channels import { NodesRanking } from '../lightning/nodes-ranking/nodes-ranking.component'; import { TopNodesPerChannels } from '../lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component'; import { TopNodesPerCapacity } from '../lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component'; +import { JusticeList } from '../lightning/justice-list/justice-list.component'; import { OldestNodes } from '../lightning/nodes-ranking/oldest-nodes/oldest-nodes.component'; import { NodesRankingsDashboard } from '../lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component'; import { NodeChannels } from '../lightning/nodes-channels/node-channels.component'; @@ -60,6 +61,7 @@ import { GroupComponent } from './group/group.component'; NodesRanking, TopNodesPerChannels, TopNodesPerCapacity, + JusticeList, OldestNodes, NodesRankingsDashboard, NodeChannels, @@ -97,6 +99,7 @@ import { GroupComponent } from './group/group.component'; NodesRanking, TopNodesPerChannels, TopNodesPerCapacity, + JusticeList, OldestNodes, NodesRankingsDashboard, NodeChannels, diff --git a/frontend/src/app/lightning/lightning.routing.module.ts b/frontend/src/app/lightning/lightning.routing.module.ts index 79c3bc297..8b8041181 100644 --- a/frontend/src/app/lightning/lightning.routing.module.ts +++ b/frontend/src/app/lightning/lightning.routing.module.ts @@ -9,6 +9,7 @@ import { NodesPerISP } from './nodes-per-isp/nodes-per-isp.component'; import { NodesRanking } from './nodes-ranking/nodes-ranking.component'; import { NodesRankingsDashboard } from './nodes-rankings-dashboard/nodes-rankings-dashboard.component'; import { GroupComponent } from './group/group.component'; +import { JusticeList } from './justice-list/justice-list.component'; const routes: Routes = [ { @@ -66,6 +67,10 @@ const routes: Routes = [ type: 'oldest' }, }, + { + path: 'penalties', + component: JusticeList, + }, { path: '**', redirectTo: '' diff --git a/frontend/src/app/shared/components/truncate/truncate.component.html b/frontend/src/app/shared/components/truncate/truncate.component.html index 31d1b1b88..94208f3a4 100644 --- a/frontend/src/app/shared/components/truncate/truncate.component.html +++ b/frontend/src/app/shared/components/truncate/truncate.component.html @@ -1,4 +1,4 @@ - + diff --git a/frontend/src/app/shared/components/truncate/truncate.component.scss b/frontend/src/app/shared/components/truncate/truncate.component.scss index ea69e32c3..315ce4e12 100644 --- a/frontend/src/app/shared/components/truncate/truncate.component.scss +++ b/frontend/src/app/shared/components/truncate/truncate.component.scss @@ -23,4 +23,8 @@ flex-shrink: 0; flex-grow: 0; } + + &.inline { + display: inline-flex; + } } \ No newline at end of file diff --git a/frontend/src/app/shared/components/truncate/truncate.component.ts b/frontend/src/app/shared/components/truncate/truncate.component.ts index 9edc6ddb2..0b6d2d8c1 100644 --- a/frontend/src/app/shared/components/truncate/truncate.component.ts +++ b/frontend/src/app/shared/components/truncate/truncate.component.ts @@ -11,6 +11,8 @@ export class TruncateComponent { @Input() link: any = null; @Input() lastChars: number = 4; @Input() maxWidth: number = null; + @Input() inline: boolean = false; + @Input() textAlign: 'start' | 'end' = 'start'; rtl: boolean; constructor( From f1966768a7e767ee8f611b8e821793883ce73acf Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 19 Jun 2023 18:14:09 -0400 Subject: [PATCH 537/782] exclude fullrbf txs from audit and label in visualization --- backend/src/api/audit.ts | 15 +++++++++++---- backend/src/api/database-migration.ts | 6 +++++- backend/src/api/rbf-cache.ts | 13 +++++++++++++ backend/src/api/websocket-handler.ts | 11 ++++++----- backend/src/mempool.interfaces.ts | 1 + .../src/repositories/BlocksAuditsRepository.ts | 8 +++++--- .../components/block-overview-graph/tx-view.ts | 3 ++- .../block-overview-tooltip.component.html | 1 + .../src/app/components/block/block.component.ts | 16 +++++++++++++++- .../src/app/interfaces/node-api.interface.ts | 3 ++- .../src/app/interfaces/websocket.interface.ts | 2 +- 11 files changed, 62 insertions(+), 17 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index 6c5f96988..e79196a7a 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -1,19 +1,21 @@ import config from '../config'; import logger from '../logger'; import { TransactionExtended, MempoolBlockWithTransactions } from '../mempool.interfaces'; +import rbfCache from './rbf-cache'; const PROPAGATION_MARGIN = 180; // in seconds, time since a transaction is first seen after which it is assumed to have propagated to all miners class Audit { auditBlock(transactions: TransactionExtended[], projectedBlocks: MempoolBlockWithTransactions[], mempool: { [txId: string]: TransactionExtended }) - : { censored: string[], added: string[], fresh: string[], sigop: string[], score: number, similarity: number } { + : { censored: string[], added: string[], fresh: string[], sigop: string[], fullrbf: string[], score: number, similarity: number } { if (!projectedBlocks?.[0]?.transactionIds || !mempool) { - return { censored: [], added: [], fresh: [], sigop: [], score: 0, similarity: 1 }; + return { censored: [], added: [], fresh: [], sigop: [], fullrbf: [], score: 0, similarity: 1 }; } const matches: string[] = []; // present in both mined block and template const added: string[] = []; // present in mined block, not in template const fresh: string[] = []; // missing, but firstSeen within PROPAGATION_MARGIN + const fullrbf: string[] = []; // either missing or present, and part of a fullrbf replacement const isCensored = {}; // missing, without excuse const isDisplaced = {}; let displacedWeight = 0; @@ -35,7 +37,9 @@ class Audit { for (const txid of projectedBlocks[0].transactionIds) { if (!inBlock[txid]) { // tx is recent, may have reached the miner too late for inclusion - if (mempool[txid]?.firstSeen != null && (now - (mempool[txid]?.firstSeen || 0)) <= PROPAGATION_MARGIN) { + if (rbfCache.isFullRbf(txid)) { + fullrbf.push(txid); + } else if (mempool[txid]?.firstSeen != null && (now - (mempool[txid]?.firstSeen || 0)) <= PROPAGATION_MARGIN) { fresh.push(txid); } else { isCensored[txid] = true; @@ -91,7 +95,9 @@ class Audit { if (inTemplate[tx.txid]) { matches.push(tx.txid); } else { - if (!isDisplaced[tx.txid]) { + if (rbfCache.isFullRbf(tx.txid)) { + fullrbf.push(tx.txid); + } else if (!isDisplaced[tx.txid]) { added.push(tx.txid); } overflowWeight += tx.weight; @@ -138,6 +144,7 @@ class Audit { added, fresh, sigop: [], + fullrbf, score, similarity, }; diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index 22b42dac7..a9266a016 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository'; import { RowDataPacket } from 'mysql2'; class DatabaseMigration { - private static currentVersion = 62; + private static currentVersion = 63; private queryTimeout = 3600_000; private statisticsAddedIndexed = false; private uniqueLogs: string[] = []; @@ -539,6 +539,10 @@ class DatabaseMigration { await this.updateToSchemaVersion(62); } + if (databaseSchemaVersion < 63 && isBitcoin === true) { + await this.$executeQuery('ALTER TABLE `blocks_audits` ADD fullrbf_txs JSON DEFAULT "[]"'); + await this.updateToSchemaVersion(63); + } } /** diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index f0a916c8c..79d5ff2d1 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -169,6 +169,19 @@ class RbfCache { } } + // is the transaction involved in a full rbf replacement? + public isFullRbf(txid: string): boolean { + const treeId = this.treeMap.get(txid); + if (!treeId) { + return false; + } + const tree = this.rbfTrees.get(treeId); + if (!tree) { + return false; + } + return tree?.fullRbf; + } + private cleanup(): void { const now = Date.now(); for (const txid of this.expiring.keys()) { diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 97092d2b1..ae536b72e 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -583,6 +583,10 @@ class WebsocketHandler { const _memPool = memPool.getMempool(); + const rbfTransactions = Common.findMinedRbfTransactions(transactions, memPool.getSpendMap()); + memPool.handleMinedRbfTransactions(rbfTransactions); + memPool.removeFromSpendMap(transactions); + if (config.MEMPOOL.AUDIT) { let projectedBlocks; let auditMempool = _memPool; @@ -605,7 +609,7 @@ class WebsocketHandler { } if (Common.indexingEnabled() && memPool.isInSync()) { - const { censored, added, fresh, sigop, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool); + const { censored, added, fresh, sigop, fullrbf, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool); const matchRate = Math.round(score * 100 * 100) / 100; const stripped = projectedBlocks[0]?.transactions ? projectedBlocks[0].transactions : []; @@ -633,6 +637,7 @@ class WebsocketHandler { missingTxs: censored, freshTxs: fresh, sigopTxs: sigop, + fullrbfTxs: fullrbf, matchRate: matchRate, expectedFees: totalFees, expectedWeight: totalWeight, @@ -652,10 +657,6 @@ class WebsocketHandler { } } - const rbfTransactions = Common.findMinedRbfTransactions(transactions, memPool.getSpendMap()); - memPool.handleMinedRbfTransactions(rbfTransactions); - memPool.removeFromSpendMap(transactions); - // Update mempool to remove transactions included in the new block for (const txId of txIds) { delete _memPool[txId]; diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index cc038ecfd..adcb9645d 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -34,6 +34,7 @@ export interface BlockAudit { missingTxs: string[], freshTxs: string[], sigopTxs: string[], + fullrbfTxs: string[], addedTxs: string[], matchRate: number, expectedFees?: number, diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index 8ad035f32..16a4e733d 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -6,9 +6,9 @@ import { BlockAudit, AuditScore } from '../mempool.interfaces'; class BlocksAuditRepositories { public async $saveAudit(audit: BlockAudit): Promise { try { - await DB.query(`INSERT INTO blocks_audits(time, height, hash, missing_txs, added_txs, fresh_txs, sigop_txs, match_rate, expected_fees, expected_weight) - VALUE (FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [audit.time, audit.height, audit.hash, JSON.stringify(audit.missingTxs), - JSON.stringify(audit.addedTxs), JSON.stringify(audit.freshTxs), JSON.stringify(audit.sigopTxs), audit.matchRate, audit.expectedFees, audit.expectedWeight]); + await DB.query(`INSERT INTO blocks_audits(time, height, hash, missing_txs, added_txs, fresh_txs, sigop_txs, fullrbf_txs, match_rate, expected_fees, expected_weight) + VALUE (FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [audit.time, audit.height, audit.hash, JSON.stringify(audit.missingTxs), + JSON.stringify(audit.addedTxs), JSON.stringify(audit.freshTxs), JSON.stringify(audit.sigopTxs), JSON.stringify(audit.fullrbfTxs), audit.matchRate, audit.expectedFees, audit.expectedWeight]); } catch (e: any) { if (e.errno === 1062) { // ER_DUP_ENTRY - This scenario is possible upon node backend restart logger.debug(`Cannot save block audit for block ${audit.hash} because it has already been indexed, ignoring`); @@ -69,6 +69,7 @@ class BlocksAuditRepositories { added_txs as addedTxs, fresh_txs as freshTxs, sigop_txs as sigopTxs, + fullrbf_txs as fullrbfTxs, match_rate as matchRate, expected_fees as expectedFees, expected_weight as expectedWeight @@ -83,6 +84,7 @@ class BlocksAuditRepositories { rows[0].addedTxs = JSON.parse(rows[0].addedTxs); rows[0].freshTxs = JSON.parse(rows[0].freshTxs); rows[0].sigopTxs = JSON.parse(rows[0].sigopTxs); + rows[0].fullrbfTxs = JSON.parse(rows[0].fullrbfTxs); rows[0].template = JSON.parse(rows[0].template); return rows[0]; diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index bb3d9563c..7d3e0ee13 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -37,7 +37,7 @@ export default class TxView implements TransactionStripped { value: number; feerate: number; rate?: number; - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected' | 'fullrbf'; context?: 'projected' | 'actual'; scene?: BlockScene; @@ -172,6 +172,7 @@ export default class TxView implements TransactionStripped { return auditColors.censored; case 'missing': case 'sigop': + case 'fullrbf': return marginalFeeColors[feeLevelIndex] || marginalFeeColors[mempoolFeeColors.length - 1]; case 'fresh': return auditColors.missing; diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html index 795958fe3..eb6d97e40 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html @@ -48,6 +48,7 @@ + diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 927222dbc..ad008089d 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -317,6 +317,7 @@ export class BlockComponent implements OnInit, OnDestroy { const isSelected = {}; const isFresh = {}; const isSigop = {}; + const isFullRbf = {}; this.numMissing = 0; this.numUnexpected = 0; @@ -339,6 +340,9 @@ export class BlockComponent implements OnInit, OnDestroy { for (const txid of blockAudit.sigopTxs || []) { isSigop[txid] = true; } + for (const txid of blockAudit.fullrbfTxs || []) { + isFullRbf[txid] = true; + } // set transaction statuses for (const tx of blockAudit.template) { tx.context = 'projected'; @@ -347,7 +351,15 @@ export class BlockComponent implements OnInit, OnDestroy { } else if (inBlock[tx.txid]) { tx.status = 'found'; } else { - tx.status = isFresh[tx.txid] ? 'fresh' : (isSigop[tx.txid] ? 'sigop' : 'missing'); + if (isFresh[tx.txid]) { + tx.status = 'fresh'; + } else if (isSigop[tx.txid]) { + tx.status = 'sigop'; + } else if (isFullRbf[tx.txid]) { + tx.status = 'fullrbf'; + } else { + tx.status = 'missing'; + } isMissing[tx.txid] = true; this.numMissing++; } @@ -360,6 +372,8 @@ export class BlockComponent implements OnInit, OnDestroy { tx.status = 'added'; } else if (inTemplate[tx.txid]) { tx.status = 'found'; + } else if (isFullRbf[tx.txid]) { + tx.status = 'fullrbf'; } else { tx.status = 'selected'; isSelected[tx.txid] = true; diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 68c45b3b2..82e1ae50d 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -156,6 +156,7 @@ export interface BlockAudit extends BlockExtended { addedTxs: string[], freshTxs: string[], sigopTxs: string[], + fullrbfTxs: string[], matchRate: number, expectedFees: number, expectedWeight: number, @@ -171,7 +172,7 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected' | 'fullrbf'; context?: 'projected' | 'actual'; } diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 41643fb73..20a114c72 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -77,7 +77,7 @@ export interface TransactionStripped { vsize: number; value: number; rate?: number; // effective fee rate - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected' | 'fullrbf'; context?: 'projected' | 'actual'; } From 385cb087d3f4f98b63fab3b210a7471800eb89a3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 8 Jul 2023 00:33:14 -0400 Subject: [PATCH 538/782] Replace cached blocks on reorg, serve stale blocks --- backend/src/api/bitcoin/bitcoin-api.ts | 1 + .../src/api/bitcoin/esplora-api.interface.ts | 1 + backend/src/api/blocks.ts | 26 +++++++++++++++---- .../repositories/BlocksAuditsRepository.ts | 4 +-- .../src/app/interfaces/electrs.interface.ts | 1 + 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index 307736737..a0cc41770 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -29,6 +29,7 @@ class BitcoinApi implements AbstractBitcoinApi { weight: block.weight, previousblockhash: block.previousblockhash, mediantime: block.mediantime, + stale: block.confirmations === -1, }; } diff --git a/backend/src/api/bitcoin/esplora-api.interface.ts b/backend/src/api/bitcoin/esplora-api.interface.ts index 6d50bddfd..5b86952b0 100644 --- a/backend/src/api/bitcoin/esplora-api.interface.ts +++ b/backend/src/api/bitcoin/esplora-api.interface.ts @@ -89,6 +89,7 @@ export namespace IEsploraApi { weight: number; previousblockhash: string; mediantime: number; + stale: boolean; } export interface Address { diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 16335c36a..4d218ed54 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -656,10 +656,6 @@ class Blocks { const blockSummary: BlockSummary = this.summarizeBlockTransactions(block.id, cpfpSummary.transactions); this.updateTimerProgress(timer, `got block data for ${this.currentBlockHeight}`); - // start async callbacks - this.updateTimerProgress(timer, `starting async callbacks for ${this.currentBlockHeight}`); - const callbackPromises = this.newAsyncBlockCallbacks.map((cb) => cb(blockExtended, txIds, transactions)); - if (Common.indexingEnabled()) { if (!fastForwarded) { const lastBlock = await blocksRepository.$getBlockByHeight(blockExtended.height - 1); @@ -671,9 +667,11 @@ class Blocks { await BlocksRepository.$deleteBlocksFrom(lastBlock.height - 10); await HashratesRepository.$deleteLastEntries(); await cpfpRepository.$deleteClustersFrom(lastBlock.height - 10); + this.blocks = this.blocks.slice(0, -10); this.updateTimerProgress(timer, `rolled back chain divergence from ${this.currentBlockHeight}`); for (let i = 10; i >= 0; --i) { const newBlock = await this.$indexBlock(lastBlock.height - i); + this.blocks.push(newBlock); this.updateTimerProgress(timer, `reindexed block`); let cpfpSummary; if (config.MEMPOOL.CPFP_INDEXING) { @@ -722,6 +720,10 @@ class Blocks { } } + // start async callbacks + this.updateTimerProgress(timer, `starting async callbacks for ${this.currentBlockHeight}`); + const callbackPromises = this.newAsyncBlockCallbacks.map((cb) => cb(blockExtended, txIds, transactions)); + if (block.height % 2016 === 0) { if (Common.indexingEnabled()) { await DifficultyAdjustmentsRepository.$saveAdjustments({ @@ -814,6 +816,16 @@ class Blocks { return blockExtended; } + public async $indexStaleBlock(hash: string): Promise { + const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(hash); + const transactions = await this.$getTransactionsExtended(hash, block.height, true); + const blockExtended = await this.$getBlockExtended(block, transactions); + + blockExtended.canonical = await bitcoinApi.$getBlockHash(block.height); + + return blockExtended; + } + /** * Get one block by its hash */ @@ -831,7 +843,11 @@ class Blocks { // Bitcoin network, add our custom data on top const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(hash); - return await this.$indexBlock(block.height); + if (block.stale) { + return await this.$indexStaleBlock(hash); + } else { + return await this.$indexBlock(block.height); + } } public async $getStrippedBlockTransactions(hash: string, skipMemoryCache = false, diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index 8ad035f32..31107db75 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -62,8 +62,7 @@ class BlocksAuditRepositories { public async $getBlockAudit(hash: string): Promise { try { const [rows]: any[] = await DB.query( - `SELECT blocks.height, blocks.hash as id, UNIX_TIMESTAMP(blocks.blockTimestamp) as timestamp, blocks.size, - blocks.weight, blocks.tx_count, + `SELECT blocks_audits.height, blocks_audits.hash as id, UNIX_TIMESTAMP(blocks_audits.time) as timestamp, template, missing_txs as missingTxs, added_txs as addedTxs, @@ -73,7 +72,6 @@ class BlocksAuditRepositories { expected_fees as expectedFees, expected_weight as expectedWeight FROM blocks_audits - JOIN blocks ON blocks.hash = blocks_audits.hash JOIN blocks_templates ON blocks_templates.id = blocks_audits.hash WHERE blocks_audits.hash = "${hash}" `); diff --git a/frontend/src/app/interfaces/electrs.interface.ts b/frontend/src/app/interfaces/electrs.interface.ts index dcccfb67c..4cb6b41db 100644 --- a/frontend/src/app/interfaces/electrs.interface.ts +++ b/frontend/src/app/interfaces/electrs.interface.ts @@ -120,6 +120,7 @@ export interface Block { size: number; weight: number; previousblockhash: string; + stale?: boolean; } export interface Address { From 6942a6fd6a4b53493d4fc27bf7afb6914fe605f0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 8 Jul 2023 00:34:57 -0400 Subject: [PATCH 539/782] Show alert banner on stale blocks --- backend/src/mempool.interfaces.ts | 1 + .../app/components/block/block.component.html | 6 +++++ .../app/components/block/block.component.scss | 23 +++++++++++++++++++ .../src/app/interfaces/electrs.interface.ts | 1 + 4 files changed, 31 insertions(+) diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index cc038ecfd..27577ad0c 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -227,6 +227,7 @@ export interface BlockExtension { */ export interface BlockExtended extends IEsploraApi.Block { extras: BlockExtension; + canonical?: string; } export interface BlockSummary { diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index aa441ad9a..f77ddeb6f 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -1,6 +1,10 @@
+

Block Genesis @@ -23,6 +27,8 @@
+ +

diff --git a/frontend/src/app/components/block/block.component.scss b/frontend/src/app/components/block/block.component.scss index 08091cb86..a15c876e6 100644 --- a/frontend/src/app/components/block/block.component.scss +++ b/frontend/src/app/components/block/block.component.scss @@ -1,3 +1,26 @@ +.title-block { + flex-wrap: wrap; + align-items: baseline; + @media (min-width: 650px) { + flex-direction: row; + } + h1 { + margin: 0rem; + margin-right: 15px; + line-height: 1; + } + + .alert-mempool { + flex-direction: row; + flex-wrap: wrap; + } + + .container-button { + align-self: center; + margin-right: 1em; + } +} + .qr-wrapper { background-color: #FFF; padding: 10px; diff --git a/frontend/src/app/interfaces/electrs.interface.ts b/frontend/src/app/interfaces/electrs.interface.ts index 4cb6b41db..2739d2b06 100644 --- a/frontend/src/app/interfaces/electrs.interface.ts +++ b/frontend/src/app/interfaces/electrs.interface.ts @@ -121,6 +121,7 @@ export interface Block { weight: number; previousblockhash: string; stale?: boolean; + canonical?: string; } export interface Address { From e81839e7ed549ec806684d1518ee858ffa07ce59 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 09:54:03 +0900 Subject: [PATCH 540/782] Return null for avg of zero matching health scores --- backend/src/repositories/BlocksRepository.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 080de8480..078b85a03 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -401,7 +401,7 @@ class BlocksRepository { /** * Get average block health for all blocks for a single pool */ - public async $getAvgBlockHealthPerPoolId(poolId: number): Promise { + public async $getAvgBlockHealthPerPoolId(poolId: number): Promise { const params: any[] = []; const query = ` SELECT AVG(blocks_audits.match_rate) AS avg_match_rate @@ -413,8 +413,8 @@ class BlocksRepository { try { const [rows] = await DB.query(query, params); - if (!rows[0] || !rows[0].avg_match_rate) { - return 0; + if (!rows[0] || rows[0].avg_match_rate == null) { + return null; } return Math.round(rows[0].avg_match_rate * 100) / 100; } catch (e) { From a45f1fde1cfd23fcb94302c11e60e798b124eed0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 15 Jun 2023 15:15:20 -0400 Subject: [PATCH 541/782] Add fee rate unit preference & dropdown --- .../rate-unit-selector.component.html | 5 +++ .../rate-unit-selector.component.scss | 0 .../rate-unit-selector.component.ts | 45 +++++++++++++++++++ frontend/src/app/services/state.service.ts | 4 ++ .../global-footer.component.html | 3 ++ frontend/src/app/shared/shared.module.ts | 3 ++ 6 files changed, 60 insertions(+) create mode 100644 frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.html create mode 100644 frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.scss create mode 100644 frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.ts diff --git a/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.html b/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.html new file mode 100644 index 000000000..016d1b555 --- /dev/null +++ b/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.html @@ -0,0 +1,5 @@ +
+ +
diff --git a/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.scss b/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.ts b/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.ts new file mode 100644 index 000000000..a7d94cec2 --- /dev/null +++ b/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.ts @@ -0,0 +1,45 @@ +import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; +import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { StorageService } from '../../services/storage.service'; +import { StateService } from '../../services/state.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'app-rate-unit-selector', + templateUrl: './rate-unit-selector.component.html', + styleUrls: ['./rate-unit-selector.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class RateUnitSelectorComponent implements OnInit, OnDestroy { + rateUnitForm: UntypedFormGroup; + rateUnitSub: Subscription; + units = [ + { name: 'vb', label: 'sat/vB' }, + { name: 'wu', label: 'sat/WU' }, + ]; + + constructor( + private formBuilder: UntypedFormBuilder, + private stateService: StateService, + private storageService: StorageService, + ) { } + + ngOnInit() { + this.rateUnitForm = this.formBuilder.group({ + rateUnits: ['vb'] + }); + this.rateUnitSub = this.stateService.rateUnits$.subscribe((units) => { + this.rateUnitForm.get('rateUnits')?.setValue(units); + }); + } + + changeUnits() { + const newUnits = this.rateUnitForm.get('rateUnits')?.value; + this.storageService.setValue('rate-unit-preference', newUnits); + this.stateService.rateUnits$.next(newUnits); + } + + ngOnDestroy(): void { + this.rateUnitSub.unsubscribe(); + } +} diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 738893bbc..0c5f5a5d9 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -133,6 +133,7 @@ export class StateService { hideFlow: BehaviorSubject; hideAudit: BehaviorSubject; fiatCurrency$: BehaviorSubject; + rateUnits$: BehaviorSubject; constructor( @Inject(PLATFORM_ID) private platformId: any, @@ -225,6 +226,9 @@ export class StateService { const fiatPreference = this.storageService.getValue('fiat-preference'); this.fiatCurrency$ = new BehaviorSubject(fiatPreference || 'USD'); + + const rateUnitPreference = this.storageService.getValue('rate-unit-preference'); + this.rateUnits$ = new BehaviorSubject(rateUnitPreference || 'vb'); } setNetworkBasedonUrl(url: string) { diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html index 0bac1f9ff..8e5279a94 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.html +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html @@ -10,6 +10,9 @@
+
+ +

Sign In

diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 542d2f745..9d9606084 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -35,6 +35,7 @@ import { TxFeeRatingComponent } from '../components/tx-fee-rating/tx-fee-rating. import { ReactiveFormsModule } from '@angular/forms'; import { LanguageSelectorComponent } from '../components/language-selector/language-selector.component'; import { FiatSelectorComponent } from '../components/fiat-selector/fiat-selector.component'; +import { RateUnitSelectorComponent } from '../components/rate-unit-selector/rate-unit-selector.component'; import { ColoredPriceDirective } from './directives/colored-price.directive'; import { NoSanitizePipe } from './pipes/no-sanitize.pipe'; import { MempoolBlocksComponent } from '../components/mempool-blocks/mempool-blocks.component'; @@ -106,6 +107,7 @@ import { ClockComponent } from '../components/clock/clock.component'; TxFeeRatingComponent, LanguageSelectorComponent, FiatSelectorComponent, + RateUnitSelectorComponent, ScriptpubkeyTypePipe, RelativeUrlPipe, NoSanitizePipe, @@ -225,6 +227,7 @@ import { ClockComponent } from '../components/clock/clock.component'; TxFeeRatingComponent, LanguageSelectorComponent, FiatSelectorComponent, + RateUnitSelectorComponent, ScriptpubkeyTypePipe, RelativeUrlPipe, Hex2asciiPipe, From c29558db20fcc6eee7db99a48322bc8b79bb8764 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 15 Jun 2023 15:16:49 -0400 Subject: [PATCH 542/782] Add fee rate display component --- .../fee-rate/fee-rate.component.html | 4 +++ .../fee-rate/fee-rate.component.scss | 0 .../components/fee-rate/fee-rate.component.ts | 26 +++++++++++++++++++ .../pipes/fee-rounding/fee-rounding.pipe.ts | 6 ++++- frontend/src/app/shared/shared.module.ts | 3 +++ frontend/src/styles.scss | 2 +- 6 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 frontend/src/app/shared/components/fee-rate/fee-rate.component.html create mode 100644 frontend/src/app/shared/components/fee-rate/fee-rate.component.scss create mode 100644 frontend/src/app/shared/components/fee-rate/fee-rate.component.ts diff --git a/frontend/src/app/shared/components/fee-rate/fee-rate.component.html b/frontend/src/app/shared/components/fee-rate/fee-rate.component.html new file mode 100644 index 000000000..3b6ecc75e --- /dev/null +++ b/frontend/src/app/shared/components/fee-rate/fee-rate.component.html @@ -0,0 +1,4 @@ + + {{ fee / (weight / 4) | feeRounding:rounding }} sat/vB + {{ fee / weight | feeRounding:rounding }} sat/WU + \ No newline at end of file diff --git a/frontend/src/app/shared/components/fee-rate/fee-rate.component.scss b/frontend/src/app/shared/components/fee-rate/fee-rate.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/shared/components/fee-rate/fee-rate.component.ts b/frontend/src/app/shared/components/fee-rate/fee-rate.component.ts new file mode 100644 index 000000000..f48686ad5 --- /dev/null +++ b/frontend/src/app/shared/components/fee-rate/fee-rate.component.ts @@ -0,0 +1,26 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { StateService } from '../../../services/state.service'; + +@Component({ + selector: 'app-fee-rate', + templateUrl: './fee-rate.component.html', + styleUrls: ['./fee-rate.component.scss'] +}) +export class FeeRateComponent implements OnInit { + @Input() fee: number; + @Input() weight: number = 4; + @Input() rounding: string = null; + @Input() showUnit: boolean = true; + @Input() unitClass: string = 'symbol'; + + rateUnits$: Observable; + + constructor( + private stateService: StateService, + ) { } + + ngOnInit() { + this.rateUnits$ = this.stateService.rateUnits$; + } +} diff --git a/frontend/src/app/shared/pipes/fee-rounding/fee-rounding.pipe.ts b/frontend/src/app/shared/pipes/fee-rounding/fee-rounding.pipe.ts index 319698b23..554b0774b 100644 --- a/frontend/src/app/shared/pipes/fee-rounding/fee-rounding.pipe.ts +++ b/frontend/src/app/shared/pipes/fee-rounding/fee-rounding.pipe.ts @@ -9,7 +9,11 @@ export class FeeRoundingPipe implements PipeTransform { @Inject(LOCALE_ID) private locale: string, ) {} - transform(fee: number): string { + transform(fee: number, rounding = null): string { + if (rounding) { + return formatNumber(fee, this.locale, rounding); + } + if (fee >= 100) { return formatNumber(fee, this.locale, '1.0-0') } else if (fee < 10) { diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 9d9606084..d68f1e4e0 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -83,6 +83,7 @@ import { IndexingProgressComponent } from '../components/indexing-progress/index import { SvgImagesComponent } from '../components/svg-images/svg-images.component'; import { ChangeComponent } from '../components/change/change.component'; import { SatsComponent } from './components/sats/sats.component'; +import { FeeRateComponent } from './components/fee-rate/fee-rate.component'; import { TruncateComponent } from './components/truncate/truncate.component'; import { SearchResultsComponent } from '../components/search-form/search-results/search-results.component'; import { TimestampComponent } from './components/timestamp/timestamp.component'; @@ -173,6 +174,7 @@ import { ClockComponent } from '../components/clock/clock.component'; SvgImagesComponent, ChangeComponent, SatsComponent, + FeeRateComponent, TruncateComponent, SearchResultsComponent, TimestampComponent, @@ -287,6 +289,7 @@ import { ClockComponent } from '../components/clock/clock.component'; SvgImagesComponent, ChangeComponent, SatsComponent, + FeeRateComponent, TruncateComponent, SearchResultsComponent, TimestampComponent, diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index aea8e8d6e..e5eb2272b 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -221,7 +221,7 @@ main { } .block-size, .blocks-container { - span { + .symbol { font-size: 16px; color: #fff !important; } From 013ad803d0621674bc0fe6249d645445a6ddcb4d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 15 Jun 2023 15:17:32 -0400 Subject: [PATCH 543/782] Switch all direct sat/vb fields to new rate component --- .../bisq-transaction/bisq-transaction.component.html | 2 +- .../block-overview-tooltip.component.html | 4 ++-- .../app/components/block/block-preview.component.html | 2 +- frontend/src/app/components/block/block.component.html | 4 ++-- .../blockchain-blocks/blockchain-blocks.component.html | 8 ++++---- frontend/src/app/components/clock/clock.component.html | 4 +++- .../app/components/fees-box/fees-box.component.html | 8 ++++---- .../mempool-block/mempool-block.component.html | 8 ++++++-- .../mempool-blocks/mempool-blocks.component.html | 6 ++++-- .../rbf-timeline/rbf-timeline.component.html | 2 +- .../transaction/transaction-preview.component.html | 2 +- .../components/transaction/transaction.component.html | 10 +++++----- .../transactions-list/transactions-list.component.html | 4 ++-- frontend/src/app/dashboard/dashboard.component.html | 4 ++-- .../shared/components/fee-rate/fee-rate.component.html | 4 ++-- .../shared/components/fee-rate/fee-rate.component.ts | 1 + 16 files changed, 41 insertions(+), 32 deletions(-) diff --git a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html index 44f7b840e..4dd1c0a3e 100644 --- a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html +++ b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html @@ -66,7 +66,7 @@
diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html index 795958fe3..636f2c16a 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html @@ -25,13 +25,13 @@ diff --git a/frontend/src/app/components/block/block-preview.component.html b/frontend/src/app/components/block/block-preview.component.html index 29da36373..401f38487 100644 --- a/frontend/src/app/components/block/block-preview.component.html +++ b/frontend/src/app/components/block/block-preview.component.html @@ -34,7 +34,7 @@ - + diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index aa441ad9a..5acabf7d1 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -121,11 +121,11 @@ - + - - + - + diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html index 5f09e0267..9c5c338c0 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html @@ -13,10 +13,12 @@
- ~{{ projectedBlock.medianFee | number:feeRounding }} sat/vB + ~
- {{ projectedBlock.feeRange[0] | number:feeRounding }} - {{ projectedBlock.feeRange[projectedBlock.feeRange.length - 1] | number:feeRounding }} sat/vB + + - +
diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html index e9d531cb8..5af1c7a0b 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html @@ -31,7 +31,7 @@ >
- {{ cell.replacement.tx.fee / (cell.replacement.tx.vsize) | feeRounding }} sat/vB +
diff --git a/frontend/src/app/components/transaction/transaction-preview.component.html b/frontend/src/app/components/transaction/transaction-preview.component.html index e3a49d9b6..679138b14 100644 --- a/frontend/src/app/components/transaction/transaction-preview.component.html +++ b/frontend/src/app/components/transaction/transaction-preview.component.html @@ -33,7 +33,7 @@

- {{ tx.feePerVsize | feeRounding }} sat/vB +

diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 216114cd0..5c2457c02 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -150,7 +150,7 @@
- + @@ -161,7 +161,7 @@ - + @@ -172,7 +172,7 @@ - + @@ -475,7 +475,7 @@ - +
Fee {{ tx.fee | number }} sat
Addresses - + + {{ poolStats.pool.addresses[0] }}
@@ -67,13 +67,13 @@ [attr.aria-expanded]="!gfg" aria-controls="collapseExample"> Show all ({{ poolStats.pool.addresses.length }}) - - {{ poolStats.pool.addresses[0] | shortenString: 40 }} + + {{ poolStats.pool.addresses[0] | shortenString: 30 }}
- {{ - address | shortenString: 40 }}
+ address | shortenString: 30 }}
Hashrate (24h) - - - + + + - - - - - + + +
EstimatedReportedLuckRewardHashrate (24h)Avg Health
{{ poolStats.estimatedHashrate | amountShortener : 1 : 'H/s' }}{{ poolStats.reportedHashrate | amountShortener : 1 : 'H/s' }}{{ formatNumber(poolStats.luck, this.locale, '1.2-2') }}%{{ poolStats.estimatedHashrate | amountShortener : 1 : 'H/s' }}{{ poolStats.avgBlockHealth }}% + + Unknown + +
- Hashrate (24h) - - - + + + - - - - - + + +
EstimatedReportedLuckRewardHashrate (24h)Avg Health
{{ poolStats.estimatedHashrate | amountShortener : 1 : 'H/s' }}{{ poolStats.reportedHashrate | amountShortener : 1 : 'H/s' }}{{ formatNumber(poolStats.luck, this.locale, '1.2-2') }}%{{ poolStats.estimatedHashrate | amountShortener : 1 : 'H/s' }}{{ poolStats.avgBlockHealth }}% + + Unknown + +
~~
Mined blocks - - - + + + - - -
24h1wAllBlocks 24h1wAll
{{ formatNumber(poolStats.blockCount['24h'], this.locale, '1.0-0') }} ({{ formatNumber(100 * + {{ formatNumber(poolStats.blockCount['24h'], this.locale, '1.0-0') }} ({{ formatNumber(100 * poolStats.blockShare['24h'], this.locale, '1.0-0') }}%){{ formatNumber(poolStats.blockCount['1w'], this.locale, '1.0-0') }} ({{ formatNumber(100 * + {{ formatNumber(poolStats.blockCount['1w'], this.locale, '1.0-0') }} ({{ formatNumber(100 * poolStats.blockShare['1w'], this.locale, '1.0-0') }}%){{ formatNumber(poolStats.blockCount['all'], this.locale, '1.0-0') }} ({{ formatNumber(100 * + {{ formatNumber(poolStats.blockCount['all'], this.locale, '1.0-0') }} ({{ formatNumber(100 * poolStats.blockShare['all'], this.locale, '1.0-0') }}%)
@@ -162,21 +162,20 @@
- Mined blocks - - - + + + - - -
24h1wAllBlocks 24h1wAll
{{ formatNumber(poolStats.blockCount['24h'], this.locale, '1.0-0') }} ({{ formatNumber(100 * + {{ formatNumber(poolStats.blockCount['24h'], this.locale, '1.0-0') }} ({{ formatNumber(100 * poolStats.blockShare['24h'], this.locale, '1.0-0') }}%){{ formatNumber(poolStats.blockCount['1w'], this.locale, '1.0-0') }} ({{ formatNumber(100 * + {{ formatNumber(poolStats.blockCount['1w'], this.locale, '1.0-0') }} ({{ formatNumber(100 * poolStats.blockShare['1w'], this.locale, '1.0-0') }}%){{ formatNumber(poolStats.blockCount['all'], this.locale, '1.0-0') }} ({{ formatNumber(100 * + {{ formatNumber(poolStats.blockCount['all'], this.locale, '1.0-0') }} ({{ formatNumber(100 * poolStats.blockShare['all'], this.locale, '1.0-0') }}%)
@@ -213,8 +212,9 @@
Timestamp Mined Coinbase tagHealth RewardFeesFees TXs Size + {{ block.extras.matchRate }}% + + Unknown + + + diff --git a/frontend/src/app/components/pool/pool.component.scss b/frontend/src/app/components/pool/pool.component.scss index 9103f38f5..21468773f 100644 --- a/frontend/src/app/components/pool/pool.component.scss +++ b/frontend/src/app/components/pool/pool.component.scss @@ -68,6 +68,11 @@ div.scrollable { vertical-align: top; padding-top: 25px; } +.addresses-data { + vertical-align: top; + font-family: monospace; + font-size: 14px; +} .data { text-align: right; @@ -100,7 +105,7 @@ div.scrollable { @media (max-width: 875px) { padding-left: 50px; } - @media (max-width: 650px) { + @media (max-width: 685px) { display: none; } } @@ -118,7 +123,7 @@ div.scrollable { padding-right: 10px; } @media (max-width: 875px) { - padding-right: 50px; + padding-right: 20px; } @media (max-width: 567px) { padding-right: 10px; @@ -186,10 +191,6 @@ div.scrollable { .block-count-title { color: #4a68b9; font-size: 14px; - text-align: left; - @media (max-width: 767.98px) { - text-align: center; - } } .table-data tr { diff --git a/frontend/src/app/components/pool/pool.component.ts b/frontend/src/app/components/pool/pool.component.ts index 56b8bd392..85fd028ef 100644 --- a/frontend/src/app/components/pool/pool.component.ts +++ b/frontend/src/app/components/pool/pool.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { EChartsOption, graphic } from 'echarts'; -import { BehaviorSubject, Observable, timer } from 'rxjs'; +import { BehaviorSubject, Observable } from 'rxjs'; import { distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators'; import { BlockExtended, PoolStat } from '../../interfaces/node-api.interface'; import { ApiService } from '../../services/api.service'; @@ -35,6 +35,8 @@ export class PoolComponent implements OnInit { blocks: BlockExtended[] = []; slug: string = undefined; + auditAvailable = false; + loadMoreSubject: BehaviorSubject = new BehaviorSubject(this.blocks[this.blocks.length - 1]?.height); constructor( @@ -44,6 +46,7 @@ export class PoolComponent implements OnInit { public stateService: StateService, private seoService: SeoService, ) { + this.auditAvailable = this.stateService.env.AUDIT; } ngOnInit(): void { @@ -74,11 +77,6 @@ export class PoolComponent implements OnInit { regexes += regex + '", "'; } poolStats.pool.regexes = regexes.slice(0, -3); - poolStats.pool.addresses = poolStats.pool.addresses; - - if (poolStats.reportedHashrate) { - poolStats.luck = poolStats.estimatedHashrate / poolStats.reportedHashrate * 100; - } return Object.assign({ logo: `/resources/mining-pools/` + poolStats.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg' diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index cad623f9f..8d8f30863 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -107,8 +107,8 @@ export interface PoolStat { '1w': number, }; estimatedHashrate: number; - reportedHashrate: number; - luck?: number; + avgBlockHealth: number; + totalReward: number; } export interface BlockExtension { From 4a64c0dfa509078409e828dafab000cf4462382f Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 16 Mar 2023 16:35:59 +0900 Subject: [PATCH 080/782] Fix skeleton --- .../app/components/pool/pool.component.html | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/frontend/src/app/components/pool/pool.component.html b/frontend/src/app/components/pool/pool.component.html index d7c791db9..aa54b70f5 100644 --- a/frontend/src/app/components/pool/pool.component.html +++ b/frontend/src/app/components/pool/pool.component.html @@ -37,7 +37,7 @@
Addresses + {{ poolStats.pool.addresses[0] }} @@ -378,24 +378,23 @@
Hashrate (24h) - - - + + + - - - @@ -405,23 +404,22 @@ - + + @@ -121,7 +122,15 @@ Unknown - + + diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.scss b/frontend/src/app/components/pool-ranking/pool-ranking.component.scss index fc58909f8..b82264503 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.scss +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.scss @@ -110,4 +110,15 @@ .disabled { pointer-events: none; opacity: 0.5; -} \ No newline at end of file +} + +td { + .difference { + &.positive { + color: rgb(66, 183, 71); + } + &.negative { + color: rgb(183, 66, 66); + } + } +} diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 648eb38ea..68c45b3b2 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -91,6 +91,7 @@ export interface SinglePoolStats { logo: string; slug: string; avgMatchRate: number; + avgFeeDelta: number; } export interface PoolsStats { blockCount: number; From 390c4a77061130dc2c7e6541f609027537e20b46 Mon Sep 17 00:00:00 2001 From: junderw Date: Tue, 4 Jul 2023 17:19:41 -0700 Subject: [PATCH 527/782] Use ManuallyDrop --- backend/rust-gbt/src/gbt.rs | 20 ++++++++++---------- backend/rust-gbt/src/lib.rs | 34 +++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 876bd12ef..696342e7f 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -1,15 +1,10 @@ use priority_queue::PriorityQueue; -use std::{ - cmp::Ordering, - collections::{HashSet}, -}; +use std::{cmp::Ordering, collections::HashSet, mem::ManuallyDrop}; use tracing::{info, trace}; use crate::{ audit_transaction::{partial_cmp_uid_score, AuditTransaction}, - u32_hasher_types::{ - u32hashset_new, u32priority_queue_with_capacity, U32HasherState, - }, + u32_hasher_types::{u32hashset_new, u32priority_queue_with_capacity, U32HasherState}, GbtResult, ThreadTransactionsMap, }; @@ -19,7 +14,7 @@ const BLOCK_RESERVED_WEIGHT: u32 = 4_000; const BLOCK_RESERVED_SIGOPS: u32 = 400; const MAX_BLOCKS: usize = 8; -type AuditPool = Vec>; +type AuditPool = Vec>>; type ModifiedQueue = PriorityQueue; #[derive(Debug)] @@ -70,7 +65,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap, max_uid: usize) -> GbtResult { for (uid, tx) in &mut *mempool { let audit_tx = AuditTransaction::from_thread_transaction(tx); // Safety: audit_pool and mempool_stack must always contain the same transactions - audit_pool[*uid as usize] = Some(audit_tx); + audit_pool[*uid as usize] = Some(ManuallyDrop::new(audit_tx)); mempool_stack.push(*uid); } @@ -240,12 +235,17 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap, max_uid: usize) -> GbtResult { info!("make a list of dirty transactions and their new rates"); let mut rates: Vec> = Vec::new(); for (uid, thread_tx) in mempool { - if let Some(Some(audit_tx)) = audit_pool.get(*uid as usize) { + // Takes ownership of the audit_tx and replaces with None + if let Some(Some(audit_tx)) = audit_pool.get_mut(*uid as usize).map(Option::take) { trace!("txid: {}, is_dirty: {}", uid, audit_tx.dirty); if audit_tx.dirty { rates.push(vec![f64::from(*uid), audit_tx.effective_fee_per_vsize]); thread_tx.effective_fee_per_vsize = audit_tx.effective_fee_per_vsize; } + // Drops the AuditTransaction manually + // There are no audit_txs that are not in the mempool HashMap + // So there is guaranteed to be no memory leaks. + ManuallyDrop::into_inner(audit_tx); } } trace!("\n\n\n\n\n===================="); diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 21b333441..516a26402 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -76,11 +76,15 @@ impl GbtGenerator { #[napi] pub async fn make(&self, mempool: Vec, max_uid: u32) -> Result { trace!("make: Current State {:#?}", self.thread_transactions); - run_task(Arc::clone(&self.thread_transactions), max_uid as usize, move |map| { - for tx in mempool { - map.insert(tx.uid, tx); - } - }) + run_task( + Arc::clone(&self.thread_transactions), + max_uid as usize, + move |map| { + for tx in mempool { + map.insert(tx.uid, tx); + } + }, + ) .await } @@ -95,14 +99,18 @@ impl GbtGenerator { max_uid: u32, ) -> Result { trace!("update: Current State {:#?}", self.thread_transactions); - run_task(Arc::clone(&self.thread_transactions), max_uid as usize, move |map| { - for tx in new_txs { - map.insert(tx.uid, tx); - } - for txid in &remove_txs { - map.remove(txid); - } - }) + run_task( + Arc::clone(&self.thread_transactions), + max_uid as usize, + move |map| { + for tx in new_txs { + map.insert(tx.uid, tx); + } + for txid in &remove_txs { + map.remove(txid); + } + }, + ) .await } } From 824c6f97e499911408394e40f1578fecfb5adabf Mon Sep 17 00:00:00 2001 From: wiz Date: Wed, 5 Jul 2023 09:32:39 +0900 Subject: [PATCH 528/782] ops: Use mempool/electrs for liquid instances --- production/install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/production/install b/production/install index 8f3491591..5ee445a21 100755 --- a/production/install +++ b/production/install @@ -361,10 +361,10 @@ BITCOIN_ELECTRS_REPO_NAME=electrs BITCOIN_ELECTRS_REPO_BRANCH=mempool BITCOIN_ELECTRS_LATEST_RELEASE=mempool -ELEMENTS_ELECTRS_REPO_URL=https://github.com/blockstream/electrs +ELEMENTS_ELECTRS_REPO_URL=https://github.com/mempool/electrs ELEMENTS_ELECTRS_REPO_NAME=electrs -ELEMENTS_ELECTRS_REPO_BRANCH=new-index -ELEMENTS_ELECTRS_LATEST_RELEASE=new-index +ELEMENTS_ELECTRS_REPO_BRANCH=mempool +ELEMENTS_ELECTRS_LATEST_RELEASE=mempool LIQUID_ASSET_REGISTRY_DB_URL=https://github.com/blockstream/asset_registry_db LIQUID_ASSET_REGISTRY_DB_NAME=asset_registry_db From 850752e0eafce78eb883cb41e0580eaacafcbe6e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 29 Jun 2023 10:06:03 -0400 Subject: [PATCH 529/782] More precise relative block times --- .../blockchain-blocks/blockchain-blocks.component.html | 2 +- .../components/mempool-blocks/mempool-blocks.component.html | 4 ++-- frontend/src/app/components/time/time.component.ts | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html index 0c22cf391..f630ab3c5 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -53,7 +53,7 @@ {{ i }} transactions
-
+
diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html index 2b4dd470e..5f09e0267 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html @@ -29,10 +29,10 @@
- + - +
diff --git a/frontend/src/app/components/time/time.component.ts b/frontend/src/app/components/time/time.component.ts index f2b220d39..2febf6238 100644 --- a/frontend/src/app/components/time/time.component.ts +++ b/frontend/src/app/components/time/time.component.ts @@ -29,6 +29,7 @@ export class TimeComponent implements OnInit, OnChanges, OnDestroy { @Input() fixedRender = false; @Input() relative = false; @Input() precision: number = 0; + @Input() minUnit: 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' = 'second'; @Input() fractionDigits: number = 0; constructor( @@ -96,10 +97,13 @@ export class TimeComponent implements OnInit, OnChanges, OnDestroy { for (const [index, unit] of this.units.entries()) { let precisionUnit = this.units[Math.min(this.units.length - 1, index + this.precision)]; counter = Math.floor(seconds / this.intervals[unit]); - const precisionCounter = Math.floor(seconds / this.intervals[precisionUnit]); + const precisionCounter = Math.round(seconds / this.intervals[precisionUnit]); if (precisionCounter > this.precisionThresholds[precisionUnit]) { precisionUnit = unit; } + if (this.units.indexOf(precisionUnit) === this.units.indexOf(this.minUnit)) { + counter = Math.max(1, counter); + } if (counter > 0) { let rounded = Math.round(seconds / this.intervals[precisionUnit]); if (this.fractionDigits) { From cc695dc910c2eec883378d52b4e0bddfda9bb51e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 5 Jul 2023 11:02:32 -0400 Subject: [PATCH 530/782] match higher precision time in block page details --- frontend/src/app/components/block/block.component.html | 2 +- .../app/shared/components/timestamp/timestamp.component.html | 2 +- .../src/app/shared/components/timestamp/timestamp.component.ts | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 00cb2fcb1..aa441ad9a 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -41,7 +41,7 @@
diff --git a/frontend/src/app/shared/components/timestamp/timestamp.component.html b/frontend/src/app/shared/components/timestamp/timestamp.component.html index f84c60b78..7b77cb1a3 100644 --- a/frontend/src/app/shared/components/timestamp/timestamp.component.html +++ b/frontend/src/app/shared/components/timestamp/timestamp.component.html @@ -2,6 +2,6 @@ ‎{{ seconds * 1000 | date: customFormat ?? 'yyyy-MM-dd HH:mm' }}
- () + ()
diff --git a/frontend/src/app/shared/components/timestamp/timestamp.component.ts b/frontend/src/app/shared/components/timestamp/timestamp.component.ts index e3b96c376..aace6efbf 100644 --- a/frontend/src/app/shared/components/timestamp/timestamp.component.ts +++ b/frontend/src/app/shared/components/timestamp/timestamp.component.ts @@ -11,6 +11,8 @@ export class TimestampComponent implements OnChanges { @Input() dateString: string; @Input() customFormat: string; @Input() hideTimeSince: boolean = false; + @Input() precision: number = 0; + @Input() minUnit: 'year' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' = 'second'; seconds: number | undefined = undefined; From 22d357c53c1816e8bb0995a0fd13a5b44730be8b Mon Sep 17 00:00:00 2001 From: junderw Date: Wed, 5 Jul 2023 08:39:01 -0700 Subject: [PATCH 531/782] Faster txid to u32 parsing --- backend/src/__tests__/gbt/gbt-tests.ts | 12 ++++++------ backend/src/api/transaction-utils.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/backend/src/__tests__/gbt/gbt-tests.ts b/backend/src/__tests__/gbt/gbt-tests.ts index 8af76a47c..0651faac4 100644 --- a/backend/src/__tests__/gbt/gbt-tests.ts +++ b/backend/src/__tests__/gbt/gbt-tests.ts @@ -58,11 +58,11 @@ function mempoolFromArrayBuffer(buf: ArrayBuffer): { mempool: ThreadTransaction[ } function txidToOrdering(txid: string): number { - return ( - ((parseInt(txid.substring(62, 64), 16) << 24) | - (parseInt(txid.substring(60, 62), 16) << 16) | - (parseInt(txid.substring(58, 60), 16) << 8) | - parseInt(txid.substring(56, 58), 16)) >>> - 0 + return parseInt( + txid.substr(62, 2) + + txid.substr(60, 2) + + txid.substr(58, 2) + + txid.substr(56, 2), + 16 ); } diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 92f5b71c5..8bebc42d8 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -158,12 +158,12 @@ class TransactionUtils { // returns the most significant 4 bytes of the txid as an integer public txidToOrdering(txid: string): number { - return ( - ((parseInt(txid.substring(62, 64), 16) << 24) | - (parseInt(txid.substring(60, 62), 16) << 16) | - (parseInt(txid.substring(58, 60), 16) << 8) | - parseInt(txid.substring(56, 58), 16)) >>> - 0 + return parseInt( + txid.substr(62, 2) + + txid.substr(60, 2) + + txid.substr(58, 2) + + txid.substr(56, 2), + 16 ); } } From 464587cec500d2894fb8229fcd12e40f6fb01f6e Mon Sep 17 00:00:00 2001 From: Jonathan Underwood Date: Wed, 5 Jul 2023 19:35:36 -0700 Subject: [PATCH 532/782] Add period --- backend/rust-gbt/src/gbt.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 696342e7f..09b6377e6 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -43,7 +43,7 @@ impl Ord for TxPriority { } } -/// Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core +/// Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core. /// /// See `BlockAssembler` in Bitcoin Core's /// [miner.cpp](https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp). From eae5f6078efe9bdd4d62a820934ae5c732356112 Mon Sep 17 00:00:00 2001 From: junderw Date: Thu, 6 Jul 2023 15:49:54 -0700 Subject: [PATCH 533/782] Move N-API CLI to dependencies --- backend/rust-gbt/package-lock.json | 3 +-- backend/rust-gbt/package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/rust-gbt/package-lock.json b/backend/rust-gbt/package-lock.json index 5e23e425e..e20a6f5bf 100644 --- a/backend/rust-gbt/package-lock.json +++ b/backend/rust-gbt/package-lock.json @@ -8,7 +8,7 @@ "name": "gbt", "version": "0.1.0", "hasInstallScript": true, - "devDependencies": { + "dependencies": { "@napi-rs/cli": "^2.16.1" }, "engines": { @@ -19,7 +19,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.16.1.tgz", "integrity": "sha512-L0Gr5iEQIDEbvWdDr1HUaBOxBSHL1VZhWSk1oryawoT8qJIY+KGfLFelU+Qma64ivCPbxYpkfPoKYVG3rcoGIA==", - "dev": true, "bin": { "napi": "scripts/index.js" }, diff --git a/backend/rust-gbt/package.json b/backend/rust-gbt/package.json index 57f91e781..e65fb2209 100644 --- a/backend/rust-gbt/package.json +++ b/backend/rust-gbt/package.json @@ -24,7 +24,7 @@ ] } }, - "devDependencies": { + "dependencies": { "@napi-rs/cli": "^2.16.1" }, "engines": { From 925ebf08d4aa9144c7f9281c1b2ecd0723d1b95a Mon Sep 17 00:00:00 2001 From: junderw Date: Thu, 6 Jul 2023 18:05:21 -0700 Subject: [PATCH 534/782] Fix Docker build for using napi-rs --- backend/README.md | 2 ++ backend/package.json | 4 ++-- backend/rust-gbt/README.md | 2 ++ docker/backend/Dockerfile | 7 ++++++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/backend/README.md b/backend/README.md index 256dcaa43..ddea54422 100644 --- a/backend/README.md +++ b/backend/README.md @@ -79,6 +79,8 @@ Query OK, 0 rows affected (0.00 sec) _Make sure to use Node.js 16.10 and npm 7._ +_The build process requires [Rust](https://www.rust-lang.org/tools/install) to be installed._ + Install dependencies with `npm` and build the backend: ``` diff --git a/backend/package.json b/backend/package.json index baed8be97..bc4771ebb 100644 --- a/backend/package.json +++ b/backend/package.json @@ -24,8 +24,8 @@ "tsc": "./node_modules/typescript/bin/tsc -p tsconfig.build.json", "build": "npm run build-rust && npm run tsc && npm run create-resources", "create-resources": "cp ./src/tasks/price-feeds/mtgox-weekly.json ./dist/tasks && node dist/api/fetch-version.js", - "package": "npm run build && rm -rf package && mv dist package && mv node_modules package && npm run package-rm-build-deps", - "package-rm-build-deps": "(cd package/node_modules; rm -r typescript @typescript-eslint)", + "package": "npm run build && rm -rf package && mv dist package && mv node_modules package && mv rust-gbt package && npm run package-rm-build-deps", + "package-rm-build-deps": "(cd package/node_modules; rm -r typescript @typescript-eslint @napi-rs ../rust-gbt/target ../rust-gbt/node_modules ../rust-gbt/src)", "start": "node --max-old-space-size=2048 dist/index.js", "start-production": "node --max-old-space-size=16384 dist/index.js", "reindex-updated-pools": "npm run start-production --update-pools", diff --git a/backend/rust-gbt/README.md b/backend/rust-gbt/README.md index c48b4a11f..c6b3cc21f 100644 --- a/backend/rust-gbt/README.md +++ b/backend/rust-gbt/README.md @@ -8,6 +8,8 @@ This project was bootstrapped by [napi](https://www.npmjs.com/package/@napi-rs/c Installing gbt requires a [supported version of Node and Rust](https://github.com/napi-rs/napi-rs#platform-support). +The build process also requires [Rust](https://www.rust-lang.org/tools/install) to be installed. + You can install the project with npm. In the project directory, run: ```sh diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index fd5044c0f..386e0d59d 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -7,7 +7,12 @@ WORKDIR /build COPY . . RUN apt-get update -RUN apt-get install -y build-essential python3 pkg-config +RUN apt-get install -y build-essential python3 pkg-config curl + +# Install Rust via rustup +RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable +ENV PATH="/root/.cargo/bin:$PATH" + RUN npm install --omit=dev --omit=optional RUN npm run package From ec918d57b22b9459e63d0cfeab7d21f7e05d34ec Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 8 Jul 2023 23:02:46 -0700 Subject: [PATCH 535/782] Fix backend docker build for armv7 --- backend/.dockerignore | 1 + docker/backend/Dockerfile | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 backend/.dockerignore diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 000000000..94143827e --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1 @@ +Dockerfile diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index 386e0d59d..bbe4df3d2 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -7,9 +7,10 @@ WORKDIR /build COPY . . RUN apt-get update -RUN apt-get install -y build-essential python3 pkg-config curl +RUN apt-get install -y build-essential python3 pkg-config curl ca-certificates # Install Rust via rustup +RUN CPU_ARCH=$(uname -m); if [ "$CPU_ARCH" = "armv7l" ]; then c_rehash; fi RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable ENV PATH="/root/.cargo/bin:$PATH" From 4ba552fe1b36e05576263039347c58f4e6c594e8 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 9 Jul 2023 01:15:05 -0400 Subject: [PATCH 536/782] Add basic lightning justice page --- backend/src/api/explorer/channels.api.ts | 19 +++++ backend/src/api/explorer/channels.routes.ts | 13 +++ .../transactions-list.component.html | 2 +- .../src/app/interfaces/node-api.interface.ts | 1 + .../justice-list/justice-list.component.html | 79 +++++++++++++++++++ .../justice-list/justice-list.component.scss | 52 ++++++++++++ .../justice-list/justice-list.component.ts | 60 ++++++++++++++ .../app/lightning/lightning-api.service.ts | 8 +- .../src/app/lightning/lightning.module.ts | 3 + .../app/lightning/lightning.routing.module.ts | 5 ++ .../truncate/truncate.component.html | 2 +- .../truncate/truncate.component.scss | 4 + .../components/truncate/truncate.component.ts | 2 + 13 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 frontend/src/app/lightning/justice-list/justice-list.component.html create mode 100644 frontend/src/app/lightning/justice-list/justice-list.component.scss create mode 100644 frontend/src/app/lightning/justice-list/justice-list.component.ts diff --git a/backend/src/api/explorer/channels.api.ts b/backend/src/api/explorer/channels.api.ts index 00d146770..67d775ea3 100644 --- a/backend/src/api/explorer/channels.api.ts +++ b/backend/src/api/explorer/channels.api.ts @@ -117,6 +117,25 @@ class ChannelsApi { } } + public async $getPenaltyClosedChannels(): Promise { + try { + const query = ` + SELECT n1.alias AS alias_left, + n2.alias AS alias_right, + channels.* + FROM channels + LEFT JOIN nodes AS n1 ON n1.public_key = channels.node1_public_key + LEFT JOIN nodes AS n2 ON n2.public_key = channels.node2_public_key + WHERE channels.status = 2 AND channels.closing_reason = 3 + `; + const [rows]: any = await DB.query(query); + return rows; + } catch (e) { + logger.err('$getPenaltyClosedChannels error: ' + (e instanceof Error ? e.message : e)); + throw e; + } + } + public async $getUnresolvedClosedChannels(): Promise { try { const query = `SELECT * FROM channels WHERE status = 2 AND closing_reason = 2 AND closing_resolved = 0 AND closing_transaction_id != ''`; diff --git a/backend/src/api/explorer/channels.routes.ts b/backend/src/api/explorer/channels.routes.ts index 2b7f3fa6d..f28ab2a9d 100644 --- a/backend/src/api/explorer/channels.routes.ts +++ b/backend/src/api/explorer/channels.routes.ts @@ -11,6 +11,7 @@ class ChannelsRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'lightning/channels/search/:search', this.$searchChannelsById) .get(config.MEMPOOL.API_URL_PREFIX + 'lightning/channels/:short_id', this.$getChannel) .get(config.MEMPOOL.API_URL_PREFIX + 'lightning/channels', this.$getChannelsForNode) + .get(config.MEMPOOL.API_URL_PREFIX + 'lightning/penalties', this.$getPenaltyClosedChannels) .get(config.MEMPOOL.API_URL_PREFIX + 'lightning/channels-geo', this.$getAllChannelsGeo) .get(config.MEMPOOL.API_URL_PREFIX + 'lightning/channels-geo/:publicKey', this.$getAllChannelsGeo) ; @@ -108,6 +109,18 @@ class ChannelsRoutes { } } + private async $getPenaltyClosedChannels(req: Request, res: Response): Promise { + try { + const channels = await channelsApi.$getPenaltyClosedChannels(); + res.header('Pragma', 'public'); + res.header('Cache-control', 'public'); + res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString()); + res.json(channels); + } catch (e) { + res.status(500).send(e instanceof Error ? e.message : e); + } + } + private async $getAllChannelsGeo(req: Request, res: Response) { try { const style: string = typeof req.query.style === 'string' ? req.query.style : ''; diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index c509a799d..d01453aee 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -73,7 +73,7 @@ {{ vin.prevout.scriptpubkey_type?.toUpperCase() }}
- +
diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 68c45b3b2..df4b5de8e 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -266,6 +266,7 @@ export interface IChannel { closing_transaction_id: string; closing_reason: string; updated_at: string; + closing_date?: string; created: string; status: number; node_left: INode, diff --git a/frontend/src/app/lightning/justice-list/justice-list.component.html b/frontend/src/app/lightning/justice-list/justice-list.component.html new file mode 100644 index 000000000..071c6f7f4 --- /dev/null +++ b/frontend/src/app/lightning/justice-list/justice-list.component.html @@ -0,0 +1,79 @@ + + +
+

Penalties

+ +
+ +
+
EstimatedReportedLuckRewardHashrate (24h)Avg Health
+
+
+
- Hashrate (24h) - - - + + + - - - @@ -431,24 +429,23 @@ -
EstimatedReportedLuckRewardHashrate (24h)Avg Health
+
+
+
Mined blocks - - - + + + - - - @@ -458,23 +455,22 @@ diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 671fd9d5b..be0e1318c 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -388,7 +388,11 @@ export class BlockComponent implements OnInit, OnDestroy { for (const tx of blockAudit.transactions) { inBlock[tx.txid] = true; } - blockAudit.feeDelta = (blockAudit.expectedFees - this.block.extras.totalFees) / blockAudit.expectedFees; + + blockAudit.feeDelta = blockAudit.expectedFees > 0 ? (blockAudit.expectedFees - this.block.extras.totalFees) / blockAudit.expectedFees : 0; + blockAudit.weightDelta = blockAudit.expectedWeight > 0 ? (blockAudit.expectedWeight - this.block.weight) / blockAudit.expectedWeight : 0; + blockAudit.txDelta = blockAudit.template.length > 0 ? (blockAudit.template.length - this.block.tx_count) / blockAudit.template.length : 0; + this.setAuditAvailable(true); } else { this.setAuditAvailable(false); diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 5aaeda545..cf1ae1fc0 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -153,6 +153,8 @@ export interface BlockAudit extends BlockExtended { expectedFees: number, expectedWeight: number, feeDelta?: number, + weightDelta?: number, + txDelta?: number, template: TransactionStripped[], transactions: TransactionStripped[], } From 93d24d1cf7fa1f7e37b766c7983b196e8656a5f0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 10 Jun 2023 12:09:06 -0400 Subject: [PATCH 413/782] Add expected fee % diff to blocks list page --- backend/src/api/blocks.ts | 2 ++ backend/src/api/websocket-handler.ts | 1 + backend/src/repositories/BlocksRepository.ts | 1 + .../blocks-list/blocks-list.component.html | 15 ++++------ .../blocks-list/blocks-list.component.scss | 28 ++++++++++++++++--- .../blocks-list/blocks-list.component.ts | 9 +++++- .../src/app/interfaces/node-api.interface.ts | 2 ++ 7 files changed, 44 insertions(+), 14 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 116a99340..e080285ed 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -283,11 +283,13 @@ class Blocks { extras.matchRate = null; extras.expectedFees = null; + extras.expectedWeight = null; if (config.MEMPOOL.AUDIT) { const auditScore = await BlocksAuditsRepository.$getBlockAuditScore(block.id); if (auditScore != null) { extras.matchRate = auditScore.matchRate; extras.expectedFees = auditScore.expectedFees; + extras.expectedWeight = auditScore.expectedWeight; } } } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index b2c529220..8aaab5ab5 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -602,6 +602,7 @@ class WebsocketHandler { if (block.extras) { block.extras.matchRate = matchRate; block.extras.expectedFees = totalFees; + block.extras.expectedWeight = totalWeight; block.extras.similarity = similarity; } } diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 9b07e6f03..2689e19b3 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -1033,6 +1033,7 @@ class BlocksRepository { // Match rate is not part of the blocks table, but it is part of APIs so we must include it extras.matchRate = null; extras.expectedFees = null; + extras.expectedWeight = null; if (config.MEMPOOL.AUDIT) { const auditScore = await BlocksAuditsRepository.$getBlockAuditScore(dbBlk.id); if (auditScore != null) { diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.html b/frontend/src/app/components/blocks-list/blocks-list.component.html index 6748da448..727ca2782 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.html +++ b/frontend/src/app/components/blocks-list/blocks-list.component.html @@ -13,14 +13,12 @@ - - + @@ -44,9 +42,6 @@ - - + diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.scss b/frontend/src/app/components/blocks-list/blocks-list.component.scss index ea6e93347..39d6b55b0 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.scss +++ b/frontend/src/app/components/blocks-list/blocks-list.component.scss @@ -23,6 +23,17 @@ tr, td, th { border: 0px; padding-top: 0.65rem !important; padding-bottom: 0.7rem !important; + + .difference { + margin-left: 0.5em; + + &.positive { + color: rgb(66, 183, 71); + } + &.negative { + color: rgb(183, 66, 66); + } + } } .clear-link { @@ -90,7 +101,7 @@ tr, td, th { } .timestamp { - width: 18%; + width: 10%; @media (max-width: 1100px) { display: none; } @@ -123,8 +134,8 @@ tr, td, th { } .txs { - padding-right: 40px; - width: 8%; + padding-right: 20px; + width: 6%; @media (max-width: 1100px) { padding-right: 10px; } @@ -160,6 +171,15 @@ tr, td, th { .fees.widget { width: 20%; } +.fee-delta { + width: 6%; + @media (max-width: 991px) { + display: none; + } +} +.fee-delta.widget { + display: none; +} .reward { width: 8%; @@ -214,7 +234,7 @@ tr, td, th { .health { width: 10%; - @media (max-width: 1105px) { + @media (max-width: 1100px) { width: 13%; } @media (max-width: 560px) { diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 0086ff902..9ec09bfa9 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -112,7 +112,14 @@ export class BlocksList implements OnInit, OnDestroy { acc = acc.slice(0, this.widget ? 6 : 15); } return acc; - }, []) + }, []), + switchMap((blocks) => { + console.log(blocks); + blocks.forEach(block => { + block.extras.feeDelta = block.extras.expectedFees ? (block.extras.totalFees - block.extras.expectedFees) / block.extras.expectedFees : 0; + }); + return of(blocks); + }) ); if (this.indexingAvailable && this.auditAvailable) { diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index cf1ae1fc0..2e58c79e4 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -134,6 +134,8 @@ export interface BlockExtension { coinbaseRaw?: string; matchRate?: number; expectedFees?: number; + expectedWeight?: number; + feeDelta?: number; similarity?: number; pool?: { id: number; From ce950d63cb4fcb9f2a5c530753f2599b4e7f0588 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Mon, 12 Jun 2023 07:07:15 -0400 Subject: [PATCH 414/782] Replace disclaimer text regarding tx acceleration --- frontend/src/app/docs/api-docs/api-docs.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index 392cda19e..b788d2739 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -10,8 +10,8 @@
-
24h1wAllBlocks 24h1wAll
+
+
+
- Mined blocks - - - + + + - - - From 64ab14f99510281f8cfd0a67bc322168daaebbfd Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 13 Mar 2023 18:10:49 +0900 Subject: [PATCH 081/782] mempool block entry animation --- .../mempool-blocks.component.html | 2 +- .../mempool-blocks.component.ts | 37 +++++++++++++++++-- .../src/app/interfaces/websocket.interface.ts | 1 + 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html index 692f7d863..58d555657 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html @@ -2,7 +2,7 @@
-
+
 
diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 8a0a06f0c..1dc280514 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, Input } from '@angular/core'; -import { Subscription, Observable, fromEvent, merge, of, combineLatest, timer } from 'rxjs'; +import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { Subscription, Observable, fromEvent, merge, of, combineLatest } from 'rxjs'; import { MempoolBlock } from '../../interfaces/websocket.interface'; import { StateService } from '../../services/state.service'; import { Router } from '@angular/router'; @@ -9,11 +9,18 @@ import { specialBlocks } from '../../app.constants'; import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; import { Location } from '@angular/common'; import { DifficultyAdjustment } from '../../interfaces/node-api.interface'; +import { animate, style, transition, trigger } from '@angular/animations'; @Component({ selector: 'app-mempool-blocks', templateUrl: './mempool-blocks.component.html', styleUrls: ['./mempool-blocks.component.scss'], + animations: [trigger('blockEntryTrigger', [ + transition(':enter', [ + style({ transform: 'translateX(-155px)' }), + animate('2s 0s ease', style({ transform: '' })), + ]), + ])], changeDetection: ChangeDetectionStrategy.OnPush, }) export class MempoolBlocksComponent implements OnInit, OnDestroy { @@ -32,12 +39,14 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { isLoadingWebsocketSubscription: Subscription; blockSubscription: Subscription; networkSubscription: Subscription; + chainTipSubscription: Subscription; network = ''; now = new Date().getTime(); timeOffset = 0; showMiningInfo = false; timeLtrSubscription: Subscription; timeLtr: boolean; + animateEntry: boolean = false; blockWidth = 125; blockPadding = 30; @@ -53,6 +62,7 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { resetTransitionTimeout: number; + chainTip: number = -1; blockIndex = 1; constructor( @@ -69,6 +79,8 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { } ngOnInit() { + this.chainTip = this.stateService.latestBlockHeight; + if (['', 'testnet', 'signet'].includes(this.stateService.network)) { this.enabledMiningInfoIfNeeded(this.location.path()); this.location.onUrlChange((url) => this.enabledMiningInfoIfNeeded(url)); @@ -155,11 +167,24 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { this.blockSubscription = this.stateService.blocks$ .subscribe(([block]) => { + if (this.chainTip === -1) { + this.animateEntry = block.height === this.stateService.latestBlockHeight; + } else { + this.animateEntry = block.height > this.chainTip; + } + + this.chainTip = this.stateService.latestBlockHeight; if (block?.extras?.matchRate >= 66 && !this.tabHidden) { this.blockIndex++; } }); + this.chainTipSubscription = this.stateService.chainTip$.subscribe((height) => { + if (this.chainTip === -1) { + this.chainTip = height; + } + }); + this.networkSubscription = this.stateService.networkChanged$ .subscribe((network) => this.network = network); @@ -195,11 +220,12 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { this.blockSubscription.unsubscribe(); this.networkSubscription.unsubscribe(); this.timeLtrSubscription.unsubscribe(); + this.chainTipSubscription.unsubscribe(); clearTimeout(this.resetTransitionTimeout); } trackByFn(index: number, block: MempoolBlock) { - return block.index; + return (block.isStack) ? 'stack' : block.height; } reduceMempoolBlocksToFitScreen(blocks: MempoolBlock[]): MempoolBlock[] { @@ -216,6 +242,9 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { lastBlock.medianFee = this.median(lastBlock.feeRange); lastBlock.totalFees += block.totalFees; } + if (blocks.length) { + blocks[blocks.length - 1].isStack = blocks[blocks.length - 1].blockVSize > this.stateService.blockVSize; + } return blocks; } @@ -334,4 +363,4 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { } return emptyBlocks; } -} +} \ No newline at end of file diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 96f7530c9..46416857e 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -43,6 +43,7 @@ export interface MempoolBlock { totalFees: number; feeRange: number[]; index: number; + isStack?: boolean; } export interface MempoolBlockWithTransactions extends MempoolBlock { From c24724dcdfa7429c1e6437387121057ffa67f862 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 14 Mar 2023 10:19:32 +0900 Subject: [PATCH 082/782] animate mempool blocks conditional on mined block similarity --- backend/src/api/audit.ts | 15 ++++++++++++--- backend/src/api/websocket-handler.ts | 3 ++- backend/src/mempool.interfaces.ts | 1 + .../mempool-blocks/mempool-blocks.component.ts | 4 ++-- frontend/src/app/interfaces/node-api.interface.ts | 1 + 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index 5b67dc965..d0d677740 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -5,9 +5,9 @@ const PROPAGATION_MARGIN = 180; // in seconds, time since a transaction is first class Audit { auditBlock(transactions: TransactionExtended[], projectedBlocks: MempoolBlockWithTransactions[], mempool: { [txId: string]: TransactionExtended }) - : { censored: string[], added: string[], fresh: string[], score: number } { + : { censored: string[], added: string[], fresh: string[], score: number, similarity: number } { if (!projectedBlocks?.[0]?.transactionIds || !mempool) { - return { censored: [], added: [], fresh: [], score: 0 }; + return { censored: [], added: [], fresh: [], score: 0, similarity: 1 }; } const matches: string[] = []; // present in both mined block and template @@ -16,6 +16,8 @@ class Audit { const isCensored = {}; // missing, without excuse const isDisplaced = {}; let displacedWeight = 0; + let matchedWeight = 0; + let projectedWeight = 0; const inBlock = {}; const inTemplate = {}; @@ -38,11 +40,16 @@ class Audit { isCensored[txid] = true; } displacedWeight += mempool[txid].weight; + } else { + matchedWeight += mempool[txid].weight; } + projectedWeight += mempool[txid].weight; inTemplate[txid] = true; } displacedWeight += (4000 - transactions[0].weight); + projectedWeight += transactions[0].weight; + matchedWeight += transactions[0].weight; // we can expect an honest miner to include 'displaced' transactions in place of recent arrivals and censored txs // these displaced transactions should occupy the first N weight units of the next projected block @@ -121,12 +128,14 @@ class Audit { const numCensored = Object.keys(isCensored).length; const numMatches = matches.length - 1; // adjust for coinbase tx const score = numMatches > 0 ? (numMatches / (numMatches + numCensored)) : 0; + const similarity = projectedWeight ? matchedWeight / projectedWeight : 1; return { censored: Object.keys(isCensored), added, fresh, - score + score, + similarity, }; } } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index a96264825..1eeb17d2e 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -432,7 +432,7 @@ class WebsocketHandler { } if (Common.indexingEnabled() && memPool.isInSync()) { - const { censored, added, fresh, score } = Audit.auditBlock(transactions, projectedBlocks, auditMempool); + const { censored, added, fresh, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool); const matchRate = Math.round(score * 100 * 100) / 100; const stripped = projectedBlocks[0]?.transactions ? projectedBlocks[0].transactions.map((tx) => { @@ -464,6 +464,7 @@ class WebsocketHandler { if (block.extras) { block.extras.matchRate = matchRate; + block.extras.similarity = similarity; } } } diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 8662770bc..9961632c3 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -153,6 +153,7 @@ export interface BlockExtension { feeRange: number[]; // fee rate percentiles reward: number; matchRate: number | null; + similarity?: number; pool: { id: number; // Note - This is the `unique_id`, not to mix with the auto increment `id` name: string; diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 1dc280514..84b2b7bc0 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -174,7 +174,7 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { } this.chainTip = this.stateService.latestBlockHeight; - if (block?.extras?.matchRate >= 66 && !this.tabHidden) { + if ((block?.extras?.similarity == null || block?.extras?.similarity > 0.5) && !this.tabHidden) { this.blockIndex++; } }); @@ -225,7 +225,7 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { } trackByFn(index: number, block: MempoolBlock) { - return (block.isStack) ? 'stack' : block.height; + return (block.isStack) ? 'stack' : block.index; } reduceMempoolBlocksToFitScreen(blocks: MempoolBlock[]): MempoolBlock[] { diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index cad623f9f..024376ca6 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -118,6 +118,7 @@ export interface BlockExtension { reward?: number; coinbaseRaw?: string; matchRate?: number; + similarity?: number; pool?: { id: number; name: string; From 25aacb504687539bd7df93c6ee22bfb3d057e832 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 14 Mar 2023 14:52:34 +0900 Subject: [PATCH 083/782] Calculate similarity score with audit disabled --- backend/src/api/common.ts | 26 +++++++++++++++++++++++++- backend/src/api/websocket-handler.ts | 3 +++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index f762cfc2c..df97c0292 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -1,4 +1,4 @@ -import { CpfpInfo, TransactionExtended, TransactionStripped } from '../mempool.interfaces'; +import { CpfpInfo, MempoolBlockWithTransactions, TransactionExtended, TransactionStripped } from '../mempool.interfaces'; import config from '../config'; import { NodeSocket } from '../repositories/NodesSocketsRepository'; import { isIP } from 'net'; @@ -164,6 +164,30 @@ export class Common { return parents; } + // calculates the ratio of matched transactions to projected transactions by weight + static getSimilarity(projectedBlock: MempoolBlockWithTransactions, transactions: TransactionExtended[]): number { + let matchedWeight = 0; + let projectedWeight = 0; + const inBlock = {}; + + for (const tx of transactions) { + inBlock[tx.txid] = tx; + } + + // look for transactions that were expected in the template, but missing from the mined block + for (const tx of projectedBlock.transactions) { + if (inBlock[tx.txid]) { + matchedWeight += tx.vsize * 4; + } + projectedWeight += tx.vsize * 4; + } + + projectedWeight += transactions[0].weight; + matchedWeight += transactions[0].weight; + + return projectedWeight ? matchedWeight / projectedWeight : 1; + } + static getSqlInterval(interval: string | null): string | null { switch (interval) { case '24h': return '1 DAY'; diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 1eeb17d2e..07aac0790 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -467,6 +467,9 @@ class WebsocketHandler { block.extras.similarity = similarity; } } + } else if (block.extras) { + const mBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); + block.extras.similarity = Common.getSimilarity(mBlocks[0], transactions); } const removed: string[] = []; From b5c20734141cd9825b4b082e63cd125cd507b563 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 16 Mar 2023 22:15:20 +0900 Subject: [PATCH 084/782] Fix getSimilarity error on empty mempool --- backend/src/api/websocket-handler.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 07aac0790..c89179ce7 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -469,7 +469,9 @@ class WebsocketHandler { } } else if (block.extras) { const mBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); - block.extras.similarity = Common.getSimilarity(mBlocks[0], transactions); + if (mBlocks?.length && mBlocks[0].transactions) { + block.extras.similarity = Common.getSimilarity(mBlocks[0], transactions); + } } const removed: string[] = []; From b8f77c4be40dd7f4ba80a4ab4f83556c9535e2de Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 17 Mar 2023 14:01:36 +0900 Subject: [PATCH 085/782] Pull from transifex --- frontend/src/locale/messages.ca.xlf | 1326 ++++++++++++++++---------- frontend/src/locale/messages.es.xlf | 26 +- frontend/src/locale/messages.fr.xlf | 28 +- frontend/src/locale/messages.hi.xlf | 1329 +++++++++++++++++---------- frontend/src/locale/messages.hr.xlf | 1324 ++++++++++++++++---------- frontend/src/locale/messages.it.xlf | 172 ++++ frontend/src/locale/messages.ko.xlf | 42 +- frontend/src/locale/messages.sv.xlf | 70 +- frontend/src/locale/messages.th.xlf | 45 + frontend/src/locale/messages.uk.xlf | 42 +- frontend/src/locale/messages.zh.xlf | 2 + 11 files changed, 2839 insertions(+), 1567 deletions(-) diff --git a/frontend/src/locale/messages.ca.xlf b/frontend/src/locale/messages.ca.xlf index 50d44b541..48d9623ac 100644 --- a/frontend/src/locale/messages.ca.xlf +++ b/frontend/src/locale/messages.ca.xlf @@ -354,11 +354,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -378,11 +378,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -418,7 +418,7 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash @@ -443,7 +443,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -585,11 +585,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -740,11 +740,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -765,16 +765,24 @@ src/app/components/about/about.component.html - 385,389 + 391,394 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 87 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -784,14 +792,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 89 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -978,7 +994,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1026,7 +1042,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1042,11 +1058,11 @@ src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 283,285 transaction.version @@ -1095,7 +1111,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1116,7 +1132,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1128,10 +1144,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1144,11 +1156,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1176,11 +1188,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 257,262 src/app/components/transaction/transaction.component.html - 406,412 + 401,407 transaction.details @@ -1197,11 +1209,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 244,248 src/app/components/transaction/transaction.component.html - 377,383 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1218,7 +1230,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 246,245 @@ -1238,7 +1250,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1254,7 +1266,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1422,7 +1434,7 @@ Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1430,7 +1442,7 @@ Empreses patrocinadores 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1439,7 +1451,7 @@ Patrocinadors de la comunitat ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1447,7 +1459,7 @@ Community Integrations src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1455,7 +1467,7 @@ Community Alliances src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1463,7 +1475,7 @@ Project Translators src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1472,7 +1484,7 @@ Col·laboradors del projecte src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1480,7 +1492,7 @@ Project Members src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1489,7 +1501,7 @@ Mantenidors del projecte src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1498,7 +1510,7 @@ Sobre src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1510,7 +1522,7 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 @@ -1545,7 +1557,7 @@ src/app/components/amount/amount.component.html - 6,9 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1561,7 +1573,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1640,7 +1652,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1847,7 +1859,7 @@ src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header @@ -1860,7 +1872,7 @@ src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header @@ -1873,7 +1885,7 @@ src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header @@ -1882,7 +1894,7 @@ Error al carregar les dades dels actius. src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -1987,7 +1999,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2003,7 +2015,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -2018,7 +2030,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2029,11 +2041,11 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2041,19 +2053,19 @@ Indexing blocks src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2093,7 +2105,7 @@ src/app/components/transaction/transaction.component.html - 476 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2119,11 +2131,11 @@ src/app/components/transaction/transaction.component.html - 476,477 + 473 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2137,11 +2149,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2153,7 +2165,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,43 Transaction fee rate transaction.fee-rate @@ -2171,19 +2183,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2223,27 +2235,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 478,481 src/app/components/transaction/transaction.component.html - 492,494 + 489,491 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2251,7 +2263,7 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte @@ -2265,11 +2277,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 269,272 Transaction Virtual Size transaction.vsize @@ -2338,7 +2350,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2372,11 +2384,11 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2392,7 +2404,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2401,15 +2413,15 @@ Mida src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2433,7 +2445,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 265,267 src/app/dashboard/dashboard.component.html @@ -2445,11 +2457,11 @@ Pes src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2457,11 +2469,22 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 273,275 + + + + Size per weight + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2476,14 +2499,6 @@ shared.block-title - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee Quota mediana @@ -2493,7 +2508,7 @@ src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2510,11 +2525,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2532,7 +2547,7 @@ src/app/components/block/block.component.html - 168,170 + 173,175 block.miner @@ -2544,7 +2559,7 @@ src/app/components/block/block.component.ts - 227 + 242 @@ -2553,6 +2568,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2567,31 +2586,47 @@ Previous Block - - Block health + + Health src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2608,7 +2643,7 @@ Rang de quotes src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2620,7 +2655,7 @@ Based on average native segwit transaction of 140 vBytes src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2644,49 +2679,60 @@ Transaction fee tooltip - - Subsidy + fees: - Subvenció + Quota + + Subsidy + fees src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block src/app/components/block/block.component.html - 225,227 + 231 block.actual-block @@ -2695,7 +2741,7 @@ Bits src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2703,7 +2749,7 @@ Merkle root src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2712,7 +2758,7 @@ Dificultat src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2728,11 +2774,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2740,7 +2786,7 @@ Nonce src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce @@ -2748,32 +2794,41 @@ Block Header Hex src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details Detalls src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2782,20 +2837,16 @@ Error loading data. src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2810,7 +2861,7 @@ Why is this block empty? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation @@ -2855,18 +2906,6 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward @@ -2928,7 +2967,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -2959,13 +2998,17 @@ Difficulty Adjustment Canvi de dificultat + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -2973,11 +3016,11 @@ Remaining Restant - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -2985,11 +3028,11 @@ blocks - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3009,11 +3052,11 @@ block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3025,11 +3068,11 @@ Estimate - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3037,19 +3080,23 @@ Previous - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3057,11 +3104,99 @@ Next Halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) @@ -3151,7 +3286,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3163,7 +3298,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3176,7 +3311,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3189,7 +3324,7 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3208,7 +3343,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3216,7 +3351,7 @@ Pools Ranking src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3228,7 +3363,7 @@ Pools Dominance src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3240,7 +3375,7 @@ Hashrate & Difficulty src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3248,7 +3383,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3256,7 +3391,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3276,7 +3411,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3296,7 +3431,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3308,7 +3443,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3324,7 +3459,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3340,7 +3475,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3360,11 +3495,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3392,11 +3527,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3429,7 +3564,7 @@ src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3453,7 +3588,7 @@ Lightning Explorer src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3461,19 +3596,11 @@ master-page.lightning - - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3513,7 +3640,7 @@ Reward stats src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3521,7 +3648,7 @@ (144 blocks) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3530,7 +3657,7 @@ Últims blocs src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3542,10 +3669,35 @@ Adjustments src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments + + Broadcast Transaction + + src/app/components/mining-dashboard/mining-dashboard.component.html + 91 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) @@ -3606,7 +3758,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3634,11 +3786,23 @@ mining.rank + + Avg Health + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3646,7 +3810,7 @@ All miners src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3654,7 +3818,7 @@ Pools Luck (1w) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3662,7 +3826,7 @@ Pools Count (1w) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3670,11 +3834,11 @@ Mining Pools src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 - - blocks + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3683,6 +3847,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -3884,23 +4083,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex @@ -3909,7 +4091,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 291,292 transaction.hex @@ -4024,6 +4206,70 @@ search-form.search-title + + Bitcoin Block Height + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) @@ -4049,7 +4295,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4058,7 +4304,7 @@ Invertir src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4066,7 +4312,7 @@ Transaction vBytes per second (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4074,193 +4320,185 @@ Just now Ara mateix - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4299,7 +4537,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4309,11 +4547,11 @@ Vist per primera vegada src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4329,11 +4567,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4343,7 +4581,7 @@ ETA src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4353,7 +4591,7 @@ D'aquí unes hores (o més) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4362,11 +4600,11 @@ Descendant src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4375,7 +4613,7 @@ Ancestor src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4384,11 +4622,11 @@ Flow src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 341,345 Transaction flow transaction.flow @@ -4397,7 +4635,7 @@ Hide diagram src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4405,7 +4643,7 @@ Show more src/app/components/transaction/transaction.component.html - 231,233 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4421,7 +4659,7 @@ Show less src/app/components/transaction/transaction.component.html - 233,239 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4433,7 +4671,7 @@ Show diagram src/app/components/transaction/transaction.component.html - 253,254 + 248,249 show-diagram @@ -4441,7 +4679,7 @@ Locktime src/app/components/transaction/transaction.component.html - 292,294 + 287,289 transaction.locktime @@ -4449,7 +4687,7 @@ Transaction not found. src/app/components/transaction/transaction.component.html - 455,456 + 450,451 transaction.error.transaction-not-found @@ -4458,7 +4696,7 @@ Esperant a que apareixi a la memòria... src/app/components/transaction/transaction.component.html - 456,461 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4467,7 +4705,7 @@ Quota efectiva d'intercanvi src/app/components/transaction/transaction.component.html - 489,492 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4607,7 +4845,7 @@ Show more inputs to reveal fee data src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4615,7 +4853,7 @@ remaining src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -4849,21 +5087,12 @@ dashboard.latest-transactions - - USD - USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee Quota mínima src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -4872,7 +5101,7 @@ Purging src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging @@ -4882,7 +5111,7 @@ Ús de memòria src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage @@ -4891,15 +5120,27 @@ L-BTC in circulation src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + + src/app/docs/api-docs/api-docs.component.html + 14 + + faq.big-disclaimer + REST API service src/app/docs/api-docs/api-docs.component.html - 39,40 + 42,43 api-docs.title @@ -4907,11 +5148,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 48,49 + 51,52 src/app/docs/api-docs/api-docs.component.html - 102,105 + 105,108 Api docs endpoint @@ -4920,18 +5161,18 @@ Descripció src/app/docs/api-docs/api-docs.component.html - 67,68 + 70,71 src/app/docs/api-docs/api-docs.component.html - 106,107 + 109,110 Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 107,108 + 110,111 api-docs.websocket.websocket @@ -5025,7 +5266,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5093,7 +5334,11 @@ src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 + + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 lightning.x-channels @@ -5131,11 +5376,11 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html - 65,66 + 68,69 status.inactive @@ -5147,11 +5392,11 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html - 66,68 + 69,71 status.active @@ -5163,7 +5408,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5171,7 +5416,7 @@ src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed @@ -5183,7 +5428,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5195,11 +5440,19 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 src/app/lightning/node-statistics/node-statistics.component.html @@ -5207,7 +5460,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5229,6 +5482,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5263,11 +5520,11 @@ Lightning channel src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5275,11 +5532,11 @@ Last update src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5295,11 +5552,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5307,11 +5564,11 @@ Closing date src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,44 lightning.closing_date @@ -5319,7 +5576,7 @@ Closed by src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5327,7 +5584,7 @@ Opening transaction src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5335,7 +5592,7 @@ Closing transaction src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5346,6 +5603,27 @@ 37 + + Mutually closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open @@ -5358,7 +5636,7 @@ No channels to display src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list @@ -5366,7 +5644,7 @@ Alias src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5390,11 +5668,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5402,7 +5680,7 @@ Status src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status @@ -5410,7 +5688,7 @@ Channel ID src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id @@ -5418,11 +5696,11 @@ sats src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,68 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5466,6 +5744,22 @@ shared.sats + + avg + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity @@ -5582,11 +5876,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5634,10 +5928,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5653,12 +5943,20 @@ 40,44 - src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 28,29 + + + src/app/lightning/node-statistics/node-statistics.component.html + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5690,16 +5988,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -5730,7 +6032,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5746,11 +6048,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -5784,9 +6086,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -5814,6 +6124,28 @@ lightning.node-fee-distribution + + Outgoing Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week @@ -5822,11 +6154,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -5838,11 +6170,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -5854,7 +6186,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -5866,7 +6198,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -5878,19 +6210,11 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -5898,7 +6222,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -5906,7 +6230,7 @@ Color src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -5914,7 +6238,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -5926,7 +6250,7 @@ Exclusively on Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -5934,7 +6258,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -5942,7 +6266,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -5951,7 +6275,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -5959,7 +6283,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -5967,7 +6291,7 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -5976,7 +6300,7 @@ Channel base fee src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -5984,7 +6308,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -5992,7 +6316,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6000,7 +6324,7 @@ Open channels src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6008,7 +6332,7 @@ Closed channels src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6050,7 +6374,7 @@ No geolocation data available src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6072,8 +6396,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6083,8 +6407,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6094,8 +6418,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6118,25 +6442,29 @@ lightning.share - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6242,11 +6570,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6327,22 +6655,6 @@ 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes diff --git a/frontend/src/locale/messages.es.xlf b/frontend/src/locale/messages.es.xlf index e0cc2d847..8baaf9532 100644 --- a/frontend/src/locale/messages.es.xlf +++ b/frontend/src/locale/messages.es.xlf @@ -3203,6 +3203,7 @@ blocks expected + bloques esperados src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + bloque esperado src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3237,6 +3239,7 @@ blocks remaining + bloques restantes src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3245,6 +3248,7 @@ block remaining + bloque restante src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3253,6 +3257,7 @@ blocks ahead + bloques por delante src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3261,6 +3266,7 @@ block ahead + bloque por delante src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3269,6 +3275,7 @@ blocks behind + bloques por detrás src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3277,6 +3284,7 @@ block behind + bloque por detrás src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3285,6 +3293,7 @@ Average block time + Tiempo medio de bloque src/app/components/difficulty/difficulty.component.html 42,45 @@ -3929,7 +3938,7 @@ Avg Health - El promedio de salud + Promedio de salud src/app/components/pool-ranking/pool-ranking.component.html 96,97 @@ -3986,6 +3995,7 @@ blocks + bloques src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -5352,7 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. - memepool.space simplemente proporciona datos sobre la red Bitcoin. No puede ayudarle a recuperar fondos, confirmar su transacción más rápdio, etc. + mempool.space simplemente proporciona datos sobre la red Bitcoin. No puede ayudarle a recuperar fondos, confirmar su transacción más rápido, etc. src/app/docs/api-docs/api-docs.component.html 13 @@ -5870,7 +5880,7 @@ Force closed - Forzar cierre + Cierre forzado src/app/lightning/channel/closing-type/closing-type.component.ts 24 @@ -5878,7 +5888,7 @@ Force closed with penalty - Fuerza cerrada con sanción + Cierre forzado con sanción src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -6012,7 +6022,7 @@ avg - El promedio + Promedio src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -6021,7 +6031,7 @@ med - Media + Med src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -6416,7 +6426,7 @@ Outgoing Fees - Gastos de salida + Tasas de salida src/app/lightning/node-fee-chart/node-fee-chart.component.ts 170 @@ -6428,7 +6438,7 @@ Incoming Fees - Gastos de entrada + Tasas de entrada src/app/lightning/node-fee-chart/node-fee-chart.component.ts 178 diff --git a/frontend/src/locale/messages.fr.xlf b/frontend/src/locale/messages.fr.xlf index d4158fdaa..9bf9db7c0 100644 --- a/frontend/src/locale/messages.fr.xlf +++ b/frontend/src/locale/messages.fr.xlf @@ -7038,7 +7038,7 @@ year - année + année src/app/shared/i18n/dates.ts 3 @@ -7046,7 +7046,7 @@ years - ans + ans src/app/shared/i18n/dates.ts 4 @@ -7054,7 +7054,7 @@ month - mois + mois src/app/shared/i18n/dates.ts 5 @@ -7062,7 +7062,7 @@ months - mois + mois src/app/shared/i18n/dates.ts 6 @@ -7070,7 +7070,7 @@ week - sem + sem src/app/shared/i18n/dates.ts 7 @@ -7078,7 +7078,7 @@ weeks - sem + sem src/app/shared/i18n/dates.ts 8 @@ -7086,7 +7086,7 @@ day - jour + jour src/app/shared/i18n/dates.ts 9 @@ -7094,7 +7094,7 @@ days - jours + jours src/app/shared/i18n/dates.ts 10 @@ -7102,7 +7102,7 @@ hour - heure + heure src/app/shared/i18n/dates.ts 11 @@ -7110,7 +7110,7 @@ hours - heures + heures src/app/shared/i18n/dates.ts 12 @@ -7118,7 +7118,7 @@ minute - minute + minute src/app/shared/i18n/dates.ts 13 @@ -7126,7 +7126,7 @@ minutes - minutes + minutes src/app/shared/i18n/dates.ts 14 @@ -7134,7 +7134,7 @@ second - seconde + seconde src/app/shared/i18n/dates.ts 15 @@ -7142,7 +7142,7 @@ seconds - secondes + secondes src/app/shared/i18n/dates.ts 16 diff --git a/frontend/src/locale/messages.hi.xlf b/frontend/src/locale/messages.hi.xlf index 5eda29125..0bd98f80f 100644 --- a/frontend/src/locale/messages.hi.xlf +++ b/frontend/src/locale/messages.hi.xlf @@ -355,11 +355,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -380,11 +380,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -422,7 +422,7 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash @@ -447,7 +447,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -590,11 +590,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -745,11 +745,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -770,16 +770,24 @@ src/app/components/about/about.component.html - 385,389 + 391,394 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 87 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -790,14 +798,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 89 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -985,7 +1001,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -1033,7 +1049,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -1049,11 +1065,11 @@ src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 283,285 transaction.version @@ -1103,7 +1119,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1125,7 +1141,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1137,10 +1153,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1153,11 +1165,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1185,11 +1197,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 257,262 src/app/components/transaction/transaction.component.html - 406,412 + 401,407 transaction.details @@ -1206,11 +1218,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 244,248 src/app/components/transaction/transaction.component.html - 377,383 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1228,7 +1240,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 246,245 @@ -1248,7 +1260,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1264,7 +1276,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1434,7 +1446,7 @@ Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties. src/app/components/about/about.component.html - 13,17 + 13,16 @@ -1442,7 +1454,7 @@ एंटरप्राइज़ प्रायोजक src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1451,7 +1463,7 @@ समुदाय प्रायोजक ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1459,7 +1471,7 @@ Community Integrations src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1468,7 +1480,7 @@ सामुदायिक गठबंधन src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1476,7 +1488,7 @@ Project Translators src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1485,7 +1497,7 @@ परियोजना योगदानकर्ता src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1494,7 +1506,7 @@ परियोजना सदस्य src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1503,7 +1515,7 @@ परियोजना अनुरक्षक src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1512,7 +1524,7 @@ विवरण src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1524,7 +1536,7 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 @@ -1560,7 +1572,7 @@ src/app/components/amount/amount.component.html - 6,9 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1576,7 +1588,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1656,7 +1668,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1875,7 +1887,7 @@ src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header @@ -1888,7 +1900,7 @@ src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header @@ -1901,7 +1913,7 @@ src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header @@ -1910,7 +1922,7 @@ एसेट डेटा लोड करने में गड़बड़ी. src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -2016,7 +2028,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -2032,7 +2044,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -2047,7 +2059,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -2058,11 +2070,11 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -2070,19 +2082,19 @@ Indexing blocks src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -2122,7 +2134,7 @@ src/app/components/transaction/transaction.component.html - 476 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2148,11 +2160,11 @@ src/app/components/transaction/transaction.component.html - 476,477 + 473 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2166,11 +2178,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2182,7 +2194,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,43 Transaction fee rate transaction.fee-rate @@ -2200,19 +2212,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2252,27 +2264,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 478,481 src/app/components/transaction/transaction.component.html - 492,494 + 489,491 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2280,7 +2292,7 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte @@ -2294,11 +2306,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 269,272 Transaction Virtual Size transaction.vsize @@ -2367,7 +2379,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2401,11 +2413,11 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2421,7 +2433,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2430,15 +2442,15 @@ साइज src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2462,7 +2474,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 265,267 src/app/dashboard/dashboard.component.html @@ -2474,11 +2486,11 @@ वेइट src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2486,11 +2498,22 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 273,275 + + + + Size per weight + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2505,14 +2528,6 @@ shared.block-title - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee औसत शुल्क @@ -2522,7 +2537,7 @@ src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2539,11 +2554,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2561,7 +2576,7 @@ src/app/components/block/block.component.html - 168,170 + 173,175 block.miner @@ -2574,7 +2589,7 @@ src/app/components/block/block.component.ts - 227 + 242 @@ -2584,6 +2599,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2599,31 +2618,47 @@ Previous Block - - Block health + + Health src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2640,7 +2675,7 @@ फी स्पेन src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2653,7 +2688,7 @@ 140 वीबाइट्स के औसत नेटिव सेगविट लेनदेन के आधार पर src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2677,49 +2712,60 @@ Transaction fee tooltip - - Subsidy + fees: - सब्सिडी + शुल्क: + + Subsidy + fees src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block src/app/components/block/block.component.html - 225,227 + 231 block.actual-block @@ -2728,7 +2774,7 @@ बिट्स src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2737,7 +2783,7 @@ मर्कल रुट src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2746,7 +2792,7 @@ कठिनाई src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2762,11 +2808,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2775,7 +2821,7 @@ नोन्स src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce @@ -2784,32 +2830,41 @@ ब्लॉक हैडर हेक्स src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details विवरण src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2818,20 +2873,16 @@ Error loading data. src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2846,7 +2897,7 @@ Why is this block empty? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation @@ -2891,18 +2942,6 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward @@ -2964,7 +3003,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -2995,13 +3034,17 @@ Difficulty Adjustment डिफीकल्टी एडजस्टमेंट + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment @@ -3009,11 +3052,11 @@ Remaining बचा हुआ - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -3021,11 +3064,11 @@ blocks - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -3045,11 +3088,11 @@ block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -3062,11 +3105,11 @@ Estimate आकलन - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -3075,20 +3118,24 @@ Previous पिछला - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period वर्तमान अवधि - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -3096,11 +3143,99 @@ Next Halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) @@ -3190,7 +3325,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3203,7 +3338,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3216,7 +3351,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3230,7 +3365,7 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3249,7 +3384,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3257,7 +3392,7 @@ Pools Ranking src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3269,7 +3404,7 @@ Pools Dominance src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3281,7 +3416,7 @@ Hashrate & Difficulty src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3289,7 +3424,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3297,7 +3432,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3317,7 +3452,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3337,7 +3472,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3349,7 +3484,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3365,7 +3500,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3381,7 +3516,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3401,11 +3536,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3433,11 +3568,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3470,7 +3605,7 @@ src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3494,7 +3629,7 @@ Lightning Explorer src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3502,20 +3637,12 @@ master-page.lightning - - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation प्रलेखन src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3559,7 +3686,7 @@ Reward stats src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3567,7 +3694,7 @@ (144 blocks) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3576,7 +3703,7 @@ नई ब्लॉक src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3588,10 +3715,36 @@ Adjustments src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments + + Broadcast Transaction + प्रसारण लेनदेन + + src/app/components/mining-dashboard/mining-dashboard.component.html + 91 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) @@ -3652,7 +3805,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3680,11 +3833,23 @@ mining.rank + + Avg Health + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3692,7 +3857,7 @@ All miners src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3700,7 +3865,7 @@ Pools Luck (1w) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3708,7 +3873,7 @@ Pools Count (1w) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3716,11 +3881,11 @@ Mining Pools src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 - - blocks + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3729,6 +3894,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -3930,24 +4130,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - प्रसारण लेनदेन - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex @@ -3956,7 +4138,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 291,292 transaction.hex @@ -4071,6 +4253,70 @@ search-form.search-title + + Bitcoin Block Height + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) vBytes द्वारा मेमपूल (sat/vByte) @@ -4098,7 +4344,7 @@ फ़िल्टर src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -4107,7 +4353,7 @@ उल्टे src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -4116,7 +4362,7 @@ लेनदेन vBytes प्रति सेकंड (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second @@ -4124,196 +4370,187 @@ Just now अभी - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago पहले - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After . के बाद - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - ~ . में - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4353,7 +4590,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4363,11 +4600,11 @@ प्रथम देखा src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4383,11 +4620,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4397,7 +4634,7 @@ इटीए src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4407,7 +4644,7 @@ कई घंटों में (या अधिक) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4417,11 +4654,11 @@ वंशज src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4431,7 +4668,7 @@ पूर्वज src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4440,11 +4677,11 @@ Flow src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 341,345 Transaction flow transaction.flow @@ -4453,7 +4690,7 @@ Hide diagram src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4461,7 +4698,7 @@ Show more src/app/components/transaction/transaction.component.html - 231,233 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4477,7 +4714,7 @@ Show less src/app/components/transaction/transaction.component.html - 233,239 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4489,7 +4726,7 @@ Show diagram src/app/components/transaction/transaction.component.html - 253,254 + 248,249 show-diagram @@ -4498,7 +4735,7 @@ लॉकटाइम src/app/components/transaction/transaction.component.html - 292,294 + 287,289 transaction.locktime @@ -4507,7 +4744,7 @@ ट्रांसेक्शन नहीं मिला। src/app/components/transaction/transaction.component.html - 455,456 + 450,451 transaction.error.transaction-not-found @@ -4516,7 +4753,7 @@ मेमपूल में इसके प्रकट होने की प्रतीक्षा की जा रही है... src/app/components/transaction/transaction.component.html - 456,461 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4525,7 +4762,7 @@ प्रभावी शुल्क दर src/app/components/transaction/transaction.component.html - 489,492 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4672,7 +4909,7 @@ Show more inputs to reveal fee data src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4680,7 +4917,7 @@ remaining src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -4918,21 +5155,12 @@ dashboard.latest-transactions - - USD - USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee न्यूनतम शुल्क src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -4942,7 +5170,7 @@ पर्जिंग src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging @@ -4952,7 +5180,7 @@ मेमोरी उपयोग src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage @@ -4962,15 +5190,27 @@ प्रचलन में एल-बीटीसी src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + + src/app/docs/api-docs/api-docs.component.html + 14 + + faq.big-disclaimer + REST API service src/app/docs/api-docs/api-docs.component.html - 39,40 + 42,43 api-docs.title @@ -4979,11 +5219,11 @@ ैंडपॉइन्ट src/app/docs/api-docs/api-docs.component.html - 48,49 + 51,52 src/app/docs/api-docs/api-docs.component.html - 102,105 + 105,108 Api docs endpoint @@ -4992,11 +5232,11 @@ विवरण src/app/docs/api-docs/api-docs.component.html - 67,68 + 70,71 src/app/docs/api-docs/api-docs.component.html - 106,107 + 109,110 @@ -5004,7 +5244,7 @@ डिफ़ॉल्ट पुश: क्रिया: 'चाहते हैं', डेटा: ['ब्लॉक', ...] जो आप चाहते हैं उसे व्यक्त करने के लिए धक्का दिया। उपलब्ध: ब्लॉक, मेमपूल-ब्लॉक, लाइव-2h-चार्ट, और आँकड़े। पते से संबंधित लेनदेन को पुश करें: 'ट्रैक-एड्रेस': '3PbJ...bF9B' इनपुट या आउटपुट के रूप में उस पते वाले सभी नए लेनदेन प्राप्त करने के लिए। लेन-देन की एक सरणी देता है। नए मेमपूल लेनदेन के लिए पता-लेनदेन, और नए ब्लॉक की पुष्टि लेनदेन के लिए ब्लॉक-लेनदेन। src/app/docs/api-docs/api-docs.component.html - 107,108 + 110,111 api-docs.websocket.websocket @@ -5098,7 +5338,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -5166,7 +5406,11 @@ src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 + + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 lightning.x-channels @@ -5204,11 +5448,11 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html - 65,66 + 68,69 status.inactive @@ -5220,11 +5464,11 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html - 66,68 + 69,71 status.active @@ -5236,7 +5480,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5244,7 +5488,7 @@ src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed @@ -5256,7 +5500,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5268,11 +5512,19 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 src/app/lightning/node-statistics/node-statistics.component.html @@ -5280,7 +5532,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5302,6 +5554,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5336,11 +5592,11 @@ Lightning channel src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5348,11 +5604,11 @@ Last update src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5368,11 +5624,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5380,11 +5636,11 @@ Closing date src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,44 lightning.closing_date @@ -5392,7 +5648,7 @@ Closed by src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5400,7 +5656,7 @@ Opening transaction src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5408,7 +5664,7 @@ Closing transaction src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5419,6 +5675,27 @@ 37 + + Mutually closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open @@ -5431,7 +5708,7 @@ No channels to display src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list @@ -5439,7 +5716,7 @@ Alias src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5463,11 +5740,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5475,7 +5752,7 @@ Status src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status @@ -5483,7 +5760,7 @@ Channel ID src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id @@ -5491,11 +5768,11 @@ sats src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,68 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5539,6 +5816,22 @@ shared.sats + + avg + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity @@ -5655,11 +5948,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5707,10 +6000,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5726,12 +6015,20 @@ 40,44 - src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 28,29 + + + src/app/lightning/node-statistics/node-statistics.component.html + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5763,16 +6060,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -5803,7 +6104,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5819,11 +6120,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -5857,9 +6158,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -5887,6 +6196,28 @@ lightning.node-fee-distribution + + Outgoing Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week @@ -5895,11 +6226,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -5911,11 +6242,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -5927,7 +6258,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -5939,7 +6270,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -5951,19 +6282,11 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -5971,7 +6294,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -5979,7 +6302,7 @@ Color src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -5987,7 +6310,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -5999,7 +6322,7 @@ Exclusively on Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -6007,7 +6330,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -6015,7 +6338,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -6024,7 +6347,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -6032,7 +6355,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -6040,7 +6363,7 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -6049,7 +6372,7 @@ Channel base fee src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -6057,7 +6380,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -6065,7 +6388,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -6073,7 +6396,7 @@ Open channels src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -6081,7 +6404,7 @@ Closed channels src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -6123,7 +6446,7 @@ No geolocation data available src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -6145,8 +6468,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6156,8 +6479,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6167,8 +6490,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6191,25 +6514,29 @@ lightning.share - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6315,11 +6642,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6400,22 +6727,6 @@ 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes diff --git a/frontend/src/locale/messages.hr.xlf b/frontend/src/locale/messages.hr.xlf index 4b0691fe3..4d6ea4e03 100644 --- a/frontend/src/locale/messages.hr.xlf +++ b/frontend/src/locale/messages.hr.xlf @@ -322,11 +322,11 @@ src/app/components/block/block.component.html - 290,291 + 310,311 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 26,27 + 46,47 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -346,11 +346,11 @@ src/app/components/block/block.component.html - 291,292 + 311,312 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 27,28 + 47,48 src/app/components/mempool-blocks/mempool-blocks.component.html @@ -385,7 +385,7 @@ src/app/components/block/block.component.html - 40,41 + 38,39 block.hash @@ -409,7 +409,7 @@ src/app/components/block/block.component.html - 44,46 + 42,44 src/app/components/blocks-list/blocks-list.component.html @@ -545,11 +545,11 @@ src/app/components/master-page/master-page.component.html - 49,51 + 48,50 src/app/components/pool-ranking/pool-ranking.component.html - 94,96 + 94,95 @@ -690,11 +690,11 @@ src/app/components/mining-dashboard/mining-dashboard.component.html - 33 + 32 src/app/components/mining-dashboard/mining-dashboard.component.html - 43 + 42 src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -714,16 +714,24 @@ src/app/components/about/about.component.html - 385,389 + 391,394 + + + src/app/components/mining-dashboard/mining-dashboard.component.html + 87 src/app/dashboard/dashboard.component.html - 150,152 + 157,159 src/app/docs/docs/docs.component.html 51 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 97 + Terms of Service shared.terms-of-service @@ -733,14 +741,22 @@ src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html 113,120 + + src/app/components/mining-dashboard/mining-dashboard.component.html + 89 + src/app/dashboard/dashboard.component.html - 152,154 + 159,161 src/app/docs/docs/docs.component.html 53 + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 99 + Privacy Policy shared.privacy-policy @@ -915,7 +931,7 @@ src/app/dashboard/dashboard.component.html - 124,125 + 124,126 @@ -959,7 +975,7 @@ src/app/components/transaction/transaction.component.html - 158,160 + 152,154 src/app/components/transactions-list/transactions-list.component.html @@ -974,11 +990,11 @@ src/app/components/block/block.component.html - 246,247 + 252,253 src/app/components/transaction/transaction.component.html - 288,290 + 283,285 transaction.version @@ -1027,7 +1043,7 @@ src/app/components/transactions-list/transactions-list.component.html - 294,295 + 296,297 Transaction singular confirmation count shared.confirmation-count.singular @@ -1048,7 +1064,7 @@ src/app/components/transactions-list/transactions-list.component.html - 295,296 + 297,298 Transaction plural confirmation count shared.confirmation-count.plural @@ -1060,10 +1076,6 @@ src/app/bisq/bisq-transaction/bisq-transaction.component.html 43,45 - - src/app/components/transaction/transaction.component.html - 65,67 - Transaction included in block transaction.included-in-block @@ -1075,11 +1087,11 @@ src/app/components/transaction/transaction.component.html - 77,80 + 71,74 src/app/components/transaction/transaction.component.html - 135,138 + 129,132 Transaction features transaction.features @@ -1107,11 +1119,11 @@ src/app/components/transaction/transaction.component.html - 262,267 + 257,262 src/app/components/transaction/transaction.component.html - 406,412 + 401,407 transaction.details @@ -1128,11 +1140,11 @@ src/app/components/transaction/transaction.component.html - 249,253 + 244,248 src/app/components/transaction/transaction.component.html - 377,383 + 372,378 Transaction inputs and outputs transaction.inputs-and-outputs @@ -1149,7 +1161,7 @@ src/app/components/transaction/transaction.component.ts - 241,240 + 246,245 @@ -1167,7 +1179,7 @@ src/app/components/transaction/transaction.component.html - 159,160 + 153,154 src/app/dashboard/dashboard.component.html @@ -1183,7 +1195,7 @@ src/app/components/transaction/transaction.component.html - 72,73 + 66,67 Transaction Confirmed state transaction.confirmed @@ -1334,14 +1346,14 @@ Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties. src/app/components/about/about.component.html - 13,17 + 13,16 Enterprise Sponsors 🚀 src/app/components/about/about.component.html - 29,32 + 19,22 about.sponsors.enterprise.withRocket @@ -1349,7 +1361,7 @@ Community Sponsors ❤️ src/app/components/about/about.component.html - 177,180 + 167,170 about.sponsors.withHeart @@ -1357,7 +1369,7 @@ Community Integrations src/app/components/about/about.component.html - 191,193 + 181,183 about.community-integrations @@ -1365,7 +1377,7 @@ Community Alliances src/app/components/about/about.component.html - 285,287 + 291,293 about.alliances @@ -1373,7 +1385,7 @@ Project Translators src/app/components/about/about.component.html - 301,303 + 307,309 about.translators @@ -1381,7 +1393,7 @@ Project Contributors src/app/components/about/about.component.html - 315,317 + 321,323 about.contributors @@ -1389,7 +1401,7 @@ Project Members src/app/components/about/about.component.html - 327,329 + 333,335 about.project_members @@ -1397,7 +1409,7 @@ Project Maintainers src/app/components/about/about.component.html - 340,342 + 346,348 about.maintainers @@ -1405,7 +1417,7 @@ About src/app/components/about/about.component.ts - 39 + 42 src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1417,7 +1429,7 @@ src/app/components/master-page/master-page.component.html - 58,61 + 57,60 @@ -1451,7 +1463,7 @@ src/app/components/amount/amount.component.html - 6,9 + 18,21 src/app/components/asset-circulation/asset-circulation.component.html @@ -1467,7 +1479,7 @@ src/app/components/transactions-list/transactions-list.component.html - 302,304 + 304,306 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -1543,7 +1555,7 @@ src/app/components/assets/assets.component.html - 29,31 + 31,33 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -1746,7 +1758,7 @@ src/app/components/assets/assets.component.html - 30,31 + 32,33 Asset ticker header @@ -1758,7 +1770,7 @@ src/app/components/assets/assets.component.html - 31,34 + 33,36 Asset Issuer Domain header @@ -1770,7 +1782,7 @@ src/app/components/assets/assets.component.html - 32,36 + 34,38 Asset ID header @@ -1778,7 +1790,7 @@ Error loading assets data. src/app/components/assets/assets.component.html - 48,53 + 50,55 Asset data load error @@ -1878,7 +1890,7 @@ src/app/components/graphs/graphs.component.html - 18 + 17 mining.block-fee-rates @@ -1894,7 +1906,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 161 + 165 @@ -1909,7 +1921,7 @@ src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 163 + 167 @@ -1920,11 +1932,11 @@ src/app/components/block-fees-graph/block-fees-graph.component.ts - 62 + 67 src/app/components/graphs/graphs.component.html - 20 + 19 mining.block-fees @@ -1932,19 +1944,19 @@ Indexing blocks src/app/components/block-fees-graph/block-fees-graph.component.ts - 110,105 + 116,111 src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 108,103 + 113,108 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 115,110 + 116,111 src/app/components/hashrate-chart/hashrate-chart.component.ts - 171,166 + 178,173 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts @@ -1984,7 +1996,7 @@ src/app/components/transaction/transaction.component.html - 476 + 473 src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -2009,11 +2021,11 @@ src/app/components/transaction/transaction.component.html - 476,477 + 473 src/app/components/transactions-list/transactions-list.component.html - 286,287 + 288 sat shared.sat @@ -2026,11 +2038,11 @@ src/app/components/transaction/transaction.component.html - 161,165 + 155,159 src/app/components/transaction/transaction.component.html - 479,481 + 476,478 src/app/lightning/channel/channel-box/channel-box.component.html @@ -2042,7 +2054,7 @@ src/app/lightning/channels-list/channels-list.component.html - 38,39 + 41,43 Transaction fee rate transaction.fee-rate @@ -2060,19 +2072,19 @@ src/app/components/block/block.component.html - 125,128 + 124,127 src/app/components/block/block.component.html - 129 + 128,130 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 12,14 + 19,22 src/app/components/blockchain-blocks/blockchain-blocks.component.html - 15,17 + 30,33 src/app/components/fees-box/fees-box.component.html @@ -2112,27 +2124,27 @@ src/app/components/transaction/transaction.component.html - 173,174 + 167,168 src/app/components/transaction/transaction.component.html - 184,185 + 178,179 src/app/components/transaction/transaction.component.html - 195,196 + 189,190 src/app/components/transaction/transaction.component.html - 481,484 + 478,481 src/app/components/transaction/transaction.component.html - 492,494 + 489,491 src/app/components/transactions-list/transactions-list.component.html - 286 + 286,287 src/app/dashboard/dashboard.component.html @@ -2140,7 +2152,7 @@ src/app/dashboard/dashboard.component.html - 204,208 + 213,217 sat/vB shared.sat-vbyte @@ -2154,11 +2166,11 @@ src/app/components/transaction/transaction.component.html - 160,162 + 154,156 src/app/components/transaction/transaction.component.html - 274,277 + 269,272 Transaction Virtual Size transaction.vsize @@ -2227,7 +2239,7 @@ src/app/components/graphs/graphs.component.html - 26 + 25 mining.block-prediction-accuracy @@ -2261,11 +2273,11 @@ src/app/components/block-rewards-graph/block-rewards-graph.component.ts - 60 + 65 src/app/components/graphs/graphs.component.html - 22 + 21 mining.block-rewards @@ -2281,7 +2293,7 @@ src/app/components/graphs/graphs.component.html - 24 + 23 mining.block-sizes-weights @@ -2289,15 +2301,15 @@ Size src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 180,179 + 184,183 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 226,224 + 239,237 src/app/components/block/block.component.html - 50,52 + 48,50 src/app/components/blocks-list/blocks-list.component.html @@ -2321,7 +2333,7 @@ src/app/components/transaction/transaction.component.html - 270,272 + 265,267 src/app/dashboard/dashboard.component.html @@ -2332,11 +2344,11 @@ Weight src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 188,187 + 192,191 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts - 257,254 + 270,267 src/app/components/block/block-preview.component.html @@ -2344,11 +2356,22 @@ src/app/components/block/block.component.html - 54,56 + 52,54 src/app/components/transaction/transaction.component.html - 278,280 + 273,275 + + + + Size per weight + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 200,199 + + + src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts + 282,279 @@ -2363,14 +2386,6 @@ shared.block-title - - - - src/app/components/block/block-preview.component.html - 11,12 - - shared.block-title - Median fee @@ -2379,7 +2394,7 @@ src/app/components/block/block.component.html - 128,129 + 127,128 src/app/components/mempool-block/mempool-block.component.html @@ -2395,11 +2410,11 @@ src/app/components/block/block.component.html - 133,135 + 138,140 src/app/components/block/block.component.html - 159,162 + 164,167 src/app/components/mempool-block/mempool-block.component.html @@ -2416,7 +2431,7 @@ src/app/components/block/block.component.html - 168,170 + 173,175 block.miner @@ -2428,7 +2443,7 @@ src/app/components/block/block.component.ts - 227 + 242 @@ -2437,6 +2452,10 @@ src/app/components/block/block.component.html 8,9 + + src/app/components/difficulty/difficulty-tooltip.component.html + 38 + src/app/components/mempool-block/mempool-block.component.ts 75 @@ -2451,31 +2470,47 @@ Previous Block - - Block health + + Health src/app/components/block/block.component.html - 58,61 + 56 - block.health + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + + src/app/components/blocks-list/blocks-list.component.html + 18,19 + + latest-blocks.health Unknown src/app/components/block/block.component.html - 69,72 + 67,70 src/app/components/blocks-list/blocks-list.component.html 60,63 - src/app/lightning/node/node.component.html - 52,55 + src/app/components/pool-ranking/pool-ranking.component.html + 121,124 + + + src/app/lightning/channel/closing-type/closing-type.component.ts + 32 src/app/lightning/node/node.component.html - 96,100 + 55,58 + + + src/app/lightning/node/node.component.html + 99,103 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts @@ -2491,7 +2526,7 @@ Fee span src/app/components/block/block.component.html - 124,125 + 123,124 src/app/components/mempool-block/mempool-block.component.html @@ -2503,7 +2538,7 @@ Based on average native segwit transaction of 140 vBytes src/app/components/block/block.component.html - 129,131 + 131,136 src/app/components/fees-box/fees-box.component.html @@ -2527,48 +2562,60 @@ Transaction fee tooltip - - Subsidy + fees: + + Subsidy + fees src/app/components/block/block.component.html - 148,151 + 153,156 src/app/components/block/block.component.html - 163,167 + 168,172 Total subsidy and fees in a block block.subsidy-and-fees - - Projected + + Expected src/app/components/block/block.component.html - 210,212 + 216 - block.projected + block.expected + + + beta + + src/app/components/block/block.component.html + 216,217 + + + src/app/components/block/block.component.html + 222,224 + + beta Actual src/app/components/block/block.component.html - 212,216 + 218,222 block.actual - - Projected Block + + Expected Block src/app/components/block/block.component.html - 216,218 + 222 - block.projected-block + block.expected-block Actual Block src/app/components/block/block.component.html - 225,227 + 231 block.actual-block @@ -2576,7 +2623,7 @@ Bits src/app/components/block/block.component.html - 250,252 + 256,258 block.bits @@ -2584,7 +2631,7 @@ Merkle root src/app/components/block/block.component.html - 254,256 + 260,262 block.merkle-root @@ -2592,7 +2639,7 @@ Difficulty src/app/components/block/block.component.html - 265,268 + 271,274 src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2608,11 +2655,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 284,283 + 291,290 src/app/components/hashrate-chart/hashrate-chart.component.ts - 371,368 + 378,375 block.difficulty @@ -2620,7 +2667,7 @@ Nonce src/app/components/block/block.component.html - 269,271 + 275,277 block.nonce @@ -2628,32 +2675,41 @@ Block Header Hex src/app/components/block/block.component.html - 273,274 + 279,280 block.header + + Audit + + src/app/components/block/block.component.html + 297,301 + + Toggle Audit + block.toggle-audit + Details Detalji src/app/components/block/block.component.html - 284,288 + 304,308 src/app/components/transaction/transaction.component.html - 254,259 + 249,254 src/app/lightning/channel/channel.component.html - 86,88 + 93,95 src/app/lightning/channel/channel.component.html - 96,98 + 103,105 src/app/lightning/node/node.component.html - 218,222 + 221,225 Transaction Details transaction.details @@ -2662,20 +2718,16 @@ Error loading data. src/app/components/block/block.component.html - 303,305 + 323,325 src/app/components/block/block.component.html - 339,343 + 362,366 src/app/lightning/channel/channel-preview.component.html 70,75 - - src/app/lightning/channel/channel.component.html - 109,115 - src/app/lightning/node/node-preview.component.html 66,69 @@ -2690,7 +2742,7 @@ Why is this block empty? src/app/components/block/block.component.html - 361,367 + 384,390 block.empty-block-explanation @@ -2734,18 +2786,6 @@ latest-blocks.mined - - Health - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - - src/app/components/blocks-list/blocks-list.component.html - 18,19 - - latest-blocks.health - Reward @@ -2806,7 +2846,7 @@ src/app/dashboard/dashboard.component.html - 210,214 + 219,223 dashboard.txs @@ -2835,24 +2875,28 @@ Difficulty Adjustment + + src/app/components/difficulty-mining/difficulty-mining.component.html + 1,5 + src/app/components/difficulty/difficulty.component.html 1,5 src/app/components/mining-dashboard/mining-dashboard.component.html - 24 + 23 dashboard.difficulty-adjustment Remaining - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 7,9 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 66,69 difficulty-box.remaining @@ -2860,11 +2904,11 @@ blocks - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 53,54 @@ -2884,11 +2928,11 @@ block - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 54,55 @@ -2900,11 +2944,11 @@ Estimate - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 16,17 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 73,76 difficulty-box.estimate @@ -2912,19 +2956,23 @@ Previous - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 31,33 + + src/app/components/difficulty/difficulty.component.html + 59,61 + difficulty-box.previous Current Period - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 43,44 - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 80,83 difficulty-box.current-period @@ -2932,11 +2980,99 @@ Next Halving - src/app/components/difficulty/difficulty.component.html + src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 difficulty-box.next-halving + + blocks expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 13 + + difficulty-box.expected-blocks + + + block expected + + src/app/components/difficulty/difficulty-tooltip.component.html + 14 + + difficulty-box.expected-block + + + blocks mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 18 + + difficulty-box.mined-blocks + + + block mined + + src/app/components/difficulty/difficulty-tooltip.component.html + 19 + + difficulty-box.mined-block + + + blocks remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 24 + + difficulty-box.remaining-blocks + + + block remaining + + src/app/components/difficulty/difficulty-tooltip.component.html + 25 + + difficulty-box.remaining-block + + + blocks ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 29 + + difficulty-box.blocks-ahead + + + block ahead + + src/app/components/difficulty/difficulty-tooltip.component.html + 30 + + difficulty-box.block-ahead + + + blocks behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 34 + + difficulty-box.blocks-behind + + + block behind + + src/app/components/difficulty/difficulty-tooltip.component.html + 35 + + difficulty-box.block-behind + + + Average block time + + src/app/components/difficulty/difficulty.component.html + 42,45 + + difficulty-box.average-block-time + Either 2x the minimum, or the Low Priority rate (whichever is lower) @@ -3025,7 +3161,7 @@ src/app/dashboard/dashboard.component.html - 237,238 + 246,247 dashboard.incoming-transactions @@ -3037,7 +3173,7 @@ src/app/dashboard/dashboard.component.html - 240,243 + 249,252 dashboard.backend-is-synchronizing @@ -3049,7 +3185,7 @@ src/app/dashboard/dashboard.component.html - 245,250 + 254,259 vB/s shared.vbytes-per-second @@ -3062,7 +3198,7 @@ src/app/dashboard/dashboard.component.html - 208,209 + 217,218 Unconfirmed count dashboard.unconfirmed @@ -3080,7 +3216,7 @@ Mining src/app/components/graphs/graphs.component.html - 8 + 7 mining @@ -3088,7 +3224,7 @@ Pools Ranking src/app/components/graphs/graphs.component.html - 11 + 10 src/app/components/pool-ranking/pool-ranking.component.html @@ -3100,7 +3236,7 @@ Pools Dominance src/app/components/graphs/graphs.component.html - 13 + 12 src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.html @@ -3112,7 +3248,7 @@ Hashrate & Difficulty src/app/components/graphs/graphs.component.html - 15,16 + 14,15 mining.hashrate-difficulty @@ -3120,7 +3256,7 @@ Lightning src/app/components/graphs/graphs.component.html - 31 + 30 lightning @@ -3128,7 +3264,7 @@ Lightning Nodes Per Network src/app/components/graphs/graphs.component.html - 34 + 33 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.html @@ -3148,7 +3284,7 @@ Lightning Network Capacity src/app/components/graphs/graphs.component.html - 36 + 35 src/app/lightning/statistics-chart/lightning-statistics-chart.component.html @@ -3168,7 +3304,7 @@ Lightning Nodes Per ISP src/app/components/graphs/graphs.component.html - 38 + 37 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -3180,7 +3316,7 @@ Lightning Nodes Per Country src/app/components/graphs/graphs.component.html - 40 + 39 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -3196,7 +3332,7 @@ Lightning Nodes World Map src/app/components/graphs/graphs.component.html - 42 + 41 src/app/lightning/nodes-map/nodes-map.component.html @@ -3212,7 +3348,7 @@ Lightning Nodes Channels World Map src/app/components/graphs/graphs.component.html - 44 + 43 src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -3232,11 +3368,11 @@ src/app/components/hashrate-chart/hashrate-chart.component.ts - 273,272 + 280,279 src/app/components/hashrate-chart/hashrate-chart.component.ts - 359,356 + 366,363 src/app/components/pool-ranking/pool-ranking.component.html @@ -3264,11 +3400,11 @@ Hashrate (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts - 292,291 + 299,298 src/app/components/hashrate-chart/hashrate-chart.component.ts - 382,380 + 389,387 @@ -3300,7 +3436,7 @@ src/app/components/master-page/master-page.component.html - 52,54 + 51,53 src/app/components/statistics/statistics.component.ts @@ -3324,7 +3460,7 @@ Lightning Explorer src/app/components/master-page/master-page.component.html - 44,45 + 44,47 src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -3332,19 +3468,11 @@ master-page.lightning - - beta - - src/app/components/master-page/master-page.component.html - 45,48 - - beta - Documentation src/app/components/master-page/master-page.component.html - 55,57 + 54,56 src/app/docs/docs/docs.component.html @@ -3384,7 +3512,7 @@ Reward stats src/app/components/mining-dashboard/mining-dashboard.component.html - 10 + 9 mining.reward-stats @@ -3392,7 +3520,7 @@ (144 blocks) src/app/components/mining-dashboard/mining-dashboard.component.html - 11 + 10 mining.144-blocks @@ -3400,7 +3528,7 @@ Latest blocks src/app/components/mining-dashboard/mining-dashboard.component.html - 53 + 52 src/app/dashboard/dashboard.component.html @@ -3412,10 +3540,35 @@ Adjustments src/app/components/mining-dashboard/mining-dashboard.component.html - 67 + 66 dashboard.adjustments + + Broadcast Transaction + + src/app/components/mining-dashboard/mining-dashboard.component.html + 91 + + + src/app/components/push-transaction/push-transaction.component.html + 2 + + + src/app/components/push-transaction/push-transaction.component.html + 8 + + + src/app/dashboard/dashboard.component.html + 161,169 + + + src/app/lightning/lightning-dashboard/lightning-dashboard.component.html + 102 + + Broadcast Transaction + shared.broadcast-transaction + Pools luck (1 week) @@ -3476,7 +3629,7 @@ src/app/components/pool-ranking/pool-ranking.component.html - 136,138 + 152,154 master-page.blocks @@ -3504,11 +3657,23 @@ mining.rank + + Avg Health + + src/app/components/pool-ranking/pool-ranking.component.html + 96,97 + + + src/app/components/pool-ranking/pool-ranking.component.html + 96,98 + + latest-blocks.avg_health + Empty blocks src/app/components/pool-ranking/pool-ranking.component.html - 95,98 + 97,100 mining.empty-blocks @@ -3516,7 +3681,7 @@ All miners src/app/components/pool-ranking/pool-ranking.component.html - 113,114 + 129,130 mining.all-miners @@ -3524,7 +3689,7 @@ Pools Luck (1w) src/app/components/pool-ranking/pool-ranking.component.html - 130,132 + 146,148 mining.miners-luck @@ -3532,7 +3697,7 @@ Pools Count (1w) src/app/components/pool-ranking/pool-ranking.component.html - 142,144 + 158,160 mining.miners-count @@ -3540,11 +3705,11 @@ Mining Pools src/app/components/pool-ranking/pool-ranking.component.ts - 57 + 58 - - blocks + + blocks src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3553,6 +3718,41 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -3754,23 +3954,6 @@ latest-blocks.coinbasetag - - Broadcast Transaction - - src/app/components/push-transaction/push-transaction.component.html - 2 - - - src/app/components/push-transaction/push-transaction.component.html - 8 - - - src/app/dashboard/dashboard.component.html - 154,161 - - Broadcast Transaction - shared.broadcast-transaction - Transaction hex @@ -3779,7 +3962,7 @@ src/app/components/transaction/transaction.component.html - 296,297 + 291,292 transaction.hex @@ -3893,6 +4076,70 @@ search-form.search-title + + Bitcoin Block Height + + src/app/components/search-form/search-results/search-results.component.html + 3 + + search.bitcoin-block-height + + + Bitcoin Transaction + + src/app/components/search-form/search-results/search-results.component.html + 9 + + search.bitcoin-transaction + + + Bitcoin Address + + src/app/components/search-form/search-results/search-results.component.html + 15 + + search.bitcoin-address + + + Bitcoin Block + + src/app/components/search-form/search-results/search-results.component.html + 21 + + search.bitcoin-block + + + Bitcoin Addresses + + src/app/components/search-form/search-results/search-results.component.html + 27 + + search.bitcoin-addresses + + + Lightning Nodes + + src/app/components/search-form/search-results/search-results.component.html + 35 + + search.lightning-nodes + + + Lightning Channels + + src/app/components/search-form/search-results/search-results.component.html + 43 + + search.lightning-channels + + + Go to "" + + src/app/components/search-form/search-results/search-results.component.html + 52 + + search.go-to + Mempool by vBytes (sat/vByte) @@ -3917,7 +4164,7 @@ Filter src/app/components/statistics/statistics.component.html - 57 + 60 statistics.component-filter.title @@ -3925,7 +4172,7 @@ Invert src/app/components/statistics/statistics.component.html - 76 + 79 statistics.component-invert.title @@ -3933,200 +4180,192 @@ Transaction vBytes per second (vB/s) src/app/components/statistics/statistics.component.html - 96 + 99 statistics.transaction-vbytes-per-second Just now - src/app/components/time-since/time-since.component.ts - 64 - - - src/app/components/time-span/time-span.component.ts - 57 + src/app/components/time/time.component.ts + 79 ago - src/app/components/time-since/time-since.component.ts - 74 + src/app/components/time/time.component.ts + 103 - src/app/components/time-since/time-since.component.ts - 75 + src/app/components/time/time.component.ts + 104 - src/app/components/time-since/time-since.component.ts - 76 + src/app/components/time/time.component.ts + 105 - src/app/components/time-since/time-since.component.ts - 77 + src/app/components/time/time.component.ts + 106 - src/app/components/time-since/time-since.component.ts - 78 + src/app/components/time/time.component.ts + 107 - src/app/components/time-since/time-since.component.ts - 79 + src/app/components/time/time.component.ts + 108 - src/app/components/time-since/time-since.component.ts - 80 + src/app/components/time/time.component.ts + 109 - src/app/components/time-since/time-since.component.ts - 84 + src/app/components/time/time.component.ts + 113 - src/app/components/time-since/time-since.component.ts - 85 + src/app/components/time/time.component.ts + 114 - src/app/components/time-since/time-since.component.ts - 86 + src/app/components/time/time.component.ts + 115 - src/app/components/time-since/time-since.component.ts - 87 + src/app/components/time/time.component.ts + 116 - src/app/components/time-since/time-since.component.ts - 88 + src/app/components/time/time.component.ts + 117 - src/app/components/time-since/time-since.component.ts - 89 + src/app/components/time/time.component.ts + 118 - src/app/components/time-since/time-since.component.ts - 90 + src/app/components/time/time.component.ts + 119 + + + + In ~ + + src/app/components/time/time.component.ts + 126 + + + src/app/components/time/time.component.ts + 127 + + + src/app/components/time/time.component.ts + 128 + + + src/app/components/time/time.component.ts + 129 + + + src/app/components/time/time.component.ts + 130 + + + src/app/components/time/time.component.ts + 131 + + + src/app/components/time/time.component.ts + 132 + + + src/app/components/time/time.component.ts + 136 + + + src/app/components/time/time.component.ts + 137 + + + src/app/components/time/time.component.ts + 138 + + + src/app/components/time/time.component.ts + 139 + + + src/app/components/time/time.component.ts + 140 + + + src/app/components/time/time.component.ts + 141 + + + src/app/components/time/time.component.ts + 142 After - src/app/components/time-span/time-span.component.ts - 67 + src/app/components/time/time.component.ts + 149 - src/app/components/time-span/time-span.component.ts - 68 + src/app/components/time/time.component.ts + 150 - src/app/components/time-span/time-span.component.ts - 69 + src/app/components/time/time.component.ts + 151 - src/app/components/time-span/time-span.component.ts - 70 + src/app/components/time/time.component.ts + 152 - src/app/components/time-span/time-span.component.ts - 71 + src/app/components/time/time.component.ts + 153 - src/app/components/time-span/time-span.component.ts - 72 + src/app/components/time/time.component.ts + 154 - src/app/components/time-span/time-span.component.ts - 73 + src/app/components/time/time.component.ts + 155 - src/app/components/time-span/time-span.component.ts - 77 + src/app/components/time/time.component.ts + 159 - src/app/components/time-span/time-span.component.ts - 78 + src/app/components/time/time.component.ts + 160 - src/app/components/time-span/time-span.component.ts - 79 + src/app/components/time/time.component.ts + 161 - src/app/components/time-span/time-span.component.ts - 80 + src/app/components/time/time.component.ts + 162 - src/app/components/time-span/time-span.component.ts - 81 + src/app/components/time/time.component.ts + 163 - src/app/components/time-span/time-span.component.ts - 82 + src/app/components/time/time.component.ts + 164 - src/app/components/time-span/time-span.component.ts - 83 - - - - In ~ - - src/app/components/time-until/time-until.component.ts - 66 - - - src/app/components/time-until/time-until.component.ts - 80 - - - src/app/components/time-until/time-until.component.ts - 81 - - - src/app/components/time-until/time-until.component.ts - 82 - - - src/app/components/time-until/time-until.component.ts - 83 - - - src/app/components/time-until/time-until.component.ts - 84 - - - src/app/components/time-until/time-until.component.ts - 85 - - - src/app/components/time-until/time-until.component.ts - 86 - - - src/app/components/time-until/time-until.component.ts - 90 - - - src/app/components/time-until/time-until.component.ts - 91 - - - src/app/components/time-until/time-until.component.ts - 92 - - - src/app/components/time-until/time-until.component.ts - 93 - - - src/app/components/time-until/time-until.component.ts - 94 - - - src/app/components/time-until/time-until.component.ts - 95 - - - src/app/components/time-until/time-until.component.ts - 96 + src/app/components/time/time.component.ts + 165 @@ -4166,7 +4405,7 @@ src/app/components/transactions-list/transactions-list.component.html - 298,301 + 300,303 Transaction unconfirmed state transaction.unconfirmed @@ -4176,11 +4415,11 @@ Prvo viđeno src/app/components/transaction/transaction.component.html - 108,109 + 102,103 src/app/lightning/node/node.component.html - 67,70 + 70,73 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -4196,11 +4435,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 13,15 + 15,16 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 13,15 + 15,16 Transaction first seen transaction.first-seen @@ -4209,7 +4448,7 @@ ETA src/app/components/transaction/transaction.component.html - 115,116 + 109,110 Transaction ETA transaction.eta @@ -4218,7 +4457,7 @@ In several hours (or more) src/app/components/transaction/transaction.component.html - 121,124 + 115,118 Transaction ETA in several hours or more transaction.eta.in-several-hours @@ -4227,11 +4466,11 @@ Descendant src/app/components/transaction/transaction.component.html - 168,170 + 162,164 src/app/components/transaction/transaction.component.html - 179,181 + 173,175 Descendant transaction.descendant @@ -4240,7 +4479,7 @@ Ancestor src/app/components/transaction/transaction.component.html - 190,192 + 184,186 Transaction Ancestor transaction.ancestor @@ -4249,11 +4488,11 @@ Flow src/app/components/transaction/transaction.component.html - 208,211 + 202,205 src/app/components/transaction/transaction.component.html - 346,350 + 341,345 Transaction flow transaction.flow @@ -4262,7 +4501,7 @@ Hide diagram src/app/components/transaction/transaction.component.html - 211,216 + 205,210 hide-diagram @@ -4270,7 +4509,7 @@ Show more src/app/components/transaction/transaction.component.html - 231,233 + 226,228 src/app/components/transactions-list/transactions-list.component.html @@ -4286,7 +4525,7 @@ Show less src/app/components/transaction/transaction.component.html - 233,239 + 228,234 src/app/components/transactions-list/transactions-list.component.html @@ -4298,7 +4537,7 @@ Show diagram src/app/components/transaction/transaction.component.html - 253,254 + 248,249 show-diagram @@ -4306,7 +4545,7 @@ Locktime src/app/components/transaction/transaction.component.html - 292,294 + 287,289 transaction.locktime @@ -4314,7 +4553,7 @@ Transaction not found. src/app/components/transaction/transaction.component.html - 455,456 + 450,451 transaction.error.transaction-not-found @@ -4322,7 +4561,7 @@ Waiting for it to appear in the mempool... src/app/components/transaction/transaction.component.html - 456,461 + 451,456 transaction.error.waiting-for-it-to-appear @@ -4330,7 +4569,7 @@ Effective fee rate src/app/components/transaction/transaction.component.html - 489,492 + 486,489 Effective transaction fee rate transaction.effective-fee-rate @@ -4463,7 +4702,7 @@ Show more inputs to reveal fee data src/app/components/transactions-list/transactions-list.component.html - 288,291 + 290,293 transactions-list.load-to-reveal-fee-info @@ -4471,7 +4710,7 @@ remaining src/app/components/transactions-list/transactions-list.component.html - 330,331 + 332,333 x-remaining @@ -4700,19 +4939,11 @@ dashboard.latest-transactions - - USD - - src/app/dashboard/dashboard.component.html - 126,127 - - dashboard.latest-transactions.USD - Minimum fee src/app/dashboard/dashboard.component.html - 201,202 + 210,211 Minimum mempool fee dashboard.minimum-fee @@ -4721,7 +4952,7 @@ Purging src/app/dashboard/dashboard.component.html - 202,203 + 211,212 Purgin below fee dashboard.purging @@ -4730,7 +4961,7 @@ Memory usage src/app/dashboard/dashboard.component.html - 214,215 + 223,224 Memory usage dashboard.memory-usage @@ -4739,15 +4970,27 @@ L-BTC in circulation src/app/dashboard/dashboard.component.html - 228,230 + 237,239 dashboard.lbtc-pegs-in-circulation + + mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + + src/app/docs/api-docs/api-docs.component.html + 13 + + + src/app/docs/api-docs/api-docs.component.html + 14 + + faq.big-disclaimer + REST API service src/app/docs/api-docs/api-docs.component.html - 39,40 + 42,43 api-docs.title @@ -4755,11 +4998,11 @@ Endpoint src/app/docs/api-docs/api-docs.component.html - 48,49 + 51,52 src/app/docs/api-docs/api-docs.component.html - 102,105 + 105,108 Api docs endpoint @@ -4767,18 +5010,18 @@ Description src/app/docs/api-docs/api-docs.component.html - 67,68 + 70,71 src/app/docs/api-docs/api-docs.component.html - 106,107 + 109,110 Default push: action: 'want', data: ['blocks', ...] to express what you want pushed. Available: blocks, mempool-blocks, live-2h-chart, and stats.Push transactions related to address: 'track-address': '3PbJ...bF9B' to receive all new transactions containing that address as input or output. Returns an array of transactions. address-transactions for new mempool transactions, and block-transactions for new block confirmed transactions. src/app/docs/api-docs/api-docs.component.html - 107,108 + 110,111 api-docs.websocket.websocket @@ -4868,7 +5111,7 @@ src/app/lightning/node/node.component.html - 180,182 + 183,185 shared.m-sats @@ -4936,7 +5179,11 @@ src/app/lightning/channels-list/channels-list.component.html - 120,121 + 123,124 + + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 lightning.x-channels @@ -4974,11 +5221,11 @@ src/app/lightning/channel/channel.component.html - 11,12 + 13,14 src/app/lightning/channels-list/channels-list.component.html - 65,66 + 68,69 status.inactive @@ -4990,11 +5237,11 @@ src/app/lightning/channel/channel.component.html - 12,13 + 14,15 src/app/lightning/channels-list/channels-list.component.html - 66,68 + 69,71 status.active @@ -5006,7 +5253,7 @@ src/app/lightning/channel/channel.component.html - 13,14 + 15,16 src/app/lightning/channels-list/channels-list.component.html @@ -5014,7 +5261,7 @@ src/app/lightning/channels-list/channels-list.component.html - 68,70 + 71,73 status.closed @@ -5026,7 +5273,7 @@ src/app/lightning/channel/channel.component.html - 29,30 + 36,37 lightning.created @@ -5038,11 +5285,19 @@ src/app/lightning/channel/channel.component.html - 48,49 + 55,56 src/app/lightning/channels-list/channels-list.component.html - 40,43 + 43,46 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 157 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 227 src/app/lightning/node-statistics/node-statistics.component.html @@ -5050,7 +5305,7 @@ src/app/lightning/node-statistics/node-statistics.component.html - 47,50 + 46,49 src/app/lightning/nodes-list/nodes-list.component.html @@ -5072,6 +5327,10 @@ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 60,62 + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 13,14 + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 202,201 @@ -5106,11 +5365,11 @@ Lightning channel src/app/lightning/channel/channel.component.html - 2,5 + 4,7 src/app/lightning/channel/channel.component.html - 117,119 + 116,118 lightning.channel @@ -5118,11 +5377,11 @@ Last update src/app/lightning/channel/channel.component.html - 33,34 + 40,41 src/app/lightning/node/node.component.html - 73,75 + 76,78 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5138,11 +5397,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 14,15 + 16,17 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 14,15 + 16,17 lightning.last-update @@ -5150,11 +5409,11 @@ Closing date src/app/lightning/channel/channel.component.html - 37,38 + 44,45 src/app/lightning/channels-list/channels-list.component.html - 39,40 + 42,44 lightning.closing_date @@ -5162,7 +5421,7 @@ Closed by src/app/lightning/channel/channel.component.html - 52,54 + 59,61 lightning.closed_by @@ -5170,7 +5429,7 @@ Opening transaction src/app/lightning/channel/channel.component.html - 84,85 + 91,92 lightning.opening-transaction @@ -5178,7 +5437,7 @@ Closing transaction src/app/lightning/channel/channel.component.html - 93,95 + 100,102 lightning.closing-transaction @@ -5189,6 +5448,27 @@ 37 + + Mutually closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 20 + + + + Force closed + + src/app/lightning/channel/closing-type/closing-type.component.ts + 24 + + + + Force closed with penalty + + src/app/lightning/channel/closing-type/closing-type.component.ts + 28 + + Open @@ -5201,7 +5481,7 @@ No channels to display src/app/lightning/channels-list/channels-list.component.html - 29,35 + 29,37 lightning.empty-channels-list @@ -5209,7 +5489,7 @@ Alias src/app/lightning/channels-list/channels-list.component.html - 35,37 + 38,40 src/app/lightning/group/group.component.html @@ -5233,11 +5513,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 10,11 + 11,12 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 10,12 + 11,13 lightning.alias @@ -5245,7 +5525,7 @@ Status src/app/lightning/channels-list/channels-list.component.html - 37,38 + 40,41 status @@ -5253,7 +5533,7 @@ Channel ID src/app/lightning/channels-list/channels-list.component.html - 41,45 + 44,48 channels.id @@ -5261,11 +5541,11 @@ sats src/app/lightning/channels-list/channels-list.component.html - 60,64 + 63,68 src/app/lightning/channels-list/channels-list.component.html - 84,88 + 87,91 src/app/lightning/channels-statistics/channels-statistics.component.html @@ -5309,6 +5589,22 @@ shared.sats + + avg + + src/app/lightning/channels-statistics/channels-statistics.component.html + 3,5 + + statistics.average-small + + + med + + src/app/lightning/channels-statistics/channels-statistics.component.html + 6,9 + + statistics.median-small + Avg Capacity @@ -5425,11 +5721,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 17,18 + 16,17 src/app/lightning/node-statistics/node-statistics.component.html - 54,57 + 53,56 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html @@ -5477,10 +5773,6 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 11,12 - - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html 12,13 lightning.liquidity @@ -5496,12 +5788,20 @@ 40,44 - src/app/lightning/node-statistics/node-statistics.component.html - 29,30 + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 149 + + + src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts + 204 src/app/lightning/node-statistics/node-statistics.component.html - 61,64 + 28,29 + + + src/app/lightning/node-statistics/node-statistics.component.html + 60,63 src/app/lightning/nodes-list/nodes-list.component.html @@ -5533,16 +5833,20 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 12,13 + 14,15 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 11,12 + 12,13 src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -5573,7 +5877,7 @@ src/app/lightning/node/node.component.html - 47,49 + 50,52 src/app/lightning/nodes-per-country/nodes-per-country.component.html @@ -5589,11 +5893,11 @@ src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 15,17 + 17,20 src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 15,17 + 17,20 lightning.location @@ -5627,9 +5931,17 @@ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 + + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html + 4,9 + src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.ts - 29 + 33 + + + src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html + 4,9 src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -5657,6 +5969,28 @@ lightning.node-fee-distribution + + Outgoing Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 170 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 208 + + + + Incoming Fees + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 178 + + + src/app/lightning/node-fee-chart/node-fee-chart.component.ts + 222 + + Percentage change past week @@ -5665,11 +5999,11 @@ src/app/lightning/node-statistics/node-statistics.component.html - 18,20 + 17,19 src/app/lightning/node-statistics/node-statistics.component.html - 30,32 + 29,31 mining.percentage-change-last-week @@ -5681,11 +6015,11 @@ src/app/lightning/node/node.component.html - 2,4 + 4,6 src/app/lightning/node/node.component.html - 260,262 + 263,265 lightning.node @@ -5697,7 +6031,7 @@ src/app/lightning/node/node.component.html - 27,30 + 30,33 lightning.active-capacity @@ -5709,7 +6043,7 @@ src/app/lightning/node/node.component.html - 34,38 + 37,41 lightning.active-channels @@ -5721,19 +6055,11 @@ country - - No node found for public key "" - - src/app/lightning/node/node.component.html - 17,19 - - lightning.node-not-found - Average channel size src/app/lightning/node/node.component.html - 40,43 + 43,46 lightning.active-channels-avg @@ -5741,7 +6067,7 @@ Avg channel distance src/app/lightning/node/node.component.html - 56,57 + 59,60 lightning.avg-distance @@ -5749,7 +6075,7 @@ Color src/app/lightning/node/node.component.html - 79,81 + 82,84 lightning.color @@ -5757,7 +6083,7 @@ ISP src/app/lightning/node/node.component.html - 86,87 + 89,90 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -5769,7 +6095,7 @@ Exclusively on Tor src/app/lightning/node/node.component.html - 93,95 + 96,98 tor @@ -5777,7 +6103,7 @@ Liquidity ad src/app/lightning/node/node.component.html - 138,141 + 141,144 node.liquidity-ad @@ -5785,7 +6111,7 @@ Lease fee rate src/app/lightning/node/node.component.html - 144,147 + 147,150 Liquidity ad lease fee rate liquidity-ad.lease-fee-rate @@ -5794,7 +6120,7 @@ Lease base fee src/app/lightning/node/node.component.html - 152,154 + 155,157 liquidity-ad.lease-base-fee @@ -5802,7 +6128,7 @@ Funding weight src/app/lightning/node/node.component.html - 158,159 + 161,162 liquidity-ad.funding-weight @@ -5810,7 +6136,7 @@ Channel fee rate src/app/lightning/node/node.component.html - 168,171 + 171,174 Liquidity ad channel fee rate liquidity-ad.channel-fee-rate @@ -5819,7 +6145,7 @@ Channel base fee src/app/lightning/node/node.component.html - 176,178 + 179,181 liquidity-ad.channel-base-fee @@ -5827,7 +6153,7 @@ Compact lease src/app/lightning/node/node.component.html - 188,190 + 191,193 liquidity-ad.compact-lease @@ -5835,7 +6161,7 @@ TLV extension records src/app/lightning/node/node.component.html - 199,202 + 202,205 node.tlv.records @@ -5843,7 +6169,7 @@ Open channels src/app/lightning/node/node.component.html - 240,243 + 243,246 lightning.open-channels @@ -5851,7 +6177,7 @@ Closed channels src/app/lightning/node/node.component.html - 244,247 + 247,250 lightning.open-channels @@ -5893,7 +6219,7 @@ No geolocation data available src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts - 218,213 + 219,214 @@ -5915,8 +6241,8 @@ 112,107 - - Reachable on Clearnet Only + + Clearnet and Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -5926,8 +6252,8 @@ 303,302 - - Reachable on Clearnet and Darknet + + Clearnet Only (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -5937,8 +6263,8 @@ 295,294 - - Reachable on Darknet Only + + Darknet Only (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -5961,25 +6287,29 @@ lightning.share - nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 BTC capacity src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6085,11 +6415,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 @@ -6170,22 +6500,6 @@ 27 - - Top 100 nodes liquidity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-capacity/top-nodes-per-capacity.component.html - 3,7 - - lightning.top-100-liquidity - - - Top 100 nodes connectivity ranking - - src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html - 3,7 - - lightning.top-100-connectivity - Oldest nodes diff --git a/frontend/src/locale/messages.it.xlf b/frontend/src/locale/messages.it.xlf index 22d7cf978..427e2deec 100644 --- a/frontend/src/locale/messages.it.xlf +++ b/frontend/src/locale/messages.it.xlf @@ -3203,6 +3203,7 @@ blocks expected + blocchi previsti src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + blocco previsto src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + blocchi minati src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + blocco estratto src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + blocchi rimanenti src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + blocco rimanente src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + blocchi avanti src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + blocco avanti src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + blocchi dietro src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + blocco dietro src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + Tempo medio del blocco src/app/components/difficulty/difficulty.component.html 42,45 @@ -3568,6 +3579,7 @@ Lightning Nodes World Map + Mappa Mondiale dei Nodi Lightning src/app/components/graphs/graphs.component.html 41 @@ -3584,6 +3596,7 @@ Lightning Nodes Channels World Map + Mappa Mondiale dei Canali tra Nodi Lightning src/app/components/graphs/graphs.component.html 43 @@ -3704,6 +3717,7 @@ Lightning Explorer + Lightning Explorer src/app/components/master-page/master-page.component.html 44,47 @@ -3924,6 +3938,7 @@ Avg Health + Salute Media src/app/components/pool-ranking/pool-ranking.component.html 96,97 @@ -3980,6 +3995,7 @@ blocks + blocchi src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3999,6 +4015,7 @@ Other () + Altro () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4026,6 +4043,7 @@ mining pool + mining pool src/app/components/pool/pool-preview.component.html 3,5 @@ -4276,6 +4294,7 @@ Avg Block Fees + Commissioni Medie per Blocco src/app/components/reward-stats/reward-stats.component.html 17 @@ -4288,6 +4307,7 @@ Average fees per block in the past 144 blocks + Commissioni medie per blocco negli ultimi 144 blocchi src/app/components/reward-stats/reward-stats.component.html 18,20 @@ -4296,6 +4316,7 @@ BTC/block + BTC/blocco src/app/components/reward-stats/reward-stats.component.html 21,24 @@ -4305,6 +4326,7 @@ Avg Tx Fee + Commissione Tx Media src/app/components/reward-stats/reward-stats.component.html 30 @@ -4349,6 +4371,7 @@ Explore the full Bitcoin ecosystem + Esplora l'intero ecosistema Bitcoin src/app/components/search-form/search-form.component.html 4,5 @@ -4366,6 +4389,7 @@ Bitcoin Block Height + Altezza Blocco Bitcoin src/app/components/search-form/search-results/search-results.component.html 3 @@ -4374,6 +4398,7 @@ Bitcoin Transaction + Transazione Bitcoin src/app/components/search-form/search-results/search-results.component.html 9 @@ -4382,6 +4407,7 @@ Bitcoin Address + Indirizzo Bitcoin src/app/components/search-form/search-results/search-results.component.html 15 @@ -4390,6 +4416,7 @@ Bitcoin Block + Blocco Bitcoin src/app/components/search-form/search-results/search-results.component.html 21 @@ -4398,6 +4425,7 @@ Bitcoin Addresses + Indirizzi Bitcoin src/app/components/search-form/search-results/search-results.component.html 27 @@ -4406,6 +4434,7 @@ Lightning Nodes + Nodi Lightning src/app/components/search-form/search-results/search-results.component.html 35 @@ -4414,6 +4443,7 @@ Lightning Channels + Canali Lightning src/app/components/search-form/search-results/search-results.component.html 43 @@ -4422,6 +4452,7 @@ Go to "" + Vai a &quot;&quot; src/app/components/search-form/search-results/search-results.component.html 52 @@ -4547,6 +4578,7 @@ In ~ + In ~ src/app/components/time/time.component.ts 126 @@ -4676,6 +4708,7 @@ This transaction replaced: + Questa transazione ha sostituito: src/app/components/transaction/transaction.component.html 10,12 @@ -4685,6 +4718,7 @@ Replaced + Sostituito src/app/components/transaction/transaction.component.html 36,39 @@ -4786,6 +4820,7 @@ Flow + Flow src/app/components/transaction/transaction.component.html 202,205 @@ -4799,6 +4834,7 @@ Hide diagram + Nascondi diagramma src/app/components/transaction/transaction.component.html 205,210 @@ -4807,6 +4843,7 @@ Show more + Mostra di più src/app/components/transaction/transaction.component.html 226,228 @@ -4823,6 +4860,7 @@ Show less + Mostra meno src/app/components/transaction/transaction.component.html 228,234 @@ -4835,6 +4873,7 @@ Show diagram + Mostra diagramma src/app/components/transaction/transaction.component.html 248,249 @@ -5019,6 +5058,7 @@ Show more inputs to reveal fee data + Mostra più input per rivelare i dati sulle commissioni src/app/components/transactions-list/transactions-list.component.html 290,293 @@ -5027,6 +5067,7 @@ remaining + rimanente src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -5035,6 +5076,7 @@ other inputs + altri input src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 12 @@ -5043,6 +5085,7 @@ other outputs + altri output src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 13 @@ -5051,6 +5094,7 @@ Input + Input src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 42 @@ -5063,6 +5107,7 @@ Output + Output src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 43 @@ -5075,6 +5120,7 @@ This transaction saved % on fees by using native SegWit + Questa transazione ha fatto risparmiare il % sulle commissioni utilizzando SegWit nativo src/app/components/tx-features/tx-features.component.html 2 @@ -5101,6 +5147,7 @@ This transaction saved % on fees by using SegWit and could save % more by fully upgrading to native SegWit + Questa transazione ha fatto risparmiare il % sulle commissioni utilizzando SegWit e avrebbe potuto risparmiare il % in più aggiornando completamente a SegWit nativo src/app/components/tx-features/tx-features.component.html 4 @@ -5109,6 +5156,7 @@ This transaction could save % on fees by upgrading to native SegWit or % by upgrading to SegWit-P2SH + Questa transazione avrebbe potuto far risparmiare il % sulle commissioni aggiornando a SegWit nativo o il % aggiornando a SegWit-P2SH src/app/components/tx-features/tx-features.component.html 6 @@ -5117,6 +5165,7 @@ This transaction uses Taproot and thereby saved at least % on fees + Questa transazione utilizza Taproot e quindi ha risparmiato almeno il % sulle commissioni src/app/components/tx-features/tx-features.component.html 12 @@ -5125,6 +5174,7 @@ Taproot + Taproot src/app/components/tx-features/tx-features.component.html 12 @@ -5150,6 +5200,7 @@ This transaction uses Taproot and already saved at least % on fees, but could save an additional % by fully using Taproot + Questa transazione utilizza Taproot e ha già fatto risparmiare almeno il % sulle commissioni, ma poteva far risparmiare un ulteriore % utilizzando completamente Taproot src/app/components/tx-features/tx-features.component.html 14 @@ -5158,6 +5209,7 @@ This transaction could save % on fees by using Taproot + Questa transazione poteva far risparmiare il % sulle commissioni utilizzando Taproot src/app/components/tx-features/tx-features.component.html 16 @@ -5166,6 +5218,7 @@ This transaction does not use Taproot + Questa transazione non utilizza Taproot src/app/components/tx-features/tx-features.component.html 18 @@ -5183,6 +5236,7 @@ This transaction supports Replace-By-Fee (RBF) allowing fee bumping + Questa transazione supporta Replace-By-Fee (RBF) che consente l'aumento delle commissioni src/app/components/tx-features/tx-features.component.html 28 @@ -5308,6 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space fornisce solo dati sulla rete Bitcoin. Non può aiutarti a recuperare fondi, confermare la tua transazione più velocemente, ecc. src/app/docs/api-docs/api-docs.component.html 13 @@ -5426,6 +5481,7 @@ Base fee + Base fee src/app/lightning/channel/channel-box/channel-box.component.html 29 @@ -5438,6 +5494,7 @@ mSats + mSats src/app/lightning/channel/channel-box/channel-box.component.html 35 @@ -5458,6 +5515,7 @@ This channel supports zero base fee routing + Questo canale supporta lo zero base fee routing src/app/lightning/channel/channel-box/channel-box.component.html 44 @@ -5466,6 +5524,7 @@ Zero base fee + Zero base fee src/app/lightning/channel/channel-box/channel-box.component.html 45 @@ -5474,6 +5533,7 @@ This channel does not support zero base fee routing + Questo canale non supporta lo zero base fee routing src/app/lightning/channel/channel-box/channel-box.component.html 50 @@ -5482,6 +5542,7 @@ Non-zero base fee + Non-zero base fee src/app/lightning/channel/channel-box/channel-box.component.html 51 @@ -5490,6 +5551,7 @@ Min HTLC + Min HTLC src/app/lightning/channel/channel-box/channel-box.component.html 57 @@ -5498,6 +5560,7 @@ Max HTLC + Max HTLC src/app/lightning/channel/channel-box/channel-box.component.html 63 @@ -5506,6 +5569,7 @@ Timelock delta + Timelock delta src/app/lightning/channel/channel-box/channel-box.component.html 69 @@ -5514,6 +5578,7 @@ channels + canali src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -5530,6 +5595,7 @@ Starting balance + Saldo iniziale src/app/lightning/channel/channel-close-box/channel-close-box.component.html 6 @@ -5539,6 +5605,7 @@ Closing balance + Saldo di chiusura src/app/lightning/channel/channel-close-box/channel-close-box.component.html 12 @@ -5548,6 +5615,7 @@ lightning channel + canale lightning src/app/lightning/channel/channel-preview.component.html 3,5 @@ -5556,6 +5624,7 @@ Inactive + Inattivo src/app/lightning/channel/channel-preview.component.html 10,11 @@ -5572,6 +5641,7 @@ Active + Attivo src/app/lightning/channel/channel-preview.component.html 11,12 @@ -5588,6 +5658,7 @@ Closed + Chiuso src/app/lightning/channel/channel-preview.component.html 12,14 @@ -5608,6 +5679,7 @@ Created + Creato src/app/lightning/channel/channel-preview.component.html 23,26 @@ -5620,6 +5692,7 @@ Capacity + Capacità src/app/lightning/channel/channel-preview.component.html 27,28 @@ -5684,6 +5757,7 @@ ppm + ppm src/app/lightning/channel/channel-preview.component.html 34,35 @@ -5704,6 +5778,7 @@ Lightning channel + Canale Lightning src/app/lightning/channel/channel.component.html 4,7 @@ -5716,6 +5791,7 @@ Last update + Ultimo aggiornamento src/app/lightning/channel/channel.component.html 40,41 @@ -5748,6 +5824,7 @@ Closing date + Data di chiusura src/app/lightning/channel/channel.component.html 44,45 @@ -5760,6 +5837,7 @@ Closed by + Chiuso da src/app/lightning/channel/channel.component.html 59,61 @@ -5768,6 +5846,7 @@ Opening transaction + Transazione di apertura src/app/lightning/channel/channel.component.html 91,92 @@ -5776,6 +5855,7 @@ Closing transaction + Transazione di chiusura src/app/lightning/channel/channel.component.html 100,102 @@ -5784,6 +5864,7 @@ Channel: + Canale: src/app/lightning/channel/channel.component.ts 37 @@ -5791,6 +5872,7 @@ Mutually closed + Chiuso collaborativamente src/app/lightning/channel/closing-type/closing-type.component.ts 20 @@ -5798,6 +5880,7 @@ Force closed + Chiusura forzata src/app/lightning/channel/closing-type/closing-type.component.ts 24 @@ -5805,6 +5888,7 @@ Force closed with penalty + Chiusura forzata con penalità src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -5812,6 +5896,7 @@ Open + Aprire src/app/lightning/channels-list/channels-list.component.html 5,7 @@ -5820,6 +5905,7 @@ No channels to display + Nessun canale da visualizzare src/app/lightning/channels-list/channels-list.component.html 29,37 @@ -5828,6 +5914,7 @@ Alias + Alias src/app/lightning/channels-list/channels-list.component.html 38,40 @@ -5864,6 +5951,7 @@ Status + Status src/app/lightning/channels-list/channels-list.component.html 40,41 @@ -5872,6 +5960,7 @@ Channel ID + ID Canale src/app/lightning/channels-list/channels-list.component.html 44,48 @@ -5880,6 +5969,7 @@ sats + sats src/app/lightning/channels-list/channels-list.component.html 63,68 @@ -5932,6 +6022,7 @@ avg + avg src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -5940,6 +6031,7 @@ med + med src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -5948,6 +6040,7 @@ Avg Capacity + Capacità Media src/app/lightning/channels-statistics/channels-statistics.component.html 13,15 @@ -5960,6 +6053,7 @@ Avg Fee Rate + Tariffa Media src/app/lightning/channels-statistics/channels-statistics.component.html 26,28 @@ -5972,6 +6066,7 @@ The average fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + La tariffa media addebitata dai nodi di routing, ignorando le tariffe > 0,5% o 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 28,30 @@ -5980,6 +6075,7 @@ Avg Base Fee + Commissione Base Media src/app/lightning/channels-statistics/channels-statistics.component.html 41,43 @@ -5992,6 +6088,7 @@ The average base fee charged by routing nodes, ignoring base fees > 5000ppm + La tariffa di base media addebitata dai nodi di routing, ignorando le tariffe di base > 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 43,45 @@ -6000,6 +6097,7 @@ Med Capacity + Capacità Media src/app/lightning/channels-statistics/channels-statistics.component.html 59,61 @@ -6008,6 +6106,7 @@ Med Fee Rate + Tariffa Media src/app/lightning/channels-statistics/channels-statistics.component.html 72,74 @@ -6016,6 +6115,7 @@ The median fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + La tariffa mediana addebitata dai nodi di routing, ignorando le tariffe > 0,5% o 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 74,76 @@ -6024,6 +6124,7 @@ Med Base Fee + Tariffa Base Media src/app/lightning/channels-statistics/channels-statistics.component.html 87,89 @@ -6032,6 +6133,7 @@ The median base fee charged by routing nodes, ignoring base fees > 5000ppm + La tariffa di base mediana addebitata dai nodi di routing, ignorando le tariffe di base > 5000 ppm src/app/lightning/channels-statistics/channels-statistics.component.html 89,91 @@ -6040,6 +6142,7 @@ Lightning node group + Gruppo di nodi Lightning src/app/lightning/group/group-preview.component.html 3,5 @@ -6052,6 +6155,7 @@ Nodes + Nodi src/app/lightning/group/group-preview.component.html 25,29 @@ -6088,6 +6192,7 @@ Liquidity + Liquidità src/app/lightning/group/group-preview.component.html 29,31 @@ -6120,6 +6225,7 @@ Channels + Canali src/app/lightning/group/group-preview.component.html 40,43 @@ -6192,6 +6298,7 @@ Average size + Dimensione media src/app/lightning/group/group-preview.component.html 44,46 @@ -6204,6 +6311,7 @@ Location + Posizione src/app/lightning/group/group.component.html 74,77 @@ -6244,6 +6352,7 @@ Network Statistics + Statistiche di Rete src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 10 @@ -6252,6 +6361,7 @@ Channels Statistics + Statistiche dei Canali src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 24 @@ -6260,6 +6370,7 @@ Lightning Network History + Cronologia della Rete Lightning src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 49 @@ -6268,6 +6379,7 @@ Liquidity Ranking + Classifica della Liquidità src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 @@ -6292,6 +6404,7 @@ Connectivity Ranking + Classifica Connettività src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 76 @@ -6304,6 +6417,7 @@ Fee distribution + Distribuzione delle commissioni src/app/lightning/node-fee-chart/node-fee-chart.component.html 2 @@ -6312,6 +6426,7 @@ Outgoing Fees + Commissioni in Uscita src/app/lightning/node-fee-chart/node-fee-chart.component.ts 170 @@ -6323,6 +6438,7 @@ Incoming Fees + Commissioni in Entrata src/app/lightning/node-fee-chart/node-fee-chart.component.ts 178 @@ -6334,6 +6450,7 @@ Percentage change past week + Variazione percentuale nell'ultima settimana src/app/lightning/node-statistics/node-statistics.component.html 5,7 @@ -6350,6 +6467,7 @@ Lightning node + Nodo Lightning src/app/lightning/node/node-preview.component.html 3,5 @@ -6366,6 +6484,7 @@ Active capacity + Capacità attiva src/app/lightning/node/node-preview.component.html 20,22 @@ -6378,6 +6497,7 @@ Active channels + Canali attivi src/app/lightning/node/node-preview.component.html 26,30 @@ -6390,6 +6510,7 @@ Country + Paese src/app/lightning/node/node-preview.component.html 44,47 @@ -6398,6 +6519,7 @@ Average channel size + Dimensione media del canale src/app/lightning/node/node.component.html 43,46 @@ -6406,6 +6528,7 @@ Avg channel distance + Distanza media del canale src/app/lightning/node/node.component.html 59,60 @@ -6414,6 +6537,7 @@ Color + Colore src/app/lightning/node/node.component.html 82,84 @@ -6422,6 +6546,7 @@ ISP + ISP src/app/lightning/node/node.component.html 89,90 @@ -6434,6 +6559,7 @@ Exclusively on Tor + Esclusivamente su Tor src/app/lightning/node/node.component.html 96,98 @@ -6442,6 +6568,7 @@ Liquidity ad + Annuncio di liquidità src/app/lightning/node/node.component.html 141,144 @@ -6450,6 +6577,7 @@ Lease fee rate + Tasso di lease src/app/lightning/node/node.component.html 147,150 @@ -6459,6 +6587,7 @@ Lease base fee + Canone base di lease src/app/lightning/node/node.component.html 155,157 @@ -6467,6 +6596,7 @@ Funding weight + Peso del finanziamento src/app/lightning/node/node.component.html 161,162 @@ -6475,6 +6605,7 @@ Channel fee rate + Tariffa del canale src/app/lightning/node/node.component.html 171,174 @@ -6484,6 +6615,7 @@ Channel base fee + Tariffa base del canale src/app/lightning/node/node.component.html 179,181 @@ -6492,6 +6624,7 @@ Compact lease + Lease compatto src/app/lightning/node/node.component.html 191,193 @@ -6500,6 +6633,7 @@ TLV extension records + Record di estensione TLV src/app/lightning/node/node.component.html 202,205 @@ -6508,6 +6642,7 @@ Open channels + Canali aperti src/app/lightning/node/node.component.html 243,246 @@ -6516,6 +6651,7 @@ Closed channels + Canali chiusi src/app/lightning/node/node.component.html 247,250 @@ -6524,6 +6660,7 @@ Node: + Nodo: src/app/lightning/node/node.component.ts 60 @@ -6531,6 +6668,7 @@ (Tor nodes excluded) + (nodi Tor esclusi) src/app/lightning/nodes-channels-map/nodes-channels-map.component.html 8,11 @@ -6551,6 +6689,7 @@ Lightning Nodes Channels World Map + Mappa Mondiale dei Canali tra Nodi Lightning src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 69 @@ -6558,6 +6697,7 @@ No geolocation data available + Nessun dato di geolocalizzazione disponibile src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 219,214 @@ -6565,6 +6705,7 @@ Active channels map + Mappa dei canali attivi src/app/lightning/nodes-channels/node-channels.component.html 2,3 @@ -6573,6 +6714,7 @@ Indexing in progress + Indicizzazione in corso src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 121,116 @@ -6584,6 +6726,7 @@ Clearnet and Darknet + Clearnet e Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6595,6 +6738,7 @@ Clearnet Only (IPv4, IPv6) + Solo Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6606,6 +6750,7 @@ Darknet Only (Tor, I2P, cjdns) + Solo Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6617,6 +6762,7 @@ Share + Condividere src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html 29,31 @@ -6629,6 +6775,7 @@ nodes + nodi src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -6648,6 +6795,7 @@ BTC capacity + Capacità BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 105,103 @@ -6655,6 +6803,7 @@ Lightning nodes in + Nodi Lightning in src/app/lightning/nodes-per-country/nodes-per-country.component.html 3,4 @@ -6663,6 +6812,7 @@ ISP Count + Conteggio ISP src/app/lightning/nodes-per-country/nodes-per-country.component.html 34,38 @@ -6671,6 +6821,7 @@ Top ISP + Top ISP src/app/lightning/nodes-per-country/nodes-per-country.component.html 38,40 @@ -6679,6 +6830,7 @@ Lightning nodes in + Nodi Lightning in src/app/lightning/nodes-per-country/nodes-per-country.component.ts 35 @@ -6686,6 +6838,7 @@ Clearnet Capacity + Capacità Clearnet src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6698,6 +6851,7 @@ How much liquidity is running on nodes advertising at least one clearnet IP address + Quanta liquidità è in esecuzione sui nodi che pubblicizzano almeno un indirizzo IP clearnet src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 8,9 @@ -6706,6 +6860,7 @@ Unknown Capacity + Capacità Sconosciuta src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 13,15 @@ -6718,6 +6873,7 @@ How much liquidity is running on nodes which ISP was not identifiable + Quanta liquidità è in esecuzione su nodi il cui ISP non era identificabile src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 15,16 @@ -6726,6 +6882,7 @@ Tor Capacity + Capacità Tor src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 20,22 @@ -6738,6 +6895,7 @@ How much liquidity is running on nodes advertising only Tor addresses + Quanta liquidità è in esecuzione sui nodi che pubblicizzano solo indirizzi Tor src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 22,23 @@ -6746,6 +6904,7 @@ Top 100 ISPs hosting LN nodes + Top 100 ISP che ospitano nodi LN src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 31,33 @@ -6754,6 +6913,7 @@ BTC + BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 159,157 @@ -6765,6 +6925,7 @@ Lightning ISP + ISP Lightning src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 3,5 @@ -6773,6 +6934,7 @@ Top country + Il miglior paese src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 39,41 @@ -6785,6 +6947,7 @@ Top node + Il miglior nodo src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 45,48 @@ -6793,6 +6956,7 @@ Lightning nodes on ISP: [AS] + Nodi Lightning su ISP: [AS ] src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts 44 @@ -6804,6 +6968,7 @@ Lightning nodes on ISP: + Nodi Lightning sull'ISP: src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 2,4 @@ -6812,6 +6977,7 @@ ASN + ASN src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 11,14 @@ -6820,6 +6986,7 @@ Active nodes + Nodi attivi src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 14,18 @@ -6828,6 +6995,7 @@ Top 100 oldest lightning nodes + I 100 nodi Lightning più vecchi src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.html 3,7 @@ -6836,6 +7004,7 @@ Oldest lightning nodes + Nodi lightning più vecchi src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.ts 27 @@ -6843,6 +7012,7 @@ Oldest nodes + Nodi più vecchi src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html 36 @@ -6851,6 +7021,7 @@ Top lightning nodes + Principali nodi lightning src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.ts 22 @@ -6858,6 +7029,7 @@ Indexing in progress + Indicizzazione in corso src/app/lightning/statistics-chart/lightning-statistics-chart.component.html 52,55 diff --git a/frontend/src/locale/messages.ko.xlf b/frontend/src/locale/messages.ko.xlf index c8ba64090..16f7a29e8 100644 --- a/frontend/src/locale/messages.ko.xlf +++ b/frontend/src/locale/messages.ko.xlf @@ -1475,6 +1475,7 @@ Community Integrations + 커뮤니티 통합 src/app/components/about/about.component.html 181,183 @@ -2134,6 +2135,7 @@ not available + 사용할 수 없음 src/app/components/block-overview-graph/block-overview-graph.component.html 5 @@ -2336,6 +2338,7 @@ Audit status + 감사 상태 src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 36 @@ -2344,6 +2347,7 @@ Match + 일치 src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 38 @@ -2352,6 +2356,7 @@ Removed + 제거됨 src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 39 @@ -2360,6 +2365,7 @@ Marginal fee rate + 한계 수수료율 src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 40 @@ -2372,6 +2378,7 @@ Recently broadcasted + 최근 전파됨 src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 41 @@ -2380,6 +2387,7 @@ Added + 추가됨 src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 42 @@ -2388,6 +2396,7 @@ Block Prediction Accuracy + 블록 예측 정확도 src/app/components/block-prediction-graph/block-prediction-graph.component.html 6,8 @@ -2404,6 +2413,7 @@ No data to display yet. Try again later. + 아직 표시할 데이터가 없습니다. 나중에 다시 시도해주세요. src/app/components/block-prediction-graph/block-prediction-graph.component.ts 108,103 @@ -2419,6 +2429,7 @@ Match rate + 일치율 src/app/components/block-prediction-graph/block-prediction-graph.component.ts 189,187 @@ -2528,6 +2539,7 @@ Size per weight + 무게당 사이즈 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts 200,199 @@ -2642,6 +2654,7 @@ Health + 건강도 src/app/components/block/block.component.html 56 @@ -2658,6 +2671,7 @@ Unknown + 알 수 없음 src/app/components/block/block.component.html 67,70 @@ -2736,6 +2750,7 @@ Subsidy + fees + 보상금 + 수수료 src/app/components/block/block.component.html 153,156 @@ -2749,6 +2764,7 @@ Expected + 예상 src/app/components/block/block.component.html 216 @@ -2757,6 +2773,7 @@ beta + 베타 src/app/components/block/block.component.html 216,217 @@ -2769,6 +2786,7 @@ Actual + 실제 src/app/components/block/block.component.html 218,222 @@ -2860,6 +2878,7 @@ Audit + 감사 src/app/components/block/block.component.html 297,301 @@ -3184,6 +3203,7 @@ blocks expected + 예상한 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3192,6 +3212,7 @@ block expected + 예상한 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3200,6 +3221,7 @@ blocks mined + 채굴된 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3208,6 +3230,7 @@ block mined + 채굴된 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3216,6 +3239,7 @@ blocks remaining + 남은 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3224,6 +3248,7 @@ block remaining + 남은 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3232,6 +3257,7 @@ blocks ahead + 앞서있는 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3240,6 +3266,7 @@ block ahead + 앞서있는 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3248,6 +3275,7 @@ blocks behind + 뒤처진 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3256,6 +3284,7 @@ block behind + 뒤처진 개 블록 src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3264,6 +3293,7 @@ Average block time + 평균 블록 생성 시간 src/app/components/difficulty/difficulty.component.html 42,45 @@ -3801,6 +3831,7 @@ Pools luck (1 week) + 채굴 풀들의 운 (1주) src/app/components/pool-ranking/pool-ranking.component.html 9 @@ -3809,6 +3840,7 @@ Pools luck + 채굴 풀들의 운 src/app/components/pool-ranking/pool-ranking.component.html 9,11 @@ -3817,6 +3849,7 @@ The overall luck of all mining pools over the past week. A luck bigger than 100% means the average block time for the current epoch is less than 10 minutes. + 지난 한 주 동안의 모든 채굴 풀의 전반적인 운입니다. 운이 100%보다 크면 현재 에포크의 평균 블록 생성 시간이 10분 미만이라는 뜻입니다. src/app/components/pool-ranking/pool-ranking.component.html 11,15 @@ -3825,6 +3858,7 @@ Pools count (1w) + 채굴 풀 개수 (1주) src/app/components/pool-ranking/pool-ranking.component.html 17 @@ -3833,6 +3867,7 @@ Pools count + 채굴 풀 개수 src/app/components/pool-ranking/pool-ranking.component.html 17,19 @@ -3930,7 +3965,7 @@ Pools Count (1w) - 채굴 풀 개수 + 채굴 풀 개수 (1주) src/app/components/pool-ranking/pool-ranking.component.html 158,160 @@ -4243,6 +4278,7 @@ Avg Block Fees + 평균 블록 수수료 src/app/components/reward-stats/reward-stats.component.html 17 @@ -4272,6 +4308,7 @@ Avg Tx Fee + 평균 거래 수수료 src/app/components/reward-stats/reward-stats.component.html 30 @@ -4316,6 +4353,7 @@ Explore the full Bitcoin ecosystem + 비트코인 생태계 전체를 탐험하세요. src/app/components/search-form/search-form.component.html 4,5 @@ -4760,6 +4798,7 @@ Flow + 흐름 src/app/components/transaction/transaction.component.html 202,205 @@ -4773,6 +4812,7 @@ Hide diagram + 도표 숨기기 src/app/components/transaction/transaction.component.html 205,210 diff --git a/frontend/src/locale/messages.sv.xlf b/frontend/src/locale/messages.sv.xlf index 9d7689760..638a8403d 100644 --- a/frontend/src/locale/messages.sv.xlf +++ b/frontend/src/locale/messages.sv.xlf @@ -3993,9 +3993,9 @@ 58 - - blocks - block + + blocks + block src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4004,6 +4004,42 @@ src/app/components/pool-ranking/pool-ranking.component.ts 168,167 + + src/app/components/pool-ranking/pool-ranking.component.ts + 203,201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 206,205 + + + + Other () + Övriga () + + src/app/components/pool-ranking/pool-ranking.component.ts + 201 + + + src/app/components/pool-ranking/pool-ranking.component.ts + 205 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 119,114 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 136 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 173,168 + + + src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts + 190 + mining pool @@ -5551,6 +5587,10 @@ src/app/lightning/channels-list/channels-list.component.html 123,124 + + src/app/lightning/nodes-map/nodes-map.component.ts + 211,208 + lightning.x-channels @@ -6250,6 +6290,10 @@ src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts 194,193 + + src/app/lightning/statistics-chart/lightning-statistics-chart.component.ts + 259,257 + lightning.channels @@ -6730,19 +6774,23 @@ lightning.share - nodes - noder + nodes + noder src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 103,102 + 104,103 + + + src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts + 137,136 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 157,156 + 158,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 189,188 + 191,190 @@ -6750,7 +6798,7 @@ BTC-kapacitet src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts - 104,102 + 105,103 @@ -6868,11 +6916,11 @@ BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 158,156 + 159,157 src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts - 190,188 + 192,190 diff --git a/frontend/src/locale/messages.th.xlf b/frontend/src/locale/messages.th.xlf index a0adc00e4..8f423ffa8 100644 --- a/frontend/src/locale/messages.th.xlf +++ b/frontend/src/locale/messages.th.xlf @@ -1475,6 +1475,7 @@ Community Integrations + การร่วมมือกับคอมมูนิตี้ src/app/components/about/about.component.html 181,183 @@ -2134,6 +2135,7 @@ not available + ไม่สามารถใช้ได้ src/app/components/block-overview-graph/block-overview-graph.component.html 5 @@ -2336,6 +2338,7 @@ Audit status + สถานะการตรวจสอบ src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 36 @@ -2344,6 +2347,7 @@ Match + ตรงกัน src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 38 @@ -2352,6 +2356,7 @@ Removed + ถูกลบ src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 39 @@ -2360,6 +2365,7 @@ Marginal fee rate + อัตราค่าธรรมเนียมเพิ่มเติม src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 40 @@ -2372,6 +2378,7 @@ Recently broadcasted + ที่ประกาศไปล่าสุด src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 41 @@ -2380,6 +2387,7 @@ Added + ถูกเพิ่ม src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 42 @@ -2388,6 +2396,7 @@ Block Prediction Accuracy + ความแม่นยำในการทำนายบล็อก src/app/components/block-prediction-graph/block-prediction-graph.component.html 6,8 @@ -2404,6 +2413,7 @@ No data to display yet. Try again later. + ไม่มีข้อมูลที่จะแสดง โปรดลองอีกครั้งในภายหลัง src/app/components/block-prediction-graph/block-prediction-graph.component.ts 108,103 @@ -2419,6 +2429,7 @@ Match rate + เรทตรงกัน src/app/components/block-prediction-graph/block-prediction-graph.component.ts 189,187 @@ -2528,6 +2539,7 @@ Size per weight + ขนาดต่อน้ำหนัก src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts 200,199 @@ -2539,6 +2551,7 @@ Block + บล็อก src/app/components/block/block-preview.component.html 3,7 @@ -2641,6 +2654,7 @@ Health + สถานะ src/app/components/block/block.component.html 56 @@ -2657,6 +2671,7 @@ Unknown + ไม่ทราบ src/app/components/block/block.component.html 67,70 @@ -2735,6 +2750,7 @@ Subsidy + fees + เงินอุดหนุน + ค่าธรรมเนียม src/app/components/block/block.component.html 153,156 @@ -2748,6 +2764,7 @@ Expected + ที่คาดหวัง src/app/components/block/block.component.html 216 @@ -2756,6 +2773,7 @@ beta + เบต้า src/app/components/block/block.component.html 216,217 @@ -2768,6 +2786,7 @@ Actual + ความจริง src/app/components/block/block.component.html 218,222 @@ -2776,6 +2795,7 @@ Expected Block + บล็อกที่คาดหวัง src/app/components/block/block.component.html 222 @@ -2784,6 +2804,7 @@ Actual Block + บล็อกจริง src/app/components/block/block.component.html 231 @@ -2857,6 +2878,7 @@ Audit + การตรวจสอบ src/app/components/block/block.component.html 297,301 @@ -3260,6 +3282,7 @@ Average block time + เวลาบล็อกโดยเฉลี่ย src/app/components/difficulty/difficulty.component.html 42,45 @@ -3489,6 +3512,7 @@ Lightning Network Capacity + ความจุเน็ตเวิร์ค Lightning src/app/components/graphs/graphs.component.html 35 @@ -3509,6 +3533,7 @@ Lightning Nodes Per ISP + จำนวนโหนด Lightning ต่อ ISP src/app/components/graphs/graphs.component.html 37 @@ -3521,6 +3546,7 @@ Lightning Nodes Per Country + จำนวนโหนด Lightning ต่อประเทศ src/app/components/graphs/graphs.component.html 39 @@ -3537,6 +3563,7 @@ Lightning Nodes World Map + แผนที่โหนด Ligntning src/app/components/graphs/graphs.component.html 41 @@ -6533,6 +6560,7 @@ Indexing in progress + กำลังทำการจัดเรียงข้อมูล src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 121,116 @@ -6544,6 +6572,7 @@ Clearnet and Darknet + Clearnet และ Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6555,6 +6584,7 @@ Clearnet Only (IPv4, IPv6) + Clearnet เท่านั้น (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6566,6 +6596,7 @@ Darknet Only (Tor, I2P, cjdns) + Darknet เท่านั้น (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6577,6 +6608,7 @@ Share + แชร์ src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html 29,31 @@ -6608,6 +6640,7 @@ BTC capacity + ความจุ BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 105,103 @@ -6615,6 +6648,7 @@ Lightning nodes in + โหนด lightning ใน src/app/lightning/nodes-per-country/nodes-per-country.component.html 3,4 @@ -6623,6 +6657,7 @@ ISP Count + จำนวน ISP src/app/lightning/nodes-per-country/nodes-per-country.component.html 34,38 @@ -6631,6 +6666,7 @@ Top ISP + ISP ชั้นนำ src/app/lightning/nodes-per-country/nodes-per-country.component.html 38,40 @@ -6646,6 +6682,7 @@ Clearnet Capacity + ความจุ clearnet src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6666,6 +6703,7 @@ Unknown Capacity + ไม่ทราบความจุ src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 13,15 @@ -6686,6 +6724,7 @@ Tor Capacity + ความจุของ Tor src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 20,22 @@ -6714,6 +6753,7 @@ BTC + BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 159,157 @@ -6725,6 +6765,7 @@ Lightning ISP + Lightning ISP src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 3,5 @@ -6772,6 +6813,7 @@ ASN + ASN src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 11,14 @@ -6780,6 +6822,7 @@ Active nodes + โหนดที่ใช้งานอยู่ src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 14,18 @@ -6803,6 +6846,7 @@ Oldest nodes + โหนดที่เก่าที่สุด src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html 36 @@ -6818,6 +6862,7 @@ Indexing in progress + กำลังทำการจัดเรียงข้อมูล src/app/lightning/statistics-chart/lightning-statistics-chart.component.html 52,55 diff --git a/frontend/src/locale/messages.uk.xlf b/frontend/src/locale/messages.uk.xlf index 5794afcc5..e24676d08 100644 --- a/frontend/src/locale/messages.uk.xlf +++ b/frontend/src/locale/messages.uk.xlf @@ -3194,7 +3194,7 @@ Next Halving - Наступне зменшення винагороди + Наступний халвінг src/app/components/difficulty-mining/difficulty-mining.component.html 50,52 @@ -3203,6 +3203,7 @@ blocks expected + блоків очікується src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + блок очікується src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + блоків знайдено src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + блок знайдено src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + блоків лишається src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + блок лишається src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + блоків попереду src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + блок попереду src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + блоків позаду src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + блок позаду src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + Середній час блоків src/app/components/difficulty/difficulty.component.html 42,45 @@ -3517,7 +3528,7 @@ Lightning Network Capacity - Пропускна спроможність Lightning + Місткість Lightning src/app/components/graphs/graphs.component.html 35 @@ -3984,6 +3995,7 @@ blocks + блоків src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4003,6 +4015,7 @@ Other () + Інші () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4565,6 +4578,7 @@ In ~ + Через ~ src/app/components/time/time.component.ts 126 @@ -5678,7 +5692,7 @@ Capacity - Пропускна спроможність + Місткість src/app/lightning/channel/channel-preview.component.html 27,28 @@ -6026,7 +6040,7 @@ Avg Capacity - Середня пропускна спроможність + Середня місткість src/app/lightning/channels-statistics/channels-statistics.component.html 13,15 @@ -6039,7 +6053,7 @@ Avg Fee Rate - Середня ставка комісії + Середній тариф src/app/lightning/channels-statistics/channels-statistics.component.html 26,28 @@ -6052,7 +6066,7 @@ The average fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm - Середня ставка комісії, що стягується нодами маршрутизації, без урахування ставок комісії > 0.5% або 5000ppm + Середній тариф, що стягується нодами маршрутизації, без урахування ставок комісії > 0.5% або 5000ppm src/app/lightning/channels-statistics/channels-statistics.component.html 28,30 @@ -6061,7 +6075,7 @@ Avg Base Fee - Середня базова комісія + Середня комісія src/app/lightning/channels-statistics/channels-statistics.component.html 41,43 @@ -6074,7 +6088,7 @@ The average base fee charged by routing nodes, ignoring base fees > 5000ppm - Середня базова комісія, що стягується нодами маршрутизації, без урахування базової комісії > 5000ppm + Середня комісія, що стягується нодами маршрутизації, без урахування комісії > 5000ppm src/app/lightning/channels-statistics/channels-statistics.component.html 43,45 @@ -6470,7 +6484,7 @@ Active capacity - Активна пропускна спроможність + Активна місткість src/app/lightning/node/node-preview.component.html 20,22 @@ -6712,6 +6726,7 @@ Clearnet and Darknet + Клірнет та Даркнет src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6723,6 +6738,7 @@ Clearnet Only (IPv4, IPv6) + Тільки Клірнет (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6734,6 +6750,7 @@ Darknet Only (Tor, I2P, cjdns) + Тільки Даркнет (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6758,6 +6775,7 @@ nodes + нод src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -6820,7 +6838,7 @@ Clearnet Capacity - Пропускна спроможність Клірнету + Місткість Клірнету src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 6,8 @@ -6842,7 +6860,7 @@ Unknown Capacity - Пропускна спроможність невідома + Місткість невідома src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 13,15 @@ -6864,7 +6882,7 @@ Tor Capacity - Пропускна спроможність Tor + Місткість Tor src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 20,22 diff --git a/frontend/src/locale/messages.zh.xlf b/frontend/src/locale/messages.zh.xlf index d2ec0f162..eddfdf5d7 100644 --- a/frontend/src/locale/messages.zh.xlf +++ b/frontend/src/locale/messages.zh.xlf @@ -11,6 +11,7 @@ Slide of + Slide of node_modules/src/carousel/carousel.ts 175,181 @@ -4544,6 +4545,7 @@ In ~ + 之内 src/app/components/time/time.component.ts 126 From eefe343973e04fce70daa1799e3ff935a40ec9b0 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 16 Mar 2023 09:54:12 -0400 Subject: [PATCH 086/782] Add faqs on mempool size and memory usage --- frontend/src/app/docs/api-docs/api-docs-data.ts | 14 ++++++++++++++ .../src/app/docs/api-docs/api-docs.component.html | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/frontend/src/app/docs/api-docs/api-docs-data.ts b/frontend/src/app/docs/api-docs/api-docs-data.ts index 62d031613..decde2845 100644 --- a/frontend/src/app/docs/api-docs/api-docs-data.ts +++ b/frontend/src/app/docs/api-docs/api-docs-data.ts @@ -8859,6 +8859,20 @@ export const faqData = [ fragment: "what-is-full-mempool", title: "What does it mean for the mempool to be \"full\"?", }, + { + type: "endpoint", + category: "advanced", + showConditions: bitcoinNetworks, + fragment: "how-big-is-mempool.space-mempool", + title: "How big is the mempool.space mempool?", + }, + { + type: "endpoint", + category: "advanced", + showConditions: bitcoinNetworks, + fragment: "what-is-memory-usage", + title: "What is memory usage?", + }, { type: "endpoint", category: "advanced", diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index f5bf519bf..b45279bc3 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -207,6 +207,18 @@

When a Bitcoin transaction is made, it is stored in a Bitcoin node's mempool before it is confirmed into a block. When the rate of incoming transactions exceeds the rate transactions are confirmed, the mempool grows in size.

By default, Bitcoin Core allocates 300MB of memory for its mempool, so when a node's mempool grows big enough to use all 300MB of allocated memory, we say it's "full".

Once a node's mempool is using all of its allocated memory, it will start rejecting new transactions below a certain feerate threshold—so when this is the case, be extra sure to set a feerate that (at a minimum) exceeds that threshold. The current threshold feerate (and memory usage) are displayed right on Mempool's front page.

+ +

mempool.space uses 2 Bitcoin nodes to obtain data: one with a standard 300MB memory allocation for its mempool (call this Node A), and another with a much larger memory allocation for its mempool (call this Node B).

+

Most nodes on the Bitcoin network are configured to run like Node A. When all 300MB of memory are used up, the node will start rejecting transactions below a certain feerate from entering its mempool. Running a standard node allows mempool.space to tell you what this feerate is, so you can use a feerate that is high enough to get your transaction widely propagated (i.e. accepted into as many nodes' mempools as possible).

+

Node B's mempool is so big that it doesn't ever fill up, so it never rejects transactions. This allows for mempool.space to provide you with information on any pending transaction it has received—no matter how congested the mempool is, and no matter how deep in the queue the transaction is.

+
+ + +

Memory usage on the front page indicates the amount of system memory used by a Bitcoin node's mempool at a particular moment in time. The amount of memory used by a node's mempool is always more than the total size of all pending transactions in its mempool due to indexes, pointers, and other overhead for storage and processing.

+

When mempools fill up, you may notice memory usage on mempool.space go beyond 300MB. This is because, as explained above, mempool.space runs a node with a very high mempool memory allocation—so it never rejects (or evicts) transactions. If memory usage shows 600MB, for example, this just means that a node that stores all the transactions it receives will use about 600MB of memory for its mempool at that moment in time. It's another data point to give you an idea of how congested the network is.

+

A Bitcoin node running the default 300MB setting for mempool memory allocation, like most Raspberry Pi nodes, will never go past 300MB of memory usage.

+
+

When a new block is found, mining pools send miners a block template with no transactions so they can start searching for the next block as soon as possible. They send a block template full of transactions right afterward, but a full block template is a bigger data transfer and takes slightly longer to reach miners.

In this intervening time, which is usually no more than 1-2 seconds, miners sometimes get lucky and find a new block using the empty block template.

From 377f71eb52f795c37f4158453623eb28f5e4449a Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Fri, 17 Mar 2023 08:01:15 -0400 Subject: [PATCH 087/782] Integrate feedback to memory usage faqs --- frontend/src/app/docs/api-docs/api-docs-data.ts | 4 ++-- .../src/app/docs/api-docs/api-docs.component.html | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/docs/api-docs/api-docs-data.ts b/frontend/src/app/docs/api-docs/api-docs-data.ts index decde2845..04cd65d4e 100644 --- a/frontend/src/app/docs/api-docs/api-docs-data.ts +++ b/frontend/src/app/docs/api-docs/api-docs-data.ts @@ -8863,8 +8863,8 @@ export const faqData = [ type: "endpoint", category: "advanced", showConditions: bitcoinNetworks, - fragment: "how-big-is-mempool.space-mempool", - title: "How big is the mempool.space mempool?", + fragment: "how-big-is-mempool-used-by-mempool.space", + title: "How big is the mempool used by mempool.space?", }, { type: "endpoint", diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index b45279bc3..68c022afe 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -207,16 +207,16 @@

When a Bitcoin transaction is made, it is stored in a Bitcoin node's mempool before it is confirmed into a block. When the rate of incoming transactions exceeds the rate transactions are confirmed, the mempool grows in size.

By default, Bitcoin Core allocates 300MB of memory for its mempool, so when a node's mempool grows big enough to use all 300MB of allocated memory, we say it's "full".

Once a node's mempool is using all of its allocated memory, it will start rejecting new transactions below a certain feerate threshold—so when this is the case, be extra sure to set a feerate that (at a minimum) exceeds that threshold. The current threshold feerate (and memory usage) are displayed right on Mempool's front page.

- -

mempool.space uses 2 Bitcoin nodes to obtain data: one with a standard 300MB memory allocation for its mempool (call this Node A), and another with a much larger memory allocation for its mempool (call this Node B).

-

Most nodes on the Bitcoin network are configured to run like Node A. When all 300MB of memory are used up, the node will start rejecting transactions below a certain feerate from entering its mempool. Running a standard node allows mempool.space to tell you what this feerate is, so you can use a feerate that is high enough to get your transaction widely propagated (i.e. accepted into as many nodes' mempools as possible).

-

Node B's mempool is so big that it doesn't ever fill up, so it never rejects transactions. This allows for mempool.space to provide you with information on any pending transaction it has received—no matter how congested the mempool is, and no matter how deep in the queue the transaction is.

+ +

mempool.space uses multiple Bitcoin nodes to obtain data: some with the default 300MB mempool memory limit (call these Small Nodes) and others with a much larger mempool memory limit (call these Big Nodes).

+

Many nodes on the Bitcoin network are configured to run with the default 300MB mempool memory setting. When all 300MB of memory are used up, such nodes will reject transactions below a certain threshold feerate. Running Small Nodes allows mempool.space to tell you what this threshold feerate is—this is the "Purging" feerate that shows on the front page when mempools are full, which you can use to be reasonably sure that your transaction will be widely propagated.

+

Big Node mempools are so big that they don't need to reject (or purge) transactions. Such nodes allow for mempool.space to provide you with information on any pending transaction it has received—no matter how congested the mempool is, and no matter how low-feerate or low-priority the transaction is.

-

Memory usage on the front page indicates the amount of system memory used by a Bitcoin node's mempool at a particular moment in time. The amount of memory used by a node's mempool is always more than the total size of all pending transactions in its mempool due to indexes, pointers, and other overhead for storage and processing.

-

When mempools fill up, you may notice memory usage on mempool.space go beyond 300MB. This is because, as explained above, mempool.space runs a node with a very high mempool memory allocation—so it never rejects (or evicts) transactions. If memory usage shows 600MB, for example, this just means that a node that stores all the transactions it receives will use about 600MB of memory for its mempool at that moment in time. It's another data point to give you an idea of how congested the network is.

-

A Bitcoin node running the default 300MB setting for mempool memory allocation, like most Raspberry Pi nodes, will never go past 300MB of memory usage.

+

Memory usage on the front page refers to the real-time amount of system memory used by a Bitcoin node's mempool. This memory usage number is always higher than the total size of all pending transactions in the mempool due to indexes, pointers, and other overhead used by Bitcoin Core for storage and processing.

+

mempool.space shows memory usage of a node that has a very high mempool memory limit (more on this above). As a result, when mempools fill up, you may notice memory usage on mempool.space go beyond 300MB. This is not a mistake—this memory usage figure is high because it's for Bitcoin node that isn't rejecting (or evicting) transactions. Consider it to be another data point to give you an idea of how congested the mempool is relative to the default memory limit of 300MB.

+

A Bitcoin node running the default 300MB mempool memory limit, like most Raspberry Pi nodes, will never go past 300MB of memory usage.

From b0a0ad11b471a2bbd7e48ed15eaf873c7334424c Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Fri, 17 Mar 2023 08:24:37 -0400 Subject: [PATCH 088/782] Show mempool.space memory usage faq on official --- frontend/src/app/docs/api-docs/api-docs-data.ts | 1 + frontend/src/app/docs/api-docs/api-docs-nav.component.html | 2 +- frontend/src/app/docs/api-docs/api-docs-nav.component.ts | 2 ++ frontend/src/app/docs/api-docs/api-docs.component.html | 4 ++-- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/docs/api-docs/api-docs-data.ts b/frontend/src/app/docs/api-docs/api-docs-data.ts index 04cd65d4e..e6ed38a77 100644 --- a/frontend/src/app/docs/api-docs/api-docs-data.ts +++ b/frontend/src/app/docs/api-docs/api-docs-data.ts @@ -8865,6 +8865,7 @@ export const faqData = [ showConditions: bitcoinNetworks, fragment: "how-big-is-mempool-used-by-mempool.space", title: "How big is the mempool used by mempool.space?", + options: { officialOnly: true }, }, { type: "endpoint", diff --git a/frontend/src/app/docs/api-docs/api-docs-nav.component.html b/frontend/src/app/docs/api-docs/api-docs-nav.component.html index 0353d5fb0..ec1cde38f 100644 --- a/frontend/src/app/docs/api-docs/api-docs-nav.component.html +++ b/frontend/src/app/docs/api-docs/api-docs-nav.component.html @@ -1,4 +1,4 @@

{{ item.title }}

- {{ item.title }} + {{ item.title }}
diff --git a/frontend/src/app/docs/api-docs/api-docs-nav.component.ts b/frontend/src/app/docs/api-docs/api-docs-nav.component.ts index 439f20339..6e804de46 100644 --- a/frontend/src/app/docs/api-docs/api-docs-nav.component.ts +++ b/frontend/src/app/docs/api-docs/api-docs-nav.component.ts @@ -16,6 +16,7 @@ export class ApiDocsNavComponent implements OnInit { env: Env; tabData: any[]; auditEnabled: boolean; + officialMempoolInstance: boolean; constructor( private stateService: StateService @@ -23,6 +24,7 @@ export class ApiDocsNavComponent implements OnInit { ngOnInit(): void { this.env = this.stateService.env; + this.officialMempoolInstance = this.env.OFFICIAL_MEMPOOL_SPACE; this.auditEnabled = this.env.AUDIT; if (this.whichTab === 'rest') { this.tabData = restApiDocsData; diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index 68c022afe..8d274625a 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -16,7 +16,7 @@
-
+

{{ item.title }}

24h1wAllBlocks 24h1wAll
+
+
+
{{ item.title }}{{ item.category }}
@@ -215,7 +215,7 @@

Memory usage on the front page refers to the real-time amount of system memory used by a Bitcoin node's mempool. This memory usage number is always higher than the total size of all pending transactions in the mempool due to indexes, pointers, and other overhead used by Bitcoin Core for storage and processing.

-

mempool.space shows memory usage of a node that has a very high mempool memory limit (more on this above). As a result, when mempools fill up, you may notice memory usage on mempool.space go beyond 300MB. This is not a mistake—this memory usage figure is high because it's for Bitcoin node that isn't rejecting (or evicting) transactions. Consider it to be another data point to give you an idea of how congested the mempool is relative to the default memory limit of 300MB.

+

mempool.space shows the memory usage of a Bitcoin node that has a very high mempool memory limit. As a result, when mempools fill up, you may notice memory usage on mempool.space go beyond 300MB. This is not a mistake—this memory usage figure is high because it's for a Bitcoin node that isn't rejecting (or evicting) transactions. Consider it to be another data point to give you an idea of how congested the mempool is relative to the default memory limit of 300MB.

A Bitcoin node running the default 300MB mempool memory limit, like most Raspberry Pi nodes, will never go past 300MB of memory usage.

From 7c2493f3fa5f359c2dd06014305199175d8e1660 Mon Sep 17 00:00:00 2001 From: wiz Date: Fri, 17 Mar 2023 22:07:48 +0900 Subject: [PATCH 089/782] ops: Bump elementsd to v22.1 --- production/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/production/install b/production/install index fb47629d4..548dc6be7 100755 --- a/production/install +++ b/production/install @@ -357,7 +357,7 @@ ELEMENTS_REPO_URL=https://github.com/ElementsProject/elements ELEMENTS_REPO_NAME=elements ELEMENTS_REPO_BRANCH=master #ELEMENTS_LATEST_RELEASE=$(curl -s https://api.github.com/repos/ElementsProject/elements/releases/latest|grep tag_name|head -1|cut -d '"' -f4) -ELEMENTS_LATEST_RELEASE=elements-0.21.0.2 +ELEMENTS_LATEST_RELEASE=elements-22.1 echo -n '.' BITCOIN_ELECTRS_REPO_URL=https://github.com/blockstream/electrs From ec8a46ede6792437178a9bbcdf4a52405262fbb5 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 18 Mar 2023 15:33:57 +0900 Subject: [PATCH 090/782] Pulling from transifex --- frontend/src/locale/messages.fr.xlf | 40 +++++++++--------- frontend/src/locale/messages.it.xlf | 60 +++++++++++++-------------- frontend/src/locale/messages.mk.xlf | 3 +- frontend/src/locale/messages.zh.xlf | 63 +++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 51 deletions(-) diff --git a/frontend/src/locale/messages.fr.xlf b/frontend/src/locale/messages.fr.xlf index 9bf9db7c0..4322b5be3 100644 --- a/frontend/src/locale/messages.fr.xlf +++ b/frontend/src/locale/messages.fr.xlf @@ -487,7 +487,7 @@ Block : - Bloc : + Bloc : src/app/bisq/bisq-block/bisq-block.component.ts 89 @@ -842,7 +842,7 @@ Amount () - Montant ( ) + Montant () src/app/bisq/bisq-market/bisq-market.component.html 112,113 @@ -1109,7 +1109,7 @@ confirmation - confirmation + confirmation src/app/bisq/bisq-transaction/bisq-transaction.component.html 20,21 @@ -1131,7 +1131,7 @@ confirmations - confirmations + confirmations src/app/bisq/bisq-transaction/bisq-transaction.component.html 21,22 @@ -1234,7 +1234,7 @@ Transaction: - Transaction : + Transaction: src/app/bisq/bisq-transaction/bisq-transaction.component.ts 50 @@ -1611,7 +1611,7 @@ Address: - Adresse : + Adresse: src/app/components/address/address-preview.component.ts 70 @@ -1800,7 +1800,7 @@ Asset: - Actif : + Actif: src/app/components/asset/asset.component.ts 75 @@ -3203,7 +3203,7 @@ blocks expected - blocs attendus + blocs attendus src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3221,7 +3221,7 @@ blocks mined - blocs trouvés + blocs trouvés src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3230,7 +3230,7 @@ block mined - bloc trouvé + bloc trouvé src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3239,7 +3239,7 @@ blocks remaining - blocs restants + blocs restants src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3248,7 +3248,7 @@ block remaining - bloc restant + bloc restant src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3257,7 +3257,7 @@ blocks ahead - blocs d'avance + blocs d'avance src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3266,7 +3266,7 @@ block ahead - bloc d'avance + bloc d'avance src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3275,7 +3275,7 @@ blocks behind - blocs de retard + blocs de retard src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3284,7 +3284,7 @@ block behind - bloc de retard + bloc de retard src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -4578,7 +4578,7 @@ In ~ - Dans ~ + Dans ~ src/app/components/time/time.component.ts 126 @@ -5200,7 +5200,7 @@ This transaction uses Taproot and already saved at least % on fees, but could save an additional % by fully using Taproot - Cette transaction utilise Taproot et a déjà économisé au moins  % sur les frais, mais pourrait économiser  % supplémentaires en utilisant pleinement Taproot + Cette transaction utilise Taproot et a déjà économisé au moins % sur les frais, mais pourrait économiser % supplémentaires en utilisant pleinement Taproot src/app/components/tx-features/tx-features.component.html 14 @@ -5578,7 +5578,7 @@ channels - canaux + canaux src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -5864,7 +5864,7 @@ Channel: - Canal : + Canal: src/app/lightning/channel/channel.component.ts 37 diff --git a/frontend/src/locale/messages.it.xlf b/frontend/src/locale/messages.it.xlf index 427e2deec..6f683398b 100644 --- a/frontend/src/locale/messages.it.xlf +++ b/frontend/src/locale/messages.it.xlf @@ -3203,7 +3203,7 @@ blocks expected - blocchi previsti + blocchi previsti src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3221,7 +3221,7 @@ blocks mined - blocchi minati + blocchi minati src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3230,7 +3230,7 @@ block mined - blocco estratto + blocco estratto src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3239,7 +3239,7 @@ blocks remaining - blocchi rimanenti + blocchi rimanenti src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3248,7 +3248,7 @@ block remaining - blocco rimanente + blocco rimanente src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3257,7 +3257,7 @@ blocks ahead - blocchi avanti + blocchi avanti src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3266,7 +3266,7 @@ block ahead - blocco avanti + blocco avanti src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3275,7 +3275,7 @@ blocks behind - blocchi dietro + blocchi dietro src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3284,7 +3284,7 @@ block behind - blocco dietro + blocco dietro src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3995,7 +3995,7 @@ blocks - blocchi + blocchi src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4518,7 +4518,7 @@ ago - fa + fa src/app/components/time/time.component.ts 103 @@ -5067,7 +5067,7 @@ remaining - rimanente + rimanente src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -5578,7 +5578,7 @@ channels - canali + canali src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -6775,7 +6775,7 @@ nodes - nodi + nodi src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -6795,7 +6795,7 @@ BTC capacity - Capacità BTC + Capacità BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 105,103 @@ -6913,7 +6913,7 @@ BTC - BTC + BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 159,157 @@ -7038,7 +7038,7 @@ year - anno + anno src/app/shared/i18n/dates.ts 3 @@ -7046,7 +7046,7 @@ years - anni + anni src/app/shared/i18n/dates.ts 4 @@ -7054,7 +7054,7 @@ month - mese + mese src/app/shared/i18n/dates.ts 5 @@ -7062,7 +7062,7 @@ months - mesi + mesi src/app/shared/i18n/dates.ts 6 @@ -7070,7 +7070,7 @@ week - settimana + settimana src/app/shared/i18n/dates.ts 7 @@ -7078,7 +7078,7 @@ weeks - settimane + settimane src/app/shared/i18n/dates.ts 8 @@ -7086,7 +7086,7 @@ day - giorno + giorno src/app/shared/i18n/dates.ts 9 @@ -7094,7 +7094,7 @@ days - giorni + giorni src/app/shared/i18n/dates.ts 10 @@ -7102,7 +7102,7 @@ hour - ora + ora src/app/shared/i18n/dates.ts 11 @@ -7110,7 +7110,7 @@ hours - ore + ore src/app/shared/i18n/dates.ts 12 @@ -7118,7 +7118,7 @@ minute - minuto + minuto src/app/shared/i18n/dates.ts 13 @@ -7126,7 +7126,7 @@ minutes - minuti + minuti src/app/shared/i18n/dates.ts 14 @@ -7134,7 +7134,7 @@ second - secondo + secondo src/app/shared/i18n/dates.ts 15 @@ -7142,7 +7142,7 @@ seconds - secondi + secondi src/app/shared/i18n/dates.ts 16 diff --git a/frontend/src/locale/messages.mk.xlf b/frontend/src/locale/messages.mk.xlf index 9b2cbd58f..848cdf8d7 100644 --- a/frontend/src/locale/messages.mk.xlf +++ b/frontend/src/locale/messages.mk.xlf @@ -148,7 +148,7 @@ - + node_modules/src/progressbar/progressbar.ts 30,33 @@ -3995,6 +3995,7 @@ blocks + блокови src/app/components/pool-ranking/pool-ranking.component.ts 165,163 diff --git a/frontend/src/locale/messages.zh.xlf b/frontend/src/locale/messages.zh.xlf index eddfdf5d7..ceb38745f 100644 --- a/frontend/src/locale/messages.zh.xlf +++ b/frontend/src/locale/messages.zh.xlf @@ -2365,6 +2365,7 @@ Marginal fee rate + 边际费率 src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 40 @@ -2377,6 +2378,7 @@ Recently broadcasted + 最近播出 src/app/components/block-overview-tooltip/block-overview-tooltip.component.html 41 @@ -2537,6 +2539,7 @@ Size per weight + 尺寸/权重 src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.ts 200,199 @@ -2747,6 +2750,7 @@ Subsidy + fees + 补贴+费用 src/app/components/block/block.component.html 153,156 @@ -2760,6 +2764,7 @@ Expected + 预计区块 src/app/components/block/block.component.html 216 @@ -2781,6 +2786,7 @@ Actual + 实际区块 src/app/components/block/block.component.html 218,222 @@ -2789,6 +2795,7 @@ Expected Block + 预计区块 src/app/components/block/block.component.html 222 @@ -2797,6 +2804,7 @@ Actual Block + 实际区块 src/app/components/block/block.component.html 231 @@ -2870,6 +2878,7 @@ Audit + 审计 src/app/components/block/block.component.html 297,301 @@ -2930,6 +2939,7 @@ Why is this block empty? + 为什么这个区块是空的? src/app/components/block/block.component.html 384,390 @@ -3193,6 +3203,7 @@ blocks expected + 预计个区块 src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3201,6 +3212,7 @@ block expected + 预计个区块 src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3209,6 +3221,7 @@ blocks mined + 已挖个区块 src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3217,6 +3230,7 @@ block mined + 已挖个区块 src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3225,6 +3239,7 @@ blocks remaining + 剩余个区块 src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3233,6 +3248,7 @@ block remaining + 剩余个区块 src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3241,6 +3257,7 @@ blocks ahead + 领先个区块 src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3249,6 +3266,7 @@ block ahead + 领先个区块 src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3257,6 +3275,7 @@ blocks behind + 落后个区块 src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3265,6 +3284,7 @@ block behind + 落后个区块 src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3273,6 +3293,7 @@ Average block time + 平均出块时间 src/app/components/difficulty/difficulty.component.html 42,45 @@ -3917,6 +3938,7 @@ Avg Health + 平均健康 src/app/components/pool-ranking/pool-ranking.component.html 96,97 @@ -3973,6 +3995,7 @@ blocks + 个区块 src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3992,6 +4015,7 @@ Other () + 其他 () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4270,6 +4294,7 @@ Avg Block Fees + 平均区块费用 src/app/components/reward-stats/reward-stats.component.html 17 @@ -4282,6 +4307,7 @@ Average fees per block in the past 144 blocks + 过去144个区块中每个区块的平均费用 src/app/components/reward-stats/reward-stats.component.html 18,20 @@ -4363,6 +4389,7 @@ Bitcoin Block Height + 比特币区块高度 src/app/components/search-form/search-results/search-results.component.html 3 @@ -4371,6 +4398,7 @@ Bitcoin Transaction + 比特币交易 src/app/components/search-form/search-results/search-results.component.html 9 @@ -4379,6 +4407,7 @@ Bitcoin Address + 比特币地址 src/app/components/search-form/search-results/search-results.component.html 15 @@ -4387,6 +4416,7 @@ Bitcoin Block + 比特币区块 src/app/components/search-form/search-results/search-results.component.html 21 @@ -4395,6 +4425,7 @@ Bitcoin Addresses + 比特币地址 src/app/components/search-form/search-results/search-results.component.html 27 @@ -4403,6 +4434,7 @@ Lightning Nodes + 闪电网络节点 src/app/components/search-form/search-results/search-results.component.html 35 @@ -4411,6 +4443,7 @@ Lightning Channels + 闪电网络通道 src/app/components/search-form/search-results/search-results.component.html 43 @@ -4675,6 +4708,7 @@ This transaction replaced: + 此交易取代: src/app/components/transaction/transaction.component.html 10,12 @@ -4684,6 +4718,7 @@ Replaced + 已更换 src/app/components/transaction/transaction.component.html 36,39 @@ -5023,6 +5058,7 @@ Show more inputs to reveal fee data + 显示更多输入以显示费用数据 src/app/components/transactions-list/transactions-list.component.html 290,293 @@ -5031,6 +5067,7 @@ remaining + 剩余 src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -5181,6 +5218,7 @@ This transaction does not use Taproot + 此交易不使用Taproot src/app/components/tx-features/tx-features.component.html 18 @@ -5324,6 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space 仅提供有关比特币网络的数据。 它无法帮助您取回资金、更快地确认您的交易等。 src/app/docs/api-docs/api-docs.component.html 13 @@ -5556,6 +5595,7 @@ Starting balance + 期初余额 src/app/lightning/channel/channel-close-box/channel-close-box.component.html 6 @@ -5565,6 +5605,7 @@ Closing balance + 期末余额 src/app/lightning/channel/channel-close-box/channel-close-box.component.html 12 @@ -5796,6 +5837,7 @@ Closed by + 关闭者 src/app/lightning/channel/channel.component.html 59,61 @@ -5830,6 +5872,7 @@ Mutually closed + 相互封闭 src/app/lightning/channel/closing-type/closing-type.component.ts 20 @@ -5837,6 +5880,7 @@ Force closed + 强制关闭 src/app/lightning/channel/closing-type/closing-type.component.ts 24 @@ -5844,6 +5888,7 @@ Force closed with penalty + 强制关闭并受到惩罚 src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -5977,6 +6022,7 @@ avg + 平均 src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -5985,6 +6031,7 @@ med + 中位 src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -6370,6 +6417,7 @@ Fee distribution + 费用分配 src/app/lightning/node-fee-chart/node-fee-chart.component.html 2 @@ -6378,6 +6426,7 @@ Outgoing Fees + 支出费用 src/app/lightning/node-fee-chart/node-fee-chart.component.ts 170 @@ -6389,6 +6438,7 @@ Incoming Fees + 进场费 src/app/lightning/node-fee-chart/node-fee-chart.component.ts 178 @@ -6478,6 +6528,7 @@ Avg channel distance + 平均频道距离 src/app/lightning/node/node.component.html 59,60 @@ -6517,6 +6568,7 @@ Liquidity ad + 流动性广告 src/app/lightning/node/node.component.html 141,144 @@ -6525,6 +6577,7 @@ Lease fee rate + 租赁费率 src/app/lightning/node/node.component.html 147,150 @@ -6534,6 +6587,7 @@ Lease base fee + 租赁基本费 src/app/lightning/node/node.component.html 155,157 @@ -6542,6 +6596,7 @@ Funding weight + 资金权重 src/app/lightning/node/node.component.html 161,162 @@ -6569,6 +6624,7 @@ Compact lease + 协议合约 src/app/lightning/node/node.component.html 191,193 @@ -6577,6 +6633,7 @@ TLV extension records + TLV 扩展记录 src/app/lightning/node/node.component.html 202,205 @@ -6657,6 +6714,7 @@ Indexing in progress + 正在编制索引 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 121,116 @@ -6668,6 +6726,7 @@ Clearnet and Darknet + 明网和暗网 src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6679,6 +6738,7 @@ Clearnet Only (IPv4, IPv6) + 仅限明网(IPv4、IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6690,6 +6750,7 @@ Darknet Only (Tor, I2P, cjdns) + 仅限暗网(Tor、I2P、cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6714,6 +6775,7 @@ nodes + 个节点 src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -6924,6 +6986,7 @@ Active nodes + 活跃节点 src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 14,18 From adc51f621743523503be04b66a9997750d7ee048 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 18 Mar 2023 16:40:30 +0900 Subject: [PATCH 091/782] Update i18n --- frontend/src/app/components/pool/pool.component.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/components/pool/pool.component.html b/frontend/src/app/components/pool/pool.component.html index aa54b70f5..57d7ac51c 100644 --- a/frontend/src/app/components/pool/pool.component.html +++ b/frontend/src/app/components/pool/pool.component.html @@ -92,9 +92,9 @@ - - - + + + @@ -117,9 +117,9 @@
RewardHashrate (24h)Avg HealthRewardHashrate (24h)Avg Health
- - - + + + From 6be9f237902926f340e5e5b4196666cb7dfbba03 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sat, 18 Mar 2023 04:57:20 -0400 Subject: [PATCH 092/782] Add more languages for promo captions --- .../src/app/components/about/about.component.html | 13 ++++++++++++- frontend/sync-assets.js | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 17920157f..c2147c8b4 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -16,7 +16,18 @@
diff --git a/frontend/sync-assets.js b/frontend/sync-assets.js index 9512116fa..953811fae 100644 --- a/frontend/sync-assets.js +++ b/frontend/sync-assets.js @@ -84,7 +84,7 @@ const testnetAssetsMinimalJsonUrl = 'https://raw.githubusercontent.com/Blockstre const promoPrefix = PATH + 'promo-video/'; const promoVideoFile = promoPrefix + 'mempool-promo.mp4'; const promoVideoUrl = 'https://raw.githubusercontent.com/mempool/mempool-promo/master/promo.mp4'; -const promoVideoLanguages = ['en','sv','ja']; +const promoVideoLanguages = ['en','sv','ja','zh','cs','fi','fr','de','it','lt','nb','fa','pl','ro','pt']; console.log('Downloading assets'); download(PATH + 'assets.json', assetsJsonUrl); From ed46232b837854ed6b531c774d88b72aae0657c9 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 21 Feb 2023 22:23:36 -0600 Subject: [PATCH 093/782] Fix missing fees in liquid block tooltips --- backend/src/api/blocks.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 15c8590e9..8ed81016b 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -143,7 +143,10 @@ class Blocks { * @returns BlockSummary */ public summarizeBlock(block: IBitcoinApi.VerboseBlock): BlockSummary { - const stripped = block.tx.map((tx) => { + if (Common.isLiquid()) { + block = this.convertLiquidFees(block); + } + const stripped = block.tx.map((tx: IBitcoinApi.VerboseTransaction) => { return { txid: tx.txid, vsize: tx.weight / 4, @@ -158,6 +161,13 @@ class Blocks { }; } + private convertLiquidFees(block: IBitcoinApi.VerboseBlock): IBitcoinApi.VerboseBlock { + block.tx.forEach(tx => { + tx.fee = Object.values(tx.fee || {}).reduce((total, output) => total + output, 0); + }); + return block; + } + /** * Return a block with additional data (reward, coinbase, fees...) * @param block From 994656953c9941458fd27bc65d42fe3a02acb3f3 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sat, 18 Mar 2023 05:15:48 -0400 Subject: [PATCH 094/782] Fix promo video subtitles for sv --- frontend/src/app/components/about/about.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index e3917256e..16d1e60ed 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -16,7 +16,7 @@
- - + diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index a11be9ad2..f5fe1a469 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -335,6 +335,7 @@ export class BlockComponent implements OnInit, OnDestroy { const isMissing = {}; const isSelected = {}; const isFresh = {}; + const isSigop = {}; this.numMissing = 0; this.numUnexpected = 0; @@ -354,6 +355,9 @@ export class BlockComponent implements OnInit, OnDestroy { for (const txid of blockAudit.freshTxs || []) { isFresh[txid] = true; } + for (const txid of blockAudit.sigopTxs || []) { + isSigop[txid] = true; + } // set transaction statuses for (const tx of blockAudit.template) { tx.context = 'projected'; @@ -362,7 +366,7 @@ export class BlockComponent implements OnInit, OnDestroy { } else if (inBlock[tx.txid]) { tx.status = 'found'; } else { - tx.status = isFresh[tx.txid] ? 'fresh' : 'missing'; + tx.status = isFresh[tx.txid] ? 'fresh' : (isSigop[tx.txid] ? 'sigop' : 'missing'); isMissing[tx.txid] = true; this.numMissing++; } diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 8d5d71da7..321ee5841 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -155,7 +155,7 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; - status?: 'found' | 'missing' | 'fresh' | 'added' | 'censored' | 'selected'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected'; } interface RbfTransaction extends TransactionStripped { diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index bcabf5a29..eaf937a5f 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -76,7 +76,7 @@ export interface TransactionStripped { vsize: number; value: number; rate?: number; // effective fee rate - status?: 'found' | 'missing' | 'fresh' | 'added' | 'censored' | 'selected'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected'; context?: 'projected' | 'actual'; } From 369db7a63ca53925329570e074057932f8ea92dd Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 18 May 2023 09:51:41 -0400 Subject: [PATCH 354/782] Detect RBF by mined transactions --- backend/src/api/common.ts | 18 +++++++++++++++ backend/src/api/mempool.ts | 34 ++++++++++++++++++++++++++++ backend/src/api/rbf-cache.ts | 2 +- backend/src/api/websocket-handler.ts | 6 +++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index fc952d6a8..ba06c53b3 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -77,6 +77,24 @@ export class Common { return matches; } + static findMinedRbfTransactions(minedTransactions: TransactionExtended[], spendMap: Map): { [txid: string]: { replaced: TransactionExtended[], replacedBy: TransactionExtended }} { + const matches: { [txid: string]: { replaced: TransactionExtended[], replacedBy: TransactionExtended }} = {}; + for (const tx of minedTransactions) { + const replaced: Set = new Set(); + for (let i = 0; i < tx.vin.length; i++) { + const vin = tx.vin[i]; + const match = spendMap.get(`${vin.txid}:${vin.vout}`); + if (match && match.txid !== tx.txid) { + replaced.add(match); + } + } + if (replaced.size) { + matches[tx.txid] = { replaced: Array.from(replaced), replacedBy: tx }; + } + } + return matches; + } + static stripTransaction(tx: TransactionExtended): TransactionStripped { return { txid: tx.txid, diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 5746ca6d4..fe84fb8e4 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -14,6 +14,7 @@ class Mempool { private inSync: boolean = false; private mempoolCacheDelta: number = -1; private mempoolCache: { [txId: string]: TransactionExtended } = {}; + private spendMap = new Map(); private mempoolInfo: IBitcoinApi.MempoolInfo = { loaded: false, size: 0, bytes: 0, usage: 0, total_fee: 0, maxmempool: 300000000, mempoolminfee: 0.00001000, minrelaytxfee: 0.00001000 }; private mempoolChangedCallback: ((newMempool: {[txId: string]: TransactionExtended; }, newTransactions: TransactionExtended[], @@ -77,6 +78,10 @@ class Mempool { return this.mempoolCache; } + public getSpendMap(): Map { + return this.spendMap; + } + public async $setMempool(mempoolData: { [txId: string]: TransactionExtended }) { this.mempoolCache = mempoolData; if (this.mempoolChangedCallback) { @@ -85,6 +90,7 @@ class Mempool { if (this.$asyncMempoolChangedCallback) { await this.$asyncMempoolChangedCallback(this.mempoolCache, [], []); } + this.addToSpendMap(Object.values(this.mempoolCache)); } public async $updateMemPoolInfo() { @@ -276,6 +282,34 @@ class Mempool { } } + public handleMinedRbfTransactions(rbfTransactions: { [txid: string]: { replaced: TransactionExtended[], replacedBy: TransactionExtended }}): void { + for (const rbfTransaction in rbfTransactions) { + if (rbfTransactions[rbfTransaction].replacedBy && rbfTransactions[rbfTransaction]?.replaced?.length) { + // Store replaced transactions + rbfCache.add(rbfTransactions[rbfTransaction].replaced, rbfTransactions[rbfTransaction].replacedBy); + } + } + } + + public addToSpendMap(transactions: TransactionExtended[]): void { + for (const tx of transactions) { + for (const vin of tx.vin) { + this.spendMap.set(`${vin.txid}:${vin.vout}`, tx); + } + } + } + + public removeFromSpendMap(transactions: TransactionExtended[]): void { + for (const tx of transactions) { + for (const vin of tx.vin) { + const key = `${vin.txid}:${vin.vout}`; + if (this.spendMap.get(key)?.txid === tx.txid) { + this.spendMap.delete(key); + } + } + } + } + private updateTxPerSecond() { const nowMinusTimeSpan = new Date().getTime() - (1000 * config.STATISTICS.TX_PER_SECOND_SAMPLE_PERIOD); this.txPerSecondArray = this.txPerSecondArray.filter((unixTime) => unixTime > nowMinusTimeSpan); diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index d8fb8656c..51f8ffeca 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -31,7 +31,7 @@ class RbfCache { } public add(replaced: TransactionExtended[], newTxExtended: TransactionExtended): void { - if (!newTxExtended || !replaced?.length) { + if (!newTxExtended || !replaced?.length || this.txs.has(newTxExtended.txid)) { return; } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 3fa7006fb..04f18765f 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -332,6 +332,8 @@ class WebsocketHandler { for (const deletedTx of deletedTransactions) { rbfCache.evict(deletedTx.txid); } + memPool.removeFromSpendMap(deletedTransactions); + memPool.addToSpendMap(newTransactions); const recommendedFees = feeApi.getRecommendedFee(); // update init data @@ -599,6 +601,10 @@ class WebsocketHandler { } } + const rbfTransactions = Common.findMinedRbfTransactions(transactions, memPool.getSpendMap()); + memPool.handleMinedRbfTransactions(rbfTransactions); + memPool.removeFromSpendMap(transactions); + // Update mempool to remove transactions included in the new block for (const txId of txIds) { delete _memPool[txId]; From e88e56421bc62945e8f1618086fa8663b70d630e Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 20 May 2023 18:00:22 -0400 Subject: [PATCH 355/782] Enable fullrbf --- production/bitcoin.conf | 1 + production/bitcoin.minfee.conf | 1 + 2 files changed, 2 insertions(+) diff --git a/production/bitcoin.conf b/production/bitcoin.conf index 501f49f50..d9f3fc252 100644 --- a/production/bitcoin.conf +++ b/production/bitcoin.conf @@ -8,6 +8,7 @@ par=16 dbcache=8192 maxmempool=4096 mempoolexpiry=999999 +mempoolfullrbf=1 maxconnections=42 onion=127.0.0.1:9050 rpcallowip=127.0.0.1 diff --git a/production/bitcoin.minfee.conf b/production/bitcoin.minfee.conf index d8ff97258..0bd7f2ed1 100644 --- a/production/bitcoin.minfee.conf +++ b/production/bitcoin.minfee.conf @@ -4,6 +4,7 @@ txindex=0 listen=1 daemon=1 prune=1337 +mempoolfullrbf=1 rpcallowip=127.0.0.1 rpcuser=__BITCOIN_RPC_USER__ rpcpassword=__BITCOIN_RPC_PASS__ From 07f16165ff9a635c7d4944df6d575747af070e8e Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 23 May 2023 17:23:51 -0300 Subject: [PATCH 356/782] ops: Disable buggy CLN crontab job in install --- production/install | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/production/install b/production/install index b50fa5f11..b7c863051 100755 --- a/production/install +++ b/production/install @@ -1321,16 +1321,18 @@ case $OS in echo "[*] Installing Core Lightning package" osPackageInstall ${CLN_PKG} - echo "[*] Installing Core Lightning mainnet Cronjob" - public_ipv4=$( ifconfig | grep 'inet ' | awk -F ' ' '{ print $2 }' | grep -v '^103\.165\.192\.' | grep -v '^127\.0\.0\.1' ) - public_ipv6=$( ifconfig | grep 'inet6' | awk -F ' ' '{ print $2 }' | grep -v '^2001:df6:7280::' | grep -v '^fe80::' | grep -v '^::1' ) - - crontab_cln+="@reboot sleep 10 ; screen -dmS main lightningd --rpc-file-mode 0660 --alias `hostname` --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6\n" - crontab_cln+="@reboot sleep 10 ; screen -dmS tes lightningd --rpc-file-mode 0660 --alias `hostname` --network testnet --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6\n" - crontab_cln+="@reboot sleep 10 ; screen -dmS sig lightningd --rpc-file-mode 0660 --alias `hostname` --network signet --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6 \n" - crontab_cln+="@reboot sleep 20 ; /mempool/mempool.space/lightning-seeder >/dev/null 2>&1\n" - crontab_cln+="1 * * * * /mempool/mempool.space/lightning-seeder >/dev/null 2>&1\n" - echo "${crontab_cln}" | crontab -u "${CLN_USER}" - +######## FIXME: this code doesn't work properly, needs fixing +# +# echo "[*] Installing Core Lightning mainnet Cronjob" +# public_ipv4=$( ifconfig | grep 'inet ' | awk -F ' ' '{ print $2 }' | grep -v '^103\.165\.192\.' | grep -v '^127\.0\.0\.1' ) +# public_ipv6=$( ifconfig | grep 'inet6' | awk -F ' ' '{ print $2 }' | grep -v '^2001:df6:7280::' | grep -v '^fe80::' | grep -v '^::1' ) +# +# crontab_cln+="@reboot sleep 10 ; screen -dmS main lightningd --rpc-file-mode 0660 --alias `hostname` --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6\n" +# crontab_cln+="@reboot sleep 10 ; screen -dmS tes lightningd --rpc-file-mode 0660 --alias `hostname` --network testnet --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6\n" +# crontab_cln+="@reboot sleep 10 ; screen -dmS sig lightningd --rpc-file-mode 0660 --alias `hostname` --network signet --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6 \n" +# crontab_cln+="@reboot sleep 20 ; /mempool/mempool.space/lightning-seeder >/dev/null 2>&1\n" +# crontab_cln+="1 * * * * /mempool/mempool.space/lightning-seeder >/dev/null 2>&1\n" +# echo "${crontab_cln}" | crontab -u "${CLN_USER}" - ;; Debian) ;; From c81509d762bf2c43baae722e2da254394d7e8839 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 23 May 2023 17:57:27 -0300 Subject: [PATCH 357/782] ops: Start mysql-server using onestart from install --- production/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/production/install b/production/install index b7c863051..5a79092a6 100755 --- a/production/install +++ b/production/install @@ -1815,7 +1815,7 @@ echo "[*] Adding MySQL configuration" case $OS in FreeBSD) - osSudo "${ROOT_USER}" service mysql-server start + osSudo "${ROOT_USER}" service mysql-server onestart ;; Debian) osSudo "${ROOT_USER}" service mysql start From 31ea2e1d4bef21d4aa037599e4a81b80c0444ffe Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 24 May 2023 01:22:01 +0400 Subject: [PATCH 358/782] Fix for pool output address matching fixes #3782 --- backend/src/api/blocks.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 23814a87e..bce7983d3 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -306,7 +306,7 @@ class Blocks { } const asciiScriptSig = transactionUtils.hex2ascii(txMinerInfo.vin[0].scriptsig); - const address = txMinerInfo.vout[0].scriptpubkey_address; + const addresses = txMinerInfo.vout.map((vout) => vout.scriptpubkey_address).filter((address) => address); let pools: PoolTag[] = []; if (config.DATABASE.ENABLED === true) { @@ -316,11 +316,13 @@ class Blocks { } for (let i = 0; i < pools.length; ++i) { - if (address !== undefined) { - const addresses: string[] = typeof pools[i].addresses === 'string' ? + if (addresses.length) { + const poolAddresses: string[] = typeof pools[i].addresses === 'string' ? JSON.parse(pools[i].addresses) : pools[i].addresses; - if (addresses.indexOf(address) !== -1) { - return pools[i]; + for (let y = 0; y < poolAddresses.length; y++) { + if (addresses.indexOf(poolAddresses[y]) !== -1) { + return pools[i]; + } } } From ea420773204d51981dcfb1489f2880f75bc32813 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 25 May 2023 00:31:44 -0400 Subject: [PATCH 359/782] Change embassyos to startos --- frontend/src/app/components/about/about.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index e67facfe1..095b311b9 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -205,9 +205,9 @@ NixOS - + - EmbassyOS + StartOS From 264c02eca1f38b97a3b3b86b639cc207aacff8dc Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 25 May 2023 01:29:55 -0400 Subject: [PATCH 360/782] Add bull bitcoin as enterprise sponsor --- frontend/src/app/components/about/about.component.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index e67facfe1..aa604f678 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -119,6 +119,10 @@ Gemini + + + Bull Bitcoin + From ad4c7d7c0b5c53b75e6fb921aff0c9c93faeb5bb Mon Sep 17 00:00:00 2001 From: Stephan Oeste Date: Thu, 25 May 2023 16:50:56 +0200 Subject: [PATCH 361/782] Fix exact match of .js files. Was also matching .json before. --- production/nginx/server-common.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/production/nginx/server-common.conf b/production/nginx/server-common.conf index dedd36411..6b737b056 100644 --- a/production/nginx/server-common.conf +++ b/production/nginx/server-common.conf @@ -59,7 +59,7 @@ location = / { } # cache //main.f40e91d908a068a2.js forever since they never change -location ~ ^/([a-z][a-z])/(.+\..+\.(js|css)) { +location ~ ^/([a-z][a-z])/(.+\..+\.(js|css))$ { try_files $uri =404; expires 1y; } @@ -82,7 +82,7 @@ location /resources { expires 1w; } # cache /main.f40e91d908a068a2.js forever since they never change -location ~* ^/.+\..+\.(js|css) { +location ~* ^/.+\..+\.(js|css)$ { try_files /$lang/$uri /en-US/$uri =404; expires 1y; } From 714208a3669000c4f20777f6d0118ed8b4f35a83 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 25 May 2023 19:05:29 +0400 Subject: [PATCH 362/782] Don't wipe mempool cache in pools updater --- backend/src/api/disk-cache.ts | 11 +++++++++-- backend/src/api/pools-parser.ts | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 0264fe1a3..2e3ff6fb1 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -21,6 +21,7 @@ class DiskCache { private static RBF_FILE_NAME = config.MEMPOOL.CACHE_DIR + '/rbfcache.json'; private static CHUNK_FILES = 25; private isWritingCache = false; + private ignoreBlocksCache = false; private semaphore: { resume: (() => void)[], locks: number } = { resume: [], @@ -218,8 +219,10 @@ class DiskCache { } await memPool.$setMempool(data.mempool); - blocks.setBlocks(data.blocks); - blocks.setBlockSummaries(data.blockSummaries || []); + if (!this.ignoreBlocksCache) { + blocks.setBlocks(data.blocks); + blocks.setBlockSummaries(data.blockSummaries || []); + } } catch (e) { logger.warn('Failed to parse mempoool and blocks cache. Skipping. Reason: ' + (e instanceof Error ? e.message : e)); } @@ -273,6 +276,10 @@ class DiskCache { } } } + + public setIgnoreBlocksCache(): void { + this.ignoreBlocksCache = true; + } } export default new DiskCache(); diff --git a/backend/src/api/pools-parser.ts b/backend/src/api/pools-parser.ts index f94c147a2..7397c5639 100644 --- a/backend/src/api/pools-parser.ts +++ b/backend/src/api/pools-parser.ts @@ -41,7 +41,7 @@ class PoolsParser { public async migratePoolsJson(): Promise { // We also need to wipe the backend cache to make sure we don't serve blocks with // the wrong mining pool (usually happen with unknown blocks) - diskCache.wipeCache(); + diskCache.setIgnoreBlocksCache(); await this.$insertUnknownPool(); From 349ba613ddc40d8d87f1907797e9bc2fbbc9c030 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 25 May 2023 19:06:45 +0400 Subject: [PATCH 363/782] Revert "Don't wipe mempool cache in pools updater" This reverts commit 714208a3669000c4f20777f6d0118ed8b4f35a83. --- backend/src/api/disk-cache.ts | 11 ++--------- backend/src/api/pools-parser.ts | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 2e3ff6fb1..0264fe1a3 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -21,7 +21,6 @@ class DiskCache { private static RBF_FILE_NAME = config.MEMPOOL.CACHE_DIR + '/rbfcache.json'; private static CHUNK_FILES = 25; private isWritingCache = false; - private ignoreBlocksCache = false; private semaphore: { resume: (() => void)[], locks: number } = { resume: [], @@ -219,10 +218,8 @@ class DiskCache { } await memPool.$setMempool(data.mempool); - if (!this.ignoreBlocksCache) { - blocks.setBlocks(data.blocks); - blocks.setBlockSummaries(data.blockSummaries || []); - } + blocks.setBlocks(data.blocks); + blocks.setBlockSummaries(data.blockSummaries || []); } catch (e) { logger.warn('Failed to parse mempoool and blocks cache. Skipping. Reason: ' + (e instanceof Error ? e.message : e)); } @@ -276,10 +273,6 @@ class DiskCache { } } } - - public setIgnoreBlocksCache(): void { - this.ignoreBlocksCache = true; - } } export default new DiskCache(); diff --git a/backend/src/api/pools-parser.ts b/backend/src/api/pools-parser.ts index 7397c5639..f94c147a2 100644 --- a/backend/src/api/pools-parser.ts +++ b/backend/src/api/pools-parser.ts @@ -41,7 +41,7 @@ class PoolsParser { public async migratePoolsJson(): Promise { // We also need to wipe the backend cache to make sure we don't serve blocks with // the wrong mining pool (usually happen with unknown blocks) - diskCache.setIgnoreBlocksCache(); + diskCache.wipeCache(); await this.$insertUnknownPool(); From aeb896e200281af1bdb2190c9dd64612eac583a0 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 25 May 2023 19:05:29 +0400 Subject: [PATCH 364/782] Don't wipe mempool cache in pools updater --- backend/src/api/disk-cache.ts | 11 +++++++++-- backend/src/api/pools-parser.ts | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 0264fe1a3..2e3ff6fb1 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -21,6 +21,7 @@ class DiskCache { private static RBF_FILE_NAME = config.MEMPOOL.CACHE_DIR + '/rbfcache.json'; private static CHUNK_FILES = 25; private isWritingCache = false; + private ignoreBlocksCache = false; private semaphore: { resume: (() => void)[], locks: number } = { resume: [], @@ -218,8 +219,10 @@ class DiskCache { } await memPool.$setMempool(data.mempool); - blocks.setBlocks(data.blocks); - blocks.setBlockSummaries(data.blockSummaries || []); + if (!this.ignoreBlocksCache) { + blocks.setBlocks(data.blocks); + blocks.setBlockSummaries(data.blockSummaries || []); + } } catch (e) { logger.warn('Failed to parse mempoool and blocks cache. Skipping. Reason: ' + (e instanceof Error ? e.message : e)); } @@ -273,6 +276,10 @@ class DiskCache { } } } + + public setIgnoreBlocksCache(): void { + this.ignoreBlocksCache = true; + } } export default new DiskCache(); diff --git a/backend/src/api/pools-parser.ts b/backend/src/api/pools-parser.ts index f94c147a2..7397c5639 100644 --- a/backend/src/api/pools-parser.ts +++ b/backend/src/api/pools-parser.ts @@ -41,7 +41,7 @@ class PoolsParser { public async migratePoolsJson(): Promise { // We also need to wipe the backend cache to make sure we don't serve blocks with // the wrong mining pool (usually happen with unknown blocks) - diskCache.wipeCache(); + diskCache.setIgnoreBlocksCache(); await this.$insertUnknownPool(); From 038f9659bb9b55c5634729f5e6aef1a8a5160256 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 25 May 2023 19:19:14 +0400 Subject: [PATCH 365/782] Save new disk cache after ignoring blocks --- backend/src/api/disk-cache.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 2e3ff6fb1..17d75d07b 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -222,6 +222,9 @@ class DiskCache { if (!this.ignoreBlocksCache) { blocks.setBlocks(data.blocks); blocks.setBlockSummaries(data.blockSummaries || []); + } else { + logger.info('Re-saving cache with empty recent blocks data'); + await this.$saveCacheToDisk(true); } } catch (e) { logger.warn('Failed to parse mempoool and blocks cache. Skipping. Reason: ' + (e instanceof Error ? e.message : e)); From 8ffe2f3156d61c577325c39ddd68219e70166cb2 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 25 May 2023 09:08:51 -0700 Subject: [PATCH 366/782] Always re-indexing blocks when updating mining pools --- backend/src/api/pools-parser.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/src/api/pools-parser.ts b/backend/src/api/pools-parser.ts index 7397c5639..0d34925ab 100644 --- a/backend/src/api/pools-parser.ts +++ b/backend/src/api/pools-parser.ts @@ -118,10 +118,6 @@ class PoolsParser { * @param pool */ private async $deleteBlocksForPool(pool: PoolTag): Promise { - if (config.MEMPOOL.AUTOMATIC_BLOCK_REINDEXING === false) { - return; - } - // Get oldest blocks mined by the pool and assume pools-v2.json updates only concern most recent years // Ignore early days of Bitcoin as there were no mining pool yet const [oldestPoolBlock]: any[] = await DB.query(` From 5711c939d75b18524b37b8c7ed1ef18b7ef07d6e Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 25 May 2023 15:58:48 -0400 Subject: [PATCH 367/782] Make svg pretty --- frontend/src/app/components/about/about.component.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index aa604f678..8655ab800 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -120,7 +120,15 @@ Gemini - + Bull Bitcoin From ac73de31b5f099006940b71dd4f17cabb8c8f221 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 May 2023 02:56:38 +0000 Subject: [PATCH 368/782] Bump bitcoinjs-lib from 6.1.0 to 6.1.1 in /backend Bumps [bitcoinjs-lib](https://github.com/bitcoinjs/bitcoinjs-lib) from 6.1.0 to 6.1.1. - [Changelog](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/CHANGELOG.md) - [Commits](https://github.com/bitcoinjs/bitcoinjs-lib/compare/v6.1.0...v6.1.1) --- updated-dependencies: - dependency-name: bitcoinjs-lib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- backend/package-lock.json | 289 +++++++------------------------------- 1 file changed, 52 insertions(+), 237 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index a2106ac9f..a7b0a5877 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1485,6 +1485,17 @@ "node": ">=6" } }, + "node_modules/@noble/hashes": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", + "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2403,12 +2414,9 @@ "dev": true }, "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, "node_modules/bech32": { "version": "2.0.0", @@ -2424,18 +2432,16 @@ } }, "node_modules/bitcoinjs-lib": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.0.tgz", - "integrity": "sha512-eupi1FBTJmPuAZdChnzTXLv2HBqFW2AICpzXZQLniP0V9FWWeeUQSMKES6sP8isy/xO0ijDexbgkdEyFVrsuJw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.1.tgz", + "integrity": "sha512-FYihfgTk29lt1eK2y48OtuarEDUnTprNBW3ctT8yHiOhvmeS3DzAVG6gI0VCvMkydz6UdlXlYNWIPqGD0SUYRQ==", "dependencies": { + "@noble/hashes": "^1.2.0", "bech32": "^2.0.0", "bip174": "^2.1.0", - "bs58check": "^2.1.2", - "create-hash": "^1.1.0", - "ripemd160": "^2.0.2", + "bs58check": "^3.0.1", "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.1.2", - "wif": "^2.0.1" + "varuint-bitcoin": "^1.1.2" }, "engines": { "node": ">=8.0.0" @@ -2540,21 +2546,20 @@ } }, "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", "dependencies": { - "base-x": "^3.0.2" + "base-x": "^4.0.0" } }, "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" } }, "node_modules/bser": { @@ -2668,15 +2673,6 @@ "node": ">=8" } }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/cjs-module-lexer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", @@ -2783,18 +2779,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -3825,19 +3809,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -5916,16 +5887,6 @@ "npm": ">=6" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -6591,19 +6552,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6694,15 +6642,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6824,18 +6763,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6988,14 +6915,6 @@ "node": ">= 0.8" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -7397,11 +7316,6 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -7470,14 +7384,6 @@ "node": ">= 8" } }, - "node_modules/wif": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", - "dependencies": { - "bs58check": "<3.0.0" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -8725,6 +8631,11 @@ "resolved": "https://registry.npmjs.org/@mempool/electrum-client/-/electrum-client-1.1.9.tgz", "integrity": "sha512-mlvPiCzUlaETpYW3i6V87A24jjMYgsebaXtUo3WQyyLnYUuxs0KiXQ2mnKh3h15j8Xg/hfxeGIi+5OC9u0nftQ==" }, + "@noble/hashes": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", + "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -9445,12 +9356,9 @@ "dev": true }, "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "requires": { - "safe-buffer": "^5.0.1" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, "bech32": { "version": "2.0.0", @@ -9463,18 +9371,16 @@ "integrity": "sha512-lkc0XyiX9E9KiVAS1ZiOqK1xfiwvf4FXDDdkDq5crcDzOq+xGytY+14qCsqz7kCiy8rpN1CRNfacRhf9G3JNSA==" }, "bitcoinjs-lib": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.0.tgz", - "integrity": "sha512-eupi1FBTJmPuAZdChnzTXLv2HBqFW2AICpzXZQLniP0V9FWWeeUQSMKES6sP8isy/xO0ijDexbgkdEyFVrsuJw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.1.tgz", + "integrity": "sha512-FYihfgTk29lt1eK2y48OtuarEDUnTprNBW3ctT8yHiOhvmeS3DzAVG6gI0VCvMkydz6UdlXlYNWIPqGD0SUYRQ==", "requires": { + "@noble/hashes": "^1.2.0", "bech32": "^2.0.0", "bip174": "^2.1.0", - "bs58check": "^2.1.2", - "create-hash": "^1.1.0", - "ripemd160": "^2.0.2", + "bs58check": "^3.0.1", "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.1.2", - "wif": "^2.0.1" + "varuint-bitcoin": "^1.1.2" } }, "body-parser": { @@ -9552,21 +9458,20 @@ } }, "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", "requires": { - "base-x": "^3.0.2" + "base-x": "^4.0.0" } }, "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" } }, "bser": { @@ -9639,15 +9544,6 @@ "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "cjs-module-lexer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", @@ -9735,18 +9631,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -10513,16 +10397,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -12069,16 +11943,6 @@ "tiny-lru": "10.3.0" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -12547,16 +12411,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12618,15 +12472,6 @@ "glob": "^7.1.3" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12715,15 +12560,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -12840,14 +12676,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -13101,11 +12929,6 @@ "punycode": "^2.1.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -13159,14 +12982,6 @@ "isexe": "^2.0.0" } }, - "wif": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", - "requires": { - "bs58check": "<3.0.0" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", From 9fa1eebc02d2aac516bee0141abde45e0071c814 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Fri, 26 May 2023 17:25:52 -0400 Subject: [PATCH 369/782] Switch tm to r for registered trademarks --- frontend/src/app/components/about/about.component.html | 4 ++-- .../trademark-policy/trademark-policy.component.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 9a778be44..c59f700a8 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -1,7 +1,7 @@
- + ®
v{{ packetJsonVersion }} [{{ frontendGitCommitHash }}] @@ -396,7 +396,7 @@ Trademark Notice

- The Mempool Open Source Project™, mempool.space™, the mempool logo™, the mempool.space logos™, the mempool square logo™, and the mempool blocks logo™ are either registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, and/or other countries. + The Mempool Open Source Project™, mempool.space™, the mempool logo®, the mempool.space logos™, the mempool square logo®, and the mempool blocks logo™ are either registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, and/or other countries.

While our software is available under an open source software license, the copyright license does not include an implied right or license to use our trademarks. See our Trademark Policy and Guidelines for more details, published on <https://mempool.space/trademark-policy>. diff --git a/frontend/src/app/components/trademark-policy/trademark-policy.component.html b/frontend/src/app/components/trademark-policy/trademark-policy.component.html index 4526a6c0c..4f9419642 100644 --- a/frontend/src/app/components/trademark-policy/trademark-policy.component.html +++ b/frontend/src/app/components/trademark-policy/trademark-policy.component.html @@ -304,7 +304,7 @@

Also, if you are using our Marks in a way described in the sections "Uses for Which We Are Granting a License," you must include the following trademark attribution at the foot of the webpage where you have used the Mark (or, if in a book, on the credits page), on any packaging or labeling, and on advertising or marketing materials:

-

“The Mempool Space K.K.™, The Mempool Open Source Project™, mempool.space™, the mempool logo™, the mempool.space logos™, the mempool square logo™, and the mempool blocks logo™ are either registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, and/or other countries, and are used with permission. Mempool Space K.K. has no affiliation with and does not sponsor or endorse the information provided herein.”

+

“The Mempool Space K.K.™, The Mempool Open Source Project™, mempool.space™, the mempool logo®, the mempool.space logos™, the mempool square logo®, and the mempool blocks logo™ are either registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, and/or other countries, and are used with permission. Mempool Space K.K. has no affiliation with and does not sponsor or endorse the information provided herein.”

  • What to Do When You See Abuse
  • From ce00814bbf5b167fdd041375e131812805db3a69 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sat, 27 May 2023 12:38:20 -0400 Subject: [PATCH 370/782] Unmute about promo video on click --- frontend/src/app/components/about/about.component.html | 2 +- frontend/src/app/components/about/about.component.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index c59f700a8..cc50a4a5b 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -13,7 +13,7 @@

    Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties.

    -
    - - + diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 3bfc8400a..e548fdc46 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -164,14 +164,17 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { if (cpfpInfo.bestDescendant && !cpfpInfo.descendants?.length) { relatives.push(cpfpInfo.bestDescendant); } - let totalWeight = - this.tx.weight + - relatives.reduce((prev, val) => prev + val.weight, 0); - let totalFees = - this.tx.fee + - relatives.reduce((prev, val) => prev + val.fee, 0); - - this.tx.effectiveFeePerVsize = totalFees / (totalWeight / 4); + if (!cpfpInfo.effectiveFeePerVsize) { + let totalWeight = + this.tx.weight + + relatives.reduce((prev, val) => prev + val.weight, 0); + let totalFees = + this.tx.fee + + relatives.reduce((prev, val) => prev + val.fee, 0); + this.tx.effectiveFeePerVsize = totalFees / (totalWeight / 4); + } else { + this.tx.effectiveFeePerVsize = cpfpInfo.effectiveFeePerVsize; + } this.cpfpInfo = cpfpInfo; }); diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 321ee5841..106b875d2 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -24,6 +24,7 @@ export interface CpfpInfo { ancestors: Ancestor[]; descendants?: Ancestor[]; bestDescendant?: BestDescendant | null; + effectiveFeePerVsize?: number; } export interface RbfInfo { From c5e6821ad4abf09dd0ed9a3e82d3f7fa2f9b2869 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 31 May 2023 11:24:41 -0400 Subject: [PATCH 381/782] show fee rating badge either on rate or effective rate --- .../src/app/components/transaction/transaction.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 30d74e24d..c718f534e 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -477,7 +477,7 @@ {{ tx.feePerVsize | feeRounding }} sat/vB   - + From 09e4e44e887d78950cb6b0f53916d2ecacb77457 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 29 May 2023 15:56:29 -0400 Subject: [PATCH 382/782] Count sigops & use adjusted vsizes in mempool projections --- backend/src/api/audit.ts | 13 +--- backend/src/api/blocks.ts | 21 +++--- backend/src/api/common.ts | 28 ++++---- backend/src/api/mempool-blocks.ts | 44 ++++++------ backend/src/api/mempool.ts | 47 ++++++------ backend/src/api/rbf-cache.ts | 10 +-- backend/src/api/transaction-utils.ts | 104 +++++++++++++++++++++++++-- backend/src/api/websocket-handler.ts | 16 ++--- backend/src/mempool.interfaces.ts | 6 ++ 9 files changed, 191 insertions(+), 98 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index 1ec1ae65a..6c5f96988 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -14,7 +14,6 @@ class Audit { const matches: string[] = []; // present in both mined block and template const added: string[] = []; // present in mined block, not in template const fresh: string[] = []; // missing, but firstSeen within PROPAGATION_MARGIN - const sigop: string[] = []; // missing, but possibly has an adjusted vsize due to high sigop count const isCensored = {}; // missing, without excuse const isDisplaced = {}; let displacedWeight = 0; @@ -38,8 +37,6 @@ class Audit { // tx is recent, may have reached the miner too late for inclusion if (mempool[txid]?.firstSeen != null && (now - (mempool[txid]?.firstSeen || 0)) <= PROPAGATION_MARGIN) { fresh.push(txid); - } else if (this.isPossibleHighSigop(mempool[txid])) { - sigop.push(txid); } else { isCensored[txid] = true; } @@ -140,19 +137,11 @@ class Audit { censored: Object.keys(isCensored), added, fresh, - sigop, + sigop: [], score, similarity, }; } - - // Detect transactions with a possibly adjusted vsize due to high sigop count - // very rough heuristic based on number of OP_CHECKMULTISIG outputs - // will miss cases with other sources of sigops - isPossibleHighSigop(tx: TransactionExtended): boolean { - const numBareMultisig = tx.vout.reduce((count, vout) => count + (vout.scriptpubkey_asm.includes('OP_CHECKMULTISIG') ? 1 : 0), 0); - return (numBareMultisig * 400) > tx.vsize; - } } export default new Audit(); \ No newline at end of file diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index bce7983d3..fc12b5998 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -2,7 +2,7 @@ import config from '../config'; import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; import logger from '../logger'; import memPool from './mempool'; -import { BlockExtended, BlockExtension, BlockSummary, PoolTag, TransactionExtended, TransactionStripped, TransactionMinerInfo, CpfpSummary } from '../mempool.interfaces'; +import { BlockExtended, BlockExtension, BlockSummary, PoolTag, TransactionExtended, TransactionStripped, TransactionMinerInfo, CpfpSummary, MempoolTransactionExtended } from '../mempool.interfaces'; import { Common } from './common'; import diskCache from './disk-cache'; import transactionUtils from './transaction-utils'; @@ -76,6 +76,7 @@ class Blocks { blockHeight: number, onlyCoinbase: boolean, quiet: boolean = false, + addMempoolData: boolean = false, ): Promise { const transactions: TransactionExtended[] = []; const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash); @@ -96,14 +97,14 @@ class Blocks { logger.debug(`Indexing tx ${i + 1} of ${txIds.length} in block #${blockHeight}`); } try { - const tx = await transactionUtils.$getTransactionExtended(txIds[i]); + const tx = await transactionUtils.$getTransactionExtended(txIds[i], false, false, false, addMempoolData); transactions.push(tx); transactionsFetched++; } catch (e) { try { if (config.MEMPOOL.BACKEND === 'esplora') { // Try again with core - const tx = await transactionUtils.$getTransactionExtended(txIds[i], false, false, true); + const tx = await transactionUtils.$getTransactionExtended(txIds[i], false, false, true, addMempoolData); transactions.push(tx); transactionsFetched++; } else { @@ -126,11 +127,13 @@ class Blocks { } } - transactions.forEach((tx) => { - if (!tx.cpfpChecked) { - Common.setRelativesAndGetCpfpInfo(tx, mempool); // Child Pay For Parent - } - }); + if (addMempoolData) { + transactions.forEach((tx) => { + if (!tx.cpfpChecked) { + Common.setRelativesAndGetCpfpInfo(tx as MempoolTransactionExtended, mempool); // Child Pay For Parent + } + }); + } if (!quiet) { logger.debug(`${transactionsFound} of ${txIds.length} found in mempool. ${transactionsFetched} fetched through backend service.`); @@ -596,7 +599,7 @@ class Blocks { const verboseBlock = await bitcoinClient.getBlock(blockHash, 2); const block = BitcoinApi.convertBlock(verboseBlock); const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash); - const transactions = await this.$getTransactionsExtended(blockHash, block.height, false); + const transactions = await this.$getTransactionsExtended(blockHash, block.height, false, false, true); const cpfpSummary: CpfpSummary = Common.calculateCpfp(block.height, transactions); const blockExtended: BlockExtended = await this.$getBlockExtended(block, cpfpSummary.transactions); const blockSummary: BlockSummary = this.summarizeBlock(verboseBlock); diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index ba06c53b3..a2a74e907 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -1,4 +1,4 @@ -import { Ancestor, CpfpInfo, CpfpSummary, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, TransactionStripped, WorkingEffectiveFeeStats } from '../mempool.interfaces'; +import { Ancestor, CpfpInfo, CpfpSummary, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, MempoolTransactionExtended, TransactionStripped, WorkingEffectiveFeeStats } from '../mempool.interfaces'; import config from '../config'; import { NodeSocket } from '../repositories/NodesSocketsRepository'; import { isIP } from 'net'; @@ -57,15 +57,15 @@ export class Common { return arr; } - static findRbfTransactions(added: TransactionExtended[], deleted: TransactionExtended[]): { [txid: string]: TransactionExtended[] } { - const matches: { [txid: string]: TransactionExtended[] } = {}; + static findRbfTransactions(added: MempoolTransactionExtended[], deleted: MempoolTransactionExtended[]): { [txid: string]: MempoolTransactionExtended[] } { + const matches: { [txid: string]: MempoolTransactionExtended[] } = {}; added .forEach((addedTx) => { const foundMatches = deleted.filter((deletedTx) => { // The new tx must, absolutely speaking, pay at least as much fee as the replaced tx. return addedTx.fee > deletedTx.fee // The new transaction must pay more fee per kB than the replaced tx. - && addedTx.feePerVsize > deletedTx.feePerVsize + && addedTx.adjustedFeePerVsize > deletedTx.adjustedFeePerVsize // Spends one or more of the same inputs && deletedTx.vin.some((deletedVin) => addedTx.vin.some((vin) => vin.txid === deletedVin.txid && vin.vout === deletedVin.vout)); @@ -120,18 +120,18 @@ export class Common { } } - static setRelativesAndGetCpfpInfo(tx: TransactionExtended, memPool: { [txid: string]: TransactionExtended }): CpfpInfo { + static setRelativesAndGetCpfpInfo(tx: MempoolTransactionExtended, memPool: { [txid: string]: MempoolTransactionExtended }): CpfpInfo { const parents = this.findAllParents(tx, memPool); - const lowerFeeParents = parents.filter((parent) => parent.feePerVsize < tx.effectiveFeePerVsize); + const lowerFeeParents = parents.filter((parent) => parent.adjustedFeePerVsize < tx.effectiveFeePerVsize); - let totalWeight = tx.weight + lowerFeeParents.reduce((prev, val) => prev + val.weight, 0); + let totalWeight = (tx.adjustedVsize * 4) + lowerFeeParents.reduce((prev, val) => prev + (val.adjustedVsize * 4), 0); let totalFees = tx.fee + lowerFeeParents.reduce((prev, val) => prev + val.fee, 0); tx.ancestors = parents .map((t) => { return { txid: t.txid, - weight: t.weight, + weight: (t.adjustedVsize * 4), fee: t.fee, }; }); @@ -152,8 +152,8 @@ export class Common { } - private static findAllParents(tx: TransactionExtended, memPool: { [txid: string]: TransactionExtended }): TransactionExtended[] { - let parents: TransactionExtended[] = []; + private static findAllParents(tx: MempoolTransactionExtended, memPool: { [txid: string]: MempoolTransactionExtended }): MempoolTransactionExtended[] { + let parents: MempoolTransactionExtended[] = []; tx.vin.forEach((parent) => { if (parents.find((p) => p.txid === parent.txid)) { return; @@ -161,17 +161,17 @@ export class Common { const parentTx = memPool[parent.txid]; if (parentTx) { - if (tx.bestDescendant && tx.bestDescendant.fee / (tx.bestDescendant.weight / 4) > parentTx.feePerVsize) { + if (tx.bestDescendant && tx.bestDescendant.fee / (tx.bestDescendant.weight / 4) > parentTx.adjustedFeePerVsize) { if (parentTx.bestDescendant && parentTx.bestDescendant.fee < tx.fee + tx.bestDescendant.fee) { parentTx.bestDescendant = { - weight: tx.weight + tx.bestDescendant.weight, + weight: (tx.adjustedVsize * 4) + tx.bestDescendant.weight, fee: tx.fee + tx.bestDescendant.fee, txid: tx.txid, }; } - } else if (tx.feePerVsize > parentTx.feePerVsize) { + } else if (tx.adjustedFeePerVsize > parentTx.adjustedFeePerVsize) { parentTx.bestDescendant = { - weight: tx.weight, + weight: (tx.adjustedVsize * 4), fee: tx.fee, txid: tx.txid }; diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 803b7e56e..51f07fac6 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,5 +1,5 @@ import logger from '../logger'; -import { MempoolBlock, TransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces'; +import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; import config from '../config'; import { Worker } from 'worker_threads'; @@ -36,9 +36,9 @@ class MempoolBlocks { return this.mempoolBlockDeltas; } - public updateMempoolBlocks(memPool: { [txid: string]: TransactionExtended }, saveResults: boolean = false): MempoolBlockWithTransactions[] { + public updateMempoolBlocks(memPool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): MempoolBlockWithTransactions[] { const latestMempool = memPool; - const memPoolArray: TransactionExtended[] = []; + const memPoolArray: MempoolTransactionExtended[] = []; for (const i in latestMempool) { if (latestMempool.hasOwnProperty(i)) { memPoolArray.push(latestMempool[i]); @@ -52,17 +52,17 @@ class MempoolBlocks { tx.ancestors = []; tx.cpfpChecked = false; if (!tx.effectiveFeePerVsize) { - tx.effectiveFeePerVsize = tx.feePerVsize; + tx.effectiveFeePerVsize = tx.adjustedFeePerVsize; } }); // First sort memPoolArray.sort((a, b) => { - if (a.feePerVsize === b.feePerVsize) { + if (a.adjustedFeePerVsize === b.adjustedFeePerVsize) { // tie-break by lexicographic txid order for stability return a.txid < b.txid ? -1 : 1; } else { - return b.feePerVsize - a.feePerVsize; + return b.adjustedFeePerVsize - a.adjustedFeePerVsize; } }); @@ -102,7 +102,7 @@ class MempoolBlocks { return blocks; } - private calculateMempoolBlocks(transactionsSorted: TransactionExtended[]): MempoolBlockWithTransactions[] { + private calculateMempoolBlocks(transactionsSorted: MempoolTransactionExtended[]): MempoolBlockWithTransactions[] { const mempoolBlocks: MempoolBlockWithTransactions[] = []; let feeStatsCalculator: OnlineFeeStatsCalculator = new OnlineFeeStatsCalculator(config.MEMPOOL.BLOCK_WEIGHT_UNITS); let onlineStats = false; @@ -112,7 +112,7 @@ class MempoolBlocks { let blockFees = 0; const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; let transactionIds: string[] = []; - let transactions: TransactionExtended[] = []; + let transactions: MempoolTransactionExtended[] = []; transactionsSorted.forEach((tx, index) => { if (blockWeight + tx.weight <= config.MEMPOOL.BLOCK_WEIGHT_UNITS || mempoolBlocks.length === config.MEMPOOL.MEMPOOL_BLOCKS_AMOUNT - 1) { @@ -205,7 +205,7 @@ class MempoolBlocks { return mempoolBlockDeltas; } - public async $makeBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, saveResults: boolean = false): Promise { + public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): Promise { const start = Date.now(); // reset mempool short ids @@ -222,9 +222,9 @@ class MempoolBlocks { strippedMempool.set(entry.uid, { uid: entry.uid, fee: entry.fee, - weight: entry.weight, - feePerVsize: entry.fee / (entry.weight / 4), - effectiveFeePerVsize: entry.effectiveFeePerVsize || (entry.fee / (entry.weight / 4)), + weight: (entry.adjustedVsize * 4), + feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, + effectiveFeePerVsize: entry.effectiveFeePerVsize || entry.adjustedFeePerVsize || entry.feePerVsize, inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], }); } @@ -268,7 +268,7 @@ class MempoolBlocks { return this.mempoolBlocks; } - public async $updateBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, added: TransactionExtended[], removed: TransactionExtended[], saveResults: boolean = false): Promise { + public async $updateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], saveResults: boolean = false): Promise { if (!this.txSelectionWorker) { // need to reset the worker await this.$makeBlockTemplates(newMempool, saveResults); @@ -287,9 +287,9 @@ class MempoolBlocks { return { uid: entry.uid || 0, fee: entry.fee, - weight: entry.weight, - feePerVsize: entry.fee / (entry.weight / 4), - effectiveFeePerVsize: entry.effectiveFeePerVsize || (entry.fee / (entry.weight / 4)), + weight: (entry.adjustedVsize * 4), + feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, + effectiveFeePerVsize: entry.effectiveFeePerVsize || entry.adjustedFeePerVsize || entry.feePerVsize, inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], }; }); @@ -341,12 +341,12 @@ class MempoolBlocks { for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) { const block: string[] = blocks[blockIndex]; let txid: string; - let mempoolTx: TransactionExtended; + let mempoolTx: MempoolTransactionExtended; let totalSize = 0; let totalVsize = 0; let totalWeight = 0; let totalFees = 0; - const transactions: TransactionExtended[] = []; + const transactions: MempoolTransactionExtended[] = []; for (let txIndex = 0; txIndex < block.length; txIndex++) { txid = block[txIndex]; if (txid) { @@ -397,7 +397,7 @@ class MempoolBlocks { const relative = { txid: txid, fee: mempool[txid].fee, - weight: mempool[txid].weight, + weight: (mempool[txid].adjustedVsize * 4), }; if (matched) { descendants.push(relative); @@ -426,7 +426,7 @@ class MempoolBlocks { return mempoolBlocks; } - private dataToMempoolBlocks(transactionIds: string[], transactions: TransactionExtended[], totalSize: number, totalWeight: number, totalFees: number, feeStats?: EffectiveFeeStats ): MempoolBlockWithTransactions { + private dataToMempoolBlocks(transactionIds: string[], transactions: MempoolTransactionExtended[], totalSize: number, totalWeight: number, totalFees: number, feeStats?: EffectiveFeeStats ): MempoolBlockWithTransactions { if (!feeStats) { feeStats = Common.calcEffectiveFeeStatistics(transactions); } @@ -447,7 +447,7 @@ class MempoolBlocks { this.nextUid = 1; } - private setUid(tx: TransactionExtended): number { + private setUid(tx: MempoolTransactionExtended): number { const uid = this.nextUid; this.nextUid++; this.uidMap.set(uid, tx.txid); @@ -455,7 +455,7 @@ class MempoolBlocks { return uid; } - private getUid(tx: TransactionExtended): number | void { + private getUid(tx: MempoolTransactionExtended): number | void { if (tx?.uid != null && this.uidMap.has(tx.uid)) { return tx.uid; } diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index fe84fb8e4..b5a565334 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -1,6 +1,6 @@ import config from '../config'; import bitcoinApi from './bitcoin/bitcoin-api-factory'; -import { TransactionExtended, VbytesPerSecond } from '../mempool.interfaces'; +import { MempoolTransactionExtended, VbytesPerSecond } from '../mempool.interfaces'; import logger from '../logger'; import { Common } from './common'; import transactionUtils from './transaction-utils'; @@ -13,14 +13,14 @@ import rbfCache from './rbf-cache'; class Mempool { private inSync: boolean = false; private mempoolCacheDelta: number = -1; - private mempoolCache: { [txId: string]: TransactionExtended } = {}; - private spendMap = new Map(); + private mempoolCache: { [txId: string]: MempoolTransactionExtended } = {}; + private spendMap = new Map(); private mempoolInfo: IBitcoinApi.MempoolInfo = { loaded: false, size: 0, bytes: 0, usage: 0, total_fee: 0, maxmempool: 300000000, mempoolminfee: 0.00001000, minrelaytxfee: 0.00001000 }; - private mempoolChangedCallback: ((newMempool: {[txId: string]: TransactionExtended; }, newTransactions: TransactionExtended[], - deletedTransactions: TransactionExtended[]) => void) | undefined; - private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: TransactionExtended; }, newTransactions: TransactionExtended[], - deletedTransactions: TransactionExtended[]) => Promise) | undefined; + private mempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, newTransactions: MempoolTransactionExtended[], + deletedTransactions: MempoolTransactionExtended[]) => void) | undefined; + private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, newTransactions: MempoolTransactionExtended[], + deletedTransactions: MempoolTransactionExtended[]) => Promise) | undefined; private txPerSecondArray: number[] = []; private txPerSecond: number = 0; @@ -64,26 +64,31 @@ class Mempool { return this.latestTransactions; } - public setMempoolChangedCallback(fn: (newMempool: { [txId: string]: TransactionExtended; }, - newTransactions: TransactionExtended[], deletedTransactions: TransactionExtended[]) => void) { + public setMempoolChangedCallback(fn: (newMempool: { [txId: string]: MempoolTransactionExtended; }, + newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]) => void): void { this.mempoolChangedCallback = fn; } - public setAsyncMempoolChangedCallback(fn: (newMempool: { [txId: string]: TransactionExtended; }, - newTransactions: TransactionExtended[], deletedTransactions: TransactionExtended[]) => Promise) { + public setAsyncMempoolChangedCallback(fn: (newMempool: { [txId: string]: MempoolTransactionExtended; }, + newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]) => Promise): void { this.$asyncMempoolChangedCallback = fn; } - public getMempool(): { [txid: string]: TransactionExtended } { + public getMempool(): { [txid: string]: MempoolTransactionExtended } { return this.mempoolCache; } - public getSpendMap(): Map { + public getSpendMap(): Map { return this.spendMap; } - public async $setMempool(mempoolData: { [txId: string]: TransactionExtended }) { + public async $setMempool(mempoolData: { [txId: string]: MempoolTransactionExtended }) { this.mempoolCache = mempoolData; + for (const txid of Object.keys(this.mempoolCache)) { + if (this.mempoolCache[txid].sigops == null || this.mempoolCache[txid].effectiveFeePerVsize == null) { + this.mempoolCache[txid] = transactionUtils.extendMempoolTransaction(this.mempoolCache[txid]); + } + } if (this.mempoolChangedCallback) { this.mempoolChangedCallback(this.mempoolCache, [], []); } @@ -133,7 +138,7 @@ class Mempool { const currentMempoolSize = Object.keys(this.mempoolCache).length; this.updateTimerProgress(timer, 'got raw mempool'); const diff = transactions.length - currentMempoolSize; - const newTransactions: TransactionExtended[] = []; + const newTransactions: MempoolTransactionExtended[] = []; this.mempoolCacheDelta = Math.abs(diff); @@ -155,7 +160,7 @@ class Mempool { for (const txid of transactions) { if (!this.mempoolCache[txid]) { try { - const transaction = await transactionUtils.$getTransactionExtended(txid); + const transaction = await transactionUtils.$getMempoolTransactionExtended(txid, false, false, false); this.updateTimerProgress(timer, 'fetched new transaction'); this.mempoolCache[txid] = transaction; if (this.inSync) { @@ -205,7 +210,7 @@ class Mempool { }, 1000 * 60 * config.MEMPOOL.CLEAR_PROTECTION_MINUTES); } - const deletedTransactions: TransactionExtended[] = []; + const deletedTransactions: MempoolTransactionExtended[] = []; if (this.mempoolProtection !== 1) { this.mempoolProtection = 0; @@ -273,7 +278,7 @@ class Mempool { } } - public handleRbfTransactions(rbfTransactions: { [txid: string]: TransactionExtended[]; }): void { + public handleRbfTransactions(rbfTransactions: { [txid: string]: MempoolTransactionExtended[]; }): void { for (const rbfTransaction in rbfTransactions) { if (this.mempoolCache[rbfTransaction] && rbfTransactions[rbfTransaction]?.length) { // Store replaced transactions @@ -282,7 +287,7 @@ class Mempool { } } - public handleMinedRbfTransactions(rbfTransactions: { [txid: string]: { replaced: TransactionExtended[], replacedBy: TransactionExtended }}): void { + public handleMinedRbfTransactions(rbfTransactions: { [txid: string]: { replaced: MempoolTransactionExtended[], replacedBy: MempoolTransactionExtended }}): void { for (const rbfTransaction in rbfTransactions) { if (rbfTransactions[rbfTransaction].replacedBy && rbfTransactions[rbfTransaction]?.replaced?.length) { // Store replaced transactions @@ -291,7 +296,7 @@ class Mempool { } } - public addToSpendMap(transactions: TransactionExtended[]): void { + public addToSpendMap(transactions: MempoolTransactionExtended[]): void { for (const tx of transactions) { for (const vin of tx.vin) { this.spendMap.set(`${vin.txid}:${vin.vout}`, tx); @@ -299,7 +304,7 @@ class Mempool { } } - public removeFromSpendMap(transactions: TransactionExtended[]): void { + public removeFromSpendMap(transactions: MempoolTransactionExtended[]): void { for (const tx of transactions) { for (const vin of tx.vin) { const key = `${vin.txid}:${vin.vout}`; diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 51f8ffeca..f0a916c8c 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -1,5 +1,5 @@ import logger from "../logger"; -import { TransactionExtended, TransactionStripped } from "../mempool.interfaces"; +import { MempoolTransactionExtended, TransactionStripped } from "../mempool.interfaces"; import bitcoinApi from './bitcoin/bitcoin-api-factory'; import { Common } from "./common"; @@ -23,14 +23,14 @@ class RbfCache { private rbfTrees: Map = new Map(); // sequences of consecutive replacements private dirtyTrees: Set = new Set(); private treeMap: Map = new Map(); // map of txids to sequence ids - private txs: Map = new Map(); + private txs: Map = new Map(); private expiring: Map = new Map(); constructor() { setInterval(this.cleanup.bind(this), 1000 * 60 * 10); } - public add(replaced: TransactionExtended[], newTxExtended: TransactionExtended): void { + public add(replaced: MempoolTransactionExtended[], newTxExtended: MempoolTransactionExtended): void { if (!newTxExtended || !replaced?.length || this.txs.has(newTxExtended.txid)) { return; } @@ -92,7 +92,7 @@ class RbfCache { return this.replaces.get(txId); } - public getTx(txId: string): TransactionExtended | undefined { + public getTx(txId: string): MempoolTransactionExtended | undefined { return this.txs.get(txId); } @@ -272,7 +272,7 @@ class RbfCache { return deflated; } - async importTree(root, txid, deflated, txs: Map, mined: boolean = false): Promise { + async importTree(root, txid, deflated, txs: Map, mined: boolean = false): Promise { const treeInfo = deflated[txid]; const replaces: RbfTree[] = []; diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index fb69419fc..acb268b44 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -1,7 +1,8 @@ -import { TransactionExtended, TransactionMinerInfo } from '../mempool.interfaces'; +import { TransactionExtended, MempoolTransactionExtended, TransactionMinerInfo } from '../mempool.interfaces'; import { IEsploraApi } from './bitcoin/esplora-api.interface'; import { Common } from './common'; import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; +import * as bitcoinjs from 'bitcoinjs-lib'; class TransactionUtils { constructor() { } @@ -22,19 +23,27 @@ class TransactionUtils { } /** - * @param txId - * @param addPrevouts - * @param lazyPrevouts + * @param txId + * @param addPrevouts + * @param lazyPrevouts * @param forceCore - See https://github.com/mempool/mempool/issues/2904 */ - public async $getTransactionExtended(txId: string, addPrevouts = false, lazyPrevouts = false, forceCore = false): Promise { + public async $getTransactionExtended(txId: string, addPrevouts = false, lazyPrevouts = false, forceCore = false, addMempoolData = false): Promise { let transaction: IEsploraApi.Transaction; if (forceCore === true) { transaction = await bitcoinCoreApi.$getRawTransaction(txId, true); } else { transaction = await bitcoinApi.$getRawTransaction(txId, false, addPrevouts, lazyPrevouts); } - return this.extendTransaction(transaction); + if (addMempoolData || !transaction?.status?.confirmed) { + return this.extendMempoolTransaction(transaction); + } else { + return this.extendTransaction(transaction); + } + } + + public async $getMempoolTransactionExtended(txId: string, addPrevouts = false, lazyPrevouts = false, forceCore = false): Promise { + return (await this.$getTransactionExtended(txId, addPrevouts, lazyPrevouts, forceCore, true)) as MempoolTransactionExtended; } private extendTransaction(transaction: IEsploraApi.Transaction): TransactionExtended { @@ -50,7 +59,30 @@ class TransactionUtils { feePerVsize: feePerVbytes, effectiveFeePerVsize: feePerVbytes, }, transaction); - if (!transaction.status.confirmed) { + if (!transaction?.status?.confirmed) { + transactionExtended.firstSeen = Math.round((new Date().getTime() / 1000)); + } + return transactionExtended; + } + + public extendMempoolTransaction(transaction: IEsploraApi.Transaction): MempoolTransactionExtended { + const vsize = Math.ceil(transaction.weight / 4); + const sigops = this.countSigops(transaction); + // https://github.com/bitcoin/bitcoin/blob/e9262ea32a6e1d364fb7974844fadc36f931f8c6/src/policy/policy.cpp#L295-L298 + const adjustedVsize = Math.max(vsize, sigops * 5); // adjusted vsize = Max(weight, sigops * bytes_per_sigop) / witness_scale_factor + const feePerVbytes = Math.max(Common.isLiquid() ? 0.1 : 1, + (transaction.fee || 0) / vsize); + const adjustedFeePerVsize = Math.max(Common.isLiquid() ? 0.1 : 1, + (transaction.fee || 0) / adjustedVsize); + const transactionExtended: MempoolTransactionExtended = Object.assign(transaction, { + vsize: Math.round(transaction.weight / 4), + adjustedVsize, + sigops, + feePerVsize: feePerVbytes, + adjustedFeePerVsize: adjustedFeePerVsize, + effectiveFeePerVsize: adjustedFeePerVsize, + }); + if (!transaction?.status?.confirmed) { transactionExtended.firstSeen = Math.round((new Date().getTime() / 1000)); } return transactionExtended; @@ -63,6 +95,64 @@ class TransactionUtils { } return str; } + + public countScriptSigops(script: string, isRawScript: boolean = false, witness: boolean = false): number { + let sigops = 0; + // count OP_CHECKSIG and OP_CHECKSIGVERIFY + sigops += (script.match(/OP_CHECKSIG/g)?.length || 0); + + // count OP_CHECKMULTISIG and OP_CHECKMULTISIGVERIFY + if (isRawScript) { + // in scriptPubKey or scriptSig, always worth 20 + sigops += 20 * (script.match(/OP_CHECKMULTISIG/g)?.length || 0); + } else { + // in redeem scripts and witnesses, worth N if preceded by OP_N, 20 otherwise + const matches = script.matchAll(/(?:OP_(\d+))? OP_CHECKMULTISIG/g); + for (const match of matches) { + const n = parseInt(match[1]); + if (Number.isInteger(n)) { + sigops += n; + } else { + sigops += 20; + } + } + } + + return witness ? sigops : (sigops * 4); + } + + public countSigops(transaction: IEsploraApi.Transaction): number { + let sigops = 0; + + for (const input of transaction.vin) { + if (input.scriptsig_asm) { + sigops += this.countScriptSigops(input.scriptsig_asm, true); + } + if (input.prevout) { + switch (true) { + case input.prevout.scriptpubkey_type === 'p2sh' && input.witness?.length === 2 && input.scriptsig && input.scriptsig.startsWith('160014'): + case input.prevout.scriptpubkey_type === 'v0_p2wpkh': + sigops += 1; + break; + + case input.prevout?.scriptpubkey_type === 'p2sh' && input.witness?.length && input.scriptsig && input.scriptsig.startsWith('220020'): + case input.prevout.scriptpubkey_type === 'v0_p2wsh': + if (input.witness?.length) { + sigops += this.countScriptSigops(bitcoinjs.script.toASM(Buffer.from(input.witness[input.witness.length - 1], 'hex')), false, true); + } + break; + } + } + } + + for (const output of transaction.vout) { + if (output.scriptpubkey_asm) { + sigops += this.countScriptSigops(output.scriptpubkey_asm, true); + } + } + + return sigops; + } } export default new TransactionUtils(); diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index ca1bb01ff..89b819b08 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -1,7 +1,7 @@ import logger from '../logger'; import * as WebSocket from 'ws'; import { - BlockExtended, TransactionExtended, WebsocketResponse, + BlockExtended, TransactionExtended, MempoolTransactionExtended, WebsocketResponse, OptimizedStatistic, ILoadingIndicators } from '../mempool.interfaces'; import blocks from './blocks'; @@ -122,7 +122,7 @@ class WebsocketHandler { } else { // tx.prevout is missing from transactions when in bitcoind mode try { - const fullTx = await transactionUtils.$getTransactionExtended(tx.txid, true); + const fullTx = await transactionUtils.$getMempoolTransactionExtended(tx.txid, true); response['tx'] = fullTx; } catch (e) { logger.debug('Error finding transaction: ' + (e instanceof Error ? e.message : e)); @@ -130,7 +130,7 @@ class WebsocketHandler { } } else { try { - const fullTx = await transactionUtils.$getTransactionExtended(client['track-tx'], true); + const fullTx = await transactionUtils.$getMempoolTransactionExtended(client['track-tx'], true); response['tx'] = fullTx; } catch (e) { logger.debug('Error finding transaction. ' + (e instanceof Error ? e.message : e)); @@ -301,8 +301,8 @@ class WebsocketHandler { }); } - async $handleMempoolChange(newMempool: { [txid: string]: TransactionExtended }, - newTransactions: TransactionExtended[], deletedTransactions: TransactionExtended[]): Promise { + async $handleMempoolChange(newMempool: { [txid: string]: MempoolTransactionExtended }, + newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]): Promise { if (!this.wss) { throw new Error('WebSocket.Server is not set'); } @@ -399,7 +399,7 @@ class WebsocketHandler { if (tx) { if (config.MEMPOOL.BACKEND !== 'esplora') { try { - const fullTx = await transactionUtils.$getTransactionExtended(tx.txid, true); + const fullTx = await transactionUtils.$getMempoolTransactionExtended(tx.txid, true); response['tx'] = JSON.stringify(fullTx); } catch (e) { logger.debug('Error finding transaction in mempool: ' + (e instanceof Error ? e.message : e)); @@ -419,7 +419,7 @@ class WebsocketHandler { if (someVin) { if (config.MEMPOOL.BACKEND !== 'esplora') { try { - const fullTx = await transactionUtils.$getTransactionExtended(tx.txid, true); + const fullTx = await transactionUtils.$getMempoolTransactionExtended(tx.txid, true); foundTransactions.push(fullTx); } catch (e) { logger.debug('Error finding transaction in mempool: ' + (e instanceof Error ? e.message : e)); @@ -433,7 +433,7 @@ class WebsocketHandler { if (someVout) { if (config.MEMPOOL.BACKEND !== 'esplora') { try { - const fullTx = await transactionUtils.$getTransactionExtended(tx.txid, true); + const fullTx = await transactionUtils.$getMempoolTransactionExtended(tx.txid, true); foundTransactions.push(fullTx); } catch (e) { logger.debug('Error finding transaction in mempool: ' + (e instanceof Error ? e.message : e)); diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 14114fa2c..e7fba439d 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -88,6 +88,12 @@ export interface TransactionExtended extends IEsploraApi.Transaction { uid?: number; } +export interface MempoolTransactionExtended extends TransactionExtended { + sigops: number; + adjustedVsize: number; + adjustedFeePerVsize: number; +} + export interface AuditTransaction { uid: number; fee: number; From ec63c822db7bfe8cc0d8590dc725ba1d97083501 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 29 May 2023 17:19:22 -0400 Subject: [PATCH 383/782] Display sigops & adjusted vsize in transaction page details --- backend/src/api/bitcoin/bitcoin.routes.ts | 2 ++ .../app/components/transaction/transaction.component.html | 8 ++++++++ frontend/src/app/interfaces/node-api.interface.ts | 2 ++ 3 files changed, 12 insertions(+) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index 16533b68c..0a343c376 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -211,6 +211,8 @@ class BitcoinRoutes { bestDescendant: tx.bestDescendant || null, descendants: tx.descendants || null, effectiveFeePerVsize: tx.effectiveFeePerVsize || null, + sigops: tx.sigops, + adjustedVsize: tx.adjustedVsize, }); return; } diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index c718f534e..2e00682c1 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -271,6 +271,10 @@ + + + + @@ -289,6 +293,10 @@ + + + + diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 106b875d2..a2e7b6537 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -25,6 +25,8 @@ export interface CpfpInfo { descendants?: Ancestor[]; bestDescendant?: BestDescendant | null; effectiveFeePerVsize?: number; + sigops?: number; + adjustedVsize?: number; } export interface RbfInfo { From bf7df0830501f698ab9be59f9130a654192d9848 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 29 May 2023 17:21:02 -0400 Subject: [PATCH 384/782] Enforce block sigop limits in GBT algorithm --- backend/src/api/mempool-blocks.ts | 2 ++ backend/src/api/tx-selection-worker.ts | 8 +++++++- backend/src/mempool.interfaces.ts | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 51f07fac6..9b5da8b3b 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -223,6 +223,7 @@ class MempoolBlocks { uid: entry.uid, fee: entry.fee, weight: (entry.adjustedVsize * 4), + sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, effectiveFeePerVsize: entry.effectiveFeePerVsize || entry.adjustedFeePerVsize || entry.feePerVsize, inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], @@ -288,6 +289,7 @@ class MempoolBlocks { uid: entry.uid || 0, fee: entry.fee, weight: (entry.adjustedVsize * 4), + sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, effectiveFeePerVsize: entry.effectiveFeePerVsize || entry.adjustedFeePerVsize || entry.feePerVsize, inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], diff --git a/backend/src/api/tx-selection-worker.ts b/backend/src/api/tx-selection-worker.ts index 5bca59958..0acc2f65e 100644 --- a/backend/src/api/tx-selection-worker.ts +++ b/backend/src/api/tx-selection-worker.ts @@ -48,12 +48,14 @@ function makeBlockTemplates(mempool: Map) weight: tx.weight, feePerVsize: tx.feePerVsize, effectiveFeePerVsize: tx.feePerVsize, + sigops: tx.sigops, inputs: tx.inputs || [], relativesSet: false, ancestorMap: new Map(), children: new Set(), ancestorFee: 0, ancestorWeight: 0, + ancestorSigops: 0, score: 0, used: false, modified: false, @@ -83,6 +85,7 @@ function makeBlockTemplates(mempool: Map) // (i.e. the package rooted in the transaction with the best ancestor score) const blocks: number[][] = []; let blockWeight = 4000; + let blockSigops = 0; let transactions: AuditTransaction[] = []; const modified: PairingHeap = new PairingHeap((a, b): boolean => { if (a.score === b.score) { @@ -118,7 +121,7 @@ function makeBlockTemplates(mempool: Map) if (nextTx && !nextTx?.used) { // Check if the package fits into this block - if (blocks.length >= 7 || (blockWeight + nextTx.ancestorWeight < config.MEMPOOL.BLOCK_WEIGHT_UNITS)) { + if (blocks.length >= 7 || ((blockWeight + nextTx.ancestorWeight < config.MEMPOOL.BLOCK_WEIGHT_UNITS) && (blockSigops + nextTx.ancestorSigops <= 80000))) { const ancestors: AuditTransaction[] = Array.from(nextTx.ancestorMap.values()); // sort ancestors by dependency graph (equivalent to sorting by ascending ancestor count) const sortedTxSet = [...ancestors.sort((a, b) => { return (a.ancestorMap.size || 0) - (b.ancestorMap.size || 0); }), nextTx]; @@ -237,9 +240,11 @@ function setRelatives( }; tx.ancestorFee = tx.fee || 0; tx.ancestorWeight = tx.weight || 0; + tx.ancestorSigops = tx.sigops || 0; tx.ancestorMap.forEach((ancestor) => { tx.ancestorFee += ancestor.fee; tx.ancestorWeight += ancestor.weight; + tx.ancestorSigops += ancestor.sigops; }); tx.score = tx.ancestorFee / ((tx.ancestorWeight / 4) || 1); tx.relativesSet = true; @@ -271,6 +276,7 @@ function updateDescendants( descendantTx.ancestorMap.delete(rootTx.uid); descendantTx.ancestorFee -= rootTx.fee; descendantTx.ancestorWeight -= rootTx.weight; + descendantTx.ancestorSigops -= rootTx.sigops; tmpScore = descendantTx.score; descendantTx.score = descendantTx.ancestorFee / (descendantTx.ancestorWeight / 4); descendantTx.dependencyRate = descendantTx.dependencyRate ? Math.min(descendantTx.dependencyRate, clusterRate) : clusterRate; diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index e7fba439d..c3e0d02ba 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -100,12 +100,14 @@ export interface AuditTransaction { weight: number; feePerVsize: number; effectiveFeePerVsize: number; + sigops: number; inputs: number[]; relativesSet: boolean; ancestorMap: Map; children: Set; ancestorFee: number; ancestorWeight: number; + ancestorSigops: number; score: number; used: boolean; modified: boolean; @@ -117,6 +119,7 @@ export interface CompactThreadTransaction { uid: number; fee: number; weight: number; + sigops: number; feePerVsize: number; effectiveFeePerVsize?: number; inputs: number[]; From 0e5dc2185456d37e391c3d8998da5bb5c9b7b949 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 31 May 2023 11:37:13 -0400 Subject: [PATCH 385/782] Fix mined rbf / calculate sigop merge conflicts --- backend/src/api/common.ts | 6 +++--- backend/src/api/mempool.ts | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index a2a74e907..37b09a417 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -77,10 +77,10 @@ export class Common { return matches; } - static findMinedRbfTransactions(minedTransactions: TransactionExtended[], spendMap: Map): { [txid: string]: { replaced: TransactionExtended[], replacedBy: TransactionExtended }} { - const matches: { [txid: string]: { replaced: TransactionExtended[], replacedBy: TransactionExtended }} = {}; + static findMinedRbfTransactions(minedTransactions: TransactionExtended[], spendMap: Map): { [txid: string]: { replaced: MempoolTransactionExtended[], replacedBy: TransactionExtended }} { + const matches: { [txid: string]: { replaced: MempoolTransactionExtended[], replacedBy: TransactionExtended }} = {}; for (const tx of minedTransactions) { - const replaced: Set = new Set(); + const replaced: Set = new Set(); for (let i = 0; i < tx.vin.length; i++) { const vin = tx.vin[i]; const match = spendMap.get(`${vin.txid}:${vin.vout}`); diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index b5a565334..e3543f4fc 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -1,6 +1,6 @@ import config from '../config'; import bitcoinApi from './bitcoin/bitcoin-api-factory'; -import { MempoolTransactionExtended, VbytesPerSecond } from '../mempool.interfaces'; +import { MempoolTransactionExtended, TransactionExtended, VbytesPerSecond } from '../mempool.interfaces'; import logger from '../logger'; import { Common } from './common'; import transactionUtils from './transaction-utils'; @@ -287,11 +287,11 @@ class Mempool { } } - public handleMinedRbfTransactions(rbfTransactions: { [txid: string]: { replaced: MempoolTransactionExtended[], replacedBy: MempoolTransactionExtended }}): void { + public handleMinedRbfTransactions(rbfTransactions: { [txid: string]: { replaced: MempoolTransactionExtended[], replacedBy: TransactionExtended }}): void { for (const rbfTransaction in rbfTransactions) { if (rbfTransactions[rbfTransaction].replacedBy && rbfTransactions[rbfTransaction]?.replaced?.length) { // Store replaced transactions - rbfCache.add(rbfTransactions[rbfTransaction].replaced, rbfTransactions[rbfTransaction].replacedBy); + rbfCache.add(rbfTransactions[rbfTransaction].replaced, transactionUtils.extendMempoolTransaction(rbfTransactions[rbfTransaction].replacedBy)); } } } @@ -304,7 +304,7 @@ class Mempool { } } - public removeFromSpendMap(transactions: MempoolTransactionExtended[]): void { + public removeFromSpendMap(transactions: TransactionExtended[]): void { for (const tx of transactions) { for (const vin of tx.vin) { const key = `${vin.txid}:${vin.vout}`; From ee1ec414ed51b224fb8637f87855e890f3dbc230 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 31 May 2023 11:45:47 -0400 Subject: [PATCH 386/782] use fractional base vsize in adjusted vsize --- backend/src/api/transaction-utils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index acb268b44..2d1f0f955 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -67,11 +67,12 @@ class TransactionUtils { public extendMempoolTransaction(transaction: IEsploraApi.Transaction): MempoolTransactionExtended { const vsize = Math.ceil(transaction.weight / 4); + const fractionalVsize = (transaction.weight / 4); const sigops = this.countSigops(transaction); // https://github.com/bitcoin/bitcoin/blob/e9262ea32a6e1d364fb7974844fadc36f931f8c6/src/policy/policy.cpp#L295-L298 - const adjustedVsize = Math.max(vsize, sigops * 5); // adjusted vsize = Max(weight, sigops * bytes_per_sigop) / witness_scale_factor + const adjustedVsize = Math.max(fractionalVsize, sigops * 5); // adjusted vsize = Max(weight, sigops * bytes_per_sigop) / witness_scale_factor const feePerVbytes = Math.max(Common.isLiquid() ? 0.1 : 1, - (transaction.fee || 0) / vsize); + (transaction.fee || 0) / fractionalVsize); const adjustedFeePerVsize = Math.max(Common.isLiquid() ? 0.1 : 1, (transaction.fee || 0) / adjustedVsize); const transactionExtended: MempoolTransactionExtended = Object.assign(transaction, { From 0ac76e12c4f7d834ab7b7a5be6a495fbf119f0f3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 31 May 2023 12:11:56 -0400 Subject: [PATCH 387/782] Fix frontend logic for displaying effective fee rate --- .../components/transaction/transaction.component.html | 4 ++-- .../app/components/transaction/transaction.component.ts | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 2e00682c1..4e301790b 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -485,11 +485,11 @@ {{ tx.feePerVsize | feeRounding }} sat/vB   - + - + + + + + diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index a2e7b6537..53763bbf9 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -149,6 +149,7 @@ export interface BlockAudit extends BlockExtended { missingTxs: string[], addedTxs: string[], matchRate: number, + expectedFees: number, template: TransactionStripped[], transactions: TransactionStripped[], } From 9e1de656c1d05a288a0d66a43f491b107ae63fdf Mon Sep 17 00:00:00 2001 From: junderw Date: Mon, 5 Jun 2023 07:21:55 -0700 Subject: [PATCH 396/782] Fix: Annex parsing for p2tr on bitcoind/romanz backends --- backend/src/api/bitcoin/bitcoin-api.ts | 32 +++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index e20fe9e34..307736737 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -415,12 +415,38 @@ class BitcoinApi implements AbstractBitcoinApi { vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); } - if (vin.prevout.scriptpubkey_type === 'v1_p2tr' && vin.witness && vin.witness.length > 1) { - const witnessScript = vin.witness[vin.witness.length - 2]; - vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); + if (vin.prevout.scriptpubkey_type === 'v1_p2tr' && vin.witness) { + const witnessScript = this.witnessToP2TRScript(vin.witness); + if (witnessScript !== null) { + vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); + } } } + /** + * This function must only be called when we know the witness we are parsing + * is a taproot witness. + * @param witness An array of hex strings that represents the witness stack of + * the input. + * @returns null if the witness is not a script spend, and the hex string of + * the script item if it is a script spend. + */ + private witnessToP2TRScript(witness: string[]): string | null { + if (witness.length < 2) return null; + // Note: see BIP341 for parsing details of witness stack + + // If there are at least two witness elements, and the first byte of the + // last element is 0x50, this last element is called annex a and + // is removed from the witness stack. + const hasAnnex = witness[witness.length - 1].substring(0, 2) === '50'; + // If there are at least two witness elements left, script path spending is used. + // Call the second-to-last stack element s, the script. + // (Note: this phrasing from BIP341 assumes we've *removed* the annex from the stack) + if (hasAnnex && witness.length < 3) return null; + const positionOfScript = hasAnnex ? witness.length - 3 : witness.length - 2; + return witness[positionOfScript]; + } + } export default BitcoinApi; From ec0d5e0c23a452bf7a7d3247e26586284f003d6b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 5 Jun 2023 13:27:17 -0400 Subject: [PATCH 397/782] Polish clocks, fix urls, make interactive --- frontend/src/app/app-routing.module.ts | 15 ++++--- .../blockchain-blocks.component.html | 4 +- .../blockchain-blocks.component.ts | 1 + .../clock/clock-mempool.component.html | 1 - .../clock/clock-mempool.component.ts | 7 --- .../clock/clock-mined.component.html | 1 - .../components/clock/clock-mined.component.ts | 7 --- .../app/components/clock/clock.component.html | 23 ++++++---- .../app/components/clock/clock.component.ts | 45 ++++++++++++++++--- .../clockchain/clockchain.component.html | 16 ++++++- .../clockchain/clockchain.component.ts | 11 ++++- .../mempool-blocks.component.html | 2 +- .../mempool-blocks.component.ts | 1 + frontend/src/app/shared/shared.module.ts | 6 --- 14 files changed, 90 insertions(+), 50 deletions(-) delete mode 100644 frontend/src/app/components/clock/clock-mempool.component.html delete mode 100644 frontend/src/app/components/clock/clock-mempool.component.ts delete mode 100644 frontend/src/app/components/clock/clock-mined.component.html delete mode 100644 frontend/src/app/components/clock/clock-mined.component.ts diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 0fe496d3e..6285aef08 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -4,8 +4,7 @@ import { AppPreloadingStrategy } from './app.preloading-strategy' import { StartComponent } from './components/start/start.component'; import { TransactionComponent } from './components/transaction/transaction.component'; import { BlockComponent } from './components/block/block.component'; -import { ClockMinedComponent as ClockMinedComponent } from './components/clock/clock-mined.component'; -import { ClockMempoolComponent as ClockMempoolComponent } from './components/clock/clock-mempool.component'; +import { ClockComponent } from './components/clock/clock.component'; import { AddressComponent } from './components/address/address.component'; import { MasterPageComponent } from './components/master-page/master-page.component'; import { AboutComponent } from './components/about/about.component'; @@ -358,12 +357,16 @@ let routes: Routes = [ ], }, { - path: 'clock-mined', - component: ClockMinedComponent, + path: 'clock', + redirectTo: 'clock/mined/0' }, { - path: 'clock-mempool', - component: ClockMempoolComponent, + path: 'clock/:mode', + redirectTo: 'clock/:mode/0' + }, + { + path: 'clock/:mode/:index', + component: ClockComponent, }, { path: 'status', diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html index 8ea5acef6..69f13b6fe 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -13,10 +13,10 @@ [class.offscreen]="!static && count && i >= count" id="bitcoin-block-{{ block.height }}" [ngStyle]="blockStyles[i]" [class.blink-bg]="isSpecial(block.height)"> -  
    diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 65c949b4d..87cffd228 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -27,6 +27,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { @Input() minimal: boolean = false; @Input() blockWidth: number = 125; @Input() spotlight: number = 0; + @Input() getHref?: (index, block) => string = (index, block) => `/block/${block.id}`; specialBlocks = specialBlocks; network = ''; diff --git a/frontend/src/app/components/clock/clock-mempool.component.html b/frontend/src/app/components/clock/clock-mempool.component.html deleted file mode 100644 index a8620a212..000000000 --- a/frontend/src/app/components/clock/clock-mempool.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/app/components/clock/clock-mempool.component.ts b/frontend/src/app/components/clock/clock-mempool.component.ts deleted file mode 100644 index 7e99cc08b..000000000 --- a/frontend/src/app/components/clock/clock-mempool.component.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-clock-mempool', - templateUrl: './clock-mempool.component.html', -}) -export class ClockMempoolComponent {} diff --git a/frontend/src/app/components/clock/clock-mined.component.html b/frontend/src/app/components/clock/clock-mined.component.html deleted file mode 100644 index a3bebd4bd..000000000 --- a/frontend/src/app/components/clock/clock-mined.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/app/components/clock/clock-mined.component.ts b/frontend/src/app/components/clock/clock-mined.component.ts deleted file mode 100644 index b26815ac6..000000000 --- a/frontend/src/app/components/clock/clock-mined.component.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-clock-mined', - templateUrl: './clock-mined.component.html', -}) -export class ClockMinedComponent {} diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index b869ef005..cff158697 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -1,14 +1,19 @@
    - +
    - - + +
    @@ -20,12 +25,12 @@
    - +
    -

    {{ block.height }}

    +

    {{ blocks[mode === 'mempool' ? 0 : blockIndex].height }}

    @@ -42,13 +47,13 @@

    priority rate

    {{ recommendedFees.fastestFee }} sat/vB

    -
    -

    +
    +

    block size

    -
    +

    - + {{ i }} transaction {{ i }} transactions

    diff --git a/frontend/src/app/components/clock/clock.component.ts b/frontend/src/app/components/clock/clock.component.ts index 285f91ff8..b1a9d2159 100644 --- a/frontend/src/app/components/clock/clock.component.ts +++ b/frontend/src/app/components/clock/clock.component.ts @@ -1,10 +1,11 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Input, OnInit } from '@angular/core'; -import { Observable, Subscription } from 'rxjs'; +import { Observable, Subscription, of, switchMap, tap } from 'rxjs'; import { StateService } from '../../services/state.service'; import { BlockExtended } from '../../interfaces/node-api.interface'; import { WebsocketService } from '../../services/websocket.service'; import { MempoolInfo, Recommendedfees } from '../../interfaces/websocket.interface'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, ParamMap, Router } from '@angular/router'; +import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; @Component({ selector: 'app-clock', @@ -13,12 +14,14 @@ import { ActivatedRoute } from '@angular/router'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class ClockComponent implements OnInit { - @Input() mode: 'block' | 'mempool' = 'block'; hideStats: boolean = false; + mode: 'mempool' | 'mined' = 'mined'; + blockIndex: number; + pageSubscription: Subscription; blocksSubscription: Subscription; recommendedFees$: Observable; mempoolInfo$: Observable; - block: BlockExtended; + blocks: BlockExtended[] = []; clockSize: number = 300; chainWidth: number = 384; chainHeight: number = 60; @@ -41,6 +44,8 @@ export class ClockComponent implements OnInit { public stateService: StateService, private websocketService: WebsocketService, private route: ActivatedRoute, + private router: Router, + private relativeUrlPipe: RelativeUrlPipe, private cd: ChangeDetectorRef, ) { this.route.queryParams.subscribe((params) => { @@ -57,14 +62,40 @@ export class ClockComponent implements OnInit { this.blocksSubscription = this.stateService.blocks$ .subscribe(([block]) => { if (block) { - this.block = block; - this.blockStyle = this.getStyleForBlock(this.block); - this.cd.markForCheck(); + this.blocks.unshift(block); + this.blocks = this.blocks.slice(0, 16); + if (this.blocks[this.blockIndex]) { + this.blockStyle = this.getStyleForBlock(this.blocks[this.blockIndex]); + this.cd.markForCheck(); + } } }); this.recommendedFees$ = this.stateService.recommendedFees$; this.mempoolInfo$ = this.stateService.mempoolInfo$; + + this.pageSubscription = this.route.paramMap.pipe( + switchMap((params: ParamMap) => { + const rawMode: string = params.get('mode'); + const mode = rawMode === 'mempool' ? 'mempool' : 'mined'; + const index: number = Number.parseInt(params.get('index')); + if (mode !== rawMode || index < 0 || isNaN(index)) { + this.router.navigate([this.relativeUrlPipe.transform('/clock'), mode, index || 0]); + } + return of({ + mode, + index, + }); + }), + tap((page: { mode: 'mempool' | 'mined', index: number }) => { + this.mode = page.mode; + this.blockIndex = page.index || 0; + if (this.blocks[this.blockIndex]) { + this.blockStyle = this.getStyleForBlock(this.blocks[this.blockIndex]); + this.cd.markForCheck(); + } + }) + ).subscribe(); } getStyleForBlock(block: BlockExtended) { diff --git a/frontend/src/app/components/clockchain/clockchain.component.html b/frontend/src/app/components/clockchain/clockchain.component.html index 169de58d4..2f299cb3b 100644 --- a/frontend/src/app/components/clockchain/clockchain.component.html +++ b/frontend/src/app/components/clockchain/clockchain.component.html @@ -5,8 +5,20 @@
    - - + +
    -  
    diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 493a3713e..561f01585 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -28,6 +28,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { @Input() blockWidth: number = 125; @Input() count: number = null; @Input() spotlight: number = 0; + @Input() getHref?: (index) => string = (index) => `/mempool-block/${index}`; specialBlocks = specialBlocks; mempoolBlocks: MempoolBlock[] = []; diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index d24f5356e..27378e0d0 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -95,8 +95,6 @@ import { MempoolBlockOverviewComponent } from '../components/mempool-block-overv import { ClockchainComponent } from '../components/clockchain/clockchain.component'; import { ClockFaceComponent } from '../components/clock-face/clock-face.component'; import { ClockComponent } from '../components/clock/clock.component'; -import { ClockMinedComponent } from '../components/clock/clock-mined.component'; -import { ClockMempoolComponent } from '../components/clock/clock-mempool.component'; @NgModule({ declarations: [ @@ -185,8 +183,6 @@ import { ClockMempoolComponent } from '../components/clock/clock-mempool.compone MempoolBlockOverviewComponent, ClockchainComponent, ClockComponent, - ClockMinedComponent, - ClockMempoolComponent, ClockFaceComponent, ], imports: [ @@ -300,8 +296,6 @@ import { ClockMempoolComponent } from '../components/clock/clock-mempool.compone MempoolBlockOverviewComponent, ClockchainComponent, ClockComponent, - ClockMinedComponent, - ClockMempoolComponent, ClockFaceComponent, ] }) From 30396c5dca1f6853eecdf3fa4cab829ddc64aa6c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 5 Jun 2023 13:28:00 -0400 Subject: [PATCH 398/782] Add link to clock from graph page --- .../app/components/statistics/statistics.component.html | 7 +++++++ frontend/src/app/shared/shared.module.ts | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/statistics/statistics.component.html b/frontend/src/app/components/statistics/statistics.component.html index 172f0e7ea..4192313c5 100644 --- a/frontend/src/app/components/statistics/statistics.component.html +++ b/frontend/src/app/components/statistics/statistics.component.html @@ -19,6 +19,13 @@
    +
    + +
    + @@ -64,6 +66,9 @@ + diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 53763bbf9..3de82b910 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -133,6 +133,7 @@ export interface BlockExtension { reward?: number; coinbaseRaw?: string; matchRate?: number; + expectedFees?: number; similarity?: number; pool?: { id: number; From 35d80eec1cca0d9d3d1795d0f6e4f518661f5af5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 6 Jun 2023 11:01:01 -0400 Subject: [PATCH 402/782] Fix multiple mined RBF replacements of the same tx --- backend/src/api/common.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index 37b09a417..07a724f0c 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -91,6 +91,14 @@ export class Common { if (replaced.size) { matches[tx.txid] = { replaced: Array.from(replaced), replacedBy: tx }; } + // remove this tx from the spendMap + // prevents the same tx being replaced more than once + for (const vin of tx.vin) { + const key = `${vin.txid}:${vin.vout}`; + if (spendMap.get(key)?.txid === tx.txid) { + spendMap.delete(key); + } + } } return matches; } From 386037d1db872fecca10b00ed46ea4c29fbc3094 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 26 May 2023 19:12:12 -0400 Subject: [PATCH 403/782] Fix missing fees in $updateBlocks without esplora --- backend/src/api/blocks.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index fc12b5998..9e56db027 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -600,6 +600,14 @@ class Blocks { const block = BitcoinApi.convertBlock(verboseBlock); const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash); const transactions = await this.$getTransactionsExtended(blockHash, block.height, false, false, true); + if (config.MEMPOOL.BACKEND !== 'esplora') { + // fill in missing transaction fee data from verboseBlock + for (let i = 0; i < transactions.length; i++) { + if (!transactions[i].fee && transactions[i].txid === verboseBlock.tx[i].txid) { + transactions[i].fee = verboseBlock.tx[i].fee * 100_000_000; + } + } + } const cpfpSummary: CpfpSummary = Common.calculateCpfp(block.height, transactions); const blockExtended: BlockExtended = await this.$getBlockExtended(block, cpfpSummary.transactions); const blockSummary: BlockSummary = this.summarizeBlock(verboseBlock); From c8fc416c88c8672ec7323698d01a3204b5de8f29 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 6 Jun 2023 14:19:30 -0400 Subject: [PATCH 404/782] Remove legacy mined block cpfp loop, reset stale ancestors --- backend/src/api/blocks.ts | 8 -------- backend/src/api/mempool-blocks.ts | 3 +++ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 9e56db027..71d340d89 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -127,14 +127,6 @@ class Blocks { } } - if (addMempoolData) { - transactions.forEach((tx) => { - if (!tx.cpfpChecked) { - Common.setRelativesAndGetCpfpInfo(tx as MempoolTransactionExtended, mempool); // Child Pay For Parent - } - }); - } - if (!quiet) { logger.debug(`${transactionsFound} of ${txIds.length} found in mempool. ${transactionsFetched} fetched through backend service.`); } diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 9b5da8b3b..224e31744 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -358,6 +358,9 @@ class MempoolBlocks { block: blockIndex, vsize: totalVsize + (mempoolTx.vsize / 2), }; + mempoolTx.ancestors = []; + mempoolTx.descendants = []; + mempoolTx.bestDescendant = null; mempoolTx.cpfpChecked = true; // online calculation of stack-of-blocks fee stats From ca9b48283dbd07ff622b5d878e83ebc3aa937a45 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 6 Jun 2023 14:42:41 -0400 Subject: [PATCH 405/782] calculate & index ancestor-dependent effective rates --- backend/src/api/common.ts | 68 +++++++++++++++---- backend/src/mempool.interfaces.ts | 9 ++- backend/src/repositories/CpfpRepository.ts | 12 ++-- .../src/repositories/TransactionRepository.ts | 1 + 4 files changed, 69 insertions(+), 21 deletions(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index 37b09a417..32a56d4ab 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -1,4 +1,4 @@ -import { Ancestor, CpfpInfo, CpfpSummary, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, MempoolTransactionExtended, TransactionStripped, WorkingEffectiveFeeStats } from '../mempool.interfaces'; +import { Ancestor, CpfpInfo, CpfpSummary, CpfpCluster, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, MempoolTransactionExtended, TransactionStripped, WorkingEffectiveFeeStats } from '../mempool.interfaces'; import config from '../config'; import { NodeSocket } from '../repositories/NodesSocketsRepository'; import { isIP } from 'net'; @@ -366,40 +366,80 @@ export class Common { } static calculateCpfp(height: number, transactions: TransactionExtended[]): CpfpSummary { - const clusters: { root: string, height: number, txs: Ancestor[], effectiveFeePerVsize: number }[] = []; - let cluster: TransactionExtended[] = []; - let ancestors: { [txid: string]: boolean } = {}; + const clusters: CpfpCluster[] = []; // list of all cpfp clusters in this block + const clusterMap: { [txid: string]: CpfpCluster } = {}; // map transactions to their cpfp cluster + let clusterTxs: TransactionExtended[] = []; // working list of elements of the current cluster + let ancestors: { [txid: string]: boolean } = {}; // working set of ancestors of the current cluster root const txMap = {}; + // initialize the txMap + for (const tx of transactions) { + txMap[tx.txid] = tx; + } + // reverse pass to identify CPFP clusters for (let i = transactions.length - 1; i >= 0; i--) { const tx = transactions[i]; - txMap[tx.txid] = tx; if (!ancestors[tx.txid]) { let totalFee = 0; let totalVSize = 0; - cluster.forEach(tx => { + clusterTxs.forEach(tx => { totalFee += tx?.fee || 0; totalVSize += (tx.weight / 4); }); const effectiveFeePerVsize = totalFee / totalVSize; - if (cluster.length > 1) { - clusters.push({ - root: cluster[0].txid, + let cluster: CpfpCluster; + if (clusterTxs.length > 1) { + cluster = { + root: clusterTxs[0].txid, height, - txs: cluster.map(tx => { return { txid: tx.txid, weight: tx.weight, fee: tx.fee || 0 }; }), + txs: clusterTxs.map(tx => { return { txid: tx.txid, weight: tx.weight, fee: tx.fee || 0 }; }), effectiveFeePerVsize, - }); + }; + clusters.push(cluster); } - cluster.forEach(tx => { + clusterTxs.forEach(tx => { txMap[tx.txid].effectiveFeePerVsize = effectiveFeePerVsize; + if (cluster) { + clusterMap[tx.txid] = cluster; + } }); - cluster = []; + // reset working vars + clusterTxs = []; ancestors = {}; } - cluster.push(tx); + clusterTxs.push(tx); tx.vin.forEach(vin => { ancestors[vin.txid] = true; }); } + // forward pass to enforce ancestor rate caps + for (const tx of transactions) { + let minAncestorRate = tx.effectiveFeePerVsize; + for (const vin of tx.vin) { + if (txMap[vin.txid]?.effectiveFeePerVsize) { + minAncestorRate = Math.min(minAncestorRate, txMap[vin.txid].effectiveFeePerVsize); + } + } + // check rounded values to skip cases with almost identical fees + const roundedMinAncestorRate = Math.ceil(minAncestorRate); + const roundedEffectiveFeeRate = Math.floor(tx.effectiveFeePerVsize); + if (roundedMinAncestorRate < roundedEffectiveFeeRate) { + tx.effectiveFeePerVsize = minAncestorRate; + if (!clusterMap[tx.txid]) { + // add a single-tx cluster to record the dependent rate + const cluster = { + root: tx.txid, + height, + txs: [{ txid: tx.txid, weight: tx.weight, fee: tx.fee || 0 }], + effectiveFeePerVsize: minAncestorRate, + }; + clusterMap[tx.txid] = cluster; + clusters.push(cluster); + } else { + // update the existing cluster with the dependent rate + clusterMap[tx.txid].effectiveFeePerVsize = minAncestorRate; + } + } + } return { transactions, clusters, diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index c3e0d02ba..1ed8de8a3 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -253,9 +253,16 @@ export interface WorkingEffectiveFeeStats extends EffectiveFeeStats { maxFee: number; } +export interface CpfpCluster { + root: string, + height: number, + txs: Ancestor[], + effectiveFeePerVsize: number, +} + export interface CpfpSummary { transactions: TransactionExtended[]; - clusters: { root: string, height: number, txs: Ancestor[], effectiveFeePerVsize: number }[]; + clusters: CpfpCluster[]; } export interface Statistic { diff --git a/backend/src/repositories/CpfpRepository.ts b/backend/src/repositories/CpfpRepository.ts index b68c25472..e712e6009 100644 --- a/backend/src/repositories/CpfpRepository.ts +++ b/backend/src/repositories/CpfpRepository.ts @@ -1,8 +1,7 @@ -import cluster, { Cluster } from 'cluster'; import { RowDataPacket } from 'mysql2'; import DB from '../database'; import logger from '../logger'; -import { Ancestor } from '../mempool.interfaces'; +import { Ancestor, CpfpCluster } from '../mempool.interfaces'; import transactionRepository from '../repositories/TransactionRepository'; class CpfpRepository { @@ -12,7 +11,7 @@ class CpfpRepository { } // skip clusters of transactions with the same fees const roundedEffectiveFee = Math.round(effectiveFeePerVsize * 100) / 100; - const equalFee = txs.reduce((acc, tx) => { + const equalFee = txs.length > 1 && txs.reduce((acc, tx) => { return (acc && Math.round(((tx.fee || 0) / (tx.weight / 4)) * 100) / 100 === roundedEffectiveFee); }, true); if (equalFee) { @@ -54,9 +53,9 @@ class CpfpRepository { const txs: any[] = []; for (const cluster of clusters) { - if (cluster.txs?.length > 1) { + if (cluster.txs?.length) { const roundedEffectiveFee = Math.round(cluster.effectiveFeePerVsize * 100) / 100; - const equalFee = cluster.txs.reduce((acc, tx) => { + const equalFee = cluster.txs.length > 1 && cluster.txs.reduce((acc, tx) => { return (acc && Math.round(((tx.fee || 0) / (tx.weight / 4)) * 100) / 100 === roundedEffectiveFee); }, true); if (!equalFee) { @@ -111,7 +110,7 @@ class CpfpRepository { } } - public async $getCluster(clusterRoot: string): Promise { + public async $getCluster(clusterRoot: string): Promise { const [clusterRows]: any = await DB.query( ` SELECT * @@ -121,6 +120,7 @@ class CpfpRepository { [clusterRoot] ); const cluster = clusterRows[0]; + cluster.effectiveFeePerVsize = cluster.fee_rate; if (cluster?.txs) { cluster.txs = this.unpack(cluster.txs); return cluster; diff --git a/backend/src/repositories/TransactionRepository.ts b/backend/src/repositories/TransactionRepository.ts index 279a2bdad..bde95df9b 100644 --- a/backend/src/repositories/TransactionRepository.ts +++ b/backend/src/repositories/TransactionRepository.ts @@ -105,6 +105,7 @@ class TransactionRepository { return { descendants, ancestors, + effectiveFeePerVsize: cluster.effectiveFeePerVsize, }; } } From 3c022ad755ba0659fa2abbffdbbdf3dc968ba223 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 7 Jun 2023 11:59:31 -0400 Subject: [PATCH 406/782] Fix fee range inconsistencies --- backend/src/api/blocks.ts | 7 +++++-- frontend/src/app/components/block/block.component.html | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 9e56db027..d5058b149 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -645,9 +645,12 @@ class Blocks { logger.info(`Re-indexed 10 blocks and summaries. Also re-indexed the last difficulty adjustments. Will re-index latest hashrates in a few seconds.`, logger.tags.mining); indexer.reindex(); } - await blocksRepository.$saveBlockInDatabase(blockExtended); - this.updateTimerProgress(timer, `saved ${this.currentBlockHeight} to database`); + } + await blocksRepository.$saveBlockInDatabase(blockExtended); + this.updateTimerProgress(timer, `saved ${this.currentBlockHeight} to database`); + + if (!fastForwarded) { const lastestPriceId = await PricesRepository.$getLatestPriceId(); this.updateTimerProgress(timer, `got latest price id ${this.currentBlockHeight}`); if (priceUpdater.historyInserted === true && lastestPriceId !== null) { diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index c34a3e523..4c7e4684a 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -121,7 +121,7 @@ - + From fd30bff9c6e4f6b707d58e5dcea5039de8ed3126 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 7 Jun 2023 18:04:21 +0200 Subject: [PATCH 407/782] don't throw when BlocksAuditRepositories.$saveAudit fails --- backend/src/repositories/BlocksAuditsRepository.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index c6156334b..1149b8a93 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -14,7 +14,6 @@ class BlocksAuditRepositories { logger.debug(`Cannot save block audit for block ${audit.hash} because it has already been indexed, ignoring`); } else { logger.err(`Cannot save block audit into db. Reason: ` + (e instanceof Error ? e.message : e)); - throw e; } } } From 57ac1486a009ef2bc599aa7ae57688d6752523bb Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 9 Jun 2023 19:03:47 -0400 Subject: [PATCH 408/782] Reset blockchain scroll on logo click --- .../app/components/master-page/master-page.component.html | 2 +- .../app/components/master-page/master-page.component.ts | 4 ++++ frontend/src/app/components/start/start.component.ts | 8 ++++++++ frontend/src/app/services/state.service.ts | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/master-page/master-page.component.html b/frontend/src/app/components/master-page/master-page.component.html index 9e4cd1513..48028ab47 100644 --- a/frontend/src/app/components/master-page/master-page.component.html +++ b/frontend/src/app/components/master-page/master-page.component.html @@ -1,7 +1,7 @@
    - - - - @@ -235,6 +226,9 @@ (txClickEvent)="onTxClick($event)" (txHoverEvent)="onTxHover($event)" [unavailable]="!isMobile && !showAudit"> + + +

    Actual Block

    @@ -244,6 +238,9 @@ (txClickEvent)="onTxClick($event)" (txHoverEvent)="onTxHover($event)" [unavailable]="isMobile && !showAudit">
    + + + @@ -394,5 +391,54 @@ + +
    RewardHashrate (24h)Avg HealthRewardHashrate (24h)Avg Health
    + {{ block.height }} @@ -89,7 +89,6 @@ - @@ -98,7 +97,7 @@ + diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.scss b/frontend/src/app/components/blocks-list/blocks-list.component.scss index 1a32f7ed7..ea6e93347 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.scss +++ b/frontend/src/app/components/blocks-list/blocks-list.component.scss @@ -51,7 +51,12 @@ tr, td, th { .pool.widget { width: 40%; padding-left: 24px; - @media (max-width: 376px) { + @media (min-width: 768px) AND (max-width: 926px) { + padding-left: 0px; + width: 60%; + } + @media (max-width: 430px) { + padding-left: 0px; width: 60%; } } @@ -59,6 +64,10 @@ tr, td, th { display: inline-block; vertical-align: text-top; padding-left: 10px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 160px; } .height { @@ -69,6 +78,12 @@ tr, td, th { @media (max-width: 576px) { width: 10%; } + @media (min-width: 768px) AND (max-width: 926px) { + width: 30%; + } + @media (max-width: 430px) { + width: 30%; + } } .height.legacy { width: 15%; @@ -92,7 +107,7 @@ tr, td, th { .mined { width: 13%; - @media (max-width: 576px) { + @media (max-width: 730px) { display: none; } } @@ -138,7 +153,7 @@ tr, td, th { .fees { width: 8%; - @media (max-width: 650px) { + @media (max-width: 820px) { display: none; } } @@ -163,6 +178,16 @@ tr, td, th { width: 30%; padding-right: 0; } + @media (min-width: 768px) AND (max-width: 926px) { + overflow: hidden; + text-overflow: ellipsis; + max-width: 90px; + } + @media (max-width: 430px) { + overflow: hidden; + text-overflow: ellipsis; + max-width: 90px; + } } .size { @@ -189,10 +214,10 @@ tr, td, th { .health { width: 10%; - @media (max-width: 1000px) { + @media (max-width: 1105px) { width: 13%; } - @media (max-width: 950px) { + @media (max-width: 560px) { display: none; } @@ -202,7 +227,7 @@ tr, td, th { } .health.widget { width: 25%; - @media (max-width: 1000px) { + @media (max-width: 1105px) { display: none; } @media (max-width: 767px) { @@ -242,4 +267,4 @@ tr, td, th { vertical-align: middle; max-width: 50vw; text-align: left; -} \ No newline at end of file +} diff --git a/frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html b/frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html index 0950a11ed..dace043f8 100644 --- a/frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html +++ b/frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.html @@ -2,17 +2,18 @@ - - - - + + + + - - + @@ -23,8 +24,8 @@ - - + + diff --git a/frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.scss b/frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.scss index f379effe2..f53c052db 100644 --- a/frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.scss +++ b/frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.scss @@ -17,3 +17,12 @@ } } } + +.date { + @media (min-width: 767px) AND (max-width: 991px) { + display: none; + } + @media (max-width: 500px) { + display: none; + } +} \ No newline at end of file From af6d115dbb6d9db602f75751f6c3425c9c6b7dec Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sun, 19 Mar 2023 15:39:17 +0900 Subject: [PATCH 101/782] Add missing MAXMIND in docker configs - Remove duplicated `__MEMPOOL_INDEXING_BLOCKS_AMOUNT__` --- backend/src/__tests__/config.test.ts | 7 +++++++ docker/README.md | 23 +++++++++++++++++++++++ docker/backend/mempool-config.json | 6 ++++++ docker/backend/start.sh | 16 ++++++++++++++-- 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 5717808dd..8b7ebc9ce 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -106,6 +106,13 @@ describe('Mempool Backend Config', () => { BISQ_URL: 'https://bisq.markets/api', BISQ_ONION: 'http://bisqmktse2cabavbr2xjq7xw3h6g5ottemo5rolfcwt6aly6tp5fdryd.onion/api' }); + + expect(config.MAXMIND).toStrictEqual({ + ENABLED: false, + GEOLITE2_CITY: '/usr/local/share/GeoIP/GeoLite2-City.mmdb', + GEOLITE2_ASN: '/usr/local/share/GeoIP/GeoLite2-ASN.mmdb', + GEOIP2_ISP: '/usr/local/share/GeoIP/GeoIP2-ISP.mmdb' + }); }); }); diff --git a/docker/README.md b/docker/README.md index 468d8069b..34f130aae 100644 --- a/docker/README.md +++ b/docker/README.md @@ -432,3 +432,26 @@ Corresponding `docker-compose.yml` overrides: CLIGHTNING_SOCKET: "" ... ``` + +
    + +`mempool-config.json`: +```json + "MAXMIND": { + "ENABLED": false, + "GEOLITE2_CITY": "/usr/local/share/GeoIP/GeoLite2-City.mmdb", + "GEOLITE2_ASN": "/usr/local/share/GeoIP/GeoLite2-ASN.mmdb", + "GEOIP2_ISP": "/usr/local/share/GeoIP/GeoIP2-ISP.mmdb" + } +``` + +Corresponding `docker-compose.yml` overrides: +```yaml + api: + environment: + MAXMIND_ENABLED: "", + MAXMIND_GEOLITE2_CITY: "/usr/local/share/GeoIP/GeoLite2-City.mmdb", + MAXMIND_GEOLITE2_ASN": "/usr/local/share/GeoIP/GeoLite2-ASN.mmdb", + MAXMIND_GEOIP2_ISP": "/usr/local/share/GeoIP/GeoIP2-ISP.mmdb" + ... +``` diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 78a2c116b..0099a650d 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -107,5 +107,11 @@ "LIQUID_ONION": "__EXTERNAL_DATA_SERVER_LIQUID_ONION__", "BISQ_URL": "__EXTERNAL_DATA_SERVER_BISQ_URL__", "BISQ_ONION": "__EXTERNAL_DATA_SERVER_BISQ_ONION__" + }, + "MAXMIND": { + "ENABLED": "__MAXMIND_ENABLED__", + "GEOLITE2_CITY": "__MAXMIND_GEOLITE2_CITY__", + "GEOLITE2_ASN": "__MAXMIND_GEOLITE2_ASN__", + "GEOIP2_ISP": "__MAXMIND_GEOIP2_ISP__" } } \ No newline at end of file diff --git a/docker/backend/start.sh b/docker/backend/start.sh index ee5069386..d0e58470b 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -22,7 +22,6 @@ __MEMPOOL_EXTERNAL_MAX_RETRY__=${MEMPOOL_EXTERNAL_MAX_RETRY:=1} __MEMPOOL_EXTERNAL_RETRY_INTERVAL__=${MEMPOOL_EXTERNAL_RETRY_INTERVAL:=0} __MEMPOOL_USER_AGENT__=${MEMPOOL_USER_AGENT:=mempool} __MEMPOOL_STDOUT_LOG_MIN_PRIORITY__=${MEMPOOL_STDOUT_LOG_MIN_PRIORITY:=info} -__MEMPOOL_INDEXING_BLOCKS_AMOUNT__=${MEMPOOL_INDEXING_BLOCKS_AMOUNT:=false} __MEMPOOL_AUTOMATIC_BLOCK_REINDEXING__=${MEMPOOL_AUTOMATIC_BLOCK_REINDEXING:=false} __MEMPOOL_POOLS_JSON_URL__=${MEMPOOL_POOLS_JSON_URL:=https://raw.githubusercontent.com/mempool/mining-pools/master/pools-v2.json} __MEMPOOL_POOLS_JSON_TREE_URL__=${MEMPOOL_POOLS_JSON_TREE_URL:=https://api.github.com/repos/mempool/mining-pools/git/trees/master} @@ -112,6 +111,13 @@ __LND_REST_API_URL__=${LND_REST_API_URL:="https://localhost:8080"} # CLN __CLIGHTNING_SOCKET__=${CLIGHTNING_SOCKET:=""} +# MAXMIND +__MAXMIND_ENABLED__=${MAXMIND_ENABLED:=false} +__MAXMIND_GEOLITE2_CITY__=${MAXMIND_GEOLITE2_CITY:="/usr/local/share/GeoIP/GeoLite2-City.mmdb"} +__MAXMIND_GEOLITE2_ASN__=${MAXMIND_GEOLITE2_ASN:="/usr/local/share/GeoIP/GeoLite2-ASN.mmdb"} +__MAXMIND_GEOIP2_ISP__=${MAXMIND_GEOIP2_IS:="/usr/local/share/GeoIP/GeoIP2-ISP.mmdb"} + + mkdir -p "${__MEMPOOL_CACHE_DIR__}" sed -i "s/__MEMPOOL_NETWORK__/${__MEMPOOL_NETWORK__}/g" mempool-config.json @@ -135,7 +141,6 @@ sed -i "s!__MEMPOOL_EXTERNAL_MAX_RETRY__!${__MEMPOOL_EXTERNAL_MAX_RETRY__}!g" me sed -i "s!__MEMPOOL_EXTERNAL_RETRY_INTERVAL__!${__MEMPOOL_EXTERNAL_RETRY_INTERVAL__}!g" mempool-config.json sed -i "s!__MEMPOOL_USER_AGENT__!${__MEMPOOL_USER_AGENT__}!g" mempool-config.json sed -i "s/__MEMPOOL_STDOUT_LOG_MIN_PRIORITY__/${__MEMPOOL_STDOUT_LOG_MIN_PRIORITY__}/g" mempool-config.json -sed -i "s/__MEMPOOL_INDEXING_BLOCKS_AMOUNT__/${__MEMPOOL_INDEXING_BLOCKS_AMOUNT__}/g" mempool-config.json sed -i "s/__MEMPOOL_AUTOMATIC_BLOCK_REINDEXING__/${__MEMPOOL_AUTOMATIC_BLOCK_REINDEXING__}/g" mempool-config.json sed -i "s!__MEMPOOL_POOLS_JSON_URL__!${__MEMPOOL_POOLS_JSON_URL__}!g" mempool-config.json sed -i "s!__MEMPOOL_POOLS_JSON_TREE_URL__!${__MEMPOOL_POOLS_JSON_TREE_URL__}!g" mempool-config.json @@ -215,4 +220,11 @@ sed -i "s!__LND_REST_API_URL__!${__LND_REST_API_URL__}!g" mempool-config.json # CLN sed -i "s!__CLIGHTNING_SOCKET__!${__CLIGHTNING_SOCKET__}!g" mempool-config.json +# MAXMIND +sed -i "s!__MAXMIND_ENABLED__!${__MAXMIND_ENABLED__}!g" mempool-config.json +sed -i "s!__MAXMIND_GEOLITE2_CITY__!${__MAXMIND_GEOLITE2_CITY__}!g" mempool-config.json +sed -i "s!__MAXMIND_GEOLITE2_ASN__!${__MAXMIND_GEOLITE2_ASN__}!g" mempool-config.json +sed -i "s!__MAXMIND_GEOIP2_ISP__!${__MAXMIND_GEOIP2_ISP__}!g" mempool-config.json + + node /backend/package/index.js From e27bdd3e2b3c34a7f037079cec6586c026b27c25 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 19 Mar 2023 17:30:06 +0900 Subject: [PATCH 102/782] Fixing broken liquid blinding tests --- frontend/cypress/e2e/liquid/liquid.spec.ts | 10 +++++----- .../cypress/e2e/liquidtestnet/liquidtestnet.spec.ts | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/cypress/e2e/liquid/liquid.spec.ts b/frontend/cypress/e2e/liquid/liquid.spec.ts index e22a9b94e..325a2ad0c 100644 --- a/frontend/cypress/e2e/liquid/liquid.spec.ts +++ b/frontend/cypress/e2e/liquid/liquid.spec.ts @@ -158,10 +158,10 @@ describe('Liquid', () => { it('show empty unblinded TX', () => { cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=`); cy.waitForSkeletonGone(); - cy.get('.table-tx-vin tr:nth-child(1)').should('have.class', ''); + cy.get('.table-tx-vin tr:nth-child(1)').should('have.class', 'ng-star-inserted'); cy.get('.table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential'); - cy.get('.table-tx-vout tr:nth-child(1)').should('have.class', ''); - cy.get('.table-tx-vout tr:nth-child(2)').should('have.class', ''); + cy.get('.table-tx-vout tr:nth-child(1)').should('have.class', 'ng-star-inserted'); + cy.get('.table-tx-vout tr:nth-child(2)').should('have.class', 'ng-star-inserted'); cy.get('.table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential'); cy.get('.table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential'); }); @@ -169,8 +169,8 @@ describe('Liquid', () => { it('show invalid unblinded TX hex', () => { cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=123`); cy.waitForSkeletonGone(); - cy.get('.table-tx-vin tr').should('have.class', ''); - cy.get('.table-tx-vout tr').should('have.class', ''); + cy.get('.table-tx-vin tr').should('have.class', 'ng-star-inserted'); + cy.get('.table-tx-vout tr').should('have.class', 'ng-star-inserted'); cy.get('.error-unblinded').contains('Error: Invalid blinding data (invalid hex)'); }); diff --git a/frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts b/frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts index e1172e51a..1f959dd3a 100644 --- a/frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts +++ b/frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts @@ -109,10 +109,10 @@ describe('Liquid Testnet', () => { it('show empty unblinded TX', () => { cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=`); cy.waitForSkeletonGone(); - cy.get('.table-tx-vin tr:nth-child(1)').should('have.class', ''); + cy.get('.table-tx-vin tr:nth-child(1)').should('have.class', 'ng-star-inserted'); cy.get('.table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential'); - cy.get('.table-tx-vout tr:nth-child(1)').should('have.class', ''); - cy.get('.table-tx-vout tr:nth-child(2)').should('have.class', ''); + cy.get('.table-tx-vout tr:nth-child(1)').should('have.class', 'ng-star-inserted'); + cy.get('.table-tx-vout tr:nth-child(2)').should('have.class', 'ng-star-inserted'); cy.get('.table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential'); cy.get('.table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential'); }); @@ -120,8 +120,8 @@ describe('Liquid Testnet', () => { it('show invalid unblinded TX hex', () => { cy.visit(`${basePath}/tx/2477f220eef1d03f8ffa4a2861c275d155c3562adf0d79523aeeb0c59ee611ba#blinded=5000`); cy.waitForSkeletonGone(); - cy.get('.table-tx-vin tr').should('have.class', ''); - cy.get('.table-tx-vout tr').should('have.class', ''); + cy.get('.table-tx-vin tr').should('have.class', 'ng-star-inserted'); + cy.get('.table-tx-vout tr').should('have.class', 'ng-star-inserted'); cy.get('.error-unblinded').contains('Error: Invalid blinding data (invalid hex)'); }); From e2e71c7a4688bafe863110beb59cea01d20d279d Mon Sep 17 00:00:00 2001 From: wiz Date: Sun, 19 Mar 2023 17:33:51 +0900 Subject: [PATCH 103/782] Add Maxmind GeoIP Lite download to Docker build --- backend/src/__tests__/config.test.ts | 8 ++++---- docker/README.md | 10 +++++----- docker/backend/Dockerfile | 1 + docker/backend/mempool-config.json | 2 +- docker/backend/start.sh | 8 ++++---- docker/init.sh | 5 +++++ 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 8b7ebc9ce..72533829b 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -108,10 +108,10 @@ describe('Mempool Backend Config', () => { }); expect(config.MAXMIND).toStrictEqual({ - ENABLED: false, - GEOLITE2_CITY: '/usr/local/share/GeoIP/GeoLite2-City.mmdb', - GEOLITE2_ASN: '/usr/local/share/GeoIP/GeoLite2-ASN.mmdb', - GEOIP2_ISP: '/usr/local/share/GeoIP/GeoIP2-ISP.mmdb' + ENABLED: true, + GEOLITE2_CITY: './backend/GeoIP/GeoLite2-City.mmdb', + GEOLITE2_ASN: './backend/GeoIP/GeoLite2-ASN.mmdb', + GEOIP2_ISP: '' }); }); }); diff --git a/docker/README.md b/docker/README.md index 34f130aae..e6f6a3c07 100644 --- a/docker/README.md +++ b/docker/README.md @@ -438,7 +438,7 @@ Corresponding `docker-compose.yml` overrides: `mempool-config.json`: ```json "MAXMIND": { - "ENABLED": false, + "ENABLED": true, "GEOLITE2_CITY": "/usr/local/share/GeoIP/GeoLite2-City.mmdb", "GEOLITE2_ASN": "/usr/local/share/GeoIP/GeoLite2-ASN.mmdb", "GEOIP2_ISP": "/usr/local/share/GeoIP/GeoIP2-ISP.mmdb" @@ -449,9 +449,9 @@ Corresponding `docker-compose.yml` overrides: ```yaml api: environment: - MAXMIND_ENABLED: "", - MAXMIND_GEOLITE2_CITY: "/usr/local/share/GeoIP/GeoLite2-City.mmdb", - MAXMIND_GEOLITE2_ASN": "/usr/local/share/GeoIP/GeoLite2-ASN.mmdb", - MAXMIND_GEOIP2_ISP": "/usr/local/share/GeoIP/GeoIP2-ISP.mmdb" + MAXMIND_ENABLED: true, + MAXMIND_GEOLITE2_CITY: "./backend/GeoIP/GeoLite2-City.mmdb", + MAXMIND_GEOLITE2_ASN": "./backend/GeoIP/GeoLite2-ASN.mmdb", + MAXMIND_GEOIP2_ISP": "./backend/GeoIP/GeoIP2-ISP.mmdb" ... ``` diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index 9be457bb2..fd5044c0f 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -17,6 +17,7 @@ WORKDIR /backend RUN chown 1000:1000 ./ COPY --from=builder --chown=1000:1000 /build/package ./package/ +COPY --from=builder --chown=1000:1000 /build/GeoIP ./GeoIP/ COPY --from=builder --chown=1000:1000 /build/mempool-config.json /build/start.sh /build/wait-for-it.sh ./ USER 1000 diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 0099a650d..c1f187437 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -114,4 +114,4 @@ "GEOLITE2_ASN": "__MAXMIND_GEOLITE2_ASN__", "GEOIP2_ISP": "__MAXMIND_GEOIP2_ISP__" } -} \ No newline at end of file +} diff --git a/docker/backend/start.sh b/docker/backend/start.sh index d0e58470b..11c638735 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -112,10 +112,10 @@ __LND_REST_API_URL__=${LND_REST_API_URL:="https://localhost:8080"} __CLIGHTNING_SOCKET__=${CLIGHTNING_SOCKET:=""} # MAXMIND -__MAXMIND_ENABLED__=${MAXMIND_ENABLED:=false} -__MAXMIND_GEOLITE2_CITY__=${MAXMIND_GEOLITE2_CITY:="/usr/local/share/GeoIP/GeoLite2-City.mmdb"} -__MAXMIND_GEOLITE2_ASN__=${MAXMIND_GEOLITE2_ASN:="/usr/local/share/GeoIP/GeoLite2-ASN.mmdb"} -__MAXMIND_GEOIP2_ISP__=${MAXMIND_GEOIP2_IS:="/usr/local/share/GeoIP/GeoIP2-ISP.mmdb"} +__MAXMIND_ENABLED__=${MAXMIND_ENABLED:=true} +__MAXMIND_GEOLITE2_CITY__=${MAXMIND_GEOLITE2_CITY:="./backend/GeoIP/GeoLite2-City.mmdb"} +__MAXMIND_GEOLITE2_ASN__=${MAXMIND_GEOLITE2_ASN:="./backend/GeoIP/GeoLite2-ASN.mmdb"} +__MAXMIND_GEOIP2_ISP__=${MAXMIND_GEOIP2_ISP:=""} mkdir -p "${__MEMPOOL_CACHE_DIR__}" diff --git a/docker/init.sh b/docker/init.sh index 4eb06f0c1..ee9ac9542 100755 --- a/docker/init.sh +++ b/docker/init.sh @@ -3,6 +3,11 @@ #backend cp ./docker/backend/* ./backend/ +#geoip-data +mkdir -p ./backend/GeoIP/ +wget -O ./backend/GeoIP/GeoLite2-City.mmdb https://raw.githubusercontent.com/mempool/geoip-data/master/GeoLite2-City.mmdb +wget -O ./backend/GeoIP/GeoLite2-ASN.mmdb https://raw.githubusercontent.com/mempool/geoip-data/master/GeoLite2-ASN.mmdb + #frontend localhostIP="127.0.0.1" cp ./docker/frontend/* ./frontend From 0abb9cbb7c4a58f0cebab61c9b4f2f1346bcfa2b Mon Sep 17 00:00:00 2001 From: wiz Date: Sun, 19 Mar 2023 17:49:37 +0900 Subject: [PATCH 104/782] Fix boolean configuration option in docker backend config --- docker/backend/mempool-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index c1f187437..1b3ac1837 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -109,7 +109,7 @@ "BISQ_ONION": "__EXTERNAL_DATA_SERVER_BISQ_ONION__" }, "MAXMIND": { - "ENABLED": "__MAXMIND_ENABLED__", + "ENABLED": __MAXMIND_ENABLED__, "GEOLITE2_CITY": "__MAXMIND_GEOLITE2_CITY__", "GEOLITE2_ASN": "__MAXMIND_GEOLITE2_ASN__", "GEOIP2_ISP": "__MAXMIND_GEOIP2_ISP__" From 32c2db2153877057dbfc5be43ffbfaa06bc50ec1 Mon Sep 17 00:00:00 2001 From: wiz Date: Sun, 19 Mar 2023 18:00:37 +0900 Subject: [PATCH 105/782] Fix backend docker config path for GeoIP data --- docker/README.md | 6 +++--- docker/backend/start.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docker/README.md b/docker/README.md index e6f6a3c07..525ecb718 100644 --- a/docker/README.md +++ b/docker/README.md @@ -450,8 +450,8 @@ Corresponding `docker-compose.yml` overrides: api: environment: MAXMIND_ENABLED: true, - MAXMIND_GEOLITE2_CITY: "./backend/GeoIP/GeoLite2-City.mmdb", - MAXMIND_GEOLITE2_ASN": "./backend/GeoIP/GeoLite2-ASN.mmdb", - MAXMIND_GEOIP2_ISP": "./backend/GeoIP/GeoIP2-ISP.mmdb" + MAXMIND_GEOLITE2_CITY: "/backend/GeoIP/GeoLite2-City.mmdb", + MAXMIND_GEOLITE2_ASN": "/backend/GeoIP/GeoLite2-ASN.mmdb", + MAXMIND_GEOIP2_ISP": "/backend/GeoIP/GeoIP2-ISP.mmdb" ... ``` diff --git a/docker/backend/start.sh b/docker/backend/start.sh index 11c638735..fced20974 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -113,8 +113,8 @@ __CLIGHTNING_SOCKET__=${CLIGHTNING_SOCKET:=""} # MAXMIND __MAXMIND_ENABLED__=${MAXMIND_ENABLED:=true} -__MAXMIND_GEOLITE2_CITY__=${MAXMIND_GEOLITE2_CITY:="./backend/GeoIP/GeoLite2-City.mmdb"} -__MAXMIND_GEOLITE2_ASN__=${MAXMIND_GEOLITE2_ASN:="./backend/GeoIP/GeoLite2-ASN.mmdb"} +__MAXMIND_GEOLITE2_CITY__=${MAXMIND_GEOLITE2_CITY:="/backend/GeoIP/GeoLite2-City.mmdb"} +__MAXMIND_GEOLITE2_ASN__=${MAXMIND_GEOLITE2_ASN:="/backend/GeoIP/GeoLite2-ASN.mmdb"} __MAXMIND_GEOIP2_ISP__=${MAXMIND_GEOIP2_ISP:=""} From 1ed20a95df30816a2e3b7593e6cef66eb2be4e42 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Sun, 19 Mar 2023 22:58:39 -0400 Subject: [PATCH 106/782] Add poster image for readme video Also add line-break after video and remove screenshot. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d2f9f9382..b7a455cd5 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # The Mempool Open Source Project™ [![mempool](https://img.shields.io/endpoint?url=https://dashboard.cypress.io/badge/simple/ry4br7/master&style=flat-square)](https://dashboard.cypress.io/projects/ry4br7/runs) -https://user-images.githubusercontent.com/232186/222445818-234aa6c9-c233-4c52-b3f0-e32b8232893b.mp4 +https://user-images.githubusercontent.com/93150691/226236121-375ea64f-b4a1-4cc0-8fad-a6fb33226840.mp4 + +
    Mempool is the fully-featured mempool visualizer, explorer, and API service running at [mempool.space](https://mempool.space/). It is an open-source project developed and operated for the benefit of the Bitcoin community, with a focus on the emerging transaction fee market that is evolving Bitcoin into a multi-layer ecosystem. -![mempool](https://mempool.space/resources/screenshots/v2.4.0-dashboard.png) - # Installation Methods Mempool can be self-hosted on a wide variety of your own hardware, ranging from a simple one-click installation on a Raspberry Pi full-node distro all the way to a robust production instance on a powerful FreeBSD server. From ad5ce6dba4a793f00b15db29f51865913eb1f912 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 20 Mar 2023 14:02:31 +0900 Subject: [PATCH 107/782] Fix maxmind tests --- backend/src/__tests__/config.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 72533829b..8b7ebc9ce 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -108,10 +108,10 @@ describe('Mempool Backend Config', () => { }); expect(config.MAXMIND).toStrictEqual({ - ENABLED: true, - GEOLITE2_CITY: './backend/GeoIP/GeoLite2-City.mmdb', - GEOLITE2_ASN: './backend/GeoIP/GeoLite2-ASN.mmdb', - GEOIP2_ISP: '' + ENABLED: false, + GEOLITE2_CITY: '/usr/local/share/GeoIP/GeoLite2-City.mmdb', + GEOLITE2_ASN: '/usr/local/share/GeoIP/GeoLite2-ASN.mmdb', + GEOIP2_ISP: '/usr/local/share/GeoIP/GeoIP2-ISP.mmdb' }); }); }); From d54bcc898b7707031d317f8da57016f91881bfc4 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 20 Mar 2023 12:07:42 +0900 Subject: [PATCH 108/782] Fix missing temp cache in disk cache --- backend/src/api/disk-cache.ts | 94 ++++++++++++++--------------------- 1 file changed, 36 insertions(+), 58 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 74b68b6be..420d8e526 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -23,16 +23,16 @@ class DiskCache { return; } process.on('SIGINT', (e) => { - this.saveCacheToDiskSync(); + this.$saveCacheToDisk(true); process.exit(2); }); process.on('SIGTERM', (e) => { - this.saveCacheToDiskSync(); + this.$saveCacheToDisk(true); process.exit(2); }); } - async $saveCacheToDisk(): Promise { + async $saveCacheToDisk(sync: boolean = false): Promise { if (!cluster.isPrimary) { return; } @@ -41,7 +41,7 @@ class DiskCache { return; } try { - logger.debug('Writing mempool and blocks data to disk cache (async)...'); + logger.debug(`Writing mempool and blocks data to disk cache (${ sync ? 'sync' : 'async' })...`); this.isWritingCache = true; const mempool = memPool.getMempool(); @@ -54,68 +54,46 @@ class DiskCache { const chunkSize = Math.floor(mempoolArray.length / DiskCache.CHUNK_FILES); - await fsPromises.writeFile(DiskCache.FILE_NAME, JSON.stringify({ - network: config.MEMPOOL.NETWORK, - cacheSchemaVersion: this.cacheSchemaVersion, - blocks: blocks.getBlocks(), - blockSummaries: blocks.getBlockSummaries(), - mempool: {}, - mempoolArray: mempoolArray.splice(0, chunkSize), - }), { flag: 'w' }); - for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { - await fsPromises.writeFile(DiskCache.FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ + if (sync) { + fs.writeFileSync(DiskCache.TMP_FILE_NAME, JSON.stringify({ + network: config.MEMPOOL.NETWORK, + cacheSchemaVersion: this.cacheSchemaVersion, + blocks: blocks.getBlocks(), + blockSummaries: blocks.getBlockSummaries(), mempool: {}, mempoolArray: mempoolArray.splice(0, chunkSize), }), { flag: 'w' }); - } - logger.debug('Mempool and blocks data saved to disk cache'); - this.isWritingCache = false; - } catch (e) { - logger.warn('Error writing to cache file: ' + (e instanceof Error ? e.message : e)); - this.isWritingCache = false; - } - } + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + fs.writeFileSync(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ + mempool: {}, + mempoolArray: mempoolArray.splice(0, chunkSize), + }), { flag: 'w' }); + } - saveCacheToDiskSync(): void { - if (!cluster.isPrimary) { - return; - } - if (this.isWritingCache) { - logger.debug('Saving cache already in progress. Skipping.'); - return; - } - try { - logger.debug('Writing mempool and blocks data to disk cache (sync)...'); - this.isWritingCache = true; - - const mempool = memPool.getMempool(); - const mempoolArray: TransactionExtended[] = []; - for (const tx in mempool) { - mempoolArray.push(mempool[tx]); - } - - Common.shuffleArray(mempoolArray); - - const chunkSize = Math.floor(mempoolArray.length / DiskCache.CHUNK_FILES); - - fs.writeFileSync(DiskCache.TMP_FILE_NAME, JSON.stringify({ - network: config.MEMPOOL.NETWORK, - cacheSchemaVersion: this.cacheSchemaVersion, - blocks: blocks.getBlocks(), - blockSummaries: blocks.getBlockSummaries(), - mempool: {}, - mempoolArray: mempoolArray.splice(0, chunkSize), - }), { flag: 'w' }); - for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { - fs.writeFileSync(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ + fs.renameSync(DiskCache.TMP_FILE_NAME, DiskCache.FILE_NAME); + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + fs.renameSync(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), DiskCache.FILE_NAMES.replace('{number}', i.toString())); + } + } else { + await fsPromises.writeFile(DiskCache.TMP_FILE_NAME, JSON.stringify({ + network: config.MEMPOOL.NETWORK, + cacheSchemaVersion: this.cacheSchemaVersion, + blocks: blocks.getBlocks(), + blockSummaries: blocks.getBlockSummaries(), mempool: {}, mempoolArray: mempoolArray.splice(0, chunkSize), }), { flag: 'w' }); - } + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + await fsPromises.writeFile(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), JSON.stringify({ + mempool: {}, + mempoolArray: mempoolArray.splice(0, chunkSize), + }), { flag: 'w' }); + } - fs.renameSync(DiskCache.TMP_FILE_NAME, DiskCache.FILE_NAME); - for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { - fs.renameSync(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), DiskCache.FILE_NAMES.replace('{number}', i.toString())); + await fsPromises.rename(DiskCache.TMP_FILE_NAME, DiskCache.FILE_NAME); + for (let i = 1; i < DiskCache.CHUNK_FILES; i++) { + await fsPromises.rename(DiskCache.TMP_FILE_NAMES.replace('{number}', i.toString()), DiskCache.FILE_NAMES.replace('{number}', i.toString())); + } } logger.debug('Mempool and blocks data saved to disk cache'); From 517cf613c1908d16dc0242ba7dd57b212d772527 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 20 Mar 2023 15:23:02 +0900 Subject: [PATCH 109/782] Removing Sigterm. Cache write block interval configuration. --- backend/mempool-config.sample.json | 3 ++- backend/src/__fixtures__/mempool-config.template.json | 3 ++- backend/src/__tests__/config.test.ts | 1 + backend/src/api/blocks.ts | 2 +- backend/src/api/disk-cache.ts | 8 ++------ backend/src/config.ts | 2 ++ docker/README.md | 2 ++ docker/backend/mempool-config.json | 3 ++- docker/backend/start.sh | 2 ++ production/mempool-config.liquid.json | 3 ++- production/mempool-config.liquidtestnet.json | 3 ++- production/mempool-config.mainnet.json | 3 ++- production/mempool-config.signet.json | 3 ++- production/mempool-config.testnet.json | 3 ++- 14 files changed, 26 insertions(+), 15 deletions(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index 2369b64b5..d7ac621a3 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -27,7 +27,8 @@ "AUDIT": false, "ADVANCED_GBT_AUDIT": false, "ADVANCED_GBT_MEMPOOL": false, - "CPFP_INDEXING": false + "CPFP_INDEXING": false, + "DISK_CACHE_BLOCK_INTERVAL": 6 }, "CORE_RPC": { "HOST": "127.0.0.1", diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 2bf52cbcf..07e930903 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -28,7 +28,8 @@ "ADVANCED_GBT_AUDIT": "__MEMPOOL_ADVANCED_GBT_AUDIT__", "ADVANCED_GBT_MEMPOOL": "__MEMPOOL_ADVANCED_GBT_MEMPOOL__", "CPFP_INDEXING": "__MEMPOOL_CPFP_INDEXING__", - "MAX_BLOCKS_BULK_QUERY": "__MEMPOOL_MAX_BLOCKS_BULK_QUERY__" + "MAX_BLOCKS_BULK_QUERY": "__MEMPOOL_MAX_BLOCKS_BULK_QUERY__", + "DISK_CACHE_BLOCK_INTERVAL": "__DISK_CACHE_BLOCK_INTERVAL__" }, "CORE_RPC": { "HOST": "__CORE_RPC_HOST__", diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 8b7ebc9ce..fdffd593f 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -42,6 +42,7 @@ describe('Mempool Backend Config', () => { ADVANCED_GBT_MEMPOOL: false, CPFP_INDEXING: false, MAX_BLOCKS_BULK_QUERY: 0, + DISK_CACHE_BLOCK_INTERVAL: 6, }); expect(config.ELECTRUM).toStrictEqual({ HOST: '127.0.0.1', PORT: 3306, TLS_ENABLED: true }); diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 8ed81016b..f9b14d637 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -651,7 +651,7 @@ class Blocks { if (this.newBlockCallbacks.length) { this.newBlockCallbacks.forEach((cb) => cb(blockExtended, txIds, transactions)); } - if (!memPool.hasPriority() && (block.height % 6 === 0)) { + if (!memPool.hasPriority() && (block.height % config.MEMPOOL.DISK_CACHE_BLOCK_INTERVAL === 0)) { diskCache.$saveCacheToDisk(); } diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 420d8e526..7180c6f51 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -19,16 +19,12 @@ class DiskCache { private isWritingCache = false; constructor() { - if (!cluster.isMaster) { + if (!cluster.isPrimary) { return; } process.on('SIGINT', (e) => { this.$saveCacheToDisk(true); - process.exit(2); - }); - process.on('SIGTERM', (e) => { - this.$saveCacheToDisk(true); - process.exit(2); + process.exit(0); }); } diff --git a/backend/src/config.ts b/backend/src/config.ts index 8ccd7e2e4..b364f100b 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -33,6 +33,7 @@ interface IConfig { ADVANCED_GBT_MEMPOOL: boolean; CPFP_INDEXING: boolean; MAX_BLOCKS_BULK_QUERY: number; + DISK_CACHE_BLOCK_INTERVAL: number; }; ESPLORA: { REST_API_URL: string; @@ -155,6 +156,7 @@ const defaults: IConfig = { 'ADVANCED_GBT_MEMPOOL': false, 'CPFP_INDEXING': false, 'MAX_BLOCKS_BULK_QUERY': 0, + 'DISK_CACHE_BLOCK_INTERVAL': 6, }, 'ESPLORA': { 'REST_API_URL': 'http://127.0.0.1:3000', diff --git a/docker/README.md b/docker/README.md index 525ecb718..13a4094cc 100644 --- a/docker/README.md +++ b/docker/README.md @@ -112,6 +112,7 @@ Below we list all settings from `mempool-config.json` and the corresponding over "ADVANCED_GBT_MEMPOOL": false, "CPFP_INDEXING": false, "MAX_BLOCKS_BULK_QUERY": 0, + "DISK_CACHE_BLOCK_INTERVAL": 6 }, ``` @@ -143,6 +144,7 @@ Corresponding `docker-compose.yml` overrides: MEMPOOL_ADVANCED_GBT_MEMPOOL: "" MEMPOOL_CPFP_INDEXING: "" MAX_BLOCKS_BULK_QUERY: "" + DISK_CACHE_BLOCK_INTERVAL: "" ... ``` diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 1b3ac1837..962a1509a 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -26,7 +26,8 @@ "ADVANCED_GBT_AUDIT": __MEMPOOL_ADVANCED_GBT_AUDIT__, "ADVANCED_GBT_MEMPOOL": __MEMPOOL_ADVANCED_GBT_MEMPOOL__, "CPFP_INDEXING": __MEMPOOL_CPFP_INDEXING__, - "MAX_BLOCKS_BULK_QUERY": __MEMPOOL_MAX_BLOCKS_BULK_QUERY__ + "MAX_BLOCKS_BULK_QUERY": __MEMPOOL_MAX_BLOCKS_BULK_QUERY__, + "DISK_CACHE_BLOCK_INTERVAL": __DISK_CACHE_BLOCK_INTERVAL__ }, "CORE_RPC": { "HOST": "__CORE_RPC_HOST__", diff --git a/docker/backend/start.sh b/docker/backend/start.sh index fced20974..cdf9ab67e 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -30,6 +30,7 @@ __MEMPOOL_ADVANCED_GBT_AUDIT__=${MEMPOOL_ADVANCED_GBT_AUDIT:=false} __MEMPOOL_ADVANCED_GBT_MEMPOOL__=${MEMPOOL_ADVANCED_GBT_MEMPOOL:=false} __MEMPOOL_CPFP_INDEXING__=${MEMPOOL_CPFP_INDEXING:=false} __MEMPOOL_MAX_BLOCKS_BULK_QUERY__=${MEMPOOL_MAX_BLOCKS_BULK_QUERY:=0} +__MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__=${MEMPOOL_DISK_CACHE_BLOCK_INTERVAL:=6} # CORE_RPC __CORE_RPC_HOST__=${CORE_RPC_HOST:=127.0.0.1} @@ -149,6 +150,7 @@ sed -i "s!__MEMPOOL_ADVANCED_GBT_MEMPOOL__!${__MEMPOOL_ADVANCED_GBT_MEMPOOL__}!g sed -i "s!__MEMPOOL_ADVANCED_GBT_AUDIT__!${__MEMPOOL_ADVANCED_GBT_AUDIT__}!g" mempool-config.json sed -i "s!__MEMPOOL_CPFP_INDEXING__!${__MEMPOOL_CPFP_INDEXING__}!g" mempool-config.json sed -i "s!__MEMPOOL_MAX_BLOCKS_BULK_QUERY__!${__MEMPOOL_MAX_BLOCKS_BULK_QUERY__}!g" mempool-config.json +sed -i "s!__MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__!${__MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__}!g" mempool-config.json sed -i "s/__CORE_RPC_HOST__/${__CORE_RPC_HOST__}/g" mempool-config.json sed -i "s/__CORE_RPC_PORT__/${__CORE_RPC_PORT__}/g" mempool-config.json diff --git a/production/mempool-config.liquid.json b/production/mempool-config.liquid.json index 11ad8ffcd..d6513f9e2 100644 --- a/production/mempool-config.liquid.json +++ b/production/mempool-config.liquid.json @@ -6,7 +6,8 @@ "MINED_BLOCKS_CACHE": 144, "SPAWN_CLUSTER_PROCS": 0, "API_URL_PREFIX": "/api/v1/", - "POLL_RATE_MS": 1000 + "POLL_RATE_MS": 1000, + "DISK_CACHE_BLOCK_INTERVAL": 1 }, "SYSLOG" : { "MIN_PRIORITY": "debug" diff --git a/production/mempool-config.liquidtestnet.json b/production/mempool-config.liquidtestnet.json index 7769bfb53..f85f041d2 100644 --- a/production/mempool-config.liquidtestnet.json +++ b/production/mempool-config.liquidtestnet.json @@ -6,7 +6,8 @@ "MINED_BLOCKS_CACHE": 144, "SPAWN_CLUSTER_PROCS": 0, "API_URL_PREFIX": "/api/v1/", - "POLL_RATE_MS": 1000 + "POLL_RATE_MS": 1000, + "DISK_CACHE_BLOCK_INTERVAL": 1 }, "SYSLOG" : { "MIN_PRIORITY": "debug" diff --git a/production/mempool-config.mainnet.json b/production/mempool-config.mainnet.json index cca43d7e3..fc08ae930 100644 --- a/production/mempool-config.mainnet.json +++ b/production/mempool-config.mainnet.json @@ -14,7 +14,8 @@ "CPFP_INDEXING": true, "ADVANCED_GBT_AUDIT": true, "ADVANCED_GBT_MEMPOOL": true, - "USE_SECOND_NODE_FOR_MINFEE": true + "USE_SECOND_NODE_FOR_MINFEE": true, + "DISK_CACHE_BLOCK_INTERVAL": 1 }, "SYSLOG" : { "MIN_PRIORITY": "debug" diff --git a/production/mempool-config.signet.json b/production/mempool-config.signet.json index 87f8e2650..c4d43e040 100644 --- a/production/mempool-config.signet.json +++ b/production/mempool-config.signet.json @@ -10,7 +10,8 @@ "AUDIT": true, "ADVANCED_GBT_AUDIT": true, "ADVANCED_GBT_MEMPOOL": true, - "POLL_RATE_MS": 1000 + "POLL_RATE_MS": 1000, + "DISK_CACHE_BLOCK_INTERVAL": 1 }, "SYSLOG" : { "MIN_PRIORITY": "debug" diff --git a/production/mempool-config.testnet.json b/production/mempool-config.testnet.json index 5c1695e62..f5ff4fba1 100644 --- a/production/mempool-config.testnet.json +++ b/production/mempool-config.testnet.json @@ -10,7 +10,8 @@ "AUDIT": true, "ADVANCED_GBT_AUDIT": true, "ADVANCED_GBT_MEMPOOL": true, - "POLL_RATE_MS": 1000 + "POLL_RATE_MS": 1000, + "DISK_CACHE_BLOCK_INTERVAL": 1 }, "SYSLOG" : { "MIN_PRIORITY": "debug" From 870e89514441fde18e9631801ce14b8dc29a3436 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 20 Mar 2023 16:11:37 +0900 Subject: [PATCH 110/782] Correcting docker disk cache config variable --- backend/src/__fixtures__/mempool-config.template.json | 2 +- docker/backend/mempool-config.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 07e930903..0ad2bc10d 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -29,7 +29,7 @@ "ADVANCED_GBT_MEMPOOL": "__MEMPOOL_ADVANCED_GBT_MEMPOOL__", "CPFP_INDEXING": "__MEMPOOL_CPFP_INDEXING__", "MAX_BLOCKS_BULK_QUERY": "__MEMPOOL_MAX_BLOCKS_BULK_QUERY__", - "DISK_CACHE_BLOCK_INTERVAL": "__DISK_CACHE_BLOCK_INTERVAL__" + "DISK_CACHE_BLOCK_INTERVAL": "__MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__" }, "CORE_RPC": { "HOST": "__CORE_RPC_HOST__", diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 962a1509a..6e20cc695 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -27,7 +27,7 @@ "ADVANCED_GBT_MEMPOOL": __MEMPOOL_ADVANCED_GBT_MEMPOOL__, "CPFP_INDEXING": __MEMPOOL_CPFP_INDEXING__, "MAX_BLOCKS_BULK_QUERY": __MEMPOOL_MAX_BLOCKS_BULK_QUERY__, - "DISK_CACHE_BLOCK_INTERVAL": __DISK_CACHE_BLOCK_INTERVAL__ + "DISK_CACHE_BLOCK_INTERVAL": __MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__ }, "CORE_RPC": { "HOST": "__CORE_RPC_HOST__", From 81d563381a26a5134989bfe623a4218246a53bab Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 20 Mar 2023 16:15:40 +0900 Subject: [PATCH 111/782] Make bitcoin core timeout configurable --- backend/mempool-config.sample.json | 6 ++++-- backend/src/__fixtures__/mempool-config.template.json | 6 ++++-- backend/src/__tests__/config.test.ts | 6 ++++-- backend/src/api/bitcoin/bitcoin-client.ts | 2 +- backend/src/api/bitcoin/bitcoin-second-client.ts | 2 +- backend/src/config.ts | 8 ++++++-- docker/README.md | 9 +++++++-- docker/backend/mempool-config.json | 6 ++++-- docker/backend/start.sh | 4 ++++ 9 files changed, 35 insertions(+), 14 deletions(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index 2369b64b5..a1391c52b 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -33,7 +33,8 @@ "HOST": "127.0.0.1", "PORT": 8332, "USERNAME": "mempool", - "PASSWORD": "mempool" + "PASSWORD": "mempool", + "TIMEOUT": 60000 }, "ELECTRUM": { "HOST": "127.0.0.1", @@ -47,7 +48,8 @@ "HOST": "127.0.0.1", "PORT": 8332, "USERNAME": "mempool", - "PASSWORD": "mempool" + "PASSWORD": "mempool", + "TIMEOUT": 60000 }, "DATABASE": { "ENABLED": true, diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 2bf52cbcf..759781045 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -34,7 +34,8 @@ "HOST": "__CORE_RPC_HOST__", "PORT": 15, "USERNAME": "__CORE_RPC_USERNAME__", - "PASSWORD": "__CORE_RPC_PASSWORD__" + "PASSWORD": "__CORE_RPC_PASSWORD__", + "TIMEOUT": "__CORE_RPC_TIMEOUT__" }, "ELECTRUM": { "HOST": "__ELECTRUM_HOST__", @@ -48,7 +49,8 @@ "HOST": "__SECOND_CORE_RPC_HOST__", "PORT": 17, "USERNAME": "__SECOND_CORE_RPC_USERNAME__", - "PASSWORD": "__SECOND_CORE_RPC_PASSWORD__" + "PASSWORD": "__SECOND_CORE_RPC_PASSWORD__", + "TIMEOUT": "__SECOND_CORE_RPC_TIMEOUT__" }, "DATABASE": { "ENABLED": false, diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 8b7ebc9ce..04c97f961 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -52,14 +52,16 @@ describe('Mempool Backend Config', () => { HOST: '127.0.0.1', PORT: 8332, USERNAME: 'mempool', - PASSWORD: 'mempool' + PASSWORD: 'mempool', + TIMEOUT: 60000 }); expect(config.SECOND_CORE_RPC).toStrictEqual({ HOST: '127.0.0.1', PORT: 8332, USERNAME: 'mempool', - PASSWORD: 'mempool' + PASSWORD: 'mempool', + TIMEOUT: 60000 }); expect(config.DATABASE).toStrictEqual({ diff --git a/backend/src/api/bitcoin/bitcoin-client.ts b/backend/src/api/bitcoin/bitcoin-client.ts index 85a410496..429638984 100644 --- a/backend/src/api/bitcoin/bitcoin-client.ts +++ b/backend/src/api/bitcoin/bitcoin-client.ts @@ -7,7 +7,7 @@ const nodeRpcCredentials: BitcoinRpcCredentials = { port: config.CORE_RPC.PORT, user: config.CORE_RPC.USERNAME, pass: config.CORE_RPC.PASSWORD, - timeout: 60000, + timeout: config.CORE_RPC.TIMEOUT, }; export default new bitcoin.Client(nodeRpcCredentials); diff --git a/backend/src/api/bitcoin/bitcoin-second-client.ts b/backend/src/api/bitcoin/bitcoin-second-client.ts index 39633a317..7f81a96a0 100644 --- a/backend/src/api/bitcoin/bitcoin-second-client.ts +++ b/backend/src/api/bitcoin/bitcoin-second-client.ts @@ -7,7 +7,7 @@ const nodeRpcCredentials: BitcoinRpcCredentials = { port: config.SECOND_CORE_RPC.PORT, user: config.SECOND_CORE_RPC.USERNAME, pass: config.SECOND_CORE_RPC.PASSWORD, - timeout: 60000, + timeout: config.SECOND_CORE_RPC.TIMEOUT, }; export default new bitcoin.Client(nodeRpcCredentials); diff --git a/backend/src/config.ts b/backend/src/config.ts index 8ccd7e2e4..6c17d7f81 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -65,12 +65,14 @@ interface IConfig { PORT: number; USERNAME: string; PASSWORD: string; + TIMEOUT: number; }; SECOND_CORE_RPC: { HOST: string; PORT: number; USERNAME: string; PASSWORD: string; + TIMEOUT: number; }; DATABASE: { ENABLED: boolean; @@ -168,13 +170,15 @@ const defaults: IConfig = { 'HOST': '127.0.0.1', 'PORT': 8332, 'USERNAME': 'mempool', - 'PASSWORD': 'mempool' + 'PASSWORD': 'mempool', + 'TIMEOUT': 60000, }, 'SECOND_CORE_RPC': { 'HOST': '127.0.0.1', 'PORT': 8332, 'USERNAME': 'mempool', - 'PASSWORD': 'mempool' + 'PASSWORD': 'mempool', + 'TIMEOUT': 60000, }, 'DATABASE': { 'ENABLED': true, diff --git a/docker/README.md b/docker/README.md index 525ecb718..ea9ca5d51 100644 --- a/docker/README.md +++ b/docker/README.md @@ -34,6 +34,7 @@ If you want to use different credentials, specify them in the `docker-compose.ym CORE_RPC_PORT: "8332" CORE_RPC_USERNAME: "customuser" CORE_RPC_PASSWORD: "custompassword" + CORE_RPC_TIMEOUT: "60000" ``` The IP address in the example above refers to Docker's default gateway IP address so that the container can hit the `bitcoind` instance running on the host machine. If your setup is different, update it accordingly. @@ -158,7 +159,8 @@ Corresponding `docker-compose.yml` overrides: "HOST": "127.0.0.1", "PORT": 8332, "USERNAME": "mempool", - "PASSWORD": "mempool" + "PASSWORD": "mempool", + "TIMEOUT": 60000 }, ``` @@ -170,6 +172,7 @@ Corresponding `docker-compose.yml` overrides: CORE_RPC_PORT: "" CORE_RPC_USERNAME: "" CORE_RPC_PASSWORD: "" + CORE_RPC_TIMEOUT: "" ... ``` @@ -219,7 +222,8 @@ Corresponding `docker-compose.yml` overrides: "HOST": "127.0.0.1", "PORT": 8332, "USERNAME": "mempool", - "PASSWORD": "mempool" + "PASSWORD": "mempool", + "TIMEOUT": 60000 }, ``` @@ -231,6 +235,7 @@ Corresponding `docker-compose.yml` overrides: SECOND_CORE_RPC_PORT: "" SECOND_CORE_RPC_USERNAME: "" SECOND_CORE_RPC_PASSWORD: "" + SECOND_CORE_RPC_TIMEOUT: "" ... ``` diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 1b3ac1837..915f0aac3 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -32,7 +32,8 @@ "HOST": "__CORE_RPC_HOST__", "PORT": __CORE_RPC_PORT__, "USERNAME": "__CORE_RPC_USERNAME__", - "PASSWORD": "__CORE_RPC_PASSWORD__" + "PASSWORD": "__CORE_RPC_PASSWORD__", + "TIMEOUT": __CORE_RPC_TIMEOUT__ }, "ELECTRUM": { "HOST": "__ELECTRUM_HOST__", @@ -46,7 +47,8 @@ "HOST": "__SECOND_CORE_RPC_HOST__", "PORT": __SECOND_CORE_RPC_PORT__, "USERNAME": "__SECOND_CORE_RPC_USERNAME__", - "PASSWORD": "__SECOND_CORE_RPC_PASSWORD__" + "PASSWORD": "__SECOND_CORE_RPC_PASSWORD__", + "TIMEOUT": __SECOND_CORE_RPC_TIMEOUT__ }, "DATABASE": { "ENABLED": __DATABASE_ENABLED__, diff --git a/docker/backend/start.sh b/docker/backend/start.sh index fced20974..f307b7111 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -36,6 +36,7 @@ __CORE_RPC_HOST__=${CORE_RPC_HOST:=127.0.0.1} __CORE_RPC_PORT__=${CORE_RPC_PORT:=8332} __CORE_RPC_USERNAME__=${CORE_RPC_USERNAME:=mempool} __CORE_RPC_PASSWORD__=${CORE_RPC_PASSWORD:=mempool} +__CORE_RPC_TIMEOUT__=${CORE_RPC_TIMEOUT:=60000} # ELECTRUM __ELECTRUM_HOST__=${ELECTRUM_HOST:=127.0.0.1} @@ -50,6 +51,7 @@ __SECOND_CORE_RPC_HOST__=${SECOND_CORE_RPC_HOST:=127.0.0.1} __SECOND_CORE_RPC_PORT__=${SECOND_CORE_RPC_PORT:=8332} __SECOND_CORE_RPC_USERNAME__=${SECOND_CORE_RPC_USERNAME:=mempool} __SECOND_CORE_RPC_PASSWORD__=${SECOND_CORE_RPC_PASSWORD:=mempool} +__SECOND_CORE_RPC_TIMEOUT__=${SECOND_CORE_RPC_TIMEOUT:=60000} # DATABASE __DATABASE_ENABLED__=${DATABASE_ENABLED:=true} @@ -154,6 +156,7 @@ sed -i "s/__CORE_RPC_HOST__/${__CORE_RPC_HOST__}/g" mempool-config.json sed -i "s/__CORE_RPC_PORT__/${__CORE_RPC_PORT__}/g" mempool-config.json sed -i "s/__CORE_RPC_USERNAME__/${__CORE_RPC_USERNAME__}/g" mempool-config.json sed -i "s/__CORE_RPC_PASSWORD__/${__CORE_RPC_PASSWORD__}/g" mempool-config.json +sed -i "s/__CORE_RPC_TIMEOUT__/${__CORE_RPC_TIMEOUT__}/g" mempool-config.json sed -i "s/__ELECTRUM_HOST__/${__ELECTRUM_HOST__}/g" mempool-config.json sed -i "s/__ELECTRUM_PORT__/${__ELECTRUM_PORT__}/g" mempool-config.json @@ -165,6 +168,7 @@ sed -i "s/__SECOND_CORE_RPC_HOST__/${__SECOND_CORE_RPC_HOST__}/g" mempool-config sed -i "s/__SECOND_CORE_RPC_PORT__/${__SECOND_CORE_RPC_PORT__}/g" mempool-config.json sed -i "s/__SECOND_CORE_RPC_USERNAME__/${__SECOND_CORE_RPC_USERNAME__}/g" mempool-config.json sed -i "s/__SECOND_CORE_RPC_PASSWORD__/${__SECOND_CORE_RPC_PASSWORD__}/g" mempool-config.json +sed -i "s/__SECOND_CORE_RPC_TIMEOUT__/${__SECOND_CORE_RPC_TIMEOUT__}/g" mempool-config.json sed -i "s/__DATABASE_ENABLED__/${__DATABASE_ENABLED__}/g" mempool-config.json sed -i "s/__DATABASE_HOST__/${__DATABASE_HOST__}/g" mempool-config.json From c6e063ea2f58428b3d12c4496c12052a3d32de49 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 20 Mar 2023 16:35:44 +0900 Subject: [PATCH 112/782] Make lnd timeout configurable --- backend/mempool-config.sample.json | 3 ++- backend/src/__fixtures__/mempool-config.template.json | 3 ++- backend/src/api/lightning/lnd/lnd-api.ts | 2 +- backend/src/config.ts | 2 ++ docker/README.md | 4 +++- docker/backend/mempool-config.json | 3 ++- docker/backend/start.sh | 2 ++ 7 files changed, 14 insertions(+), 5 deletions(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index a1391c52b..9e941636e 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -93,7 +93,8 @@ "LND": { "TLS_CERT_PATH": "tls.cert", "MACAROON_PATH": "readonly.macaroon", - "REST_API_URL": "https://localhost:8080" + "REST_API_URL": "https://localhost:8080", + "TIMEOUT": 10000 }, "CLIGHTNING": { "SOCKET": "lightning-rpc" diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 759781045..239c30547 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -109,7 +109,8 @@ "LND": { "TLS_CERT_PATH": "", "MACAROON_PATH": "", - "REST_API_URL": "https://localhost:8080" + "REST_API_URL": "https://localhost:8080", + "TIMEOUT": 10000 }, "CLIGHTNING": { "SOCKET": "__CLIGHTNING_SOCKET__" diff --git a/backend/src/api/lightning/lnd/lnd-api.ts b/backend/src/api/lightning/lnd/lnd-api.ts index 1480f9b8f..31b868df9 100644 --- a/backend/src/api/lightning/lnd/lnd-api.ts +++ b/backend/src/api/lightning/lnd/lnd-api.ts @@ -17,7 +17,7 @@ class LndApi implements AbstractLightningApi { httpsAgent: new Agent({ ca: fs.readFileSync(config.LND.TLS_CERT_PATH) }), - timeout: 10000 + timeout: config.LND.TIMEOUT }; } } diff --git a/backend/src/config.ts b/backend/src/config.ts index 6c17d7f81..a16b38af9 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -51,6 +51,7 @@ interface IConfig { TLS_CERT_PATH: string; MACAROON_PATH: string; REST_API_URL: string; + TIMEOUT: number; }; CLIGHTNING: { SOCKET: string; @@ -218,6 +219,7 @@ const defaults: IConfig = { 'TLS_CERT_PATH': '', 'MACAROON_PATH': '', 'REST_API_URL': 'https://localhost:8080', + 'TIMEOUT': 10000, }, 'CLIGHTNING': { 'SOCKET': '', diff --git a/docker/README.md b/docker/README.md index ea9ca5d51..1b9787842 100644 --- a/docker/README.md +++ b/docker/README.md @@ -172,7 +172,7 @@ Corresponding `docker-compose.yml` overrides: CORE_RPC_PORT: "" CORE_RPC_USERNAME: "" CORE_RPC_PASSWORD: "" - CORE_RPC_TIMEOUT: "" + CORE_RPC_TIMEOUT: 60000 ... ``` @@ -408,6 +408,7 @@ Corresponding `docker-compose.yml` overrides: "TLS_CERT_PATH": "" "MACAROON_PATH": "" "REST_API_URL": "https://localhost:8080" + "TIMEOUT": 10000 } ``` @@ -418,6 +419,7 @@ Corresponding `docker-compose.yml` overrides: LND_TLS_CERT_PATH: "" LND_MACAROON_PATH: "" LND_REST_API_URL: "https://localhost:8080" + LND_TIMEOUT: 10000 ... ``` diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 915f0aac3..c1165a93a 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -85,7 +85,8 @@ "LND": { "TLS_CERT_PATH": "__LND_TLS_CERT_PATH__", "MACAROON_PATH": "__LND_MACAROON_PATH__", - "REST_API_URL": "__LND_REST_API_URL__" + "REST_API_URL": "__LND_REST_API_URL__", + "TIMEOUT": "__LND_TIMEOUT__" }, "CLIGHTNING": { "SOCKET": "__CLIGHTNING_SOCKET__" diff --git a/docker/backend/start.sh b/docker/backend/start.sh index f307b7111..3c963815c 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -109,6 +109,7 @@ __LIGHTNING_LOGGER_UPDATE_INTERVAL__=${LIGHTNING_LOGGER_UPDATE_INTERVAL:=30} __LND_TLS_CERT_PATH__=${LND_TLS_CERT_PATH:=""} __LND_MACAROON_PATH__=${LND_MACAROON_PATH:=""} __LND_REST_API_URL__=${LND_REST_API_URL:="https://localhost:8080"} +__LND_TIMEOUT__=${LND_TIMEOUT:=10000} # CLN __CLIGHTNING_SOCKET__=${CLIGHTNING_SOCKET:=""} @@ -220,6 +221,7 @@ sed -i "s!__LIGHTNING_LOGGER_UPDATE_INTERVAL__!${__LIGHTNING_LOGGER_UPDATE_INTER sed -i "s!__LND_TLS_CERT_PATH__!${__LND_TLS_CERT_PATH__}!g" mempool-config.json sed -i "s!__LND_MACAROON_PATH__!${__LND_MACAROON_PATH__}!g" mempool-config.json sed -i "s!__LND_REST_API_URL__!${__LND_REST_API_URL__}!g" mempool-config.json +sed -i "s!__LND_TIMEOUT__!${__LND_TIMEOUT__}!g" mempool-config.json # CLN sed -i "s!__CLIGHTNING_SOCKET__!${__CLIGHTNING_SOCKET__}!g" mempool-config.json From 74fb2926330dcf344ef107b91d169f04f8ef1d22 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 20 Mar 2023 17:21:34 +0900 Subject: [PATCH 113/782] Difficulty mining ellipsis fix --- .../difficulty-mining/difficulty-mining.component.html | 5 +++-- .../difficulty-mining/difficulty-mining.component.scss | 4 ++++ .../difficulty-mining/difficulty-mining.component.ts | 4 ++++ .../app/components/reward-stats/reward-stats.component.html | 4 ++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html index ce0bf7eff..774ddef07 100644 --- a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.html @@ -47,7 +47,8 @@
    -
    Next Halving
    +
    Next Halving
    {{ i }} blocks @@ -77,7 +78,7 @@
    -
    Current Period
    +
    Next Halving
    diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss index 0530bc0cf..cf031bebc 100644 --- a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss @@ -10,6 +10,7 @@ .item { padding: 0 5px; width: 100%; + max-width: 150px; &:nth-child(1) { display: none; @media (min-width: 485px) { @@ -85,6 +86,9 @@ .card-title { color: #4a68b9; font-size: 1rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .progress { diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts index 2abb02e22..fbf31f238 100644 --- a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts @@ -83,4 +83,8 @@ export class DifficultyMiningComponent implements OnInit { }) ); } + + isEllipsisActive(e): boolean { + return (e.offsetWidth < e.scrollWidth); + } } diff --git a/frontend/src/app/components/reward-stats/reward-stats.component.html b/frontend/src/app/components/reward-stats/reward-stats.component.html index d59280fd1..5c1a8d7cd 100644 --- a/frontend/src/app/components/reward-stats/reward-stats.component.html +++ b/frontend/src/app/components/reward-stats/reward-stats.component.html @@ -50,14 +50,14 @@
    -
    Reward Per Tx
    +
    Avg Block Fees
    -
    Reward Per Tx
    +
    Avg Tx Fee
    From d82a7169b779e38f99232bb78bd585964b6cff1c Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 20 Mar 2023 18:28:15 +0900 Subject: [PATCH 114/782] Pull from transifex --- frontend/src/locale/messages.de.xlf | 13 +++++--- frontend/src/locale/messages.pt.xlf | 3 ++ frontend/src/locale/messages.ru.xlf | 48 ++++++++++++++++++++--------- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/frontend/src/locale/messages.de.xlf b/frontend/src/locale/messages.de.xlf index a78568ca1..87050f55b 100644 --- a/frontend/src/locale/messages.de.xlf +++ b/frontend/src/locale/messages.de.xlf @@ -3203,7 +3203,7 @@ blocks expected - Blöcke erwartet + Blöcke erwartet src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3221,7 +3221,7 @@ blocks mined - Blöcke gefunden + Blöcke gefunden src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3239,7 +3239,7 @@ blocks remaining - verbleibende Blöcke + verbleibende Blöcke src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3257,7 +3257,7 @@ blocks ahead - Blöcke voraus + Blöcke voraus src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3275,7 +3275,7 @@ blocks behind - Blöcke dahinter + Blöcke dahinter src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3995,6 +3995,7 @@ blocks + blöcke src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4014,6 +4015,7 @@ Other () + Andere () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -6773,6 +6775,7 @@ nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 diff --git a/frontend/src/locale/messages.pt.xlf b/frontend/src/locale/messages.pt.xlf index e6ef0f346..bed923e05 100644 --- a/frontend/src/locale/messages.pt.xlf +++ b/frontend/src/locale/messages.pt.xlf @@ -3995,6 +3995,7 @@ blocks + blocos src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4014,6 +4015,7 @@ Other () + Outras () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -6773,6 +6775,7 @@ nodes + nós src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 diff --git a/frontend/src/locale/messages.ru.xlf b/frontend/src/locale/messages.ru.xlf index ef455e2a5..db7f70492 100644 --- a/frontend/src/locale/messages.ru.xlf +++ b/frontend/src/locale/messages.ru.xlf @@ -348,7 +348,7 @@ transaction - транзакция + транзакция src/app/bisq/bisq-address/bisq-address.component.html 48 @@ -373,7 +373,7 @@ transactions - транзакции(й) + транзакции(й) src/app/bisq/bisq-address/bisq-address.component.html 49 @@ -1109,7 +1109,7 @@ confirmation - подтверждение + подтверждение src/app/bisq/bisq-transaction/bisq-transaction.component.html 20,21 @@ -1131,7 +1131,7 @@ confirmations - подтверждения(й) + подтверждения(й) src/app/bisq/bisq-transaction/bisq-transaction.component.html 21,22 @@ -1764,7 +1764,7 @@ of   - из + из src/app/components/asset/asset.component.html 78 @@ -3203,6 +3203,7 @@ blocks expected + блоков добавлено src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + блок добавлен src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + блоков намайнено src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + блок намайнен src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + блоков осталось src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + блок остался src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + блоков ожидает src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + блок ожидает src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + блоков позади src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + блок позади src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + Среднее время блока src/app/components/difficulty/difficulty.component.html 42,45 @@ -3984,6 +3995,7 @@ blocks + блоков src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4003,6 +4015,7 @@ Other () + Другое ( ) src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4505,7 +4518,7 @@ ago - назад + назад src/app/components/time/time.component.ts 103 @@ -4565,6 +4578,7 @@ In ~ + Через ~ src/app/components/time/time.component.ts 126 @@ -5053,7 +5067,7 @@ remaining - осталось + осталось src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -5106,7 +5120,7 @@ This transaction saved % on fees by using native SegWit - Эта транзакция сэкономила % на комиссиях за счет использования нативного SegWit. + Эта транзакция сэкономила % на комиссиях за счет использования нативного SegWit. src/app/components/tx-features/tx-features.component.html 2 @@ -5133,7 +5147,7 @@ This transaction saved % on fees by using SegWit and could save % more by fully upgrading to native SegWit - Эта транзакция сэкономила % на комиссиях за счет использования SegWit и может сэкономить еще % за счет полного перехода на нативный SegWit. + Эта транзакция сэкономила % на комиссиях за счет использования SegWit и может сэкономить еще % за счет полного перехода на нативный SegWit. src/app/components/tx-features/tx-features.component.html 4 @@ -5142,7 +5156,7 @@ This transaction could save % on fees by upgrading to native SegWit or % by upgrading to SegWit-P2SH - Эта транзакция могла сэкономить % на комиссиях за счет перехода на нативный SegWit или % за счет обновления до SegWit-P2SH. + Эта транзакция могла сэкономить % на комиссиях за счет перехода на нативный SegWit или % за счет обновления до SegWit-P2SH. src/app/components/tx-features/tx-features.component.html 6 @@ -5264,7 +5278,7 @@ Only ~ sat/vB was needed to get into this block - Чтобы попасть в этот блок, необходимо всего ~ sat / vB + Чтобы попасть в этот блок, необходимо всего ~ sat/vB src/app/components/tx-fee-rating/tx-fee-rating.component.html 2 @@ -5277,7 +5291,7 @@ Overpaid x - Переплачено x + Переплачено x src/app/components/tx-fee-rating/tx-fee-rating.component.html 2 @@ -5564,7 +5578,7 @@ channels - каналов + каналов src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -6712,6 +6726,7 @@ Clearnet and Darknet + Clearnet и Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6723,6 +6738,7 @@ Clearnet Only (IPv4, IPv6) + Только Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6734,6 +6750,7 @@ Darknet Only (Tor, I2P, cjdns) + Только Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6758,6 +6775,7 @@ nodes + узлов src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -7100,7 +7118,7 @@ minute - минута + минута src/app/shared/i18n/dates.ts 13 @@ -7108,7 +7126,7 @@ minutes - минут + минут src/app/shared/i18n/dates.ts 14 From e6bc5bef3349de4dc944e8ae77e7879841e11e0c Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 20 Mar 2023 18:50:20 +0900 Subject: [PATCH 115/782] Updating russian i18n --- frontend/src/locale/messages.ru.xlf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/frontend/src/locale/messages.ru.xlf b/frontend/src/locale/messages.ru.xlf index db7f70492..3ecb4798f 100644 --- a/frontend/src/locale/messages.ru.xlf +++ b/frontend/src/locale/messages.ru.xlf @@ -7038,7 +7038,7 @@ year - год + год src/app/shared/i18n/dates.ts 3 @@ -7046,7 +7046,7 @@ years - лет + лет src/app/shared/i18n/dates.ts 4 @@ -7054,7 +7054,7 @@ month - месяц + месяц src/app/shared/i18n/dates.ts 5 @@ -7062,7 +7062,7 @@ months - месяцев + месяцев src/app/shared/i18n/dates.ts 6 @@ -7070,7 +7070,7 @@ week - неделя + неделя src/app/shared/i18n/dates.ts 7 @@ -7078,7 +7078,7 @@ weeks - недель + недель src/app/shared/i18n/dates.ts 8 @@ -7086,7 +7086,7 @@ day - дней + дней src/app/shared/i18n/dates.ts 9 @@ -7094,7 +7094,7 @@ days - дней + дней src/app/shared/i18n/dates.ts 10 @@ -7102,7 +7102,7 @@ hour - час + час src/app/shared/i18n/dates.ts 11 @@ -7110,7 +7110,7 @@ hours - часов + часов src/app/shared/i18n/dates.ts 12 @@ -7134,7 +7134,7 @@ second - секунда + секунда src/app/shared/i18n/dates.ts 15 @@ -7142,7 +7142,7 @@ seconds - секунд + секунд src/app/shared/i18n/dates.ts 16 From e3109a8fec0b92f6996f02b2b3da72c82edd8dfb Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 20 Mar 2023 20:46:11 +0900 Subject: [PATCH 116/782] Catch exeptions in Lightning stats fixes #3486 --- backend/src/index.ts | 4 ++-- .../src/tasks/lightning/stats-updater.service.ts | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index fbe9c08c2..ccba83be9 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -215,11 +215,11 @@ class Server { await lightningStatsUpdater.$startService(); await forensicsService.$startService(); } catch(e) { - logger.err(`Nodejs lightning backend crashed. Restarting in 1 minute. Reason: ${(e instanceof Error ? e.message : e)}`); + logger.err(`Exception in $runLightningBackend. Restarting in 1 minute. Reason: ${(e instanceof Error ? e.message : e)}`); await Common.sleep$(1000 * 60); this.$runLightningBackend(); }; -} + } setUpWebsocketHandling(): void { if (this.wss) { diff --git a/backend/src/tasks/lightning/stats-updater.service.ts b/backend/src/tasks/lightning/stats-updater.service.ts index 69b4cbadd..5d0ac3cfc 100644 --- a/backend/src/tasks/lightning/stats-updater.service.ts +++ b/backend/src/tasks/lightning/stats-updater.service.ts @@ -22,12 +22,15 @@ class LightningStatsUpdater { * Update the latest entry for each node every config.LIGHTNING.STATS_REFRESH_INTERVAL seconds */ private async $logStatsDaily(): Promise { - const date = new Date(); - Common.setDateMidnight(date); - const networkGraph = await lightningApi.$getNetworkGraph(); - await LightningStatsImporter.computeNetworkStats(date.getTime() / 1000, networkGraph); - - logger.debug(`Updated latest network stats`, logger.tags.ln); + try { + const date = new Date(); + Common.setDateMidnight(date); + const networkGraph = await lightningApi.$getNetworkGraph(); + await LightningStatsImporter.computeNetworkStats(date.getTime() / 1000, networkGraph); + logger.debug(`Updated latest network stats`, logger.tags.ln); + } catch (e) { + logger.err(`Exception in $logStatsDaily. Reason: ${(e instanceof Error ? e.message : e)}`); + } } } From cd2bda4b493c34ba1b63a443a63215391db29d39 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 20 Mar 2023 21:44:47 +0900 Subject: [PATCH 117/782] Pull russian from transifex --- frontend/src/locale/messages.ru.xlf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/messages.ru.xlf b/frontend/src/locale/messages.ru.xlf index 3ecb4798f..490b42bd9 100644 --- a/frontend/src/locale/messages.ru.xlf +++ b/frontend/src/locale/messages.ru.xlf @@ -7070,7 +7070,7 @@ week - неделя + неделю src/app/shared/i18n/dates.ts 7 @@ -7078,7 +7078,7 @@ weeks - недель + недели src/app/shared/i18n/dates.ts 8 From 758e4d4f4c5eab99f5d64e2003919a31d5aea558 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 15:49:38 +0900 Subject: [PATCH 118/782] Disable LN on macaroon fail --- backend/src/api/lightning/lnd/lnd-api.ts | 25 +++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/backend/src/api/lightning/lnd/lnd-api.ts b/backend/src/api/lightning/lnd/lnd-api.ts index 31b868df9..fb5991111 100644 --- a/backend/src/api/lightning/lnd/lnd-api.ts +++ b/backend/src/api/lightning/lnd/lnd-api.ts @@ -4,21 +4,28 @@ import * as fs from 'fs'; import { AbstractLightningApi } from '../lightning-api-abstract-factory'; import { ILightningApi } from '../lightning-api.interface'; import config from '../../../config'; +import logger from '../../../logger'; class LndApi implements AbstractLightningApi { axiosConfig: AxiosRequestConfig = {}; constructor() { if (config.LIGHTNING.ENABLED) { - this.axiosConfig = { - headers: { - 'Grpc-Metadata-macaroon': fs.readFileSync(config.LND.MACAROON_PATH).toString('hex') - }, - httpsAgent: new Agent({ - ca: fs.readFileSync(config.LND.TLS_CERT_PATH) - }), - timeout: config.LND.TIMEOUT - }; + try { + const macaroon = fs.readFileSync(config.LND.MACAROON_PATH).toString('hex'); + this.axiosConfig = { + headers: { + 'Grpc-Metadata-macaroon': macaroon + }, + httpsAgent: new Agent({ + ca: fs.readFileSync(config.LND.TLS_CERT_PATH) + }), + timeout: config.LND.TIMEOUT + }; + } catch (e) { + logger.err(`Could not initialize LND Macaroon/TLS Cert. Disabling LIGHTNING. ` + (e instanceof Error ? e.message : e)); + config.LIGHTNING.ENABLED = false; + } } } From d337bf3ee2919821b2128afc5336f7557bee6ff4 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 15:50:33 +0900 Subject: [PATCH 119/782] Turn off LN if Macaroon is missing --- backend/src/api/lightning/lnd/lnd-api.ts | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/backend/src/api/lightning/lnd/lnd-api.ts b/backend/src/api/lightning/lnd/lnd-api.ts index fb5991111..7db792178 100644 --- a/backend/src/api/lightning/lnd/lnd-api.ts +++ b/backend/src/api/lightning/lnd/lnd-api.ts @@ -10,22 +10,22 @@ class LndApi implements AbstractLightningApi { axiosConfig: AxiosRequestConfig = {}; constructor() { - if (config.LIGHTNING.ENABLED) { - try { - const macaroon = fs.readFileSync(config.LND.MACAROON_PATH).toString('hex'); - this.axiosConfig = { - headers: { - 'Grpc-Metadata-macaroon': macaroon - }, - httpsAgent: new Agent({ - ca: fs.readFileSync(config.LND.TLS_CERT_PATH) - }), - timeout: config.LND.TIMEOUT - }; - } catch (e) { - logger.err(`Could not initialize LND Macaroon/TLS Cert. Disabling LIGHTNING. ` + (e instanceof Error ? e.message : e)); - config.LIGHTNING.ENABLED = false; - } + if (!config.LIGHTNING.ENABLED) { + return; + } + try { + this.axiosConfig = { + headers: { + 'Grpc-Metadata-macaroon': fs.readFileSync(config.LND.MACAROON_PATH).toString('hex'), + }, + httpsAgent: new Agent({ + ca: fs.readFileSync(config.LND.TLS_CERT_PATH) + }), + timeout: config.LND.TIMEOUT + }; + } catch (e) { + logger.err(`Could not initialize LND Macaroon/TLS Cert. Disabling LIGHTNING. ` + (e instanceof Error ? e.message : e)); + config.LIGHTNING.ENABLED = false; } } From cb8fdb5e8de98f3bede276fa18ed4d6874266c38 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 21 Mar 2023 15:56:11 +0900 Subject: [PATCH 120/782] Hack docker frontend entrypoint to auto-enable lightning --- docker/frontend/entrypoint.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/frontend/entrypoint.sh b/docker/frontend/entrypoint.sh index 45d852c45..1721bcad5 100644 --- a/docker/frontend/entrypoint.sh +++ b/docker/frontend/entrypoint.sh @@ -10,6 +10,8 @@ cp /etc/nginx/nginx.conf /patch/nginx.conf sed -i "s/__MEMPOOL_FRONTEND_HTTP_PORT__/${__MEMPOOL_FRONTEND_HTTP_PORT__}/g" /patch/nginx.conf cat /patch/nginx.conf > /etc/nginx/nginx.conf +[ "${APP_LIGHTNING_NODE_PORT}" = "9735" ] && LIGHTNING=true + # Runtime overrides - read env vars defined in docker compose __TESTNET_ENABLED__=${TESTNET_ENABLED:=false} From d76e3a5939c3757a301a1c7680d6a3ec7078f34c Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 16:02:46 +0900 Subject: [PATCH 121/782] Audit disabled related UX fixes --- .../pool-ranking/pool-ranking.component.html | 16 +++++++-------- .../app/components/pool/pool.component.html | 20 +++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.html b/frontend/src/app/components/pool-ranking/pool-ranking.component.html index 32a186fb8..57909c74f 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.html +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.html @@ -32,7 +32,7 @@
    -
    +
    Pools Ranking
    HeightAdjustedDifficultyChangeHeightAdjustedDifficultyChange
    {{ diffChange.height - }} + + {{ diffChange.height }} + {{ diffChange.difficultyShorten }}
    - + - + - + @@ -107,7 +107,7 @@ - + - + - diff --git a/frontend/src/app/components/pool/pool.component.html b/frontend/src/app/components/pool/pool.component.html index 57d7ac51c..898e50fc2 100644 --- a/frontend/src/app/components/pool/pool.component.html +++ b/frontend/src/app/components/pool/pool.component.html @@ -94,13 +94,13 @@ - + - - + - - + @@ -394,7 +394,7 @@ - @@ -409,7 +409,7 @@ - + @@ -419,7 +419,7 @@ - @@ -485,4 +485,8 @@ + + + + \ No newline at end of file From 45dbc6c6f6afc775c35a1854667c551eab5fd72c Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 16:21:11 +0900 Subject: [PATCH 122/782] Update logger network after modifying config --- backend/src/api/lightning/lnd/lnd-api.ts | 3 ++- backend/src/logger.ts | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/api/lightning/lnd/lnd-api.ts b/backend/src/api/lightning/lnd/lnd-api.ts index 7db792178..b4c91d36e 100644 --- a/backend/src/api/lightning/lnd/lnd-api.ts +++ b/backend/src/api/lightning/lnd/lnd-api.ts @@ -24,8 +24,9 @@ class LndApi implements AbstractLightningApi { timeout: config.LND.TIMEOUT }; } catch (e) { - logger.err(`Could not initialize LND Macaroon/TLS Cert. Disabling LIGHTNING. ` + (e instanceof Error ? e.message : e)); config.LIGHTNING.ENABLED = false; + logger.updateNetwork(); + logger.err(`Could not initialize LND Macaroon/TLS Cert. Disabling LIGHTNING. ` + (e instanceof Error ? e.message : e)); } } diff --git a/backend/src/logger.ts b/backend/src/logger.ts index 634f8f582..efafe894e 100644 --- a/backend/src/logger.ts +++ b/backend/src/logger.ts @@ -69,6 +69,10 @@ class Logger { this.network = this.getNetwork(); } + public updateNetwork(): void { + this.network = this.getNetwork(); + } + private addprio(prio): void { this[prio] = (function(_this) { return function(msg, tag?: string) { From d7d45146c82c61b4940f5c1e540422b5a33143ea Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 17:33:14 +0900 Subject: [PATCH 123/782] Lightning indexing indicators refs #2647 --- .../nodes-channels-map.component.html | 3 +++ .../nodes-channels-map.component.scss | 7 +++++++ .../nodes-channels-map.component.ts | 3 +++ .../nodes-per-isp-chart.component.html | 6 +++++- .../nodes-per-isp-chart.component.scss | 12 +++++++++++- .../nodes-per-isp-chart.component.ts | 3 +++ 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html index b262f58fd..54868fbe6 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -18,5 +18,8 @@
    +
    + Indexing in progress +
    \ No newline at end of file diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.scss b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.scss index 09c029d66..ca51dc6a2 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.scss +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.scss @@ -133,3 +133,10 @@ top: 450px; } } + +.indexing-message { + position: absolute; + width: 100%; + text-align: center; + margin-top: 100px; +} diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts index 71b5d3afd..05e35b6af 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts @@ -36,6 +36,7 @@ export class NodesChannelsMap implements OnInit { channelCurve = 0; nodeSize = 4; isLoading = false; + showIndexingInProgress = false; chartInstance = undefined; chartOptions: EChartsOption = {}; @@ -206,6 +207,8 @@ export class NodesChannelsMap implements OnInit { let title: object; if (channels.length === 0 && !this.placeholder) { this.chartOptions = null; + this.showIndexingInProgress = true; + this.isLoading = false; return; } diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html index a168c032a..356674f14 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html @@ -38,7 +38,7 @@ -
    +
    @@ -99,3 +99,7 @@
    + + +
    Indexing in progress
    +
    diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss index 08fb359a6..f1d39081d 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.scss @@ -167,4 +167,14 @@ padding-left: 105px; padding-right: 105px; } -} \ No newline at end of file +} + +.indexing-message { + font-size: 15px; + color: grey; + font-weight: bold; + width: 100%; + padding-top: 100px; + text-align: center; + height: 240px; +} diff --git a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts index 614704ed6..67f393bc2 100644 --- a/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts +++ b/frontend/src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts @@ -29,6 +29,7 @@ export class NodesPerISPChartComponent implements OnInit { sortBy = 'capacity'; showUnknown = false; chartInstance = undefined; + indexingInProgress = false; @HostBinding('attr.dir') dir = 'ltr'; @@ -88,6 +89,8 @@ export class NodesPerISPChartComponent implements OnInit { this.prepareChartOptions(data.ispRanking); + this.indexingInProgress = !data.ispRanking.length; + return { taggedISP: data.ispRanking.length, clearnetCapacity: data.clearnetCapacity, From f5f0329d39efbc07f7ca011b5303cd36b91c0254 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 18:03:19 +0900 Subject: [PATCH 124/782] Update softsimon profile photo --- frontend/src/resources/profile/softsimon.jpg | Bin 32750 -> 31906 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/frontend/src/resources/profile/softsimon.jpg b/frontend/src/resources/profile/softsimon.jpg index 7a3fc9010cac465a60535ae8f72002a48e05a430..0671f663b2b5cc2a4090dc0112c1e6f91fe76a70 100644 GIT binary patch literal 31906 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 N>q1;*JhR&+HKfF5_s1yB4zw^APBUj?->8c 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

    $E~ICJ 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 EKLvj;*#H0l literal 32750 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 ^3lJYX(VAzSH6aB zj&9e)lA9ue<#z$*50@C{HM1Q0(k{M4Hm)=K;v_#Q^8Wyb*NV&0=V&}laWrttIVFb3 z`D2k<{{Y%yBiEJeu7gO;oX7sJ_jvieE6t;21bW$zGsMlPrnKMHKK;f?eW`g~9ZBp^ zByvX4ZIe6jhXdNRBGxZQiDh=t=il~39$K&@eEH2#mr}RShr>lWi+K^-%!u=d`+C-# z8upkxNj%K%h}N;LS~ku@lj&PU>$&CDi*f!JN8kCqOdG99rSP0qk7sbI*Fc$y{D=3s z>+9O9X!~T=HOHGdOGAuytvmfkPn*IJT0tuL?Q*z4Kk2rAm1k(V8jpyd83NFZ`{t(3 z>-y++)0L=IYCOL4`Ra~KEgiG~HUlQ|1zCpW;Q{gU4nQ>&$QB3!VYfh}0CL^`06|ub zoN>e+?pJa`{E>AXat?d_E6a6b6{+ugK7G#1#dnzSmxGEf*K0XL5;;FGsXPIo*?5^+ z&UqoTkyw!Tzna2ZXPe6tDzoN&XaIdgHGcu42-C zM^?YPhA0+vw1>@+?Z)qy8RYwSs@m6$Z~RMnXm5wwRYp=5$V`6|dSl+XonKv!Hn_FX zfws4p6`7(Xe9@n~{_pdytUfBTyD_POqbb=hUoTSDr{Xx$;0qJIfWen1Z{b)HU%NHPKTSTD!EF(;Pi4Jak^ZVH|Vb4Z|^^BUsVs#iVkG^~V0EIg4^yH{LxyNeHX$uS!{uP9pS~8%eCY#YO>(uN#PV!xAR(hn! zqx(xtf_=mI*e=FDUC47>*$#0Y;2jUk{vS&0wd)qS_;2A|S~5wpw|jY)839^WD&L<6 z>MM&a-@ijjF6&W7Hc2kXiPg6$RpgzxAKvt&<}y}6wCAC#cJCU`6Uayieqt9n9=}@9 zw3azFISk%RkxWlG%9^DV$2yKTve3szk`l%lUObEt4l_}+5OO&@o@=4J@bpJ}+ezdR z$VWL-{uO~VFAME)$nH55P7+&%D%9%yBR4iNo<5X;+d18jdO`^8KsA}Qm4z(qKJh&C zrjXhBk6(Il-JPSU?Lkeg$>*sw2A3I}bft`7?>)E_V{s?3r(~Q1fCm(cZ$q#6bE?Im z_?GKYkwd&zG6-VtEUZ*2{(PTcYm}aOZ!YdGE+q43nnrh%Io!mYpT@OxAskWbSF(Nk zZ9U8+bq?&YgZVR72;cxZR%tGF`j>X#kuWkQ2qb~m9je@SESMnjPp>sqT!HJK&Xk2= zgTeI`(HS+d&nTz5I*kX#7rGSj-D%UkyyK0)!?4t}+IE1k%ou{b-14lsSIRV5{7zsTowxmuFj=6x-s zuBoWrP2vlkVk>yqEs(eJMkK*MDJ11dX6?;%*812~jt?Q3)i#nC9zg#9>sOZe55;;$ zrQx>l{=F>gI?QfjnkGBt=Q+saFg0IU_=k6+-H3E`fvrTMHInK8(gDEh-@jVruM5dV z_g|6gVCcHhsa`N@DLFfAwb=GSf95o48W3Lu62RxaD#VlAAuJLgqmoP4n%a2IYl-H8 zOcBp(AD+O)%cjO7VD-w_YVWhiC5agcWblB^NTs+-*KYt~qbvz8Q_fbF|J*8xpdo$ z@3TgP+-{7su5p9u=zVLWzSD$08`H16)_G;Ph!8;90e-@{xO8dtolWhm6dADcKbYH8 z0DB+lUVbifi%J{+0K=Z%TO2!t-A0^KZMU}M*VmtDvw@(}tnK45tIa%7g>jNWQO`{C ziiYH@I-FoAbwl?bqp2U)*0rs?AL0lte20$A!@F|>C@g;*cA@+mtunI+tyV@O7@s&F zms4I$u+`kY7JA>>m=(1}_niEO)JASsOn6sz;kIVv^zYl=m}9WJmK2T|Rzk(5V>W(Y z^P1hC!oDS%IHTKcsT5vPA)n<7l27JpnDBPDXB*ty8(5=&d5tHX_dw2n!nKALt*-8e z{iTI(N{jFNj7zyb&Lp&q5P#*X7Re*{SLg?7%E=_L>)Nf#14zUIHxhpetl)%Ej)a11 zsV5ktrk$?eaf|oHdS{x@7eJ-}0~}U$IYSe|lk^nfCblZ16uu$Soy<>PdSyw5Ad)#A z)fp6;)FS#G!{Lz)=YjOQYn9z@@Vrt1+!t)un(G>5x-O-0r^<8XoW}nE-;Dj%{HxIX zDoXf2N*Tbzoc&#@9~x;RRIrKTQTEGle6#)W-9M=AkCu$C@bwWE>IBDWTdI z+=Qv;r+R8Jy~;N!UOP3Jio2h?#-+P^{(&Xzl1-wwH4LxAAjCI`_jZ;je`f>KDtmQPwUYRE@YXKr-NcTL7PId)J@#uU`1o zd|t;%v@T0D@=D(L0DoHY8p97!&OFbl(_Wf{xmQ8J#v3HxdNIzFtY=85zb0wQCl>DR(ff zjjM-?r3p0|ZkEikp%HPd-;#<{X_2p)w;OO|3^VKB=~>#n?W|UJF>bhFc?b}Bi<9!P z$jRgZ#|E)9nY>SZr)oC(G!xvl*jSoXO{p3JcOB;nG6@}Pq0+t`-cAI%&Zb0#ar=|! z5I^5+FW|Yaoo=2NHLHxNC1TAcBjWH8p(-SYT+{QV9dU0p4%<+_SCX%-@? zT=Drun5X5^|u&=`170-}n)Mk-}P9=>_KA5fpSJ3Qqe;Ov6Z+O>MW=Pk0 zb>5(m7#8V~>x%U-+3p(^SJ~6O(!JVt(DLV&PK7>Zytlj8xp`n+PTu8Qlt{+@4_sCa zo|k!dX!EEdCXj$ndi6X100rrKZiT8zVRv|vM*|(Q&l86BH~`lLs@-cEZ-nBz)1>lM zSVZoK2;oWZo@>6IVM`H7RHE;%^`K?BU$Ln;VpHX|me;pZf@rg>n`ZsoU=n0v6-VM~ zDJ}HNbTUb-Td*f+SkCfK;a!%E;F~Q=O19MXTbtchd0|@FK4&nwf2=6xIrmJx8ZjT;B(Msxqr5~r1@FBJf@S5tNQ#;C-C*P&BnQY zmiO{TP!ete47mDqtB-4Xz8ln?buwb}=2wWszd77LpIYYO*DiExtI3)(6zobE$m!Cs zCBM15npT?PLFN+7fv}|4z3t%`+o|$P16H+HJEXMex_@6I)vqlzHP&>5n^2A9F8)#S zF}D%*_w=bPpw2&JP|wd|I+zg62(jp)=zh4hm=kQ+lh zB|-zZe8(B4_$DTY#CIsthCV~Kz&Zlm&#fk9dFUY{faDB+eOT>k(T)7q!w zV0vQ}+3lhH$IrtHS@eH-q+65eTwjkhwOezd!64q)d!joI$^A`U);wVrpJ+|IBwk1e zgh|`|qh45TijNp8>Ab?1ze%B@d&e4v-q?!=lcY->5RWb^(1YnM$vUiEo z9$Aw4&T>m<>rt_!%{>!&B=r7uE=}xcqLV#i!{}4NnqYCyl1@E~8kOfVqQ=eg`{y;I zZENJ|cDBsBOmHfnV~WLc8IMrvPC>4!dmdIMF3lXzi8L=VSG%)Q=K+~xAII)J>y<~y z$TjIxNYXeY090TR#zk|Q&VlxTZmiTS$Cr=$-u}j_r5Eu;#|w>({hddm+4lbcGnjI% z?SV`O9cj`jMkwl4)ZnQcijS>w?t04h@&a?lDZhtWal!VaBNU&JYs>)8;YvT9An(t; zbbc7{exu@Pcf>x;V5bt@$T;^4{p0khoa0SiMMe&8(IfD$h3>pjstb6_MQaus=HnR= zr?>k@u&-G2UYMzOt*=X8&SlCD9+Qf3qd1)AqS&w%9 zT`Bi>Ai9Cke(0|g6J6D5EstXjK~h(Ho>lQ~V!uLOtyKx$998o zhkSBv9RVPNUUy!W8LwoLI58LYjj*DMI@e8%1)yg>)S(F@Jt^4q9V*eAV1%LF+*Yc1 zi%<|OYaknOh6o8b>74!V#wP@PsOMS} z=bK6`XuChe>PC~T>z*QqOz|F}EN&n(s#-8bML8H4@5VFDc;>W|TllKxH*+1t7kfkF z?vUSm@Wy`%_Z#mNX!ia-hV_VL-6o>=~6R@_cFuM_b_H7l4KHuqDzD{aO{ zIIh}iZn8I#Rs>U(gFBPkx&TZkkaLR=xak=;dAx(T; zR|Sllmvic{^PFf#OX4|Zo5UU>wz##^bdM?srYmq{y7HW^56Rq&9PwQ2I=6`}ppM=x zYTYA=LMpSlAOV06%U+w|0X(*M(#(g>oylg#GT${zABns<3`r9Zr4%Vs3CPE8mD`8I z(bc41_KkW;D@A&vyIDkvr*tVry*#dE~_=Dvca zj_mL-%}Spt-EKJJlb)68-VK7`d^K)XMp+9T%E}7u{&nRsA(~+t46__!y=O*Sl<@tS zjDY(HIPYB;Eo9F#J-eeA>8tDa4DmbS3niKN&Gv-|!7-7Hn&q?zCzn~&+9SS5ZQ4#w zG6Clv{{ULn@m9H}ptFR?X1%qMS;T*Ia6<#{Q1}yUx`w4FJDIFlvlEwc92^{wy}{Iq%BSM~P>x#g7`obm5iIN8|xN;CGf)mZKM4>;}DG~oC-1CEry;DSX1 z>yK)Cnlwll9!C_{NT(Q(6(gg8Q8-{pPJ_026tT*#F!&tzrK8*|@9vOE6U5j*I{J=t zPq%exq95%5e@c<0nN!R}!V+@8=QRU9@)@z7ppK%mYTFyaP40Vz%*yb`KJXEg5Jw>K zSQE;tD>)c)*ejl*xlK35*EW`mX>)3~F)t$yRMnH>y*lDR(pud`&Q1t_@HM3=E~Yi$ z+S5~OF&PHJb{rGxDHyK&p+4E~RMS?_r1^%TvHGlt%17vEZC^%1{{SI4Tn>I!Z}6_@ zPCd^Gt{$p(<$rL^LrAvNP!}5{1A+x}cU~R4fsd9qk8X2a5%DIHtQIkKa8LIm+5GAD zdX28DJ6l`%kk5ivDeyeNJs5ZPshlZP+}4d;O%(KYIKie~6OSQ>xfm6tVc_jv_$vs~ z7@HqFhZWSrZ+aZ0c2i5-1R&B+;;T(1&AgFIEyA2Mai6*DTc_n-RwYiHtrUF@4y8KK z=4`v8{5{g_w#%ur-$}!HdD|HLy4P(C<@Tf~klV%ruGPYU=%TnSJK`3JyZ$CNx{`o? z>}6Shm_LPHpW;u4fd&-6Abr*HfEfJi%BfDY{w+^ll<31_yL+{c0;`3Leb7!otXqvi zUAChZW(Ndyt|s^5J(Q|MHaBh$Q0%G?^Q>7sdwRQ#t)09sPJGD;b{~fW^sLqntLR*@ zbi18?x*p;XS~6oph8;o8d0pfy1>BLQ0)lV>&MM9BxvFYJ{jU0FQ`G_5zmTl(0O?+a z8xJ}$eC*-GSB*xjg#$f$dQ;S4c<6m7KsJ(3y#V2T&32@5Nr%>hgU@PA^UW_KiWrg* z4z!@-=}FttgVKN|wzxKzP|iQ)n}#5F9sdAI^qo%CjCS$Bk}=p{cpQ&U&b-0L?#Vuw zuVu2muul%#-rR+fcx;wNjNA}dg#Pd0>swNvFP(+#y`|%OUq|L+XpuWgo4I8qe8#f% zXkB$^k&|IEFxol}wVMxzd{3%cwzV64vL7%3F4KePwLA@c^TlVW0`kUp$3J#lV;_O8 zg^7($SjAZ4h8OCwtvS2%Ee_wqt9NnY%_{EB)@!G>3p+%I=Gr(sp46T#&^0|e_TuXL z6t*{VJE{lXR5pD$tYc%-hU&+neAADBNi>}(sMmE=z zLw9*{n9XZSw5i_5E;j*77Of}#UvNzeHN?!$zv~<3&)(*>G!1RMJ99knMlKA| z7)r=?uRl&}BW^eyJ*Xpr?O7(%x!F<*tUa9diPcT<7hQP7a0^Ri#|0wE{LORM+ODIi z$>!eQO*`}jo2TW{s*#+7`O@H%j9^ogBU8_xzwd?h6iQ$`qb$vk&IJVTO88n?q?bb1n`6%|_%mQG$Dl zVO(-K9<<(RN=$KrwuRUmb*!p?hu6Mpp*UlX1y5`VieEqhs^_VvEt3>iy(BJAtpJ)& z@@d!|kLO8hQ$vBb*J7#WJkhslTlWDV5&k8Zmdbr-q%4uCLpP|2Ztle7a`hEP1AD4WR5Ru82QjN6a zb_DV>T-4p<&P;@{KUzu7_~WN2e6=fE5|%iZMmOB2<-8(6nMj1QLYcA8P5F z#|r5Jr zwU(YPA-G*dl3>cOki&N^p8ac&#VV4Il_W6eM+TfG;M+u3hqj80wntAcv8!tm8;d)3 zL{`QUOaOf{dHgEev1RmnB^v?#ar=dlCdwjMo5sF8%b8K9k zpG^8!6d0WCCmFzRQC@fUWhGbIwE4B`-*eHYj?u;qG_-c^ZTObv*HE^!ySI7Eu49oT zPy%`Zis!eVO1)z_wVBwWOB111N8}%WsH&Sk+5IcELfRuLm7Lw!v56*e8hqS$?N=3J zi3*{?JeMPu_WD$f64}OKUS#9UVbGsJ?N#%W_*SV~SGj|g_ShVjBxjN7QJkEfr{11< zKGeh3h6qFXQV!VbOP+B+IHWKfaypt(%>x~KP(8TqOk&`4ADsvEpn4iJ%>;;09C6J= zP^mq|PoJe2&jrIj(nflbN9(f#6hTwzwnoV65du%PJ#1kBW$Q<^n zq#T|q>Tz!|002nH^s1wSf+&gG?ZU zicm5}cpkK_?mI@sm?UOLEO-?xAk2vw$1-E--jD$lI3pS4Q~~y(+Hk?M!L4>k=WCg} z5A#+@UF3;Q_uSGBqbIj&iN?~==ae|ltu(RO$;Q!v#SBRYJpTY%hW9i`Zb-nRC#R(@ z316i&($uwJ%^9MAKMGf6Sp_PLupabd9cl3a=B{`Hl0`MSGI|fWCvuEndivBgB*!i? za(_yU0pG0>+)?;I4ELbpx93Vu1_dW3lNt(6w6p*X1402yj(DZucBJV}#I`PYq&;Y& zfuN<1M~X#~He``VD(Y}Srs9^QeJpiR_}cPa8tTIF5$-0B%S*66U=B08{A-^PtV3xT zZ?0;n>O1>XvA-T$45>V0wQ8i^=QLDQ%1Nzb^cN#KFjqdXp!EVzgV6zl;>f!cx8 z)Qom8Fey9x(t*x9&Ep5xY=oDc9d zDBOnw<`mKqvQ*>RpwT|!C{npR=A1%-fIm8ql;EB-pJPt@!;UdX8Wo(C3!Vq*QLo)$ z^q_(>j(tS~?vdV(rA1jW4spdRbR6c8`U+Rzfu59#uyKrg(qozd;8BtIP$VueJ?S&g z6mmv;deAYRdQb>l6VFmR)UbjHC(@(O860s|BN(JX68s9CPVLI`R2ZNF11ecf}Z|d-px*4lz!_ai_1nC%2_Ij{cOG z6bwpEl&6XZwE%>ol=b!Yq|G6w6rhp$^`y^!l&3vup%b5;E#rc{N2sRah+7Yn)1^Df ze^FMoGkOze0A%}8jzPsjt<+P-bLsV}xeW`94`EQAy!QMmbJGW!iGU;16qrP4^_TYEXEf{!|J8Qb{@g06C@Wp2nIv z??!o`L!@FYHva&5xzBoI0grlgtD9)>c`b?#H)F4Ab{|2Q!1_`$hT#5{CI{h7$NBZ7 zG{}fx2*^BlrsM(v7&R$gIO|QoBLrjXQDV~>xMLXU+)xx1JRF164wUl_K`PiiaB3jz zgy7@12dyWjoZh8e5C&+$$ju#k z1>;Yo}S@TYOpy(Tb4A%Gu; zdO$kT^v-DO?Lb^gObT{6{4+>$Xc`ib4nLhO1aX=GP)d(LYH>5;?uvkqlw*o+?{h+J z39FU?Ij4@b3b!B1rs>C}Tv?ou{&7rkk!t&x8McTHdC8N*N> zJe+a#rW4OUkfh2;I{j!X(;k$7`W`9cJkWuNrw0Qfm;m#}?nXYfE`1Lt)}lfU!gIz* z$f;;+t%PBc%!1~iSQUpj24{m)$PaiAq(j=xG^AQ9YDjrSU&$2FT)HIAs4 zueB(~I?{F&qNy?%qmT36fO+PV(u!ayG?~fv^rbYQ40NOd1MlyeGwIfk;G?sBDS)$| z-bWv7XX#0d_r*S6`1@b?X$Re)OJqjmuQ=kP1m}*F`8!lYsi3yBey)%hpDDP%*QG)Gug5%Paf7i+Mrmx;Ku3H_SPtKB# z#+UqP00-KT)0eF```=0d4@4~@4y2LCtv=x9LVZmvKkGsFrc2b-Er{Lv4DHvENP2pA zr9Ej6-l;7OG^ElFf|Y3uQU-sm0~}z|AG=CB{U{K6deO&Fe+mz3Lregkv}62=4_X$0 k6dDNcMKAGC0v Date: Tue, 21 Mar 2023 18:10:37 +0900 Subject: [PATCH 125/782] Fix frontend docker entrypoint umbrel LND detection --- docker/frontend/entrypoint.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker/frontend/entrypoint.sh b/docker/frontend/entrypoint.sh index 1721bcad5..a913bedf5 100644 --- a/docker/frontend/entrypoint.sh +++ b/docker/frontend/entrypoint.sh @@ -10,7 +10,9 @@ cp /etc/nginx/nginx.conf /patch/nginx.conf sed -i "s/__MEMPOOL_FRONTEND_HTTP_PORT__/${__MEMPOOL_FRONTEND_HTTP_PORT__}/g" /patch/nginx.conf cat /patch/nginx.conf > /etc/nginx/nginx.conf -[ "${APP_LIGHTNING_NODE_PORT}" = "9735" ] && LIGHTNING=true +if [ "${LIGHTNING_DETECTED_PORT}" = "9735" ];then + export LIGHTNING=true +fi # Runtime overrides - read env vars defined in docker compose From 1a6048f0ab43b13a90ff13f97982cef5885742b6 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 21:25:37 +0900 Subject: [PATCH 126/782] Difficulty mining css updates --- .../difficulty-mining/difficulty-mining.component.scss | 1 + .../src/app/components/difficulty/difficulty.component.scss | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss index cf031bebc..69e2892ee 100644 --- a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.scss @@ -156,4 +156,5 @@ .symbol { font-size: 13px; + white-space: nowrap; } \ No newline at end of file diff --git a/frontend/src/app/components/difficulty/difficulty.component.scss b/frontend/src/app/components/difficulty/difficulty.component.scss index 00085a49c..7b585580c 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.scss +++ b/frontend/src/app/components/difficulty/difficulty.component.scss @@ -30,7 +30,7 @@ } } .card-text { - font-size: 20px; + font-size: 18px; margin: auto; position: relative; } @@ -160,6 +160,7 @@ .symbol { font-size: 13px; + white-space: nowrap; } .epoch-progress { From 75303c7a34543d750a70aa61a43930fa2e7bdc53 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 21 Mar 2023 21:50:46 +0900 Subject: [PATCH 127/782] docker: Minor tweak to frontend entrypoint LND detection --- docker/frontend/entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/frontend/entrypoint.sh b/docker/frontend/entrypoint.sh index a913bedf5..b6946578b 100644 --- a/docker/frontend/entrypoint.sh +++ b/docker/frontend/entrypoint.sh @@ -10,7 +10,7 @@ cp /etc/nginx/nginx.conf /patch/nginx.conf sed -i "s/__MEMPOOL_FRONTEND_HTTP_PORT__/${__MEMPOOL_FRONTEND_HTTP_PORT__}/g" /patch/nginx.conf cat /patch/nginx.conf > /etc/nginx/nginx.conf -if [ "${LIGHTNING_DETECTED_PORT}" = "9735" ];then +if [ "${LIGHTNING_DETECTED_PORT}" != "" ];then export LIGHTNING=true fi From 63f7709e82b867bca888fbd1fd6a5cc799175662 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 22:20:14 +0900 Subject: [PATCH 128/782] Restoring size of current change --- .../src/app/components/difficulty/difficulty.component.html | 2 +- .../src/app/components/difficulty/difficulty.component.scss | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/difficulty/difficulty.component.html b/frontend/src/app/components/difficulty/difficulty.component.html index b65092331..674367c7a 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.html +++ b/frontend/src/app/components/difficulty/difficulty.component.html @@ -42,7 +42,7 @@

    -
    +
    diff --git a/frontend/src/app/components/difficulty/difficulty.component.scss b/frontend/src/app/components/difficulty/difficulty.component.scss index 7b585580c..3c41855bb 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.scss +++ b/frontend/src/app/components/difficulty/difficulty.component.scss @@ -33,6 +33,9 @@ font-size: 18px; margin: auto; position: relative; + &.bigger { + font-size: 20px; + } } } From 2c16bbb0e90cba788bd0dabc8c980d12dc5133d1 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 22:26:18 +0900 Subject: [PATCH 129/782] Fixing sub text height --- .../src/app/components/difficulty/difficulty.component.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/app/components/difficulty/difficulty.component.scss b/frontend/src/app/components/difficulty/difficulty.component.scss index 3c41855bb..1da1591d0 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.scss +++ b/frontend/src/app/components/difficulty/difficulty.component.scss @@ -33,8 +33,10 @@ font-size: 18px; margin: auto; position: relative; + margin-bottom: 0.2rem; &.bigger { font-size: 20px; + margin-bottom: 0; } } } From 672f71c5154e0ef8073bab584bde87623ee10d1b Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 22:48:40 +0900 Subject: [PATCH 130/782] Removing "d" from node fee chart loading --- .../app/lightning/node-fee-chart/node-fee-chart.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.html b/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.html index c8f674f11..468b22acf 100644 --- a/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.html +++ b/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.html @@ -2,6 +2,6 @@

    Fee distribution

    -
    d +
    From a2e23014f430d4a4e3a2e7f049b6c3ffdd4f7dd1 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 23:14:45 +0900 Subject: [PATCH 131/782] Update channels map indexing indicator --- .../node-statistics-chart.component.ts | 2 +- .../nodes-channels-map/nodes-channels-map.component.ts | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts index 7518b33da..4416ae297 100644 --- a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts +++ b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts @@ -81,7 +81,7 @@ export class NodeStatisticsChartComponent implements OnInit { color: 'grey', fontSize: 15 }, - text: `Loading`, + text: $localize`No data to display yet. Try again later.`, left: 'center', top: 'center' }; diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts index 05e35b6af..3899bb673 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts @@ -206,20 +206,13 @@ export class NodesChannelsMap implements OnInit { prepareChartOptions(nodes, channels) { let title: object; if (channels.length === 0 && !this.placeholder) { - this.chartOptions = null; - this.showIndexingInProgress = true; this.isLoading = false; - return; - } - - // empty map fallback - if (channels.length === 0 && this.placeholder) { title = { textStyle: { color: 'white', fontSize: 18 }, - text: $localize`No geolocation data available`, + text: $localize`No data to display yet. Try again later.`, left: 'center', top: 'center' }; From bf5821c8c8512c1d1dcd25dcf5b22579f6085748 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 21 Mar 2023 23:17:09 +0900 Subject: [PATCH 132/782] Remove indexing indicator --- .../nodes-channels-map/nodes-channels-map.component.html | 3 --- .../nodes-channels-map/nodes-channels-map.component.ts | 1 - 2 files changed, 4 deletions(-) diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html index 54868fbe6..b262f58fd 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.html @@ -18,8 +18,5 @@
    -
    - Indexing in progress -
    \ No newline at end of file diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts index 3899bb673..5fce18c4e 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts @@ -36,7 +36,6 @@ export class NodesChannelsMap implements OnInit { channelCurve = 0; nodeSize = 4; isLoading = false; - showIndexingInProgress = false; chartInstance = undefined; chartOptions: EChartsOption = {}; From 77835bcb9d1d643f70004a4da738a7551fcebae6 Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 22 Mar 2023 13:20:22 +0900 Subject: [PATCH 133/782] Restoring Preview component behavior --- .../nodes-channels-map.component.ts | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts index 5fce18c4e..bf4117b30 100644 --- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts +++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts @@ -204,19 +204,33 @@ export class NodesChannelsMap implements OnInit { prepareChartOptions(nodes, channels) { let title: object; - if (channels.length === 0 && !this.placeholder) { - this.isLoading = false; - title = { - textStyle: { - color: 'white', - fontSize: 18 - }, - text: $localize`No data to display yet. Try again later.`, - left: 'center', - top: 'center' - }; - this.zoom = 1.5; - this.center = [0, 20]; + if (channels.length === 0) { + if (!this.placeholder) { + this.isLoading = false; + title = { + textStyle: { + color: 'white', + fontSize: 18 + }, + text: $localize`No data to display yet. Try again later.`, + left: 'center', + top: 'center' + }; + this.zoom = 1.5; + this.center = [0, 20]; + } else { // used for Node and Channel preview components + title = { + textStyle: { + color: 'white', + fontSize: 18 + }, + text: $localize`No geolocation data available`, + left: 'center', + top: 'center' + }; + this.zoom = 1.5; + this.center = [0, 20]; + } } this.chartOptions = { From f8bd062aa2fba89b70ccccfb8b73e783f9ca41c7 Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 22 Mar 2023 13:35:16 +0900 Subject: [PATCH 134/782] Pull from transifex --- frontend/src/locale/messages.da.xlf | 6 +- frontend/src/locale/messages.fi.xlf | 15 +++ frontend/src/locale/messages.fr.xlf | 2 +- frontend/src/locale/messages.he.xlf | 8 ++ frontend/src/locale/messages.hu.xlf | 55 +++++++++ frontend/src/locale/messages.lt.xlf | 73 +++++++----- frontend/src/locale/messages.nb.xlf | 87 +++++++++------ frontend/src/locale/messages.ro.xlf | 23 +++- frontend/src/locale/messages.ru.xlf | 10 +- frontend/src/locale/messages.th.xlf | 167 ++++++++++++++++++++++++++++ frontend/src/locale/messages.tr.xlf | 18 ++- frontend/src/locale/messages.vi.xlf | 35 +++--- 12 files changed, 404 insertions(+), 95 deletions(-) diff --git a/frontend/src/locale/messages.da.xlf b/frontend/src/locale/messages.da.xlf index 57f4c2cf4..9ce1ff153 100644 --- a/frontend/src/locale/messages.da.xlf +++ b/frontend/src/locale/messages.da.xlf @@ -4506,7 +4506,7 @@ ago - siden + siden src/app/components/time/time.component.ts 103 @@ -5055,7 +5055,7 @@ remaining - tilbage + tilbage src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -6901,7 +6901,7 @@ BTC - BTC + BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 159,157 diff --git a/frontend/src/locale/messages.fi.xlf b/frontend/src/locale/messages.fi.xlf index 438fdde54..81a2b478b 100644 --- a/frontend/src/locale/messages.fi.xlf +++ b/frontend/src/locale/messages.fi.xlf @@ -3203,6 +3203,7 @@ blocks expected + lohkoa odotetaan src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + odotettu lohko src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + lohkoa louhittu src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + louhittu lohko src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + lohkoa jäljellä src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + lohko jäljellä src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + lohkoa edellä src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + lohko edellä src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + lohkoa jäljessä src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + lohko jäljessä src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + Keskimääräinen lohkoaika src/app/components/difficulty/difficulty.component.html 42,45 @@ -3984,6 +3995,7 @@ blocks + lohkoa src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4003,6 +4015,7 @@ Other () + Muut () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4565,6 +4578,7 @@ In ~ + ~ src/app/components/time/time.component.ts 126 @@ -6761,6 +6775,7 @@ nodes + solmua src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 diff --git a/frontend/src/locale/messages.fr.xlf b/frontend/src/locale/messages.fr.xlf index 4322b5be3..c82fa0ee3 100644 --- a/frontend/src/locale/messages.fr.xlf +++ b/frontend/src/locale/messages.fr.xlf @@ -5067,7 +5067,7 @@ remaining - restantes + restantes src/app/components/transactions-list/transactions-list.component.html 332,333 diff --git a/frontend/src/locale/messages.he.xlf b/frontend/src/locale/messages.he.xlf index a7e3962da..4bf343f8e 100644 --- a/frontend/src/locale/messages.he.xlf +++ b/frontend/src/locale/messages.he.xlf @@ -3203,6 +3203,7 @@ blocks expected + בלוקים צפויים src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + בלוק צפוי src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + בלוקים נכרו src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + בלוק נכרה src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + בלוקים נותרו src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + בלוק נותר src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + בלוקים קדימה src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + בלוק קדימה src/app/components/difficulty/difficulty-tooltip.component.html 30 diff --git a/frontend/src/locale/messages.hu.xlf b/frontend/src/locale/messages.hu.xlf index 9b07c7917..169e47008 100644 --- a/frontend/src/locale/messages.hu.xlf +++ b/frontend/src/locale/messages.hu.xlf @@ -1449,6 +1449,7 @@ Our mempool and blockchain explorer for the Bitcoin community, focusing on the transaction fee market and multi-layer ecosystem, completely self-hosted without any trusted third-parties. + Mempoolunk és blokklánc-felfedezőnk a Bitcoin közösség számára, a tranzakciós díjak piacára és a többrétegű ökoszisztémára összpontosítva, teljesen önállóan, megbízható harmadik felek nélkül. src/app/components/about/about.component.html 13,16 @@ -1649,6 +1650,7 @@ There many transactions on this address, more than your backend can handle. See more on setting up a stronger backend. Consider viewing this address on the official Mempool website instead: + Sok tranzakció van ezen a címen, többet, mint amennyit a háttérrendszere képes kezelni. További információ az erősebb háttérrendszer beállításáról. Fontolja meg ennek a címnek a megtekintését a hivatalos Mempool webhelyen: src/app/components/address/address.component.html 134,137 @@ -3111,6 +3113,7 @@ blocks + blokkok src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 @@ -3135,6 +3138,7 @@ block + blokk src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 @@ -3231,6 +3235,7 @@ blocks remaining + blokk hátramaradt src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3239,6 +3244,7 @@ block remaining + blokk hátramaradt src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3247,6 +3253,7 @@ blocks ahead + blokkal előrébb src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3255,6 +3262,7 @@ block ahead + blokkal előrébb src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3263,6 +3271,7 @@ blocks behind + blokkal lemaradva src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3271,6 +3280,7 @@ block behind + blokkal lemaradva src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3279,6 +3289,7 @@ Average block time + Átlagos blokk idő src/app/components/difficulty/difficulty.component.html 42,45 @@ -3287,6 +3298,7 @@ Either 2x the minimum, or the Low Priority rate (whichever is lower) + Vagy a minimum 2x-e, vagy az alacsony prioritási arány (amelyik alacsonyabb) src/app/components/fees-box/fees-box.component.html 4,7 @@ -3330,6 +3342,7 @@ Usually places your transaction in between the first and second mempool blocks + Ez tranzakciót általában az első és a második mempoolblokk közé helyezi src/app/components/fees-box/fees-box.component.html 9,10 @@ -3646,6 +3659,7 @@ Pools Historical Dominance + Történelmi Pool Fölény src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.ts 64 @@ -3660,6 +3674,7 @@ Indexing pools hashrate + Indexelő poolok hashrátája src/app/components/indexing-progress/indexing-progress.component.html 3 @@ -3821,6 +3836,7 @@ Pools luck (1 week) + Pool szerencse (1 hét) src/app/components/pool-ranking/pool-ranking.component.html 9 @@ -3838,6 +3854,7 @@ The overall luck of all mining pools over the past week. A luck bigger than 100% means the average block time for the current epoch is less than 10 minutes. + Ez az összes bányászati mempool általános szerencséje az elmúlt héten. A 100%-ál nagyobb szerencse azt jelenti, hogy az átlagos blokkidő az aktuális korszakban kevesebb mint 10 perc. src/app/components/pool-ranking/pool-ranking.component.html 11,15 @@ -3846,6 +3863,7 @@ Pools count (1w) + Pool szám (1w) src/app/components/pool-ranking/pool-ranking.component.html 17 @@ -3944,6 +3962,7 @@ Pools Luck (1w) + Pool Szerencse (1w) src/app/components/pool-ranking/pool-ranking.component.html 146,148 @@ -3952,6 +3971,7 @@ Pools Count (1w) + Pool Szám (1w) src/app/components/pool-ranking/pool-ranking.component.html 158,160 @@ -3968,6 +3988,7 @@ blocks + blokkok src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3987,6 +4008,7 @@ Other () + Egyéb () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4082,6 +4104,7 @@ Hashrate (24h) + Hashráta (24h) src/app/components/pool/pool.component.html 91,93 @@ -4165,6 +4188,7 @@ Mined blocks + Bányászott blokkok src/app/components/pool/pool.component.html 141,143 @@ -4224,6 +4248,7 @@ Transaction hex + Tranzakciós hex src/app/components/push-transaction/push-transaction.component.html 6 @@ -4261,6 +4286,7 @@ Avg Block Fees + Átlag Blokk Díjjak src/app/components/reward-stats/reward-stats.component.html 17 @@ -4291,6 +4317,7 @@ Avg Tx Fee + Átlag Tx Díj src/app/components/reward-stats/reward-stats.component.html 30 @@ -4303,6 +4330,7 @@ Fee paid on average for each transaction in the past 144 blocks + Átlagosan fizetett díj minden tranzakció után az elmúlt 144 blokkban src/app/components/reward-stats/reward-stats.component.html 31,32 @@ -4334,6 +4362,7 @@ Explore the full Bitcoin ecosystem + Fedezze fel a teljes Bitcoin ökoszisztémát src/app/components/search-form/search-form.component.html 4,5 @@ -4351,6 +4380,7 @@ Bitcoin Block Height + Bitcoin Blokk Magasság src/app/components/search-form/search-results/search-results.component.html 3 @@ -4359,6 +4389,7 @@ Bitcoin Transaction + Bitcoin Tranzakció src/app/components/search-form/search-results/search-results.component.html 9 @@ -4367,6 +4398,7 @@ Bitcoin Address + Bitcoin Cím src/app/components/search-form/search-results/search-results.component.html 15 @@ -4375,6 +4407,7 @@ Bitcoin Block + Bitcoin Blokk src/app/components/search-form/search-results/search-results.component.html 21 @@ -4383,6 +4416,7 @@ Bitcoin Addresses + Bitcoin Cím src/app/components/search-form/search-results/search-results.component.html 27 @@ -4391,6 +4425,7 @@ Lightning Nodes + Villám Nodeok src/app/components/search-form/search-results/search-results.component.html 35 @@ -4399,6 +4434,7 @@ Lightning Channels + Villám Csatornák src/app/components/search-form/search-results/search-results.component.html 43 @@ -4407,6 +4443,7 @@ Go to "" + Ide menny &quot;&quot; src/app/components/search-form/search-results/search-results.component.html 52 @@ -4532,6 +4569,7 @@ In ~ + ~ belül src/app/components/time/time.component.ts 126 @@ -4661,6 +4699,7 @@ This transaction replaced: + Ezt a tranzakció ezt cserélte: src/app/components/transaction/transaction.component.html 10,12 @@ -5163,6 +5202,7 @@ This transaction does not use Taproot + Ez a tranzakció nem használja a Taproot-ot src/app/components/tx-features/tx-features.component.html 18 @@ -6446,6 +6486,7 @@ Average channel size + Átlag csatorna méret src/app/lightning/node/node.component.html 43,46 @@ -6454,6 +6495,7 @@ Avg channel distance + Átlag csatorna távolság src/app/lightning/node/node.component.html 59,60 @@ -6484,6 +6526,7 @@ Exclusively on Tor + Exkluzívan a Tor-on src/app/lightning/node/node.component.html 96,98 @@ -6500,6 +6543,7 @@ Lease fee rate + Lízing díj ráta src/app/lightning/node/node.component.html 147,150 @@ -6509,6 +6553,7 @@ Lease base fee + Lízing alapdíj src/app/lightning/node/node.component.html 155,157 @@ -6525,6 +6570,7 @@ Channel fee rate + Csatorna díj ráta src/app/lightning/node/node.component.html 171,174 @@ -6543,6 +6589,7 @@ Compact lease + Kompakt lízing src/app/lightning/node/node.component.html 191,193 @@ -6586,6 +6633,7 @@ (Tor nodes excluded) + (Tor nódok kiszűrve) src/app/lightning/nodes-channels-map/nodes-channels-map.component.html 8,11 @@ -6606,6 +6654,7 @@ Lightning Nodes Channels World Map + Villám Nódok Csatorna Világtérképe src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 69 @@ -6642,6 +6691,7 @@ Clearnet and Darknet + Clearnet és Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6653,6 +6703,7 @@ Clearnet Only (IPv4, IPv6) + Csakis Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6664,6 +6715,7 @@ Darknet Only (Tor, I2P, cjdns) + Csak Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6688,6 +6740,7 @@ nodes + nodeok src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -6715,6 +6768,7 @@ Lightning nodes in + Villámnodeok itt src/app/lightning/nodes-per-country/nodes-per-country.component.html 3,4 @@ -6900,6 +6954,7 @@ Top 100 oldest lightning nodes + 100 legrégebbi lightning nodeok src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.html 3,7 diff --git a/frontend/src/locale/messages.lt.xlf b/frontend/src/locale/messages.lt.xlf index d10094194..bee201d16 100644 --- a/frontend/src/locale/messages.lt.xlf +++ b/frontend/src/locale/messages.lt.xlf @@ -348,7 +348,7 @@ transaction - sandoris + sandoris src/app/bisq/bisq-address/bisq-address.component.html 48 @@ -373,7 +373,7 @@ transactions - sandoriai + sandoriai src/app/bisq/bisq-address/bisq-address.component.html 49 @@ -487,7 +487,7 @@ Block : - Blokas : + Blokas : src/app/bisq/bisq-block/bisq-block.component.ts 89 @@ -1109,7 +1109,7 @@ confirmation - patvirtinimas + patvirtinimas src/app/bisq/bisq-transaction/bisq-transaction.component.html 20,21 @@ -1131,7 +1131,7 @@ confirmations - patvirtinimai + patvirtinimai src/app/bisq/bisq-transaction/bisq-transaction.component.html 21,22 @@ -1764,7 +1764,7 @@ of   - + src/app/components/asset/asset.component.html 78 @@ -2616,7 +2616,7 @@ Block : - Blokas : + Blokas : src/app/components/block/block-preview.component.ts 98 @@ -3113,7 +3113,7 @@ blocks - blokai + blokai src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 @@ -3138,7 +3138,7 @@ block - blokas + blokas src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 @@ -3203,6 +3203,7 @@ blocks expected + Tikimasi blokų src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + Tikimasi bloko src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + Rasti blokai src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + Rastas blokas src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + Liko blokai src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + Liko blokas src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + blokai priekyje src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + blokas priekyje src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + blokai už src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + blokas už src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + Vidutinis bloko laikas src/app/components/difficulty/difficulty.component.html 42,45 @@ -3984,6 +3995,7 @@ blocks + blokai src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4003,6 +4015,7 @@ Other () + Kita () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4505,7 +4518,7 @@ ago - Prieš + Prieš src/app/components/time/time.component.ts 103 @@ -4565,6 +4578,7 @@ In ~ + Už ~ src/app/components/time/time.component.ts 126 @@ -5277,7 +5291,7 @@ Overpaid x - Permokėta x + Permokėta x src/app/components/tx-fee-rating/tx-fee-rating.component.html 2 @@ -5348,7 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. - mempool.space teikia duomenis apie Bitkoino tinklą. Projektas negali padėti atgauti prarastų lėšų, greičiau patvirtinti operaciją ir pan. + mempool.space teikia duomenis apie Bitkoino tinklą. Projektas negali padėti atgauti prarastų lėšų, greičiau patvirtinti operaciją ir pan. src/app/docs/api-docs/api-docs.component.html 13 @@ -5564,7 +5578,7 @@ channels - kanalai + kanalai src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -6761,6 +6775,7 @@ nodes + mazgai src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -6780,7 +6795,7 @@ BTC capacity - BTC talpumas + BTC talpumas src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 105,103 @@ -6898,7 +6913,7 @@ BTC - BTC + BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 159,157 @@ -7023,7 +7038,7 @@ year - metai + metai src/app/shared/i18n/dates.ts 3 @@ -7031,7 +7046,7 @@ years - metai + metai src/app/shared/i18n/dates.ts 4 @@ -7039,7 +7054,7 @@ month - mėn + mėn src/app/shared/i18n/dates.ts 5 @@ -7047,7 +7062,7 @@ months - mėn + mėn src/app/shared/i18n/dates.ts 6 @@ -7055,7 +7070,7 @@ week - sav + sav src/app/shared/i18n/dates.ts 7 @@ -7063,7 +7078,7 @@ weeks - sav + sav src/app/shared/i18n/dates.ts 8 @@ -7071,7 +7086,7 @@ day - diena + diena src/app/shared/i18n/dates.ts 9 @@ -7079,7 +7094,7 @@ days - dienos + dienų src/app/shared/i18n/dates.ts 10 @@ -7087,7 +7102,7 @@ hour - val + val src/app/shared/i18n/dates.ts 11 @@ -7095,7 +7110,7 @@ hours - val + val src/app/shared/i18n/dates.ts 12 @@ -7103,7 +7118,7 @@ minute - min + min src/app/shared/i18n/dates.ts 13 @@ -7111,7 +7126,7 @@ minutes - min + min src/app/shared/i18n/dates.ts 14 @@ -7119,7 +7134,7 @@ second - sek + sek src/app/shared/i18n/dates.ts 15 @@ -7127,7 +7142,7 @@ seconds - sek + sek src/app/shared/i18n/dates.ts 16 diff --git a/frontend/src/locale/messages.nb.xlf b/frontend/src/locale/messages.nb.xlf index d4fdbce21..b47fe1ec3 100644 --- a/frontend/src/locale/messages.nb.xlf +++ b/frontend/src/locale/messages.nb.xlf @@ -348,7 +348,7 @@ transaction - transaksjon + transaksjon src/app/bisq/bisq-address/bisq-address.component.html 48 @@ -373,7 +373,7 @@ transactions - transaksjoner + transaksjoner src/app/bisq/bisq-address/bisq-address.component.html 49 @@ -487,7 +487,7 @@ Block : - Blokk : + Blokk : src/app/bisq/bisq-block/bisq-block.component.ts 89 @@ -842,7 +842,7 @@ Amount () - Beløp ( ) + Beløp () src/app/bisq/bisq-market/bisq-market.component.html 112,113 @@ -1109,7 +1109,7 @@ confirmation - bekreftelse + bekreftelse src/app/bisq/bisq-transaction/bisq-transaction.component.html 20,21 @@ -1131,7 +1131,7 @@ confirmations - bekreftelser + bekreftelser src/app/bisq/bisq-transaction/bisq-transaction.component.html 21,22 @@ -2616,7 +2616,7 @@ Block : - Blokk : + Blokk : src/app/components/block/block-preview.component.ts 98 @@ -3203,6 +3203,7 @@ blocks expected + blokker forventet src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + blokk forventet src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + blokker utvunnet src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + blokk utvunnet src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + blokker gjenstår src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + blokk gjenstår src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + blokker foran src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + blokk foran src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + blokker bak src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + blokk bak src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + Gjennomsnittlig blokktid src/app/components/difficulty/difficulty.component.html 42,45 @@ -3984,6 +3995,7 @@ blocks + blokker src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4003,6 +4015,7 @@ Other () + Annet () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4505,7 +4518,7 @@ ago - siden + siden src/app/components/time/time.component.ts 103 @@ -4565,6 +4578,7 @@ In ~ + Om ~ src/app/components/time/time.component.ts 126 @@ -5053,7 +5067,7 @@ remaining - gjenstår + gjenstår src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -5106,7 +5120,7 @@ This transaction saved % on fees by using native SegWit - Denne transaksjonen sparte % på avgifter ved å bruke native SegWit + Denne transaksjonen sparte % på avgifter ved å bruke native SegWit src/app/components/tx-features/tx-features.component.html 2 @@ -5133,7 +5147,7 @@ This transaction saved % on fees by using SegWit and could save % more by fully upgrading to native SegWit - Denne transaksjonen sparte % på avgifter ved å bruke SegWit og kunne spart % mer ved å fullstendig oppgradere til native SegWit + Denne transaksjonen sparte % på avgifter ved å bruke SegWit og kunne spart % mer ved å fullstendig oppgradere til native SegWit src/app/components/tx-features/tx-features.component.html 4 @@ -5142,7 +5156,7 @@ This transaction could save % on fees by upgrading to native SegWit or % by upgrading to SegWit-P2SH - Denne transaksjonen kan spare % på avgifter ved å oppgradere til native SegWit eller % ved å oppgradere til SegWit-P2SH + Denne transaksjonen kan spare % på avgifter ved å oppgradere til native SegWit eller % ved å oppgradere til SegWit-P2SH src/app/components/tx-features/tx-features.component.html 6 @@ -5151,7 +5165,7 @@ This transaction uses Taproot and thereby saved at least % on fees - Denne transaksjonen bruker Taproot og sparer dermed minst % på avgifter + Denne transaksjonen bruker Taproot og sparer dermed minst % på avgifter src/app/components/tx-features/tx-features.component.html 12 @@ -5186,7 +5200,7 @@ This transaction uses Taproot and already saved at least % on fees, but could save an additional % by fully using Taproot - Denne transaksjonen bruker Taproot og har allerede spart minst % på avgifter, men kan spare ytterligere % ved å bruke Taproot fullt ut + Denne transaksjonen bruker Taproot og har allerede spart minst % på avgifter, men kan spare ytterligere % ved å bruke Taproot fullt ut src/app/components/tx-features/tx-features.component.html 14 @@ -5195,7 +5209,7 @@ This transaction could save % on fees by using Taproot - Denne transaksjonen kunne spart % på avgifter ved å bruke Taproot + Denne transaksjonen kunne spart % på avgifter ved å bruke Taproot src/app/components/tx-features/tx-features.component.html 16 @@ -5264,7 +5278,7 @@ Only ~ sat/vB was needed to get into this block - Bare ~ sat/vB var nødvendig for å komme inn i denne blokken + Bare ~ sat/vB var nødvendig for å komme inn i denne blokken src/app/components/tx-fee-rating/tx-fee-rating.component.html 2 @@ -5277,7 +5291,7 @@ Overpaid x - Overbetalt x + Overbetalt x src/app/components/tx-fee-rating/tx-fee-rating.component.html 2 @@ -5348,7 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. - mempool.space gir bare data om Bitcoin-nettverket. Den kan ikke hjelpe deg med å hente verdier, bekrefte transaksjonen raskere osv. + mempool.space gir bare data om Bitcoin-nettverket. Den kan ikke hjelpe deg med å hente verdier, bekrefte transaksjonen raskere osv. src/app/docs/api-docs/api-docs.component.html 13 @@ -5564,7 +5578,7 @@ channels - kanaler + kanaler src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -6761,6 +6775,7 @@ nodes + noder src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -6780,7 +6795,7 @@ BTC capacity - BTC-kapasitet + BTC-kapasitet src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 105,103 @@ -6898,7 +6913,7 @@ BTC - BTC + BTC src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.ts 159,157 @@ -6941,7 +6956,7 @@ Lightning nodes on ISP: [AS] - Lightning-noder på ISP: [AS ] + Lightning-noder på ISP: [AS ] src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts 44 @@ -7023,7 +7038,7 @@ year - år + år src/app/shared/i18n/dates.ts 3 @@ -7031,7 +7046,7 @@ years - år + år src/app/shared/i18n/dates.ts 4 @@ -7039,7 +7054,7 @@ month - måned + måned src/app/shared/i18n/dates.ts 5 @@ -7047,7 +7062,7 @@ months - måneder + måneder src/app/shared/i18n/dates.ts 6 @@ -7055,7 +7070,7 @@ week - uke + uke src/app/shared/i18n/dates.ts 7 @@ -7063,7 +7078,7 @@ weeks - uker + uker src/app/shared/i18n/dates.ts 8 @@ -7071,7 +7086,7 @@ day - dag + dag src/app/shared/i18n/dates.ts 9 @@ -7079,7 +7094,7 @@ days - dager + dager src/app/shared/i18n/dates.ts 10 @@ -7087,7 +7102,7 @@ hour - time + time src/app/shared/i18n/dates.ts 11 @@ -7095,7 +7110,7 @@ hours - timer + timer src/app/shared/i18n/dates.ts 12 @@ -7103,7 +7118,7 @@ minute - minutt + minutt src/app/shared/i18n/dates.ts 13 @@ -7111,7 +7126,7 @@ minutes - minutter + minutter src/app/shared/i18n/dates.ts 14 @@ -7119,7 +7134,7 @@ second - sekund + sekund src/app/shared/i18n/dates.ts 15 @@ -7127,7 +7142,7 @@ seconds - sekunder + sekunder src/app/shared/i18n/dates.ts 16 diff --git a/frontend/src/locale/messages.ro.xlf b/frontend/src/locale/messages.ro.xlf index 2dfca47ad..ae418a6ca 100644 --- a/frontend/src/locale/messages.ro.xlf +++ b/frontend/src/locale/messages.ro.xlf @@ -991,7 +991,7 @@ Amount - Cantitatea + Cantitate src/app/bisq/bisq-trades/bisq-trades.component.html 9,12 @@ -3203,6 +3203,7 @@ blocks expected + blocuri așteptate src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + bloc așteptat src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + blocuri minate src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + bloc minat src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + blocuri rămase src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + bloc rămas src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + blocuri înainte src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + bloc înainte src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + blocuri în urmă src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + bloc în urmă src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + Timpul mediu al blocurilor src/app/components/difficulty/difficulty.component.html 42,45 @@ -3984,6 +3995,7 @@ blocks + blocuri src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4003,6 +4015,7 @@ Other () + Altele () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -5349,7 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. - mempool.space oferă doar date despre rețeaua Bitcoin. Nu vă poate ajuta să recuperați fonduri, să confirmați tranzacția mai rapid etc. + mempool.space oferă doar date despre rețeaua Bitcoin. Nu vă poate ajuta să recuperați fonduri, să confirmați tranzacția mai rapid etc. src/app/docs/api-docs/api-docs.component.html 13 @@ -6713,6 +6726,7 @@ Clearnet and Darknet + Clearnet și Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6724,6 +6738,7 @@ Clearnet Only (IPv4, IPv6) + Numai Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6735,6 +6750,7 @@ Darknet Only (Tor, I2P, cjdns) + Numai Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6746,7 +6762,7 @@ Share - Partajează + Parte src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.html 29,31 @@ -6759,6 +6775,7 @@ nodes + noduri src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 diff --git a/frontend/src/locale/messages.ru.xlf b/frontend/src/locale/messages.ru.xlf index 490b42bd9..07f843967 100644 --- a/frontend/src/locale/messages.ru.xlf +++ b/frontend/src/locale/messages.ru.xlf @@ -5757,7 +5757,7 @@ ppm - частей на миллион + ppm src/app/lightning/channel/channel-preview.component.html 34,35 @@ -6066,7 +6066,7 @@ The average fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm - Средняя комиссия, взимаемая узлами маршрутизации, без учета ставок комиссии > 0,5% или 5000 ppm. + Средняя комиссия, взимаемая узлами маршрутизации, без учета ставок комиссии >0,5% или 5000 частей на миллион. src/app/lightning/channels-statistics/channels-statistics.component.html 28,30 @@ -6088,7 +6088,7 @@ The average base fee charged by routing nodes, ignoring base fees > 5000ppm - Средняя базовая комиссия, взимаемая узлами маршрутизации, без учета базовых комиссий > 5000 ppm + Средняя базовая комиссия, взимаемая узлами маршрутизации, без учета базовых комиссий > 5000 частей на миллион src/app/lightning/channels-statistics/channels-statistics.component.html 43,45 @@ -6115,7 +6115,7 @@ The median fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm - Медианная комиссия, взимаемая узлами маршрутизации, без учета ставок комиссии > 0,5% или 5000 ppm. + Медианная комиссия, взимаемая узлами маршрутизации, без учета ставок комиссии > 0,5% или 5000 частей на миллион. src/app/lightning/channels-statistics/channels-statistics.component.html 74,76 @@ -6133,7 +6133,7 @@ The median base fee charged by routing nodes, ignoring base fees > 5000ppm - Медианная базовая комиссия, взимаемая узлами маршрутизации, без учета базовых комиссий > 5000 ppm + Медианная базовая комиссия, взимаемая узлами маршрутизации, без учета базовых комиссий > 5000 частей на миллион src/app/lightning/channels-statistics/channels-statistics.component.html 89,91 diff --git a/frontend/src/locale/messages.th.xlf b/frontend/src/locale/messages.th.xlf index 8f423ffa8..08f380e3e 100644 --- a/frontend/src/locale/messages.th.xlf +++ b/frontend/src/locale/messages.th.xlf @@ -2939,6 +2939,7 @@ Why is this block empty? + ทำไมบล็อกถึงว่าง? src/app/components/block/block.component.html 384,390 @@ -3202,6 +3203,7 @@ blocks expected + คาดว่าจะมีบล็อก src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3210,6 +3212,7 @@ block expected + คาดว่าจะมีบล็อก src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3218,6 +3221,7 @@ blocks mined + บล็อคที่ถูกขุด src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3226,6 +3230,7 @@ block mined + บล็อกที่ถูกขุด src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3234,6 +3239,7 @@ blocks remaining + คงเหลือ บล็อก src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3242,6 +3248,7 @@ block remaining + คงเหลือ บล็อก src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3250,6 +3257,7 @@ blocks ahead + บล็อกข้างหน้า src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3258,6 +3266,7 @@ block ahead + บล็อกข้างหน้า src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3266,6 +3275,7 @@ blocks behind + บล็อกข้างหลัง src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3274,6 +3284,7 @@ block behind + บล็อกข้างหลัง src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3313,6 +3324,7 @@ Usually places your transaction in between the second and third mempool blocks + โดยปกติจะวางธุรกรรมของคุณระหว่างบล็อก mempool ที่สองและสาม src/app/components/fees-box/fees-box.component.html 8,9 @@ -3334,6 +3346,7 @@ Usually places your transaction in between the first and second mempool blocks + โดยปกติจะวางธุรกรรมของคุณระหว่างบล็อก mempool ที่หนึ่งและที่สอง src/app/components/fees-box/fees-box.component.html 9,10 @@ -3476,6 +3489,7 @@ Hashrate & Difficulty + อัตราแฮชและความยาก src/app/components/graphs/graphs.component.html 14,15 @@ -3484,6 +3498,7 @@ Lightning + Lightning src/app/components/graphs/graphs.component.html 30 @@ -3492,6 +3507,7 @@ Lightning Nodes Per Network + โหนด lightning ต่อ network src/app/components/graphs/graphs.component.html 33 @@ -3580,6 +3596,7 @@ Lightning Nodes Channels World Map + แผนที่แชนแนลโหนด lightning ทั้งโลก src/app/components/graphs/graphs.component.html 43 @@ -3634,6 +3651,7 @@ Hashrate (MA) + อัตราแฮช (MA) src/app/components/hashrate-chart/hashrate-chart.component.ts 299,298 @@ -3699,6 +3717,7 @@ Lightning Explorer + ตัวสำรวจ lightning src/app/components/master-page/master-page.component.html 44,47 @@ -3822,6 +3841,7 @@ Pools luck (1 week) + ความโชคดีของ pool (1 สัปดาห์) src/app/components/pool-ranking/pool-ranking.component.html 9 @@ -3830,6 +3850,7 @@ Pools luck + ความโชคดีใน pool src/app/components/pool-ranking/pool-ranking.component.html 9,11 @@ -3838,6 +3859,7 @@ The overall luck of all mining pools over the past week. A luck bigger than 100% means the average block time for the current epoch is less than 10 minutes. + ค่าความโชคดีโดยรวมของ pool การขุดทั้งหมดในสัปดาห์ที่ผ่านมา โชคที่มากกว่า 100% หมายถึงเวลาบล็อกเฉลี่ยสำหรับยุคปัจจุบันน้อยกว่า 10 นาที src/app/components/pool-ranking/pool-ranking.component.html 11,15 @@ -3846,6 +3868,7 @@ Pools count (1w) + จำนวนพูล (1w) src/app/components/pool-ranking/pool-ranking.component.html 17 @@ -3854,6 +3877,7 @@ Pools count + จำนวนพูล src/app/components/pool-ranking/pool-ranking.component.html 17,19 @@ -3862,6 +3886,7 @@ How many unique pools found at least one block over the past week. + จำนวนพูลที่ไม่ซ้ำกันที่พบอย่างน้อยหนึ่งบล็อกในสัปดาห์ที่ผ่านมา src/app/components/pool-ranking/pool-ranking.component.html 19,23 @@ -3887,6 +3912,7 @@ The number of blocks found over the past week. + จำนวนบล็อกที่พบในสัปดาห์ที่ผ่านมา src/app/components/pool-ranking/pool-ranking.component.html 27,31 @@ -3912,6 +3938,7 @@ Avg Health + สุขภาพโดยเฉลี่ย src/app/components/pool-ranking/pool-ranking.component.html 96,97 @@ -3968,6 +3995,7 @@ blocks + บล็อก src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -3987,6 +4015,7 @@ Other () + อื่นๆ () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4014,6 +4043,7 @@ mining pool + พูลที่ใช้ขุด src/app/components/pool/pool-preview.component.html 3,5 @@ -4264,6 +4294,7 @@ Avg Block Fees + ค่าธรรมเนียมบล็อกโดยเฉลี่ย src/app/components/reward-stats/reward-stats.component.html 17 @@ -4276,6 +4307,7 @@ Average fees per block in the past 144 blocks + ค่าธรรมเนียมเฉลี่ยต่อบล็อกใน 144 บล็อกที่ผ่านมา src/app/components/reward-stats/reward-stats.component.html 18,20 @@ -4284,6 +4316,7 @@ BTC/block + BTC/บล็อก src/app/components/reward-stats/reward-stats.component.html 21,24 @@ -4293,6 +4326,7 @@ Avg Tx Fee + ค่าธรรมเนียม Tx โดยเฉลี่ย src/app/components/reward-stats/reward-stats.component.html 30 @@ -4337,6 +4371,7 @@ Explore the full Bitcoin ecosystem + สำรวจระบบนิเวศ Bitcoin เต็มรูปแบบ src/app/components/search-form/search-form.component.html 4,5 @@ -4354,6 +4389,7 @@ Bitcoin Block Height + ความสูงของบล็อก Bitcoin src/app/components/search-form/search-results/search-results.component.html 3 @@ -4362,6 +4398,7 @@ Bitcoin Transaction + ธุรกรรมบิตคอยน์ src/app/components/search-form/search-results/search-results.component.html 9 @@ -4370,6 +4407,7 @@ Bitcoin Address + แอดเดรสบิตคอยน์ src/app/components/search-form/search-results/search-results.component.html 15 @@ -4378,6 +4416,7 @@ Bitcoin Block + บล็อกบิตคอยน์ src/app/components/search-form/search-results/search-results.component.html 21 @@ -4386,6 +4425,7 @@ Bitcoin Addresses + แอดเดรสบิตคอยน์ src/app/components/search-form/search-results/search-results.component.html 27 @@ -4394,6 +4434,7 @@ Lightning Nodes + โหนด lightning src/app/components/search-form/search-results/search-results.component.html 35 @@ -4402,6 +4443,7 @@ Lightning Channels + แชนแนล lightning src/app/components/search-form/search-results/search-results.component.html 43 @@ -4410,6 +4452,7 @@ Go to "" + ไปยัง "" src/app/components/search-form/search-results/search-results.component.html 52 @@ -4535,6 +4578,7 @@ In ~ + ใน ~ src/app/components/time/time.component.ts 126 @@ -4664,6 +4708,7 @@ This transaction replaced: + ธุรกรรมนี้แทนที่: src/app/components/transaction/transaction.component.html 10,12 @@ -4673,6 +4718,7 @@ Replaced + แทนที่ src/app/components/transaction/transaction.component.html 36,39 @@ -4774,6 +4820,7 @@ Flow + Flow src/app/components/transaction/transaction.component.html 202,205 @@ -4787,6 +4834,7 @@ Hide diagram + ซ่อนไดอะแกรมนี้ src/app/components/transaction/transaction.component.html 205,210 @@ -4795,6 +4843,7 @@ Show more + แสดงเพิ่มเติม src/app/components/transaction/transaction.component.html 226,228 @@ -4811,6 +4860,7 @@ Show less + แสดงน้อยลง src/app/components/transaction/transaction.component.html 228,234 @@ -4823,6 +4873,7 @@ Show diagram + แสดงไดอะแกรม src/app/components/transaction/transaction.component.html 248,249 @@ -5007,6 +5058,7 @@ Show more inputs to reveal fee data + แสดงอินพุตเพิ่มเติมเพื่อเปิดเผยข้อมูลค่าธรรมเนียม src/app/components/transactions-list/transactions-list.component.html 290,293 @@ -5015,6 +5067,7 @@ remaining + คงเหลือ src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -5023,6 +5076,7 @@ other inputs + อินพุตอื่น ๆ src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 12 @@ -5031,6 +5085,7 @@ other outputs + เอาต์พุตอื่น ๆ src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 13 @@ -5039,6 +5094,7 @@ Input + อินพุต src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 42 @@ -5051,6 +5107,7 @@ Output + เอาต์พุต src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html 43 @@ -5063,6 +5120,7 @@ This transaction saved % on fees by using native SegWit + การทำธุรกรรมนี้ช่วยประหยัด % จากค่าธรรมเนียมโดยใช้ native SegWit src/app/components/tx-features/tx-features.component.html 2 @@ -5089,6 +5147,7 @@ This transaction saved % on fees by using SegWit and could save % more by fully upgrading to native SegWit + ธุรกรรมนี้ช่วยประหยัดค่าธรรมเนียม % โดยใช้ SegWit และสามารถประหยัดได้มากขึ้น % ด้วยการอัปเกรดเป็น native SegWit ทั้งหมด src/app/components/tx-features/tx-features.component.html 4 @@ -5097,6 +5156,7 @@ This transaction could save % on fees by upgrading to native SegWit or % by upgrading to SegWit-P2SH + ธุรกรรมนี้สามารถประหยัดค่าธรรมเนียม % ได้โดยการอัปเกรดเป็น native SegWit หรือประหยัดได้ % ด้วยการอัปเกรดเป็น SegWit-P2SH src/app/components/tx-features/tx-features.component.html 6 @@ -5105,6 +5165,7 @@ This transaction uses Taproot and thereby saved at least % on fees + ธุรกรรมนี้ใช้ Taproot และประหยัดค่าธรรมเนียมได้อย่างน้อย % src/app/components/tx-features/tx-features.component.html 12 @@ -5113,6 +5174,7 @@ Taproot + Taproot src/app/components/tx-features/tx-features.component.html 12 @@ -5138,6 +5200,7 @@ This transaction uses Taproot and already saved at least % on fees, but could save an additional % by fully using Taproot + การทำธุรกรรมนี้ใช้ Taproot และประหยัดค่าธรรมเนียมไปแล้วอย่างน้อย % แต่สามารถประหยัด เพิ่มเติมได้เมื่อใช้ Taproot อย่างเต็มที่ src/app/components/tx-features/tx-features.component.html 14 @@ -5146,6 +5209,7 @@ This transaction could save % on fees by using Taproot + ธุรกรรมนี้สามารถประหยัดค่าธรรมเนียมได้ % โดยใช้ Taproot src/app/components/tx-features/tx-features.component.html 16 @@ -5154,6 +5218,7 @@ This transaction does not use Taproot + ธุรกรรมนี้ไม่ได้ใช้ Taproot src/app/components/tx-features/tx-features.component.html 18 @@ -5171,6 +5236,7 @@ This transaction supports Replace-By-Fee (RBF) allowing fee bumping + การทำธุรกรรมนี้รองรับการ Replace-By-Fee (RBF) ทำให้สามารถเพิ่มค่าธรรมเนียมได้ src/app/components/tx-features/tx-features.component.html 28 @@ -5296,6 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space ให้ข้อมูลเกี่ยวกับเครือข่าย Bitcoin เท่านั้น ไม่สามารถช่วยคุณเรียกเงิน ยืนยันธุรกรรมเร็วขึ้น ฯลฯ src/app/docs/api-docs/api-docs.component.html 13 @@ -5308,6 +5375,7 @@ REST API service + บริการ REST API src/app/docs/api-docs/api-docs.component.html 42,43 @@ -5413,6 +5481,7 @@ Base fee + ค่าธรรมเนียมขั้นต่ำ src/app/lightning/channel/channel-box/channel-box.component.html 29 @@ -5425,6 +5494,7 @@ mSats + mSats src/app/lightning/channel/channel-box/channel-box.component.html 35 @@ -5445,6 +5515,7 @@ This channel supports zero base fee routing + แชนแนลนี้รองรับการกำหนดเส้นทางค่าธรรมเนียมที่เป็นศูนย์ src/app/lightning/channel/channel-box/channel-box.component.html 44 @@ -5453,6 +5524,7 @@ Zero base fee + ค่าธรรมเนียมขั้นต่ำเป็นศูนย์ src/app/lightning/channel/channel-box/channel-box.component.html 45 @@ -5461,6 +5533,7 @@ This channel does not support zero base fee routing + แชนแนลนี้ไม่รองรับการกำหนดเส้นทางค่าธรรมเนียมที่เป็นศูนย์ src/app/lightning/channel/channel-box/channel-box.component.html 50 @@ -5469,6 +5542,7 @@ Non-zero base fee + ค่าธรรมเนียมขั้นต่ำที่ไม่เป็นศูนย์ src/app/lightning/channel/channel-box/channel-box.component.html 51 @@ -5477,6 +5551,7 @@ Min HTLC + HTML ขั้นต่ำ src/app/lightning/channel/channel-box/channel-box.component.html 57 @@ -5485,6 +5560,7 @@ Max HTLC + HTLC สูงสุด src/app/lightning/channel/channel-box/channel-box.component.html 63 @@ -5493,6 +5569,7 @@ Timelock delta + Timelock delta src/app/lightning/channel/channel-box/channel-box.component.html 69 @@ -5501,6 +5578,7 @@ channels + แชนแนล src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -5517,6 +5595,7 @@ Starting balance + ยอดเงินเริ่มต้น src/app/lightning/channel/channel-close-box/channel-close-box.component.html 6 @@ -5526,6 +5605,7 @@ Closing balance + ยอดเงินหลังปิด src/app/lightning/channel/channel-close-box/channel-close-box.component.html 12 @@ -5535,6 +5615,7 @@ lightning channel + แชนแนล lightning src/app/lightning/channel/channel-preview.component.html 3,5 @@ -5543,6 +5624,7 @@ Inactive + ไม่ใช้งาน src/app/lightning/channel/channel-preview.component.html 10,11 @@ -5559,6 +5641,7 @@ Active + คล่องแคล่ว src/app/lightning/channel/channel-preview.component.html 11,12 @@ -5575,6 +5658,7 @@ Closed + ปิด src/app/lightning/channel/channel-preview.component.html 12,14 @@ -5595,6 +5679,7 @@ Created + สร้างเมื่อ src/app/lightning/channel/channel-preview.component.html 23,26 @@ -5607,6 +5692,7 @@ Capacity + ความจุ src/app/lightning/channel/channel-preview.component.html 27,28 @@ -5671,6 +5757,7 @@ ppm + ppm src/app/lightning/channel/channel-preview.component.html 34,35 @@ -5691,6 +5778,7 @@ Lightning channel + แชนแนล lightning src/app/lightning/channel/channel.component.html 4,7 @@ -5703,6 +5791,7 @@ Last update + วันที่อัปเดตล่าสุด src/app/lightning/channel/channel.component.html 40,41 @@ -5735,6 +5824,7 @@ Closing date + วันที่ปิด src/app/lightning/channel/channel.component.html 44,45 @@ -5747,6 +5837,7 @@ Closed by + ปิดโดย src/app/lightning/channel/channel.component.html 59,61 @@ -5755,6 +5846,7 @@ Opening transaction + เปิดธุรกรรม src/app/lightning/channel/channel.component.html 91,92 @@ -5763,6 +5855,7 @@ Closing transaction + ปิดการทำธุรกรรม src/app/lightning/channel/channel.component.html 100,102 @@ -5771,6 +5864,7 @@ Channel: + แชนแนล: src/app/lightning/channel/channel.component.ts 37 @@ -5778,6 +5872,7 @@ Mutually closed + ปิดโดยร่วมกัน src/app/lightning/channel/closing-type/closing-type.component.ts 20 @@ -5785,6 +5880,7 @@ Force closed + บังคับปิด src/app/lightning/channel/closing-type/closing-type.component.ts 24 @@ -5792,6 +5888,7 @@ Force closed with penalty + บังคับปิดโดยมีค่าปรับ src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -5799,6 +5896,7 @@ Open + เปิด src/app/lightning/channels-list/channels-list.component.html 5,7 @@ -5807,6 +5905,7 @@ No channels to display + ไม่มีแชนแนลให้แสดง src/app/lightning/channels-list/channels-list.component.html 29,37 @@ -5815,6 +5914,7 @@ Alias + นามแฝง src/app/lightning/channels-list/channels-list.component.html 38,40 @@ -5851,6 +5951,7 @@ Status + สถานะ src/app/lightning/channels-list/channels-list.component.html 40,41 @@ -5859,6 +5960,7 @@ Channel ID + ID แชนแนล src/app/lightning/channels-list/channels-list.component.html 44,48 @@ -5867,6 +5969,7 @@ sats + sats src/app/lightning/channels-list/channels-list.component.html 63,68 @@ -5919,6 +6022,7 @@ avg + avg src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -5927,6 +6031,7 @@ med + med src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -5935,6 +6040,7 @@ Avg Capacity + ความจุโดยเฉลี่ย src/app/lightning/channels-statistics/channels-statistics.component.html 13,15 @@ -5947,6 +6053,7 @@ Avg Fee Rate + อัตราค่าธรรมเนียมโดยเฉลี่ย src/app/lightning/channels-statistics/channels-statistics.component.html 26,28 @@ -5959,6 +6066,7 @@ The average fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + อัตราค่าธรรมเนียมเฉลี่ยที่เรียกเก็บโดยโหนดการกำหนดเส้นทาง โดยไม่สนใจอัตราค่าธรรมเนียม > 0.5% หรือ 5,000ppm src/app/lightning/channels-statistics/channels-statistics.component.html 28,30 @@ -5967,6 +6075,7 @@ Avg Base Fee + ค่าธรรมเนียมเริ่มต้นโดยเฉลี่ย src/app/lightning/channels-statistics/channels-statistics.component.html 41,43 @@ -5979,6 +6088,7 @@ The average base fee charged by routing nodes, ignoring base fees > 5000ppm + ค่าธรรมเนียมเฉลี่ยที่เรียกเก็บโดยโหนดการกำหนดเส้นทาง โดยไม่สนใจค่าธรรมเนียมพื้นฐาน > 5,000ppm src/app/lightning/channels-statistics/channels-statistics.component.html 43,45 @@ -5987,6 +6097,7 @@ Med Capacity + ความจุโดยเฉลี่ย src/app/lightning/channels-statistics/channels-statistics.component.html 59,61 @@ -5995,6 +6106,7 @@ Med Fee Rate + ค่าธรรมเนียมโดยเฉลี่ย src/app/lightning/channels-statistics/channels-statistics.component.html 72,74 @@ -6003,6 +6115,7 @@ The median fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + อัตราค่าธรรมเนียมเรียกเก็บโดยโหนดการกำหนดเส้นทาง โดยไม่สนใจอัตราค่าธรรมเนียม > 0.5% หรือ 5,000ppm src/app/lightning/channels-statistics/channels-statistics.component.html 74,76 @@ -6011,6 +6124,7 @@ Med Base Fee + ค่าธรรมเนียมขั้นต่ำโดยเฉลี่ย src/app/lightning/channels-statistics/channels-statistics.component.html 87,89 @@ -6019,6 +6133,7 @@ The median base fee charged by routing nodes, ignoring base fees > 5000ppm + ค่าธรรมเนียมที่เรียกเก็บโดยโหนดการกำหนดเส้นทาง โดยไม่สนใจค่าธรรมเนียมพื้นฐาน > 5,000ppm src/app/lightning/channels-statistics/channels-statistics.component.html 89,91 @@ -6027,6 +6142,7 @@ Lightning node group + กลุ่มโหนด lighting src/app/lightning/group/group-preview.component.html 3,5 @@ -6039,6 +6155,7 @@ Nodes + โหนด src/app/lightning/group/group-preview.component.html 25,29 @@ -6075,6 +6192,7 @@ Liquidity + สภาพคล่อง src/app/lightning/group/group-preview.component.html 29,31 @@ -6107,6 +6225,7 @@ Channels + แชนเนล src/app/lightning/group/group-preview.component.html 40,43 @@ -6179,6 +6298,7 @@ Average size + ขนาดโดยเฉลี่ย src/app/lightning/group/group-preview.component.html 44,46 @@ -6191,6 +6311,7 @@ Location + สถานที่ตั้ง src/app/lightning/group/group.component.html 74,77 @@ -6231,6 +6352,7 @@ Network Statistics + สถานะเครือข่าย src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 10 @@ -6239,6 +6361,7 @@ Channels Statistics + สถานะแชนแนล src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 24 @@ -6247,6 +6370,7 @@ Lightning Network History + ประวัติเครือข่าย lightning src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 49 @@ -6255,6 +6379,7 @@ Liquidity Ranking + อันดับสภาพคล่อง src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 @@ -6279,6 +6404,7 @@ Connectivity Ranking + อันดับการเชื่อมต่อ src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 76 @@ -6291,6 +6417,7 @@ Fee distribution + การกระจายค่าธรรมเนียม src/app/lightning/node-fee-chart/node-fee-chart.component.html 2 @@ -6299,6 +6426,7 @@ Outgoing Fees + ค่าธรรมเนียมขาออก src/app/lightning/node-fee-chart/node-fee-chart.component.ts 170 @@ -6310,6 +6438,7 @@ Incoming Fees + ค่าธรรมเนียมขาเข้า src/app/lightning/node-fee-chart/node-fee-chart.component.ts 178 @@ -6321,6 +6450,7 @@ Percentage change past week + เปอร์เซ็นต์การเปลี่ยนแปลงในสัปดาห์ที่ผ่านมา src/app/lightning/node-statistics/node-statistics.component.html 5,7 @@ -6337,6 +6467,7 @@ Lightning node + โหนด lightning src/app/lightning/node/node-preview.component.html 3,5 @@ -6353,6 +6484,7 @@ Active capacity + ความจุที่ใช้งานอยู่ src/app/lightning/node/node-preview.component.html 20,22 @@ -6365,6 +6497,7 @@ Active channels + แชนแนลที่ใช้งานอยู่ src/app/lightning/node/node-preview.component.html 26,30 @@ -6377,6 +6510,7 @@ Country + ประเทศ src/app/lightning/node/node-preview.component.html 44,47 @@ -6385,6 +6519,7 @@ Average channel size + ขนาดแชนแนลโดยเฉลี่ย src/app/lightning/node/node.component.html 43,46 @@ -6393,6 +6528,7 @@ Avg channel distance + ระยะทางเฉลี่ยของแชนแนล src/app/lightning/node/node.component.html 59,60 @@ -6401,6 +6537,7 @@ Color + สี src/app/lightning/node/node.component.html 82,84 @@ -6409,6 +6546,7 @@ ISP + ISP src/app/lightning/node/node.component.html 89,90 @@ -6421,6 +6559,7 @@ Exclusively on Tor + เฉพาะบนทอร์ src/app/lightning/node/node.component.html 96,98 @@ -6429,6 +6568,7 @@ Liquidity ad + ad สภาพคล่อง src/app/lightning/node/node.component.html 141,144 @@ -6437,6 +6577,7 @@ Lease fee rate + ค่าธรรมเนียมสำหรับการเช่า src/app/lightning/node/node.component.html 147,150 @@ -6446,6 +6587,7 @@ Lease base fee + ค่าธรรมเนียมขั้นต่ำสำหรับการเช่า src/app/lightning/node/node.component.html 155,157 @@ -6454,6 +6596,7 @@ Funding weight + น้ำหนักเงินทุน src/app/lightning/node/node.component.html 161,162 @@ -6462,6 +6605,7 @@ Channel fee rate + อัตราค่าธรรมเนียมของแชนแนล src/app/lightning/node/node.component.html 171,174 @@ -6471,6 +6615,7 @@ Channel base fee + ค่าธรรมเนียมขั้นต่ำของแชนแนล src/app/lightning/node/node.component.html 179,181 @@ -6479,6 +6624,7 @@ Compact lease + lease ขนาดกะทัดรัด src/app/lightning/node/node.component.html 191,193 @@ -6487,6 +6633,7 @@ TLV extension records + บันทึกส่วนขยาย TLV src/app/lightning/node/node.component.html 202,205 @@ -6495,6 +6642,7 @@ Open channels + แชนแนลที่เปิด src/app/lightning/node/node.component.html 243,246 @@ -6503,6 +6651,7 @@ Closed channels + แชนแนลที่ถูกปิด src/app/lightning/node/node.component.html 247,250 @@ -6511,6 +6660,7 @@ Node: + โหนด: src/app/lightning/node/node.component.ts 60 @@ -6518,6 +6668,7 @@ (Tor nodes excluded) + (ไม่รวมโหนด Tor) src/app/lightning/nodes-channels-map/nodes-channels-map.component.html 8,11 @@ -6538,6 +6689,7 @@ Lightning Nodes Channels World Map + แผนที่แชนแนลโหนด lighting ทั้งโลก src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 69 @@ -6545,6 +6697,7 @@ No geolocation data available + ไม่พบข้อมูลแหล่งที่ตั้ง src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 219,214 @@ -6552,6 +6705,7 @@ Active channels map + แผนที่แชนแนลที่ใช้งานอยู่ src/app/lightning/nodes-channels/node-channels.component.html 2,3 @@ -6621,6 +6775,7 @@ nodes + โหนด src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 @@ -6675,6 +6830,7 @@ Lightning nodes in + โหนด lightning ใน src/app/lightning/nodes-per-country/nodes-per-country.component.ts 35 @@ -6695,6 +6851,7 @@ How much liquidity is running on nodes advertising at least one clearnet IP address + สภาพคล่องที่ทำงานอยู่บนโหนดที่เปิดใช้งานอยู่บนไอพีของ clearnet อย่างน้อยหนึ่งไอพี src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 8,9 @@ -6716,6 +6873,7 @@ How much liquidity is running on nodes which ISP was not identifiable + สภาพคล่องที่ทำงานบนโหนดที่ ISP ไม่สามารถระบุได้ src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 15,16 @@ -6737,6 +6895,7 @@ How much liquidity is running on nodes advertising only Tor addresses + สภาพคล่องที่ทำงานบนโหนดที่ใช้งานบนเฉพาะเครือข่าย Tor src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 22,23 @@ -6745,6 +6904,7 @@ Top 100 ISPs hosting LN nodes + 100 ISP อันดับต้นๆที่เปิดโหนด lignting src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 31,33 @@ -6774,6 +6934,7 @@ Top country + ประเทศอันดับต้นๆ src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 39,41 @@ -6786,6 +6947,7 @@ Top node + โหนดอันดับต้นๆ src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 45,48 @@ -6794,6 +6956,7 @@ Lightning nodes on ISP: [AS] + โหนด lightning บน ISP: [AS ] src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts 44 @@ -6805,6 +6968,7 @@ Lightning nodes on ISP: + โหนด lightning ใน ISP นี้: src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 2,4 @@ -6831,6 +6995,7 @@ Top 100 oldest lightning nodes + 100 โหนด lightning ที่เปิดนานที่สุด src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.html 3,7 @@ -6839,6 +7004,7 @@ Oldest lightning nodes + โหนด lightning ที่เปิดนานที่สุด src/app/lightning/nodes-ranking/oldest-nodes/oldest-nodes.component.ts 27 @@ -6855,6 +7021,7 @@ Top lightning nodes + โหนด lightning อันดับต้นๆ src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.ts 22 diff --git a/frontend/src/locale/messages.tr.xlf b/frontend/src/locale/messages.tr.xlf index 3ef9c25ba..caf321422 100644 --- a/frontend/src/locale/messages.tr.xlf +++ b/frontend/src/locale/messages.tr.xlf @@ -3203,6 +3203,7 @@ blocks expected + beklenen blok: src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + beklenen blok: src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + kazılan bloklar: src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + kazılan bloklar: src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + kalan bloklar: src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + kalan bloklar: src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + blok önde src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + blok önde src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + blok geride src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + blok geride src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3293,7 @@ Average block time + Ortalama blok zamanı src/app/components/difficulty/difficulty.component.html 42,45 @@ -3984,6 +3995,7 @@ blocks + bloklar src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4003,6 +4015,7 @@ Other () + Diğer () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4439,7 +4452,7 @@ Go to "" - "" 'a git; + "" 'a git src/app/components/search-form/search-results/search-results.component.html 52 @@ -4505,7 +4518,7 @@ ago - önce + önce src/app/components/time/time.component.ts 103 @@ -6762,6 +6775,7 @@ nodes + düğüm src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 diff --git a/frontend/src/locale/messages.vi.xlf b/frontend/src/locale/messages.vi.xlf index 5c4ebe759..7f4eb12b7 100644 --- a/frontend/src/locale/messages.vi.xlf +++ b/frontend/src/locale/messages.vi.xlf @@ -3113,7 +3113,7 @@ blocks - khối + khối src/app/components/difficulty-mining/difficulty-mining.component.html 10,11 @@ -3138,7 +3138,7 @@ block - khối + khối src/app/components/difficulty-mining/difficulty-mining.component.html 11,12 @@ -3984,6 +3984,7 @@ blocks + khối src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4505,7 +4506,7 @@ ago - trước + trước src/app/components/time/time.component.ts 103 @@ -4565,6 +4566,7 @@ In ~ + Trong ~ src/app/components/time/time.component.ts 126 @@ -5053,7 +5055,7 @@ remaining - còn lại + còn lại src/app/components/transactions-list/transactions-list.component.html 332,333 @@ -5564,7 +5566,7 @@ channels - kênh + kênh src/app/lightning/channel/channel-box/channel-box.component.html 79 @@ -6712,6 +6714,7 @@ Clearnet and Darknet + Clearnet và Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6777,7 +6780,7 @@ BTC capacity - công suất BTC + công suất BTC src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 105,103 @@ -7020,7 +7023,7 @@ year - năm + năm src/app/shared/i18n/dates.ts 3 @@ -7028,7 +7031,7 @@ years - năm + năm src/app/shared/i18n/dates.ts 4 @@ -7036,7 +7039,7 @@ month - tháng + tháng src/app/shared/i18n/dates.ts 5 @@ -7044,7 +7047,7 @@ months - tháng + tháng src/app/shared/i18n/dates.ts 6 @@ -7052,7 +7055,7 @@ week - tuần + tuần src/app/shared/i18n/dates.ts 7 @@ -7060,7 +7063,7 @@ weeks - tuần + tuần src/app/shared/i18n/dates.ts 8 @@ -7068,7 +7071,7 @@ day - ngày + ngày src/app/shared/i18n/dates.ts 9 @@ -7076,7 +7079,7 @@ days - ngày + ngày src/app/shared/i18n/dates.ts 10 @@ -7084,7 +7087,7 @@ hour - giờ + giờ src/app/shared/i18n/dates.ts 11 @@ -7092,7 +7095,7 @@ hours - giờ + giờ src/app/shared/i18n/dates.ts 12 From f1f6c4812870995232e2ac23fae69fcd0005ebbf Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 22 Mar 2023 13:45:27 +0900 Subject: [PATCH 135/782] Show "No data to display yet" until we have at least two points for node stats charts --- .../node-statistics-chart.component.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts index 4416ae297..21e3fc2c5 100644 --- a/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts +++ b/frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.ts @@ -75,7 +75,7 @@ export class NodeStatisticsChartComponent implements OnInit { prepareChartOptions(data) { let title: object; - if (data.channels.length === 0) { + if (data.channels.length < 2) { title = { textStyle: { color: 'grey', @@ -135,14 +135,14 @@ export class NodeStatisticsChartComponent implements OnInit { return tooltip; } }, - xAxis: data.channels.length === 0 ? undefined : { + xAxis: data.channels.length < 2 ? undefined : { type: 'time', splitNumber: this.isMobile() ? 5 : 10, axisLabel: { hideOverlap: true, } }, - legend: data.channels.length === 0 ? undefined : { + legend: data.channels.length < 2 ? undefined : { padding: 10, data: [ { @@ -167,7 +167,7 @@ export class NodeStatisticsChartComponent implements OnInit { 'Capacity': true, } }, - yAxis: data.channels.length === 0 ? undefined : [ + yAxis: data.channels.length < 2 ? undefined : [ { type: 'value', axisLabel: { @@ -198,7 +198,7 @@ export class NodeStatisticsChartComponent implements OnInit { } } ], - series: data.channels.length === 0 ? [] : [ + series: data.channels.length < 2 ? [] : [ { zlevel: 1, name: $localize`:@@807cf11e6ac1cde912496f764c176bdfdd6b7e19:Channels`, From ed69591bcf3afe145d08f129e890324af2ef5de8 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 22 Mar 2023 14:09:30 +0900 Subject: [PATCH 136/782] Show "No data to display yet" in "Fee distribution" chart on node page when there are no channels yet --- .../node-fee-chart.component.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts b/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts index 242ecc6ed..97268226d 100644 --- a/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts +++ b/frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.ts @@ -101,8 +101,15 @@ export class NodeFeeChartComponent implements OnInit { } prepareChartOptions(outgoingData, incomingData): void { + let sum = outgoingData.reduce((accumulator, object) => { + return accumulator + object.count; + }, 0); + sum += incomingData.reduce((accumulator, object) => { + return accumulator + object.count; + }, 0); + let title: object; - if (outgoingData.length === 0) { + if (sum === 0) { title = { textStyle: { color: 'grey', @@ -115,7 +122,7 @@ export class NodeFeeChartComponent implements OnInit { } this.chartOptions = { - title: outgoingData.length === 0 ? title : undefined, + title: sum === 0 ? title : undefined, animation: false, grid: { top: 30, @@ -151,7 +158,7 @@ export class NodeFeeChartComponent implements OnInit { `; } }, - xAxis: outgoingData.length === 0 ? undefined : { + xAxis: sum === 0 ? undefined : { type: 'category', axisLine: { onZero: true }, axisLabel: { @@ -163,7 +170,7 @@ export class NodeFeeChartComponent implements OnInit { }, data: outgoingData.map(bucket => bucket.label) }, - legend: outgoingData.length === 0 ? undefined : { + legend: sum === 0 ? undefined : { padding: 10, data: [ { @@ -184,7 +191,7 @@ export class NodeFeeChartComponent implements OnInit { }, ], }, - yAxis: outgoingData.length === 0 ? undefined : [ + yAxis: sum === 0 ? undefined : [ { type: 'value', axisLabel: { @@ -202,7 +209,7 @@ export class NodeFeeChartComponent implements OnInit { }, }, ], - series: outgoingData.length === 0 ? undefined : [ + series: sum === 0 ? undefined : [ { zlevel: 0, name: $localize`Outgoing Fees`, From 5826f8fa1eb332bdd1e3b8978f9a5f05ebc52add Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 23 Mar 2023 00:28:17 +0900 Subject: [PATCH 137/782] Pull from transifex --- frontend/src/locale/messages.da.xlf | 2 ++ frontend/src/locale/messages.he.xlf | 17 +++++++++++++++++ frontend/src/locale/messages.hu.xlf | 8 ++++++++ frontend/src/locale/messages.ko.xlf | 14 +++++++------- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/frontend/src/locale/messages.da.xlf b/frontend/src/locale/messages.da.xlf index 9ce1ff153..0e3a2a1f8 100644 --- a/frontend/src/locale/messages.da.xlf +++ b/frontend/src/locale/messages.da.xlf @@ -3283,6 +3283,7 @@ Average block time + Gennemsnitlig bloktid src/app/components/difficulty/difficulty.component.html 42,45 @@ -4004,6 +4005,7 @@ Other () + Andet () src/app/components/pool-ranking/pool-ranking.component.ts 201 diff --git a/frontend/src/locale/messages.he.xlf b/frontend/src/locale/messages.he.xlf index 4bf343f8e..1614f3713 100644 --- a/frontend/src/locale/messages.he.xlf +++ b/frontend/src/locale/messages.he.xlf @@ -3275,6 +3275,7 @@ blocks behind + בלוקים מאחור src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3283,6 +3284,7 @@ block behind + בלוק מאחור src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3291,6 +3293,7 @@ Average block time + זמן בלוק ממוצע src/app/components/difficulty/difficulty.component.html 42,45 @@ -3882,6 +3885,7 @@ How many unique pools found at least one block over the past week. + כמות בריכות הכרייה אשר מצאו לפחות בלוק אחד בשבוע החולף. src/app/components/pool-ranking/pool-ranking.component.html 19,23 @@ -3990,6 +3994,7 @@ blocks + בלוקים src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4009,6 +4014,7 @@ Other () + אחר () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4570,6 +4576,7 @@ In ~ + תוך ~ src/app/components/time/time.component.ts 126 @@ -5353,6 +5360,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + mempool.space מספק נתונים מרשת הביטקוין בלבד. אין אפשרות לסייע באיחזור נכסים, אישור מהיר יותר של טרנזקציות וכו'. src/app/docs/api-docs/api-docs.component.html 13 @@ -5503,6 +5511,7 @@ This channel supports zero base fee routing + ערוץ זה תומך בניתוב עמלות בסיס אפס src/app/lightning/channel/channel-box/channel-box.component.html 44 @@ -5511,6 +5520,7 @@ Zero base fee + עמלות בסיס אפס src/app/lightning/channel/channel-box/channel-box.component.html 45 @@ -5519,6 +5529,7 @@ This channel does not support zero base fee routing + ערוץ זה אינו תומך בניתוב עמלות בסיס אפס src/app/lightning/channel/channel-box/channel-box.component.html 50 @@ -5527,6 +5538,7 @@ Non-zero base fee + לא עמלות בסיס אפס src/app/lightning/channel/channel-box/channel-box.component.html 51 @@ -5551,6 +5563,7 @@ Timelock delta + מרווח נעילת-זמן src/app/lightning/channel/channel-box/channel-box.component.html 69 @@ -6567,6 +6580,7 @@ Funding weight + משקל מימון src/app/lightning/node/node.component.html 161,162 @@ -6636,6 +6650,7 @@ (Tor nodes excluded) + (ללא צמתי תור) src/app/lightning/nodes-channels-map/nodes-channels-map.component.html 8,11 @@ -6663,6 +6678,7 @@ No geolocation data available + מידע גיאולוקאלי אינו זמין src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 219,214 @@ -6740,6 +6756,7 @@ nodes + צמתים src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 diff --git a/frontend/src/locale/messages.hu.xlf b/frontend/src/locale/messages.hu.xlf index 169e47008..c5237c427 100644 --- a/frontend/src/locale/messages.hu.xlf +++ b/frontend/src/locale/messages.hu.xlf @@ -6084,6 +6084,7 @@ Med Fee Rate + Közép Díj Ráta src/app/lightning/channels-statistics/channels-statistics.component.html 72,74 @@ -6100,6 +6101,7 @@ Med Base Fee + Közép Alapdíj src/app/lightning/channels-statistics/channels-statistics.component.html 87,89 @@ -6116,6 +6118,7 @@ Lightning node group + Villám node csoport src/app/lightning/group/group-preview.component.html 3,5 @@ -6325,6 +6328,7 @@ Network Statistics + Hálózati Statisztikák src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 10 @@ -6333,6 +6337,7 @@ Channels Statistics + Csatorna Statisztika src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 24 @@ -6341,6 +6346,7 @@ Lightning Network History + Villámhálózati Események src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 49 @@ -6349,6 +6355,7 @@ Liquidity Ranking + Likviditási Besorolás src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 @@ -6373,6 +6380,7 @@ Connectivity Ranking + Csatlakozottsági Besorolás src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 76 diff --git a/frontend/src/locale/messages.ko.xlf b/frontend/src/locale/messages.ko.xlf index 78e33b5f7..948ffa86e 100644 --- a/frontend/src/locale/messages.ko.xlf +++ b/frontend/src/locale/messages.ko.xlf @@ -3203,7 +3203,7 @@ blocks expected - 예상한 개 블록 + 예측된 블록들: src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3221,7 +3221,7 @@ blocks mined - 채굴된 개 블록 + 채굴된 블록들: src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3239,7 +3239,7 @@ blocks remaining - 남은 개 블록 + 남은 블록: src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3257,7 +3257,7 @@ blocks ahead - 앞서있는 개 블록 + 현재 앞서있는 블록: src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3275,7 +3275,7 @@ blocks behind - 뒤처진 개 블록 + 현재 뒤처져있는 블록: src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -4371,7 +4371,7 @@ Explore the full Bitcoin ecosystem - 비트코인 생태계 전체를 탐험하세요. + 비트코인 네트워크 전체를 검색해 보세요 src/app/components/search-form/search-form.component.html 4,5 @@ -4578,7 +4578,7 @@ In ~ - ~ 안에 + ~ src/app/components/time/time.component.ts 126 From 29aa3617d8911f8da353287abef9e6921af15dc9 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 23 Mar 2023 14:43:03 +0900 Subject: [PATCH 138/782] Crediting Lithuanian and Danish translator --- frontend/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/README.md b/frontend/README.md index d90aa541b..b626a23b9 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -106,6 +106,7 @@ https://www.transifex.com/mempool/mempool/dashboard/ * Arabic @baro0k * Czech @pixelmade2 +* Danish @pierrevendelboe * German @Emzy * English (default) * Spanish @maxhodler @bisqes @@ -113,6 +114,7 @@ https://www.transifex.com/mempool/mempool/dashboard/ * French @Bayernatoor * Korean @kcalvinalvinn @sogoagain * Italian @HodlBits +* Lithuanian @eimze21 * Hebrew @rapidlab309 * Georgian @wyd_idk * Hungarian @btcdragonlord From 53a44853b3d1f2c3e4e37bb269eb0550eb9042a2 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 23 Mar 2023 15:18:48 +0900 Subject: [PATCH 139/782] Reconnect to electrum an unlimited amount of times every 1 seconds up disconnection --- backend/src/api/bitcoin/electrum-api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/bitcoin/electrum-api.ts b/backend/src/api/bitcoin/electrum-api.ts index 73fc3f28f..9d1ef46d3 100644 --- a/backend/src/api/bitcoin/electrum-api.ts +++ b/backend/src/api/bitcoin/electrum-api.ts @@ -16,7 +16,7 @@ class BitcoindElectrsApi extends BitcoinApi implements AbstractBitcoinApi { super(bitcoinClient); const electrumConfig = { client: 'mempool-v2', version: '1.4' }; - const electrumPersistencePolicy = { retryPeriod: 10000, maxRetry: 1000, callback: null }; + const electrumPersistencePolicy = { retryPeriod: 1000, maxRetry: Number.MAX_SAFE_INTEGER, callback: null }; const electrumCallbacks = { onConnect: (client, versionInfo) => { logger.info(`Connected to Electrum Server at ${config.ELECTRUM.HOST}:${config.ELECTRUM.PORT} (${JSON.stringify(versionInfo)})`); }, From c4d13fb5b78c83b563a62f10f9c4678573a18c0d Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 23 Mar 2023 15:56:30 +0900 Subject: [PATCH 140/782] Bumping electrum-client --- backend/package-lock.json | 14 +++++++------- backend/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 8b5f759f7..26fe04541 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -10,7 +10,7 @@ "license": "GNU Affero General Public License v3.0", "dependencies": { "@babel/core": "^7.20.12", - "@mempool/electrum-client": "^1.1.7", + "@mempool/electrum-client": "1.1.9", "@types/node": "^16.18.11", "axios": "~0.27.2", "bitcoinjs-lib": "~6.1.0", @@ -1272,9 +1272,9 @@ } }, "node_modules/@mempool/electrum-client": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@mempool/electrum-client/-/electrum-client-1.1.8.tgz", - "integrity": "sha512-6YP6UJstlk2GgC++NwPJthMPvLozyEMlqPq7RjvIWSwrL0smvM0Q0PAOohwZJtJFDWspuEUtNRF7aHQT2ztnYg==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mempool/electrum-client/-/electrum-client-1.1.9.tgz", + "integrity": "sha512-mlvPiCzUlaETpYW3i6V87A24jjMYgsebaXtUo3WQyyLnYUuxs0KiXQ2mnKh3h15j8Xg/hfxeGIi+5OC9u0nftQ==", "engines": { "node": ">=6" } @@ -7248,9 +7248,9 @@ } }, "@mempool/electrum-client": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@mempool/electrum-client/-/electrum-client-1.1.8.tgz", - "integrity": "sha512-6YP6UJstlk2GgC++NwPJthMPvLozyEMlqPq7RjvIWSwrL0smvM0Q0PAOohwZJtJFDWspuEUtNRF7aHQT2ztnYg==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mempool/electrum-client/-/electrum-client-1.1.9.tgz", + "integrity": "sha512-mlvPiCzUlaETpYW3i6V87A24jjMYgsebaXtUo3WQyyLnYUuxs0KiXQ2mnKh3h15j8Xg/hfxeGIi+5OC9u0nftQ==" }, "@nodelib/fs.scandir": { "version": "2.1.5", diff --git a/backend/package.json b/backend/package.json index 9c1b3a12a..efb051281 100644 --- a/backend/package.json +++ b/backend/package.json @@ -35,7 +35,7 @@ }, "dependencies": { "@babel/core": "^7.20.12", - "@mempool/electrum-client": "^1.1.7", + "@mempool/electrum-client": "1.1.9", "@types/node": "^16.18.11", "axios": "~0.27.2", "bitcoinjs-lib": "~6.1.0", From c0c37922c350eb0d7c3d7a2e6e79ed3ea4d724bf Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 23 Mar 2023 03:12:44 -0400 Subject: [PATCH 141/782] Change raspibolt logo to raspiblitz logo --- .../src/app/components/about/about.component.html | 2 +- frontend/src/resources/profile/raspiblitz.svg | 1 + .../profile/{raspiblitz.jpg => raspibolt.jpg} | Bin 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 frontend/src/resources/profile/raspiblitz.svg rename frontend/src/resources/profile/{raspiblitz.jpg => raspibolt.jpg} (100%) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index ad2fd7bf7..64bfa4c7b 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -201,7 +201,7 @@ Umbrel
    - + RaspiBlitz diff --git a/frontend/src/resources/profile/raspiblitz.svg b/frontend/src/resources/profile/raspiblitz.svg new file mode 100644 index 000000000..3b335e56a --- /dev/null +++ b/frontend/src/resources/profile/raspiblitz.svg @@ -0,0 +1 @@ +RaspiBlitz_Logo_Icon_Negative diff --git a/frontend/src/resources/profile/raspiblitz.jpg b/frontend/src/resources/profile/raspibolt.jpg similarity index 100% rename from frontend/src/resources/profile/raspiblitz.jpg rename to frontend/src/resources/profile/raspibolt.jpg From b3e36fdd995d1388d5d4e9ec52a0f4c7f0bdbd62 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 23 Mar 2023 17:23:32 +0900 Subject: [PATCH 142/782] Hotfix infinite scroll (need to apply a real fix) --- .../transactions-list/transactions-list.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.ts b/frontend/src/app/components/transactions-list/transactions-list.component.ts index f499300c1..b71046f68 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.ts +++ b/frontend/src/app/components/transactions-list/transactions-list.component.ts @@ -184,9 +184,9 @@ export class TransactionsListComponent implements OnInit, OnChanges { onScroll(): void { const scrollHeight = document.body.scrollHeight; const scrollTop = document.documentElement.scrollTop; - if (scrollHeight > 0){ + if (scrollHeight > 0) { const percentageScrolled = scrollTop * 100 / scrollHeight; - if (percentageScrolled > 70){ + if (percentageScrolled > 50) { this.loadMore.emit(); } } From 9d9e0976ae69044e6a578fd5c94f9bcffe1895e6 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 23 Mar 2023 17:41:24 +0900 Subject: [PATCH 143/782] Pull from transifex --- frontend/src/locale/messages.nl.xlf | 5 +++++ frontend/src/locale/messages.tr.xlf | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/locale/messages.nl.xlf b/frontend/src/locale/messages.nl.xlf index 999a63145..26e9d3134 100644 --- a/frontend/src/locale/messages.nl.xlf +++ b/frontend/src/locale/messages.nl.xlf @@ -3283,6 +3283,7 @@ Average block time + Gemiddelde bloktijd src/app/components/difficulty/difficulty.component.html 42,45 @@ -3984,6 +3985,7 @@ blocks + blokken src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -6713,6 +6715,7 @@ Clearnet and Darknet + Clearnet en Darknet src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6724,6 +6727,7 @@ Clearnet Only (IPv4, IPv6) + Alleen Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6735,6 +6739,7 @@ Darknet Only (Tor, I2P, cjdns) + Alleen Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 diff --git a/frontend/src/locale/messages.tr.xlf b/frontend/src/locale/messages.tr.xlf index caf321422..5b0562285 100644 --- a/frontend/src/locale/messages.tr.xlf +++ b/frontend/src/locale/messages.tr.xlf @@ -4452,7 +4452,7 @@ Go to "" - "" 'a git + "" 'e git src/app/components/search-form/search-results/search-results.component.html 52 From 5681ae3f5c6dcea490e0b86121a396d9e1214cac Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 23 Mar 2023 22:45:07 +0900 Subject: [PATCH 144/782] Pull from transifex --- frontend/src/locale/messages.ar.xlf | 4 ++++ frontend/src/locale/messages.nl.xlf | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/frontend/src/locale/messages.ar.xlf b/frontend/src/locale/messages.ar.xlf index 6c00d6e07..6635d464c 100644 --- a/frontend/src/locale/messages.ar.xlf +++ b/frontend/src/locale/messages.ar.xlf @@ -3203,6 +3203,7 @@ blocks expected + الكتل المتوقعة src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + الكتله المتوقعه src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + الكتل المعدنه src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + الكتله المعدنه src/app/components/difficulty/difficulty-tooltip.component.html 19 diff --git a/frontend/src/locale/messages.nl.xlf b/frontend/src/locale/messages.nl.xlf index 26e9d3134..3c33f65c6 100644 --- a/frontend/src/locale/messages.nl.xlf +++ b/frontend/src/locale/messages.nl.xlf @@ -3203,6 +3203,7 @@ blocks expected + blokken verwacht src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + blok verwacht src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + blokken gemined src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + blok gemined src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + Nog blokken over src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + Nog blok over src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + blokken verder src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + blok verder src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + blokken achter src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + blok achter src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -4005,6 +4015,7 @@ Other () + Ander () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -6764,6 +6775,7 @@ nodes + nodes src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 From 1fd85b729d8928b84b9624b1c811372b426515ac Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 24 Mar 2023 09:47:08 +0900 Subject: [PATCH 145/782] handle stale transactions in block templates --- backend/src/api/disk-cache.ts | 4 +++- backend/src/api/mempool-blocks.ts | 15 +++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 7180c6f51..0ec502c08 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -43,7 +43,9 @@ class DiskCache { const mempool = memPool.getMempool(); const mempoolArray: TransactionExtended[] = []; for (const tx in mempool) { - mempoolArray.push(mempool[tx]); + if (mempool[tx] && !mempool[tx].deleteAfter) { + mempoolArray.push(mempool[tx]); + } } Common.shuffleArray(mempoolArray); diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 3c2feb0e2..ff502be24 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -151,7 +151,7 @@ class MempoolBlocks { // prepare a stripped down version of the mempool with only the minimum necessary data // to reduce the overhead of passing this data to the worker thread const strippedMempool: { [txid: string]: ThreadTransaction } = {}; - Object.values(newMempool).forEach(entry => { + Object.values(newMempool).filter(tx => !tx.deleteAfter).forEach(entry => { strippedMempool[entry.txid] = { txid: entry.txid, fee: entry.fee, @@ -186,7 +186,9 @@ class MempoolBlocks { this.txSelectionWorker?.once('error', reject); }); this.txSelectionWorker.postMessage({ type: 'set', mempool: strippedMempool }); - const { blocks, clusters } = await workerResultPromise; + let { blocks, clusters } = await workerResultPromise; + // filter out stale transactions + blocks = blocks.map(block => block.filter(tx => (tx.txid && tx.txid in newMempool))); // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); @@ -228,7 +230,9 @@ class MempoolBlocks { this.txSelectionWorker?.once('error', reject); }); this.txSelectionWorker.postMessage({ type: 'update', added: addedStripped, removed }); - const { blocks, clusters } = await workerResultPromise; + let { blocks, clusters } = await workerResultPromise; + // filter out stale transactions + blocks = blocks.map(block => block.filter(tx => (tx.txid && tx.txid in newMempool))); // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); @@ -243,7 +247,7 @@ class MempoolBlocks { // update this thread's mempool with the results blocks.forEach(block => { block.forEach(tx => { - if (tx.txid in mempool) { + if (tx.txid && tx.txid in mempool) { if (tx.effectiveFeePerVsize != null) { mempool[tx.txid].effectiveFeePerVsize = tx.effectiveFeePerVsize; } @@ -253,6 +257,9 @@ class MempoolBlocks { const cluster = clusters[tx.cpfpRoot]; let matched = false; cluster.forEach(txid => { + if (!txid || !mempool[txid]) { + return; + } if (txid === tx.txid) { matched = true; } else { From 28de93d0ff4e6c932b805f412e787515bbf45ce2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 24 Mar 2023 09:48:08 +0900 Subject: [PATCH 146/782] move lazy tx deletion into main loop --- backend/src/api/mempool.ts | 3 +-- backend/src/index.ts | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index db5de82b2..1be1faceb 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -38,7 +38,6 @@ class Mempool { constructor() { setInterval(this.updateTxPerSecond.bind(this), 1000); - setInterval(this.deleteExpiredTransactions.bind(this), 20000); } /** @@ -256,7 +255,7 @@ class Mempool { } } - private deleteExpiredTransactions() { + public deleteExpiredTransactions() { const now = new Date().getTime(); for (const tx in this.mempoolCache) { const lazyDeleteAt = this.mempoolCache[tx].deleteAfter; diff --git a/backend/src/index.ts b/backend/src/index.ts index ccba83be9..a34ffd21b 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -178,6 +178,7 @@ class Server { logger.debug(msg); } } + memPool.deleteExpiredTransactions(); await blocks.$updateBlocks(); await memPool.$updateMempool(); indexer.$run(); From 61f24562fdeea946b59684274c169da34796f324 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 24 Mar 2023 09:49:02 +0900 Subject: [PATCH 147/782] tighten sanity checks in block audit --- backend/src/api/audit.ts | 68 ++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index d0d677740..639066af0 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -39,17 +39,19 @@ class Audit { } else { isCensored[txid] = true; } - displacedWeight += mempool[txid].weight; + displacedWeight += mempool[txid]?.weight || 0; } else { - matchedWeight += mempool[txid].weight; + matchedWeight += mempool[txid]?.weight || 0; } - projectedWeight += mempool[txid].weight; + projectedWeight += mempool[txid]?.weight || 0; inTemplate[txid] = true; } - displacedWeight += (4000 - transactions[0].weight); - projectedWeight += transactions[0].weight; - matchedWeight += transactions[0].weight; + if (transactions[0]) { + displacedWeight += (4000 - transactions[0].weight); + projectedWeight += transactions[0].weight; + matchedWeight += transactions[0].weight; + } // we can expect an honest miner to include 'displaced' transactions in place of recent arrivals and censored txs // these displaced transactions should occupy the first N weight units of the next projected block @@ -59,19 +61,22 @@ class Audit { let failures = 0; while (projectedBlocks[1] && index < projectedBlocks[1].transactionIds.length && failures < 500) { const txid = projectedBlocks[1].transactionIds[index]; - const fits = (mempool[txid].weight - displacedWeightRemaining) < 4000; - const feeMatches = mempool[txid].effectiveFeePerVsize >= lastFeeRate; - if (fits || feeMatches) { - isDisplaced[txid] = true; - if (fits) { - lastFeeRate = Math.min(lastFeeRate, mempool[txid].effectiveFeePerVsize); + const tx = mempool[txid]; + if (tx) { + const fits = (tx.weight - displacedWeightRemaining) < 4000; + const feeMatches = tx.effectiveFeePerVsize >= lastFeeRate; + if (fits || feeMatches) { + isDisplaced[txid] = true; + if (fits) { + lastFeeRate = Math.min(lastFeeRate, tx.effectiveFeePerVsize); + } + if (tx.firstSeen == null || (now - (tx?.firstSeen || 0)) > PROPAGATION_MARGIN) { + displacedWeightRemaining -= tx.weight; + } + failures = 0; + } else { + failures++; } - if (mempool[txid].firstSeen == null || (now - (mempool[txid]?.firstSeen || 0)) > PROPAGATION_MARGIN) { - displacedWeightRemaining -= mempool[txid].weight; - } - failures = 0; - } else { - failures++; } index++; } @@ -108,20 +113,23 @@ class Audit { index = projectedBlocks[0].transactionIds.length - 1; while (index >= 0) { const txid = projectedBlocks[0].transactionIds[index]; - if (overflowWeightRemaining > 0) { - if (isCensored[txid]) { - delete isCensored[txid]; - } - if (mempool[txid].effectiveFeePerVsize > maxOverflowRate) { - maxOverflowRate = mempool[txid].effectiveFeePerVsize; - rateThreshold = (Math.ceil(maxOverflowRate * 100) / 100) + 0.005; - } - } else if (mempool[txid].effectiveFeePerVsize <= rateThreshold) { // tolerance of 0.01 sat/vb + rounding - if (isCensored[txid]) { - delete isCensored[txid]; + const tx = mempool[txid]; + if (tx) { + if (overflowWeightRemaining > 0) { + if (isCensored[txid]) { + delete isCensored[txid]; + } + if (tx.effectiveFeePerVsize > maxOverflowRate) { + maxOverflowRate = tx.effectiveFeePerVsize; + rateThreshold = (Math.ceil(maxOverflowRate * 100) / 100) + 0.005; + } + } else if (tx.effectiveFeePerVsize <= rateThreshold) { // tolerance of 0.01 sat/vb + rounding + if (isCensored[txid]) { + delete isCensored[txid]; + } } + overflowWeightRemaining -= (mempool[txid]?.weight || 0); } - overflowWeightRemaining -= (mempool[txid]?.weight || 0); index--; } From ad3785ff417e07b1edc7b7ee3247b3da03cf1973 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Fri, 24 Mar 2023 21:22:49 -0400 Subject: [PATCH 148/782] Fix anchor link expand on mobile for mempool faq --- frontend/src/app/docs/api-docs/api-docs-data.ts | 2 +- frontend/src/app/docs/api-docs/api-docs.component.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/docs/api-docs/api-docs-data.ts b/frontend/src/app/docs/api-docs/api-docs-data.ts index e6ed38a77..53e6bbdec 100644 --- a/frontend/src/app/docs/api-docs/api-docs-data.ts +++ b/frontend/src/app/docs/api-docs/api-docs-data.ts @@ -8863,7 +8863,7 @@ export const faqData = [ type: "endpoint", category: "advanced", showConditions: bitcoinNetworks, - fragment: "how-big-is-mempool-used-by-mempool.space", + fragment: "how-big-is-mempool-used-by-mempool-space", title: "How big is the mempool used by mempool.space?", options: { officialOnly: true }, }, diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html index 8d274625a..392cda19e 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -207,7 +207,7 @@

    When a Bitcoin transaction is made, it is stored in a Bitcoin node's mempool before it is confirmed into a block. When the rate of incoming transactions exceeds the rate transactions are confirmed, the mempool grows in size.

    By default, Bitcoin Core allocates 300MB of memory for its mempool, so when a node's mempool grows big enough to use all 300MB of allocated memory, we say it's "full".

    Once a node's mempool is using all of its allocated memory, it will start rejecting new transactions below a certain feerate threshold—so when this is the case, be extra sure to set a feerate that (at a minimum) exceeds that threshold. The current threshold feerate (and memory usage) are displayed right on Mempool's front page.

    - +

    mempool.space uses multiple Bitcoin nodes to obtain data: some with the default 300MB mempool memory limit (call these Small Nodes) and others with a much larger mempool memory limit (call these Big Nodes).

    Many nodes on the Bitcoin network are configured to run with the default 300MB mempool memory setting. When all 300MB of memory are used up, such nodes will reject transactions below a certain threshold feerate. Running Small Nodes allows mempool.space to tell you what this threshold feerate is—this is the "Purging" feerate that shows on the front page when mempools are full, which you can use to be reasonably sure that your transaction will be widely propagated.

    Big Node mempools are so big that they don't need to reject (or purge) transactions. Such nodes allow for mempool.space to provide you with information on any pending transaction it has received—no matter how congested the mempool is, and no matter how low-feerate or low-priority the transaction is.

    From 8486c1117d5dd178289602792870abf1025bb21b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 26 Mar 2023 05:41:31 +0900 Subject: [PATCH 149/782] log warnings for unexpectedly missing txs --- backend/src/api/audit.ts | 5 +++++ backend/src/api/mempool-blocks.ts | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index 639066af0..6e1cb3787 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -1,4 +1,5 @@ import config from '../config'; +import logger from '../logger'; import { TransactionExtended, MempoolBlockWithTransactions } from '../mempool.interfaces'; const PROPAGATION_MARGIN = 180; // in seconds, time since a transaction is first seen after which it is assumed to have propagated to all miners @@ -77,6 +78,8 @@ class Audit { } else { failures++; } + } else { + logger.warn('projected transaction missing from mempool cache'); } index++; } @@ -129,6 +132,8 @@ class Audit { } } overflowWeightRemaining -= (mempool[txid]?.weight || 0); + } else { + logger.warn('projected transaction missing from mempool cache'); } index--; } diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index ff502be24..0d6186ce1 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -188,7 +188,12 @@ class MempoolBlocks { this.txSelectionWorker.postMessage({ type: 'set', mempool: strippedMempool }); let { blocks, clusters } = await workerResultPromise; // filter out stale transactions + const unfilteredCount = blocks.reduce((total, block) => { return total + block.length; }, 0); blocks = blocks.map(block => block.filter(tx => (tx.txid && tx.txid in newMempool))); + const filteredCount = blocks.reduce((total, block) => { return total + block.length; }, 0); + if (filteredCount < unfilteredCount) { + logger.warn(`tx selection worker thread returned ${unfilteredCount - filteredCount} stale transactions from makeBlockTemplates`); + } // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); @@ -232,7 +237,12 @@ class MempoolBlocks { this.txSelectionWorker.postMessage({ type: 'update', added: addedStripped, removed }); let { blocks, clusters } = await workerResultPromise; // filter out stale transactions + const unfilteredCount = blocks.reduce((total, block) => { return total + block.length; }, 0); blocks = blocks.map(block => block.filter(tx => (tx.txid && tx.txid in newMempool))); + const filteredCount = blocks.reduce((total, block) => { return total + block.length; }, 0); + if (filteredCount < unfilteredCount) { + logger.warn(`tx selection worker thread returned ${unfilteredCount - filteredCount} stale transactions from updateBlockTemplates`); + } // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); @@ -258,6 +268,7 @@ class MempoolBlocks { let matched = false; cluster.forEach(txid => { if (!txid || !mempool[txid]) { + logger.warn('projected transaction ancestor missing from mempool cache'); return; } if (txid === tx.txid) { @@ -280,6 +291,8 @@ class MempoolBlocks { mempool[tx.txid].bestDescendant = null; } mempool[tx.txid].cpfpChecked = tx.cpfpChecked; + } else { + logger.warn('projected transaction missing from mempool cache'); } }); }); From 5f60cb821ac55c87f59087329aba168515eb4042 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 26 Mar 2023 07:27:11 +0900 Subject: [PATCH 150/782] Fix difficulty adjustment start-of-epoch edge cases --- backend/src/api/difficulty-adjustment.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/difficulty-adjustment.ts b/backend/src/api/difficulty-adjustment.ts index c4e2abf31..0ddf2b540 100644 --- a/backend/src/api/difficulty-adjustment.ts +++ b/backend/src/api/difficulty-adjustment.ts @@ -29,7 +29,7 @@ export function calcDifficultyAdjustment( const BLOCK_SECONDS_TARGET = 600; // Bitcoin mainnet const TESTNET_MAX_BLOCK_SECONDS = 1200; // Bitcoin testnet - const diffSeconds = nowSeconds - DATime; + const diffSeconds = Math.max(0, nowSeconds - DATime); const blocksInEpoch = (blockHeight >= 0) ? blockHeight % EPOCH_BLOCK_LENGTH : 0; const progressPercent = (blockHeight >= 0) ? blocksInEpoch / EPOCH_BLOCK_LENGTH * 100 : 100; const remainingBlocks = EPOCH_BLOCK_LENGTH - blocksInEpoch; @@ -37,7 +37,7 @@ export function calcDifficultyAdjustment( const expectedBlocks = diffSeconds / BLOCK_SECONDS_TARGET; let difficultyChange = 0; - let timeAvgSecs = diffSeconds / blocksInEpoch; + let timeAvgSecs = blocksInEpoch ? diffSeconds / blocksInEpoch : BLOCK_SECONDS_TARGET; // Only calculate the estimate once we have 7.2% of blocks in current epoch if (blocksInEpoch >= ESTIMATE_LAG_BLOCKS) { difficultyChange = (BLOCK_SECONDS_TARGET / timeAvgSecs - 1) * 100; From edfbede704356bf497953d772c3e7158fa1f8af4 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 26 Mar 2023 09:05:41 +0900 Subject: [PATCH 151/782] Don't send back difficulty adjustment info --- backend/src/api/websocket-handler.ts | 9 ++++++--- backend/src/mempool.interfaces.ts | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index c89179ce7..7dbd48c46 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -211,6 +211,7 @@ class WebsocketHandler { if (!_blocks) { _blocks = blocks.getBlocks().slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT); } + const da = difficultyAdjustment.getDifficultyAdjustment(); return { 'mempoolInfo': memPool.getMempoolInfo(), 'vBytesPerSecond': memPool.getVBytesPerSecond(), @@ -220,7 +221,7 @@ class WebsocketHandler { 'transactions': memPool.getLatestTransactions(), 'backendInfo': backendInfo.getBackendInfo(), 'loadingIndicators': loadingIndicators.getLoadingIndicators(), - 'da': difficultyAdjustment.getDifficultyAdjustment(), + 'da': da?.previousTime ? da : undefined, 'fees': feeApi.getRecommendedFee(), ...this.extraInitProperties }; @@ -278,7 +279,9 @@ class WebsocketHandler { response['mempoolInfo'] = mempoolInfo; response['vBytesPerSecond'] = vBytesPerSecond; response['transactions'] = newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx)); - response['da'] = da; + if (da?.previousTime) { + response['da'] = da; + } response['fees'] = recommendedFees; } @@ -505,7 +508,7 @@ class WebsocketHandler { const response = { 'block': block, 'mempoolInfo': memPool.getMempoolInfo(), - 'da': da, + 'da': da?.previousTime ? da : undefined, 'fees': fees, }; diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 9961632c3..28c1e21b5 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -309,9 +309,11 @@ export interface IDifficultyAdjustment { remainingBlocks: number; remainingTime: number; previousRetarget: number; + previousTime: number; nextRetargetHeight: number; timeAvg: number; timeOffset: number; + expectedBlocks: number; } export interface IndexedDifficultyAdjustment { From 85c2f0ba300ec761f4090fafffbfd9c05718e775 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 26 Mar 2023 16:46:20 +0900 Subject: [PATCH 152/782] Pull from transifex --- frontend/src/locale/messages.ar.xlf | 20 ++++++++++++++++++++ frontend/src/locale/messages.cs.xlf | 14 +++++++++++--- frontend/src/locale/messages.da.xlf | 10 ++++++++++ frontend/src/locale/messages.es.xlf | 6 +++--- frontend/src/locale/messages.nb.xlf | 8 ++++---- 5 files changed, 48 insertions(+), 10 deletions(-) diff --git a/frontend/src/locale/messages.ar.xlf b/frontend/src/locale/messages.ar.xlf index 6635d464c..8431eb666 100644 --- a/frontend/src/locale/messages.ar.xlf +++ b/frontend/src/locale/messages.ar.xlf @@ -3239,6 +3239,7 @@
    blocks remaining + الكتل المتبقية src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3247,6 +3248,7 @@ block remaining + الكتلة المتبقية src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3255,6 +3257,7 @@ blocks ahead + كتل قادمه src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3263,6 +3266,7 @@ block ahead + كتله قادمه src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3271,6 +3275,7 @@ blocks behind + كتل وراء src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3279,6 +3284,7 @@ block behind + كتله وراء src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3287,6 +3293,7 @@ Average block time + متوسط وقت الكتل src/app/components/difficulty/difficulty.component.html 42,45 @@ -3988,6 +3995,7 @@ blocks + كتل src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4007,6 +4015,7 @@ Other () + اخرى () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -4569,6 +4578,7 @@ In ~ + في ~ src/app/components/time/time.component.ts 126 @@ -5352,6 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + يوفر mempool.space بيانات حول شبكة البتكوين. لا يمكننا مساعدتك في استرداد الأموال ، وتأكيد معاملتك بشكل أسرع ، وما إلى ذلك. src/app/docs/api-docs/api-docs.component.html 13 @@ -5877,6 +5888,7 @@ Force closed with penalty + أغلقت بالقوة هناك خطآ src/app/lightning/channel/closing-type/closing-type.component.ts 28 @@ -6010,6 +6022,7 @@ avg + متوسط src/app/lightning/channels-statistics/channels-statistics.component.html 3,5 @@ -6018,6 +6031,7 @@ med + متوسط src/app/lightning/channels-statistics/channels-statistics.component.html 6,9 @@ -6412,6 +6426,7 @@ Outgoing Fees + الرسوم الصادرة src/app/lightning/node-fee-chart/node-fee-chart.component.ts 170 @@ -6423,6 +6438,7 @@ Incoming Fees + رسوم واردة src/app/lightning/node-fee-chart/node-fee-chart.component.ts 178 @@ -6710,6 +6726,7 @@ Clearnet and Darknet + كليرنت ودارك نت src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 164,161 @@ -6721,6 +6738,7 @@ Clearnet Only (IPv4, IPv6) + كليرنت فقط (IPv4 ، IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6732,6 +6750,7 @@ Darknet Only (Tor, I2P, cjdns) + الداركنت فقط (Tor، I2P، cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6756,6 +6775,7 @@ nodes + العقد src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 diff --git a/frontend/src/locale/messages.cs.xlf b/frontend/src/locale/messages.cs.xlf index fb249f4a1..86a8afc34 100644 --- a/frontend/src/locale/messages.cs.xlf +++ b/frontend/src/locale/messages.cs.xlf @@ -3235,6 +3235,7 @@ blocks remaining + zbývá bloků src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3244,7 @@ block remaining + zbývá blok src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3253,7 @@ blocks ahead + za bloků src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3262,7 @@ block ahead + za blok src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3271,7 @@ blocks behind + Před bloků src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3280,7 @@ block behind + Před blok src/app/components/difficulty/difficulty-tooltip.component.html 35 @@ -3283,6 +3289,7 @@ Average block time + Průměrná perioda bloků src/app/components/difficulty/difficulty.component.html 42,45 @@ -3984,6 +3991,7 @@ blocks + bloků src/app/components/pool-ranking/pool-ranking.component.ts 165,163 @@ -4505,7 +4513,7 @@ ago - před + Před src/app/components/time/time.component.ts 103 @@ -7104,7 +7112,7 @@ minute - minuta + min src/app/shared/i18n/dates.ts 13 @@ -7112,7 +7120,7 @@ minutes - minuty + min src/app/shared/i18n/dates.ts 14 diff --git a/frontend/src/locale/messages.da.xlf b/frontend/src/locale/messages.da.xlf index 0e3a2a1f8..685648f28 100644 --- a/frontend/src/locale/messages.da.xlf +++ b/frontend/src/locale/messages.da.xlf @@ -3203,6 +3203,7 @@ blocks expected + blokke forventes src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + blok forventet src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + blokke fundet src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + blok fundet src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3235,6 +3239,7 @@ blocks remaining + blokke tilbage src/app/components/difficulty/difficulty-tooltip.component.html 24 @@ -3243,6 +3248,7 @@ block remaining + blok tilbage src/app/components/difficulty/difficulty-tooltip.component.html 25 @@ -3251,6 +3257,7 @@ blocks ahead + blokke foran src/app/components/difficulty/difficulty-tooltip.component.html 29 @@ -3259,6 +3266,7 @@ block ahead + blok foran src/app/components/difficulty/difficulty-tooltip.component.html 30 @@ -3267,6 +3275,7 @@ blocks behind + blokke bagved src/app/components/difficulty/difficulty-tooltip.component.html 34 @@ -3275,6 +3284,7 @@ block behind + blok bagved src/app/components/difficulty/difficulty-tooltip.component.html 35 diff --git a/frontend/src/locale/messages.es.xlf b/frontend/src/locale/messages.es.xlf index 8baaf9532..278018339 100644 --- a/frontend/src/locale/messages.es.xlf +++ b/frontend/src/locale/messages.es.xlf @@ -432,7 +432,7 @@ Timestamp - Sello de tiempo + Timestamp src/app/bisq/bisq-block/bisq-block.component.html 23 @@ -1440,7 +1440,7 @@ The Mempool Open Source Project - Proyecto de Código Abierto The Mempool + El proyecto de código abierto Mempool src/app/components/about/about.component.html 12,13 @@ -3355,7 +3355,7 @@ Medium Priority - Prioridad media + Media prioridad src/app/components/fees-box/fees-box.component.html 9,10 diff --git a/frontend/src/locale/messages.nb.xlf b/frontend/src/locale/messages.nb.xlf index b47fe1ec3..3931822e3 100644 --- a/frontend/src/locale/messages.nb.xlf +++ b/frontend/src/locale/messages.nb.xlf @@ -3775,7 +3775,7 @@ Reward stats - Belonnings-statistikk + Belønnings-statistikk src/app/components/mining-dashboard/mining-dashboard.component.html 9 @@ -3850,7 +3850,7 @@ Pools luck - Utvinningsgrupper flaks + Flaks src/app/components/pool-ranking/pool-ranking.component.html 9,11 @@ -3877,7 +3877,7 @@ Pools count - Antall utvinningsgrupper + Antall grupper src/app/components/pool-ranking/pool-ranking.component.html 17,19 @@ -4294,7 +4294,7 @@ Avg Block Fees - Gjennomsnittlig blokkavgift + Gj.sn. blokkavgift src/app/components/reward-stats/reward-stats.component.html 17 From c7cab4c877f11499a0f2d13b5f017a8781b301cc Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sun, 26 Mar 2023 17:01:04 +0900 Subject: [PATCH 153/782] Remove difficulty adjustment calculation lag in the backend --- backend/src/api/difficulty-adjustment.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/backend/src/api/difficulty-adjustment.ts b/backend/src/api/difficulty-adjustment.ts index 0ddf2b540..3e953e4c8 100644 --- a/backend/src/api/difficulty-adjustment.ts +++ b/backend/src/api/difficulty-adjustment.ts @@ -24,7 +24,6 @@ export function calcDifficultyAdjustment( network: string, latestBlockTimestamp: number, ): DifficultyAdjustment { - const ESTIMATE_LAG_BLOCKS = 146; // For first 7.2% of epoch, don't estimate. const EPOCH_BLOCK_LENGTH = 2016; // Bitcoin mainnet const BLOCK_SECONDS_TARGET = 600; // Bitcoin mainnet const TESTNET_MAX_BLOCK_SECONDS = 1200; // Bitcoin testnet @@ -38,17 +37,15 @@ export function calcDifficultyAdjustment( let difficultyChange = 0; let timeAvgSecs = blocksInEpoch ? diffSeconds / blocksInEpoch : BLOCK_SECONDS_TARGET; - // Only calculate the estimate once we have 7.2% of blocks in current epoch - if (blocksInEpoch >= ESTIMATE_LAG_BLOCKS) { - difficultyChange = (BLOCK_SECONDS_TARGET / timeAvgSecs - 1) * 100; - // Max increase is x4 (+300%) - if (difficultyChange > 300) { - difficultyChange = 300; - } - // Max decrease is /4 (-75%) - if (difficultyChange < -75) { - difficultyChange = -75; - } + + difficultyChange = (BLOCK_SECONDS_TARGET / timeAvgSecs - 1) * 100; + // Max increase is x4 (+300%) + if (difficultyChange > 300) { + difficultyChange = 300; + } + // Max decrease is /4 (-75%) + if (difficultyChange < -75) { + difficultyChange = -75; } // Testnet difficulty is set to 1 after 20 minutes of no blocks, From 414383638ddcab7a016b90ac2bd9c53aefb862eb Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sun, 26 Mar 2023 17:54:24 +0900 Subject: [PATCH 154/782] Revert regression introduced in #1320 --- backend/src/api/blocks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index f9b14d637..755b3c3ad 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -558,7 +558,7 @@ class Blocks { } while (this.currentBlockHeight < blockHeightTip) { - if (this.currentBlockHeight < blockHeightTip - config.MEMPOOL.INITIAL_BLOCKS_AMOUNT) { + if (this.currentBlockHeight === 0) { this.currentBlockHeight = blockHeightTip; } else { this.currentBlockHeight++; From 855c11f02cef26b3d1cc05761f49d670146b31ae Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 27 Mar 2023 14:51:34 +0900 Subject: [PATCH 155/782] Enabling mempool in lightning prod fixes #3579 --- production/mempool-config.mainnet-lightning.json | 1 - production/mempool-config.signet-lightning.json | 1 - production/mempool-config.testnet-lightning.json | 1 - 3 files changed, 3 deletions(-) diff --git a/production/mempool-config.mainnet-lightning.json b/production/mempool-config.mainnet-lightning.json index 5bcadc584..8f3424a52 100644 --- a/production/mempool-config.mainnet-lightning.json +++ b/production/mempool-config.mainnet-lightning.json @@ -1,6 +1,5 @@ { "MEMPOOL": { - "ENABLED": false, "NETWORK": "mainnet", "BACKEND": "esplora", "HTTP_PORT": 8993, diff --git a/production/mempool-config.signet-lightning.json b/production/mempool-config.signet-lightning.json index df80720f9..cb084f905 100644 --- a/production/mempool-config.signet-lightning.json +++ b/production/mempool-config.signet-lightning.json @@ -1,6 +1,5 @@ { "MEMPOOL": { - "ENABLED": false, "NETWORK": "signet", "BACKEND": "esplora", "HTTP_PORT": 8991, diff --git a/production/mempool-config.testnet-lightning.json b/production/mempool-config.testnet-lightning.json index adc5c04da..ae998d2cc 100644 --- a/production/mempool-config.testnet-lightning.json +++ b/production/mempool-config.testnet-lightning.json @@ -1,6 +1,5 @@ { "MEMPOOL": { - "ENABLED": false, "NETWORK": "testnet", "BACKEND": "esplora", "HTTP_PORT": 8992, From 8788d4f898de16564a108540d5475d834ddedb7a Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 27 Mar 2023 15:10:17 +0900 Subject: [PATCH 156/782] Pull from transifex --- frontend/src/locale/messages.hu.xlf | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/frontend/src/locale/messages.hu.xlf b/frontend/src/locale/messages.hu.xlf index c5237c427..c701bf2f1 100644 --- a/frontend/src/locale/messages.hu.xlf +++ b/frontend/src/locale/messages.hu.xlf @@ -3203,6 +3203,7 @@ blocks expected + blokkra várva src/app/components/difficulty/difficulty-tooltip.component.html 13 @@ -3211,6 +3212,7 @@ block expected + blokk várva src/app/components/difficulty/difficulty-tooltip.component.html 14 @@ -3219,6 +3221,7 @@ blocks mined + blokk bányászva src/app/components/difficulty/difficulty-tooltip.component.html 18 @@ -3227,6 +3230,7 @@ block mined + blokk bányászva src/app/components/difficulty/difficulty-tooltip.component.html 19 @@ -3667,6 +3671,7 @@ Indexing network hashrate + Hálózati hashrate indexelése src/app/components/indexing-progress/indexing-progress.component.html 2 @@ -3881,6 +3886,7 @@ How many unique pools found at least one block over the past week. + Hány egyedi pool talált legalább egy blokkot az elmúlt héten. src/app/components/pool-ranking/pool-ranking.component.html 19,23 @@ -3906,6 +3912,7 @@ The number of blocks found over the past week. + Az elmúlt héten talált blokkok száma. src/app/components/pool-ranking/pool-ranking.component.html 27,31 @@ -4278,6 +4285,7 @@ Amount being paid to miners in the past 144 blocks + A bányászoknak fizetett összeg az elmúlt 144 blokkban src/app/components/reward-stats/reward-stats.component.html 6,8 @@ -4299,6 +4307,7 @@ Average fees per block in the past 144 blocks + Átlagos díjak blokkonként az elmúlt 144 blokkban src/app/components/reward-stats/reward-stats.component.html 18,20 @@ -5049,6 +5058,7 @@ Show more inputs to reveal fee data + További bemenetek megjelenítése a díjadatok megjelenítéséhez src/app/components/transactions-list/transactions-list.component.html 290,293 @@ -5110,6 +5120,7 @@ This transaction saved % on fees by using native SegWit + Ez a tranzakció % -ot takarított meg a díjakból a natív SegWit használatával src/app/components/tx-features/tx-features.component.html 2 @@ -5136,6 +5147,7 @@ This transaction saved % on fees by using SegWit and could save % more by fully upgrading to native SegWit + Ez a tranzakció % -os díjakat takarított meg a SegWit használatával, és további % -os megtakarítást érhetett el, ha teljes mértékben vált a natív SegWitre src/app/components/tx-features/tx-features.component.html 4 @@ -5144,6 +5156,7 @@ This transaction could save % on fees by upgrading to native SegWit or % by upgrading to SegWit-P2SH + Ez a tranzakció % -ot takaríthat meg a díjakból, ha natív SegWitre vált, vagy % -ot, ha SegWit-P2SH-ra frissít src/app/components/tx-features/tx-features.component.html 6 @@ -5152,6 +5165,7 @@ This transaction uses Taproot and thereby saved at least % on fees + Ez a tranzakció Taprootot használ, és ezáltal legalább % -ot takarít meg a díjakon src/app/components/tx-features/tx-features.component.html 12 @@ -5186,6 +5200,7 @@ This transaction uses Taproot and already saved at least % on fees, but could save an additional % by fully using Taproot + Ez a tranzakció Taprootot használ, és már legalább % -ot megtakarított a díjakból, de további % -ot takaríthat meg a Taproot teljes használatával src/app/components/tx-features/tx-features.component.html 14 @@ -5194,6 +5209,7 @@ This transaction could save % on fees by using Taproot + Ez a tranzakció % -ot takaríthat meg a díjakból a Taproot használatával src/app/components/tx-features/tx-features.component.html 16 @@ -5220,6 +5236,7 @@ This transaction supports Replace-By-Fee (RBF) allowing fee bumping + Ez a tranzakció támogatja a Replace-By-Fee (RBF) funkciót, amely lehetővé teszi a díjak felfutását src/app/components/tx-features/tx-features.component.html 28 @@ -5345,6 +5362,7 @@ mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc. + A mempool.space csupán adatokat szolgáltat a Bitcoin hálózatáról. Nem segíthet a pénzeszközök visszaszerzésében, a tranzakció gyorsabb visszaigazolásában stb. src/app/docs/api-docs/api-docs.component.html 13 @@ -5497,6 +5515,7 @@ This channel supports zero base fee routing + Ez a csatorna támogatja a nulla alapdíjas útválasztást src/app/lightning/channel/channel-box/channel-box.component.html 44 @@ -5514,6 +5533,7 @@ This channel does not support zero base fee routing + Ez a csatorna nem támogatja a nulla alapdíjas útválasztást src/app/lightning/channel/channel-box/channel-box.component.html 50 @@ -6925,6 +6945,7 @@ Lightning nodes on ISP: [AS] + Villám nódok az internetszolgáltatón: [MINT] src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts 44 From 93d46d5c5b583387e49d2407d9e0240c5964c494 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 27 Mar 2023 15:12:23 +0900 Subject: [PATCH 157/782] Pull from transifex --- frontend/src/locale/messages.hu.xlf | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frontend/src/locale/messages.hu.xlf b/frontend/src/locale/messages.hu.xlf index c701bf2f1..ef7b232e4 100644 --- a/frontend/src/locale/messages.hu.xlf +++ b/frontend/src/locale/messages.hu.xlf @@ -6066,6 +6066,7 @@ The average fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + Az útválasztási nódok által felszámított átlagos díjtétel, figyelmen kívül hagyva a > 0,5% -os vagy 5000ppm-es díjakat src/app/lightning/channels-statistics/channels-statistics.component.html 28,30 @@ -6087,6 +6088,7 @@ The average base fee charged by routing nodes, ignoring base fees > 5000ppm + Az útválasztási nódok által felszámított átlagos alapdíj, figyelmen kívül hagyva az alapdíjakat > 5000ppm src/app/lightning/channels-statistics/channels-statistics.component.html 43,45 @@ -6113,6 +6115,7 @@ The median fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + Az útválasztási nódok által felszámított medián díjtétel, figyelmen kívül hagyva a > 0,5% vagy 5000 ppm díjakat src/app/lightning/channels-statistics/channels-statistics.component.html 74,76 @@ -6130,6 +6133,7 @@ The median base fee charged by routing nodes, ignoring base fees > 5000ppm + Az útválasztási nódok által felszámított medián alapdíj, figyelmen kívül hagyva a > 5000ppm alapdíjakat src/app/lightning/channels-statistics/channels-statistics.component.html 89,91 @@ -6446,6 +6450,7 @@ Percentage change past week + Százalékos változás a múlt héten src/app/lightning/node-statistics/node-statistics.component.html 5,7 @@ -6563,6 +6568,7 @@ Liquidity ad + Likviditási hirdetés src/app/lightning/node/node.component.html 141,144 @@ -6590,6 +6596,7 @@ Funding weight + A finanszírozás súlya src/app/lightning/node/node.component.html 161,162 @@ -6844,6 +6851,7 @@ How much liquidity is running on nodes advertising at least one clearnet IP address + Mennyi likviditás fut a legalább egy clearnet IP-címet hirdető nódokon src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 8,9 @@ -6865,6 +6873,7 @@ How much liquidity is running on nodes which ISP was not identifiable + Mennyi likviditás fut azon nódokon, amelyek internetszolgáltatója nem volt azonosítható src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 15,16 @@ -6886,6 +6895,7 @@ How much liquidity is running on nodes advertising only Tor addresses + Mennyi likviditás fut a csak Tor-címeket hirdető nódokon src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 22,23 @@ -6894,6 +6904,7 @@ Top 100 ISPs hosting LN nodes + A 100 legjobb LN-nódot szolgáltató internetszolgáltató src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 31,33 @@ -6957,6 +6968,7 @@ Lightning nodes on ISP: + Villámnódok az internetszolgáltatón: src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 2,4 From 9e4ce42b6a23e3de1695a3fa16b6b95c099c705c Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 27 Mar 2023 16:31:02 +0900 Subject: [PATCH 158/782] Pull from transifex (Hebrew) --- frontend/src/locale/messages.he.xlf | 33 +++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/frontend/src/locale/messages.he.xlf b/frontend/src/locale/messages.he.xlf index 1614f3713..2e0d9b61f 100644 --- a/frontend/src/locale/messages.he.xlf +++ b/frontend/src/locale/messages.he.xlf @@ -3549,7 +3549,7 @@ Lightning Nodes Per ISP - צמתי ברק לפי ספקי תשתית + צמתי ברק לפי ספקיות src/app/components/graphs/graphs.component.html 37 @@ -3717,6 +3717,7 @@ Lightning Explorer + חוקר רשת הברק src/app/components/master-page/master-page.component.html 44,47 @@ -4370,6 +4371,7 @@ Explore the full Bitcoin ecosystem + חקור את מרחב רשתות הביטקוין src/app/components/search-form/search-form.component.html 4,5 @@ -5373,6 +5375,7 @@ REST API service + שירותי API src/app/docs/api-docs/api-docs.component.html 42,43 @@ -5491,6 +5494,7 @@ mSats + מיליסאטס src/app/lightning/channel/channel-box/channel-box.component.html 35 @@ -5547,6 +5551,7 @@ Min HTLC + HTLC מינימלי src/app/lightning/channel/channel-box/channel-box.component.html 57 @@ -5555,6 +5560,7 @@ Max HTLC + HTLC מקסימלי src/app/lightning/channel/channel-box/channel-box.component.html 63 @@ -5751,6 +5757,7 @@ ppm + פפ"מ src/app/lightning/channel/channel-preview.component.html 34,35 @@ -6059,6 +6066,7 @@ The average fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + ממוצע העמלות שנגבה בידי צמתי ניתוב, בהתעלמות מתעריף העמלה > 0.5% או 5000 פפ"מ src/app/lightning/channels-statistics/channels-statistics.component.html 28,30 @@ -6080,6 +6088,7 @@ The average base fee charged by routing nodes, ignoring base fees > 5000ppm + ממוצע העמלות שנגבה בידי צמתי ניתוב, בהתעלמות מתעריף העמלה > 5000 פפ"מ src/app/lightning/channels-statistics/channels-statistics.component.html 43,45 @@ -6106,6 +6115,7 @@ The median fee rate charged by routing nodes, ignoring fee rates > 0.5% or 5000ppm + חציון העמלות שנגבה בידי צמתי ניתוב, בהתעלמות תעריף העמלה > 0.5% או 5000 פפ"מ src/app/lightning/channels-statistics/channels-statistics.component.html 74,76 @@ -6123,6 +6133,7 @@ The median base fee charged by routing nodes, ignoring base fees > 5000ppm + חציון העמלות שנגבה על ידי צמתי ניתוב, בהתעלמות מבסיס העמלה > 5000 פפ"מ src/app/lightning/channels-statistics/channels-statistics.component.html 89,91 @@ -6368,6 +6379,7 @@ Liquidity Ranking + דירוג נזילות src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 62 @@ -6392,6 +6404,7 @@ Connectivity Ranking + דירוג חיבוריות src/app/lightning/lightning-dashboard/lightning-dashboard.component.html 76 @@ -6533,7 +6546,7 @@ ISP - ספק אינטרנט + רשת גלויה src/app/lightning/node/node.component.html 89,90 @@ -6555,6 +6568,7 @@ Liquidity ad + פרסומת ליקווידיטי src/app/lightning/node/node.component.html 141,144 @@ -6563,6 +6577,7 @@ Lease fee rate + שיעור עמלת שכירות src/app/lightning/node/node.component.html 147,150 @@ -6572,6 +6587,7 @@ Lease base fee + עמלת בסיס לשכירות src/app/lightning/node/node.component.html 155,157 @@ -6608,6 +6624,7 @@ Compact lease + שכירות קומפקטית src/app/lightning/node/node.component.html 191,193 @@ -6616,6 +6633,7 @@ TLV extension records + תיעוד TLV מורחב src/app/lightning/node/node.component.html 202,205 @@ -6671,6 +6689,7 @@ Lightning Nodes Channels World Map + מפת ערוצי רשת הברק העולמית src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts 69 @@ -6793,6 +6812,7 @@ ISP Count + כמות ספקיות src/app/lightning/nodes-per-country/nodes-per-country.component.html 34,38 @@ -6801,6 +6821,7 @@ Top ISP + ספקיות מובילות src/app/lightning/nodes-per-country/nodes-per-country.component.html 38,40 @@ -6830,6 +6851,7 @@ How much liquidity is running on nodes advertising at least one clearnet IP address + כמה ליקווידיטי רץ על צמתים המפרסמים לפחות כתובת IP גלויה אחת src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 8,9 @@ -6851,6 +6873,7 @@ How much liquidity is running on nodes which ISP was not identifiable + כמה ליקווידיטי רץ על צמתים ללא ספקית רשת מזוהה src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 15,16 @@ -6872,6 +6895,7 @@ How much liquidity is running on nodes advertising only Tor addresses + כמה ליקווידיטי רץ על צמתים המפרסמים כתובות תור בלבד src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 22,23 @@ -6880,6 +6904,7 @@ Top 100 ISPs hosting LN nodes + 100 הספקיות המובילות באיחסון צמתי רשת הברק src/app/lightning/nodes-per-isp-chart/nodes-per-isp-chart.component.html 31,33 @@ -6900,6 +6925,7 @@ Lightning ISP + ספקיות ברק src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.html 3,5 @@ -6930,6 +6956,7 @@ Lightning nodes on ISP: [AS] + צמתי ברק אצל ספקיות: ] src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.ts 44 @@ -6941,6 +6968,7 @@ Lightning nodes on ISP: + צמתי ברק ברשת הגלויה: src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 2,4 @@ -6949,6 +6977,7 @@ ASN + ASN src/app/lightning/nodes-per-isp/nodes-per-isp.component.html 11,14 From 34eef3553bf13e1ed9d859bdbd6c6499de6f7e41 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 27 Mar 2023 19:39:50 +0900 Subject: [PATCH 159/782] Reset pools sha db state --- backend/src/api/database-migration.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index ab38b0543..11039815f 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -497,6 +497,7 @@ class DatabaseMigration { this.uniqueLog(logger.notice, this.blocksTruncatedMessage); await this.$executeQuery('DELETE FROM `pools`'); await this.$executeQuery('ALTER TABLE pools AUTO_INCREMENT = 1'); + await this.$executeQuery(`UPDATE state SET string = NULL WHERE name = 'pools_json_sha'`); this.uniqueLog(logger.notice, '`pools` table has been truncated`'); await this.updateToSchemaVersion(56); } From f1361a698d781d211080f1102a5a141bdb90c34a Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Mon, 27 Mar 2023 06:50:30 -0400 Subject: [PATCH 160/782] Switch mynode capitalization to match branding --- frontend/src/app/components/about/about.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 64bfa4c7b..f1547bd81 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -204,9 +204,9 @@ RaspiBlitz
    - + - MyNode + myNode From 2b3d132db61450222978bb76693a4a351225dbfa Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Mon, 27 Mar 2023 07:26:06 -0400 Subject: [PATCH 161/782] Update mynode logo --- .../app/components/about/about.component.html | 2 +- frontend/src/resources/profile/mynodebtc.png | Bin 0 -> 10559 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 frontend/src/resources/profile/mynodebtc.png diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index f1547bd81..73b120e1e 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -205,7 +205,7 @@ RaspiBlitz - + myNode diff --git a/frontend/src/resources/profile/mynodebtc.png b/frontend/src/resources/profile/mynodebtc.png new file mode 100644 index 0000000000000000000000000000000000000000..db31786ce2b7fa0d42f49b287599402e3b592a6d GIT binary patch literal 10559 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 Date: Tue, 28 Mar 2023 12:11:27 +0900 Subject: [PATCH 162/782] Pull from transifex (Vietnamese) --- frontend/src/locale/messages.vi.xlf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/locale/messages.vi.xlf b/frontend/src/locale/messages.vi.xlf index 7f4eb12b7..1de98c653 100644 --- a/frontend/src/locale/messages.vi.xlf +++ b/frontend/src/locale/messages.vi.xlf @@ -3283,6 +3283,7 @@ Average block time + Thời gian khối trung bình src/app/components/difficulty/difficulty.component.html 42,45 @@ -4004,6 +4005,7 @@ Other () + Khác () src/app/components/pool-ranking/pool-ranking.component.ts 201 @@ -6726,6 +6728,7 @@ Clearnet Only (IPv4, IPv6) + Chỉ Clearnet (IPv4, IPv6) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 185,182 @@ -6737,6 +6740,7 @@ Darknet Only (Tor, I2P, cjdns) + Chỉ Darknet (Tor, I2P, cjdns) src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.ts 206,203 @@ -6761,6 +6765,7 @@ nodes + nút src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts 104,103 From 57eddac7f0b99b4fe84d91c0f4a50a4f7ccfe55f Mon Sep 17 00:00:00 2001 From: wiz Date: Mon, 27 Mar 2023 17:05:54 +0900 Subject: [PATCH 163/782] Release v2.5.0 --- backend/package-lock.json | 4 ++-- backend/package.json | 2 +- frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 26fe04541..fd7326592 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mempool-backend", - "version": "2.5.0-dev", + "version": "2.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mempool-backend", - "version": "2.5.0-dev", + "version": "2.5.0", "license": "GNU Affero General Public License v3.0", "dependencies": { "@babel/core": "^7.20.12", diff --git a/backend/package.json b/backend/package.json index efb051281..e749c9071 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "mempool-backend", - "version": "2.5.0-dev", + "version": "2.5.0", "description": "Bitcoin mempool visualizer and blockchain explorer backend", "license": "GNU Affero General Public License v3.0", "homepage": "https://mempool.space", diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6372f9af6..bd2843a13 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mempool-frontend", - "version": "2.5.0-dev", + "version": "2.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mempool-frontend", - "version": "2.5.0-dev", + "version": "2.5.0", "license": "GNU Affero General Public License v3.0", "dependencies": { "@angular-devkit/build-angular": "^14.2.10", diff --git a/frontend/package.json b/frontend/package.json index f23866d06..73e90b5e8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "mempool-frontend", - "version": "2.5.0-dev", + "version": "2.5.0", "description": "Bitcoin mempool visualizer and blockchain explorer backend", "license": "GNU Affero General Public License v3.0", "homepage": "https://mempool.space", From 96f3218ec6882c0b0f524a8a16a2081dbaeea99d Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 28 Mar 2023 14:25:05 +0900 Subject: [PATCH 164/782] Bump version to v2.6.0-dev --- backend/package-lock.json | 4 ++-- backend/package.json | 2 +- frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index fd7326592..60c9df9f3 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mempool-backend", - "version": "2.5.0", + "version": "2.6.0-dev", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mempool-backend", - "version": "2.5.0", + "version": "2.6.0-dev", "license": "GNU Affero General Public License v3.0", "dependencies": { "@babel/core": "^7.20.12", diff --git a/backend/package.json b/backend/package.json index e749c9071..40241fa66 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "mempool-backend", - "version": "2.5.0", + "version": "2.6.0-dev", "description": "Bitcoin mempool visualizer and blockchain explorer backend", "license": "GNU Affero General Public License v3.0", "homepage": "https://mempool.space", diff --git a/frontend/package-lock.json b/frontend/package-lock.json index bd2843a13..a9f8b7049 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mempool-frontend", - "version": "2.5.0", + "version": "2.6.0-dev", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mempool-frontend", - "version": "2.5.0", + "version": "2.6.0-dev", "license": "GNU Affero General Public License v3.0", "dependencies": { "@angular-devkit/build-angular": "^14.2.10", diff --git a/frontend/package.json b/frontend/package.json index 73e90b5e8..883fe4017 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "mempool-frontend", - "version": "2.5.0", + "version": "2.6.0-dev", "description": "Bitcoin mempool visualizer and blockchain explorer backend", "license": "GNU Affero General Public License v3.0", "homepage": "https://mempool.space", From 2baa10dcefe3cb49d6cd7cb2f89835b0a19eade1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 11:09:11 +0900 Subject: [PATCH 165/782] Use effective fee rate heuristics for block fee span --- backend/src/api/blocks.ts | 103 ++++++++++++++++-- backend/src/mempool.interfaces.ts | 10 ++ backend/src/repositories/BlocksRepository.ts | 21 +++- backend/src/repositories/CpfpRepository.ts | 2 +- .../blockchain-blocks.component.html | 2 +- 5 files changed, 124 insertions(+), 14 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 755b3c3ad..72dd7fa0f 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -2,7 +2,7 @@ import config from '../config'; import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; import logger from '../logger'; import memPool from './mempool'; -import { BlockExtended, BlockExtension, BlockSummary, PoolTag, TransactionExtended, TransactionStripped, TransactionMinerInfo } from '../mempool.interfaces'; +import { BlockExtended, BlockExtension, BlockSummary, PoolTag, TransactionExtended, TransactionStripped, TransactionMinerInfo, EffectiveFeeStats, CpfpSummary } from '../mempool.interfaces'; import { Common } from './common'; import diskCache from './disk-cache'; import transactionUtils from './transaction-utils'; @@ -200,8 +200,15 @@ class Blocks { extras.segwitTotalWeight = 0; } else { const stats: IBitcoinApi.BlockStats = await bitcoinClient.getBlockStats(block.id); - extras.medianFee = stats.feerate_percentiles[2]; // 50th percentiles - extras.feeRange = [stats.minfeerate, stats.feerate_percentiles, stats.maxfeerate].flat(); + let feeStats = { + medianFee: stats.feerate_percentiles[2], // 50th percentiles + feeRange: [stats.minfeerate, stats.feerate_percentiles, stats.maxfeerate].flat(), + }; + if (transactions?.length > 1) { + feeStats = this.calcEffectiveFeeStatistics(transactions); + } + extras.medianFee = feeStats.medianFee; + extras.feeRange = feeStats.feeRange; extras.totalFees = stats.totalfee; extras.avgFee = stats.avgfee; extras.avgFeeRate = stats.avgfeerate; @@ -571,7 +578,8 @@ class Blocks { const block = BitcoinApi.convertBlock(verboseBlock); const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash); const transactions = await this.$getTransactionsExtended(blockHash, block.height, false); - const blockExtended: BlockExtended = await this.$getBlockExtended(block, transactions); + const cpfpSummary: CpfpSummary = this.calculateCpfp(block.height, transactions); + const blockExtended: BlockExtended = await this.$getBlockExtended(block, cpfpSummary.transactions); const blockSummary: BlockSummary = this.summarizeBlock(verboseBlock); // start async callbacks @@ -619,7 +627,7 @@ class Blocks { await this.$getStrippedBlockTransactions(blockExtended.id, true); } if (config.MEMPOOL.CPFP_INDEXING) { - this.$indexCPFP(blockExtended.id, this.currentBlockHeight); + this.$saveCpfp(blockExtended.id, this.currentBlockHeight, cpfpSummary); } } } @@ -913,33 +921,45 @@ class Blocks { public async $indexCPFP(hash: string, height: number): Promise { const block = await bitcoinClient.getBlock(hash, 2); const transactions = block.tx.map(tx => { - tx.vsize = tx.weight / 4; tx.fee *= 100_000_000; return tx; }); - const clusters: any[] = []; + const summary = this.calculateCpfp(height, transactions); - let cluster: TransactionStripped[] = []; + await this.$saveCpfp(hash, height, summary); + + const effectiveFeeStats = this.calcEffectiveFeeStatistics(summary.transactions); + await blocksRepository.$saveEffectiveFeeStats(hash, effectiveFeeStats); + } + + public calculateCpfp(height: number, transactions: TransactionExtended[]): CpfpSummary { + const clusters: any[] = []; + let cluster: TransactionExtended[] = []; let ancestors: { [txid: string]: boolean } = {}; + const txMap = {}; for (let i = transactions.length - 1; i >= 0; i--) { const tx = transactions[i]; + txMap[tx.txid] = tx; if (!ancestors[tx.txid]) { let totalFee = 0; let totalVSize = 0; cluster.forEach(tx => { totalFee += tx?.fee || 0; - totalVSize += tx.vsize; + totalVSize += (tx.weight / 4); }); const effectiveFeePerVsize = totalFee / totalVSize; if (cluster.length > 1) { clusters.push({ root: cluster[0].txid, height, - txs: cluster.map(tx => { return { txid: tx.txid, weight: tx.vsize * 4, fee: tx.fee || 0 }; }), + txs: cluster.map(tx => { return { txid: tx.txid, weight: tx.weight, fee: tx.fee || 0 }; }), effectiveFeePerVsize, }); } + cluster.forEach(tx => { + txMap[tx.txid].effectiveFeePerVsize = effectiveFeePerVsize; + }) cluster = []; ancestors = {}; } @@ -948,11 +968,72 @@ class Blocks { ancestors[vin.txid] = true; }); } - const result = await cpfpRepository.$batchSaveClusters(clusters); + return { + transactions, + clusters, + }; + } + + public async $saveCpfp(hash: string, height: number, cpfpSummary: CpfpSummary): Promise { + const result = await cpfpRepository.$batchSaveClusters(cpfpSummary.clusters); if (!result) { await cpfpRepository.$insertProgressMarker(height); } } + + private calcEffectiveFeeStatistics(transactions: { weight: number, fee: number, effectiveFeePerVsize?: number, txid: string }[]): EffectiveFeeStats { + const sortedTxs = transactions.map(tx => { return { txid: tx.txid, weight: tx.weight, rate: tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4)) }; }).sort((a, b) => a.rate - b.rate); + const halfTotalWeight = transactions.reduce((total, tx) => total += tx.weight, 0) / 2; + let weightCount = 0; + let medianFee = 0; + let medianWeight = 0; + + // calculate the "medianFee" as the weighted-average fee rate of the middle 10000 weight units of transactions + const leftBound = halfTotalWeight - 5000; + const rightBound = halfTotalWeight + 5000; + for (let i = 0; i < sortedTxs.length && weightCount < rightBound; i++) { + const left = weightCount; + const right = weightCount + sortedTxs[i].weight; + if (right > leftBound) { + const weight = Math.min(right, rightBound) - Math.max(left, leftBound); + medianFee += (sortedTxs[i].rate * (weight / 4) ); + medianWeight += weight; + } + weightCount += sortedTxs[i].weight; + } + const medianFeeRate = medianFee / (medianWeight / 4); + + // minimum effective fee heuristic: + // lowest of + // a) the 1st percentile of effective fee rates + // b) the minimum effective fee rate in the last 2% of transactions (in block order) + const minFee = Math.min( + getNthPercentile(1, sortedTxs).rate, + transactions.slice(-transactions.length / 50).reduce((min, tx) => { return Math.min(min, tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4))); }, Infinity) + ); + + // maximum effective fee heuristic: + // highest of + // a) the 99th percentile of effective fee rates + // b) the maximum effective fee rate in the first 2% of transactions (in block order) + const maxFee = Math.max( + getNthPercentile(99, sortedTxs).rate, + transactions.slice(0, transactions.length / 50).reduce((max, tx) => { return Math.max(max, tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4))); }, 0) + ); + + return { + medianFee: medianFeeRate, + feeRange: [ + minFee, + [10,25,50,75,90].map(n => getNthPercentile(n, sortedTxs).rate), + maxFee, + ].flat(), + }; + } +} + +function getNthPercentile(n: number, sortedDistribution: any[]): any { + return sortedDistribution[Math.floor((sortedDistribution.length - 1) * (n / 100))]; } export default new Blocks(); diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 28c1e21b5..16b856bcc 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -214,6 +214,16 @@ export interface MempoolStats { tx_count: number; } +export interface EffectiveFeeStats { + medianFee: number; // median effective fee rate + feeRange: number[]; // 2nd, 10th, 25th, 50th, 75th, 90th, 98th percentiles +} + +export interface CpfpSummary { + transactions: TransactionExtended[]; + clusters: { root: string, height: number, txs: Ancestor[], effectiveFeePerVsize: number }[]; +} + export interface Statistic { id?: number; added: string; diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 04dcd4b56..4758c0708 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -1,4 +1,4 @@ -import { BlockExtended, BlockExtension, BlockPrice } from '../mempool.interfaces'; +import { BlockExtended, BlockExtension, BlockPrice, EffectiveFeeStats } from '../mempool.interfaces'; import DB from '../database'; import logger from '../logger'; import { Common } from '../api/common'; @@ -908,6 +908,25 @@ class BlocksRepository { } } + /** + * Save indexed effective fee statistics + * + * @param id + * @param feeStats + */ + public async $saveEffectiveFeeStats(id: string, feeStats: EffectiveFeeStats): Promise { + try { + await DB.query(` + UPDATE blocks SET median_fee = ?, fee_span = ? + WHERE hash = ?`, + [feeStats.medianFee, JSON.stringify(feeStats.feeRange), id] + ); + } catch (e) { + logger.err(`Cannot update block fee stats. Reason: ` + (e instanceof Error ? e.message : e)); + throw e; + } + } + /** * Convert a mysql row block into a BlockExtended. Note that you * must provide the correct field into dbBlk object param diff --git a/backend/src/repositories/CpfpRepository.ts b/backend/src/repositories/CpfpRepository.ts index 9d8b2fe75..b68c25472 100644 --- a/backend/src/repositories/CpfpRepository.ts +++ b/backend/src/repositories/CpfpRepository.ts @@ -48,7 +48,7 @@ class CpfpRepository { } } - public async $batchSaveClusters(clusters: { root: string, height: number, txs: any, effectiveFeePerVsize: number}[]): Promise { + public async $batchSaveClusters(clusters: { root: string, height: number, txs: Ancestor[], effectiveFeePerVsize: number }[]): Promise { try { const clusterValues: any[] = []; const txs: any[] = []; diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html index 6cdb895ff..373605667 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -25,7 +25,7 @@
    - {{ block?.extras?.feeRange?.[1] | number:feeRounding }} - {{ + {{ block?.extras?.feeRange?.[0] | number:feeRounding }} - {{ block?.extras?.feeRange[block?.extras?.feeRange?.length - 1] | number:feeRounding }} sat/vB
    From 2fc404a55c4486805457c75ef202451bf801625d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 14:36:36 +0900 Subject: [PATCH 166/782] refactor effective rate calculation --- backend/src/api/blocks.ts | 105 ++------------------------------------ backend/src/api/common.ts | 97 ++++++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 101 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 72dd7fa0f..eee5dae6e 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -2,7 +2,7 @@ import config from '../config'; import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; import logger from '../logger'; import memPool from './mempool'; -import { BlockExtended, BlockExtension, BlockSummary, PoolTag, TransactionExtended, TransactionStripped, TransactionMinerInfo, EffectiveFeeStats, CpfpSummary } from '../mempool.interfaces'; +import { BlockExtended, BlockExtension, BlockSummary, PoolTag, TransactionExtended, TransactionStripped, TransactionMinerInfo, CpfpSummary } from '../mempool.interfaces'; import { Common } from './common'; import diskCache from './disk-cache'; import transactionUtils from './transaction-utils'; @@ -205,7 +205,7 @@ class Blocks { feeRange: [stats.minfeerate, stats.feerate_percentiles, stats.maxfeerate].flat(), }; if (transactions?.length > 1) { - feeStats = this.calcEffectiveFeeStatistics(transactions); + feeStats = Common.calcEffectiveFeeStatistics(transactions); } extras.medianFee = feeStats.medianFee; extras.feeRange = feeStats.feeRange; @@ -578,7 +578,7 @@ class Blocks { const block = BitcoinApi.convertBlock(verboseBlock); const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash); const transactions = await this.$getTransactionsExtended(blockHash, block.height, false); - const cpfpSummary: CpfpSummary = this.calculateCpfp(block.height, transactions); + const cpfpSummary: CpfpSummary = Common.calculateCpfp(block.height, transactions); const blockExtended: BlockExtended = await this.$getBlockExtended(block, cpfpSummary.transactions); const blockSummary: BlockSummary = this.summarizeBlock(verboseBlock); @@ -925,115 +925,20 @@ class Blocks { return tx; }); - const summary = this.calculateCpfp(height, transactions); + const summary = Common.calculateCpfp(height, transactions); await this.$saveCpfp(hash, height, summary); - const effectiveFeeStats = this.calcEffectiveFeeStatistics(summary.transactions); + const effectiveFeeStats = Common.calcEffectiveFeeStatistics(summary.transactions); await blocksRepository.$saveEffectiveFeeStats(hash, effectiveFeeStats); } - public calculateCpfp(height: number, transactions: TransactionExtended[]): CpfpSummary { - const clusters: any[] = []; - let cluster: TransactionExtended[] = []; - let ancestors: { [txid: string]: boolean } = {}; - const txMap = {}; - for (let i = transactions.length - 1; i >= 0; i--) { - const tx = transactions[i]; - txMap[tx.txid] = tx; - if (!ancestors[tx.txid]) { - let totalFee = 0; - let totalVSize = 0; - cluster.forEach(tx => { - totalFee += tx?.fee || 0; - totalVSize += (tx.weight / 4); - }); - const effectiveFeePerVsize = totalFee / totalVSize; - if (cluster.length > 1) { - clusters.push({ - root: cluster[0].txid, - height, - txs: cluster.map(tx => { return { txid: tx.txid, weight: tx.weight, fee: tx.fee || 0 }; }), - effectiveFeePerVsize, - }); - } - cluster.forEach(tx => { - txMap[tx.txid].effectiveFeePerVsize = effectiveFeePerVsize; - }) - cluster = []; - ancestors = {}; - } - cluster.push(tx); - tx.vin.forEach(vin => { - ancestors[vin.txid] = true; - }); - } - return { - transactions, - clusters, - }; - } - public async $saveCpfp(hash: string, height: number, cpfpSummary: CpfpSummary): Promise { const result = await cpfpRepository.$batchSaveClusters(cpfpSummary.clusters); if (!result) { await cpfpRepository.$insertProgressMarker(height); } } - - private calcEffectiveFeeStatistics(transactions: { weight: number, fee: number, effectiveFeePerVsize?: number, txid: string }[]): EffectiveFeeStats { - const sortedTxs = transactions.map(tx => { return { txid: tx.txid, weight: tx.weight, rate: tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4)) }; }).sort((a, b) => a.rate - b.rate); - const halfTotalWeight = transactions.reduce((total, tx) => total += tx.weight, 0) / 2; - let weightCount = 0; - let medianFee = 0; - let medianWeight = 0; - - // calculate the "medianFee" as the weighted-average fee rate of the middle 10000 weight units of transactions - const leftBound = halfTotalWeight - 5000; - const rightBound = halfTotalWeight + 5000; - for (let i = 0; i < sortedTxs.length && weightCount < rightBound; i++) { - const left = weightCount; - const right = weightCount + sortedTxs[i].weight; - if (right > leftBound) { - const weight = Math.min(right, rightBound) - Math.max(left, leftBound); - medianFee += (sortedTxs[i].rate * (weight / 4) ); - medianWeight += weight; - } - weightCount += sortedTxs[i].weight; - } - const medianFeeRate = medianFee / (medianWeight / 4); - - // minimum effective fee heuristic: - // lowest of - // a) the 1st percentile of effective fee rates - // b) the minimum effective fee rate in the last 2% of transactions (in block order) - const minFee = Math.min( - getNthPercentile(1, sortedTxs).rate, - transactions.slice(-transactions.length / 50).reduce((min, tx) => { return Math.min(min, tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4))); }, Infinity) - ); - - // maximum effective fee heuristic: - // highest of - // a) the 99th percentile of effective fee rates - // b) the maximum effective fee rate in the first 2% of transactions (in block order) - const maxFee = Math.max( - getNthPercentile(99, sortedTxs).rate, - transactions.slice(0, transactions.length / 50).reduce((max, tx) => { return Math.max(max, tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4))); }, 0) - ); - - return { - medianFee: medianFeeRate, - feeRange: [ - minFee, - [10,25,50,75,90].map(n => getNthPercentile(n, sortedTxs).rate), - maxFee, - ].flat(), - }; - } -} - -function getNthPercentile(n: number, sortedDistribution: any[]): any { - return sortedDistribution[Math.floor((sortedDistribution.length - 1) * (n / 100))]; } export default new Blocks(); diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index df97c0292..1d3b11d66 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -1,4 +1,4 @@ -import { CpfpInfo, MempoolBlockWithTransactions, TransactionExtended, TransactionStripped } from '../mempool.interfaces'; +import { Ancestor, CpfpInfo, CpfpSummary, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, TransactionStripped } from '../mempool.interfaces'; import config from '../config'; import { NodeSocket } from '../repositories/NodesSocketsRepository'; import { isIP } from 'net'; @@ -345,4 +345,99 @@ export class Common { }; } } + + static calculateCpfp(height: number, transactions: TransactionExtended[]): CpfpSummary { + const clusters: { root: string, height: number, txs: Ancestor[], effectiveFeePerVsize: number }[] = []; + let cluster: TransactionExtended[] = []; + let ancestors: { [txid: string]: boolean } = {}; + const txMap = {}; + for (let i = transactions.length - 1; i >= 0; i--) { + const tx = transactions[i]; + txMap[tx.txid] = tx; + if (!ancestors[tx.txid]) { + let totalFee = 0; + let totalVSize = 0; + cluster.forEach(tx => { + totalFee += tx?.fee || 0; + totalVSize += (tx.weight / 4); + }); + const effectiveFeePerVsize = totalFee / totalVSize; + if (cluster.length > 1) { + clusters.push({ + root: cluster[0].txid, + height, + txs: cluster.map(tx => { return { txid: tx.txid, weight: tx.weight, fee: tx.fee || 0 }; }), + effectiveFeePerVsize, + }); + } + cluster.forEach(tx => { + txMap[tx.txid].effectiveFeePerVsize = effectiveFeePerVsize; + }); + cluster = []; + ancestors = {}; + } + cluster.push(tx); + tx.vin.forEach(vin => { + ancestors[vin.txid] = true; + }); + } + return { + transactions, + clusters, + }; + } + + static calcEffectiveFeeStatistics(transactions: { weight: number, fee: number, effectiveFeePerVsize?: number, txid: string }[]): EffectiveFeeStats { + const sortedTxs = transactions.map(tx => { return { txid: tx.txid, weight: tx.weight, rate: tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4)) }; }).sort((a, b) => a.rate - b.rate); + + let weightCount = 0; + let medianFee = 0; + let medianWeight = 0; + + // calculate the "medianFee" as the average fee rate of the middle 10000 weight units of transactions + const leftBound = 1995000; + const rightBound = 2005000; + for (let i = 0; i < sortedTxs.length && weightCount < rightBound; i++) { + const left = weightCount; + const right = weightCount + sortedTxs[i].weight; + if (right > leftBound) { + const weight = Math.min(right, rightBound) - Math.max(left, leftBound); + medianFee += (sortedTxs[i].rate * (weight / 4) ); + medianWeight += weight; + } + weightCount += sortedTxs[i].weight; + } + const medianFeeRate = medianWeight ? (medianFee / (medianWeight / 4)) : 0; + + // minimum effective fee heuristic: + // lowest of + // a) the 1st percentile of effective fee rates + // b) the minimum effective fee rate in the last 2% of transactions (in block order) + const minFee = Math.min( + Common.getNthPercentile(1, sortedTxs).rate, + transactions.slice(-transactions.length / 50).reduce((min, tx) => { return Math.min(min, tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4))); }, Infinity) + ); + + // maximum effective fee heuristic: + // highest of + // a) the 99th percentile of effective fee rates + // b) the maximum effective fee rate in the first 2% of transactions (in block order) + const maxFee = Math.max( + Common.getNthPercentile(99, sortedTxs).rate, + transactions.slice(0, transactions.length / 50).reduce((max, tx) => { return Math.max(max, tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4))); }, 0) + ); + + return { + medianFee: medianFeeRate, + feeRange: [ + minFee, + [10,25,50,75,90].map(n => Common.getNthPercentile(n, sortedTxs).rate), + maxFee, + ].flat(), + }; + } + + static getNthPercentile(n: number, sortedDistribution: any[]): any { + return sortedDistribution[Math.floor((sortedDistribution.length - 1) * (n / 100))]; + } } From 9f40cba914aafc95f322ea4569460f5b33fbea4b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 14:51:06 +0900 Subject: [PATCH 167/782] use new median fee calculation for mempool blocks --- backend/src/api/mempool-blocks.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 0d6186ce1..43ab16647 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -324,22 +324,14 @@ class MempoolBlocks { fitTransactions.push(tx); } }); - let rangeLength = 4; - if (blocksIndex === 0) { - rangeLength = 8; - } - if (transactions.length > 4000) { - rangeLength = 6; - } else if (transactions.length > 10000) { - rangeLength = 8; - } + const feeStats = Common.calcEffectiveFeeStatistics(transactions); return { blockSize: totalSize, blockVSize: totalWeight / 4, nTx: transactions.length, totalFees: transactions.reduce((acc, cur) => acc + cur.fee, 0), - medianFee: Common.percentile(transactions.map((tx) => tx.effectiveFeePerVsize), config.MEMPOOL.RECOMMENDED_FEE_PERCENTILE), - feeRange: Common.getFeesInRange(transactions, rangeLength), + medianFee: feeStats.medianFee, // Common.percentile(transactions.map((tx) => tx.effectiveFeePerVsize), config.MEMPOOL.RECOMMENDED_FEE_PERCENTILE), + feeRange: feeStats.feeRange, //Common.getFeesInRange(transactions, rangeLength), transactionIds: transactions.map((tx) => tx.txid), transactions: fitTransactions.map((tx) => Common.stripTransaction(tx)), }; From a4c027dc483d31569a47dca7c8714cd0a600ab40 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 12 Mar 2023 14:51:29 +0900 Subject: [PATCH 168/782] clean up unused vars in mempool-blocks.ts --- backend/src/api/mempool-blocks.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 43ab16647..aa2804379 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -59,7 +59,7 @@ class MempoolBlocks { // Loop through and traverse all ancestors and sum up all the sizes + fees // Pass down size + fee to all unconfirmed children let sizes = 0; - memPoolArray.forEach((tx, i) => { + memPoolArray.forEach((tx) => { sizes += tx.weight; if (sizes > 4000000 * 8) { return; @@ -74,7 +74,7 @@ class MempoolBlocks { const time = end - start; logger.debug('Mempool blocks calculated in ' + time / 1000 + ' seconds'); - const blocks = this.calculateMempoolBlocks(memPoolArray, this.mempoolBlocks); + const blocks = this.calculateMempoolBlocks(memPoolArray); if (saveResults) { const deltas = this.calculateMempoolDeltas(this.mempoolBlocks, blocks); @@ -85,26 +85,23 @@ class MempoolBlocks { return blocks; } - private calculateMempoolBlocks(transactionsSorted: TransactionExtended[], prevBlocks: MempoolBlockWithTransactions[]): MempoolBlockWithTransactions[] { + private calculateMempoolBlocks(transactionsSorted: TransactionExtended[]): MempoolBlockWithTransactions[] { const mempoolBlocks: MempoolBlockWithTransactions[] = []; let blockWeight = 0; - let blockSize = 0; let transactions: TransactionExtended[] = []; transactionsSorted.forEach((tx) => { if (blockWeight + tx.weight <= config.MEMPOOL.BLOCK_WEIGHT_UNITS || mempoolBlocks.length === config.MEMPOOL.MEMPOOL_BLOCKS_AMOUNT - 1) { blockWeight += tx.weight; - blockSize += tx.size; transactions.push(tx); } else { - mempoolBlocks.push(this.dataToMempoolBlocks(transactions, mempoolBlocks.length)); + mempoolBlocks.push(this.dataToMempoolBlocks(transactions)); blockWeight = tx.weight; - blockSize = tx.size; transactions = [tx]; } }); if (transactions.length) { - mempoolBlocks.push(this.dataToMempoolBlocks(transactions, mempoolBlocks.length)); + mempoolBlocks.push(this.dataToMempoolBlocks(transactions)); } return mempoolBlocks; @@ -298,10 +295,10 @@ class MempoolBlocks { }); // unpack the condensed blocks into proper mempool blocks - const mempoolBlocks = blocks.map((transactions, blockIndex) => { + const mempoolBlocks = blocks.map((transactions) => { return this.dataToMempoolBlocks(transactions.map(tx => { return mempool[tx.txid] || null; - }).filter(tx => !!tx), blockIndex); + }).filter(tx => !!tx)); }); if (saveResults) { @@ -313,7 +310,7 @@ class MempoolBlocks { return mempoolBlocks; } - private dataToMempoolBlocks(transactions: TransactionExtended[], blocksIndex: number): MempoolBlockWithTransactions { + private dataToMempoolBlocks(transactions: TransactionExtended[]): MempoolBlockWithTransactions { let totalSize = 0; let totalWeight = 0; const fitTransactions: TransactionExtended[] = []; From c675d1c498d4e20b2645d20fc8fdb40cb9fb9e4e Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Tue, 28 Mar 2023 23:07:50 +0900 Subject: [PATCH 169/782] Make sure to scan closed channels even if config.MEMPOOL.ENABLE = false --- backend/src/tasks/lightning/network-sync.service.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/src/tasks/lightning/network-sync.service.ts b/backend/src/tasks/lightning/network-sync.service.ts index 3e5ae1366..fc04f5023 100644 --- a/backend/src/tasks/lightning/network-sync.service.ts +++ b/backend/src/tasks/lightning/network-sync.service.ts @@ -269,7 +269,11 @@ class NetworkSyncService { } private async $scanForClosedChannels(): Promise { - if (this.closedChannelsScanBlock === blocks.getCurrentBlockHeight()) { + let currentBlockHeight = blocks.getCurrentBlockHeight(); + if (config.MEMPOOL.ENABLED === false) { // https://github.com/mempool/mempool/issues/3582 + currentBlockHeight = await bitcoinApi.$getBlockHeightTip(); + } + if (this.closedChannelsScanBlock === currentBlockHeight) { logger.debug(`We've already scan closed channels for this block, skipping.`); return; } @@ -305,7 +309,7 @@ class NetworkSyncService { } } - this.closedChannelsScanBlock = blocks.getCurrentBlockHeight(); + this.closedChannelsScanBlock = currentBlockHeight; logger.debug(`Closed channels scan completed at block ${this.closedChannelsScanBlock}`, logger.tags.ln); } catch (e) { logger.err(`$scanForClosedChannels() error: ${e instanceof Error ? e.message : e}`, logger.tags.ln); From ef09912d1bc17c6256f81e4fa1eee7a801364d89 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 29 Mar 2023 03:15:01 +0900 Subject: [PATCH 170/782] Fix node unfurl row overflow --- frontend/src/app/lightning/node/node-preview.component.html | 2 +- frontend/src/app/lightning/node/node-preview.component.scss | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/lightning/node/node-preview.component.html b/frontend/src/app/lightning/node/node-preview.component.html index 89d5d4245..eae076bf5 100644 --- a/frontend/src/app/lightning/node/node-preview.component.html +++ b/frontend/src/app/lightning/node/node-preview.component.html @@ -12,7 +12,7 @@
    RankRank Pool Hashrate Blocks Avg HealthEmpty blocksEmpty blocks
    {{ pool.rank }}{{ pool.rank }} {{ pool.lastEstimatedHashrate }} {{ miningStats.miningUnits.hashrateUnit }} - {{ pool.blockCount }} ({{ pool.share }}%) + {{ pool.blockCount }} ({{ pool.share }}%) Unknown {{ pool.emptyBlocks }} ({{ pool.emptyBlockRatio }}%){{ pool.emptyBlocks }} ({{ pool.emptyBlockRatio }}%)
    All miners {{ miningStats.lastEstimatedHashrate}} {{ miningStats.miningUnits.hashrateUnit }} {{ miningStats.blockCount }}{{ miningStats.totalEmptyBlock }} ({{ miningStats.totalEmptyBlockRatio + {{ miningStats.totalEmptyBlock }} ({{ miningStats.totalEmptyBlockRatio }}%)
    Reward Hashrate (24h)Avg HealthAvg Health
    {{ poolStats.estimatedHashrate | amountShortener : 1 : 'H/s' }}{{ poolStats.avgBlockHealth }}% @@ -119,13 +119,13 @@
    Reward Hashrate (24h)Avg HealthAvg Health
    {{ poolStats.estimatedHashrate | amountShortener : 1 : 'H/s' }}{{ poolStats.avgBlockHealth }}% @@ -384,7 +384,7 @@
    Reward Hashrate (24h)Avg HealthAvg Health
    +
    Reward Hashrate (24h)Avg HealthAvg Health
    +
    diff --git a/frontend/src/app/lightning/node/node-preview.component.scss b/frontend/src/app/lightning/node/node-preview.component.scss index c1775dd52..baa33915b 100644 --- a/frontend/src/app/lightning/node/node-preview.component.scss +++ b/frontend/src/app/lightning/node/node-preview.component.scss @@ -18,6 +18,10 @@ } } +.table-col { + max-width: calc(100% - 470px); +} + .map-col { flex-grow: 0; flex-shrink: 0; From 5555916de3d160daf3694dd387d8c071dd084cc0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 29 Mar 2023 05:45:49 +0900 Subject: [PATCH 171/782] Fix unfurl cpfp badge --- .../transaction/transaction-preview.component.html | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction-preview.component.html b/frontend/src/app/components/transaction/transaction-preview.component.html index 1043a7d30..e3a49d9b6 100644 --- a/frontend/src/app/components/transaction/transaction-preview.component.html +++ b/frontend/src/app/components/transaction/transaction-preview.component.html @@ -8,10 +8,7 @@
    - - CPFP - - + CPFP
    From 14e0d8004208854e1071cf0f50d7a2cbace5741b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 29 Mar 2023 07:41:45 +0900 Subject: [PATCH 172/782] Fix broken tx diagram for non-lBTC liquid assets --- .../tx-bowtie-graph-tooltip.component.html | 12 ++--- .../tx-bowtie-graph-tooltip.component.ts | 1 + .../tx-bowtie-graph.component.ts | 47 ++++++++++++++++--- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html index 427cc7c7c..9ebe36a87 100644 --- a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html +++ b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html @@ -29,7 +29,7 @@

    Peg Out

    -

    +

    @@ -55,18 +55,18 @@

    Input  #{{ line.vin + 1 }}

    -

    Confidential

    -

    +

    Confidential

    +

    - {{ line.value }} {{ line.asset | slice : 0 : 7 }} + {{ line.displayValue }} {{ line.asset | slice : 0 : 7 }}
    - +

    @@ -76,5 +76,5 @@ - {{ item.value / pow(10, assetsMinimal[item.asset][3]) | number: '1.' + assetsMinimal[item.asset][3] + '-' + assetsMinimal[item.asset][3] }} {{ assetsMinimal[item.asset][1] }} + {{ item.displayValue / pow(10, assetsMinimal[item.asset][3]) | number: '1.' + assetsMinimal[item.asset][3] + '-' + assetsMinimal[item.asset][3] }} {{ assetsMinimal[item.asset][1] }} \ No newline at end of file diff --git a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.ts b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.ts index bd669b897..924982983 100644 --- a/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.ts +++ b/frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.ts @@ -7,6 +7,7 @@ import { environment } from '../../../environments/environment'; interface Xput { type: 'input' | 'output' | 'fee'; value?: number; + displayValue?: number; index?: number; txid?: string; vin?: number; diff --git a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts index 18f13cc15..97e74957e 100644 --- a/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts +++ b/frontend/src/app/components/tx-bowtie-graph/tx-bowtie-graph.component.ts @@ -1,12 +1,13 @@ import { Component, OnInit, Input, OnChanges, HostListener, Inject, LOCALE_ID } from '@angular/core'; import { StateService } from '../../services/state.service'; -import { Outspend, Transaction } from '../../interfaces/electrs.interface'; +import { Outspend, Transaction, Vin, Vout } from '../../interfaces/electrs.interface'; import { Router } from '@angular/router'; import { ReplaySubject, merge, Subscription, of } from 'rxjs'; import { tap, switchMap } from 'rxjs/operators'; import { ApiService } from '../../services/api.service'; import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; import { AssetsService } from '../../services/assets.service'; +import { environment } from '../../../environments/environment'; interface SvgLine { path: string; @@ -20,6 +21,7 @@ interface SvgLine { interface Xput { type: 'input' | 'output' | 'fee'; value?: number; + displayValue?: number; index?: number; txid?: string; vin?: number; @@ -74,6 +76,7 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { zeroValueThickness = 20; hasLine: boolean; assetsMinimal: any; + nativeAssetId = this.stateService.network === 'liquidtestnet' ? environment.nativeTestAssetId : environment.nativeAssetId; outspendsSubscription: Subscription; refreshOutspends$: ReplaySubject = new ReplaySubject(); @@ -167,7 +170,8 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { let voutWithFee = this.tx.vout.map((v, i) => { return { type: v.scriptpubkey_type === 'fee' ? 'fee' : 'output', - value: v?.value, + value: this.getOutputValue(v), + displayValue: v?.value, address: v?.scriptpubkey_address || v?.scriptpubkey_type?.toUpperCase(), index: i, pegout: v?.pegout?.scriptpubkey_address, @@ -185,7 +189,8 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { let truncatedInputs = this.tx.vin.map((v, i) => { return { type: 'input', - value: v?.prevout?.value || (v?.is_coinbase && !totalValue ? 0 : undefined), + value: (v?.is_coinbase && !totalValue ? 0 : this.getInputValue(v)), + displayValue: v?.prevout?.value, txid: v.txid, vout: v.vout, address: v?.prevout?.scriptpubkey_address || v?.prevout?.scriptpubkey_type?.toUpperCase(), @@ -229,14 +234,14 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { } calcTotalValue(tx: Transaction): number { - const totalOutput = this.tx.vout.reduce((acc, v) => (v.value == null ? 0 : v.value) + acc, 0); + let totalOutput = this.tx.vout.reduce((acc, v) => (this.getOutputValue(v) || 0) + acc, 0); // simple sum of outputs + fee for bitcoin if (!this.isLiquid) { return this.tx.fee ? totalOutput + this.tx.fee : totalOutput; } else { - const totalInput = this.tx.vin.reduce((acc, v) => (v?.prevout?.value == null ? 0 : v.prevout.value) + acc, 0); - const confidentialInputCount = this.tx.vin.reduce((acc, v) => acc + (v?.prevout?.value == null ? 1 : 0), 0); - const confidentialOutputCount = this.tx.vout.reduce((acc, v) => acc + (v.value == null ? 1 : 0), 0); + const totalInput = this.tx.vin.reduce((acc, v) => (this.getInputValue(v) || 0) + acc, 0); + const confidentialInputCount = this.tx.vin.reduce((acc, v) => acc + (this.isUnknownInputValue(v) ? 1 : 0), 0); + const confidentialOutputCount = this.tx.vout.reduce((acc, v) => acc + (this.isUnknownOutputValue(v) ? 1 : 0), 0); // if there are unknowns on both sides, the total is indeterminate, so we'll just fudge it if (confidentialInputCount && confidentialOutputCount) { @@ -456,6 +461,34 @@ export class TxBowtieGraphComponent implements OnInit, OnChanges { } } + getOutputValue(v: Vout): number | void { + if (!v) { + return null; + } else if (this.isLiquid && v.asset !== this.nativeAssetId) { + return null; + } else { + return v.value; + } + } + + getInputValue(v: Vin): number | void { + if (!v?.prevout) { + return null; + } else if (this.isLiquid && v.prevout.asset !== this.nativeAssetId) { + return null; + } else { + return v.prevout.value; + } + } + + isUnknownInputValue(v: Vin): boolean { + return v?.prevout?.value == null || this.isLiquid && v?.prevout?.asset !== this.nativeAssetId; + } + + isUnknownOutputValue(v: Vout): boolean { + return v?.value == null || this.isLiquid && v?.asset !== this.nativeAssetId; + } + @HostListener('pointermove', ['$event']) onPointerMove(event) { if (this.dir === 'rtl') { From 7ab373ecac529d1f8f5efb921bf2a6f131f5e134 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 29 Mar 2023 15:09:38 +0900 Subject: [PATCH 173/782] Clip overflowing labels in pool component on mobile --- .../app/components/pool/pool.component.html | 48 +++++++++---------- .../app/components/pool/pool.component.scss | 10 +++- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/frontend/src/app/components/pool/pool.component.html b/frontend/src/app/components/pool/pool.component.html index 898e50fc2..e1806086e 100644 --- a/frontend/src/app/components/pool/pool.component.html +++ b/frontend/src/app/components/pool/pool.component.html @@ -92,9 +92,9 @@

    - - - + + + @@ -117,9 +117,9 @@
    RewardHashrate (24h)Avg HealthRewardHashrate (24h)Avg Health
    - - - + + + @@ -143,9 +143,9 @@
    RewardHashrate (24h)Avg HealthRewardHashrate (24h)Avg Health
    - - - + + + @@ -165,9 +165,9 @@
    Blocks 24h1wAllBlocks 24h1wAll
    - - - + + + @@ -382,9 +382,9 @@
    Blocks 24h1wAllBlocks 24h1wAll
    - - - + + + @@ -407,9 +407,9 @@
    RewardHashrate (24h)Avg HealthRewardHashrate (24h)Avg Health
    - - - + + + @@ -433,9 +433,9 @@
    RewardHashrate (24h)Avg HealthRewardHashrate (24h)Avg Health
    - - - + + + @@ -458,9 +458,9 @@
    Blocks 24h1wAllBlocks 24h1wAll
    - - - + + + diff --git a/frontend/src/app/components/pool/pool.component.scss b/frontend/src/app/components/pool/pool.component.scss index 21468773f..92fdc2ef3 100644 --- a/frontend/src/app/components/pool/pool.component.scss +++ b/frontend/src/app/components/pool/pool.component.scss @@ -188,11 +188,19 @@ div.scrollable { } } -.block-count-title { +.data-title { color: #4a68b9; font-size: 14px; } +.clip { + @media (max-width: 576px) { + max-width: 85px; + overflow: hidden; + text-overflow: ellipsis; + } +} + .table-data tr { background-color: transparent; } From 0bc244b9f16372b4f59f7159de27d3f707d7c136 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 29 Mar 2023 15:10:59 +0900 Subject: [PATCH 174/782] Use window.location object instead of angular router for default graph window preference setting --- frontend/src/app/services/storage.service.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/services/storage.service.ts b/frontend/src/app/services/storage.service.ts index 73a013146..60d66b284 100644 --- a/frontend/src/app/services/storage.service.ts +++ b/frontend/src/app/services/storage.service.ts @@ -12,20 +12,22 @@ export class StorageService { setDefaultValueIfNeeded(key: string, defaultValue: string) { const graphWindowPreference: string = this.getValue(key); + const fragment = window.location.hash.replace('#', ''); + if (graphWindowPreference === null) { // First visit to mempool.space - if (this.router.url.includes('graphs') && key === 'graphWindowPreference' || - this.router.url.includes('pools') && key === 'miningWindowPreference' + if (window.location.pathname.includes('graphs') && key === 'graphWindowPreference' || + window.location.pathname.includes('pools') && key === 'miningWindowPreference' ) { - this.setValue(key, this.route.snapshot.fragment ? this.route.snapshot.fragment : defaultValue); + this.setValue(key, fragment ? fragment : defaultValue); } else { this.setValue(key, defaultValue); } - } else if (this.router.url.includes('graphs') && key === 'graphWindowPreference' || - this.router.url.includes('pools') && key === 'miningWindowPreference' + } else if (window.location.pathname.includes('graphs') && key === 'graphWindowPreference' || + window.location.pathname.includes('pools') && key === 'miningWindowPreference' ) { // Visit a different graphs#fragment from last visit - if (this.route.snapshot.fragment !== null && graphWindowPreference !== this.route.snapshot.fragment) { - this.setValue(key, this.route.snapshot.fragment); + if (fragment !== null && graphWindowPreference !== fragment) { + this.setValue(key, fragment); } } } From 7562407a0cff67397a928e51683c8b551ff0589d Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 18 Mar 2023 17:01:31 +0900 Subject: [PATCH 175/782] Show warning on testnet/signet --- .../master-page/master-page.component.html | 15 +++++++++++++++ .../master-page/master-page.component.scss | 15 +++++++++++++++ .../master-page/master-page.component.ts | 6 ++++++ frontend/src/app/shared/shared.module.ts | 3 ++- 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/master-page/master-page.component.html b/frontend/src/app/components/master-page/master-page.component.html index 13935c04a..6f4e30d60 100644 --- a/frontend/src/app/components/master-page/master-page.component.html +++ b/frontend/src/app/components/master-page/master-page.component.html @@ -62,6 +62,21 @@ +
    +
    +
    +
    + + This is a test network. Coins have no value + +
    + +
    +
    +
    +
    diff --git a/frontend/src/app/components/master-page/master-page.component.scss b/frontend/src/app/components/master-page/master-page.component.scss index 95f05245e..0f4fb840d 100644 --- a/frontend/src/app/components/master-page/master-page.component.scss +++ b/frontend/src/app/components/master-page/master-page.component.scss @@ -192,4 +192,19 @@ nav { margin: 33px 0px 0px -19px; font-size: 7px; } +} + +.close { + position: absolute; + color: black; + right: 10px; + top: 17px; + @media (max-width: 620px) { + right: 10px; + top: 0px; + }; + @media (min-width: 992px) { + right: 10px; + top: 13px; + }; } \ No newline at end of file diff --git a/frontend/src/app/components/master-page/master-page.component.ts b/frontend/src/app/components/master-page/master-page.component.ts index 34c525108..1fd040f47 100644 --- a/frontend/src/app/components/master-page/master-page.component.ts +++ b/frontend/src/app/components/master-page/master-page.component.ts @@ -4,6 +4,7 @@ import { Observable, merge, of } from 'rxjs'; import { LanguageService } from '../../services/language.service'; import { EnterpriseService } from '../../services/enterprise.service'; import { NavigationService } from '../../services/navigation.service'; +import { StorageService } from '../../services/storage.service'; @Component({ selector: 'app-master-page', @@ -26,6 +27,7 @@ export class MasterPageComponent implements OnInit { private languageService: LanguageService, private enterpriseService: EnterpriseService, private navigationService: NavigationService, + public storageService: StorageService ) { } ngOnInit() { @@ -46,4 +48,8 @@ export class MasterPageComponent implements OnInit { onResize(event: any) { this.isMobile = window.innerWidth <= 767.98; } + + dismissWarning() { + this.storageService.setValue('hideWarning', 'hidden'); + } } diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 188942c02..8aa2fb173 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -4,7 +4,7 @@ import { NgbCollapseModule, NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstra import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome'; import { faFilter, faAngleDown, faAngleUp, faAngleRight, faAngleLeft, faBolt, faChartArea, faCogs, faCubes, faHammer, faDatabase, faExchangeAlt, faInfoCircle, faLink, faList, faSearch, faCaretUp, faCaretDown, faTachometerAlt, faThList, faTint, faTv, faAngleDoubleDown, faSortUp, faAngleDoubleUp, faChevronDown, - faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload, faQrcode, faArrowRightArrowLeft, faArrowsRotate, faCircleLeft } from '@fortawesome/free-solid-svg-icons'; + faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload, faQrcode, faArrowRightArrowLeft, faArrowsRotate, faCircleLeft, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { MasterPageComponent } from '../components/master-page/master-page.component'; import { PreviewTitleComponent } from '../components/master-page-preview/preview-title.component'; @@ -309,5 +309,6 @@ export class SharedModule { library.addIcons(faQrcode); library.addIcons(faArrowRightArrowLeft); library.addIcons(faExchangeAlt); + library.addIcons(faExclamationTriangle); } } From d9b4ad64bb7d6f4277e77134060c019cb7def9be Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 16 Mar 2023 14:35:09 +0900 Subject: [PATCH 176/782] Fix % on heap limit warn --- backend/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index a34ffd21b..a7f805313 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -276,7 +276,7 @@ class Server { if (!this.warnedHeapCritical && this.maxHeapSize > warnThreshold) { this.warnedHeapCritical = true; - logger.warn(`Used ${(this.maxHeapSize / stats.heap_size_limit).toFixed(2)}% of heap limit (${formatBytes(this.maxHeapSize, byteUnits, true)} / ${formatBytes(stats.heap_size_limit, byteUnits)})!`); + logger.warn(`Used ${(this.maxHeapSize / stats.heap_size_limit * 100).toFixed(2)}% of heap limit (${formatBytes(this.maxHeapSize, byteUnits, true)} / ${formatBytes(stats.heap_size_limit, byteUnits)})!`); } if (this.lastHeapLogTime === null || (now - this.lastHeapLogTime) > (this.heapLogInterval * 1000)) { logger.debug(`Memory usage: ${formatBytes(this.maxHeapSize, byteUnits)} / ${formatBytes(stats.heap_size_limit, byteUnits)}`); From 9e4fe40ca396bf9305dad75de7d97285de688857 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sun, 19 Mar 2023 10:46:38 +0900 Subject: [PATCH 177/782] When a re-org happens, keep the block templates for audit --- backend/src/api/blocks.ts | 6 ++-- backend/src/repositories/BlocksRepository.ts | 29 ++----------------- .../repositories/BlocksSummariesRepository.ts | 14 +++++---- .../src/repositories/HashratesRepository.ts | 2 +- 4 files changed, 16 insertions(+), 35 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index eee5dae6e..dacf1bfd5 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -589,11 +589,11 @@ class Blocks { if (!fastForwarded) { const lastBlock = await blocksRepository.$getBlockByHeight(blockExtended.height - 1); if (lastBlock !== null && blockExtended.previousblockhash !== lastBlock.id) { - logger.warn(`Chain divergence detected at block ${lastBlock.height}, re-indexing most recent data`); + logger.warn(`Chain divergence detected at block ${lastBlock.height}, re-indexing most recent data`, logger.tags.mining); // We assume there won't be a reorg with more than 10 block depth await BlocksRepository.$deleteBlocksFrom(lastBlock.height - 10); await HashratesRepository.$deleteLastEntries(); - await BlocksSummariesRepository.$deleteBlocksFrom(lastBlock.height - 10); + await BlocksSummariesRepository.$deleteTransactionsFrom(lastBlock.height - 10); // Will be re-index in formatDbBlockIntoExtendedBlock() await cpfpRepository.$deleteClustersFrom(lastBlock.height - 10); for (let i = 10; i >= 0; --i) { const newBlock = await this.$indexBlock(lastBlock.height - i); @@ -604,7 +604,7 @@ class Blocks { } await mining.$indexDifficultyAdjustments(); await DifficultyAdjustmentsRepository.$deleteLastAdjustment(); - logger.info(`Re-indexed 10 blocks and summaries. Also re-indexed the last difficulty adjustments. Will re-index latest hashrates in a few seconds.`); + logger.info(`Re-indexed 10 blocks and summaries. Also re-indexed the last difficulty adjustments. Will re-index latest hashrates in a few seconds.`, logger.tags.mining); indexer.reindex(); } await blocksRepository.$saveBlockInDatabase(blockExtended); diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 4758c0708..8d87c9537 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -466,30 +466,6 @@ class BlocksRepository { } } - /** - * Get one block by hash - */ - public async $getBlockByHash(hash: string): Promise { - try { - const query = ` - SELECT ${BLOCK_DB_FIELDS} - FROM blocks - JOIN pools ON blocks.pool_id = pools.id - WHERE hash = ?; - `; - const [rows]: any[] = await DB.query(query, [hash]); - - if (rows.length <= 0) { - return null; - } - - return await this.formatDbBlockIntoExtendedBlock(rows[0]); - } catch (e) { - logger.err(`Cannot get indexed block ${hash}. Reason: ` + (e instanceof Error ? e.message : e)); - throw e; - } - } - /** * Return blocks difficulty */ @@ -599,7 +575,7 @@ class BlocksRepository { if (blocks[idx].previous_block_hash !== blocks[idx - 1].hash) { logger.warn(`Chain divergence detected at block ${blocks[idx - 1].height}`); await this.$deleteBlocksFrom(blocks[idx - 1].height); - await BlocksSummariesRepository.$deleteBlocksFrom(blocks[idx - 1].height); + await BlocksSummariesRepository.$deleteTransactionsFrom(blocks[idx - 1].height); await HashratesRepository.$deleteHashratesFromTimestamp(blocks[idx - 1].timestamp - 604800); await DifficultyAdjustmentsRepository.$deleteAdjustementsFromHeight(blocks[idx - 1].height); return false; @@ -619,7 +595,7 @@ class BlocksRepository { * Delete blocks from the database from blockHeight */ public async $deleteBlocksFrom(blockHeight: number) { - logger.info(`Delete newer blocks from height ${blockHeight} from the database`); + logger.info(`Delete newer blocks from height ${blockHeight} from the database`, logger.tags.mining); try { await DB.query(`DELETE FROM blocks where height >= ${blockHeight}`); @@ -997,6 +973,7 @@ class BlocksRepository { } // If we're missing block summary related field, check if we can populate them on the fly now + // This is for example triggered upon re-org if (Common.blocksSummariesIndexingEnabled() && (extras.medianFeeAmt === null || extras.feePercentiles === null)) { diff --git a/backend/src/repositories/BlocksSummariesRepository.ts b/backend/src/repositories/BlocksSummariesRepository.ts index 2724ddcf5..b583a5f2c 100644 --- a/backend/src/repositories/BlocksSummariesRepository.ts +++ b/backend/src/repositories/BlocksSummariesRepository.ts @@ -17,7 +17,7 @@ class BlocksSummariesRepository { return undefined; } - public async $saveSummary(params: { height: number, mined?: BlockSummary}) { + public async $saveSummary(params: { height: number, mined?: BlockSummary}): Promise { const blockId = params.mined?.id; try { const transactions = JSON.stringify(params.mined?.transactions || []); @@ -71,13 +71,17 @@ class BlocksSummariesRepository { /** * Delete blocks from the database from blockHeight */ - public async $deleteBlocksFrom(blockHeight: number) { - logger.info(`Delete newer blocks summary from height ${blockHeight} from the database`); + public async $deleteTransactionsFrom(blockHeight: number): Promise { + logger.info(`Delete blocks summaries transactions from height ${blockHeight} from the database, but keep templates`, logger.tags.mining); try { - await DB.query(`DELETE FROM blocks_summaries where height >= ${blockHeight}`); + await DB.query(` + UPDATE blocks_summaries + SET transactions = '[]' + WHERE height >= ${blockHeight} + `); } catch (e) { - logger.err('Cannot delete indexed blocks summaries. Reason: ' + (e instanceof Error ? e.message : e)); + logger.err('Cannot delete blocks summaries transactions. Reason: ' + (e instanceof Error ? e.message : e)); } } diff --git a/backend/src/repositories/HashratesRepository.ts b/backend/src/repositories/HashratesRepository.ts index 875f77b34..96cbf6f75 100644 --- a/backend/src/repositories/HashratesRepository.ts +++ b/backend/src/repositories/HashratesRepository.ts @@ -220,7 +220,7 @@ class HashratesRepository { * Delete hashrates from the database from timestamp */ public async $deleteHashratesFromTimestamp(timestamp: number) { - logger.info(`Delete newer hashrates from timestamp ${new Date(timestamp * 1000).toUTCString()} from the database`); + logger.info(`Delete newer hashrates from timestamp ${new Date(timestamp * 1000).toUTCString()} from the database`, logger.tags.mining); try { await DB.query(`DELETE FROM hashrates WHERE hashrate_timestamp >= FROM_UNIXTIME(?)`, [timestamp]); From ea2193a42da6f679d7e2466962bb62cfb99d5bca Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 27 Mar 2023 20:02:33 +0900 Subject: [PATCH 178/782] Add missing sanity check when fetching single price datapoint --- backend/src/repositories/PricesRepository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/repositories/PricesRepository.ts b/backend/src/repositories/PricesRepository.ts index 4cbc06afd..ed9d1fd72 100644 --- a/backend/src/repositories/PricesRepository.ts +++ b/backend/src/repositories/PricesRepository.ts @@ -160,7 +160,7 @@ class PricesRepository { // Compute fiat exchange rates let latestPrice = rates[0] as ApiPrice; - if (latestPrice.USD === -1) { + if (!latestPrice || latestPrice.USD === -1) { latestPrice = priceUpdater.getEmptyPricesObj(); } From 96121a86f8de51edd60592b87c2cccb5b9b4632f Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 29 Mar 2023 17:35:49 +0900 Subject: [PATCH 179/782] Fix search 1wizS test --- frontend/cypress/e2e/mainnet/mainnet.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/cypress/e2e/mainnet/mainnet.spec.ts b/frontend/cypress/e2e/mainnet/mainnet.spec.ts index 71a35ba86..3319b4835 100644 --- a/frontend/cypress/e2e/mainnet/mainnet.spec.ts +++ b/frontend/cypress/e2e/mainnet/mainnet.spec.ts @@ -127,7 +127,7 @@ describe('Mainnet', () => { cy.get('.search-box-container > .form-control').type('S').then(() => { cy.wait('@search-1wizS'); - cy.get('app-search-results button.dropdown-item').should('have.length', 5); + cy.get('app-search-results button.dropdown-item').should('have.length', 6); }); cy.get('.search-box-container > .form-control').type('A').then(() => { From aba49897f9f2e145b7615504ae7564d4907a61b1 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 30 Mar 2023 17:07:34 +0900 Subject: [PATCH 180/782] Fix infinite scroll transaction list component --- .../transactions-list/transactions-list.component.html | 6 +++++- .../transactions-list/transactions-list.component.ts | 9 +-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index cb54e1870..adadf0a1c 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -1,3 +1,5 @@ + -
    +
    {{ errorUnblinded }}
    @@ -321,6 +323,8 @@ +
    + {{ item.value / pow(10, assetsMinimal[item.asset][3]) | number: '1.' + assetsMinimal[item.asset][3] + '-' + assetsMinimal[item.asset][3] }} {{ assetsMinimal[item.asset][1] }}
    diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.ts b/frontend/src/app/components/transactions-list/transactions-list.component.ts index b71046f68..53ddb449c 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.ts +++ b/frontend/src/app/components/transactions-list/transactions-list.component.ts @@ -182,14 +182,7 @@ export class TransactionsListComponent implements OnInit, OnChanges { } onScroll(): void { - const scrollHeight = document.body.scrollHeight; - const scrollTop = document.documentElement.scrollTop; - if (scrollHeight > 0) { - const percentageScrolled = scrollTop * 100 / scrollHeight; - if (percentageScrolled > 50) { - this.loadMore.emit(); - } - } + this.loadMore.emit(); } haveBlindedOutputValues(tx: Transaction): boolean { From 44bbb472d3683bd83efba7d50126d08ced718720 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Fri, 31 Mar 2023 12:08:05 +0900 Subject: [PATCH 181/782] Keep re-org'ed block summaries in the database --- backend/src/api/blocks.ts | 5 ++--- backend/src/repositories/BlocksRepository.ts | 2 +- .../repositories/BlocksSummariesRepository.ts | 16 +++++++++++++++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index dacf1bfd5..cc7dc6588 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -593,7 +593,6 @@ class Blocks { // We assume there won't be a reorg with more than 10 block depth await BlocksRepository.$deleteBlocksFrom(lastBlock.height - 10); await HashratesRepository.$deleteLastEntries(); - await BlocksSummariesRepository.$deleteTransactionsFrom(lastBlock.height - 10); // Will be re-index in formatDbBlockIntoExtendedBlock() await cpfpRepository.$deleteClustersFrom(lastBlock.height - 10); for (let i = 10; i >= 0; --i) { const newBlock = await this.$indexBlock(lastBlock.height - i); @@ -736,7 +735,7 @@ class Blocks { // Index the response if needed if (Common.blocksSummariesIndexingEnabled() === true) { - await BlocksSummariesRepository.$saveSummary({height: block.height, mined: summary}); + await BlocksSummariesRepository.$saveTransactions(block.height, block.hash, summary.transactions); } return summary.transactions; @@ -852,7 +851,7 @@ class Blocks { if (cleanBlock.fee_amt_percentiles === null) { const block = await bitcoinClient.getBlock(cleanBlock.hash, 2); const summary = this.summarizeBlock(block); - await BlocksSummariesRepository.$saveSummary({ height: block.height, mined: summary }); + await BlocksSummariesRepository.$saveTransactions(cleanBlock.height, cleanBlock.hash, summary.transactions); cleanBlock.fee_amt_percentiles = await BlocksSummariesRepository.$getFeePercentilesByBlockId(cleanBlock.hash); } if (cleanBlock.fee_amt_percentiles !== null) { diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 8d87c9537..251d86403 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -981,7 +981,7 @@ class BlocksRepository { if (extras.feePercentiles === null) { const block = await bitcoinClient.getBlock(dbBlk.id, 2); const summary = blocks.summarizeBlock(block); - await BlocksSummariesRepository.$saveSummary({ height: block.height, mined: summary }); + await BlocksSummariesRepository.$saveTransactions(dbBlk.height, dbBlk.hash, summary.transactions); extras.feePercentiles = await BlocksSummariesRepository.$getFeePercentilesByBlockId(dbBlk.id); } if (extras.feePercentiles !== null) { diff --git a/backend/src/repositories/BlocksSummariesRepository.ts b/backend/src/repositories/BlocksSummariesRepository.ts index b583a5f2c..570aee473 100644 --- a/backend/src/repositories/BlocksSummariesRepository.ts +++ b/backend/src/repositories/BlocksSummariesRepository.ts @@ -1,6 +1,6 @@ import DB from '../database'; import logger from '../logger'; -import { BlockSummary } from '../mempool.interfaces'; +import { BlockSummary, TransactionStripped } from '../mempool.interfaces'; class BlocksSummariesRepository { public async $getByBlockId(id: string): Promise { @@ -37,6 +37,20 @@ class BlocksSummariesRepository { } } + public async $saveTransactions(blockHeight: number, blockId: string, transactions: TransactionStripped[]): Promise { + try { + const transactionsStr = JSON.stringify(transactions); + await DB.query(` + INSERT INTO blocks_summaries + SET height = ?, transactions = ?, id = ? + ON DUPLICATE KEY UPDATE transactions = ?`, + [blockHeight, transactionsStr, blockId, transactionsStr]); + } catch (e: any) { + logger.debug(`Cannot save block summary transactions for ${blockId}. Reason: ${e instanceof Error ? e.message : e}`); + throw e; + } + } + public async $saveTemplate(params: { height: number, template: BlockSummary}) { const blockId = params.template?.id; try { From 816fb3bf01fcaff65666dd5c4ed1bfea49a1d6da Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Fri, 31 Mar 2023 12:22:26 +0900 Subject: [PATCH 182/782] Don't delete transactions when checking if the current chain is valid --- backend/src/repositories/BlocksRepository.ts | 1 - .../repositories/BlocksSummariesRepository.ts | 17 ----------------- 2 files changed, 18 deletions(-) diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 251d86403..69d597e1f 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -575,7 +575,6 @@ class BlocksRepository { if (blocks[idx].previous_block_hash !== blocks[idx - 1].hash) { logger.warn(`Chain divergence detected at block ${blocks[idx - 1].height}`); await this.$deleteBlocksFrom(blocks[idx - 1].height); - await BlocksSummariesRepository.$deleteTransactionsFrom(blocks[idx - 1].height); await HashratesRepository.$deleteHashratesFromTimestamp(blocks[idx - 1].timestamp - 604800); await DifficultyAdjustmentsRepository.$deleteAdjustementsFromHeight(blocks[idx - 1].height); return false; diff --git a/backend/src/repositories/BlocksSummariesRepository.ts b/backend/src/repositories/BlocksSummariesRepository.ts index 570aee473..de70322bd 100644 --- a/backend/src/repositories/BlocksSummariesRepository.ts +++ b/backend/src/repositories/BlocksSummariesRepository.ts @@ -82,23 +82,6 @@ class BlocksSummariesRepository { return []; } - /** - * Delete blocks from the database from blockHeight - */ - public async $deleteTransactionsFrom(blockHeight: number): Promise { - logger.info(`Delete blocks summaries transactions from height ${blockHeight} from the database, but keep templates`, logger.tags.mining); - - try { - await DB.query(` - UPDATE blocks_summaries - SET transactions = '[]' - WHERE height >= ${blockHeight} - `); - } catch (e) { - logger.err('Cannot delete blocks summaries transactions. Reason: ' + (e instanceof Error ? e.message : e)); - } - } - /** * Get the fee percentiles if the block has already been indexed, [] otherwise * From 321161ede98fd5fbd435cd168e7a11117b3f7c68 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Tue, 14 Mar 2023 13:53:52 +0900 Subject: [PATCH 183/782] Cleanup some log --- backend/src/api/blocks.ts | 5 +++-- backend/src/api/disk-cache.ts | 2 +- backend/src/api/mining/mining.ts | 8 +++++--- backend/src/tasks/lightning/forensics.service.ts | 10 +++++----- backend/src/tasks/lightning/network-sync.service.ts | 2 +- backend/src/tasks/pools-updater.ts | 2 +- backend/src/tasks/price-updater.ts | 2 +- 7 files changed, 17 insertions(+), 14 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index eee5dae6e..4d7e4e2a8 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -410,12 +410,13 @@ class Blocks { try { // Get all indexed block hash const unindexedBlockHeights = await blocksRepository.$getCPFPUnindexedBlocks(); - logger.info(`Indexing cpfp data for ${unindexedBlockHeights.length} blocks`); if (!unindexedBlockHeights?.length) { return; } + logger.info(`Indexing cpfp data for ${unindexedBlockHeights.length} blocks`); + // Logging let count = 0; let countThisRun = 0; @@ -616,7 +617,7 @@ class Blocks { priceId: lastestPriceId, }]); } else { - logger.info(`Cannot save block price for ${blockExtended.height} because the price updater hasnt completed yet. Trying again in 10 seconds.`, logger.tags.mining); + logger.debug(`Cannot save block price for ${blockExtended.height} because the price updater hasnt completed yet. Trying again in 10 seconds.`, logger.tags.mining); setTimeout(() => { indexer.runSingleTask('blocksPrices'); }, 10000); diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 0ec502c08..c50d3cef8 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -164,7 +164,7 @@ class DiskCache { } } } catch (e) { - logger.info('Error parsing ' + fileName + '. Skipping. Reason: ' + (e instanceof Error ? e.message : e)); + logger.err('Error parsing ' + fileName + '. Skipping. Reason: ' + (e instanceof Error ? e.message : e)); } } diff --git a/backend/src/api/mining/mining.ts b/backend/src/api/mining/mining.ts index 58626df65..27ac426bd 100644 --- a/backend/src/api/mining/mining.ts +++ b/backend/src/api/mining/mining.ts @@ -452,7 +452,7 @@ class Mining { const elapsedSeconds = Math.max(1, Math.round((new Date().getTime() / 1000) - timer)); if (elapsedSeconds > 5) { const progress = Math.round(totalBlockChecked / blocks.length * 100); - logger.info(`Indexing difficulty adjustment at block #${block.height} | Progress: ${progress}%`, logger.tags.mining); + logger.debug(`Indexing difficulty adjustment at block #${block.height} | Progress: ${progress}%`, logger.tags.mining); timer = new Date().getTime() / 1000; } } @@ -558,8 +558,10 @@ class Mining { currentBlockHeight -= 10000; } - if (totalIndexed) { - logger.info(`Indexing missing coinstatsindex data completed`, logger.tags.mining); + if (totalIndexed > 0) { + logger.info(`Indexing missing coinstatsindex data completed. Indexed ${totalIndexed}`, logger.tags.mining); + } else { + logger.debug(`Indexing missing coinstatsindex data completed. Indexed 0.`, logger.tags.mining); } } diff --git a/backend/src/tasks/lightning/forensics.service.ts b/backend/src/tasks/lightning/forensics.service.ts index c62639411..7837cb4d5 100644 --- a/backend/src/tasks/lightning/forensics.service.ts +++ b/backend/src/tasks/lightning/forensics.service.ts @@ -27,7 +27,7 @@ class ForensicsService { private async $runTasks(): Promise { try { - logger.info(`Running forensics scans`); + logger.debug(`Running forensics scans`); if (config.MEMPOOL.BACKEND === 'esplora') { await this.$runClosedChannelsForensics(false); @@ -73,7 +73,7 @@ class ForensicsService { let progress = 0; try { - logger.info(`Started running closed channel forensics...`); + logger.debug(`Started running closed channel forensics...`); let channels; if (onlyNewChannels) { channels = await channelsApi.$getClosedChannelsWithoutReason(); @@ -156,7 +156,7 @@ class ForensicsService { this.loggerTimer = new Date().getTime() / 1000; } } - logger.info(`Closed channels forensics scan complete.`); + logger.debug(`Closed channels forensics scan complete.`); } catch (e) { logger.err('$runClosedChannelsForensics() error: ' + (e instanceof Error ? e.message : e)); } @@ -217,7 +217,7 @@ class ForensicsService { let progress = 0; try { - logger.info(`Started running open channel forensics...`); + logger.debug(`Started running open channel forensics...`); const channels = await channelsApi.$getChannelsWithoutSourceChecked(); for (const openChannel of channels) { @@ -266,7 +266,7 @@ class ForensicsService { } } - logger.info(`Open channels forensics scan complete.`); + logger.debug(`Open channels forensics scan complete.`); } catch (e) { logger.err('$runOpenedChannelsForensics() error: ' + (e instanceof Error ? e.message : e)); } finally { diff --git a/backend/src/tasks/lightning/network-sync.service.ts b/backend/src/tasks/lightning/network-sync.service.ts index 3e5ae1366..28f60bbf9 100644 --- a/backend/src/tasks/lightning/network-sync.service.ts +++ b/backend/src/tasks/lightning/network-sync.service.ts @@ -283,7 +283,7 @@ class NetworkSyncService { } else { log += ` for the first time`; } - logger.info(`${log}`, logger.tags.ln); + logger.debug(`${log}`, logger.tags.ln); const channels = await channelsApi.$getChannelsByStatus([0, 1]); for (const channel of channels) { diff --git a/backend/src/tasks/pools-updater.ts b/backend/src/tasks/pools-updater.ts index fb86d03be..b24da124e 100644 --- a/backend/src/tasks/pools-updater.ts +++ b/backend/src/tasks/pools-updater.ts @@ -62,7 +62,7 @@ class PoolsUpdater { if (this.currentSha === null) { logger.info(`Downloading pools-v2.json for the first time from ${this.poolsUrl} over ${network}`, logger.tags.mining); } else { - logger.warn(`pools-v2.json is outdated, fetch latest from ${this.poolsUrl} over ${network}`, logger.tags.mining); + logger.warn(`pools-v2.json is outdated, fetching latest from ${this.poolsUrl} over ${network}`, logger.tags.mining); } const poolsJson = await this.query(this.poolsUrl); if (poolsJson === undefined) { diff --git a/backend/src/tasks/price-updater.ts b/backend/src/tasks/price-updater.ts index 716ac9ee6..3b9dad30e 100644 --- a/backend/src/tasks/price-updater.ts +++ b/backend/src/tasks/price-updater.ts @@ -222,7 +222,7 @@ class PriceUpdater { private async $insertMissingRecentPrices(type: 'hour' | 'day'): Promise { const existingPriceTimes = await PricesRepository.$getPricesTimes(); - logger.info(`Fetching ${type === 'day' ? 'dai' : 'hour'}ly price history from exchanges and saving missing ones into the database`, logger.tags.mining); + logger.debug(`Fetching ${type === 'day' ? 'dai' : 'hour'}ly price history from exchanges and saving missing ones into the database`, logger.tags.mining); const historicalPrices: PriceHistory[] = []; From 482a609d84df962cd4b1269a0ba2e0b3425a65ec Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 19 Mar 2023 13:04:36 +0900 Subject: [PATCH 184/782] Update backend NPM libs --- backend/package-lock.json | 2200 +++++++++++++++++++------------------ backend/package.json | 26 +- backend/tsconfig.json | 1 + 3 files changed, 1120 insertions(+), 1107 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 60c9df9f3..1b1e2f442 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,35 +9,35 @@ "version": "2.6.0-dev", "license": "GNU Affero General Public License v3.0", "dependencies": { - "@babel/core": "^7.20.12", + "@babel/core": "^7.21.3", "@mempool/electrum-client": "1.1.9", - "@types/node": "^16.18.11", + "@types/node": "^18.15.3", "axios": "~0.27.2", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", "maxmind": "~4.3.8", - "mysql2": "~2.3.3", + "mysql2": "~3.2.0", "node-worker-threads-pool": "~1.5.1", "socks-proxy-agent": "~7.0.0", "typescript": "~4.7.4", - "ws": "~8.11.0" + "ws": "~8.13.0" }, "devDependencies": { "@babel/code-frame": "^7.18.6", - "@babel/core": "^7.20.7", + "@babel/core": "^7.21.3", "@types/compression": "^1.7.2", "@types/crypto-js": "^4.1.1", "@types/express": "^4.17.15", - "@types/jest": "^29.2.5", + "@types/jest": "^29.5.0", "@types/ws": "~8.5.4", - "@typescript-eslint/eslint-plugin": "^5.48.1", - "@typescript-eslint/parser": "^5.48.1", - "eslint": "^8.31.0", - "eslint-config-prettier": "^8.5.0", - "jest": "^29.3.1", - "prettier": "^2.8.2", - "ts-jest": "^29.0.3", + "@typescript-eslint/eslint-plugin": "^5.55.0", + "@typescript-eslint/parser": "^5.55.0", + "eslint": "^8.36.0", + "eslint-config-prettier": "^8.7.0", + "jest": "^29.5.0", + "prettier": "^2.8.4", + "ts-jest": "^29.0.5", "ts-node": "^10.9.1" } }, @@ -76,25 +76,25 @@ } }, "node_modules/@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.3", "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -129,13 +129,14 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -200,13 +201,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -237,9 +238,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -248,8 +249,8 @@ "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" @@ -316,14 +317,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -415,9 +416,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -618,19 +619,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", - "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.3", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -662,9 +663,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -703,15 +704,39 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -744,9 +769,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -776,6 +801,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -941,16 +975,16 @@ } }, "node_modules/@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0" }, "engines": { @@ -958,37 +992,37 @@ } }, "node_modules/@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", "dev": true, "dependencies": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1005,88 +1039,88 @@ } }, "node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.3.1" + "jest-mock": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", "dev": true, "dependencies": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", "dev": true, "dependencies": { - "jest-get-type": "^29.2.0" + "jest-get-type": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", @@ -1099,9 +1133,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1120,21 +1154,21 @@ } }, "node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.15", @@ -1146,13 +1180,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", "dev": true, "dependencies": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1161,14 +1195,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.3.1", + "@jest/test-result": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", + "jest-haste-map": "^29.5.0", "slash": "^3.0.0" }, "engines": { @@ -1176,26 +1210,26 @@ } }, "node_modules/@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -1208,12 +1242,12 @@ "dev": true }, "node_modules/@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1315,27 +1349,27 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^2.0.0" } }, "node_modules/@tsconfig/node10": { @@ -1363,13 +1397,13 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", - "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -1461,9 +1495,9 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "dependencies": { "@types/node": "*" @@ -1494,9 +1528,9 @@ } }, "node_modules/@types/jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.5.tgz", - "integrity": "sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1516,14 +1550,14 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", - "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==" + "version": "18.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", + "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" }, "node_modules/@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "node_modules/@types/qs": { @@ -1585,18 +1619,19 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz", - "integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", + "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.48.1", - "@typescript-eslint/type-utils": "5.48.1", - "@typescript-eslint/utils": "5.48.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/type-utils": "5.55.0", + "@typescript-eslint/utils": "5.55.0", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -1656,14 +1691,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz", - "integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.48.1", - "@typescript-eslint/types": "5.48.1", - "@typescript-eslint/typescript-estree": "5.48.1", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", "debug": "^4.3.4" }, "engines": { @@ -1706,13 +1741,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz", - "integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.1", - "@typescript-eslint/visitor-keys": "5.48.1" + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1723,13 +1758,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz", - "integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", + "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.48.1", - "@typescript-eslint/utils": "5.48.1", + "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/utils": "5.55.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1773,9 +1808,9 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz", - "integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1786,13 +1821,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz", - "integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.1", - "@typescript-eslint/visitor-keys": "5.48.1", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1851,18 +1886,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz", - "integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", + "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.48.1", - "@typescript-eslint/types": "5.48.1", - "@typescript-eslint/typescript-estree": "5.48.1", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -1892,12 +1927,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz", - "integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/types": "5.55.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2091,15 +2126,15 @@ } }, "node_modules/babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", "dev": true, "dependencies": { - "@jest/transform": "^29.3.1", + "@jest/transform": "^29.5.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", + "babel-preset-jest": "^29.5.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -2128,9 +2163,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -2166,12 +2201,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.2.0", + "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -2617,9 +2652,9 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2634,9 +2669,9 @@ } }, "node_modules/denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "engines": { "node": ">=0.10" } @@ -2677,9 +2712,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2779,12 +2814,15 @@ } }, "node_modules/eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", - "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -2795,10 +2833,9 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -2819,7 +2856,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -2835,9 +2871,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", + "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -2859,33 +2895,6 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", @@ -2980,9 +2989,9 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -3010,9 +3019,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -3110,16 +3119,16 @@ } }, "node_modules/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3866,15 +3875,15 @@ } }, "node_modules/jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", "dev": true, "dependencies": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", "import-local": "^3.0.2", - "jest-cli": "^29.3.1" + "jest-cli": "^29.5.0" }, "bin": { "jest": "bin/jest.js" @@ -3892,9 +3901,9 @@ } }, "node_modules/jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, "dependencies": { "execa": "^5.0.0", @@ -3905,28 +3914,29 @@ } }, "node_modules/jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", "dev": true, "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3935,21 +3945,21 @@ } }, "node_modules/jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", "dev": true, "dependencies": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -3969,31 +3979,31 @@ } }, "node_modules/jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -4014,24 +4024,24 @@ } }, "node_modules/jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4041,62 +4051,62 @@ } }, "node_modules/jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", "dev": true, "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4108,46 +4118,46 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", "dev": true, "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4156,14 +4166,14 @@ } }, "node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-util": "^29.3.1" + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4187,28 +4197,28 @@ } }, "node_modules/jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", + "jest-haste-map": "^29.5.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { @@ -4216,43 +4226,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", "dev": true, "dependencies": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", "dev": true, "dependencies": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -4261,31 +4271,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", "dev": true, "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -4294,9 +4304,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -4305,23 +4315,22 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.3.1", + "expect": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", "semver": "^7.3.5" }, "engines": { @@ -4344,12 +4353,12 @@ } }, "node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -4361,17 +4370,17 @@ } }, "node_modules/jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", "dev": true, "dependencies": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", + "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.3.1" + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4390,18 +4399,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", "dev": true, "dependencies": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.3.1", + "jest-util": "^29.5.0", "string-length": "^4.0.1" }, "engines": { @@ -4409,13 +4418,13 @@ } }, "node_modules/jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.3.1", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4497,9 +4506,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -4573,14 +4582,15 @@ "dev": true }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" }, "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" }, @@ -4756,16 +4766,16 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/mysql2": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", - "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.0.tgz", + "integrity": "sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==", "dependencies": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^7.14.1", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" }, @@ -4784,31 +4794,33 @@ "node": ">=0.10.0" } }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, "node_modules/named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "dependencies": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.0.0" } }, "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" } }, - "node_modules/named-placeholders/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -5152,9 +5164,9 @@ } }, "node_modules/prettier": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.2.tgz", - "integrity": "sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -5167,12 +5179,12 @@ } }, "node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -5217,20 +5229,31 @@ "node": ">= 0.10" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "node_modules/punycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.2.0.tgz", - "integrity": "sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", + "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -5306,18 +5329,6 @@ "node": ">= 6" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5375,9 +5386,9 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", + "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", "dev": true, "engines": { "node": ">=10" @@ -5866,15 +5877,15 @@ } }, "node_modules/ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", - "json5": "^2.2.1", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", @@ -6112,9 +6123,9 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -6219,15 +6230,15 @@ } }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -6250,12 +6261,13 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -6328,25 +6340,25 @@ "dev": true }, "@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", "dev": true, "requires": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.3", "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "dependencies": { @@ -6368,13 +6380,14 @@ } }, "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "dev": true, "requires": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -6428,13 +6441,13 @@ "dev": true }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" } }, "@babel/helper-hoist-variables": { @@ -6456,9 +6469,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", @@ -6467,8 +6480,8 @@ "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" } }, "@babel/helper-plugin-utils": { @@ -6514,14 +6527,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "requires": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" } }, "@babel/highlight": { @@ -6594,9 +6607,9 @@ } }, "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -6737,19 +6750,19 @@ } }, "@babel/traverse": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", - "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.3", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -6772,9 +6785,9 @@ } }, "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.19.4", @@ -6809,15 +6822,30 @@ } } }, + "@eslint-community/eslint-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", + "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -6836,9 +6864,9 @@ } }, "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -6858,6 +6886,12 @@ } } }, + "@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -6982,123 +7016,123 @@ "dev": true }, "@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", "dev": true, "requires": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", "dev": true, "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.3.1" + "jest-mock": "^29.5.0" } }, "@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", "dev": true, "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" } }, "@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", "dev": true, "requires": { - "jest-get-type": "^29.2.0" + "jest-get-type": "^29.4.3" } }, "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", "dev": true, "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" } }, "@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", "dev": true, "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" } }, "@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", @@ -7111,9 +7145,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -7121,18 +7155,18 @@ } }, "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.25.16" } }, "@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.15", @@ -7141,50 +7175,50 @@ } }, "@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", "dev": true, "requires": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", "dev": true, "requires": { - "@jest/test-result": "^29.3.1", + "@jest/test-result": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", + "jest-haste-map": "^29.5.0", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "dependencies": { "convert-source-map": { @@ -7196,12 +7230,12 @@ } }, "@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", "dev": true, "requires": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -7279,27 +7313,27 @@ } }, "@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^2.0.0" } }, "@tsconfig/node10": { @@ -7327,13 +7361,13 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", - "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -7425,9 +7459,9 @@ } }, "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "requires": { "@types/node": "*" @@ -7458,9 +7492,9 @@ } }, "@types/jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.5.tgz", - "integrity": "sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", "dev": true, "requires": { "expect": "^29.0.0", @@ -7480,14 +7514,14 @@ "dev": true }, "@types/node": { - "version": "16.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", - "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==" + "version": "18.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", + "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" }, "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "@types/qs": { @@ -7549,18 +7583,19 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.1.tgz", - "integrity": "sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", + "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.48.1", - "@typescript-eslint/type-utils": "5.48.1", - "@typescript-eslint/utils": "5.48.1", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/type-utils": "5.55.0", + "@typescript-eslint/utils": "5.55.0", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -7592,14 +7627,14 @@ } }, "@typescript-eslint/parser": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz", - "integrity": "sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.48.1", - "@typescript-eslint/types": "5.48.1", - "@typescript-eslint/typescript-estree": "5.48.1", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", "debug": "^4.3.4" }, "dependencies": { @@ -7621,23 +7656,23 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz", - "integrity": "sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.1", - "@typescript-eslint/visitor-keys": "5.48.1" + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0" } }, "@typescript-eslint/type-utils": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.1.tgz", - "integrity": "sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", + "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.48.1", - "@typescript-eslint/utils": "5.48.1", + "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/utils": "5.55.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -7660,19 +7695,19 @@ } }, "@typescript-eslint/types": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz", - "integrity": "sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.1.tgz", - "integrity": "sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.1", - "@typescript-eslint/visitor-keys": "5.48.1", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7707,18 +7742,18 @@ } }, "@typescript-eslint/utils": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.1.tgz", - "integrity": "sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", + "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.48.1", - "@typescript-eslint/types": "5.48.1", - "@typescript-eslint/typescript-estree": "5.48.1", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "dependencies": { @@ -7734,12 +7769,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.1.tgz", - "integrity": "sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==", + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.1", + "@typescript-eslint/types": "5.55.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -7878,15 +7913,15 @@ } }, "babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", "dev": true, "requires": { - "@jest/transform": "^29.3.1", + "@jest/transform": "^29.5.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", + "babel-preset-jest": "^29.5.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -7906,9 +7941,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -7938,12 +7973,12 @@ } }, "babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^29.2.0", + "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -8294,9 +8329,9 @@ "dev": true }, "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "delayed-stream": { @@ -8305,9 +8340,9 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, "depd": { "version": "2.0.0", @@ -8332,9 +8367,9 @@ "dev": true }, "diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true }, "dir-glob": { @@ -8410,12 +8445,15 @@ "dev": true }, "eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", - "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.1", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8426,10 +8464,9 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -8450,7 +8487,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -8511,9 +8547,9 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", + "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", "dev": true, "requires": {} }, @@ -8527,23 +8563,6 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", @@ -8551,9 +8570,9 @@ "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -8568,9 +8587,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -8642,16 +8661,16 @@ "dev": true }, "expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", "dev": true, "requires": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" } }, "express": { @@ -9208,21 +9227,21 @@ } }, "jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", "dev": true, "requires": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", "import-local": "^3.0.2", - "jest-cli": "^29.3.1" + "jest-cli": "^29.5.0" } }, "jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, "requires": { "execa": "^5.0.0", @@ -9230,204 +9249,205 @@ } }, "jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", "dev": true, "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", "dev": true, "requires": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "prompts": "^2.0.1", "yargs": "^17.3.1" } }, "jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } }, "jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" } }, "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" } }, "jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", "dev": true, "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" } }, "jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true }, "jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", "dev": true, "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" } }, "jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" } }, "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-util": "^29.3.1" + "jest-util": "^29.5.0" } }, "jest-pnp-resolver": { @@ -9438,101 +9458,101 @@ "requires": {} }, "jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", + "jest-haste-map": "^29.5.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", "dev": true, "requires": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" } }, "jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", "dev": true, "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", "dev": true, "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -9541,23 +9561,22 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.3.1", + "expect": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", + "pretty-format": "^29.5.0", "semver": "^7.3.5" }, "dependencies": { @@ -9573,12 +9592,12 @@ } }, "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -9587,17 +9606,17 @@ } }, "jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", "dev": true, "requires": { - "@jest/types": "^29.3.1", + "@jest/types": "^29.5.0", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", + "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.3.1" + "pretty-format": "^29.5.0" }, "dependencies": { "camelcase": { @@ -9609,29 +9628,29 @@ } }, "jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", "dev": true, "requires": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.3.1", + "jest-util": "^29.5.0", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.3.1", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -9693,9 +9712,9 @@ "dev": true }, "json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "kleur": { @@ -9748,14 +9767,15 @@ "dev": true }, "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" }, "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, "requires": { "yallist": "^4.0.0" } @@ -9884,16 +9904,16 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "mysql2": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", - "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.0.tgz", + "integrity": "sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==", "requires": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^7.14.1", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" }, @@ -9905,30 +9925,26 @@ "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "requires": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" }, "dependencies": { "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, @@ -10184,18 +10200,18 @@ "dev": true }, "prettier": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.2.tgz", - "integrity": "sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true }, "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", "dev": true, "requires": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10227,15 +10243,16 @@ "ipaddr.js": "1.9.1" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "punycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.2.0.tgz", - "integrity": "sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "pure-rand": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", + "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", "dev": true }, "qs": { @@ -10284,12 +10301,6 @@ "util-deprecate": "^1.0.1" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10331,9 +10342,9 @@ "dev": true }, "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", + "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", "dev": true }, "reusify": { @@ -10685,15 +10696,15 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", "dev": true, "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", - "json5": "^2.2.1", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", @@ -10828,9 +10839,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", @@ -10911,9 +10922,9 @@ } }, "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "requires": {} }, "y18n": { @@ -10925,12 +10936,13 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "requires": { "cliui": "^8.0.1", diff --git a/backend/package.json b/backend/package.json index 40241fa66..ed1328cdf 100644 --- a/backend/package.json +++ b/backend/package.json @@ -34,35 +34,35 @@ "prettier": "./node_modules/.bin/prettier --write \"src/**/*.{js,ts}\"" }, "dependencies": { - "@babel/core": "^7.20.12", + "@babel/core": "^7.21.3", "@mempool/electrum-client": "1.1.9", - "@types/node": "^16.18.11", + "@types/node": "^18.15.3", "axios": "~0.27.2", "bitcoinjs-lib": "~6.1.0", "crypto-js": "~4.1.1", "express": "~4.18.2", "maxmind": "~4.3.8", - "mysql2": "~2.3.3", + "mysql2": "~3.2.0", "node-worker-threads-pool": "~1.5.1", "socks-proxy-agent": "~7.0.0", "typescript": "~4.7.4", - "ws": "~8.11.0" + "ws": "~8.13.0" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.21.3", "@babel/code-frame": "^7.18.6", "@types/compression": "^1.7.2", "@types/crypto-js": "^4.1.1", "@types/express": "^4.17.15", - "@types/jest": "^29.2.5", + "@types/jest": "^29.5.0", "@types/ws": "~8.5.4", - "@typescript-eslint/eslint-plugin": "^5.48.1", - "@typescript-eslint/parser": "^5.48.1", - "eslint": "^8.31.0", - "eslint-config-prettier": "^8.5.0", - "jest": "^29.3.1", - "prettier": "^2.8.2", - "ts-jest": "^29.0.3", + "@typescript-eslint/eslint-plugin": "^5.55.0", + "@typescript-eslint/parser": "^5.55.0", + "eslint": "^8.36.0", + "eslint-config-prettier": "^8.7.0", + "jest": "^29.5.0", + "prettier": "^2.8.4", + "ts-jest": "^29.0.5", "ts-node": "^10.9.1" } } diff --git a/backend/tsconfig.json b/backend/tsconfig.json index 0670010e1..bfab64081 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -5,6 +5,7 @@ "types": ["node", "jest"], "lib": ["es2019", "dom"], "strict": true, + "skipLibCheck": true, "noImplicitAny": false, "sourceMap": false, "outDir": "dist", From fc29943d0fe7536374e709507a9a6b6414190549 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 1 Apr 2023 12:16:59 +0900 Subject: [PATCH 185/782] Upgrading deps --- backend/package-lock.json | 4781 +++++++++++++++++++++++++++---------- 1 file changed, 3543 insertions(+), 1238 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 1b1e2f442..a2106ac9f 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -55,9 +55,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" @@ -67,30 +67,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", - "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", + "@babel/parser": "^7.21.4", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -105,36 +105,13 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/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 - }, "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.21.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -158,13 +135,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -176,21 +153,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -226,12 +188,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" @@ -308,9 +270,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -344,81 +306,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -488,12 +379,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -590,12 +481,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -619,19 +510,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -639,33 +530,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/traverse/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 - }, "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -705,9 +573,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", - "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" @@ -720,23 +588,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -751,23 +619,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -783,12 +634,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/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 - }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -802,9 +647,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -824,29 +669,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/config-array/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 - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -991,6 +813,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/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/@jest/console/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/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/core": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", @@ -1038,6 +930,76 @@ } } }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/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/@jest/core/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/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/environment": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", @@ -1153,6 +1115,76 @@ } } }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/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/@jest/reporters/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/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", @@ -1235,12 +1267,82 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/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/@jest/transform/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/@jest/transform/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/types": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", @@ -1258,6 +1360,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/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/@jest/types/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/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -1438,9 +1610,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "dependencies": { "@types/connect": "*", @@ -1457,9 +1629,9 @@ } }, "node_modules/@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -1472,21 +1644,21 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", - "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", "dev": true, "dependencies": { "@types/node": "*", @@ -1544,15 +1716,15 @@ "dev": true }, "node_modules/@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", "dev": true }, "node_modules/@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" }, "node_modules/@types/prettier": { "version": "2.7.2", @@ -1579,9 +1751,9 @@ "dev": true }, "node_modules/@types/serve-static": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz", - "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", "dev": true, "dependencies": { "@types/mime": "*", @@ -1604,9 +1776,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", - "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -1619,15 +1791,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", - "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/type-utils": "5.55.0", - "@typescript-eslint/utils": "5.55.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -1652,33 +1824,22 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@typescript-eslint/eslint-plugin/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": { - "ms": "2.1.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/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 - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -1690,15 +1851,21 @@ "node": ">=10" } }, + "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/parser": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", - "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" }, "engines": { @@ -1717,37 +1884,14 @@ } } }, - "node_modules/@typescript-eslint/parser/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/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 - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", - "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0" + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1758,13 +1902,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", - "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.55.0", - "@typescript-eslint/utils": "5.55.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1784,33 +1928,10 @@ } } }, - "node_modules/@typescript-eslint/type-utils/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/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 - }, "node_modules/@typescript-eslint/types": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", - "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1821,13 +1942,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", - "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1847,29 +1968,18 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@typescript-eslint/typescript-estree/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": { - "ms": "2.1.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/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 - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -1885,18 +1995,24 @@ "node": ">=10" } }, + "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", - "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1911,6 +2027,18 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/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/@typescript-eslint/utils/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -1926,13 +2054,19 @@ "node": ">=10" } }, + "node_modules/@typescript-eslint/utils/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/@typescript-eslint/visitor-keys": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", - "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1956,9 +2090,9 @@ } }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1996,27 +2130,6 @@ "node": ">= 6.0.0" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/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==" - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2058,18 +2171,15 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/anymatch": { @@ -2100,7 +2210,7 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-union": { "version": "2.1.0", @@ -2114,7 +2224,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { "version": "0.27.2", @@ -2146,6 +2256,76 @@ "@babel/core": "^7.8.0" } }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/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/babel-jest/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/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -2217,9 +2397,9 @@ } }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/base-x": { @@ -2284,6 +2464,19 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2307,9 +2500,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "funding": [ { @@ -2322,10 +2515,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" @@ -2349,7 +2542,7 @@ "node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { "base-x": "^3.0.2" } @@ -2418,9 +2611,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001473", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz", + "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", "dev": true, "funding": [ { @@ -2430,23 +2623,25 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, "node_modules/char-regex": { @@ -2459,10 +2654,16 @@ } }, "node_modules/ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { "node": ">=8" } @@ -2513,21 +2714,18 @@ "dev": true }, "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==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "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==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/combined-stream": { @@ -2544,7 +2742,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/content-disposition": { @@ -2559,26 +2757,17 @@ } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "node_modules/cookie": { @@ -2592,7 +2781,7 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/create-hash": { "version": "1.2.0", @@ -2632,11 +2821,19 @@ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "2.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/dedent": { @@ -2663,7 +2860,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } @@ -2747,12 +2944,12 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.348", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.348.tgz", + "integrity": "sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==", "dev": true }, "node_modules/emittery": { @@ -2776,7 +2973,7 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } @@ -2802,27 +2999,27 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -2833,8 +3030,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2871,9 +3068,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", - "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -2896,31 +3093,66 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "ms": "2.1.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/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/eslint/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/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2956,9 +3188,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2970,11 +3202,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/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 + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", @@ -2989,14 +3236,14 @@ } }, "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3081,7 +3328,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } @@ -3175,6 +3422,19 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3222,9 +3482,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3280,6 +3540,19 @@ "node": ">= 0.8" } }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3310,9 +3583,9 @@ } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "node_modules/follow-redirects": { @@ -3358,7 +3631,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -3366,7 +3639,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { @@ -3415,9 +3688,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -3449,15 +3722,15 @@ } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -3510,9 +3783,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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 }, "node_modules/grapheme-splitter": { @@ -3533,12 +3806,12 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-symbols": { @@ -3607,9 +3880,9 @@ } }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -3662,7 +3935,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -3675,9 +3948,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -3765,7 +4038,7 @@ "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, "node_modules/is-stream": { "version": "2.0.1", @@ -3824,6 +4097,27 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -3838,29 +4132,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/istanbul-lib-source-maps/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 - }, "node_modules/istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", @@ -3944,6 +4215,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/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/jest-circus/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/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-cli": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", @@ -3978,6 +4319,76 @@ } } }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/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/jest-cli/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/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-config": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", @@ -4023,6 +4434,76 @@ } } }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/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/jest-config/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/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-diff": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", @@ -4038,6 +4519,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/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/jest-diff/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/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-docblock": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", @@ -4066,6 +4617,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/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/jest-each/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/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-environment-node": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", @@ -4145,6 +4766,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/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/jest-matcher-utils/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/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-message-util": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", @@ -4165,6 +4856,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/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/jest-message-util/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/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-mock": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", @@ -4238,6 +4999,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/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/jest-resolve/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/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runner": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", @@ -4270,6 +5101,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/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/jest-runner/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/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runtime": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", @@ -4303,6 +5204,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/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/jest-runtime/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/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-snapshot": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", @@ -4337,6 +5308,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/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/jest-snapshot/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/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/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/jest-snapshot/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -4352,6 +5393,24 @@ "node": ">=10" } }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/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/jest-util": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", @@ -4369,6 +5428,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/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/jest-util/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/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-validate": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", @@ -4386,6 +5515,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -4398,6 +5542,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/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/jest-validate/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/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-watcher": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", @@ -4417,6 +5616,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/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/jest-watcher/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/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", @@ -4432,6 +5701,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -4448,9 +5726,9 @@ } }, "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true, "funding": { "type": "opencollective", @@ -4587,15 +5865,12 @@ "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" }, "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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/make-dir": { @@ -4629,12 +5904,12 @@ } }, "node_modules/maxmind": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.8.tgz", - "integrity": "sha512-HrfxEu5yPBPtTy/OT+W5bPQwEfLUX0EHqe2EbJiB47xQMumHqXvSP7PAwzV8Z++NRCmQwy4moQrTSt0+dH+Jmg==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.9.tgz", + "integrity": "sha512-rEfIxZ9M2P7CWQQzN5/LapCawpf2DLh+LWD/cA7lNfCbFL6dNJOKgtynp8QbRsxExutn7Ofz1P1tXEdL3gnukw==", "dependencies": { "mmdb-lib": "2.0.2", - "tiny-lru": "9.0.3" + "tiny-lru": "10.3.0" }, "engines": { "node": ">=12", @@ -4662,7 +5937,7 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -4682,7 +5957,7 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } @@ -4761,9 +6036,9 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mysql2": { "version": "3.2.0", @@ -4848,9 +6123,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, "node_modules/node-worker-threads-pool": { @@ -4880,9 +6155,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4901,7 +6176,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" @@ -5028,7 +6303,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5052,7 +6327,7 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -5164,9 +6439,9 @@ } }, "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -5317,9 +6592,9 @@ "dev": true }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5386,9 +6661,9 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { "node": ">=10" @@ -5507,6 +6782,19 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5515,7 +6803,7 @@ "node_modules/seq-queue": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "node_modules/serve-static": { "version": "1.15.0", @@ -5613,11 +6901,11 @@ } }, "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dependencies": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { @@ -5638,27 +6926,6 @@ "node": ">= 10" } }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socks-proxy-agent/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==" - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5685,9 +6952,9 @@ "dev": true }, "node_modules/sqlstring": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", "engines": { "node": ">= 0.6" } @@ -5704,6 +6971,15 @@ "node": ">=10" } }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -5790,15 +7066,15 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -5834,11 +7110,11 @@ "dev": true }, "node_modules/tiny-lru": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-9.0.3.tgz", - "integrity": "sha512-/i9GruRjXsnDgehxvy6iZ4AFNVxngEFbwzirhdulomMNPGPVV3ECMZOWSw0w4sRMZ9Al9m4jy08GPvRxRUGYlw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.3.0.tgz", + "integrity": "sha512-vTKRT2AEO1sViFDWAIzZVpV8KURCaMtnHa4RZB3XqtYLbrTO/fLDXKPEX9kVWq9u+nZREkwakbcmzGgvJm8QKA==", "engines": { - "node": ">=6" + "node": ">=12" } }, "node_modules/tmpl": { @@ -5919,10 +7195,22 @@ } } }, + "node_modules/ts-jest/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/ts-jest/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5934,6 +7222,12 @@ "node": ">=10" } }, + "node_modules/ts-jest/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/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -6063,7 +7357,7 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } @@ -6106,12 +7400,12 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } @@ -6147,7 +7441,7 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } @@ -6179,7 +7473,7 @@ "node_modules/wif": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", "dependencies": { "bs58check": "<3.0.0" } @@ -6210,10 +7504,43 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/write-file-atomic": { @@ -6259,9 +7586,9 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yargs": { @@ -6325,67 +7652,50 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "requires": { "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", - "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "dev": true }, "@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", + "@babel/parser": "^7.21.4", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } } }, "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, "requires": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.21.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -6405,33 +7715,16 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } } }, "@babel/helper-environment-visitor": { @@ -6460,12 +7753,12 @@ } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" } }, "@babel/helper-module-transforms": { @@ -6521,9 +7814,9 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true }, "@babel/helpers": { @@ -6546,70 +7839,12 @@ "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -6658,12 +7893,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -6730,12 +7965,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/template": { @@ -6750,44 +7985,27 @@ } }, "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } } }, "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.19.4", @@ -6823,29 +8041,29 @@ } }, "@eslint-community/eslint-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", - "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "requires": { "eslint-visitor-keys": "^3.3.0" } }, "@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", "dev": true }, "@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -6854,15 +8072,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -6872,12 +8081,6 @@ "type-fest": "^0.20.2" } }, - "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 - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -6887,9 +8090,9 @@ } }, "@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", + "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", "dev": true }, "@humanwhocodes/config-array": { @@ -6901,23 +8104,6 @@ "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.5" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } } }, "@humanwhocodes/module-importer": { @@ -7027,6 +8213,57 @@ "jest-message-util": "^29.5.0", "jest-util": "^29.5.0", "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@jest/core": { @@ -7063,6 +8300,57 @@ "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@jest/environment": { @@ -7152,6 +8440,57 @@ "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@jest/schemas": { @@ -7221,11 +8560,60 @@ "write-file-atomic": "^4.0.2" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -7241,6 +8629,57 @@ "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@jridgewell/gen-mapping": { @@ -7402,9 +8841,9 @@ } }, "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "requires": { "@types/connect": "*", @@ -7421,9 +8860,9 @@ } }, "@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, "requires": { "@types/node": "*" @@ -7436,21 +8875,21 @@ "dev": true }, "@types/express": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", - "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", "dev": true, "requires": { "@types/node": "*", @@ -7508,15 +8947,15 @@ "dev": true }, "@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", "dev": true }, "@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" }, "@types/prettier": { "version": "2.7.2", @@ -7543,9 +8982,9 @@ "dev": true }, "@types/serve-static": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz", - "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", "dev": true, "requires": { "@types/mime": "*", @@ -7568,9 +9007,9 @@ } }, "@types/yargs": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", - "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -7583,15 +9022,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", - "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", + "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/type-utils": "5.55.0", - "@typescript-eslint/utils": "5.55.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/type-utils": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -7600,114 +9039,80 @@ "tsutils": "^3.21.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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, "requires": { - "ms": "2.1.2" + "yallist": "^4.0.0" } }, - "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 - }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "@typescript-eslint/parser": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", - "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", + "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "debug": "^4.3.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } } }, "@typescript-eslint/scope-manager": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", - "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", + "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0" + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0" } }, "@typescript-eslint/type-utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", - "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", + "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.55.0", - "@typescript-eslint/utils": "5.55.0", + "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/utils": "5.57.0", "debug": "^4.3.4", "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } } }, "@typescript-eslint/types": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", - "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", + "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", - "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", + "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/visitor-keys": "5.57.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7715,21 +9120,15 @@ "tsutils": "^3.21.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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, "requires": { - "ms": "2.1.2" + "yallist": "^4.0.0" } }, - "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 - }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -7738,25 +9137,40 @@ "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "@typescript-eslint/utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", - "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", + "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/scope-manager": "5.57.0", + "@typescript-eslint/types": "5.57.0", + "@typescript-eslint/typescript-estree": "5.57.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "dependencies": { + "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, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -7765,16 +9179,22 @@ "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "@typescript-eslint/visitor-keys": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", - "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "version": "5.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", + "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/types": "5.57.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -7788,9 +9208,9 @@ } }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "acorn-jsx": { @@ -7812,21 +9232,6 @@ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "ajv": { @@ -7857,12 +9262,12 @@ "dev": true }, "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" } }, "anymatch": { @@ -7890,7 +9295,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "array-union": { "version": "2.1.0", @@ -7901,7 +9306,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "axios": { "version": "0.27.2", @@ -7925,6 +9330,57 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "babel-plugin-istanbul": { @@ -7983,9 +9439,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base-x": { @@ -8038,6 +9494,21 @@ "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "brace-expansion": { @@ -8060,15 +9531,15 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "bs-logger": { @@ -8083,7 +9554,7 @@ "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "requires": { "base-x": "^3.0.2" } @@ -8140,19 +9611,20 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001473", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz", + "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", "dev": true }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "char-regex": { @@ -8162,9 +9634,9 @@ "dev": true }, "ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, "cipher-base": { @@ -8206,18 +9678,18 @@ "dev": true }, "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==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "color-name": "1.1.3" } }, "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==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "combined-stream": { @@ -8231,7 +9703,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "content-disposition": { @@ -8243,26 +9715,15 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "cookie": { "version": "0.5.0", @@ -8272,7 +9733,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "create-hash": { "version": "1.2.0", @@ -8309,11 +9770,11 @@ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "dedent": { @@ -8337,7 +9798,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "denque": { "version": "2.1.0", @@ -8393,12 +9854,12 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.348", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.348.tgz", + "integrity": "sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==", "dev": true }, "emittery": { @@ -8416,7 +9877,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "error-ex": { "version": "1.3.2", @@ -8436,24 +9897,24 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.37.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8464,8 +9925,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -8492,15 +9953,40 @@ "text-table": "^0.2.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "ms": "2.1.2" + "color-convert": "^2.0.1" } }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -8524,20 +10010,29 @@ "dev": true }, "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -8547,9 +10042,9 @@ } }, "eslint-config-prettier": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", - "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "requires": {} }, @@ -8564,20 +10059,20 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true }, "espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "esprima": { @@ -8635,7 +10130,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "execa": { "version": "5.1.1", @@ -8709,6 +10204,21 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "fast-deep-equal": { @@ -8754,9 +10264,9 @@ "dev": true }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -8801,6 +10311,21 @@ "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, "find-up": { @@ -8824,9 +10349,9 @@ } }, "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "follow-redirects": { @@ -8852,12 +10377,12 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -8893,9 +10418,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -8915,15 +10440,15 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -8958,9 +10483,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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 }, "grapheme-splitter": { @@ -8978,9 +10503,9 @@ } }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "has-symbols": { @@ -9031,9 +10556,9 @@ } }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "import-fresh": { @@ -9065,7 +10590,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -9078,9 +10603,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "ipaddr.js": { "version": "1.9.1", @@ -9144,7 +10669,7 @@ "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, "is-stream": { "version": "2.0.1", @@ -9186,6 +10711,23 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "istanbul-lib-source-maps": { @@ -9197,23 +10739,6 @@ "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - } } }, "istanbul-reports": { @@ -9274,6 +10799,57 @@ "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-cli": { @@ -9294,6 +10870,57 @@ "jest-validate": "^29.5.0", "prompts": "^2.0.1", "yargs": "^17.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-config": { @@ -9324,6 +10951,57 @@ "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-diff": { @@ -9336,6 +11014,57 @@ "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-docblock": { @@ -9358,6 +11087,57 @@ "jest-get-type": "^29.4.3", "jest-util": "^29.5.0", "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-environment-node": { @@ -9420,6 +11200,57 @@ "jest-diff": "^29.5.0", "jest-get-type": "^29.4.3", "pretty-format": "^29.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-message-util": { @@ -9437,6 +11268,57 @@ "pretty-format": "^29.5.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-mock": { @@ -9478,6 +11360,57 @@ "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-resolve-dependencies": { @@ -9517,6 +11450,57 @@ "jest-worker": "^29.5.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-runtime": { @@ -9547,6 +11531,57 @@ "jest-util": "^29.5.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-snapshot": { @@ -9580,6 +11615,55 @@ "semver": "^7.3.5" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -9588,6 +11672,21 @@ "requires": { "lru-cache": "^6.0.0" } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -9603,6 +11702,57 @@ "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-validate": { @@ -9619,11 +11769,60 @@ "pretty-format": "^29.5.0" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -9641,6 +11840,57 @@ "emittery": "^0.13.1", "jest-util": "^29.5.0", "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-worker": { @@ -9655,6 +11905,12 @@ "supports-color": "^8.0.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -9667,9 +11923,9 @@ } }, "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true }, "js-tokens": { @@ -9772,12 +12028,12 @@ "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" }, "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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "yallist": "^4.0.0" + "yallist": "^3.0.2" } }, "make-dir": { @@ -9805,12 +12061,12 @@ } }, "maxmind": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.8.tgz", - "integrity": "sha512-HrfxEu5yPBPtTy/OT+W5bPQwEfLUX0EHqe2EbJiB47xQMumHqXvSP7PAwzV8Z++NRCmQwy4moQrTSt0+dH+Jmg==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.9.tgz", + "integrity": "sha512-rEfIxZ9M2P7CWQQzN5/LapCawpf2DLh+LWD/cA7lNfCbFL6dNJOKgtynp8QbRsxExutn7Ofz1P1tXEdL3gnukw==", "requires": { "mmdb-lib": "2.0.2", - "tiny-lru": "9.0.3" + "tiny-lru": "10.3.0" } }, "md5.js": { @@ -9831,7 +12087,7 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-stream": { "version": "2.0.0", @@ -9848,7 +12104,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { "version": "4.0.5", @@ -9899,9 +12155,9 @@ "integrity": "sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA==" }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mysql2": { "version": "3.2.0", @@ -9972,9 +12228,9 @@ "dev": true }, "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, "node-worker-threads-pool": { @@ -9998,9 +12254,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "on-finished": { "version": "2.4.1", @@ -10013,7 +12269,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -10101,7 +12357,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -10119,7 +12375,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "4.0.0", @@ -10200,9 +12456,9 @@ "dev": true }, "prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "pretty-format": { @@ -10292,9 +12548,9 @@ "dev": true }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10342,9 +12598,9 @@ "dev": true }, "resolve.exports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "reusify": { @@ -10416,6 +12672,21 @@ "statuses": "2.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10426,7 +12697,7 @@ "seq-queue": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "serve-static": { "version": "1.15.0", @@ -10502,11 +12773,11 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "requires": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" } }, @@ -10518,21 +12789,6 @@ "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "source-map": { @@ -10558,9 +12814,9 @@ "dev": true }, "sqlstring": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" }, "stack-utils": { "version": "2.0.6", @@ -10569,6 +12825,14 @@ "dev": true, "requires": { "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } } }, "statuses": { @@ -10633,12 +12897,12 @@ "dev": true }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" } }, "supports-preserve-symlinks-flag": { @@ -10665,9 +12929,9 @@ "dev": true }, "tiny-lru": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-9.0.3.tgz", - "integrity": "sha512-/i9GruRjXsnDgehxvy6iZ4AFNVxngEFbwzirhdulomMNPGPVV3ECMZOWSw0w4sRMZ9Al9m4jy08GPvRxRUGYlw==" + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.3.0.tgz", + "integrity": "sha512-vTKRT2AEO1sViFDWAIzZVpV8KURCaMtnHa4RZB3XqtYLbrTO/fLDXKPEX9kVWq9u+nZREkwakbcmzGgvJm8QKA==" }, "tmpl": { "version": "1.0.5", @@ -10711,14 +12975,29 @@ "yargs-parser": "^21.0.1" }, "dependencies": { + "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, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -10801,7 +13080,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "update-browserslist-db": { "version": "1.0.10", @@ -10825,12 +13104,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "v8-compile-cache-lib": { "version": "3.0.1", @@ -10860,7 +13139,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "walker": { "version": "1.0.8", @@ -10883,7 +13162,7 @@ "wif": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", "requires": { "bs58check": "<3.0.0" } @@ -10903,12 +13182,38 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "write-file-atomic": { @@ -10934,9 +13239,9 @@ "dev": true }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { From a512884b65bd6435dad9aaeca96cb51ccf1e3529 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 1 Apr 2023 14:56:18 +0900 Subject: [PATCH 186/782] Wrap lightning stats importer into try/catch --- .../lightning/sync-tasks/stats-importer.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/backend/src/tasks/lightning/sync-tasks/stats-importer.ts b/backend/src/tasks/lightning/sync-tasks/stats-importer.ts index d009ce052..14ad82d7e 100644 --- a/backend/src/tasks/lightning/sync-tasks/stats-importer.ts +++ b/backend/src/tasks/lightning/sync-tasks/stats-importer.ts @@ -15,16 +15,20 @@ class LightningStatsImporter { topologiesFolder = config.LIGHTNING.TOPOLOGY_FOLDER; async $run(): Promise { - const [channels]: any[] = await DB.query('SELECT short_id from channels;'); - logger.info(`Caching funding txs for currently existing channels`, logger.tags.ln); - await fundingTxFetcher.$fetchChannelsFundingTxs(channels.map(channel => channel.short_id)); + try { + const [channels]: any[] = await DB.query('SELECT short_id from channels;'); + logger.info(`Caching funding txs for currently existing channels`, logger.tags.ln); + await fundingTxFetcher.$fetchChannelsFundingTxs(channels.map(channel => channel.short_id)); - if (config.MEMPOOL.NETWORK !== 'mainnet' || config.DATABASE.ENABLED === false) { - return; + if (config.MEMPOOL.NETWORK !== 'mainnet' || config.DATABASE.ENABLED === false) { + return; + } + + await this.$importHistoricalLightningStats(); + await this.$cleanupIncorrectSnapshot(); + } catch (e) { + logger.err(`Exception in LightningStatsImporter::$run(). ${e}`); } - - await this.$importHistoricalLightningStats(); - await this.$cleanupIncorrectSnapshot(); } /** From a91a8d2a4bfc1cdc35d4ee370afee770060a523a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 2 Apr 2023 07:40:05 +0900 Subject: [PATCH 187/782] Key modifiers to open tx in new tab from visualization --- .../block-overview-graph.component.ts | 10 ++++++---- frontend/src/app/components/block/block.component.ts | 10 +++++++--- .../mempool-block-overview.component.ts | 10 +++++++--- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index b77792aee..3f82d63eb 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -23,7 +23,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On @Input() unavailable: boolean = false; @Input() auditHighlighting: boolean = false; @Input() blockConversion: Price; - @Output() txClickEvent = new EventEmitter(); + @Output() txClickEvent = new EventEmitter<{ tx: TransactionStripped, keyModifier: boolean}>(); @Output() txHoverEvent = new EventEmitter(); @Output() readyEvent = new EventEmitter(); @@ -326,7 +326,9 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On if (event.target === this.canvas.nativeElement && event.pointerType === 'touch') { this.setPreviewTx(event.offsetX, event.offsetY, true); } else if (event.target === this.canvas.nativeElement) { - this.onTxClick(event.offsetX, event.offsetY); + const keyMod = event.shiftKey || event.ctrlKey || event.metaKey; + const middleClick = event.which === 2 || event.button === 1; + this.onTxClick(event.offsetX, event.offsetY, keyMod || middleClick); } } @@ -409,12 +411,12 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On } } - onTxClick(cssX: number, cssY: number) { + onTxClick(cssX: number, cssY: number, keyModifier: boolean = false) { const x = cssX * window.devicePixelRatio; const y = cssY * window.devicePixelRatio; const selected = this.scene.getTxAt({ x, y }); if (selected && selected.txid) { - this.txClickEvent.emit(selected); + this.txClickEvent.emit({ tx: selected, keyModifier }); } } diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index f5a0c93b0..a11be9ad2 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -612,9 +612,13 @@ export class BlockComponent implements OnInit, OnDestroy { }); } - onTxClick(event: TransactionStripped): void { - const url = new RelativeUrlPipe(this.stateService).transform(`/tx/${event.txid}`); - this.router.navigate([url]); + onTxClick(event: { tx: TransactionStripped, keyModifier: boolean }): void { + const url = new RelativeUrlPipe(this.stateService).transform(`/tx/${event.tx.txid}`); + if (!event.keyModifier) { + this.router.navigate([url]); + } else { + window.open(url, '_blank'); + } } onTxHover(txid: string): void { diff --git a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts index 7a39e3536..ed9f4ef75 100644 --- a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts +++ b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts @@ -107,8 +107,12 @@ export class MempoolBlockOverviewComponent implements OnInit, OnDestroy, OnChang this.isLoading$.next(false); } - onTxClick(event: TransactionStripped): void { - const url = new RelativeUrlPipe(this.stateService).transform(`/tx/${event.txid}`); - this.router.navigate([url]); + onTxClick(event: { tx: TransactionStripped, keyModifier: boolean }): void { + const url = new RelativeUrlPipe(this.stateService).transform(`/tx/${event.tx.txid}`); + if (!event.keyModifier) { + this.router.navigate([url]); + } else { + window.open(url, '_blank'); + } } } From 34236fca7ce9216de4ecc8d35da5c11d4c35ac23 Mon Sep 17 00:00:00 2001 From: wiz Date: Mon, 3 Apr 2023 14:59:39 +0900 Subject: [PATCH 188/782] Remove unused mynodebtc.jpg --- frontend/src/resources/profile/mynodebtc.jpg | Bin 6534 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 frontend/src/resources/profile/mynodebtc.jpg diff --git a/frontend/src/resources/profile/mynodebtc.jpg b/frontend/src/resources/profile/mynodebtc.jpg deleted file mode 100644 index 27216e06939e51fc01df744b05f05983dab8527c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6534 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 nTo>xh(2FZ88D&qUHp Date: Mon, 3 Apr 2023 02:07:56 -0400 Subject: [PATCH 189/782] Switch phoenix wallet logo to dark mode --- .../app/components/about/about.component.html | 2 +- frontend/src/resources/profile/phoenix.jpg | Bin 8487 -> 0 bytes frontend/src/resources/profile/phoenix.svg | 46 ++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) delete mode 100644 frontend/src/resources/profile/phoenix.jpg create mode 100644 frontend/src/resources/profile/phoenix.svg diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 73b120e1e..8a0e13335 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -253,7 +253,7 @@ Sparrow
    - + Phoenix diff --git a/frontend/src/resources/profile/phoenix.jpg b/frontend/src/resources/profile/phoenix.jpg deleted file mode 100644 index adfe235207188d92dbcf011958f3672fee2a2eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8487 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 Gn*Ki&1tSvx diff --git a/frontend/src/resources/profile/phoenix.svg b/frontend/src/resources/profile/phoenix.svg new file mode 100644 index 000000000..917bd4fba --- /dev/null +++ b/frontend/src/resources/profile/phoenix.svg @@ -0,0 +1,46 @@ + + + + + + + + + From a1b6fc5a7bf212d603d71b3089a97581974f1a48 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 3 Apr 2023 16:25:10 +0900 Subject: [PATCH 190/782] Redesigned testnet alert fixes #3625 --- .../liquid-master-page.component.html | 2 ++ .../master-page/master-page.component.html | 15 +-------- .../master-page/master-page.component.scss | 15 --------- .../master-page/master-page.component.ts | 8 +---- .../testnet-alert.component.html | 8 +++++ .../testnet-alert.component.scss | 31 +++++++++++++++++++ .../testnet-alert/testnet-alert.component.ts | 20 ++++++++++++ frontend/src/app/shared/shared.module.ts | 5 +-- 8 files changed, 66 insertions(+), 38 deletions(-) create mode 100644 frontend/src/app/shared/components/testnet-alert/testnet-alert.component.html create mode 100644 frontend/src/app/shared/components/testnet-alert/testnet-alert.component.scss create mode 100644 frontend/src/app/shared/components/testnet-alert/testnet-alert.component.ts diff --git a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.html b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.html index 17f371202..3df488c7f 100644 --- a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.html +++ b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.html @@ -90,6 +90,8 @@ + +
    diff --git a/frontend/src/app/components/master-page/master-page.component.html b/frontend/src/app/components/master-page/master-page.component.html index 6f4e30d60..5724530e5 100644 --- a/frontend/src/app/components/master-page/master-page.component.html +++ b/frontend/src/app/components/master-page/master-page.component.html @@ -62,20 +62,7 @@ -
    -
    -
    -
    - - This is a test network. Coins have no value - -
    - -
    -
    -
    +
    diff --git a/frontend/src/app/components/master-page/master-page.component.scss b/frontend/src/app/components/master-page/master-page.component.scss index 0f4fb840d..54a22a470 100644 --- a/frontend/src/app/components/master-page/master-page.component.scss +++ b/frontend/src/app/components/master-page/master-page.component.scss @@ -193,18 +193,3 @@ nav { font-size: 7px; } } - -.close { - position: absolute; - color: black; - right: 10px; - top: 17px; - @media (max-width: 620px) { - right: 10px; - top: 0px; - }; - @media (min-width: 992px) { - right: 10px; - top: 13px; - }; -} \ No newline at end of file diff --git a/frontend/src/app/components/master-page/master-page.component.ts b/frontend/src/app/components/master-page/master-page.component.ts index 1fd040f47..7c4f8dcff 100644 --- a/frontend/src/app/components/master-page/master-page.component.ts +++ b/frontend/src/app/components/master-page/master-page.component.ts @@ -1,10 +1,9 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { Env, StateService } from '../../services/state.service'; import { Observable, merge, of } from 'rxjs'; import { LanguageService } from '../../services/language.service'; import { EnterpriseService } from '../../services/enterprise.service'; import { NavigationService } from '../../services/navigation.service'; -import { StorageService } from '../../services/storage.service'; @Component({ selector: 'app-master-page', @@ -27,7 +26,6 @@ export class MasterPageComponent implements OnInit { private languageService: LanguageService, private enterpriseService: EnterpriseService, private navigationService: NavigationService, - public storageService: StorageService ) { } ngOnInit() { @@ -48,8 +46,4 @@ export class MasterPageComponent implements OnInit { onResize(event: any) { this.isMobile = window.innerWidth <= 767.98; } - - dismissWarning() { - this.storageService.setValue('hideWarning', 'hidden'); - } } diff --git a/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.html b/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.html new file mode 100644 index 000000000..7748efb98 --- /dev/null +++ b/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.html @@ -0,0 +1,8 @@ +
    +
    +
    This is a test network. Coins have no value.
    + +
    +
    diff --git a/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.scss b/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.scss new file mode 100644 index 000000000..ee66d2381 --- /dev/null +++ b/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.scss @@ -0,0 +1,31 @@ +.alert-danger { + color: #fff; + background-color: #b71c1c; + border-color: #b71c1c; + padding: 0.5rem 1.25rem; + margin: 0px 10px 0px 10px; + + display: flex; + justify-content: center; +} + +.message-container { + display: flex; + margin-left: auto; +} + +.close { + display: flex; + color: #fff; + align-items: center; +} + +button { + display: flex; + margin-left: auto; +} + +span { + position: relative; + top: -2px; +} \ No newline at end of file diff --git a/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.ts b/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.ts new file mode 100644 index 000000000..99150ef16 --- /dev/null +++ b/frontend/src/app/shared/components/testnet-alert/testnet-alert.component.ts @@ -0,0 +1,20 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { StorageService } from '../../../services/storage.service'; + +@Component({ + selector: 'app-testnet-alert', + templateUrl: './testnet-alert.component.html', + styleUrls: ['./testnet-alert.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TestnetAlertComponent { + + constructor( + public storageService: StorageService, + ) { } + + dismissWarning(): void { + this.storageService.setValue('hideWarning', 'hidden'); + } + +} diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 8aa2fb173..e276f79f8 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -4,7 +4,7 @@ import { NgbCollapseModule, NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstra import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome'; import { faFilter, faAngleDown, faAngleUp, faAngleRight, faAngleLeft, faBolt, faChartArea, faCogs, faCubes, faHammer, faDatabase, faExchangeAlt, faInfoCircle, faLink, faList, faSearch, faCaretUp, faCaretDown, faTachometerAlt, faThList, faTint, faTv, faAngleDoubleDown, faSortUp, faAngleDoubleUp, faChevronDown, - faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload, faQrcode, faArrowRightArrowLeft, faArrowsRotate, faCircleLeft, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons'; + faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload, faQrcode, faArrowRightArrowLeft, faArrowsRotate, faCircleLeft } from '@fortawesome/free-solid-svg-icons'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { MasterPageComponent } from '../components/master-page/master-page.component'; import { PreviewTitleComponent } from '../components/master-page-preview/preview-title.component'; @@ -84,6 +84,7 @@ import { SearchResultsComponent } from '../components/search-form/search-results import { TimestampComponent } from './components/timestamp/timestamp.component'; import { ToggleComponent } from './components/toggle/toggle.component'; import { GeolocationComponent } from '../shared/components/geolocation/geolocation.component'; +import { TestnetAlertComponent } from './components/testnet-alert/testnet-alert.component'; @NgModule({ declarations: [ @@ -162,6 +163,7 @@ import { GeolocationComponent } from '../shared/components/geolocation/geolocati TimestampComponent, ToggleComponent, GeolocationComponent, + TestnetAlertComponent, ], imports: [ CommonModule, @@ -309,6 +311,5 @@ export class SharedModule { library.addIcons(faQrcode); library.addIcons(faArrowRightArrowLeft); library.addIcons(faExchangeAlt); - library.addIcons(faExclamationTriangle); } } From 38e4832b6a430133c96ab5bb4f035951051630a6 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 3 Apr 2023 20:02:39 +0900 Subject: [PATCH 191/782] Restoring missing tx index attribute for cypress --- .../transactions-list/transactions-list.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index adadf0a1c..71eeb4aa1 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -13,7 +13,7 @@
    -
    +
    {{ errorUnblinded }}
    From aa882aa36a1f757f069a7c1f096713c86e3f7cb5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 2 Apr 2023 05:34:46 +0900 Subject: [PATCH 192/782] Fix RTL locale unfurls --- unfurler/src/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unfurler/src/index.ts b/unfurler/src/index.ts index 0b423ff92..fedf32110 100644 --- a/unfurler/src/index.ts +++ b/unfurler/src/index.ts @@ -109,7 +109,10 @@ class Server { page.waitForSelector('meta[property="og:preview:fail"]', { timeout: config.PUPPETEER.RENDER_TIMEOUT || 3000 }).then(() => false) ]) if (success === true) { - const screenshot = await page.screenshot(); + const screenshot = await page.screenshot({ + captureBeyondViewport: false, + clip: { width: 1200, height: 600, x: 0, y: 0, scale: 1 }, + }); return screenshot; } else if (success === false) { logger.warn(`failed to render ${path} for ${action} due to client-side error, e.g. requested an invalid txid`); From d325734c160042f41e8dfcec2623a89d4c1a1da7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 4 Apr 2023 08:25:40 +0900 Subject: [PATCH 193/782] Disable blockchain drag for middle/right click --- frontend/src/app/components/start/start.component.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/start/start.component.ts b/frontend/src/app/components/start/start.component.ts index dde7bc234..7e83fb516 100644 --- a/frontend/src/app/components/start/start.component.ts +++ b/frontend/src/app/components/start/start.component.ts @@ -137,9 +137,11 @@ export class StartComponent implements OnInit, OnDestroy { } onMouseDown(event: MouseEvent) { - this.mouseDragStartX = event.clientX; - this.resetMomentum(event.clientX); - this.blockchainScrollLeftInit = this.blockchainContainer.nativeElement.scrollLeft; + if (!(event.which > 1 || event.button > 0)) { + this.mouseDragStartX = event.clientX; + this.resetMomentum(event.clientX); + this.blockchainScrollLeftInit = this.blockchainContainer.nativeElement.scrollLeft; + } } onPointerDown(event: PointerEvent) { if (this.isiOS) { From 90fa4a8f778fa5827bb394f0df5ce865d6738d8a Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Tue, 4 Apr 2023 11:42:06 +0900 Subject: [PATCH 194/782] Make fiat component color class customizable --- frontend/src/app/fiat/fiat.component.html | 4 ++-- frontend/src/app/fiat/fiat.component.scss | 3 --- frontend/src/app/fiat/fiat.component.ts | 3 ++- 3 files changed, 4 insertions(+), 6 deletions(-) delete mode 100644 frontend/src/app/fiat/fiat.component.scss diff --git a/frontend/src/app/fiat/fiat.component.html b/frontend/src/app/fiat/fiat.component.html index 00dd1250a..afee30d27 100644 --- a/frontend/src/app/fiat/fiat.component.html +++ b/frontend/src/app/fiat/fiat.component.html @@ -1,4 +1,4 @@ - + {{ ( (blockConversion.price[currency] > -1 ? blockConversion.price[currency] : null) ?? @@ -8,7 +8,7 @@ - + {{ (conversions[currency] > -1 ? conversions[currency] : 0) * value / 100000000 | fiatCurrency : digitsInfo : currency }} \ No newline at end of file diff --git a/frontend/src/app/fiat/fiat.component.scss b/frontend/src/app/fiat/fiat.component.scss deleted file mode 100644 index 843bd58b6..000000000 --- a/frontend/src/app/fiat/fiat.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -.green-color { - color: #3bcc49; -} diff --git a/frontend/src/app/fiat/fiat.component.ts b/frontend/src/app/fiat/fiat.component.ts index 909b249c0..93752039b 100644 --- a/frontend/src/app/fiat/fiat.component.ts +++ b/frontend/src/app/fiat/fiat.component.ts @@ -6,7 +6,7 @@ import { StateService } from '../services/state.service'; @Component({ selector: 'app-fiat', templateUrl: './fiat.component.html', - styleUrls: ['./fiat.component.scss'], + styleUrls: [], changeDetection: ChangeDetectionStrategy.OnPush, }) export class FiatComponent implements OnInit, OnDestroy { @@ -17,6 +17,7 @@ export class FiatComponent implements OnInit, OnDestroy { @Input() value: number; @Input() digitsInfo = '1.2-2'; @Input() blockConversion: Price; + @Input() colorClass = 'green-color'; constructor( private stateService: StateService, From bca35600ff2a18dc9f0c5a08093cab0349818627 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 4 Apr 2023 20:18:46 +0900 Subject: [PATCH 195/782] ops: Fix installer creation of CLN folders --- production/install | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/production/install b/production/install index 27c4dbd14..b97ef16d1 100755 --- a/production/install +++ b/production/install @@ -1312,8 +1312,13 @@ case $OS in osSudo "${ROOT_USER}" pw usermod ${MEMPOOL_USER} -G "${CLN_GROUP}" osSudo "${ROOT_USER}" chsh -s `which zsh` "${CLN_USER}" echo "export PATH=$PATH:$HOME/.local/bin" >> "${CLN_HOME}/.zshrc" - osSudo "${ROOT_USER}" mkdir -p "${CLN_HOME}/.lightning/{bitcoin,signet,testnet}" - osSudo "${ROOT_USER}" chmod 750 "${CLN_HOME}" "${CLN_HOME}/.lightning" "${CLN_HOME}/.lightning/{bitcoin,signet,testnet}" + osSudo "${ROOT_USER}" mkdir -p "${CLN_HOME}/.lightning/bitcoin" + osSudo "${ROOT_USER}" mkdir -p "${CLN_HOME}/.lightning/signet" + osSudo "${ROOT_USER}" mkdir -p "${CLN_HOME}/.lightning/testnet" + osSudo "${ROOT_USER}" chmod 750 "${CLN_HOME}" "${CLN_HOME}/.lightning" + osSudo "${ROOT_USER}" chmod 750 "${CLN_HOME}" "${CLN_HOME}/.lightning/bitcoin" + osSudo "${ROOT_USER}" chmod 750 "${CLN_HOME}" "${CLN_HOME}/.lightning/signet" + osSudo "${ROOT_USER}" chmod 750 "${CLN_HOME}" "${CLN_HOME}/.lightning/testnet" osSudo "${ROOT_USER}" chown -R "${CLN_USER}:${CLN_GROUP}" "${CLN_HOME}" echo "[*] Creating symlink to .bitcoin folder" osSudo "${CLN_USER}" ln -s "${BITCOIN_HOME}/.bitcoin" "${CLN_HOME}/.bitcoin" From 906f24f0ee1c691419beb93ee7593480d35bab85 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 4 Apr 2023 21:48:42 +0900 Subject: [PATCH 196/782] ops: Use unix sockets for MySQL --- production/mempool-config.bisq.json | 2 +- production/mempool-config.liquid.json | 2 +- production/mempool-config.liquidtestnet.json | 2 +- production/mempool-config.mainnet-lightning.json | 2 +- production/mempool-config.mainnet.json | 2 +- production/mempool-config.signet-lightning.json | 2 +- production/mempool-config.signet.json | 2 +- production/mempool-config.testnet-lightning.json | 2 +- production/mempool-config.testnet.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/production/mempool-config.bisq.json b/production/mempool-config.bisq.json index 599711764..124773aeb 100644 --- a/production/mempool-config.bisq.json +++ b/production/mempool-config.bisq.json @@ -20,7 +20,7 @@ "DATABASE": { "ENABLED": false, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_BISQ_USER__", "PASSWORD": "__MEMPOOL_BISQ_PASS__", "DATABASE": "mempool_bisq" diff --git a/production/mempool-config.liquid.json b/production/mempool-config.liquid.json index 3f02ca8dc..72c469da5 100644 --- a/production/mempool-config.liquid.json +++ b/production/mempool-config.liquid.json @@ -28,7 +28,7 @@ "DATABASE": { "ENABLED": true, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_LIQUID_USER__", "PASSWORD": "__MEMPOOL_LIQUID_PASS__", "DATABASE": "mempool_liquid" diff --git a/production/mempool-config.liquidtestnet.json b/production/mempool-config.liquidtestnet.json index e7dc1b557..3a6cafe0d 100644 --- a/production/mempool-config.liquidtestnet.json +++ b/production/mempool-config.liquidtestnet.json @@ -28,7 +28,7 @@ "DATABASE": { "ENABLED": true, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_LIQUIDTESTNET_USER__", "PASSWORD": "__MEMPOOL_LIQUIDTESTNET_PASS__", "DATABASE": "mempool_liquidtestnet" diff --git a/production/mempool-config.mainnet-lightning.json b/production/mempool-config.mainnet-lightning.json index 8f3424a52..546c58163 100644 --- a/production/mempool-config.mainnet-lightning.json +++ b/production/mempool-config.mainnet-lightning.json @@ -41,7 +41,7 @@ "DATABASE": { "ENABLED": true, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_MAINNET_LIGHTNING_USER__", "PASSWORD": "__MEMPOOL_MAINNET_LIGHTNING_PASS__", "DATABASE": "mempool_mainnet_lightning" diff --git a/production/mempool-config.mainnet.json b/production/mempool-config.mainnet.json index 57056e0d7..6eb09df8d 100644 --- a/production/mempool-config.mainnet.json +++ b/production/mempool-config.mainnet.json @@ -36,7 +36,7 @@ "DATABASE": { "ENABLED": true, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_MAINNET_USER__", "PASSWORD": "__MEMPOOL_MAINNET_PASS__", "DATABASE": "mempool" diff --git a/production/mempool-config.signet-lightning.json b/production/mempool-config.signet-lightning.json index cb084f905..a787b831b 100644 --- a/production/mempool-config.signet-lightning.json +++ b/production/mempool-config.signet-lightning.json @@ -36,7 +36,7 @@ "DATABASE": { "ENABLED": true, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_SIGNET_LIGHTNING_USER__", "PASSWORD": "__MEMPOOL_SIGNET_LIGHTNING_PASS__", "DATABASE": "mempool_signet_lightning" diff --git a/production/mempool-config.signet.json b/production/mempool-config.signet.json index b627476cd..7b8667d11 100644 --- a/production/mempool-config.signet.json +++ b/production/mempool-config.signet.json @@ -27,7 +27,7 @@ "DATABASE": { "ENABLED": true, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_SIGNET_USER__", "PASSWORD": "__MEMPOOL_SIGNET_PASS__", "DATABASE": "mempool_signet" diff --git a/production/mempool-config.testnet-lightning.json b/production/mempool-config.testnet-lightning.json index ae998d2cc..c2d0a257e 100644 --- a/production/mempool-config.testnet-lightning.json +++ b/production/mempool-config.testnet-lightning.json @@ -36,7 +36,7 @@ "DATABASE": { "ENABLED": true, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_TESTNET_LIGHTNING_USER__", "PASSWORD": "__MEMPOOL_TESTNET_LIGHTNING_PASS__", "DATABASE": "mempool_testnet_lightning" diff --git a/production/mempool-config.testnet.json b/production/mempool-config.testnet.json index bf5381a22..c68162a9d 100644 --- a/production/mempool-config.testnet.json +++ b/production/mempool-config.testnet.json @@ -27,7 +27,7 @@ "DATABASE": { "ENABLED": true, "HOST": "127.0.0.1", - "PORT": 3306, + "SOCKET": "/var/run/mysql/mysql.sock", "USERNAME": "__MEMPOOL_TESTNET_USER__", "PASSWORD": "__MEMPOOL_TESTNET_PASS__", "DATABASE": "mempool_testnet" From 3d5c156776ebac6194c60e8bdd1938d8755dc81e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 14 Mar 2023 15:39:55 +0900 Subject: [PATCH 197/782] Use effective fee rates in mempool block visualizations & tooltips --- backend/src/api/common.ts | 1 + backend/src/mempool.interfaces.ts | 1 + .../src/app/components/block-overview-graph/tx-view.ts | 7 +++++-- .../block-overview-tooltip.component.html | 6 ++++++ .../block-overview-tooltip.component.ts | 2 ++ frontend/src/app/interfaces/websocket.interface.ts | 1 + 6 files changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index 1d3b11d66..fed3f4fa2 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -83,6 +83,7 @@ export class Common { fee: tx.fee, vsize: tx.weight / 4, value: tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0), + rate: tx.effectiveFeePerVsize, }; } diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 16b856bcc..dd315f10c 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -145,6 +145,7 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; + rate?: number; // effective fee rate } export interface BlockExtension { diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index fe224ebac..f2e67da5b 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -36,6 +36,7 @@ export default class TxView implements TransactionStripped { vsize: number; value: number; feerate: number; + rate?: number; status?: 'found' | 'missing' | 'fresh' | 'added' | 'censored' | 'selected'; context?: 'projected' | 'actual'; scene?: BlockScene; @@ -58,7 +59,8 @@ export default class TxView implements TransactionStripped { this.fee = tx.fee; this.vsize = tx.vsize; this.value = tx.value; - this.feerate = tx.fee / tx.vsize; + this.feerate = tx.rate || (tx.fee / tx.vsize); // sort by effective fee rate where available + this.rate = tx.rate; this.status = tx.status; this.initialised = false; this.vertexArray = scene.vertexArray; @@ -157,7 +159,8 @@ export default class TxView implements TransactionStripped { } getColor(): Color { - const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, this.feerate) < feeLvl) - 1; + const rate = this.fee / this.vsize; // color by simple single-tx fee rate + const feeLevelIndex = feeLevels.findIndex((feeLvl) => Math.max(1, rate) < feeLvl) - 1; const feeLevelColor = feeColors[feeLevelIndex] || feeColors[mempoolFeeColors.length - 1]; // Normal mode if (!this.scene?.highlightingEnabled) { diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html index e841e291f..7e2de8d67 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html @@ -28,6 +28,12 @@ {{ feeRate | feeRounding }} sat/vB +
    + + + diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.ts b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.ts index ea011d045..61c294263 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.ts +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.ts @@ -20,6 +20,7 @@ export class BlockOverviewTooltipComponent implements OnChanges { value = 0; vsize = 1; feeRate = 0; + effectiveRate; tooltipPosition: Position = { x: 0, y: 0 }; @@ -51,6 +52,7 @@ export class BlockOverviewTooltipComponent implements OnChanges { this.value = tx.value || 0; this.vsize = tx.vsize || 1; this.feeRate = this.fee / this.vsize; + this.effectiveRate = tx.rate; } } } diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 46416857e..ac86971f0 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -71,6 +71,7 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; + rate?: number; // effective fee rate status?: 'found' | 'missing' | 'fresh' | 'added' | 'censored' | 'selected'; context?: 'projected' | 'actual'; } From 4c569c0dedf6901309ff0b8534418112c1e1b411 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 5 Apr 2023 08:40:43 +0900 Subject: [PATCH 198/782] Send mempool effective fee rate changes to frontend & apply --- backend/src/api/mempool-blocks.ts | 8 ++++++-- backend/src/mempool.interfaces.ts | 1 + .../block-overview-graph.component.ts | 4 ++-- .../components/block-overview-graph/block-scene.ts | 11 ++++++++++- .../mempool-block-overview.component.ts | 2 +- frontend/src/app/interfaces/websocket.interface.ts | 1 + 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index aa2804379..bf5c16955 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -112,6 +112,7 @@ class MempoolBlocks { for (let i = 0; i < Math.max(mempoolBlocks.length, prevBlocks.length); i++) { let added: TransactionStripped[] = []; let removed: string[] = []; + const changed: { txid: string, rate: number | undefined }[] = []; if (mempoolBlocks[i] && !prevBlocks[i]) { added = mempoolBlocks[i].transactions; } else if (!mempoolBlocks[i] && prevBlocks[i]) { @@ -120,7 +121,7 @@ class MempoolBlocks { const prevIds = {}; const newIds = {}; prevBlocks[i].transactions.forEach(tx => { - prevIds[tx.txid] = true; + prevIds[tx.txid] = tx; }); mempoolBlocks[i].transactions.forEach(tx => { newIds[tx.txid] = true; @@ -133,12 +134,15 @@ class MempoolBlocks { mempoolBlocks[i].transactions.forEach(tx => { if (!prevIds[tx.txid]) { added.push(tx); + } else if (tx.rate !== prevIds[tx.txid].rate) { + changed.push({ txid: tx.txid, rate: tx.rate }); } }); } mempoolBlockDeltas.push({ added, - removed + removed, + changed, }); } return mempoolBlockDeltas; diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index dd315f10c..b43d05c13 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -58,6 +58,7 @@ export interface MempoolBlockWithTransactions extends MempoolBlock { export interface MempoolBlockDelta { added: TransactionStripped[]; removed: string[]; + changed: { txid: string, rate: number | undefined }[]; } interface VinStrippedToScriptsig { diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index 3f82d63eb..940939470 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -132,9 +132,9 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On } } - update(add: TransactionStripped[], remove: string[], direction: string = 'left', resetLayout: boolean = false): void { + update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { if (this.scene) { - this.scene.update(add, remove, direction, resetLayout); + this.scene.update(add, remove, change, direction, resetLayout); this.start(); } } diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index e7853d5a1..7fb0a1e99 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -150,7 +150,7 @@ export default class BlockScene { this.updateAll(startTime, 200, direction); } - update(add: TransactionStripped[], remove: string[], direction: string = 'left', resetLayout: boolean = false): void { + update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { const startTime = performance.now(); const removed = this.removeBatch(remove, startTime, direction); @@ -172,6 +172,15 @@ export default class BlockScene { this.place(tx); }); } else { + // update effective rates + change.forEach(tx => { + if (this.txs[tx.txid]) { + this.txs[tx.txid].feerate = tx.rate || (this.txs[tx.txid].fee / this.txs[tx.txid].vsize); + this.txs[tx.txid].rate = tx.rate; + this.txs[tx.txid].dirty = true; + } + }); + // try to insert new txs directly const remaining = []; add.map(tx => new TxView(tx, this)).sort(feeRateDescending).forEach(tx => { diff --git a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts index ed9f4ef75..30632a862 100644 --- a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts +++ b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts @@ -99,7 +99,7 @@ export class MempoolBlockOverviewComponent implements OnInit, OnDestroy, OnChang const direction = (this.blockIndex == null || this.index < this.blockIndex) ? this.poolDirection : this.chainDirection; this.blockGraph.replace(delta.added, direction); } else { - this.blockGraph.update(delta.added, delta.removed, blockMined ? this.chainDirection : this.poolDirection, blockMined); + this.blockGraph.update(delta.added, delta.removed, delta.changed || [], blockMined ? this.chainDirection : this.poolDirection, blockMined); } this.lastBlockHeight = this.stateService.latestBlockHeight; diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index ac86971f0..50ffd4ebf 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -54,6 +54,7 @@ export interface MempoolBlockWithTransactions extends MempoolBlock { export interface MempoolBlockDelta { added: TransactionStripped[], removed: string[], + changed?: { txid: string, rate: number | undefined }[]; } export interface MempoolInfo { From 44a0913b818713acc0da935570628ab4e1822d6b Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Apr 2023 16:27:13 +0900 Subject: [PATCH 199/782] [esplora] fallback to tcp socket if unix socket fails --- backend/src/api/bitcoin/esplora-api.ts | 76 +++++++++++++++++--------- backend/src/config.ts | 2 + 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index ff6219587..73e810a5c 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -3,68 +3,96 @@ import axios, { AxiosRequestConfig } from 'axios'; import http from 'http'; import { AbstractBitcoinApi } from './bitcoin-api-abstract-factory'; import { IEsploraApi } from './esplora-api.interface'; +import logger from '../../logger'; const axiosConnection = axios.create({ httpAgent: new http.Agent({ keepAlive: true, }) }); class ElectrsApi implements AbstractBitcoinApi { - axiosConfig: AxiosRequestConfig = config.ESPLORA.UNIX_SOCKET_PATH ? { + private axiosConfigWithUnixSocket: AxiosRequestConfig = config.ESPLORA.UNIX_SOCKET_PATH ? { socketPath: config.ESPLORA.UNIX_SOCKET_PATH, timeout: 10000, } : { timeout: 10000, }; + private axiosConfigTcpSocketOnly: AxiosRequestConfig = { + timeout: 10000, + }; - constructor() { } + unixSocketRetryTimeout; + activeAxiosConfig; + + fallbackToTcpSocket() { + if (!this.unixSocketRetryTimeout) { + logger.err(`Unable to connect to esplora unix socket. Falling back to tcp socket. Retrying unix socket in ${config.ESPLORA.RETRY_UNIX_SOCKET_AFTER} seconds`); + // Retry the unix socket after a few seconds + this.unixSocketRetryTimeout = setTimeout(() => { + this.activeAxiosConfig = this.axiosConfigWithUnixSocket; + }, config.ESPLORA.RETRY_UNIX_SOCKET_AFTER); + } + + // Use the TCP socket (reach a different esplora instance through nginx) + this.activeAxiosConfig = this.axiosConfigTcpSocketOnly; + } + + $queryWrapper(url, responseType = 'json'): Promise { + return axiosConnection.get(url, { ...this.activeAxiosConfig, responseType: responseType }) + .then((response) => response.data) + .catch((e) => { + if (e?.code === 'ECONNREFUSED' || e?.code === 'ETIMEDOUT') { + this.fallbackToTcpSocket(); + // Retry immediately + return axiosConnection.get(url, this.activeAxiosConfig) + .then((response) => response.data) + .catch((e) => { + logger.warn(`Cannot query esplora through the unix socket nor the tcp socket. Exception ${e}`); + throw e; + }); + } else { + throw e; + } + }); + } $getRawMempool(): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/mempool/txids', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/mempool/txids'); } $getRawTransaction(txId: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId, this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId); } $getTransactionHex(txId: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/hex', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/hex'); } $getBlockHeightTip(): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/blocks/tip/height', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/blocks/tip/height'); } $getBlockHashTip(): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/blocks/tip/hash', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/blocks/tip/hash'); } $getTxIdsForBlock(hash: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + '/txids', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + '/txids'); } $getBlockHash(height: number): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block-height/' + height, this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block-height/' + height); } $getBlockHeader(hash: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + '/header', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + '/header'); } $getBlock(hash: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash, this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash); } $getRawBlock(hash: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + "/raw", { ...this.axiosConfig, responseType: 'arraybuffer' }) + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + "/raw", 'arraybuffer') .then((response) => { return Buffer.from(response.data); }); } @@ -85,13 +113,11 @@ class ElectrsApi implements AbstractBitcoinApi { } $getOutspend(txId: string, vout: number): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspend/' + vout, this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspend/' + vout); } $getOutspends(txId: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspends', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspends'); } async $getBatchedOutspends(txId: string[]): Promise { diff --git a/backend/src/config.ts b/backend/src/config.ts index 81db16081..7c0e4e950 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -38,6 +38,7 @@ interface IConfig { ESPLORA: { REST_API_URL: string; UNIX_SOCKET_PATH: string | void | null; + RETRY_UNIX_SOCKET_AFTER: number; }; LIGHTNING: { ENABLED: boolean; @@ -165,6 +166,7 @@ const defaults: IConfig = { 'ESPLORA': { 'REST_API_URL': 'http://127.0.0.1:3000', 'UNIX_SOCKET_PATH': null, + 'RETRY_UNIX_SOCKET_AFTER': 30000, }, 'ELECTRUM': { 'HOST': '127.0.0.1', From b6f1fd5a4a8ec59c7e12248c76b9eb731ef9a477 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Apr 2023 16:38:37 +0900 Subject: [PATCH 200/782] [esplora] initialize default socket config to axiosConfigWithUnixSocket --- backend/src/api/bitcoin/esplora-api.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 73e810a5c..15a6a6844 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -23,6 +23,10 @@ class ElectrsApi implements AbstractBitcoinApi { unixSocketRetryTimeout; activeAxiosConfig; + constructor() { + this.activeAxiosConfig = this.axiosConfigWithUnixSocket; + } + fallbackToTcpSocket() { if (!this.unixSocketRetryTimeout) { logger.err(`Unable to connect to esplora unix socket. Falling back to tcp socket. Retrying unix socket in ${config.ESPLORA.RETRY_UNIX_SOCKET_AFTER} seconds`); From 66109afb0d5dadcd7ea736423a8cb471e0974f13 Mon Sep 17 00:00:00 2001 From: wiz Date: Wed, 5 Apr 2023 16:48:26 +0900 Subject: [PATCH 201/782] ops: Enable unix socket for esplora on mainnet-lightning --- production/mempool-config.mainnet-lightning.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/production/mempool-config.mainnet-lightning.json b/production/mempool-config.mainnet-lightning.json index 546c58163..37e407aeb 100644 --- a/production/mempool-config.mainnet-lightning.json +++ b/production/mempool-config.mainnet-lightning.json @@ -15,7 +15,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4000" + "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-mainnet" }, "LIGHTNING": { "ENABLED": true, From db27e5a92c8feb98d1ddc0ee38b3bcaa4cc98444 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Apr 2023 17:00:41 +0900 Subject: [PATCH 202/782] [esplora] print log when retrying unix socket - don't fallback to tcp socket on ETIMEDOUT --- backend/src/api/bitcoin/esplora-api.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 15a6a6844..e471e4cde 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -29,9 +29,10 @@ class ElectrsApi implements AbstractBitcoinApi { fallbackToTcpSocket() { if (!this.unixSocketRetryTimeout) { - logger.err(`Unable to connect to esplora unix socket. Falling back to tcp socket. Retrying unix socket in ${config.ESPLORA.RETRY_UNIX_SOCKET_AFTER} seconds`); + logger.err(`Unable to connect to esplora unix socket. Falling back to tcp socket. Retrying unix socket in ${config.ESPLORA.RETRY_UNIX_SOCKET_AFTER / 1000} seconds`); // Retry the unix socket after a few seconds this.unixSocketRetryTimeout = setTimeout(() => { + logger.info(`Retrying to use unix socket for esplora now (applied for the next query)`); this.activeAxiosConfig = this.axiosConfigWithUnixSocket; }, config.ESPLORA.RETRY_UNIX_SOCKET_AFTER); } @@ -44,7 +45,7 @@ class ElectrsApi implements AbstractBitcoinApi { return axiosConnection.get(url, { ...this.activeAxiosConfig, responseType: responseType }) .then((response) => response.data) .catch((e) => { - if (e?.code === 'ECONNREFUSED' || e?.code === 'ETIMEDOUT') { + if (e?.code === 'ECONNREFUSED') { this.fallbackToTcpSocket(); // Retry immediately return axiosConnection.get(url, this.activeAxiosConfig) From ab7cb5f68148335d6baed475ef9595f9dcfe225d Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Apr 2023 17:05:23 +0900 Subject: [PATCH 203/782] [esplora] reset timeout variable when retrying unix socket --- backend/src/api/bitcoin/esplora-api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index e471e4cde..ee7fa4765 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -34,6 +34,7 @@ class ElectrsApi implements AbstractBitcoinApi { this.unixSocketRetryTimeout = setTimeout(() => { logger.info(`Retrying to use unix socket for esplora now (applied for the next query)`); this.activeAxiosConfig = this.axiosConfigWithUnixSocket; + this.unixSocketRetryTimeout = undefined; }, config.ESPLORA.RETRY_UNIX_SOCKET_AFTER); } From c23e529f0ac404646871d1c45949836ecc57f52c Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Apr 2023 22:44:01 +0900 Subject: [PATCH 204/782] [main loop] retry every seconds upon exception - warn after 5 attempts --- backend/src/index.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index a7f805313..abaec9cef 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -45,7 +45,8 @@ class Server { private wss: WebSocket.Server | undefined; private server: http.Server | undefined; private app: Application; - private currentBackendRetryInterval = 5; + private currentBackendRetryInterval = 1; + private backendRetryCount = 0; private maxHeapSize: number = 0; private heapLogInterval: number = 60; @@ -184,17 +185,17 @@ class Server { indexer.$run(); setTimeout(this.runMainUpdateLoop.bind(this), config.MEMPOOL.POLL_RATE_MS); - this.currentBackendRetryInterval = 5; + this.backendRetryCount = 0; } catch (e: any) { - let loggerMsg = `Exception in runMainUpdateLoop(). Retrying in ${this.currentBackendRetryInterval} sec.`; + this.backendRetryCount++; + let loggerMsg = `Exception in runMainUpdateLoop() (count: ${this.backendRetryCount}). Retrying in ${this.currentBackendRetryInterval} sec.`; loggerMsg += ` Reason: ${(e instanceof Error ? e.message : e)}.`; if (e?.stack) { loggerMsg += ` Stack trace: ${e.stack}`; } // When we get a first Exception, only `logger.debug` it and retry after 5 seconds // From the second Exception, `logger.warn` the Exception and increase the retry delay - // Maximum retry delay is 60 seconds - if (this.currentBackendRetryInterval > 5) { + if (this.backendRetryCount >= 5) { logger.warn(loggerMsg); mempool.setOutOfSync(); } else { @@ -204,8 +205,6 @@ class Server { logger.debug(`AxiosError: ${e?.message}`); } setTimeout(this.runMainUpdateLoop.bind(this), 1000 * this.currentBackendRetryInterval); - this.currentBackendRetryInterval *= 2; - this.currentBackendRetryInterval = Math.min(this.currentBackendRetryInterval, 60); } } From b23f14b79886e51f2de52ba83065177f7f20eee9 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 6 Apr 2023 11:54:22 +0900 Subject: [PATCH 205/782] [indexing] fix typescript issue, reading invalid field --- backend/src/repositories/BlocksRepository.ts | 52 ++++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 69d597e1f..45b1499ae 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -13,6 +13,48 @@ import chainTips from '../api/chain-tips'; import blocks from '../api/blocks'; import BlocksAuditsRepository from './BlocksAuditsRepository'; +interface DatabaseBlock { + id: string; + height: number; + version: number; + timestamp: number; + bits: number; + nonce: number; + difficulty: number; + merkle_root: string; + tx_count: number; + size: number; + weight: number; + previousblockhash: string; + mediantime: number; + totalFees: number; + medianFee: number; + feeRange: string; + reward: number; + poolId: number; + poolName: string; + poolSlug: string; + avgFee: number; + avgFeeRate: number; + coinbaseRaw: string; + coinbaseAddress: string; + coinbaseSignature: string; + coinbaseSignatureAscii: string; + avgTxSize: number; + totalInputs: number; + totalOutputs: number; + totalOutputAmt: number; + medianFeeAmt: number; + feePercentiles: string; + segwitTotalTxs: number; + segwitTotalSize: number; + segwitTotalWeight: number; + header: string; + utxoSetChange: number; + utxoSetSize: number; + totalInputAmt: number; +} + const BLOCK_DB_FIELDS = ` blocks.hash AS id, blocks.height, @@ -52,7 +94,7 @@ const BLOCK_DB_FIELDS = ` blocks.header, blocks.utxoset_change AS utxoSetChange, blocks.utxoset_size AS utxoSetSize, - blocks.total_input_amt AS totalInputAmts + blocks.total_input_amt AS totalInputAmt `; class BlocksRepository { @@ -432,7 +474,7 @@ class BlocksRepository { const blocks: BlockExtended[] = []; for (const block of rows) { - blocks.push(await this.formatDbBlockIntoExtendedBlock(block)); + blocks.push(await this.formatDbBlockIntoExtendedBlock(block as DatabaseBlock)); } return blocks; @@ -459,7 +501,7 @@ class BlocksRepository { return null; } - return await this.formatDbBlockIntoExtendedBlock(rows[0]); + return await this.formatDbBlockIntoExtendedBlock(rows[0] as DatabaseBlock); } catch (e) { logger.err(`Cannot get indexed block ${height}. Reason: ` + (e instanceof Error ? e.message : e)); throw e; @@ -908,7 +950,7 @@ class BlocksRepository { * * @param dbBlk */ - private async formatDbBlockIntoExtendedBlock(dbBlk: any): Promise { + private async formatDbBlockIntoExtendedBlock(dbBlk: DatabaseBlock): Promise { const blk: Partial = {}; const extras: Partial = {}; @@ -980,7 +1022,7 @@ class BlocksRepository { if (extras.feePercentiles === null) { const block = await bitcoinClient.getBlock(dbBlk.id, 2); const summary = blocks.summarizeBlock(block); - await BlocksSummariesRepository.$saveTransactions(dbBlk.height, dbBlk.hash, summary.transactions); + await BlocksSummariesRepository.$saveTransactions(dbBlk.height, dbBlk.id, summary.transactions); extras.feePercentiles = await BlocksSummariesRepository.$getFeePercentilesByBlockId(dbBlk.id); } if (extras.feePercentiles !== null) { From 6016db253382690945896061da0f9675201af9f4 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 6 Apr 2023 11:55:17 +0900 Subject: [PATCH 206/782] [indexing] save missing `fee_percentiles` and `median_fee_amt` when indexing on the fly --- backend/src/api/blocks.ts | 1 + backend/src/repositories/BlocksRepository.ts | 27 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 13232cc8e..15a218e24 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -857,6 +857,7 @@ class Blocks { } if (cleanBlock.fee_amt_percentiles !== null) { cleanBlock.median_fee_amt = cleanBlock.fee_amt_percentiles[3]; + await blocksRepository.$updateFeeAmounts(cleanBlock.hash, cleanBlock.fee_amt_percentiles, cleanBlock.median_fee_amt); } } diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 45b1499ae..a014e317e 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -213,6 +213,32 @@ class BlocksRepository { } } + /** + * Update missing fee amounts fields + * + * @param blockHash + * @param feeAmtPercentiles + * @param medianFeeAmt + */ + public async $updateFeeAmounts(blockHash: string, feeAmtPercentiles, medianFeeAmt) : Promise { + try { + const query = ` + UPDATE blocks + SET fee_percentiles = ?, median_fee_amt = ? + WHERE hash = ? + `; + const params: any[] = [ + JSON.stringify(feeAmtPercentiles), + medianFeeAmt, + blockHash + ]; + await DB.query(query, params); + } catch (e: any) { + logger.err(`Cannot update fee amounts for block ${blockHash}. Reason: ' + ${e instanceof Error ? e.message : e}`); + throw e; + } + } + /** * Get all block height that have not been indexed between [startHeight, endHeight] */ @@ -1027,6 +1053,7 @@ class BlocksRepository { } if (extras.feePercentiles !== null) { extras.medianFeeAmt = extras.feePercentiles[3]; + await this.$updateFeeAmounts(dbBlk.id, extras.feePercentiles, extras.medianFeeAmt); } } From c5252dc27d52c1c4460468ea798ee17651348f1d Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 6 Apr 2023 11:55:25 +0900 Subject: [PATCH 207/782] [indexing] delete dead code --- .../repositories/BlocksSummariesRepository.ts | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/backend/src/repositories/BlocksSummariesRepository.ts b/backend/src/repositories/BlocksSummariesRepository.ts index de70322bd..f2560fbe7 100644 --- a/backend/src/repositories/BlocksSummariesRepository.ts +++ b/backend/src/repositories/BlocksSummariesRepository.ts @@ -17,26 +17,6 @@ class BlocksSummariesRepository { return undefined; } - public async $saveSummary(params: { height: number, mined?: BlockSummary}): Promise { - const blockId = params.mined?.id; - try { - const transactions = JSON.stringify(params.mined?.transactions || []); - await DB.query(` - INSERT INTO blocks_summaries (height, id, transactions, template) - VALUE (?, ?, ?, ?) - ON DUPLICATE KEY UPDATE - transactions = ? - `, [params.height, blockId, transactions, '[]', transactions]); - } catch (e: any) { - if (e.errno === 1062) { // ER_DUP_ENTRY - This scenario is possible upon node backend restart - logger.debug(`Cannot save block summary for ${blockId} because it has already been indexed, ignoring`); - } else { - logger.debug(`Cannot save block summary for ${blockId}. Reason: ${e instanceof Error ? e.message : e}`); - throw e; - } - } - } - public async $saveTransactions(blockHeight: number, blockId: string, transactions: TransactionStripped[]): Promise { try { const transactionsStr = JSON.stringify(transactions); From 3c304159820ae321bc1d1eb6958176b6e086a588 Mon Sep 17 00:00:00 2001 From: wiz Date: Thu, 6 Apr 2023 17:52:17 +0900 Subject: [PATCH 208/782] ops: Add fallback TCP socket for esplora backends --- production/mempool-config.bisq.json | 3 ++- production/mempool-config.liquid.json | 1 + production/mempool-config.liquidtestnet.json | 1 + production/mempool-config.mainnet-lightning.json | 1 + production/mempool-config.mainnet.json | 1 + production/mempool-config.signet-lightning.json | 3 ++- production/mempool-config.signet.json | 1 + production/mempool-config.testnet-lightning.json | 3 ++- production/mempool-config.testnet.json | 1 + 9 files changed, 12 insertions(+), 3 deletions(-) diff --git a/production/mempool-config.bisq.json b/production/mempool-config.bisq.json index 124773aeb..26024f8a3 100644 --- a/production/mempool-config.bisq.json +++ b/production/mempool-config.bisq.json @@ -15,7 +15,8 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4000" + "REST_API_URL": "http://127.0.0.1:5000", + "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-mainnet" }, "DATABASE": { "ENABLED": false, diff --git a/production/mempool-config.liquid.json b/production/mempool-config.liquid.json index 72c469da5..29223fa07 100644 --- a/production/mempool-config.liquid.json +++ b/production/mempool-config.liquid.json @@ -23,6 +23,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { + "REST_API_URL": "http://127.0.0.1:5001", "UNIX_SOCKET_PATH": "/elements/socket/esplora-liquid-mainnet" }, "DATABASE": { diff --git a/production/mempool-config.liquidtestnet.json b/production/mempool-config.liquidtestnet.json index 3a6cafe0d..82b41e07f 100644 --- a/production/mempool-config.liquidtestnet.json +++ b/production/mempool-config.liquidtestnet.json @@ -23,6 +23,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { + "REST_API_URL": "http://127.0.0.1:5004", "UNIX_SOCKET_PATH": "/elements/socket/esplora-liquid-testnet" }, "DATABASE": { diff --git a/production/mempool-config.mainnet-lightning.json b/production/mempool-config.mainnet-lightning.json index 37e407aeb..21e7109e9 100644 --- a/production/mempool-config.mainnet-lightning.json +++ b/production/mempool-config.mainnet-lightning.json @@ -15,6 +15,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { + "REST_API_URL": "http://127.0.0.1:5000", "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-mainnet" }, "LIGHTNING": { diff --git a/production/mempool-config.mainnet.json b/production/mempool-config.mainnet.json index 6eb09df8d..1cbed5119 100644 --- a/production/mempool-config.mainnet.json +++ b/production/mempool-config.mainnet.json @@ -31,6 +31,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { + "REST_API_URL": "http://127.0.0.1:5000", "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-mainnet" }, "DATABASE": { diff --git a/production/mempool-config.signet-lightning.json b/production/mempool-config.signet-lightning.json index a787b831b..7751d8f0e 100644 --- a/production/mempool-config.signet-lightning.json +++ b/production/mempool-config.signet-lightning.json @@ -15,7 +15,8 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4003" + "REST_API_URL": "http://127.0.0.1:5003", + "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-signet" }, "LIGHTNING": { "ENABLED": true, diff --git a/production/mempool-config.signet.json b/production/mempool-config.signet.json index 7b8667d11..8cd21047d 100644 --- a/production/mempool-config.signet.json +++ b/production/mempool-config.signet.json @@ -22,6 +22,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { + "REST_API_URL": "http://127.0.0.1:5003", "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-signet" }, "DATABASE": { diff --git a/production/mempool-config.testnet-lightning.json b/production/mempool-config.testnet-lightning.json index c2d0a257e..d8283b779 100644 --- a/production/mempool-config.testnet-lightning.json +++ b/production/mempool-config.testnet-lightning.json @@ -15,7 +15,8 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { - "REST_API_URL": "http://127.0.0.1:4002" + "REST_API_URL": "http://127.0.0.1:5002", + "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-testnet" }, "LIGHTNING": { "ENABLED": true, diff --git a/production/mempool-config.testnet.json b/production/mempool-config.testnet.json index c68162a9d..9f33e7aa7 100644 --- a/production/mempool-config.testnet.json +++ b/production/mempool-config.testnet.json @@ -22,6 +22,7 @@ "PASSWORD": "__BITCOIN_RPC_PASS__" }, "ESPLORA": { + "REST_API_URL": "http://127.0.0.1:5002", "UNIX_SOCKET_PATH": "/bitcoin/socket/esplora-bitcoin-testnet" }, "DATABASE": { From 604c3ba266214424d97c18f2dbd54446633d2056 Mon Sep 17 00:00:00 2001 From: wiz Date: Thu, 6 Apr 2023 19:18:38 +0900 Subject: [PATCH 209/782] ops: Tweak boot-time delays for all daemons --- production/bitcoin.crontab | 10 +++++----- production/elements.crontab | 8 ++++---- production/install | 8 ++++---- production/mempool.crontab | 2 +- production/minfee.crontab | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/production/bitcoin.crontab b/production/bitcoin.crontab index 1f2518da4..cca0443c7 100644 --- a/production/bitcoin.crontab +++ b/production/bitcoin.crontab @@ -1,5 +1,5 @@ -@reboot sleep 30 ; screen -dmS mainnet /bitcoin/electrs/electrs-start-mainnet -@reboot sleep 60 ; /usr/local/bin/bitcoind -testnet >/dev/null 2>&1 -@reboot sleep 70 ; screen -dmS testnet /bitcoin/electrs/electrs-start-testnet -@reboot sleep 80 ; /usr/local/bin/bitcoind -signet >/dev/null 2>&1 -@reboot sleep 90 ; screen -dmS signet /bitcoin/electrs/electrs-start-signet +@reboot screen -dmS mainnet /bitcoin/electrs/electrs-start-mainnet +@reboot /usr/local/bin/bitcoind -testnet >/dev/null 2>&1 +@reboot screen -dmS testnet /bitcoin/electrs/electrs-start-testnet +@reboot /usr/local/bin/bitcoind -signet >/dev/null 2>&1 +@reboot screen -dmS signet /bitcoin/electrs/electrs-start-signet diff --git a/production/elements.crontab b/production/elements.crontab index 5ba8151a3..c0194ac4f 100644 --- a/production/elements.crontab +++ b/production/elements.crontab @@ -1,10 +1,10 @@ # start elements on reboot -@reboot sleep 60 ; /usr/local/bin/elementsd -chain=liquidv1 >/dev/null 2>&1 -@reboot sleep 60 ; /usr/local/bin/elementsd -chain=liquidtestnet >/dev/null 2>&1 +@reboot /usr/local/bin/elementsd -chain=liquidv1 >/dev/null 2>&1 +@reboot /usr/local/bin/elementsd -chain=liquidtestnet >/dev/null 2>&1 # start electrs on reboot -@reboot sleep 90 ; screen -dmS liquidv1 /elements/electrs/electrs-start-liquid -@reboot sleep 90 ; screen -dmS liquidtestnet /elements/electrs/electrs-start-liquidtestnet +@reboot screen -dmS liquidv1 /elements/electrs/electrs-start-liquid +@reboot screen -dmS liquidtestnet /elements/electrs/electrs-start-liquidtestnet # hourly asset update and electrs restart 6 * * * * cd $HOME/asset_registry_db && git pull --quiet origin master && cd $HOME/asset_registry_testnet_db && git pull --quiet origin master && killall electrs diff --git a/production/install b/production/install index 27c4dbd14..b50fa5f11 100755 --- a/production/install +++ b/production/install @@ -1325,10 +1325,10 @@ case $OS in public_ipv4=$( ifconfig | grep 'inet ' | awk -F ' ' '{ print $2 }' | grep -v '^103\.165\.192\.' | grep -v '^127\.0\.0\.1' ) public_ipv6=$( ifconfig | grep 'inet6' | awk -F ' ' '{ print $2 }' | grep -v '^2001:df6:7280::' | grep -v '^fe80::' | grep -v '^::1' ) - crontab_cln+="@reboot sleep 60 ; screen -dmS main lightningd --rpc-file-mode 0660 --alias `hostname` --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6\n" - crontab_cln+="@reboot sleep 90 ; screen -dmS tes lightningd --rpc-file-mode 0660 --alias `hostname` --network testnet --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6\n" - crontab_cln+="@reboot sleep 120 ; screen -dmS sig lightningd --rpc-file-mode 0660 --alias `hostname` --network signet --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6 \n" - crontab_cln+="@reboot sleep 180 ; /mempool/mempool.space/lightning-seeder >/dev/null 2>&1\n" + crontab_cln+="@reboot sleep 10 ; screen -dmS main lightningd --rpc-file-mode 0660 --alias `hostname` --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6\n" + crontab_cln+="@reboot sleep 10 ; screen -dmS tes lightningd --rpc-file-mode 0660 --alias `hostname` --network testnet --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6\n" + crontab_cln+="@reboot sleep 10 ; screen -dmS sig lightningd --rpc-file-mode 0660 --alias `hostname` --network signet --disable-ip-discovery --autolisten false --bind-addr $public_ipv4 --announce-addr $public_ipv4 --bind-addr $public_ipv6 --announce-addr $public_ipv6 \n" + crontab_cln+="@reboot sleep 20 ; /mempool/mempool.space/lightning-seeder >/dev/null 2>&1\n" crontab_cln+="1 * * * * /mempool/mempool.space/lightning-seeder >/dev/null 2>&1\n" echo "${crontab_cln}" | crontab -u "${CLN_USER}" - ;; diff --git a/production/mempool.crontab b/production/mempool.crontab index 0e7b6af6b..196c2566e 100644 --- a/production/mempool.crontab +++ b/production/mempool.crontab @@ -1,5 +1,5 @@ # start on reboot -@reboot sleep 10 ; $HOME/start +@reboot sleep 90 ; $HOME/start # daily backup 37 13 * * * sleep 30 ; /mempool/mempool.space/backup >/dev/null 2>&1 & diff --git a/production/minfee.crontab b/production/minfee.crontab index d5b882933..61b4d25a8 100644 --- a/production/minfee.crontab +++ b/production/minfee.crontab @@ -1 +1 @@ -@reboot sleep 120 ; /usr/local/bin/bitcoind >/dev/null 2>&1 +@reboot /usr/local/bin/bitcoind >/dev/null 2>&1 From d18ebdfc5902b47a0afd869c59e3c8d92d3c90fd Mon Sep 17 00:00:00 2001 From: wiz Date: Thu, 6 Apr 2023 19:19:10 +0900 Subject: [PATCH 210/782] ops: Update hard-coded path for liquid asset icons --- backend/src/api/liquid/icons.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/liquid/icons.ts b/backend/src/api/liquid/icons.ts index ee08757d0..a963c703c 100644 --- a/backend/src/api/liquid/icons.ts +++ b/backend/src/api/liquid/icons.ts @@ -2,7 +2,7 @@ import * as fs from 'fs'; import logger from '../../logger'; class Icons { - private static FILE_NAME = './icons.json'; + private static FILE_NAME = '/elements/asset_registry_db/icons.json'; private iconIds: string[] = []; private icons: { [assetId: string]: string; } = {}; From 5950034f53b9769fe1b589f0a32fffad89fcb4a7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 6 Apr 2023 03:27:13 +0900 Subject: [PATCH 211/782] Perform full cpfp calculations for the entire mempool --- backend/src/api/tx-selection-worker.ts | 34 ++++++-------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/backend/src/api/tx-selection-worker.ts b/backend/src/api/tx-selection-worker.ts index 7297cbe88..93060cd67 100644 --- a/backend/src/api/tx-selection-worker.ts +++ b/backend/src/api/tx-selection-worker.ts @@ -107,7 +107,7 @@ function makeBlockTemplates(mempool: { [txid: string]: ThreadTransaction }) if (nextTx && !nextTx?.used) { // Check if the package fits into this block - if (blockWeight + nextTx.ancestorWeight < config.MEMPOOL.BLOCK_WEIGHT_UNITS) { + if (blocks.length >= 7 || (blockWeight + nextTx.ancestorWeight < config.MEMPOOL.BLOCK_WEIGHT_UNITS)) { const ancestors: AuditTransaction[] = Array.from(nextTx.ancestorMap.values()); // sort ancestors by dependency graph (equivalent to sorting by ascending ancestor count) const sortedTxSet = [...ancestors.sort((a, b) => { return (a.ancestorMap.size || 0) - (b.ancestorMap.size || 0); }), nextTx]; @@ -175,34 +175,14 @@ function makeBlockTemplates(mempool: { [txid: string]: ThreadTransaction }) overflow = []; } } - // pack any leftover transactions into the last block - for (const tx of overflow) { - if (!tx || tx?.used) { - continue; - } - blockWeight += tx.weight; - const mempoolTx = mempool[tx.txid]; - // update original copy of this tx with effective fee rate & relatives data - mempoolTx.effectiveFeePerVsize = tx.score; - if (tx.ancestorMap.size > 0) { - cpfpClusters[tx.txid] = Array.from(tx.ancestorMap?.values()).map(a => a.txid); - mempoolTx.cpfpRoot = tx.txid; - } - mempoolTx.cpfpChecked = true; - transactions.push(tx); - tx.used = true; + + if (overflow.length > 0) { + logger.warn('GBT overflow list unexpectedly non-empty after final block constructed'); } - const blockTransactions = transactions.map(t => mempool[t.txid]); - restOfArray.forEach(tx => { - blockWeight += tx.weight; - tx.effectiveFeePerVsize = tx.feePerVsize; - tx.cpfpChecked = false; - blockTransactions.push(tx); - }); - if (blockTransactions.length) { - blocks.push(blockTransactions); + // add the final unbounded block if it contains any transactions + if (transactions.length > 0) { + blocks.push(transactions.map(t => mempool[t.txid])); } - transactions = []; const end = Date.now(); const time = end - start; From 32cd8bb3cb775ea295c1d5e9a8cfa53add14c398 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 7 Apr 2023 01:44:26 +0900 Subject: [PATCH 212/782] Prevent mempool block animations except when new block mined --- .../mempool-blocks/mempool-blocks.component.html | 2 +- .../mempool-blocks/mempool-blocks.component.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html index 58d555657..0c0564603 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html @@ -2,7 +2,7 @@
    -
    +
     
    diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index d48d1f299..1b647fc53 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, HostListener } from '@angular/core'; import { Subscription, Observable, fromEvent, merge, of, combineLatest } from 'rxjs'; import { MempoolBlock } from '../../interfaces/websocket.interface'; import { StateService } from '../../services/state.service'; @@ -222,8 +222,13 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { clearTimeout(this.resetTransitionTimeout); } + @HostListener('window:resize', ['$event']) + onResize(): void { + this.animateEntry = false; + } + trackByFn(index: number, block: MempoolBlock) { - return (block.isStack) ? 'stack' : block.index; + return (block.isStack) ? `stack-${block.index}` : block.index; } reduceMempoolBlocksToFitScreen(blocks: MempoolBlock[]): MempoolBlock[] { From 6602bddb2b8e040d313f5bd7a19433e315a1c993 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 7 Apr 2023 03:25:02 +0900 Subject: [PATCH 213/782] Fit mempool block skeleton loaders to screen --- .../mempool-blocks.component.ts | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 1b647fc53..ab0a7fd08 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -97,7 +97,7 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { this.mempoolEmptyBlocks.forEach((b) => { this.mempoolEmptyBlockStyles.push(this.getStyleForMempoolEmptyBlock(b.index)); }); - this.reduceMempoolBlocksToFitScreen(this.mempoolEmptyBlocks); + this.reduceEmptyBlocksToFitScreen(this.mempoolEmptyBlocks); this.mempoolBlocks.map(() => { this.updateMempoolBlockStyles(); @@ -225,12 +225,33 @@ export class MempoolBlocksComponent implements OnInit, OnDestroy { @HostListener('window:resize', ['$event']) onResize(): void { this.animateEntry = false; + this.reduceEmptyBlocksToFitScreen(this.mempoolEmptyBlocks); } trackByFn(index: number, block: MempoolBlock) { return (block.isStack) ? `stack-${block.index}` : block.index; } + reduceEmptyBlocksToFitScreen(blocks: MempoolBlock[]): MempoolBlock[] { + const innerWidth = this.stateService.env.BASE_MODULE !== 'liquid' && window.innerWidth <= 767.98 ? window.innerWidth : window.innerWidth / 2; + const blocksAmount = Math.min(this.stateService.env.MEMPOOL_BLOCKS_AMOUNT, Math.floor(innerWidth / (this.blockWidth + this.blockPadding))); + while (blocks.length < blocksAmount) { + blocks.push({ + blockSize: 0, + blockVSize: 0, + feeRange: [], + index: blocks.length, + medianFee: 0, + nTx: 0, + totalFees: 0 + }); + } + while (blocks.length > blocksAmount) { + blocks.pop(); + } + return blocks; + } + reduceMempoolBlocksToFitScreen(blocks: MempoolBlock[]): MempoolBlock[] { const innerWidth = this.stateService.env.BASE_MODULE !== 'liquid' && window.innerWidth <= 767.98 ? window.innerWidth : window.innerWidth / 2; const blocksAmount = Math.min(this.stateService.env.MEMPOOL_BLOCKS_AMOUNT, Math.floor(innerWidth / (this.blockWidth + this.blockPadding))); From bad73c180553bf830a407dea87556c357ceb7e4e Mon Sep 17 00:00:00 2001 From: Giovanni La Perna Date: Fri, 7 Apr 2023 01:04:23 +0200 Subject: [PATCH 214/782] Create giovannilaperna.txt --- contributors/giovannilaperna.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/giovannilaperna.txt diff --git a/contributors/giovannilaperna.txt b/contributors/giovannilaperna.txt new file mode 100644 index 000000000..65a9adf54 --- /dev/null +++ b/contributors/giovannilaperna.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 7, 203. + +Signed: giovannilaperna From d6913b6439d2a91148f234f10ad75cac9783df73 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Fri, 7 Apr 2023 13:28:32 +0900 Subject: [PATCH 215/782] [config] add missing RETRY_UNIX_SOCKET_AFTER --- backend/mempool-config.sample.json | 3 ++- backend/src/__fixtures__/mempool-config.template.json | 3 ++- backend/src/__tests__/config.test.ts | 2 +- docker/README.md | 4 +++- docker/backend/mempool-config.json | 3 ++- docker/backend/start.sh | 2 ++ 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index 99b69c208..1c7097de4 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -44,7 +44,8 @@ }, "ESPLORA": { "REST_API_URL": "http://127.0.0.1:3000", - "UNIX_SOCKET_PATH": "/tmp/esplora-bitcoin-mainnet" + "UNIX_SOCKET_PATH": "/tmp/esplora-bitcoin-mainnet", + "RETRY_UNIX_SOCKET_AFTER": 30000 }, "SECOND_CORE_RPC": { "HOST": "127.0.0.1", diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 625f3d8a0..6330358b7 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -45,7 +45,8 @@ }, "ESPLORA": { "REST_API_URL": "__ESPLORA_REST_API_URL__", - "UNIX_SOCKET_PATH": "__ESPLORA_UNIX_SOCKET_PATH__" + "UNIX_SOCKET_PATH": "__ESPLORA_UNIX_SOCKET_PATH__", + "RETRY_UNIX_SOCKET_AFTER": "__RETRY_UNIX_SOCKET_AFTER__" }, "SECOND_CORE_RPC": { "HOST": "__SECOND_CORE_RPC_HOST__", diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 75b87c6cf..e12f90a86 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -47,7 +47,7 @@ describe('Mempool Backend Config', () => { expect(config.ELECTRUM).toStrictEqual({ HOST: '127.0.0.1', PORT: 3306, TLS_ENABLED: true }); - expect(config.ESPLORA).toStrictEqual({ REST_API_URL: 'http://127.0.0.1:3000', UNIX_SOCKET_PATH: null }); + expect(config.ESPLORA).toStrictEqual({ REST_API_URL: 'http://127.0.0.1:3000', UNIX_SOCKET_PATH: null, RETRY_UNIX_SOCKET_AFTER: 30000 }); expect(config.CORE_RPC).toStrictEqual({ HOST: '127.0.0.1', diff --git a/docker/README.md b/docker/README.md index e81e45b42..ee5ba11c5 100644 --- a/docker/README.md +++ b/docker/README.md @@ -205,7 +205,8 @@ Corresponding `docker-compose.yml` overrides: ```json "ESPLORA": { "REST_API_URL": "http://127.0.0.1:3000", - "UNIX_SOCKET_PATH": "/tmp/esplora-socket" + "UNIX_SOCKET_PATH": "/tmp/esplora-socket", + "RETRY_UNIX_SOCKET_AFTER": 30000 }, ``` @@ -215,6 +216,7 @@ Corresponding `docker-compose.yml` overrides: environment: ESPLORA_REST_API_URL: "" ESPLORA_UNIX_SOCKET_PATH: "" + ESPLORA_RETRY_UNIX_SOCKET_AFTER: "" ... ``` diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 7d2737e9c..58e6b5629 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -43,7 +43,8 @@ }, "ESPLORA": { "REST_API_URL": "__ESPLORA_REST_API_URL__", - "UNIX_SOCKET_PATH": "__ESPLORA_UNIX_SOCKET_PATH__" + "UNIX_SOCKET_PATH": "__ESPLORA_UNIX_SOCKET_PATH__", + "RETRY_UNIX_SOCKET_AFTER": "__RETRY_UNIX_SOCKET_AFTER__" }, "SECOND_CORE_RPC": { "HOST": "__SECOND_CORE_RPC_HOST__", diff --git a/docker/backend/start.sh b/docker/backend/start.sh index 55da48464..c6ce8f1e7 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -47,6 +47,7 @@ __ELECTRUM_TLS_ENABLED__=${ELECTRUM_TLS_ENABLED:=false} # ESPLORA __ESPLORA_REST_API_URL__=${ESPLORA_REST_API_URL:=http://127.0.0.1:3000} __ESPLORA_UNIX_SOCKET_PATH__=${ESPLORA_UNIX_SOCKET_PATH:=null} +__ESPLORA_RETRY_UNIX_SOCKET_AFTER__=${ESPLORA_RETRY_UNIX_SOCKET_AFTER:=30000} # SECOND_CORE_RPC __SECOND_CORE_RPC_HOST__=${SECOND_CORE_RPC_HOST:=127.0.0.1} @@ -168,6 +169,7 @@ sed -i "s/__ELECTRUM_TLS_ENABLED__/${__ELECTRUM_TLS_ENABLED__}/g" mempool-config sed -i "s!__ESPLORA_REST_API_URL__!${__ESPLORA_REST_API_URL__}!g" mempool-config.json sed -i "s!__ESPLORA_UNIX_SOCKET_PATH__!${__ESPLORA_UNIX_SOCKET_PATH__}!g" mempool-config.json +sed -i "s!__ESPLORA_RETRY_UNIX_SOCKET_AFTER__!${__ESPLORA_RETRY_UNIX_SOCKET_AFTER__}!g" mempool-config.json sed -i "s/__SECOND_CORE_RPC_HOST__/${__SECOND_CORE_RPC_HOST__}/g" mempool-config.json sed -i "s/__SECOND_CORE_RPC_PORT__/${__SECOND_CORE_RPC_PORT__}/g" mempool-config.json From dfe2cf631facbbc50c87094be7fda999e2e5c641 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 8 Apr 2023 10:42:08 +0900 Subject: [PATCH 216/782] [config] fix docker esplora config and template --- backend/src/__fixtures__/mempool-config.template.json | 2 +- docker/backend/mempool-config.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 6330358b7..6c2269a4f 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -46,7 +46,7 @@ "ESPLORA": { "REST_API_URL": "__ESPLORA_REST_API_URL__", "UNIX_SOCKET_PATH": "__ESPLORA_UNIX_SOCKET_PATH__", - "RETRY_UNIX_SOCKET_AFTER": "__RETRY_UNIX_SOCKET_AFTER__" + "RETRY_UNIX_SOCKET_AFTER": "__ESPLORA_RETRY_UNIX_SOCKET_AFTER__" }, "SECOND_CORE_RPC": { "HOST": "__SECOND_CORE_RPC_HOST__", diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 58e6b5629..f4543bd2e 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -44,7 +44,7 @@ "ESPLORA": { "REST_API_URL": "__ESPLORA_REST_API_URL__", "UNIX_SOCKET_PATH": "__ESPLORA_UNIX_SOCKET_PATH__", - "RETRY_UNIX_SOCKET_AFTER": "__RETRY_UNIX_SOCKET_AFTER__" + "RETRY_UNIX_SOCKET_AFTER": __ESPLORA_RETRY_UNIX_SOCKET_AFTER__ }, "SECOND_CORE_RPC": { "HOST": "__SECOND_CORE_RPC_HOST__", From 123b853205f22b6f8931bd0cdcbf2f6600d71160 Mon Sep 17 00:00:00 2001 From: Rex Date: Sat, 8 Apr 2023 11:41:34 +0800 Subject: [PATCH 217/782] Add cla --- contributors/nothing0012.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/nothing0012.txt diff --git a/contributors/nothing0012.txt b/contributors/nothing0012.txt new file mode 100644 index 000000000..e26514d35 --- /dev/null +++ b/contributors/nothing0012.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 8, 2023. + +Signed: nothing0012 From 71935e29c8cd4453da5538bf395928d49bdc42b7 Mon Sep 17 00:00:00 2001 From: Giovanni La Perna Date: Sat, 8 Apr 2023 11:19:04 +0200 Subject: [PATCH 218/782] Update and rename giovannilaperna.txt to learntheropes.txt change github username --- contributors/{giovannilaperna.txt => learntheropes.txt} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contributors/{giovannilaperna.txt => learntheropes.txt} (86%) diff --git a/contributors/giovannilaperna.txt b/contributors/learntheropes.txt similarity index 86% rename from contributors/giovannilaperna.txt rename to contributors/learntheropes.txt index 65a9adf54..f8d79bf93 100644 --- a/contributors/giovannilaperna.txt +++ b/contributors/learntheropes.txt @@ -1,3 +1,3 @@ I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 7, 203. -Signed: giovannilaperna +Signed: learntheropes From 22ee9916ddbe8f65130d2f63bae7aab739798e57 Mon Sep 17 00:00:00 2001 From: TechMiX Date: Wed, 19 Apr 2023 12:14:21 +0200 Subject: [PATCH 219/782] fix change component and audit button position in RTL mode --- frontend/src/app/components/change/change.component.html | 2 +- frontend/src/styles.scss | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/change/change.component.html b/frontend/src/app/components/change/change.component.html index 117a0c534..ffc00bf5f 100644 --- a/frontend/src/app/components/change/change.component.html +++ b/frontend/src/app/components/change/change.component.html @@ -1,3 +1,3 @@ - {{ change >= 0 ? '+' : '' }}{{ change | amountShortener }}% + ‎{{ change >= 0 ? '+' : '' }}{{ change | amountShortener }}% diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index d9ea867dc..d64450b93 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -988,6 +988,10 @@ th { margin-right: 10px; } } + + .btn-audit { + margin-left: .5em; + } } .scriptmessage { From b0859f91b2e6b62231d88b5fa9086cd939841f38 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Wed, 19 Apr 2023 22:00:09 -0400 Subject: [PATCH 220/782] Update unchained icon on about page --- .../app/components/about/about.component.html | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 8a0e13335..8a139e5a9 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -107,22 +107,7 @@ Blockstream - - - - - - - - - - - + Unchained From 008ec104b60fca5db7444ef2dcb81a77e6296dc5 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Wed, 19 Apr 2023 22:52:53 -0400 Subject: [PATCH 221/782] Fix clashing class in unchained svg --- frontend/src/app/components/about/about.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 8a139e5a9..9c52d754d 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -107,7 +107,7 @@ Blockstream - + Unchained From 7b9fd8ac635e8d7d1acea436a8c62c75cb0000b2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 26 Apr 2023 04:55:42 +0900 Subject: [PATCH 222/782] prevent table overflow in unfurl previews --- .../components/address/address-preview.component.html | 2 +- .../components/address/address-preview.component.scss | 5 +++++ .../app/components/block/block-preview.component.html | 2 +- .../app/components/block/block-preview.component.scss | 5 +++++ .../app/lightning/channel/channel-preview.component.html | 2 +- .../app/lightning/channel/channel-preview.component.scss | 5 +++++ .../src/app/lightning/node/node-preview.component.scss | 9 +++++---- 7 files changed, 23 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/components/address/address-preview.component.html b/frontend/src/app/components/address/address-preview.component.html index 1924d1a4c..392cc971e 100644 --- a/frontend/src/app/components/address/address-preview.component.html +++ b/frontend/src/app/components/address/address-preview.component.html @@ -3,7 +3,7 @@ Address
    -
    +

    diff --git a/frontend/src/app/components/address/address-preview.component.scss b/frontend/src/app/components/address/address-preview.component.scss index afa8cb4b4..21e7faab5 100644 --- a/frontend/src/app/components/address/address-preview.component.scss +++ b/frontend/src/app/components/address/address-preview.component.scss @@ -20,6 +20,11 @@ margin-right: 15px; } +.table-col { + max-width: calc(100% - 470px); + overflow: hidden; +} + .table { font-size: 32px; margin-top: 48px; diff --git a/frontend/src/app/components/block/block-preview.component.html b/frontend/src/app/components/block/block-preview.component.html index 29da36373..2109e5753 100644 --- a/frontend/src/app/components/block/block-preview.component.html +++ b/frontend/src/app/components/block/block-preview.component.html @@ -3,7 +3,7 @@ Block
    Blocks 24h1wAllBlocks 24h1wAll
    Effective fee rate + {{ effectiveRate | feeRounding }} sat/vB +
    Virtual size
    diff --git a/frontend/src/app/lightning/channel/channel-preview.component.scss b/frontend/src/app/lightning/channel/channel-preview.component.scss index 23a874ee8..6b6ac5152 100644 --- a/frontend/src/app/lightning/channel/channel-preview.component.scss +++ b/frontend/src/app/lightning/channel/channel-preview.component.scss @@ -1,3 +1,8 @@ +.table-col { + max-width: calc(100% - 470px); + overflow: hidden; +} + .table { font-size: 32px; margin-top: 10px; diff --git a/frontend/src/app/lightning/node/node-preview.component.scss b/frontend/src/app/lightning/node/node-preview.component.scss index baa33915b..da8794010 100644 --- a/frontend/src/app/lightning/node/node-preview.component.scss +++ b/frontend/src/app/lightning/node/node-preview.component.scss @@ -1,3 +1,8 @@ +.table-col { + max-width: calc(100% - 470px); + overflow: hidden; +} + .table { margin-top: 6px; font-size: 32px; @@ -18,10 +23,6 @@ } } -.table-col { - max-width: calc(100% - 470px); -} - .map-col { flex-grow: 0; flex-shrink: 0; From 66919a1aba90ad63781df1cbc6cbea400ce516bc Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 26 Apr 2023 13:49:01 +0400 Subject: [PATCH 223/782] Backend block tip height endpoint --- backend/src/api/bitcoin/bitcoin.routes.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index c6323d041..298ae3715 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -94,6 +94,7 @@ class BitcoinRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'block/:hash', this.getBlock) .get(config.MEMPOOL.API_URL_PREFIX + 'block/:hash/summary', this.getStrippedBlockTransactions) .get(config.MEMPOOL.API_URL_PREFIX + 'block/:hash/audit-summary', this.getBlockAuditSummary) + .get(config.MEMPOOL.API_URL_PREFIX + 'blocks/tip/height', this.getBlockTipHeight) .post(config.MEMPOOL.API_URL_PREFIX + 'psbt/addparents', this.postPsbtCompletion) .get(config.MEMPOOL.API_URL_PREFIX + 'blocks-bulk/:from', this.getBlocksByBulk.bind(this)) .get(config.MEMPOOL.API_URL_PREFIX + 'blocks-bulk/:from/:to', this.getBlocksByBulk.bind(this)) @@ -110,7 +111,6 @@ class BitcoinRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/status', this.getTransactionStatus) .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/outspends', this.getTransactionOutspends) .get(config.MEMPOOL.API_URL_PREFIX + 'block/:hash/header', this.getBlockHeader) - .get(config.MEMPOOL.API_URL_PREFIX + 'blocks/tip/height', this.getBlockTipHeight) .get(config.MEMPOOL.API_URL_PREFIX + 'blocks/tip/hash', this.getBlockTipHash) .get(config.MEMPOOL.API_URL_PREFIX + 'block/:hash/raw', this.getRawBlock) .get(config.MEMPOOL.API_URL_PREFIX + 'block/:hash/txids', this.getTxIdsForBlock) @@ -589,10 +589,14 @@ class BitcoinRoutes { } } - private async getBlockTipHeight(req: Request, res: Response) { + private getBlockTipHeight(req: Request, res: Response) { try { - const result = await bitcoinApi.$getBlockHeightTip(); - res.json(result); + const result = blocks.getCurrentBlockHeight(); + if (!result) { + return res.status(503).send(`Service Temporarily Unavailable`); + } + res.setHeader('content-type', 'text/plain'); + res.send(result.toString()); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } From 000c46bf572baa84469e9da4d229a6296dbda46a Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 28 Apr 2023 12:06:49 +0400 Subject: [PATCH 224/782] Revert TCP socket fallback --- backend/src/api/bitcoin/esplora-api.ts | 82 ++++++++------------------ backend/src/index.ts | 13 ++-- 2 files changed, 32 insertions(+), 63 deletions(-) diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index ee7fa4765..ff6219587 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -3,102 +3,68 @@ import axios, { AxiosRequestConfig } from 'axios'; import http from 'http'; import { AbstractBitcoinApi } from './bitcoin-api-abstract-factory'; import { IEsploraApi } from './esplora-api.interface'; -import logger from '../../logger'; const axiosConnection = axios.create({ httpAgent: new http.Agent({ keepAlive: true, }) }); class ElectrsApi implements AbstractBitcoinApi { - private axiosConfigWithUnixSocket: AxiosRequestConfig = config.ESPLORA.UNIX_SOCKET_PATH ? { + axiosConfig: AxiosRequestConfig = config.ESPLORA.UNIX_SOCKET_PATH ? { socketPath: config.ESPLORA.UNIX_SOCKET_PATH, timeout: 10000, } : { timeout: 10000, }; - private axiosConfigTcpSocketOnly: AxiosRequestConfig = { - timeout: 10000, - }; - unixSocketRetryTimeout; - activeAxiosConfig; - - constructor() { - this.activeAxiosConfig = this.axiosConfigWithUnixSocket; - } - - fallbackToTcpSocket() { - if (!this.unixSocketRetryTimeout) { - logger.err(`Unable to connect to esplora unix socket. Falling back to tcp socket. Retrying unix socket in ${config.ESPLORA.RETRY_UNIX_SOCKET_AFTER / 1000} seconds`); - // Retry the unix socket after a few seconds - this.unixSocketRetryTimeout = setTimeout(() => { - logger.info(`Retrying to use unix socket for esplora now (applied for the next query)`); - this.activeAxiosConfig = this.axiosConfigWithUnixSocket; - this.unixSocketRetryTimeout = undefined; - }, config.ESPLORA.RETRY_UNIX_SOCKET_AFTER); - } - - // Use the TCP socket (reach a different esplora instance through nginx) - this.activeAxiosConfig = this.axiosConfigTcpSocketOnly; - } - - $queryWrapper(url, responseType = 'json'): Promise { - return axiosConnection.get(url, { ...this.activeAxiosConfig, responseType: responseType }) - .then((response) => response.data) - .catch((e) => { - if (e?.code === 'ECONNREFUSED') { - this.fallbackToTcpSocket(); - // Retry immediately - return axiosConnection.get(url, this.activeAxiosConfig) - .then((response) => response.data) - .catch((e) => { - logger.warn(`Cannot query esplora through the unix socket nor the tcp socket. Exception ${e}`); - throw e; - }); - } else { - throw e; - } - }); - } + constructor() { } $getRawMempool(): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/mempool/txids'); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/mempool/txids', this.axiosConfig) + .then((response) => response.data); } $getRawTransaction(txId: string): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId, this.axiosConfig) + .then((response) => response.data); } $getTransactionHex(txId: string): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/hex'); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/hex', this.axiosConfig) + .then((response) => response.data); } $getBlockHeightTip(): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/blocks/tip/height'); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/blocks/tip/height', this.axiosConfig) + .then((response) => response.data); } $getBlockHashTip(): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/blocks/tip/hash'); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/blocks/tip/hash', this.axiosConfig) + .then((response) => response.data); } $getTxIdsForBlock(hash: string): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + '/txids'); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + '/txids', this.axiosConfig) + .then((response) => response.data); } $getBlockHash(height: number): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block-height/' + height); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block-height/' + height, this.axiosConfig) + .then((response) => response.data); } $getBlockHeader(hash: string): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + '/header'); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + '/header', this.axiosConfig) + .then((response) => response.data); } $getBlock(hash: string): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash, this.axiosConfig) + .then((response) => response.data); } $getRawBlock(hash: string): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + "/raw", 'arraybuffer') + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + "/raw", { ...this.axiosConfig, responseType: 'arraybuffer' }) .then((response) => { return Buffer.from(response.data); }); } @@ -119,11 +85,13 @@ class ElectrsApi implements AbstractBitcoinApi { } $getOutspend(txId: string, vout: number): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspend/' + vout); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspend/' + vout, this.axiosConfig) + .then((response) => response.data); } $getOutspends(txId: string): Promise { - return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspends'); + return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspends', this.axiosConfig) + .then((response) => response.data); } async $getBatchedOutspends(txId: string[]): Promise { diff --git a/backend/src/index.ts b/backend/src/index.ts index abaec9cef..a7f805313 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -45,8 +45,7 @@ class Server { private wss: WebSocket.Server | undefined; private server: http.Server | undefined; private app: Application; - private currentBackendRetryInterval = 1; - private backendRetryCount = 0; + private currentBackendRetryInterval = 5; private maxHeapSize: number = 0; private heapLogInterval: number = 60; @@ -185,17 +184,17 @@ class Server { indexer.$run(); setTimeout(this.runMainUpdateLoop.bind(this), config.MEMPOOL.POLL_RATE_MS); - this.backendRetryCount = 0; + this.currentBackendRetryInterval = 5; } catch (e: any) { - this.backendRetryCount++; - let loggerMsg = `Exception in runMainUpdateLoop() (count: ${this.backendRetryCount}). Retrying in ${this.currentBackendRetryInterval} sec.`; + let loggerMsg = `Exception in runMainUpdateLoop(). Retrying in ${this.currentBackendRetryInterval} sec.`; loggerMsg += ` Reason: ${(e instanceof Error ? e.message : e)}.`; if (e?.stack) { loggerMsg += ` Stack trace: ${e.stack}`; } // When we get a first Exception, only `logger.debug` it and retry after 5 seconds // From the second Exception, `logger.warn` the Exception and increase the retry delay - if (this.backendRetryCount >= 5) { + // Maximum retry delay is 60 seconds + if (this.currentBackendRetryInterval > 5) { logger.warn(loggerMsg); mempool.setOutOfSync(); } else { @@ -205,6 +204,8 @@ class Server { logger.debug(`AxiosError: ${e?.message}`); } setTimeout(this.runMainUpdateLoop.bind(this), 1000 * this.currentBackendRetryInterval); + this.currentBackendRetryInterval *= 2; + this.currentBackendRetryInterval = Math.min(this.currentBackendRetryInterval, 60); } } From 95df317f564f8709221b4cd2147c2b570dc18a17 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 27 Apr 2023 10:19:12 +0900 Subject: [PATCH 225/782] detect and log stall in main loop --- backend/src/api/blocks.ts | 54 ++++++++++++++++++++++++++++++++++++++ backend/src/api/mempool.ts | 34 ++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 15a218e24..e824efbf6 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -36,6 +36,8 @@ class Blocks { private newBlockCallbacks: ((block: BlockExtended, txIds: string[], transactions: TransactionExtended[]) => void)[] = []; private newAsyncBlockCallbacks: ((block: BlockExtended, txIds: string[], transactions: TransactionExtended[]) => Promise)[] = []; + private mainLoopTimeout: number = 120000; + constructor() { } public getBlocks(): BlockExtended[] { @@ -528,8 +530,12 @@ class Blocks { } public async $updateBlocks() { + // warn if this run stalls the main loop for more than 2 minutes + const timer = this.startTimer(); + let fastForwarded = false; const blockHeightTip = await bitcoinApi.$getBlockHeightTip(); + this.updateTimerProgress(timer, 'got block height tip'); if (this.blocks.length === 0) { this.currentBlockHeight = Math.max(blockHeightTip - config.MEMPOOL.INITIAL_BLOCKS_AMOUNT, -1); @@ -547,16 +553,21 @@ class Blocks { if (!this.lastDifficultyAdjustmentTime) { const blockchainInfo = await bitcoinClient.getBlockchainInfo(); + this.updateTimerProgress(timer, 'got blockchain info for initial difficulty adjustment'); if (blockchainInfo.blocks === blockchainInfo.headers) { const heightDiff = blockHeightTip % 2016; const blockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff); + this.updateTimerProgress(timer, 'got block hash for initial difficulty adjustment'); const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(blockHash); + this.updateTimerProgress(timer, 'got block for initial difficulty adjustment'); this.lastDifficultyAdjustmentTime = block.timestamp; this.currentDifficulty = block.difficulty; if (blockHeightTip >= 2016) { const previousPeriodBlockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff - 2016); + this.updateTimerProgress(timer, 'got previous block hash for initial difficulty adjustment'); const previousPeriodBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(previousPeriodBlockHash); + this.updateTimerProgress(timer, 'got previous block for initial difficulty adjustment'); this.previousDifficultyRetarget = (block.difficulty - previousPeriodBlock.difficulty) / previousPeriodBlock.difficulty * 100; logger.debug(`Initial difficulty adjustment data set.`); } @@ -571,9 +582,11 @@ class Blocks { } else { this.currentBlockHeight++; logger.debug(`New block found (#${this.currentBlockHeight})!`); + this.updateTimerProgress(timer, `getting orphaned blocks for ${this.currentBlockHeight}`); await chainTips.updateOrphanedBlocks(); } + this.updateTimerProgress(timer, `getting block data for ${this.currentBlockHeight}`); const blockHash = await bitcoinApi.$getBlockHash(this.currentBlockHeight); const verboseBlock = await bitcoinClient.getBlock(blockHash, 2); const block = BitcoinApi.convertBlock(verboseBlock); @@ -582,39 +595,51 @@ class Blocks { const cpfpSummary: CpfpSummary = Common.calculateCpfp(block.height, transactions); const blockExtended: BlockExtended = await this.$getBlockExtended(block, cpfpSummary.transactions); const blockSummary: BlockSummary = this.summarizeBlock(verboseBlock); + this.updateTimerProgress(timer, `got block data for ${this.currentBlockHeight}`); // start async callbacks + this.updateTimerProgress(timer, `starting async callbacks for ${this.currentBlockHeight}`); const callbackPromises = this.newAsyncBlockCallbacks.map((cb) => cb(blockExtended, txIds, transactions)); if (Common.indexingEnabled()) { if (!fastForwarded) { const lastBlock = await blocksRepository.$getBlockByHeight(blockExtended.height - 1); + this.updateTimerProgress(timer, `got block by height for ${this.currentBlockHeight}`); if (lastBlock !== null && blockExtended.previousblockhash !== lastBlock.id) { logger.warn(`Chain divergence detected at block ${lastBlock.height}, re-indexing most recent data`, logger.tags.mining); // We assume there won't be a reorg with more than 10 block depth + this.updateTimerProgress(timer, `rolling back diverged chain from ${this.currentBlockHeight}`); await BlocksRepository.$deleteBlocksFrom(lastBlock.height - 10); await HashratesRepository.$deleteLastEntries(); await cpfpRepository.$deleteClustersFrom(lastBlock.height - 10); + this.updateTimerProgress(timer, `rolled back chain divergence from ${this.currentBlockHeight}`); for (let i = 10; i >= 0; --i) { const newBlock = await this.$indexBlock(lastBlock.height - i); + this.updateTimerProgress(timer, `reindexed block`); await this.$getStrippedBlockTransactions(newBlock.id, true, true); + this.updateTimerProgress(timer, `reindexed block summary`); if (config.MEMPOOL.CPFP_INDEXING) { await this.$indexCPFP(newBlock.id, lastBlock.height - i); + this.updateTimerProgress(timer, `reindexed block cpfp`); } } await mining.$indexDifficultyAdjustments(); await DifficultyAdjustmentsRepository.$deleteLastAdjustment(); + this.updateTimerProgress(timer, `reindexed difficulty adjustments`); logger.info(`Re-indexed 10 blocks and summaries. Also re-indexed the last difficulty adjustments. Will re-index latest hashrates in a few seconds.`, logger.tags.mining); indexer.reindex(); } await blocksRepository.$saveBlockInDatabase(blockExtended); + this.updateTimerProgress(timer, `saved ${this.currentBlockHeight} to database`); const lastestPriceId = await PricesRepository.$getLatestPriceId(); + this.updateTimerProgress(timer, `got latest price id ${this.currentBlockHeight}`); if (priceUpdater.historyInserted === true && lastestPriceId !== null) { await blocksRepository.$saveBlockPrices([{ height: blockExtended.height, priceId: lastestPriceId, }]); + this.updateTimerProgress(timer, `saved prices for ${this.currentBlockHeight}`); } else { logger.debug(`Cannot save block price for ${blockExtended.height} because the price updater hasnt completed yet. Trying again in 10 seconds.`, logger.tags.mining); setTimeout(() => { @@ -625,9 +650,11 @@ class Blocks { // Save blocks summary for visualization if it's enabled if (Common.blocksSummariesIndexingEnabled() === true) { await this.$getStrippedBlockTransactions(blockExtended.id, true); + this.updateTimerProgress(timer, `saved block summary for ${this.currentBlockHeight}`); } if (config.MEMPOOL.CPFP_INDEXING) { this.$saveCpfp(blockExtended.id, this.currentBlockHeight, cpfpSummary); + this.updateTimerProgress(timer, `saved cpfp for ${this.currentBlockHeight}`); } } } @@ -640,6 +667,7 @@ class Blocks { difficulty: block.difficulty, adjustment: Math.round((block.difficulty / this.currentDifficulty) * 1000000) / 1000000, // Remove float point noise }); + this.updateTimerProgress(timer, `saved difficulty adjustment for ${this.currentBlockHeight}`); } this.previousDifficultyRetarget = (block.difficulty - this.currentDifficulty) / this.currentDifficulty * 100; @@ -664,7 +692,33 @@ class Blocks { } // wait for pending async callbacks to finish + this.updateTimerProgress(timer, `waiting for async callbacks to complete for ${this.currentBlockHeight}`); await Promise.all(callbackPromises); + this.updateTimerProgress(timer, `async callbacks completed for ${this.currentBlockHeight}`); + } + + this.clearTimer(timer); + } + + private startTimer() { + const state: any = { + start: Date.now(), + progress: 'begin $updateBlocks', + timer: null, + }; + state.timer = setTimeout(() => { + logger.err(`$updateBlocks stalled at "${state.progress}`); + }, this.mainLoopTimeout); + return state; + } + + private updateTimerProgress(state, msg) { + state.progress = msg; + } + + private clearTimer(state) { + if (state.timer) { + clearTimeout(state.timer); } } diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 1be1faceb..2268208f2 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -36,6 +36,8 @@ class Mempool { private timer = new Date().getTime(); private missingTxCount = 0; + private mainLoopTimeout: number = 120000; + constructor() { setInterval(this.updateTxPerSecond.bind(this), 1000); } @@ -119,10 +121,15 @@ class Mempool { public async $updateMempool(): Promise { logger.debug(`Updating mempool...`); + + // warn if this run stalls the main loop for more than 2 minutes + const timer = this.startTimer(); + const start = new Date().getTime(); let hasChange: boolean = false; const currentMempoolSize = Object.keys(this.mempoolCache).length; const transactions = await bitcoinApi.$getRawMempool(); + this.updateTimerProgress(timer, 'got raw mempool'); const diff = transactions.length - currentMempoolSize; const newTransactions: TransactionExtended[] = []; @@ -146,6 +153,7 @@ class Mempool { if (!this.mempoolCache[txid]) { try { const transaction = await transactionUtils.$getTransactionExtended(txid); + this.updateTimerProgress(timer, 'fetched new transaction'); this.mempoolCache[txid] = transaction; if (this.inSync) { this.txPerSecondArray.push(new Date().getTime()); @@ -223,12 +231,38 @@ class Mempool { this.mempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions); } if (this.asyncMempoolChangedCallback && (hasChange || deletedTransactions.length)) { + this.updateTimerProgress(timer, 'running async mempool callback'); await this.asyncMempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions); + this.updateTimerProgress(timer, 'completed async mempool callback'); } const end = new Date().getTime(); const time = end - start; logger.debug(`Mempool updated in ${time / 1000} seconds. New size: ${Object.keys(this.mempoolCache).length} (${diff > 0 ? '+' + diff : diff})`); + + this.clearTimer(timer); + } + + private startTimer() { + const state: any = { + start: Date.now(), + progress: 'begin $updateMempool', + timer: null, + }; + state.timer = setTimeout(() => { + logger.err(`$updateMempool stalled at "${state.progress}`); + }, this.mainLoopTimeout); + return state; + } + + private updateTimerProgress(state, msg) { + state.progress = msg; + } + + private clearTimer(state) { + if (state.timer) { + clearTimeout(state.timer); + } } public handleRbfTransactions(rbfTransactions: { [txid: string]: TransactionExtended; }) { From e05f2198d584b5a76bcb2a4be2939562b5bf4b43 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 28 Apr 2023 19:05:49 -0600 Subject: [PATCH 226/782] Add explicit timeout to mysql DB queries --- backend/mempool-config.sample.json | 3 +- .../__fixtures__/mempool-config.template.json | 3 +- backend/src/__tests__/config.test.ts | 3 +- backend/src/config.ts | 4 ++- backend/src/database.ts | 28 +++++++++++++++++-- docker/README.md | 1 + docker/backend/mempool-config.json | 3 +- docker/backend/start.sh | 1 + 8 files changed, 39 insertions(+), 7 deletions(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index 1c7097de4..32becd00d 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -61,7 +61,8 @@ "SOCKET": "/var/run/mysql/mysql.sock", "DATABASE": "mempool", "USERNAME": "mempool", - "PASSWORD": "mempool" + "PASSWORD": "mempool", + "TIMEOUT": 180000 }, "SYSLOG": { "ENABLED": true, diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 6c2269a4f..eb082d89f 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -62,7 +62,8 @@ "PORT": 18, "DATABASE": "__DATABASE_DATABASE__", "USERNAME": "__DATABASE_USERNAME__", - "PASSWORD": "__DATABASE_PASSWORD__" + "PASSWORD": "__DATABASE_PASSWORD__", + "TIMEOUT": "__DATABASE_TIMEOUT__" }, "SYSLOG": { "ENABLED": false, diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index e12f90a86..aa287308b 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -72,7 +72,8 @@ describe('Mempool Backend Config', () => { PORT: 3306, DATABASE: 'mempool', USERNAME: 'mempool', - PASSWORD: 'mempool' + PASSWORD: 'mempool', + TIMEOUT: 180000, }); expect(config.SYSLOG).toStrictEqual({ diff --git a/backend/src/config.ts b/backend/src/config.ts index 7c0e4e950..ff5ea4f9f 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -86,6 +86,7 @@ interface IConfig { DATABASE: string; USERNAME: string; PASSWORD: string; + TIMEOUT: number; }; SYSLOG: { ENABLED: boolean; @@ -194,7 +195,8 @@ const defaults: IConfig = { 'PORT': 3306, 'DATABASE': 'mempool', 'USERNAME': 'mempool', - 'PASSWORD': 'mempool' + 'PASSWORD': 'mempool', + 'TIMEOUT': 180000, }, 'SYSLOG': { 'ENABLED': true, diff --git a/backend/src/database.ts b/backend/src/database.ts index a504eb0fa..070774c92 100644 --- a/backend/src/database.ts +++ b/backend/src/database.ts @@ -33,8 +33,32 @@ import { FieldPacket, OkPacket, PoolOptions, ResultSetHeader, RowDataPacket } fr OkPacket[] | ResultSetHeader>(query, params?): Promise<[T, FieldPacket[]]> { this.checkDBFlag(); - const pool = await this.getPool(); - return pool.query(query, params); + let hardTimeout; + if (query?.timeout != null) { + hardTimeout = Math.floor(query.timeout * 1.1); + } else { + hardTimeout = config.DATABASE.TIMEOUT; + } + if (hardTimeout > 0) { + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + reject(new Error(`DB query failed to return, reject or time out within ${hardTimeout / 1000}s - ${query?.sql?.slice(0, 160) || (typeof(query) === 'string' || query instanceof String ? query?.slice(0, 160) : 'unknown query')}`)); + }, hardTimeout); + + this.getPool().then(pool => { + return pool.query(query, params) as Promise<[T, FieldPacket[]]>; + }).then(result => { + resolve(result); + }).catch(error => { + reject(error); + }).finally(() => { + clearTimeout(timer); + }); + }); + } else { + const pool = await this.getPool(); + return pool.query(query, params); + } } public async checkDbConnection() { diff --git a/docker/README.md b/docker/README.md index ee5ba11c5..b669b37c8 100644 --- a/docker/README.md +++ b/docker/README.md @@ -269,6 +269,7 @@ Corresponding `docker-compose.yml` overrides: DATABASE_DATABASE: "" DATABASE_USERNAME: "" DATABASE_PASSWORD: "" + DATABASE_TIMEOUT: "" ... ``` diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index f4543bd2e..fd8abaf02 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -60,7 +60,8 @@ "PORT": __DATABASE_PORT__, "DATABASE": "__DATABASE_DATABASE__", "USERNAME": "__DATABASE_USERNAME__", - "PASSWORD": "__DATABASE_PASSWORD__" + "PASSWORD": "__DATABASE_PASSWORD__", + "TIMEOUT": "__DATABASE_TIMEOUT__" }, "SYSLOG": { "ENABLED": __SYSLOG_ENABLED__, diff --git a/docker/backend/start.sh b/docker/backend/start.sh index c6ce8f1e7..a54f16ec6 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -64,6 +64,7 @@ __DATABASE_PORT__=${DATABASE_PORT:=3306} __DATABASE_DATABASE__=${DATABASE_DATABASE:=mempool} __DATABASE_USERNAME__=${DATABASE_USERNAME:=mempool} __DATABASE_PASSWORD__=${DATABASE_PASSWORD:=mempool} +__DATABASE_TIMEOUT__=${DATABASE_TIMEOUT:=180000} # SYSLOG __SYSLOG_ENABLED__=${SYSLOG_ENABLED:=false} From 58b08f2c333e753e6d13d4e7f8b3868e03c0b93b Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 1 May 2023 00:16:23 +0400 Subject: [PATCH 227/782] Add end quotes --- backend/src/api/blocks.ts | 2 +- backend/src/api/mempool.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index e824efbf6..2837d40a0 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -707,7 +707,7 @@ class Blocks { timer: null, }; state.timer = setTimeout(() => { - logger.err(`$updateBlocks stalled at "${state.progress}`); + logger.err(`$updateBlocks stalled at "${state.progress}"`); }, this.mainLoopTimeout); return state; } diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 2268208f2..79a2001de 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -250,7 +250,7 @@ class Mempool { timer: null, }; state.timer = setTimeout(() => { - logger.err(`$updateMempool stalled at "${state.progress}`); + logger.err(`$updateMempool stalled at "${state.progress}"`); }, this.mainLoopTimeout); return state; } From f30cf70226097f176c1b074e0a1d8d897269eac9 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 30 Apr 2023 13:59:29 -0600 Subject: [PATCH 228/782] await for mempool change handler after loading disk cache --- backend/src/api/disk-cache.ts | 4 ++-- backend/src/api/mempool-blocks.ts | 2 +- backend/src/api/mempool.ts | 4 ++-- backend/src/index.ts | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index c50d3cef8..8d5745a3b 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -124,7 +124,7 @@ class DiskCache { } } - loadMempoolCache(): void { + async loadMempoolCache(): Promise { if (!fs.existsSync(DiskCache.FILE_NAME)) { return; } @@ -168,7 +168,7 @@ class DiskCache { } } - memPool.setMempool(data.mempool); + await memPool.setMempool(data.mempool); blocks.setBlocks(data.blocks); blocks.setBlockSummaries(data.blockSummaries || []); } catch (e) { diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index aa2804379..cd6243bc1 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -205,7 +205,7 @@ class MempoolBlocks { public async updateBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, added: TransactionExtended[], removed: string[], saveResults: boolean = false): Promise { if (!this.txSelectionWorker) { // need to reset the worker - this.makeBlockTemplates(newMempool, saveResults); + await this.makeBlockTemplates(newMempool, saveResults); return; } // prepare a stripped down version of the mempool with only the minimum necessary data diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 79a2001de..4f5a12962 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -80,13 +80,13 @@ class Mempool { return this.mempoolCache; } - public setMempool(mempoolData: { [txId: string]: TransactionExtended }) { + public async setMempool(mempoolData: { [txId: string]: TransactionExtended }) { this.mempoolCache = mempoolData; if (this.mempoolChangedCallback) { this.mempoolChangedCallback(this.mempoolCache, [], []); } if (this.asyncMempoolChangedCallback) { - this.asyncMempoolChangedCallback(this.mempoolCache, [], []); + await this.asyncMempoolChangedCallback(this.mempoolCache, [], []); } } diff --git a/backend/src/index.ts b/backend/src/index.ts index a7f805313..440a24de9 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -120,7 +120,7 @@ class Server { await poolsUpdater.updatePoolsJson(); // Needs to be done before loading the disk cache because we sometimes wipe it await syncAssets.syncAssets$(); if (config.MEMPOOL.ENABLED) { - diskCache.loadMempoolCache(); + await diskCache.loadMempoolCache(); } if (config.STATISTICS.ENABLED && config.DATABASE.ENABLED && cluster.isPrimary) { From 4597bfa5d79b30c919856ee28968a6accdfde6f7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 30 Apr 2023 15:28:34 -0600 Subject: [PATCH 229/782] use $ naming convention for async function names --- backend/src/api/disk-cache.ts | 4 ++-- backend/src/api/mempool-blocks.ts | 6 +++--- backend/src/api/mempool.ts | 14 +++++++------- backend/src/api/websocket-handler.ts | 8 ++++---- backend/src/index.ts | 4 ++-- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 8d5745a3b..f053180b0 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -124,7 +124,7 @@ class DiskCache { } } - async loadMempoolCache(): Promise { + async $loadMempoolCache(): Promise { if (!fs.existsSync(DiskCache.FILE_NAME)) { return; } @@ -168,7 +168,7 @@ class DiskCache { } } - await memPool.setMempool(data.mempool); + await memPool.$setMempool(data.mempool); blocks.setBlocks(data.blocks); blocks.setBlockSummaries(data.blockSummaries || []); } catch (e) { diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index cd6243bc1..681271450 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -144,7 +144,7 @@ class MempoolBlocks { return mempoolBlockDeltas; } - public async makeBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, saveResults: boolean = false): Promise { + public async $makeBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, saveResults: boolean = false): Promise { // prepare a stripped down version of the mempool with only the minimum necessary data // to reduce the overhead of passing this data to the worker thread const strippedMempool: { [txid: string]: ThreadTransaction } = {}; @@ -202,10 +202,10 @@ class MempoolBlocks { return this.mempoolBlocks; } - public async updateBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, added: TransactionExtended[], removed: string[], saveResults: boolean = false): Promise { + public async $updateBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, added: TransactionExtended[], removed: string[], saveResults: boolean = false): Promise { if (!this.txSelectionWorker) { // need to reset the worker - await this.makeBlockTemplates(newMempool, saveResults); + await this.$makeBlockTemplates(newMempool, saveResults); return; } // prepare a stripped down version of the mempool with only the minimum necessary data diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 4f5a12962..0d593f1a3 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -20,7 +20,7 @@ class Mempool { maxmempool: 300000000, mempoolminfee: 0.00001000, minrelaytxfee: 0.00001000 }; private mempoolChangedCallback: ((newMempool: {[txId: string]: TransactionExtended; }, newTransactions: TransactionExtended[], deletedTransactions: TransactionExtended[]) => void) | undefined; - private asyncMempoolChangedCallback: ((newMempool: {[txId: string]: TransactionExtended; }, newTransactions: TransactionExtended[], + private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: TransactionExtended; }, newTransactions: TransactionExtended[], deletedTransactions: TransactionExtended[]) => Promise) | undefined; private txPerSecondArray: number[] = []; @@ -73,20 +73,20 @@ class Mempool { public setAsyncMempoolChangedCallback(fn: (newMempool: { [txId: string]: TransactionExtended; }, newTransactions: TransactionExtended[], deletedTransactions: TransactionExtended[]) => Promise) { - this.asyncMempoolChangedCallback = fn; + this.$asyncMempoolChangedCallback = fn; } public getMempool(): { [txid: string]: TransactionExtended } { return this.mempoolCache; } - public async setMempool(mempoolData: { [txId: string]: TransactionExtended }) { + public async $setMempool(mempoolData: { [txId: string]: TransactionExtended }) { this.mempoolCache = mempoolData; if (this.mempoolChangedCallback) { this.mempoolChangedCallback(this.mempoolCache, [], []); } - if (this.asyncMempoolChangedCallback) { - await this.asyncMempoolChangedCallback(this.mempoolCache, [], []); + if (this.$asyncMempoolChangedCallback) { + await this.$asyncMempoolChangedCallback(this.mempoolCache, [], []); } } @@ -230,9 +230,9 @@ class Mempool { if (this.mempoolChangedCallback && (hasChange || deletedTransactions.length)) { this.mempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions); } - if (this.asyncMempoolChangedCallback && (hasChange || deletedTransactions.length)) { + if (this.$asyncMempoolChangedCallback && (hasChange || deletedTransactions.length)) { this.updateTimerProgress(timer, 'running async mempool callback'); - await this.asyncMempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions); + await this.$asyncMempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions); this.updateTimerProgress(timer, 'completed async mempool callback'); } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 7dbd48c46..f2e721381 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -247,14 +247,14 @@ class WebsocketHandler { }); } - async handleMempoolChange(newMempool: { [txid: string]: TransactionExtended }, + async $handleMempoolChange(newMempool: { [txid: string]: TransactionExtended }, newTransactions: TransactionExtended[], deletedTransactions: TransactionExtended[]): Promise { if (!this.wss) { throw new Error('WebSocket.Server is not set'); } if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { - await mempoolBlocks.updateBlockTemplates(newMempool, newTransactions, deletedTransactions.map(tx => tx.txid), true); + await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions.map(tx => tx.txid), true); } else { mempoolBlocks.updateMempoolBlocks(newMempool, true); } @@ -429,7 +429,7 @@ class WebsocketHandler { // a cloned copy of the mempool if we're running a different algorithm for mempool updates const auditMempool = (config.MEMPOOL.ADVANCED_GBT_AUDIT === config.MEMPOOL.ADVANCED_GBT_MEMPOOL) ? _memPool : deepClone(_memPool); if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { - projectedBlocks = await mempoolBlocks.makeBlockTemplates(auditMempool, false); + projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false); } else { projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false); } @@ -486,7 +486,7 @@ class WebsocketHandler { } if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { - await mempoolBlocks.updateBlockTemplates(_memPool, [], removed, true); + await mempoolBlocks.$updateBlockTemplates(_memPool, [], removed, true); } else { mempoolBlocks.updateMempoolBlocks(_memPool, true); } diff --git a/backend/src/index.ts b/backend/src/index.ts index 440a24de9..feddd30c3 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -120,7 +120,7 @@ class Server { await poolsUpdater.updatePoolsJson(); // Needs to be done before loading the disk cache because we sometimes wipe it await syncAssets.syncAssets$(); if (config.MEMPOOL.ENABLED) { - await diskCache.loadMempoolCache(); + await diskCache.$loadMempoolCache(); } if (config.STATISTICS.ENABLED && config.DATABASE.ENABLED && cluster.isPrimary) { @@ -238,7 +238,7 @@ class Server { websocketHandler.setupConnectionHandling(); if (config.MEMPOOL.ENABLED) { statistics.setNewStatisticsEntryCallback(websocketHandler.handleNewStatistic.bind(websocketHandler)); - memPool.setAsyncMempoolChangedCallback(websocketHandler.handleMempoolChange.bind(websocketHandler)); + memPool.setAsyncMempoolChangedCallback(websocketHandler.$handleMempoolChange.bind(websocketHandler)); blocks.setNewAsyncBlockCallback(websocketHandler.handleNewBlock.bind(websocketHandler)); } priceUpdater.setRatesChangedCallback(websocketHandler.handleNewConversionRates.bind(websocketHandler)); From 3748102bb03711eccf8b2ec1ddb9c608c555c265 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 1 May 2023 13:08:29 -0600 Subject: [PATCH 230/782] Log websocket statistics --- backend/src/api/websocket-handler.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index f2e721381..25275f71c 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -26,6 +26,10 @@ class WebsocketHandler { private wss: WebSocket.Server | undefined; private extraInitProperties = {}; + private numClients = 0; + private numConnected = 0; + private numDisconnected = 0; + constructor() { } setWebsocketServer(wss: WebSocket.Server) { @@ -42,7 +46,11 @@ class WebsocketHandler { } this.wss.on('connection', (client: WebSocket) => { + this.numConnected++; client.on('error', logger.info); + client.on('close', () => { + this.numDisconnected++; + }); client.on('message', async (message: string) => { try { const parsedMessage: WebsocketResponse = JSON.parse(message); @@ -232,6 +240,8 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } + this.printLogs(); + this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { return; @@ -253,6 +263,8 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } + this.printLogs(); + if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions.map(tx => tx.txid), true); } else { @@ -421,6 +433,8 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } + this.printLogs(); + const _memPool = memPool.getMempool(); if (config.MEMPOOL.AUDIT) { @@ -597,6 +611,17 @@ class WebsocketHandler { client.send(JSON.stringify(response)); }); } + + private printLogs(): void { + if (this.wss) { + const count = this.wss?.clients?.size || 0; + const diff = count - this.numClients; + this.numClients = count; + logger.debug(`${count} websocket clients | ${this.numConnected} connected | ${this.numDisconnected} disconnected | (${diff >= 0 ? '+' : ''}${diff})`); + this.numConnected = 0; + this.numDisconnected = 0; + } + } } export default new WebsocketHandler(); From 3691ba824262b85790530902d0c8958989387f8e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 1 May 2023 18:01:07 -0600 Subject: [PATCH 231/782] Increase client websocket timeout --- frontend/src/app/services/websocket.service.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index d58ab58c9..4e87d4999 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -9,8 +9,8 @@ import { take } from 'rxjs/operators'; import { TransferState, makeStateKey } from '@angular/platform-browser'; import { BlockExtended } from '../interfaces/node-api.interface'; -const OFFLINE_RETRY_AFTER_MS = 1000; -const OFFLINE_PING_CHECK_AFTER_MS = 10000; +const OFFLINE_RETRY_AFTER_MS = 2000; +const OFFLINE_PING_CHECK_AFTER_MS = 30000; const EXPECT_PING_RESPONSE_AFTER_MS = 5000; const initData = makeStateKey('/api/v1/init-data'); @@ -118,7 +118,7 @@ export class WebsocketService { }, (err: Error) => { console.log(err); - console.log(`WebSocket error, trying to reconnect in ${OFFLINE_RETRY_AFTER_MS} seconds`); + console.log(`WebSocket error`); this.goOffline(); }); } @@ -197,11 +197,13 @@ export class WebsocketService { } goOffline() { + const retryDelay = OFFLINE_RETRY_AFTER_MS + (Math.random() * OFFLINE_RETRY_AFTER_MS); + console.log(`trying to reconnect websocket in ${retryDelay} seconds`); this.goneOffline = true; this.stateService.connectionState$.next(0); window.setTimeout(() => { this.startSubscription(true); - }, OFFLINE_RETRY_AFTER_MS); + }, retryDelay); } startOnlineCheck() { @@ -212,7 +214,7 @@ export class WebsocketService { this.websocketSubject.next({action: 'ping'}); this.onlineCheckTimeoutTwo = window.setTimeout(() => { if (!this.goneOffline) { - console.log('WebSocket response timeout, force closing, trying to reconnect in 10 seconds'); + console.log('WebSocket response timeout, force closing'); this.websocketSubject.complete(); this.subscription.unsubscribe(); this.goOffline(); From c659adb4bed635e433bd483fa7c73be4384b727c Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 2 May 2023 15:40:16 +0400 Subject: [PATCH 232/782] Removing dead code causing slowdown --- backend/src/api/audit.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index 6e1cb3787..7435e3b99 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -93,17 +93,7 @@ class Audit { } else { if (!isDisplaced[tx.txid]) { added.push(tx.txid); - } else { } - let blockIndex = -1; - let index = -1; - projectedBlocks.forEach((block, bi) => { - const i = block.transactionIds.indexOf(tx.txid); - if (i >= 0) { - blockIndex = bi; - index = i; - } - }); overflowWeight += tx.weight; } totalWeight += tx.weight; From 565aa9616bef2fa31e0c952d93d2c264e077621b Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 2 May 2023 17:39:02 +0400 Subject: [PATCH 233/782] Change forensic logging to debug --- backend/src/tasks/lightning/forensics.service.ts | 4 ++-- backend/src/tasks/lightning/network-sync.service.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/tasks/lightning/forensics.service.ts b/backend/src/tasks/lightning/forensics.service.ts index 7837cb4d5..65ea61dc1 100644 --- a/backend/src/tasks/lightning/forensics.service.ts +++ b/backend/src/tasks/lightning/forensics.service.ts @@ -152,7 +152,7 @@ class ForensicsService { ++progress; const elapsedSeconds = Math.round((new Date().getTime() / 1000) - this.loggerTimer); if (elapsedSeconds > 10) { - logger.info(`Updating channel closed channel forensics ${progress}/${channels.length}`); + logger.debug(`Updating channel closed channel forensics ${progress}/${channels.length}`); this.loggerTimer = new Date().getTime() / 1000; } } @@ -257,7 +257,7 @@ class ForensicsService { ++progress; const elapsedSeconds = Math.round((new Date().getTime() / 1000) - this.loggerTimer); if (elapsedSeconds > 10) { - logger.info(`Updating opened channel forensics ${progress}/${channels?.length}`); + logger.debug(`Updating opened channel forensics ${progress}/${channels?.length}`); this.loggerTimer = new Date().getTime() / 1000; this.truncateTempCache(); } diff --git a/backend/src/tasks/lightning/network-sync.service.ts b/backend/src/tasks/lightning/network-sync.service.ts index 28f60bbf9..aca3dbef8 100644 --- a/backend/src/tasks/lightning/network-sync.service.ts +++ b/backend/src/tasks/lightning/network-sync.service.ts @@ -300,7 +300,7 @@ class NetworkSyncService { ++progress; const elapsedSeconds = Math.round((new Date().getTime() / 1000) - this.loggerTimer); if (elapsedSeconds > config.LIGHTNING.LOGGER_UPDATE_INTERVAL) { - logger.info(`Checking if channel has been closed ${progress}/${channels.length}`, logger.tags.ln); + logger.debug(`Checking if channel has been closed ${progress}/${channels.length}`, logger.tags.ln); this.loggerTimer = new Date().getTime() / 1000; } } From 03ee5c7c31d111b0987aaecacafd4426edaf2ef5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 2 May 2023 16:57:10 -0600 Subject: [PATCH 234/782] skip unnecessary makeBlockTemplates --- backend/src/api/websocket-handler.ts | 18 +++++++++++------- backend/src/index.ts | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 25275f71c..865dfe9d6 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -439,13 +439,19 @@ class WebsocketHandler { if (config.MEMPOOL.AUDIT) { let projectedBlocks; + let auditMempool = _memPool; // template calculation functions have mempool side effects, so calculate audits using // a cloned copy of the mempool if we're running a different algorithm for mempool updates - const auditMempool = (config.MEMPOOL.ADVANCED_GBT_AUDIT === config.MEMPOOL.ADVANCED_GBT_MEMPOOL) ? _memPool : deepClone(_memPool); - if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { - projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false); + const separateAudit = config.MEMPOOL.ADVANCED_GBT_AUDIT !== config.MEMPOOL.ADVANCED_GBT_MEMPOOL; + if (separateAudit) { + auditMempool = deepClone(_memPool); + if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { + projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false); + } else { + projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false); + } } else { - projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false); + projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); } if (Common.indexingEnabled() && memPool.isInSync()) { @@ -491,16 +497,14 @@ class WebsocketHandler { } } - const removed: string[] = []; // Update mempool to remove transactions included in the new block for (const txId of txIds) { delete _memPool[txId]; - removed.push(txId); rbfCache.evict(txId); } if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { - await mempoolBlocks.$updateBlockTemplates(_memPool, [], removed, true); + await mempoolBlocks.$makeBlockTemplates(_memPool, true); } else { mempoolBlocks.updateMempoolBlocks(_memPool, true); } diff --git a/backend/src/index.ts b/backend/src/index.ts index feddd30c3..1ec60c397 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -178,8 +178,8 @@ class Server { logger.debug(msg); } } - memPool.deleteExpiredTransactions(); await blocks.$updateBlocks(); + memPool.deleteExpiredTransactions(); await memPool.$updateMempool(); indexer.$run(); From dd68572603fc245e06c850fac8766ed0e0c2423b Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 3 May 2023 10:11:44 +0400 Subject: [PATCH 235/782] Revert "Revert TCP socket fallback" --- backend/src/api/bitcoin/esplora-api.ts | 82 ++++++++++++++++++-------- backend/src/index.ts | 13 ++-- 2 files changed, 63 insertions(+), 32 deletions(-) diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index ff6219587..ee7fa4765 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -3,68 +3,102 @@ import axios, { AxiosRequestConfig } from 'axios'; import http from 'http'; import { AbstractBitcoinApi } from './bitcoin-api-abstract-factory'; import { IEsploraApi } from './esplora-api.interface'; +import logger from '../../logger'; const axiosConnection = axios.create({ httpAgent: new http.Agent({ keepAlive: true, }) }); class ElectrsApi implements AbstractBitcoinApi { - axiosConfig: AxiosRequestConfig = config.ESPLORA.UNIX_SOCKET_PATH ? { + private axiosConfigWithUnixSocket: AxiosRequestConfig = config.ESPLORA.UNIX_SOCKET_PATH ? { socketPath: config.ESPLORA.UNIX_SOCKET_PATH, timeout: 10000, } : { timeout: 10000, }; + private axiosConfigTcpSocketOnly: AxiosRequestConfig = { + timeout: 10000, + }; - constructor() { } + unixSocketRetryTimeout; + activeAxiosConfig; + + constructor() { + this.activeAxiosConfig = this.axiosConfigWithUnixSocket; + } + + fallbackToTcpSocket() { + if (!this.unixSocketRetryTimeout) { + logger.err(`Unable to connect to esplora unix socket. Falling back to tcp socket. Retrying unix socket in ${config.ESPLORA.RETRY_UNIX_SOCKET_AFTER / 1000} seconds`); + // Retry the unix socket after a few seconds + this.unixSocketRetryTimeout = setTimeout(() => { + logger.info(`Retrying to use unix socket for esplora now (applied for the next query)`); + this.activeAxiosConfig = this.axiosConfigWithUnixSocket; + this.unixSocketRetryTimeout = undefined; + }, config.ESPLORA.RETRY_UNIX_SOCKET_AFTER); + } + + // Use the TCP socket (reach a different esplora instance through nginx) + this.activeAxiosConfig = this.axiosConfigTcpSocketOnly; + } + + $queryWrapper(url, responseType = 'json'): Promise { + return axiosConnection.get(url, { ...this.activeAxiosConfig, responseType: responseType }) + .then((response) => response.data) + .catch((e) => { + if (e?.code === 'ECONNREFUSED') { + this.fallbackToTcpSocket(); + // Retry immediately + return axiosConnection.get(url, this.activeAxiosConfig) + .then((response) => response.data) + .catch((e) => { + logger.warn(`Cannot query esplora through the unix socket nor the tcp socket. Exception ${e}`); + throw e; + }); + } else { + throw e; + } + }); + } $getRawMempool(): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/mempool/txids', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/mempool/txids'); } $getRawTransaction(txId: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId, this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId); } $getTransactionHex(txId: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/hex', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/hex'); } $getBlockHeightTip(): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/blocks/tip/height', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/blocks/tip/height'); } $getBlockHashTip(): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/blocks/tip/hash', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/blocks/tip/hash'); } $getTxIdsForBlock(hash: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + '/txids', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + '/txids'); } $getBlockHash(height: number): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block-height/' + height, this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block-height/' + height); } $getBlockHeader(hash: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + '/header', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + '/header'); } $getBlock(hash: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash, this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash); } $getRawBlock(hash: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/block/' + hash + "/raw", { ...this.axiosConfig, responseType: 'arraybuffer' }) + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + "/raw", 'arraybuffer') .then((response) => { return Buffer.from(response.data); }); } @@ -85,13 +119,11 @@ class ElectrsApi implements AbstractBitcoinApi { } $getOutspend(txId: string, vout: number): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspend/' + vout, this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspend/' + vout); } $getOutspends(txId: string): Promise { - return axiosConnection.get(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspends', this.axiosConfig) - .then((response) => response.data); + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/outspends'); } async $getBatchedOutspends(txId: string[]): Promise { diff --git a/backend/src/index.ts b/backend/src/index.ts index feddd30c3..5225426b5 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -45,7 +45,8 @@ class Server { private wss: WebSocket.Server | undefined; private server: http.Server | undefined; private app: Application; - private currentBackendRetryInterval = 5; + private currentBackendRetryInterval = 1; + private backendRetryCount = 0; private maxHeapSize: number = 0; private heapLogInterval: number = 60; @@ -184,17 +185,17 @@ class Server { indexer.$run(); setTimeout(this.runMainUpdateLoop.bind(this), config.MEMPOOL.POLL_RATE_MS); - this.currentBackendRetryInterval = 5; + this.backendRetryCount = 0; } catch (e: any) { - let loggerMsg = `Exception in runMainUpdateLoop(). Retrying in ${this.currentBackendRetryInterval} sec.`; + this.backendRetryCount++; + let loggerMsg = `Exception in runMainUpdateLoop() (count: ${this.backendRetryCount}). Retrying in ${this.currentBackendRetryInterval} sec.`; loggerMsg += ` Reason: ${(e instanceof Error ? e.message : e)}.`; if (e?.stack) { loggerMsg += ` Stack trace: ${e.stack}`; } // When we get a first Exception, only `logger.debug` it and retry after 5 seconds // From the second Exception, `logger.warn` the Exception and increase the retry delay - // Maximum retry delay is 60 seconds - if (this.currentBackendRetryInterval > 5) { + if (this.backendRetryCount >= 5) { logger.warn(loggerMsg); mempool.setOutOfSync(); } else { @@ -204,8 +205,6 @@ class Server { logger.debug(`AxiosError: ${e?.message}`); } setTimeout(this.runMainUpdateLoop.bind(this), 1000 * this.currentBackendRetryInterval); - this.currentBackendRetryInterval *= 2; - this.currentBackendRetryInterval = Math.min(this.currentBackendRetryInterval, 60); } } From 3f49944c05f898a91721823f9ffaf3fd8f5ae582 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 3 May 2023 10:02:03 -0600 Subject: [PATCH 236/782] Fix transaction ETA calculation --- .../src/app/components/transaction/transaction.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 5f23633bf..4c2dbccb0 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -416,13 +416,15 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { const txFeePerVSize = this.tx.effectiveFeePerVsize || this.tx.fee / (this.tx.weight / 4); + let found = false; for (const block of mempoolBlocks) { - for (let i = 0; i < block.feeRange.length - 1; i++) { + for (let i = 0; i < block.feeRange.length - 1 && !found; i++) { if ( txFeePerVSize <= block.feeRange[i + 1] && txFeePerVSize >= block.feeRange[i] ) { this.txInBlockIndex = mempoolBlocks.indexOf(block); + found = true; } } } From 1b843da785d58073d6d111c2484997472af30d53 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 13 Dec 2022 17:11:37 -0600 Subject: [PATCH 237/782] Timeline of replacements for RBF-d transactions --- backend/src/api/bitcoin/bitcoin.routes.ts | 10 +- backend/src/api/mempool.ts | 2 +- backend/src/api/rbf-cache.ts | 58 ++++++-- .../rbf-timeline/rbf-timeline.component.html | 35 +++++ .../rbf-timeline/rbf-timeline.component.scss | 137 ++++++++++++++++++ .../rbf-timeline/rbf-timeline.component.ts | 36 +++++ .../transaction/transaction.component.html | 9 ++ .../transaction/transaction.component.ts | 11 +- .../src/app/interfaces/node-api.interface.ts | 9 ++ frontend/src/app/services/api.service.ts | 6 +- frontend/src/app/shared/shared.module.ts | 3 + 11 files changed, 295 insertions(+), 21 deletions(-) create mode 100644 frontend/src/app/components/rbf-timeline/rbf-timeline.component.html create mode 100644 frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss create mode 100644 frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index 298ae3715..b8c86bbe2 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -32,7 +32,7 @@ class BitcoinRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'backend-info', this.getBackendInfo) .get(config.MEMPOOL.API_URL_PREFIX + 'init-data', this.getInitData) .get(config.MEMPOOL.API_URL_PREFIX + 'validate-address/:address', this.validateAddress) - .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/replaces', this.getRbfHistory) + .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/rbf', this.getRbfHistory) .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/cached', this.getCachedTx) .post(config.MEMPOOL.API_URL_PREFIX + 'tx/push', this.$postTransactionForm) .get(config.MEMPOOL.API_URL_PREFIX + 'donations', async (req, res) => { @@ -642,8 +642,12 @@ class BitcoinRoutes { private async getRbfHistory(req: Request, res: Response) { try { - const result = rbfCache.getReplaces(req.params.txId); - res.json(result || []); + const replacements = rbfCache.getRbfChain(req.params.txId) || []; + const replaces = rbfCache.getReplaces(req.params.txId) || null; + res.json({ + replacements, + replaces + }); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 0d593f1a3..8b2728c1c 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -269,7 +269,7 @@ class Mempool { for (const rbfTransaction in rbfTransactions) { if (this.mempoolCache[rbfTransaction]) { // Store replaced transactions - rbfCache.add(this.mempoolCache[rbfTransaction], rbfTransactions[rbfTransaction].txid); + rbfCache.add(this.mempoolCache[rbfTransaction], rbfTransactions[rbfTransaction]); // Erase the replaced transactions from the local mempool delete this.mempoolCache[rbfTransaction]; } diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 410239e73..8557ec232 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -1,8 +1,15 @@ -import { TransactionExtended } from "../mempool.interfaces"; +import { TransactionExtended, TransactionStripped } from "../mempool.interfaces"; +import { Common } from "./common"; + +interface RbfTransaction extends TransactionStripped { + rbf?: boolean; +} class RbfCache { private replacedBy: { [txid: string]: string; } = {}; private replaces: { [txid: string]: string[] } = {}; + private rbfChains: { [root: string]: { tx: TransactionStripped, time: number, mined?: boolean }[] } = {}; // sequences of consecutive replacements + private chainMap: { [txid: string]: string } = {}; // map of txids to sequence ids private txs: { [txid: string]: TransactionExtended } = {}; private expiring: { [txid: string]: Date } = {}; @@ -10,13 +17,34 @@ class RbfCache { setInterval(this.cleanup.bind(this), 1000 * 60 * 60); } - public add(replacedTx: TransactionExtended, newTxId: string): void { - this.replacedBy[replacedTx.txid] = newTxId; - this.txs[replacedTx.txid] = replacedTx; - if (!this.replaces[newTxId]) { - this.replaces[newTxId] = []; + public add(replacedTxExtended: TransactionExtended, newTxExtended: TransactionExtended): void { + const replacedTx = Common.stripTransaction(replacedTxExtended) as RbfTransaction; + replacedTx.rbf = replacedTxExtended.vin.some((v) => v.sequence < 0xfffffffe); + const newTx = Common.stripTransaction(newTxExtended) as RbfTransaction; + newTx.rbf = newTxExtended.vin.some((v) => v.sequence < 0xfffffffe); + + this.replacedBy[replacedTx.txid] = newTx.txid; + this.txs[replacedTx.txid] = replacedTxExtended; + if (!this.replaces[newTx.txid]) { + this.replaces[newTx.txid] = []; + } + this.replaces[newTx.txid].push(replacedTx.txid); + + // maintain rbf chains + if (this.chainMap[replacedTx.txid]) { + // add to an existing chain + const chainRoot = this.chainMap[replacedTx.txid]; + this.rbfChains[chainRoot].push({ tx: newTx, time: newTxExtended.firstSeen || Date.now() }); + this.chainMap[newTx.txid] = chainRoot; + } else { + // start a new chain + this.rbfChains[replacedTx.txid] = [ + { tx: replacedTx, time: replacedTxExtended.firstSeen || Date.now() }, + { tx: newTx, time: newTxExtended.firstSeen || Date.now() }, + ]; + this.chainMap[replacedTx.txid] = replacedTx.txid; + this.chainMap[newTx.txid] = replacedTx.txid; } - this.replaces[newTxId].push(replacedTx.txid); } public getReplacedBy(txId: string): string | undefined { @@ -31,6 +59,10 @@ class RbfCache { return this.txs[txId]; } + public getRbfChain(txId: string): { tx: TransactionStripped, time: number }[] { + return this.rbfChains[this.chainMap[txId]] || []; + } + // flag a transaction as removed from the mempool public evict(txid): void { this.expiring[txid] = new Date(Date.now() + 1000 * 86400); // 24 hours @@ -48,14 +80,20 @@ class RbfCache { // remove a transaction & all previous versions from the cache private remove(txid): void { - // don't remove a transaction while a newer version remains in the mempool - if (this.replaces[txid] && !this.replacedBy[txid]) { + // don't remove a transaction if a newer version remains in the mempool + if (!this.replacedBy[txid]) { const replaces = this.replaces[txid]; delete this.replaces[txid]; + delete this.chainMap[txid]; + delete this.txs[txid]; + delete this.expiring[txid]; for (const tx of replaces) { // recursively remove prior versions from the cache delete this.replacedBy[tx]; - delete this.txs[tx]; + // if this is the root of a chain, remove that too + if (this.chainMap[tx] === tx) { + delete this.rbfChains[tx]; + } this.remove(tx); } } diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html new file mode 100644 index 000000000..a7b96f000 --- /dev/null +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html @@ -0,0 +1,35 @@ +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + {{ replacement.tx.fee / (replacement.tx.vsize) | feeRounding }} sat/vB +
    + +
    +
    + + +
    diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss new file mode 100644 index 000000000..af0e75744 --- /dev/null +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss @@ -0,0 +1,137 @@ +.rbf-timeline { + position: relative; + width: 100%; + padding: 1em 0; + + &::after, &::before { + content: ''; + display: block; + position: absolute; + top: 0; + bottom: 0; + width: 2em; + z-index: 2; + } + + &::before { + left: 0; + background: linear-gradient(to right, #24273e, #24273e, transparent); + } + + &::after { + right: 0; + background: linear-gradient(to left, #24273e, #24273e, transparent); + } + + .timeline { + position: relative; + width: calc(100% - 2em); + margin: auto; + overflow-x: auto; + -ms-overflow-style: none; + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } + } + + .intervals, .nodes { + min-width: 100%; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; + text-align: center; + + .node, .node-spacer { + width: 4em; + min-width: 4em; + flex-grow: 1; + } + + .interval, .interval-spacer { + width: 8em; + min-width: 4em; + max-width: 8em; + } + + .interval-time { + font-size: 12px; + } + } + + .node, .interval-spacer { + position: relative; + .track { + position: absolute; + height: 10px; + left: -5px; + right: -5px; + top: 0; + transform: translateY(-50%); + background: #105fb0; + border-radius: 5px; + } + &:first-child { + .track { + left: 50%; + } + } + &:last-child { + .track { + right: 50%; + } + } + } + + .nodes { + position: relative; + margin-top: 1em; + .node { + .shape-border { + display: block; + margin: auto; + height: calc(1em + 8px); + width: calc(1em + 8px); + margin-bottom: -8px; + transform: translateY(-50%); + border-radius: 10%; + cursor: pointer; + padding: 4px; + background: transparent; + transition: background-color 300ms, padding 300ms; + + .shape { + width: 100%; + height: 100%; + border-radius: 10%; + background: white; + transition: background-color 300ms; + } + + &.rbf, &.rbf .shape { + border-radius: 50%; + } + } + + .symbol::ng-deep { + display: block; + margin-top: -0.5em; + } + + &.selected { + .shape-border { + background: #9339f4; + } + } + + .shape-border:hover { + padding: 0px; + .shape { + background: #1bd8f4; + } + } + } + } +} \ No newline at end of file diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts new file mode 100644 index 000000000..b053158b4 --- /dev/null +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts @@ -0,0 +1,36 @@ +import { Component, Input, OnInit, OnChanges, Inject, LOCALE_ID } from '@angular/core'; +import { Router } from '@angular/router'; +import { RbfInfo } from '../../interfaces/node-api.interface'; +import { StateService } from '../../services/state.service'; +import { ApiService } from '../../services/api.service'; + +@Component({ + selector: 'app-rbf-timeline', + templateUrl: './rbf-timeline.component.html', + styleUrls: ['./rbf-timeline.component.scss'], +}) +export class RbfTimelineComponent implements OnInit, OnChanges { + @Input() replacements: RbfInfo[]; + @Input() txid: string; + + dir: 'rtl' | 'ltr' = 'ltr'; + + constructor( + private router: Router, + private stateService: StateService, + private apiService: ApiService, + @Inject(LOCALE_ID) private locale: string, + ) { + if (this.locale.startsWith('ar') || this.locale.startsWith('fa') || this.locale.startsWith('he')) { + this.dir = 'rtl'; + } + } + + ngOnInit(): void { + + } + + ngOnChanges(): void { + + } +} diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 04d13b07a..1710b538f 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -197,6 +197,15 @@
    + +
    +

    Replacements

    +
    +
    + +
    +
    +

    Flow

    diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 5f23633bf..d89bf4e2b 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -19,7 +19,7 @@ import { WebsocketService } from '../../services/websocket.service'; import { AudioService } from '../../services/audio.service'; import { ApiService } from '../../services/api.service'; import { SeoService } from '../../services/seo.service'; -import { BlockExtended, CpfpInfo } from '../../interfaces/node-api.interface'; +import { BlockExtended, CpfpInfo, RbfInfo } from '../../interfaces/node-api.interface'; import { LiquidUnblinding } from './liquid-ublinding'; import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; import { Price, PriceService } from '../../services/price.service'; @@ -53,6 +53,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { rbfTransaction: undefined | Transaction; replaced: boolean = false; rbfReplaces: string[]; + rbfInfo: RbfInfo[]; cpfpInfo: CpfpInfo | null; showCpfpDetails = false; fetchCpfp$ = new Subject(); @@ -183,10 +184,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { .getRbfHistory$(txId) ), catchError(() => { - return of([]); + return of(null); }) - ).subscribe((replaces) => { - this.rbfReplaces = replaces; + ).subscribe((rbfResponse) => { + this.rbfInfo = rbfResponse?.replacements || []; + this.rbfReplaces = rbfResponse?.replaces || null; }); this.fetchCachedTxSubscription = this.fetchCachedTx$ @@ -460,6 +462,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.replaced = false; this.transactionTime = -1; this.cpfpInfo = null; + this.rbfInfo = []; this.rbfReplaces = []; this.showCpfpDetails = false; document.body.scrollTo(0, 0); diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 46654a3b7..442fb73ce 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -26,6 +26,11 @@ export interface CpfpInfo { bestDescendant?: BestDescendant | null; } +export interface RbfInfo { + tx: RbfTransaction, + time: number +} + export interface DifficultyAdjustment { progressPercent: number; difficultyChange: number; @@ -146,6 +151,10 @@ export interface TransactionStripped { status?: 'found' | 'missing' | 'fresh' | 'added' | 'censored' | 'selected'; } +interface RbfTransaction extends TransactionStripped { + rbf?: boolean; +} + export interface RewardStats { startBlock: number; endBlock: number; diff --git a/frontend/src/app/services/api.service.ts b/frontend/src/app/services/api.service.ts index 2b4e460a2..fda957a8a 100644 --- a/frontend/src/app/services/api.service.ts +++ b/frontend/src/app/services/api.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http'; import { CpfpInfo, OptimizedMempoolStats, AddressInformation, LiquidPegs, ITranslators, - PoolStat, BlockExtended, TransactionStripped, RewardStats, AuditScore, BlockSizesAndWeights } from '../interfaces/node-api.interface'; + PoolStat, BlockExtended, TransactionStripped, RewardStats, AuditScore, BlockSizesAndWeights, RbfInfo } from '../interfaces/node-api.interface'; import { Observable } from 'rxjs'; import { StateService } from './state.service'; import { WebsocketResponse } from '../interfaces/websocket.interface'; @@ -124,8 +124,8 @@ export class ApiService { return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/validate-address/' + address); } - getRbfHistory$(txid: string): Observable { - return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/tx/' + txid + '/replaces'); + getRbfHistory$(txid: string): Observable<{ replacements: RbfInfo[], replaces: string[] }> { + return this.httpClient.get<{ replacements: RbfInfo[], replaces: string[] }>(this.apiBaseUrl + this.apiBasePath + '/api/v1/tx/' + txid + '/rbf'); } getRbfCachedTx$(txid: string): Observable { diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index e276f79f8..7313ec8e3 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -61,6 +61,7 @@ import { DifficultyComponent } from '../components/difficulty/difficulty.compone import { DifficultyTooltipComponent } from '../components/difficulty/difficulty-tooltip.component'; import { DifficultyMiningComponent } from '../components/difficulty-mining/difficulty-mining.component'; import { TermsOfServiceComponent } from '../components/terms-of-service/terms-of-service.component'; +import { RbfTimelineComponent } from '../components/rbf-timeline/rbf-timeline.component'; import { TxBowtieGraphComponent } from '../components/tx-bowtie-graph/tx-bowtie-graph.component'; import { TxBowtieGraphTooltipComponent } from '../components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component'; import { PrivacyPolicyComponent } from '../components/privacy-policy/privacy-policy.component'; @@ -138,6 +139,7 @@ import { TestnetAlertComponent } from './components/testnet-alert/testnet-alert. DifficultyComponent, DifficultyMiningComponent, DifficultyTooltipComponent, + RbfTimelineComponent, TxBowtieGraphComponent, TxBowtieGraphTooltipComponent, TermsOfServiceComponent, @@ -242,6 +244,7 @@ import { TestnetAlertComponent } from './components/testnet-alert/testnet-alert. DifficultyComponent, DifficultyMiningComponent, DifficultyTooltipComponent, + RbfTimelineComponent, TxBowtieGraphComponent, TxBowtieGraphTooltipComponent, TermsOfServiceComponent, From 7b2a1cfd10ef0ebbe1394e6f8d815e4c166a7719 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 14 Dec 2022 08:49:35 -0600 Subject: [PATCH 238/782] update RBF timeline over websocket --- backend/src/api/rbf-cache.ts | 104 +++++++++++------- backend/src/api/websocket-handler.ts | 6 + .../transaction/transaction.component.ts | 43 +++++--- .../src/app/interfaces/websocket.interface.ts | 3 +- frontend/src/app/services/state.service.ts | 3 +- .../src/app/services/websocket.service.ts | 4 + 6 files changed, 110 insertions(+), 53 deletions(-) diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 8557ec232..1a0e0f7d5 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -5,13 +5,20 @@ interface RbfTransaction extends TransactionStripped { rbf?: boolean; } +type RbfChain = { + tx: RbfTransaction, + time: number, + mined?: boolean, +}[]; + class RbfCache { - private replacedBy: { [txid: string]: string; } = {}; - private replaces: { [txid: string]: string[] } = {}; - private rbfChains: { [root: string]: { tx: TransactionStripped, time: number, mined?: boolean }[] } = {}; // sequences of consecutive replacements - private chainMap: { [txid: string]: string } = {}; // map of txids to sequence ids - private txs: { [txid: string]: TransactionExtended } = {}; - private expiring: { [txid: string]: Date } = {}; + private replacedBy: Map = new Map(); + private replaces: Map = new Map(); + private rbfChains: Map = new Map(); // sequences of consecutive replacements + private dirtyChains: Set = new Set(); + private chainMap: Map = new Map(); // map of txids to sequence ids + private txs: Map = new Map(); + private expiring: Map = new Map(); constructor() { setInterval(this.cleanup.bind(this), 1000 * 60 * 60); @@ -23,56 +30,79 @@ class RbfCache { const newTx = Common.stripTransaction(newTxExtended) as RbfTransaction; newTx.rbf = newTxExtended.vin.some((v) => v.sequence < 0xfffffffe); - this.replacedBy[replacedTx.txid] = newTx.txid; - this.txs[replacedTx.txid] = replacedTxExtended; - if (!this.replaces[newTx.txid]) { - this.replaces[newTx.txid] = []; + this.replacedBy.set(replacedTx.txid, newTx.txid); + this.txs.set(replacedTx.txid, replacedTxExtended); + this.txs.set(newTx.txid, newTxExtended); + if (!this.replaces.has(newTx.txid)) { + this.replaces.set(newTx.txid, []); } - this.replaces[newTx.txid].push(replacedTx.txid); + this.replaces.get(newTx.txid)?.push(replacedTx.txid); // maintain rbf chains - if (this.chainMap[replacedTx.txid]) { + if (this.chainMap.has(replacedTx.txid)) { // add to an existing chain - const chainRoot = this.chainMap[replacedTx.txid]; - this.rbfChains[chainRoot].push({ tx: newTx, time: newTxExtended.firstSeen || Date.now() }); - this.chainMap[newTx.txid] = chainRoot; + const chainRoot = this.chainMap.get(replacedTx.txid) || ''; + this.rbfChains.get(chainRoot)?.push({ tx: newTx, time: newTxExtended.firstSeen || Date.now() }); + this.chainMap.set(newTx.txid, chainRoot); + this.dirtyChains.add(chainRoot); } else { // start a new chain - this.rbfChains[replacedTx.txid] = [ + this.rbfChains.set(replacedTx.txid, [ { tx: replacedTx, time: replacedTxExtended.firstSeen || Date.now() }, { tx: newTx, time: newTxExtended.firstSeen || Date.now() }, - ]; - this.chainMap[replacedTx.txid] = replacedTx.txid; - this.chainMap[newTx.txid] = replacedTx.txid; + ]); + this.chainMap.set(replacedTx.txid, replacedTx.txid); + this.chainMap.set(newTx.txid, replacedTx.txid); + this.dirtyChains.add(replacedTx.txid); } } public getReplacedBy(txId: string): string | undefined { - return this.replacedBy[txId]; + return this.replacedBy.get(txId); } public getReplaces(txId: string): string[] | undefined { - return this.replaces[txId]; + return this.replaces.get(txId); } public getTx(txId: string): TransactionExtended | undefined { - return this.txs[txId]; + return this.txs.get(txId); } - public getRbfChain(txId: string): { tx: TransactionStripped, time: number }[] { - return this.rbfChains[this.chainMap[txId]] || []; + public getRbfChain(txId: string): RbfChain { + return this.rbfChains.get(this.chainMap.get(txId) || '') || []; } + // get map of rbf chains that have been updated since the last call + public getRbfChanges(): { chains: {[root: string]: RbfChain }, map: { [txid: string]: string }} { + const changes: { chains: {[root: string]: RbfChain }, map: { [txid: string]: string }} = { + chains: {}, + map: {}, + }; + this.dirtyChains.forEach(root => { + const chain = this.rbfChains.get(root); + if (chain) { + changes.chains[root] = chain; + chain.forEach(entry => { + changes.map[entry.tx.txid] = root; + }); + } + }); + this.dirtyChains = new Set(); + return changes; + } + + // flag a transaction as removed from the mempool public evict(txid): void { - this.expiring[txid] = new Date(Date.now() + 1000 * 86400); // 24 hours + this.expiring.set(txid, new Date(Date.now() + 1000 * 86400)); // 24 hours } private cleanup(): void { const currentDate = new Date(); for (const txid in this.expiring) { - if (this.expiring[txid] < currentDate) { - delete this.expiring[txid]; + if ((this.expiring.get(txid) || 0) < currentDate) { + this.expiring.delete(txid); this.remove(txid); } } @@ -81,18 +111,18 @@ class RbfCache { // remove a transaction & all previous versions from the cache private remove(txid): void { // don't remove a transaction if a newer version remains in the mempool - if (!this.replacedBy[txid]) { - const replaces = this.replaces[txid]; - delete this.replaces[txid]; - delete this.chainMap[txid]; - delete this.txs[txid]; - delete this.expiring[txid]; - for (const tx of replaces) { + if (!this.replacedBy.has(txid)) { + const replaces = this.replaces.get(txid); + this.replaces.delete(txid); + this.chainMap.delete(txid); + this.txs.delete(txid); + this.expiring.delete(txid); + for (const tx of (replaces || [])) { // recursively remove prior versions from the cache - delete this.replacedBy[tx]; + this.replacedBy.delete(tx); // if this is the root of a chain, remove that too - if (this.chainMap[tx] === tx) { - delete this.rbfChains[tx]; + if (this.chainMap.get(tx) === tx) { + this.rbfChains.delete(tx); } this.remove(tx); } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 865dfe9d6..695b79f2b 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -278,6 +278,7 @@ class WebsocketHandler { const rbfTransactions = Common.findRbfTransactions(newTransactions, deletedTransactions); const da = difficultyAdjustment.getDifficultyAdjustment(); memPool.handleRbfTransactions(rbfTransactions); + const rbfChanges = rbfCache.getRbfChanges(); const recommendedFees = feeApi.getRecommendedFee(); this.wss.clients.forEach(async (client) => { @@ -410,6 +411,11 @@ class WebsocketHandler { } } } + + const rbfChange = rbfChanges.map[client['track-tx']]; + if (rbfChange) { + response['rbfInfo'] = rbfChanges.chains[rbfChange]; + } } if (client['track-mempool-block'] >= 0) { diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index d89bf4e2b..41dfe8bf0 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -46,6 +46,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { fetchRbfSubscription: Subscription; fetchCachedTxSubscription: Subscription; txReplacedSubscription: Subscription; + txRbfInfoSubscription: Subscription; blocksSubscription: Subscription; queryParamsSubscription: Subscription; urlFragmentSubscription: Subscription; @@ -205,21 +206,28 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { return; } - this.tx = tx; - this.setFeatures(); - this.isCached = true; - if (tx.fee === undefined) { - this.tx.fee = 0; - } - this.tx.feePerVsize = tx.fee / (tx.weight / 4); - this.isLoadingTx = false; - this.error = undefined; - this.waitingForTransaction = false; - this.graphExpanded = false; - this.setupGraph(); + if (!this.tx) { + this.tx = tx; + this.setFeatures(); + this.isCached = true; + if (tx.fee === undefined) { + this.tx.fee = 0; + } + this.tx.feePerVsize = tx.fee / (tx.weight / 4); + this.isLoadingTx = false; + this.error = undefined; + this.waitingForTransaction = false; + this.graphExpanded = false; + this.setupGraph(); - if (!this.tx?.status?.confirmed) { - this.fetchRbfHistory$.next(this.tx.txid); + if (!this.tx?.status?.confirmed) { + this.fetchRbfHistory$.next(this.tx.txid); + this.txRbfInfoSubscription = this.stateService.txRbfInfo$.subscribe((rbfInfo) => { + if (this.tx) { + this.rbfInfo = rbfInfo; + } + }); + } } }); @@ -382,6 +390,12 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } }); + this.txRbfInfoSubscription = this.stateService.txRbfInfo$.subscribe((rbfInfo) => { + if (this.tx) { + this.rbfInfo = rbfInfo; + } + }); + this.queryParamsSubscription = this.route.queryParams.subscribe((params) => { if (params.showFlow === 'false') { this.overrideFlowPreference = false; @@ -535,6 +549,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.fetchRbfSubscription.unsubscribe(); this.fetchCachedTxSubscription.unsubscribe(); this.txReplacedSubscription.unsubscribe(); + this.txRbfInfoSubscription.unsubscribe(); this.blocksSubscription.unsubscribe(); this.queryParamsSubscription.unsubscribe(); this.flowPrefSubscription.unsubscribe(); diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 46416857e..aa0834cf8 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -1,6 +1,6 @@ import { ILoadingIndicators } from '../services/state.service'; import { Transaction } from './electrs.interface'; -import { BlockExtended, DifficultyAdjustment } from './node-api.interface'; +import { BlockExtended, DifficultyAdjustment, RbfInfo } from './node-api.interface'; export interface WebsocketResponse { block?: BlockExtended; @@ -16,6 +16,7 @@ export interface WebsocketResponse { tx?: Transaction; rbfTransaction?: ReplacedTransaction; txReplaced?: ReplacedTransaction; + rbfInfo?: RbfInfo[]; utxoSpent?: object; transactions?: TransactionStripped[]; loadingIndicators?: ILoadingIndicators; diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index c56a5e79e..dbb269945 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -2,7 +2,7 @@ import { Inject, Injectable, PLATFORM_ID, LOCALE_ID } from '@angular/core'; import { ReplaySubject, BehaviorSubject, Subject, fromEvent, Observable } from 'rxjs'; import { Transaction } from '../interfaces/electrs.interface'; import { IBackendInfo, MempoolBlock, MempoolBlockWithTransactions, MempoolBlockDelta, MempoolInfo, Recommendedfees, ReplacedTransaction, TransactionStripped } from '../interfaces/websocket.interface'; -import { BlockExtended, DifficultyAdjustment, OptimizedMempoolStats } from '../interfaces/node-api.interface'; +import { BlockExtended, DifficultyAdjustment, OptimizedMempoolStats, RbfInfo } from '../interfaces/node-api.interface'; import { Router, NavigationStart } from '@angular/router'; import { isPlatformBrowser } from '@angular/common'; import { map, shareReplay } from 'rxjs/operators'; @@ -98,6 +98,7 @@ export class StateService { mempoolBlockTransactions$ = new Subject(); mempoolBlockDelta$ = new Subject(); txReplaced$ = new Subject(); + txRbfInfo$ = new Subject(); utxoSpent$ = new Subject(); difficultyAdjustment$ = new ReplaySubject(1); mempoolTransactions$ = new Subject(); diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index d58ab58c9..826716db2 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -257,6 +257,10 @@ export class WebsocketService { this.stateService.txReplaced$.next(response.rbfTransaction); } + if (response.rbfInfo) { + this.stateService.txRbfInfo$.next(response.rbfInfo); + } + if (response.txReplaced) { this.stateService.txReplaced$.next(response.txReplaced); } From f46296a2bba3b57bb8f7d14caf50a30a472846d0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 14 Dec 2022 16:51:53 -0600 Subject: [PATCH 239/782] new page listing recent RBF events --- backend/src/api/bitcoin/bitcoin.routes.ts | 20 +++++ backend/src/api/rbf-cache.ts | 41 +++++++++ backend/src/api/websocket-handler.ts | 23 ++++- frontend/src/app/app-routing.module.ts | 13 +++ .../rbf-list/rbf-list.component.html | 61 +++++++++++++ .../rbf-list/rbf-list.component.scss | 51 +++++++++++ .../components/rbf-list/rbf-list.component.ts | 86 +++++++++++++++++++ .../rbf-timeline/rbf-timeline.component.html | 4 +- .../rbf-timeline/rbf-timeline.component.scss | 6 ++ .../rbf-timeline/rbf-timeline.component.ts | 5 +- .../src/app/interfaces/node-api.interface.ts | 3 +- .../src/app/interfaces/websocket.interface.ts | 2 + frontend/src/app/services/api.service.ts | 4 + frontend/src/app/services/state.service.ts | 1 + .../src/app/services/websocket.service.ts | 15 ++++ frontend/src/app/shared/shared.module.ts | 5 +- 16 files changed, 333 insertions(+), 7 deletions(-) create mode 100644 frontend/src/app/components/rbf-list/rbf-list.component.html create mode 100644 frontend/src/app/components/rbf-list/rbf-list.component.scss create mode 100644 frontend/src/app/components/rbf-list/rbf-list.component.ts diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index b8c86bbe2..c01a6170f 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -34,6 +34,8 @@ class BitcoinRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'validate-address/:address', this.validateAddress) .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/rbf', this.getRbfHistory) .get(config.MEMPOOL.API_URL_PREFIX + 'tx/:txId/cached', this.getCachedTx) + .get(config.MEMPOOL.API_URL_PREFIX + 'replacements', this.getRbfReplacements) + .get(config.MEMPOOL.API_URL_PREFIX + 'fullrbf/replacements', this.getFullRbfReplacements) .post(config.MEMPOOL.API_URL_PREFIX + 'tx/push', this.$postTransactionForm) .get(config.MEMPOOL.API_URL_PREFIX + 'donations', async (req, res) => { try { @@ -653,6 +655,24 @@ class BitcoinRoutes { } } + private async getRbfReplacements(req: Request, res: Response) { + try { + const result = rbfCache.getRbfChains(false); + res.json(result); + } catch (e) { + res.status(500).send(e instanceof Error ? e.message : e); + } + } + + private async getFullRbfReplacements(req: Request, res: Response) { + try { + const result = rbfCache.getRbfChains(true); + res.json(result); + } catch (e) { + res.status(500).send(e instanceof Error ? e.message : e); + } + } + private async getCachedTx(req: Request, res: Response) { try { const result = rbfCache.getTx(req.params.txId); diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 1a0e0f7d5..17eb53e12 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -73,6 +73,33 @@ class RbfCache { return this.rbfChains.get(this.chainMap.get(txId) || '') || []; } + // get a paginated list of RbfChains + // ordered by most recent replacement time + public getRbfChains(onlyFullRbf: boolean, after?: string): RbfChain[] { + const limit = 25; + const chains: RbfChain[] = []; + const used = new Set(); + const replacements: string[][] = Array.from(this.replacedBy).reverse(); + const afterChain = after ? this.chainMap.get(after) : null; + let ready = !afterChain; + for (let i = 0; i < replacements.length && chains.length <= limit - 1; i++) { + const txid = replacements[i][1]; + const chainRoot = this.chainMap.get(txid) || ''; + if (chainRoot === afterChain) { + ready = true; + } else if (ready) { + if (!used.has(chainRoot)) { + const chain = this.rbfChains.get(chainRoot); + used.add(chainRoot); + if (chain && (!onlyFullRbf || chain.slice(0, -1).some(entry => !entry.tx.rbf))) { + chains.push(chain); + } + } + } + } + return chains; + } + // get map of rbf chains that have been updated since the last call public getRbfChanges(): { chains: {[root: string]: RbfChain }, map: { [txid: string]: string }} { const changes: { chains: {[root: string]: RbfChain }, map: { [txid: string]: string }} = { @@ -92,6 +119,20 @@ class RbfCache { return changes; } + public mined(txid): void { + const chainRoot = this.chainMap.get(txid) + if (chainRoot && this.rbfChains.has(chainRoot)) { + const chain = this.rbfChains.get(chainRoot); + if (chain) { + const chainEntry = chain.find(entry => entry.tx.txid === txid); + if (chainEntry) { + chainEntry.mined = true; + } + this.dirtyChains.add(chainRoot); + } + } + this.evict(txid); + } // flag a transaction as removed from the mempool public evict(txid): void { diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 695b79f2b..71ed473a8 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -140,6 +140,14 @@ class WebsocketHandler { } } + if (parsedMessage && parsedMessage['track-rbf'] !== undefined) { + if (['all', 'fullRbf'].includes(parsedMessage['track-rbf'])) { + client['track-rbf'] = parsedMessage['track-rbf']; + } else { + client['track-rbf'] = false; + } + } + if (parsedMessage.action === 'init') { const _blocks = blocks.getBlocks().slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT); if (!_blocks) { @@ -279,6 +287,12 @@ class WebsocketHandler { const da = difficultyAdjustment.getDifficultyAdjustment(); memPool.handleRbfTransactions(rbfTransactions); const rbfChanges = rbfCache.getRbfChanges(); + let rbfReplacements; + let fullRbfReplacements; + if (Object.keys(rbfChanges.chains).length) { + rbfReplacements = rbfCache.getRbfChains(false); + fullRbfReplacements = rbfCache.getRbfChains(true); + } const recommendedFees = feeApi.getRecommendedFee(); this.wss.clients.forEach(async (client) => { @@ -428,6 +442,13 @@ class WebsocketHandler { } } + console.log(client['track-rbf']); + if (client['track-rbf'] === 'all' && rbfReplacements) { + response['rbfLatest'] = rbfReplacements; + } else if (client['track-rbf'] === 'fullRbf' && fullRbfReplacements) { + response['rbfLatest'] = fullRbfReplacements; + } + if (Object.keys(response).length) { client.send(JSON.stringify(response)); } @@ -506,7 +527,7 @@ class WebsocketHandler { // Update mempool to remove transactions included in the new block for (const txId of txIds) { delete _memPool[txId]; - rbfCache.evict(txId); + rbfCache.mined(txId); } if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 90ea84a82..06334c5b5 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -14,6 +14,7 @@ import { TrademarkPolicyComponent } from './components/trademark-policy/trademar import { BisqMasterPageComponent } from './components/bisq-master-page/bisq-master-page.component'; import { PushTransactionComponent } from './components/push-transaction/push-transaction.component'; import { BlocksList } from './components/blocks-list/blocks-list.component'; +import { RbfList } from './components/rbf-list/rbf-list.component'; import { LiquidMasterPageComponent } from './components/liquid-master-page/liquid-master-page.component'; import { AssetGroupComponent } from './components/assets/asset-group/asset-group.component'; import { AssetsFeaturedComponent } from './components/assets/assets-featured/assets-featured.component'; @@ -56,6 +57,10 @@ let routes: Routes = [ path: 'blocks', component: BlocksList, }, + { + path: 'rbf', + component: RbfList, + }, { path: 'terms-of-service', component: TermsOfServiceComponent @@ -162,6 +167,10 @@ let routes: Routes = [ path: 'blocks', component: BlocksList, }, + { + path: 'rbf', + component: RbfList, + }, { path: 'terms-of-service', component: TermsOfServiceComponent @@ -264,6 +273,10 @@ let routes: Routes = [ path: 'blocks', component: BlocksList, }, + { + path: 'rbf', + component: RbfList, + }, { path: 'terms-of-service', component: TermsOfServiceComponent diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.html b/frontend/src/app/components/rbf-list/rbf-list.component.html new file mode 100644 index 000000000..427ab3acf --- /dev/null +++ b/frontend/src/app/components/rbf-list/rbf-list.component.html @@ -0,0 +1,61 @@ +
    +

    RBF Replacements

    +
    + +
    + +
    + + +
    + +
    + +
    + +
    + + + +
    +

    there are no replacements in the mempool yet!

    +
    +
    + + +
    + +
    diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.scss b/frontend/src/app/components/rbf-list/rbf-list.component.scss new file mode 100644 index 000000000..fa8ebc1f1 --- /dev/null +++ b/frontend/src/app/components/rbf-list/rbf-list.component.scss @@ -0,0 +1,51 @@ +.spinner-border { + height: 25px; + width: 25px; + margin-top: 13px; +} + +.rbf-chains { + .info { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: baseline; + margin: 0; + + .type { + .badge { + margin-left: .5em; + } + } + } + + .chain { + margin-bottom: 1em; + } + + .txids { + display: flex; + flex-direction: row; + align-items: baseline; + justify-content: space-between; + margin-bottom: 2px; + + .txid { + flex-basis: 0; + flex-grow: 1; + + &.right { + text-align: right; + } + } + } + + .timeline-wrapper.mined { + border: solid 4px #1a9436; + } + + .no-replacements { + margin: 1em; + text-align: center; + } +} \ No newline at end of file diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.ts b/frontend/src/app/components/rbf-list/rbf-list.component.ts new file mode 100644 index 000000000..b40dbaf16 --- /dev/null +++ b/frontend/src/app/components/rbf-list/rbf-list.component.ts @@ -0,0 +1,86 @@ +import { Component, OnInit, ChangeDetectionStrategy, OnDestroy } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { BehaviorSubject, EMPTY, merge, Observable, Subscription } from 'rxjs'; +import { catchError, switchMap, tap } from 'rxjs/operators'; +import { WebsocketService } from 'src/app/services/websocket.service'; +import { RbfInfo } from '../../interfaces/node-api.interface'; +import { ApiService } from '../../services/api.service'; +import { StateService } from '../../services/state.service'; + +@Component({ + selector: 'app-rbf-list', + templateUrl: './rbf-list.component.html', + styleUrls: ['./rbf-list.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RbfList implements OnInit, OnDestroy { + rbfChains$: Observable; + fromChainSubject = new BehaviorSubject(null); + urlFragmentSubscription: Subscription; + fullRbfEnabled: boolean; + fullRbf: boolean; + isLoading = true; + firstChainId: string; + lastChainId: string; + + constructor( + private route: ActivatedRoute, + private router: Router, + private apiService: ApiService, + public stateService: StateService, + private websocketService: WebsocketService, + ) { + this.fullRbfEnabled = stateService.env.FULL_RBF_ENABLED; + } + + ngOnInit(): void { + this.urlFragmentSubscription = this.route.fragment.subscribe((fragment) => { + this.fullRbf = (fragment === 'fullrbf'); + this.websocketService.startTrackRbf(this.fullRbf ? 'fullRbf' : 'all'); + this.fromChainSubject.next(this.firstChainId); + }); + + this.rbfChains$ = merge( + this.fromChainSubject.pipe( + switchMap((fromChainId) => { + return this.apiService.getRbfList$(this.fullRbf, fromChainId || undefined) + }), + catchError((e) => { + return EMPTY; + }) + ), + this.stateService.rbfLatest$ + ) + .pipe( + tap((result: RbfInfo[][]) => { + this.isLoading = false; + if (result && result.length && result[0].length) { + this.lastChainId = result[result.length - 1][0].tx.txid; + } + }) + ); + } + + toggleFullRbf(event) { + this.router.navigate([], { + relativeTo: this.route, + fragment: this.fullRbf ? null : 'fullrbf' + }); + } + + isFullRbf(chain: RbfInfo[]): boolean { + return chain.slice(0, -1).some(entry => !entry.tx.rbf); + } + + isMined(chain: RbfInfo[]): boolean { + return chain.some(entry => entry.mined); + } + + // pageChange(page: number) { + // this.fromChainSubject.next(this.lastChainId); + // } + + ngOnDestroy(): void { + this.websocketService.stopTrackRbf(); + } +} \ No newline at end of file diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html index a7b96f000..13f5a567c 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html @@ -1,4 +1,4 @@ -
    +
    @@ -15,7 +15,7 @@
    -
    +
    diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss index af0e75744..1be6a7628 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss @@ -126,6 +126,12 @@ } } + &.mined { + .shape-border { + background: #1a9436; + } + } + .shape-border:hover { padding: 0px; .shape { diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts index b053158b4..0b65f703b 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts @@ -12,6 +12,7 @@ import { ApiService } from '../../services/api.service'; export class RbfTimelineComponent implements OnInit, OnChanges { @Input() replacements: RbfInfo[]; @Input() txid: string; + mined: boolean; dir: 'rtl' | 'ltr' = 'ltr'; @@ -27,10 +28,10 @@ export class RbfTimelineComponent implements OnInit, OnChanges { } ngOnInit(): void { - + this.mined = this.replacements.some(entry => entry.mined); } ngOnChanges(): void { - + this.mined = this.replacements.some(entry => entry.mined); } } diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 442fb73ce..420c8bdaf 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -28,7 +28,8 @@ export interface CpfpInfo { export interface RbfInfo { tx: RbfTransaction, - time: number + time: number, + mined?: boolean, } export interface DifficultyAdjustment { diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index aa0834cf8..c7e2f60fd 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -17,6 +17,7 @@ export interface WebsocketResponse { rbfTransaction?: ReplacedTransaction; txReplaced?: ReplacedTransaction; rbfInfo?: RbfInfo[]; + rbfLatest?: RbfInfo[][]; utxoSpent?: object; transactions?: TransactionStripped[]; loadingIndicators?: ILoadingIndicators; @@ -27,6 +28,7 @@ export interface WebsocketResponse { 'track-address'?: string; 'track-asset'?: string; 'track-mempool-block'?: number; + 'track-rbf'?: string; 'watch-mempool'?: boolean; 'track-bisq-market'?: string; } diff --git a/frontend/src/app/services/api.service.ts b/frontend/src/app/services/api.service.ts index fda957a8a..bdba538ef 100644 --- a/frontend/src/app/services/api.service.ts +++ b/frontend/src/app/services/api.service.ts @@ -132,6 +132,10 @@ export class ApiService { return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/tx/' + txid + '/cached'); } + getRbfList$(fullRbf: boolean, after?: string): Observable { + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/' + (fullRbf ? 'fullrbf/' : '') + 'replacements/' + (after || '')); + } + listLiquidPegsMonth$(): Observable { return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/liquid/pegs/month'); } diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index dbb269945..1b0a65d95 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -99,6 +99,7 @@ export class StateService { mempoolBlockDelta$ = new Subject(); txReplaced$ = new Subject(); txRbfInfo$ = new Subject(); + rbfLatest$ = new Subject(); utxoSpent$ = new Subject(); difficultyAdjustment$ = new ReplaySubject(1); mempoolTransactions$ = new Subject(); diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index 826716db2..9e473d24c 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -28,6 +28,7 @@ export class WebsocketService { private isTrackingTx = false; private trackingTxId: string; private isTrackingMempoolBlock = false; + private isTrackingRbf = false; private trackingMempoolBlock: number; private latestGitCommit = ''; private onlineCheckTimeout: number; @@ -173,6 +174,16 @@ export class WebsocketService { this.isTrackingMempoolBlock = false } + startTrackRbf(mode: 'all' | 'fullRbf') { + this.websocketSubject.next({ 'track-rbf': mode }); + this.isTrackingRbf = true; + } + + stopTrackRbf() { + this.websocketSubject.next({ 'track-rbf': 'stop' }); + this.isTrackingRbf = false; + } + startTrackBisqMarket(market: string) { this.websocketSubject.next({ 'track-bisq-market': market }); } @@ -261,6 +272,10 @@ export class WebsocketService { this.stateService.txRbfInfo$.next(response.rbfInfo); } + if (response.rbfLatest) { + this.stateService.rbfLatest$.next(response.rbfLatest); + } + if (response.txReplaced) { this.stateService.txReplaced$.next(response.txReplaced); } diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 7313ec8e3..ec601964a 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -4,7 +4,7 @@ import { NgbCollapseModule, NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstra import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome'; import { faFilter, faAngleDown, faAngleUp, faAngleRight, faAngleLeft, faBolt, faChartArea, faCogs, faCubes, faHammer, faDatabase, faExchangeAlt, faInfoCircle, faLink, faList, faSearch, faCaretUp, faCaretDown, faTachometerAlt, faThList, faTint, faTv, faAngleDoubleDown, faSortUp, faAngleDoubleUp, faChevronDown, - faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload, faQrcode, faArrowRightArrowLeft, faArrowsRotate, faCircleLeft } from '@fortawesome/free-solid-svg-icons'; + faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload, faQrcode, faArrowRightArrowLeft, faArrowRight, faArrowsRotate, faCircleLeft } from '@fortawesome/free-solid-svg-icons'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { MasterPageComponent } from '../components/master-page/master-page.component'; import { PreviewTitleComponent } from '../components/master-page-preview/preview-title.component'; @@ -73,6 +73,7 @@ import { AssetCirculationComponent } from '../components/asset-circulation/asset import { AmountShortenerPipe } from '../shared/pipes/amount-shortener.pipe'; import { DifficultyAdjustmentsTable } from '../components/difficulty-adjustments-table/difficulty-adjustments-table.components'; import { BlocksList } from '../components/blocks-list/blocks-list.component'; +import { RbfList } from '../components/rbf-list/rbf-list.component'; import { RewardStatsComponent } from '../components/reward-stats/reward-stats.component'; import { DataCyDirective } from '../data-cy.directive'; import { LoadingIndicatorComponent } from '../components/loading-indicator/loading-indicator.component'; @@ -153,6 +154,7 @@ import { TestnetAlertComponent } from './components/testnet-alert/testnet-alert. AmountShortenerPipe, DifficultyAdjustmentsTable, BlocksList, + RbfList, DataCyDirective, RewardStatsComponent, LoadingIndicatorComponent, @@ -313,6 +315,7 @@ export class SharedModule { library.addIcons(faDownload); library.addIcons(faQrcode); library.addIcons(faArrowRightArrowLeft); + library.addIcons(faArrowRight); library.addIcons(faExchangeAlt); } } From c064ef6acea30bc3f3408c86649b46731710caab Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 14 Dec 2022 17:03:02 -0600 Subject: [PATCH 240/782] remove 'replaces' alert on transaction page --- .../app/components/transaction/transaction.component.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 1710b538f..ffd3c93bf 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -6,13 +6,6 @@ - -

    Transaction

    From 086b41d9582661433d9515bf4122e2d51ee3e0e3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 17 Dec 2022 09:39:06 -0600 Subject: [PATCH 241/782] support trees of RBF replacements --- backend/src/api/bitcoin/bitcoin.routes.ts | 6 +- backend/src/api/common.ts | 14 +- backend/src/api/mempool.ts | 10 +- backend/src/api/rbf-cache.ts | 197 +++++++++++------- backend/src/api/websocket-handler.ts | 20 +- .../rbf-list/rbf-list.component.html | 33 +-- .../rbf-list/rbf-list.component.scss | 22 +- .../components/rbf-list/rbf-list.component.ts | 33 ++- .../rbf-timeline/rbf-timeline.component.html | 73 ++++--- .../rbf-timeline/rbf-timeline.component.scss | 38 +++- .../rbf-timeline/rbf-timeline.component.ts | 138 +++++++++++- .../transaction/transaction.component.html | 2 +- .../transaction/transaction.component.ts | 8 +- .../src/app/interfaces/node-api.interface.ts | 13 +- .../src/app/interfaces/websocket.interface.ts | 6 +- frontend/src/app/services/api.service.ts | 10 +- frontend/src/app/services/state.service.ts | 6 +- frontend/src/app/shared/shared.module.ts | 3 +- 18 files changed, 413 insertions(+), 219 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index c01a6170f..18d688e9b 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -644,7 +644,7 @@ class BitcoinRoutes { private async getRbfHistory(req: Request, res: Response) { try { - const replacements = rbfCache.getRbfChain(req.params.txId) || []; + const replacements = rbfCache.getRbfTree(req.params.txId) || null; const replaces = rbfCache.getReplaces(req.params.txId) || null; res.json({ replacements, @@ -657,7 +657,7 @@ class BitcoinRoutes { private async getRbfReplacements(req: Request, res: Response) { try { - const result = rbfCache.getRbfChains(false); + const result = rbfCache.getRbfTrees(false); res.json(result); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); @@ -666,7 +666,7 @@ class BitcoinRoutes { private async getFullRbfReplacements(req: Request, res: Response) { try { - const result = rbfCache.getRbfChains(true); + const result = rbfCache.getRbfTrees(true); res.json(result); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index 1d3b11d66..8bae655e3 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -57,11 +57,11 @@ export class Common { return arr; } - static findRbfTransactions(added: TransactionExtended[], deleted: TransactionExtended[]): { [txid: string]: TransactionExtended } { - const matches: { [txid: string]: TransactionExtended } = {}; - deleted - .forEach((deletedTx) => { - const foundMatches = added.find((addedTx) => { + static findRbfTransactions(added: TransactionExtended[], deleted: TransactionExtended[]): { [txid: string]: TransactionExtended[] } { + const matches: { [txid: string]: TransactionExtended[] } = {}; + added + .forEach((addedTx) => { + const foundMatches = deleted.filter((deletedTx) => { // The new tx must, absolutely speaking, pay at least as much fee as the replaced tx. return addedTx.fee > deletedTx.fee // The new transaction must pay more fee per kB than the replaced tx. @@ -70,8 +70,8 @@ export class Common { && deletedTx.vin.some((deletedVin) => addedTx.vin.some((vin) => vin.txid === deletedVin.txid && vin.vout === deletedVin.vout)); }); - if (foundMatches) { - matches[deletedTx.txid] = foundMatches; + if (foundMatches?.length) { + matches[addedTx.txid] = foundMatches; } }); return matches; diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 8b2728c1c..d476d6bca 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -265,13 +265,15 @@ class Mempool { } } - public handleRbfTransactions(rbfTransactions: { [txid: string]: TransactionExtended; }) { + public handleRbfTransactions(rbfTransactions: { [txid: string]: TransactionExtended[]; }): void { for (const rbfTransaction in rbfTransactions) { - if (this.mempoolCache[rbfTransaction]) { + if (this.mempoolCache[rbfTransaction] && rbfTransactions[rbfTransaction]?.length) { // Store replaced transactions - rbfCache.add(this.mempoolCache[rbfTransaction], rbfTransactions[rbfTransaction]); + rbfCache.add(rbfTransactions[rbfTransaction], this.mempoolCache[rbfTransaction]); // Erase the replaced transactions from the local mempool - delete this.mempoolCache[rbfTransaction]; + for (const replaced of rbfTransactions[rbfTransaction]) { + delete this.mempoolCache[replaced.txid]; + } } } } diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 17eb53e12..3377999f8 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -1,22 +1,27 @@ +import { runInNewContext } from "vm"; import { TransactionExtended, TransactionStripped } from "../mempool.interfaces"; import { Common } from "./common"; interface RbfTransaction extends TransactionStripped { rbf?: boolean; + mined?: boolean; } -type RbfChain = { - tx: RbfTransaction, - time: number, - mined?: boolean, -}[]; +interface RbfTree { + tx: RbfTransaction; + time: number; + interval?: number; + mined?: boolean; + fullRbf: boolean; + replaces: RbfTree[]; +} class RbfCache { private replacedBy: Map = new Map(); private replaces: Map = new Map(); - private rbfChains: Map = new Map(); // sequences of consecutive replacements - private dirtyChains: Set = new Set(); - private chainMap: Map = new Map(); // map of txids to sequence ids + private rbfTrees: Map = new Map(); // sequences of consecutive replacements + private dirtyTrees: Set = new Set(); + private treeMap: Map = new Map(); // map of txids to sequence ids private txs: Map = new Map(); private expiring: Map = new Map(); @@ -24,37 +29,58 @@ class RbfCache { setInterval(this.cleanup.bind(this), 1000 * 60 * 60); } - public add(replacedTxExtended: TransactionExtended, newTxExtended: TransactionExtended): void { - const replacedTx = Common.stripTransaction(replacedTxExtended) as RbfTransaction; - replacedTx.rbf = replacedTxExtended.vin.some((v) => v.sequence < 0xfffffffe); + public add(replaced: TransactionExtended[], newTxExtended: TransactionExtended): void { + if (!newTxExtended || !replaced?.length) { + return; + } + const newTx = Common.stripTransaction(newTxExtended) as RbfTransaction; + const newTime = newTxExtended.firstSeen || Date.now(); newTx.rbf = newTxExtended.vin.some((v) => v.sequence < 0xfffffffe); - - this.replacedBy.set(replacedTx.txid, newTx.txid); - this.txs.set(replacedTx.txid, replacedTxExtended); this.txs.set(newTx.txid, newTxExtended); - if (!this.replaces.has(newTx.txid)) { - this.replaces.set(newTx.txid, []); - } - this.replaces.get(newTx.txid)?.push(replacedTx.txid); - // maintain rbf chains - if (this.chainMap.has(replacedTx.txid)) { - // add to an existing chain - const chainRoot = this.chainMap.get(replacedTx.txid) || ''; - this.rbfChains.get(chainRoot)?.push({ tx: newTx, time: newTxExtended.firstSeen || Date.now() }); - this.chainMap.set(newTx.txid, chainRoot); - this.dirtyChains.add(chainRoot); - } else { - // start a new chain - this.rbfChains.set(replacedTx.txid, [ - { tx: replacedTx, time: replacedTxExtended.firstSeen || Date.now() }, - { tx: newTx, time: newTxExtended.firstSeen || Date.now() }, - ]); - this.chainMap.set(replacedTx.txid, replacedTx.txid); - this.chainMap.set(newTx.txid, replacedTx.txid); - this.dirtyChains.add(replacedTx.txid); + // maintain rbf trees + let fullRbf = false; + const replacedTrees: RbfTree[] = []; + for (const replacedTxExtended of replaced) { + const replacedTx = Common.stripTransaction(replacedTxExtended) as RbfTransaction; + replacedTx.rbf = replacedTxExtended.vin.some((v) => v.sequence < 0xfffffffe); + this.replacedBy.set(replacedTx.txid, newTx.txid); + if (this.treeMap.has(replacedTx.txid)) { + const treeId = this.treeMap.get(replacedTx.txid); + if (treeId) { + const tree = this.rbfTrees.get(treeId); + this.rbfTrees.delete(treeId); + if (tree) { + tree.interval = newTime - tree?.time; + replacedTrees.push(tree); + fullRbf = fullRbf || tree.fullRbf; + } + } + } else { + const replacedTime = replacedTxExtended.firstSeen || Date.now(); + replacedTrees.push({ + tx: replacedTx, + time: replacedTime, + interval: newTime - replacedTime, + fullRbf: !replacedTx.rbf, + replaces: [], + }); + fullRbf = fullRbf || !replacedTx.rbf; + this.txs.set(replacedTx.txid, replacedTxExtended); + } } + const treeId = replacedTrees[0].tx.txid; + const newTree = { + tx: newTx, + time: newTxExtended.firstSeen || Date.now(), + fullRbf, + replaces: replacedTrees + }; + this.rbfTrees.set(treeId, newTree); + this.updateTreeMap(treeId, newTree); + this.replaces.set(newTx.txid, replacedTrees.map(tree => tree.tx.txid)); + this.dirtyTrees.add(treeId); } public getReplacedBy(txId: string): string | undefined { @@ -69,66 +95,64 @@ class RbfCache { return this.txs.get(txId); } - public getRbfChain(txId: string): RbfChain { - return this.rbfChains.get(this.chainMap.get(txId) || '') || []; + public getRbfTree(txId: string): RbfTree | void { + return this.rbfTrees.get(this.treeMap.get(txId) || ''); } - // get a paginated list of RbfChains + // get a paginated list of RbfTrees // ordered by most recent replacement time - public getRbfChains(onlyFullRbf: boolean, after?: string): RbfChain[] { + public getRbfTrees(onlyFullRbf: boolean, after?: string): RbfTree[] { const limit = 25; - const chains: RbfChain[] = []; + const trees: RbfTree[] = []; const used = new Set(); const replacements: string[][] = Array.from(this.replacedBy).reverse(); - const afterChain = after ? this.chainMap.get(after) : null; - let ready = !afterChain; - for (let i = 0; i < replacements.length && chains.length <= limit - 1; i++) { + const afterTree = after ? this.treeMap.get(after) : null; + let ready = !afterTree; + for (let i = 0; i < replacements.length && trees.length <= limit - 1; i++) { const txid = replacements[i][1]; - const chainRoot = this.chainMap.get(txid) || ''; - if (chainRoot === afterChain) { + const treeId = this.treeMap.get(txid) || ''; + if (treeId === afterTree) { ready = true; } else if (ready) { - if (!used.has(chainRoot)) { - const chain = this.rbfChains.get(chainRoot); - used.add(chainRoot); - if (chain && (!onlyFullRbf || chain.slice(0, -1).some(entry => !entry.tx.rbf))) { - chains.push(chain); + if (!used.has(treeId)) { + const tree = this.rbfTrees.get(treeId); + used.add(treeId); + if (tree && (!onlyFullRbf || tree.fullRbf)) { + trees.push(tree); } } } } - return chains; + return trees; } - // get map of rbf chains that have been updated since the last call - public getRbfChanges(): { chains: {[root: string]: RbfChain }, map: { [txid: string]: string }} { - const changes: { chains: {[root: string]: RbfChain }, map: { [txid: string]: string }} = { - chains: {}, + // get map of rbf trees that have been updated since the last call + public getRbfChanges(): { trees: {[id: string]: RbfTree }, map: { [txid: string]: string }} { + const changes: { trees: {[id: string]: RbfTree }, map: { [txid: string]: string }} = { + trees: {}, map: {}, }; - this.dirtyChains.forEach(root => { - const chain = this.rbfChains.get(root); - if (chain) { - changes.chains[root] = chain; - chain.forEach(entry => { - changes.map[entry.tx.txid] = root; + this.dirtyTrees.forEach(id => { + const tree = this.rbfTrees.get(id); + if (tree) { + changes.trees[id] = tree; + this.getTransactionsInTree(tree).forEach(tx => { + changes.map[tx.txid] = id; }); } }); - this.dirtyChains = new Set(); + this.dirtyTrees = new Set(); return changes; } public mined(txid): void { - const chainRoot = this.chainMap.get(txid) - if (chainRoot && this.rbfChains.has(chainRoot)) { - const chain = this.rbfChains.get(chainRoot); - if (chain) { - const chainEntry = chain.find(entry => entry.tx.txid === txid); - if (chainEntry) { - chainEntry.mined = true; - } - this.dirtyChains.add(chainRoot); + const treeId = this.treeMap.get(txid); + if (treeId && this.rbfTrees.has(treeId)) { + const tree = this.rbfTrees.get(treeId); + if (tree) { + this.setTreeMined(tree, txid); + tree.mined = true; + this.dirtyTrees.add(treeId); } } this.evict(txid); @@ -155,20 +179,45 @@ class RbfCache { if (!this.replacedBy.has(txid)) { const replaces = this.replaces.get(txid); this.replaces.delete(txid); - this.chainMap.delete(txid); + this.treeMap.delete(txid); this.txs.delete(txid); this.expiring.delete(txid); for (const tx of (replaces || [])) { // recursively remove prior versions from the cache this.replacedBy.delete(tx); - // if this is the root of a chain, remove that too - if (this.chainMap.get(tx) === tx) { - this.rbfChains.delete(tx); + // if this is the id of a tree, remove that too + if (this.treeMap.get(tx) === tx) { + this.rbfTrees.delete(tx); } this.remove(tx); } } } + + private updateTreeMap(newId: string, tree: RbfTree): void { + this.treeMap.set(tree.tx.txid, newId); + tree.replaces.forEach(subtree => { + this.updateTreeMap(newId, subtree); + }); + } + + private getTransactionsInTree(tree: RbfTree, txs: RbfTransaction[] = []): RbfTransaction[] { + txs.push(tree.tx); + tree.replaces.forEach(subtree => { + this.getTransactionsInTree(subtree, txs); + }); + return txs; + } + + private setTreeMined(tree: RbfTree, txid: string): void { + if (tree.tx.txid === txid) { + tree.tx.mined = true; + } else { + tree.replaces.forEach(subtree => { + this.setTreeMined(subtree, txid); + }); + } + } } export default new RbfCache(); diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 71ed473a8..33649b5c2 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -289,9 +289,9 @@ class WebsocketHandler { const rbfChanges = rbfCache.getRbfChanges(); let rbfReplacements; let fullRbfReplacements; - if (Object.keys(rbfChanges.chains).length) { - rbfReplacements = rbfCache.getRbfChains(false); - fullRbfReplacements = rbfCache.getRbfChains(true); + if (Object.keys(rbfChanges.trees).length) { + rbfReplacements = rbfCache.getRbfTrees(false); + fullRbfReplacements = rbfCache.getRbfTrees(true); } const recommendedFees = feeApi.getRecommendedFee(); @@ -415,20 +415,16 @@ class WebsocketHandler { response['utxoSpent'] = outspends; } - if (rbfTransactions[client['track-tx']]) { - for (const rbfTransaction in rbfTransactions) { - if (client['track-tx'] === rbfTransaction) { - response['rbfTransaction'] = { - txid: rbfTransactions[rbfTransaction].txid, - }; - break; - } + const rbfReplacedBy = rbfCache.getReplacedBy(client['track-tx']); + if (rbfReplacedBy) { + response['rbfTransaction'] = { + txid: rbfReplacedBy, } } const rbfChange = rbfChanges.map[client['track-tx']]; if (rbfChange) { - response['rbfInfo'] = rbfChanges.chains[rbfChange]; + response['rbfInfo'] = rbfChanges.trees[rbfChange]; } } diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.html b/frontend/src/app/components/rbf-list/rbf-list.component.html index 427ab3acf..eebb7e152 100644 --- a/frontend/src/app/components/rbf-list/rbf-list.component.html +++ b/frontend/src/app/components/rbf-list/rbf-list.component.html @@ -17,37 +17,22 @@
    -
    - -
    +
    + +

    - - Mined - Full RBF + Mined + Full RBF +

    - -
    - +
    +
    -
    +

    there are no replacements in the mempool yet!

    diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.scss b/frontend/src/app/components/rbf-list/rbf-list.component.scss index fa8ebc1f1..792bb8836 100644 --- a/frontend/src/app/components/rbf-list/rbf-list.component.scss +++ b/frontend/src/app/components/rbf-list/rbf-list.component.scss @@ -4,13 +4,14 @@ margin-top: 13px; } -.rbf-chains { +.rbf-trees { .info { display: flex; flex-direction: row; justify-content: space-between; align-items: baseline; margin: 0; + margin-bottom: 0.5em; .type { .badge { @@ -19,27 +20,10 @@ } } - .chain { + .tree { margin-bottom: 1em; } - .txids { - display: flex; - flex-direction: row; - align-items: baseline; - justify-content: space-between; - margin-bottom: 2px; - - .txid { - flex-basis: 0; - flex-grow: 1; - - &.right { - text-align: right; - } - } - } - .timeline-wrapper.mined { border: solid 4px #1a9436; } diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.ts b/frontend/src/app/components/rbf-list/rbf-list.component.ts index b40dbaf16..a86dbcd1a 100644 --- a/frontend/src/app/components/rbf-list/rbf-list.component.ts +++ b/frontend/src/app/components/rbf-list/rbf-list.component.ts @@ -3,7 +3,7 @@ import { ActivatedRoute, Router } from '@angular/router'; import { BehaviorSubject, EMPTY, merge, Observable, Subscription } from 'rxjs'; import { catchError, switchMap, tap } from 'rxjs/operators'; import { WebsocketService } from 'src/app/services/websocket.service'; -import { RbfInfo } from '../../interfaces/node-api.interface'; +import { RbfTree } from '../../interfaces/node-api.interface'; import { ApiService } from '../../services/api.service'; import { StateService } from '../../services/state.service'; @@ -14,14 +14,12 @@ import { StateService } from '../../services/state.service'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class RbfList implements OnInit, OnDestroy { - rbfChains$: Observable; - fromChainSubject = new BehaviorSubject(null); + rbfTrees$: Observable; + nextRbfSubject = new BehaviorSubject(null); urlFragmentSubscription: Subscription; fullRbfEnabled: boolean; fullRbf: boolean; isLoading = true; - firstChainId: string; - lastChainId: string; constructor( private route: ActivatedRoute, @@ -37,13 +35,13 @@ export class RbfList implements OnInit, OnDestroy { this.urlFragmentSubscription = this.route.fragment.subscribe((fragment) => { this.fullRbf = (fragment === 'fullrbf'); this.websocketService.startTrackRbf(this.fullRbf ? 'fullRbf' : 'all'); - this.fromChainSubject.next(this.firstChainId); + this.nextRbfSubject.next(null); }); - this.rbfChains$ = merge( - this.fromChainSubject.pipe( - switchMap((fromChainId) => { - return this.apiService.getRbfList$(this.fullRbf, fromChainId || undefined) + this.rbfTrees$ = merge( + this.nextRbfSubject.pipe( + switchMap(() => { + return this.apiService.getRbfList$(this.fullRbf); }), catchError((e) => { return EMPTY; @@ -52,11 +50,8 @@ export class RbfList implements OnInit, OnDestroy { this.stateService.rbfLatest$ ) .pipe( - tap((result: RbfInfo[][]) => { + tap(() => { this.isLoading = false; - if (result && result.length && result[0].length) { - this.lastChainId = result[result.length - 1][0].tx.txid; - } }) ); } @@ -68,16 +63,16 @@ export class RbfList implements OnInit, OnDestroy { }); } - isFullRbf(chain: RbfInfo[]): boolean { - return chain.slice(0, -1).some(entry => !entry.tx.rbf); + isFullRbf(tree: RbfTree): boolean { + return tree.fullRbf; } - isMined(chain: RbfInfo[]): boolean { - return chain.some(entry => entry.mined); + isMined(tree: RbfTree): boolean { + return tree.mined; } // pageChange(page: number) { - // this.fromChainSubject.next(this.lastChainId); + // this.fromTreeSubject.next(this.lastTreeId); // } ngOnDestroy(): void { diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html index 13f5a567c..069d63357 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html @@ -1,31 +1,54 @@ -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - -
    -
    - {{ replacement.tx.fee / (replacement.tx.vsize) | feeRounding }} sat/vB -
    -
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + {{ cell.replacement.tx.fee / (cell.replacement.tx.vsize) | feeRounding }} sat/vB +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    + + + + + +
    \ No newline at end of file diff --git a/frontend/src/app/components/clock-face/clock-face.component.scss b/frontend/src/app/components/clock-face/clock-face.component.scss index 60b2c4eba..d671341a6 100644 --- a/frontend/src/app/components/clock-face/clock-face.component.scss +++ b/frontend/src/app/components/clock-face/clock-face.component.scss @@ -17,4 +17,52 @@ fill: #11131f; } } + + .gnomon { + transform-origin: center; + stroke-linejoin: round; + + &.minute { + fill:#80C2E1; + stroke:#80C2E1; + stroke-width: 2px; + } + + &.hour { + fill: #105fb0; + stroke: #105fb0; + stroke-width: 6px; + } + } + + .tick { + transform-origin: center; + fill: none; + stroke: white; + stroke-width: 2px; + + &.minor { + stroke-opacity: 0.5; + } + + &.very.major { + stroke-width: 4px; + } + } + + .block-segment { + fill: none; + stroke: url(#dial-gradient); + stroke-width: 18px; + } + + .dial-segment { + fill: none; + stroke: white; + stroke-width: 2px; + } + + .dial-gradient-img { + transform-origin: center; + } } \ No newline at end of file diff --git a/frontend/src/app/components/clock-face/clock-face.component.ts b/frontend/src/app/components/clock-face/clock-face.component.ts index c63ea56ea..9c373a50d 100644 --- a/frontend/src/app/components/clock-face/clock-face.component.ts +++ b/frontend/src/app/components/clock-face/clock-face.component.ts @@ -1,15 +1,55 @@ -import { Component, Input, OnChanges } from '@angular/core'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; +import { Subscription, tap, timer } from 'rxjs'; +import { WebsocketService } from '../../services/websocket.service'; +import { StateService } from '../../services/state.service'; @Component({ selector: 'app-clock-face', templateUrl: './clock-face.component.html', styleUrls: ['./clock-face.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class ClockFaceComponent implements OnChanges { +export class ClockFaceComponent implements OnInit, OnChanges, OnDestroy { @Input() size: number = 300; - faceStyle; - constructor() {} + blocksSubscription: Subscription; + timeSubscription: Subscription; + + faceStyle; + dialPath; + blockTimes = []; + segments = []; + hours: number = 0; + minutes: number = 0; + minorTicks: number[] = []; + majorTicks: number[] = []; + + constructor( + public stateService: StateService, + private websocketService: WebsocketService, + private cd: ChangeDetectorRef + ) { + this.updateTime(); + this.makeTicks(); + } + + ngOnInit(): void { + this.timeSubscription = timer(0, 250).pipe( + tap(() => { + this.updateTime(); + }) + ).subscribe(); + this.websocketService.want(['blocks']); + this.blocksSubscription = this.stateService.blocks$ + .subscribe(([block]) => { + if (block) { + this.blockTimes.push([block.height, new Date(block.timestamp * 1000)]); + // using block-reported times, so ensure they are sorted chronologically + this.blockTimes = this.blockTimes.sort((a, b) => a[1].getTime() - b[1].getTime()); + this.updateSegments(); + } + }); + } ngOnChanges(): void { this.faceStyle = { @@ -17,4 +57,93 @@ export class ClockFaceComponent implements OnChanges { height: `${this.size}px`, }; } + + ngOnDestroy(): void { + this.timeSubscription.unsubscribe(); + } + + updateTime(): void { + const now = new Date(); + const seconds = now.getSeconds() + (now.getMilliseconds() / 1000); + this.minutes = (now.getMinutes() + (seconds / 60)) % 60; + this.hours = now.getHours() + (this.minutes / 60); + this.updateSegments(); + } + + updateSegments(): void { + const now = new Date(); + this.blockTimes = this.blockTimes.filter(time => (now.getTime() - time[1].getTime()) <= 3600000); + const tail = new Date(now.getTime() - 3600000); + const hourStart = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours()); + + const times = [ + ['start', tail], + ...this.blockTimes, + ['end', now], + ]; + const minuteTimes = times.map(time => { + return [time[0], (time[1].getTime() - hourStart.getTime()) / 60000]; + }); + this.segments = []; + const r = 174; + const cx = 192; + const cy = cx; + for (let i = 1; i < minuteTimes.length; i++) { + const arc = this.getArc(minuteTimes[i-1][1], minuteTimes[i][1], r, cx, cy); + if (arc) { + arc.id = minuteTimes[i][0]; + this.segments.push(arc); + } + } + const arc = this.getArc(minuteTimes[0][1], minuteTimes[1][1], r, cx, cy); + if (arc) { + this.dialPath = arc.path; + } + + this.cd.markForCheck(); + } + + getArc(startTime, endTime, r, cx, cy): any { + const startDegrees = (startTime + 0.2) * 6; + const endDegrees = (endTime - 0.2) * 6; + const start = this.getPointOnCircle(startDegrees, r, cx, cy); + const end = this.getPointOnCircle(endDegrees, r, cx, cy); + const arcLength = endDegrees - startDegrees; + // merge gaps and omit lines shorter than 1 degree + if (arcLength >= 1) { + const path = `M ${start.x} ${start.y} A ${r} ${r} 0 ${arcLength > 180 ? 1 : 0} 1 ${end.x} ${end.y}`; + return { + path, + start, + end + }; + } else { + return null; + } + } + + getPointOnCircle(deg, r, cx, cy) { + const modDeg = ((deg % 360) + 360) % 360; + const rad = (modDeg * Math.PI) / 180; + return { + x: cx + (r * Math.sin(rad)), + y: cy - (r * Math.cos(rad)), + }; + } + + makeTicks() { + this.minorTicks = []; + this.majorTicks = []; + for (let i = 1; i < 60; i++) { + if (i % 5 === 0) { + this.majorTicks.push(i * 6); + } else { + this.minorTicks.push(i * 6); + } + } + } + + trackBySegment(index: number, segment) { + return segment.id; + } } diff --git a/frontend/src/app/components/clock/clock.component.scss b/frontend/src/app/components/clock/clock.component.scss index e5904b4f1..a27c62499 100644 --- a/frontend/src/app/components/clock/clock.component.scss +++ b/frontend/src/app/components/clock/clock.component.scss @@ -84,7 +84,7 @@ right: 0; top: 0; bottom: 0; - background: radial-gradient(transparent 0%, transparent 48%, #11131f 62%, #11131f 100%); + background: radial-gradient(transparent 0%, transparent 44%, #11131f 58%, #11131f 100%); } .block-cube { diff --git a/frontend/src/app/components/clock/clock.component.ts b/frontend/src/app/components/clock/clock.component.ts index 7aa875695..c804860af 100644 --- a/frontend/src/app/components/clock/clock.component.ts +++ b/frontend/src/app/components/clock/clock.component.ts @@ -66,7 +66,7 @@ export class ClockComponent implements OnInit { resizeCanvas(): void { this.chainWidth = window.innerWidth; this.chainHeight = Math.max(60, window.innerHeight / 8); - this.clockSize = Math.min(500, window.innerWidth, window.innerHeight - (1.4 * this.chainHeight)); + this.clockSize = Math.min(800, window.innerWidth, window.innerHeight - (1.4 * this.chainHeight)); const size = Math.ceil(this.clockSize / 75) * 75; const margin = (this.clockSize - size) / 2; this.blockSizerStyle = { diff --git a/frontend/src/app/components/clockchain/clockchain.component.scss b/frontend/src/app/components/clockchain/clockchain.component.scss index 0b01adc26..acff1e725 100644 --- a/frontend/src/app/components/clockchain/clockchain.component.scss +++ b/frontend/src/app/components/clockchain/clockchain.component.scss @@ -1,6 +1,6 @@ .divider { position: absolute; - left: -1px; + left: -0.5px; top: 0; .divider-line { stroke: white; diff --git a/frontend/src/app/components/clockchain/clockchain.component.ts b/frontend/src/app/components/clockchain/clockchain.component.ts index addc22948..ab9220c54 100644 --- a/frontend/src/app/components/clockchain/clockchain.component.ts +++ b/frontend/src/app/components/clockchain/clockchain.component.ts @@ -39,8 +39,8 @@ export class ClockchainComponent implements OnInit, OnChanges, OnDestroy { }); this.connectionStateSubscription = this.stateService.connectionState$.subscribe(state => { this.connected = (state === 2); - }) - firstValueFrom(this.stateService.chainTip$).then(tip => { + }); + firstValueFrom(this.stateService.chainTip$).then(() => { this.loadingTip = false; }); } diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 6877823f5..6267eed21 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -27,7 +27,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { @Input() minimal: boolean = false; @Input() blockWidth: number = 125; @Input() count: number = null; - + specialBlocks = specialBlocks; mempoolBlocks: MempoolBlock[] = []; mempoolEmptyBlocks: MempoolBlock[] = this.mountEmptyBlocks(); diff --git a/frontend/src/resources/clock/gradient.png b/frontend/src/resources/clock/gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..372105fbd128b7428d4e31f393bc70587d0b44d3 GIT binary patch literal 38328 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

    141E;Qoq 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 literal 0 HcmV?d00001 From d3a7950e785801577edf5b22dc3f8b8cb4378590 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 19 Apr 2023 09:41:53 +0900 Subject: [PATCH 288/782] Add clock statistics --- .../clock-face/clock-face.component.scss | 1 + .../app/components/clock/clock.component.html | 28 ++++++++++++++++ .../app/components/clock/clock.component.scss | 33 +++++++++++++++++++ .../app/components/clock/clock.component.ts | 12 +++++-- frontend/src/styles.scss | 4 +++ 5 files changed, 75 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/clock-face/clock-face.component.scss b/frontend/src/app/components/clock-face/clock-face.component.scss index d671341a6..1ca2ce914 100644 --- a/frontend/src/app/components/clock-face/clock-face.component.scss +++ b/frontend/src/app/components/clock-face/clock-face.component.scss @@ -40,6 +40,7 @@ fill: none; stroke: white; stroke-width: 2px; + stroke-linecap: butt; &.minor { stroke-opacity: 0.5; diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index 74e06418d..ee62dd521 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -31,4 +31,32 @@

    +
    +

    fiat price

    +

    + +

    +
    +
    +

    priority rate

    +

    {{ recommendedFees.fastestFee }} sat/vB

    +
    +
    +

    +

    block size

    +
    +
    +

    {{ block.tx_count | number }}

    +

    transactions

    +
    + +
    +

    +

    memory usage

    +
    +
    +

    {{ mempoolInfo.size | number }}

    +

    unconfirmed

    +
    +
    \ No newline at end of file diff --git a/frontend/src/app/components/clock/clock.component.scss b/frontend/src/app/components/clock/clock.component.scss index a27c62499..3ccf6c0df 100644 --- a/frontend/src/app/components/clock/clock.component.scss +++ b/frontend/src/app/components/clock/clock.component.scss @@ -10,6 +10,7 @@ flex-direction: column; justify-content: flex-start; + --chain-height: 60px; --clock-width: 300px; .clockchain-bar, .clock-face { @@ -37,6 +38,38 @@ align-items: center; z-index: 1; } + + .stats { + position: absolute; + z-index: 3; + + p { + margin: 0; + font-size: calc(0.05 * var(--clock-width)); + line-height: calc(0.07 * var(--clock-width)); + opacity: 0.8; + + ::ng-deep .symbol { + font-size: inherit; + color: white; + } + } + + &.top { + top: calc(var(--chain-height) + 2%); + } + &.bottom { + bottom: 2%; + } + &.left { + left: 5%; + } + &.right { + right: 5%; + text-align: end; + text-align: right; + } + } } .title-wrapper { diff --git a/frontend/src/app/components/clock/clock.component.ts b/frontend/src/app/components/clock/clock.component.ts index c804860af..bc4e5625e 100644 --- a/frontend/src/app/components/clock/clock.component.ts +++ b/frontend/src/app/components/clock/clock.component.ts @@ -1,8 +1,9 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Input, OnInit } from '@angular/core'; -import { Subscription } from 'rxjs'; +import { Observable, Subscription } from 'rxjs'; import { StateService } from '../../services/state.service'; import { BlockExtended } from '../../interfaces/node-api.interface'; import { WebsocketService } from '../../services/websocket.service'; +import { MempoolInfo, Recommendedfees } from '../../interfaces/websocket.interface'; @Component({ selector: 'app-clock', @@ -11,8 +12,10 @@ import { WebsocketService } from '../../services/websocket.service'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class ClockComponent implements OnInit { - @Input() mode: string = 'block'; + @Input() mode: 'block' | 'mempool' = 'block'; blocksSubscription: Subscription; + recommendedFees$: Observable; + mempoolInfo$: Observable; block: BlockExtended; clockSize: number = 300; chainWidth: number = 384; @@ -47,6 +50,8 @@ export class ClockComponent implements OnInit { this.cd.markForCheck(); } }); + this.recommendedFees$ = this.stateService.recommendedFees$; + this.mempoolInfo$ = this.stateService.mempoolInfo$; } getStyleForBlock(block: BlockExtended) { @@ -75,7 +80,8 @@ export class ClockComponent implements OnInit { height: `${size}px`, }; this.wrapperStyle = { - '--clock-width': `${this.clockSize}px` + '--clock-width': `${this.clockSize}px`, + '--chain-height': `${this.chainHeight}px` }; this.cd.markForCheck(); } diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index fbaaa5ed2..e58bcdc6a 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -285,6 +285,10 @@ body { color: #fff; } +.white-color { + color: white; +} + .green-color { color: #3bcc49; } From 056d61a28d47a9008793b22409fe03ebc46c1b69 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 19 Apr 2023 10:09:44 +0900 Subject: [PATCH 289/782] clock i18n --- .../app/components/clock/clock.component.html | 19 +++++++++++-------- .../app/components/clock/clock.component.scss | 4 ++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index ee62dd521..c47133495 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -32,31 +32,34 @@
    -

    fiat price

    +

    fiat price

    -

    priority rate

    -

    {{ recommendedFees.fastestFee }} sat/vB

    +

    priority rate

    +

    {{ recommendedFees.fastestFee }} sat/vB

    -

    block size

    +

    block size

    -

    {{ block.tx_count | number }}

    -

    transactions

    +

    + + {{ i }} transaction + {{ i }} transactions +

    -

    memory usage

    +

    memory usage

    {{ mempoolInfo.size | number }}

    -

    unconfirmed

    +

    unconfirmed

    \ No newline at end of file diff --git a/frontend/src/app/components/clock/clock.component.scss b/frontend/src/app/components/clock/clock.component.scss index 3ccf6c0df..cffe3ee69 100644 --- a/frontend/src/app/components/clock/clock.component.scss +++ b/frontend/src/app/components/clock/clock.component.scss @@ -49,6 +49,10 @@ line-height: calc(0.07 * var(--clock-width)); opacity: 0.8; + &.force-wrap { + word-spacing: 1000px; + } + ::ng-deep .symbol { font-size: inherit; color: white; From fdb0cf509d99b851d8739d421935db051ce6534f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 20 Apr 2023 00:30:55 +0900 Subject: [PATCH 290/782] query param toggle for clock stats --- .../app/components/clock/clock.component.html | 58 ++++++++++--------- .../app/components/clock/clock.component.ts | 9 +++ 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index c47133495..e444664c9 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -31,35 +31,37 @@
    -
    -

    fiat price

    -

    - -

    -
    -
    -

    priority rate

    -

    {{ recommendedFees.fastestFee }} sat/vB

    -
    -
    -

    -

    block size

    -
    -
    -

    - - {{ i }} transaction - {{ i }} transactions -

    -
    - -
    -

    -

    memory usage

    + +
    +

    fiat price

    +

    + +

    -
    -

    {{ mempoolInfo.size | number }}

    -

    unconfirmed

    +
    +

    priority rate

    +

    {{ recommendedFees.fastestFee }} sat/vB

    +
    +

    +

    block size

    +
    +
    +

    + + {{ i }} transaction + {{ i }} transactions +

    +
    + +
    +

    +

    memory usage

    +
    +
    +

    {{ mempoolInfo.size | number }}

    +

    unconfirmed

    +
    +
    \ No newline at end of file diff --git a/frontend/src/app/components/clock/clock.component.ts b/frontend/src/app/components/clock/clock.component.ts index bc4e5625e..f66ba5c15 100644 --- a/frontend/src/app/components/clock/clock.component.ts +++ b/frontend/src/app/components/clock/clock.component.ts @@ -4,6 +4,7 @@ import { StateService } from '../../services/state.service'; import { BlockExtended } from '../../interfaces/node-api.interface'; import { WebsocketService } from '../../services/websocket.service'; import { MempoolInfo, Recommendedfees } from '../../interfaces/websocket.interface'; +import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-clock', @@ -13,6 +14,7 @@ import { MempoolInfo, Recommendedfees } from '../../interfaces/websocket.interfa }) export class ClockComponent implements OnInit { @Input() mode: 'block' | 'mempool' = 'block'; + hideStats: boolean = false; blocksSubscription: Subscription; recommendedFees$: Observable; mempoolInfo$: Observable; @@ -36,12 +38,18 @@ export class ClockComponent implements OnInit { constructor( public stateService: StateService, private websocketService: WebsocketService, + private route: ActivatedRoute, private cd: ChangeDetectorRef, ) {} ngOnInit(): void { this.resizeCanvas(); this.websocketService.want(['blocks']); + + this.route.queryParams.subscribe((params) => { + this.hideStats = params && params.stats === 'false'; + }); + this.blocksSubscription = this.stateService.blocks$ .subscribe(([block]) => { if (block) { @@ -50,6 +58,7 @@ export class ClockComponent implements OnInit { this.cd.markForCheck(); } }); + this.recommendedFees$ = this.stateService.recommendedFees$; this.mempoolInfo$ = this.stateService.mempoolInfo$; } From 1fccd70379efb0919147ed23b63f4a8f36e61443 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 20 Apr 2023 05:30:24 +0900 Subject: [PATCH 291/782] clock size query params --- .../app/components/clock/clock.component.ts | 26 ++++++++++++------- .../clockchain/clockchain.component.html | 5 +++- .../clockchain/clockchain.component.scss | 3 +-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/frontend/src/app/components/clock/clock.component.ts b/frontend/src/app/components/clock/clock.component.ts index f66ba5c15..dea2de4c8 100644 --- a/frontend/src/app/components/clock/clock.component.ts +++ b/frontend/src/app/components/clock/clock.component.ts @@ -25,6 +25,8 @@ export class ClockComponent implements OnInit { blockStyle; blockSizerStyle; wrapperStyle; + limitWidth: number; + limitHeight: number; gradientColors = { '': ['#9339f4', '#105fb0'], @@ -40,16 +42,18 @@ export class ClockComponent implements OnInit { private websocketService: WebsocketService, private route: ActivatedRoute, private cd: ChangeDetectorRef, - ) {} + ) { + this.route.queryParams.subscribe((params) => { + this.hideStats = params && params.stats === 'false'; + this.limitWidth = Number.parseInt(params.width) || null; + this.limitHeight = Number.parseInt(params.height) || null; + }); + } ngOnInit(): void { this.resizeCanvas(); this.websocketService.want(['blocks']); - this.route.queryParams.subscribe((params) => { - this.hideStats = params && params.stats === 'false'; - }); - this.blocksSubscription = this.stateService.blocks$ .subscribe(([block]) => { if (block) { @@ -78,9 +82,11 @@ export class ClockComponent implements OnInit { @HostListener('window:resize', ['$event']) resizeCanvas(): void { - this.chainWidth = window.innerWidth; - this.chainHeight = Math.max(60, window.innerHeight / 8); - this.clockSize = Math.min(800, window.innerWidth, window.innerHeight - (1.4 * this.chainHeight)); + const windowWidth = this.limitWidth || window.innerWidth; + const windowHeight = this.limitHeight || window.innerHeight; + this.chainWidth = windowWidth; + this.chainHeight = Math.max(60, windowHeight / 8); + this.clockSize = Math.min(800, windowWidth, windowHeight - (1.4 * this.chainHeight)); const size = Math.ceil(this.clockSize / 75) * 75; const margin = (this.clockSize - size) / 2; this.blockSizerStyle = { @@ -90,7 +96,9 @@ export class ClockComponent implements OnInit { }; this.wrapperStyle = { '--clock-width': `${this.clockSize}px`, - '--chain-height': `${this.chainHeight}px` + '--chain-height': `${this.chainHeight}px`, + 'width': this.limitWidth ? `${this.limitWidth}px` : undefined, + 'height': this.limitHeight ? `${this.limitHeight}px` : undefined, }; this.cd.markForCheck(); } diff --git a/frontend/src/app/components/clockchain/clockchain.component.html b/frontend/src/app/components/clockchain/clockchain.component.html index 3a28296ca..7ef320333 100644 --- a/frontend/src/app/components/clockchain/clockchain.component.html +++ b/frontend/src/app/components/clockchain/clockchain.component.html @@ -1,4 +1,7 @@ -
    +
    diff --git a/frontend/src/app/components/clockchain/clockchain.component.scss b/frontend/src/app/components/clockchain/clockchain.component.scss index acff1e725..6ffc144e9 100644 --- a/frontend/src/app/components/clockchain/clockchain.component.scss +++ b/frontend/src/app/components/clockchain/clockchain.component.scss @@ -21,9 +21,8 @@ .position-container { position: absolute; - left: 0; + left: 50%; top: 0; - transform: translateX(50vw); } .black-background { From 19353fc1d05b087f333a73bc63f56e749e80321c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 21 Apr 2023 23:13:19 +0900 Subject: [PATCH 292/782] rename clock components --- frontend/src/app/app-routing.module.ts | 12 ++++++------ .../components/clock-face/clock-face.component.ts | 1 - .../src/app/components/clock/clock-a.component.ts | 7 ------- .../src/app/components/clock/clock-b.component.ts | 7 ------- ...b.component.html => clock-mempool.component.html} | 0 .../app/components/clock/clock-mempool.component.ts | 7 +++++++ ...k-a.component.html => clock-mined.component.html} | 0 .../app/components/clock/clock-mined.component.ts | 7 +++++++ .../src/app/components/clock/clock.component.html | 4 ++-- .../src/app/components/clock/clock.component.scss | 2 +- frontend/src/app/shared/shared.module.ts | 12 ++++++------ 11 files changed, 29 insertions(+), 30 deletions(-) delete mode 100644 frontend/src/app/components/clock/clock-a.component.ts delete mode 100644 frontend/src/app/components/clock/clock-b.component.ts rename frontend/src/app/components/clock/{clock-b.component.html => clock-mempool.component.html} (100%) create mode 100644 frontend/src/app/components/clock/clock-mempool.component.ts rename frontend/src/app/components/clock/{clock-a.component.html => clock-mined.component.html} (100%) create mode 100644 frontend/src/app/components/clock/clock-mined.component.ts diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 0146fb535..0fe496d3e 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -4,8 +4,8 @@ import { AppPreloadingStrategy } from './app.preloading-strategy' import { StartComponent } from './components/start/start.component'; import { TransactionComponent } from './components/transaction/transaction.component'; import { BlockComponent } from './components/block/block.component'; -import { ClockAComponent } from './components/clock/clock-a.component'; -import { ClockBComponent } from './components/clock/clock-b.component'; +import { ClockMinedComponent as ClockMinedComponent } from './components/clock/clock-mined.component'; +import { ClockMempoolComponent as ClockMempoolComponent } from './components/clock/clock-mempool.component'; import { AddressComponent } from './components/address/address.component'; import { MasterPageComponent } from './components/master-page/master-page.component'; import { AboutComponent } from './components/about/about.component'; @@ -358,12 +358,12 @@ let routes: Routes = [ ], }, { - path: 'clock-face-a', - component: ClockAComponent, + path: 'clock-mined', + component: ClockMinedComponent, }, { - path: 'clock-face-b', - component: ClockBComponent, + path: 'clock-mempool', + component: ClockMempoolComponent, }, { path: 'status', diff --git a/frontend/src/app/components/clock-face/clock-face.component.ts b/frontend/src/app/components/clock-face/clock-face.component.ts index 9c373a50d..01e439e8e 100644 --- a/frontend/src/app/components/clock-face/clock-face.component.ts +++ b/frontend/src/app/components/clock-face/clock-face.component.ts @@ -39,7 +39,6 @@ export class ClockFaceComponent implements OnInit, OnChanges, OnDestroy { this.updateTime(); }) ).subscribe(); - this.websocketService.want(['blocks']); this.blocksSubscription = this.stateService.blocks$ .subscribe(([block]) => { if (block) { diff --git a/frontend/src/app/components/clock/clock-a.component.ts b/frontend/src/app/components/clock/clock-a.component.ts deleted file mode 100644 index 50f834bad..000000000 --- a/frontend/src/app/components/clock/clock-a.component.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-clock-a', - templateUrl: './clock-a.component.html', -}) -export class ClockAComponent {} diff --git a/frontend/src/app/components/clock/clock-b.component.ts b/frontend/src/app/components/clock/clock-b.component.ts deleted file mode 100644 index b47c9dba3..000000000 --- a/frontend/src/app/components/clock/clock-b.component.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-clock-b', - templateUrl: './clock-b.component.html', -}) -export class ClockBComponent {} diff --git a/frontend/src/app/components/clock/clock-b.component.html b/frontend/src/app/components/clock/clock-mempool.component.html similarity index 100% rename from frontend/src/app/components/clock/clock-b.component.html rename to frontend/src/app/components/clock/clock-mempool.component.html diff --git a/frontend/src/app/components/clock/clock-mempool.component.ts b/frontend/src/app/components/clock/clock-mempool.component.ts new file mode 100644 index 000000000..7e99cc08b --- /dev/null +++ b/frontend/src/app/components/clock/clock-mempool.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-clock-mempool', + templateUrl: './clock-mempool.component.html', +}) +export class ClockMempoolComponent {} diff --git a/frontend/src/app/components/clock/clock-a.component.html b/frontend/src/app/components/clock/clock-mined.component.html similarity index 100% rename from frontend/src/app/components/clock/clock-a.component.html rename to frontend/src/app/components/clock/clock-mined.component.html diff --git a/frontend/src/app/components/clock/clock-mined.component.ts b/frontend/src/app/components/clock/clock-mined.component.ts new file mode 100644 index 000000000..b26815ac6 --- /dev/null +++ b/frontend/src/app/components/clock/clock-mined.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-clock-mined', + templateUrl: './clock-mined.component.html', +}) +export class ClockMinedComponent {} diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index e444664c9..8da274a5c 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -42,11 +42,11 @@

    priority rate

    {{ recommendedFees.fastestFee }} sat/vB

    -
    +

    block size

    -
    +

    {{ i }} transaction diff --git a/frontend/src/app/components/clock/clock.component.scss b/frontend/src/app/components/clock/clock.component.scss index cffe3ee69..2af5317a3 100644 --- a/frontend/src/app/components/clock/clock.component.scss +++ b/frontend/src/app/components/clock/clock.component.scss @@ -50,7 +50,7 @@ opacity: 0.8; &.force-wrap { - word-spacing: 1000px; + word-spacing: 10000px; } ::ng-deep .symbol { diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 21cbb17a8..6e8d8d0f2 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -94,8 +94,8 @@ import { MempoolBlockOverviewComponent } from '../components/mempool-block-overv import { ClockchainComponent } from '../components/clockchain/clockchain.component'; import { ClockFaceComponent } from '../components/clock-face/clock-face.component'; import { ClockComponent } from '../components/clock/clock.component'; -import { ClockAComponent } from '../components/clock/clock-a.component'; -import { ClockBComponent } from '../components/clock/clock-b.component'; +import { ClockMinedComponent } from '../components/clock/clock-mined.component'; +import { ClockMempoolComponent } from '../components/clock/clock-mempool.component'; @NgModule({ declarations: [ @@ -183,8 +183,8 @@ import { ClockBComponent } from '../components/clock/clock-b.component'; MempoolBlockOverviewComponent, ClockchainComponent, ClockComponent, - ClockAComponent, - ClockBComponent, + ClockMinedComponent, + ClockMempoolComponent, ClockFaceComponent, ], imports: [ @@ -297,8 +297,8 @@ import { ClockBComponent } from '../components/clock/clock-b.component'; MempoolBlockOverviewComponent, ClockchainComponent, ClockComponent, - ClockAComponent, - ClockBComponent, + ClockMinedComponent, + ClockMempoolComponent, ClockFaceComponent, ] }) From 07dddd857bc3840fedfe8f24754ba7a177a6e098 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 4 May 2023 17:49:46 -0400 Subject: [PATCH 293/782] resize clock labels --- .../app/components/clock/clock.component.html | 16 ++++++++-------- .../app/components/clock/clock.component.scss | 9 +++++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index 8da274a5c..b3ca53c60 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -33,34 +33,34 @@

    -

    fiat price

    +

    fiat price

    -

    priority rate

    -

    {{ recommendedFees.fastestFee }} sat/vB

    +

    priority rate

    +

    {{ recommendedFees.fastestFee + 300 }} sat/vB

    -

    block size

    +

    block size

    - {{ i }} transaction - {{ i }} transactions + {{ i }} transaction + {{ i }} transactions

    -

    memory usage

    +

    memory usage

    {{ mempoolInfo.size | number }}

    -

    unconfirmed

    +

    unconfirmed

    diff --git a/frontend/src/app/components/clock/clock.component.scss b/frontend/src/app/components/clock/clock.component.scss index 2af5317a3..f1d70dcd8 100644 --- a/frontend/src/app/components/clock/clock.component.scss +++ b/frontend/src/app/components/clock/clock.component.scss @@ -45,8 +45,8 @@ p { margin: 0; - font-size: calc(0.05 * var(--clock-width)); - line-height: calc(0.07 * var(--clock-width)); + font-size: calc(0.055 * var(--clock-width)); + line-height: calc(0.05 * var(--clock-width)); opacity: 0.8; &.force-wrap { @@ -59,6 +59,11 @@ } } + .label { + font-size: calc(0.04 * var(--clock-width)); + line-height: calc(0.05 * var(--clock-width)); + } + &.top { top: calc(var(--chain-height) + 2%); } From 9671259f5cee8718a18ac961f695dab005fddabb Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 4 May 2023 17:50:27 -0400 Subject: [PATCH 294/782] clock selected block arrow --- .../blockchain-blocks.component.html | 5 +++++ .../blockchain-blocks.component.scss | 12 ++++++++++++ .../blockchain-blocks/blockchain-blocks.component.ts | 1 + .../src/app/components/clock/clock.component.html | 2 +- .../src/app/components/clock/clock.component.scss | 2 +- .../components/clockchain/clockchain.component.html | 4 ++-- .../components/clockchain/clockchain.component.ts | 1 + .../mempool-blocks/mempool-blocks.component.html | 5 +++++ .../mempool-blocks/mempool-blocks.component.scss | 12 ++++++++++++ .../mempool-blocks/mempool-blocks.component.ts | 1 + 10 files changed, 41 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html index 0a2f0decb..8ea5acef6 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -3,6 +3,11 @@ *ngIf="static || (loadingBlocks$ | async) === false; else loadingBlocksTemplate">
    +
    - +
    diff --git a/frontend/src/app/components/clock/clock.component.scss b/frontend/src/app/components/clock/clock.component.scss index f1d70dcd8..20baf02ee 100644 --- a/frontend/src/app/components/clock/clock.component.scss +++ b/frontend/src/app/components/clock/clock.component.scss @@ -23,7 +23,7 @@ width: 100%; height: 15.625%; z-index: 2; - overflow: hidden; + // overflow: hidden; // background: #1d1f31; // box-shadow: 0 0 15px #000; } diff --git a/frontend/src/app/components/clockchain/clockchain.component.html b/frontend/src/app/components/clockchain/clockchain.component.html index 7ef320333..169de58d4 100644 --- a/frontend/src/app/components/clockchain/clockchain.component.html +++ b/frontend/src/app/components/clockchain/clockchain.component.html @@ -5,8 +5,8 @@
    - - + +
    +
      diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss index 6d1ec326e..40f43a015 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss @@ -157,4 +157,16 @@ #arrow-up { transform: translateX(70px); } +} + +.spotlight-bottom { + position: absolute; + width: calc(0.6 * var(--block-size)); + height: calc(0.25 * var(--block-size)); + border-left: solid calc(0.3 * var(--block-size)) transparent; + border-bottom: solid calc(0.3 * var(--block-size)) white; + border-right: solid calc(0.3 * var(--block-size)) transparent; + transform: translate(calc(-0.2 * var(--block-size)), calc(1.1 * var(--block-size))); + border-radius: 2px; + z-index: -1; } \ No newline at end of file diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 6267eed21..93498d535 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -27,6 +27,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { @Input() minimal: boolean = false; @Input() blockWidth: number = 125; @Input() count: number = null; + @Input() spotlight: number = 0; specialBlocks = specialBlocks; mempoolBlocks: MempoolBlock[] = []; From f20bfb025be25eba8f37ef095667b8ccc9013dac Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 May 2023 08:57:24 -0600 Subject: [PATCH 295/782] fix clock merge conflicts --- .../block-overview-graph.component.ts | 4 ++- .../block-overview-graph/block-scene.ts | 28 +++++++++++++------ .../app/components/clock/clock.component.html | 2 +- .../mempool-block-overview.component.html | 1 + .../mempool-block-overview.component.ts | 1 + .../mempool-blocks.component.html | 26 ----------------- frontend/src/app/graphs/graphs.module.ts | 2 -- frontend/src/index.mempool.html | 2 +- 8 files changed, 27 insertions(+), 39 deletions(-) diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index 940939470..15e41f1a7 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -23,6 +23,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On @Input() unavailable: boolean = false; @Input() auditHighlighting: boolean = false; @Input() blockConversion: Price; + @Input() pixelAlign: boolean = false; @Output() txClickEvent = new EventEmitter<{ tx: TransactionStripped, keyModifier: boolean}>(); @Output() txHoverEvent = new EventEmitter(); @Output() readyEvent = new EventEmitter(); @@ -201,7 +202,8 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On this.start(); } else { this.scene = new BlockScene({ width: this.displayWidth, height: this.displayHeight, resolution: this.resolution, - blockLimit: this.blockLimit, orientation: this.orientation, flip: this.flip, vertexArray: this.vertexArray, highlighting: this.auditHighlighting }); + blockLimit: this.blockLimit, orientation: this.orientation, flip: this.flip, vertexArray: this.vertexArray, + highlighting: this.auditHighlighting, pixelAlign: this.pixelAlign }); this.start(); } } diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index 1c0072e31..0cd5c9391 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -15,6 +15,7 @@ export default class BlockScene { gridWidth: number; gridHeight: number; gridSize: number; + pixelAlign: boolean; vbytesPerUnit: number; unitPadding: number; unitWidth: number; @@ -23,19 +24,24 @@ export default class BlockScene { animateUntil = 0; dirty: boolean; - constructor({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting }: + constructor({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting, pixelAlign }: { width: number, height: number, resolution: number, blockLimit: number, - orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean } + orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean, pixelAlign: boolean } ) { - this.init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting }); + this.init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting, pixelAlign }); } resize({ width = this.width, height = this.height, animate = true }: { width?: number, height?: number, animate: boolean }): void { this.width = width; this.height = height; this.gridSize = this.width / this.gridWidth; - this.unitPadding = Math.max(1, Math.floor(this.gridSize / 2.5)); - this.unitWidth = this.gridSize - (this.unitPadding); + if (this.pixelAlign) { + this.unitPadding = Math.max(1, Math.floor(this.gridSize / 2.5)); + this.unitWidth = this.gridSize - (this.unitPadding); + } else { + this.unitPadding = width / 500; + this.unitWidth = this.gridSize - (this.unitPadding * 2); + } this.dirty = true; if (this.initialised && this.scene) { @@ -209,14 +215,15 @@ export default class BlockScene { this.animateUntil = Math.max(this.animateUntil, tx.setHover(value)); } - private init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting }: + private init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting, pixelAlign }: { width: number, height: number, resolution: number, blockLimit: number, - orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean } + orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean, pixelAlign: boolean } ): void { this.orientation = orientation; this.flip = flip; this.vertexArray = vertexArray; this.highlightingEnabled = highlighting; + this.pixelAlign = pixelAlign; this.scene = { count: 0, @@ -342,7 +349,12 @@ export default class BlockScene { private gridToScreen(position: Square | void): Square { if (position) { const slotSize = (position.s * this.gridSize); - const squareSize = slotSize - (this.unitPadding); + let squareSize; + if (this.pixelAlign) { + squareSize = slotSize - (this.unitPadding); + } else { + squareSize = slotSize - (this.unitPadding * 2); + } // The grid is laid out notionally left-to-right, bottom-to-top, // so we rotate and/or flip the y axis to match the target configuration. diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index e54626aa4..914450a79 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -20,7 +20,7 @@
    - +
    diff --git a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html index 3cb4ff3e8..37c82afad 100644 --- a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html +++ b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html @@ -5,5 +5,6 @@ [blockLimit]="stateService.blockVSize" [orientation]="timeLtr ? 'right' : 'left'" [flip]="true" + [pixelAlign]="pixelAlign" (txClickEvent)="onTxClick($event)" > diff --git a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts index 30632a862..540046e13 100644 --- a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts +++ b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts @@ -16,6 +16,7 @@ import { Router } from '@angular/router'; }) export class MempoolBlockOverviewComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit { @Input() index: number; + @Input() pixelAlign: boolean = false; @Output() txPreviewEvent = new EventEmitter(); @ViewChild('blockGraph') blockGraph: BlockOverviewGraphComponent; diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html index e405c3cfd..11dc28ad9 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html @@ -40,32 +40,6 @@ () {{ i }} blocks
    -
    - {{ projectedBlock.feeRange[0] | number:feeRounding }} - {{ projectedBlock.feeRange[projectedBlock.feeRange.length - 1] | number:feeRounding }} sat/vB -
    -
    - -
    -
    -
    - - {{ i }} transaction - {{ i }} transactions -
    -
    - - - - - - -
    - -
    - () - {{ i }} blocks -
    -
    diff --git a/frontend/src/app/graphs/graphs.module.ts b/frontend/src/app/graphs/graphs.module.ts index a7e627736..a4e4f5bfc 100644 --- a/frontend/src/app/graphs/graphs.module.ts +++ b/frontend/src/app/graphs/graphs.module.ts @@ -14,7 +14,6 @@ import { LbtcPegsGraphComponent } from '../components/lbtc-pegs-graph/lbtc-pegs- import { GraphsComponent } from '../components/graphs/graphs.component'; import { StatisticsComponent } from '../components/statistics/statistics.component'; import { MempoolBlockComponent } from '../components/mempool-block/mempool-block.component'; -// import { MempoolBlockOverviewComponent } from '../components/mempool-block-overview/mempool-block-overview.component'; import { PoolRankingComponent } from '../components/pool-ranking/pool-ranking.component'; import { PoolComponent } from '../components/pool/pool.component'; import { TelevisionComponent } from '../components/television/television.component'; @@ -42,7 +41,6 @@ import { CommonModule } from '@angular/common'; BlockFeeRatesGraphComponent, BlockSizesWeightsGraphComponent, FeeDistributionGraphComponent, - // MempoolBlockOverviewComponent, IncomingTransactionsGraphComponent, MempoolGraphComponent, LbtcPegsGraphComponent, diff --git a/frontend/src/index.mempool.html b/frontend/src/index.mempool.html index 02765c0ba..60f1b4421 100644 --- a/frontend/src/index.mempool.html +++ b/frontend/src/index.mempool.html @@ -32,7 +32,7 @@ - + From 47b95af8aed83b5b1cd89b1c3ac3da4ab3be658c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 May 2023 12:44:14 -0600 Subject: [PATCH 296/782] increase range of fee colors --- frontend/src/app/app.constants.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frontend/src/app/app.constants.ts b/frontend/src/app/app.constants.ts index 8a091706a..f510c6480 100644 --- a/frontend/src/app/app.constants.ts +++ b/frontend/src/app/app.constants.ts @@ -29,6 +29,14 @@ export const mempoolFeeColors = [ 'ba3243', 'b92b48', 'b9254b', + 'b8214d', + 'b71d4f', + 'b61951', + 'b41453', + 'b30e55', + 'b10857', + 'b00259', + 'ae005b', ]; export const chartColors = [ @@ -69,6 +77,7 @@ export const chartColors = [ "#3E2723", "#212121", "#263238", + "#801313", ]; export const poolsColor = { From 5257716e1a528f3e1b959ecc6ad90ab87a999e64 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 May 2023 12:53:37 -0600 Subject: [PATCH 297/782] Dynamic fee ranges & legend in mempool graph --- .../mempool-graph/mempool-graph.component.ts | 35 +++++++++++-------- .../statistics/statistics.component.html | 3 +- .../television/television.component.html | 1 - .../app/dashboard/dashboard.component.html | 3 +- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/frontend/src/app/components/mempool-graph/mempool-graph.component.ts b/frontend/src/app/components/mempool-graph/mempool-graph.component.ts index 989fa141e..cc53f425d 100644 --- a/frontend/src/app/components/mempool-graph/mempool-graph.component.ts +++ b/frontend/src/app/components/mempool-graph/mempool-graph.component.ts @@ -23,8 +23,7 @@ import { download, formatterXAxis, formatterXAxisLabel } from '../../shared/grap }) export class MempoolGraphComponent implements OnInit, OnChanges { @Input() data: any[]; - @Input() limitFee = 350; - @Input() limitFilterFee = 1; + @Input() filterSize = 100000; @Input() height: number | string = 200; @Input() top: number | string = 20; @Input() right: number | string = 10; @@ -99,16 +98,20 @@ export class MempoolGraphComponent implements OnInit, OnChanges { } generateArray(mempoolStats: OptimizedMempoolStats[]) { - const finalArray: number[][][] = []; + let finalArray: number[][][] = []; let feesArray: number[][] = []; - const limitFeesTemplate = this.template === 'advanced' ? 26 : 20; - for (let index = limitFeesTemplate; index > -1; index--) { + let maxTier = 0; + for (let index = 37; index > -1; index--) { feesArray = []; mempoolStats.forEach((stats) => { + if (stats.vsizes[index] >= this.filterSize) { + maxTier = Math.max(maxTier, index); + } feesArray.push([stats.added * 1000, stats.vsizes[index] ? stats.vsizes[index] : 0]); }); finalArray.push(feesArray); } + this.feeLimitIndex = maxTier; finalArray.reverse(); return finalArray; } @@ -121,7 +124,7 @@ export class MempoolGraphComponent implements OnInit, OnChanges { const newColors = []; for (let index = 0; index < series.length; index++) { const value = series[index]; - if (index >= this.feeLimitIndex) { + if (index < this.feeLimitIndex) { newColors.push(this.chartColorsOrdered[index]); seriesGraph.push({ zlevel: 0, @@ -371,17 +374,21 @@ export class MempoolGraphComponent implements OnInit, OnChanges { orderLevels() { this.feeLevelsOrdered = []; - for (let i = 0; i < feeLevels.length; i++) { - if (feeLevels[i] === this.limitFilterFee) { - this.feeLimitIndex = i; - } - if (feeLevels[i] <= this.limitFee) { + let maxIndex = Math.min(feeLevels.length, this.feeLimitIndex); + for (let i = 0; i < maxIndex; i++) { if (this.stateService.network === 'liquid' || this.stateService.network === 'liquidtestnet') { - this.feeLevelsOrdered.push(`${(feeLevels[i] / 10).toFixed(1)} - ${(feeLevels[i + 1] / 10).toFixed(1)}`); + if (i === maxIndex - 1) { + this.feeLevelsOrdered.push(`${(feeLevels[i] / 10).toFixed(1)}+`); + } else { + this.feeLevelsOrdered.push(`${(feeLevels[i] / 10).toFixed(1)} - ${(feeLevels[i + 1] / 10).toFixed(1)}`); + } } else { - this.feeLevelsOrdered.push(`${feeLevels[i]} - ${feeLevels[i + 1]}`); + if (i === maxIndex - 1) { + this.feeLevelsOrdered.push(`${feeLevels[i]}+`); + } else { + this.feeLevelsOrdered.push(`${feeLevels[i]} - ${feeLevels[i + 1]}`); + } } - } } this.chartColorsOrdered = chartColors.slice(0, this.feeLevelsOrdered.length); } diff --git a/frontend/src/app/components/statistics/statistics.component.html b/frontend/src/app/components/statistics/statistics.component.html index 30738f591..2133b2615 100644 --- a/frontend/src/app/components/statistics/statistics.component.html +++ b/frontend/src/app/components/statistics/statistics.component.html @@ -84,8 +84,7 @@
    -
    diff --git a/frontend/src/app/components/television/television.component.html b/frontend/src/app/components/television/television.component.html index 89cf8e5bb..23dd18389 100644 --- a/frontend/src/app/components/television/television.component.html +++ b/frontend/src/app/components/television/television.component.html @@ -3,7 +3,6 @@
    From 033e78c0a7d44098e19f764db512ad65ec6c82b9 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 8 May 2023 19:03:39 -0600 Subject: [PATCH 298/782] Optimize main thread processing of GBT updates --- backend/src/api/mempool-blocks.ts | 219 ++++++++++++++----------- backend/src/api/tx-selection-worker.ts | 39 +++-- backend/src/mempool.interfaces.ts | 1 + 3 files changed, 144 insertions(+), 115 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index af23a6376..62717ed7e 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,5 +1,5 @@ import logger from '../logger'; -import { MempoolBlock, TransactionExtended, ThreadTransaction, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction } from '../mempool.interfaces'; +import { MempoolBlock, TransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction } from '../mempool.interfaces'; import { Common } from './common'; import config from '../config'; import { Worker } from 'worker_threads'; @@ -104,8 +104,12 @@ class MempoolBlocks { private calculateMempoolBlocks(transactionsSorted: TransactionExtended[]): MempoolBlockWithTransactions[] { const mempoolBlocks: MempoolBlockWithTransactions[] = []; + let blockSize = 0; let blockWeight = 0; let blockVsize = 0; + let blockFees = 0; + const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; + let transactionIds: string[] = []; let transactions: TransactionExtended[] = []; transactionsSorted.forEach((tx) => { if (blockWeight + tx.weight <= config.MEMPOOL.BLOCK_WEIGHT_UNITS @@ -116,9 +120,14 @@ class MempoolBlocks { }; blockWeight += tx.weight; blockVsize += tx.vsize; - transactions.push(tx); + blockSize += tx.size; + blockFees += tx.fee; + if (blockVsize <= sizeLimit) { + transactions.push(tx); + } + transactionIds.push(tx.txid); } else { - mempoolBlocks.push(this.dataToMempoolBlocks(transactions)); + mempoolBlocks.push(this.dataToMempoolBlocks(transactionIds, transactions, blockSize, blockWeight, blockFees)); blockVsize = 0; tx.position = { block: mempoolBlocks.length, @@ -126,11 +135,14 @@ class MempoolBlocks { }; blockVsize += tx.vsize; blockWeight = tx.weight; + blockSize = tx.size; + blockFees = tx.fee; + transactionIds = [tx.txid]; transactions = [tx]; } }); if (transactions.length) { - mempoolBlocks.push(this.dataToMempoolBlocks(transactions)); + mempoolBlocks.push(this.dataToMempoolBlocks(transactionIds, transactions, blockSize, blockWeight, blockFees)); } return mempoolBlocks; @@ -178,6 +190,8 @@ class MempoolBlocks { } public async $makeBlockTemplates(newMempool: { [txid: string]: TransactionExtended }, saveResults: boolean = false): Promise { + const start = Date.now(); + // reset mempool short ids this.resetUids(); for (const tx of Object.values(newMempool)) { @@ -194,7 +208,7 @@ class MempoolBlocks { fee: entry.fee, weight: entry.weight, feePerVsize: entry.fee / (entry.weight / 4), - effectiveFeePerVsize: entry.fee / (entry.weight / 4), + effectiveFeePerVsize: entry.effectiveFeePerVsize || (entry.fee / (entry.weight / 4)), inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], }); } @@ -216,7 +230,7 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result let threadErrorListener; try { - const workerResultPromise = new Promise<{ blocks: CompactThreadTransaction[][], clusters: Map }>((resolve, reject) => { + const workerResultPromise = new Promise<{ blocks: number[][], rates: Map, clusters: Map }>((resolve, reject) => { threadErrorListener = reject; this.txSelectionWorker?.once('message', (result): void => { resolve(result); @@ -224,19 +238,14 @@ class MempoolBlocks { this.txSelectionWorker?.once('error', reject); }); this.txSelectionWorker.postMessage({ type: 'set', mempool: strippedMempool }); - let { blocks, clusters } = this.convertResultTxids(await workerResultPromise); - // filter out stale transactions - const unfilteredCount = blocks.reduce((total, block) => { return total + block.length; }, 0); - blocks = blocks.map(block => block.filter(tx => (tx.txid && tx.txid in newMempool))); - const filteredCount = blocks.reduce((total, block) => { return total + block.length; }, 0); - if (filteredCount < unfilteredCount) { - logger.warn(`tx selection worker thread returned ${unfilteredCount - filteredCount} stale transactions from makeBlockTemplates`); - } + const { blocks, rates, clusters } = this.convertResultTxids(await workerResultPromise); // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - return this.processBlockTemplates(newMempool, blocks, clusters, saveResults); + const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + logger.debug(`makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); + return processed; } catch (e) { logger.err('makeBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); } @@ -250,6 +259,8 @@ class MempoolBlocks { return; } + const start = Date.now(); + for (const tx of Object.values(added)) { this.setUid(tx); } @@ -262,7 +273,7 @@ class MempoolBlocks { fee: entry.fee, weight: entry.weight, feePerVsize: entry.fee / (entry.weight / 4), - effectiveFeePerVsize: entry.fee / (entry.weight / 4), + effectiveFeePerVsize: entry.effectiveFeePerVsize || (entry.fee / (entry.weight / 4)), inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], }; }); @@ -270,7 +281,7 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result let threadErrorListener; try { - const workerResultPromise = new Promise<{ blocks: CompactThreadTransaction[][], clusters: Map }>((resolve, reject) => { + const workerResultPromise = new Promise<{ blocks: number[][], rates: Map, clusters: Map }>((resolve, reject) => { threadErrorListener = reject; this.txSelectionWorker?.once('message', (result): void => { resolve(result); @@ -278,84 +289,100 @@ class MempoolBlocks { this.txSelectionWorker?.once('error', reject); }); this.txSelectionWorker.postMessage({ type: 'update', added: addedStripped, removed: removedUids }); - let { blocks, clusters } = this.convertResultTxids(await workerResultPromise); - // filter out stale transactions - const unfilteredCount = blocks.reduce((total, block) => { return total + block.length; }, 0); - blocks = blocks.map(block => block.filter(tx => (tx.txid && tx.txid in newMempool))); - const filteredCount = blocks.reduce((total, block) => { return total + block.length; }, 0); - if (filteredCount < unfilteredCount) { - logger.warn(`tx selection worker thread returned ${unfilteredCount - filteredCount} stale transactions from updateBlockTemplates`); - } + const { blocks, rates, clusters } = this.convertResultTxids(await workerResultPromise); this.removeUids(removedUids); // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - this.processBlockTemplates(newMempool, blocks, clusters, saveResults); + this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + logger.debug(`updateBlockTemplates completed in ${(Date.now() - start) / 1000} seconds`); } catch (e) { logger.err('updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); } } - private processBlockTemplates(mempool, blocks: ThreadTransaction[][], clusters, saveResults): MempoolBlockWithTransactions[] { + private processBlockTemplates(mempool, blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }, saveResults): MempoolBlockWithTransactions[] { + for (const txid of Object.keys(rates)) { + if (txid in mempool) { + mempool[txid].effectiveFeePerVsize = rates[txid]; + } + } + + const readyBlocks: { transactionIds, transactions, totalSize, totalWeight, totalFees }[] = []; + const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; // update this thread's mempool with the results - blocks.forEach((block, blockIndex) => { - let runningVsize = 0; - block.forEach(tx => { - if (tx.txid && tx.txid in mempool) { + for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) { + const block: string[] = blocks[blockIndex]; + let txid: string; + let mempoolTx: TransactionExtended; + let totalSize = 0; + let totalVsize = 0; + let totalWeight = 0; + let totalFees = 0; + const transactions: TransactionExtended[] = []; + for (let txIndex = 0; txIndex < block.length; txIndex++) { + txid = block[txIndex]; + if (txid) { + mempoolTx = mempool[txid]; // save position in projected blocks - mempool[tx.txid].position = { + mempoolTx.position = { block: blockIndex, - vsize: runningVsize + (mempool[tx.txid].vsize / 2), + vsize: totalVsize + (mempoolTx.vsize / 2), }; - runningVsize += mempool[tx.txid].vsize; + mempoolTx.cpfpChecked = true; - if (tx.effectiveFeePerVsize != null) { - mempool[tx.txid].effectiveFeePerVsize = tx.effectiveFeePerVsize; + totalSize += mempoolTx.size; + totalVsize += mempoolTx.vsize; + totalWeight += mempoolTx.weight; + totalFees += mempoolTx.fee; + + if (totalVsize <= sizeLimit) { + transactions.push(mempoolTx); } - if (tx.cpfpRoot && tx.cpfpRoot in clusters) { - const ancestors: Ancestor[] = []; - const descendants: Ancestor[] = []; - const cluster = clusters[tx.cpfpRoot]; - let matched = false; - cluster.forEach(txid => { - if (!txid || !mempool[txid]) { - logger.warn('projected transaction ancestor missing from mempool cache'); - return; - } - if (txid === tx.txid) { - matched = true; - } else { - const relative = { - txid: txid, - fee: mempool[txid].fee, - weight: mempool[txid].weight, - }; - if (matched) { - descendants.push(relative); - } else { - ancestors.push(relative); - } - } - }); - mempool[tx.txid].ancestors = ancestors; - mempool[tx.txid].descendants = descendants; - mempool[tx.txid].bestDescendant = null; - } - mempool[tx.txid].cpfpChecked = tx.cpfpChecked; - } else { - logger.warn('projected transaction missing from mempool cache'); } + } + readyBlocks.push({ + transactionIds: block, + transactions, + totalSize, + totalWeight, + totalFees }); - }); + } - // unpack the condensed blocks into proper mempool blocks - const mempoolBlocks = blocks.map((transactions) => { - return this.dataToMempoolBlocks(transactions.map(tx => { - return mempool[tx.txid] || null; - }).filter(tx => !!tx)); - }); + for (const cluster of Object.values(clusters)) { + for (const memberTxid of cluster) { + if (memberTxid in mempool) { + const mempoolTx = mempool[memberTxid]; + const ancestors: Ancestor[] = []; + const descendants: Ancestor[] = []; + let matched = false; + cluster.forEach(txid => { + if (txid === memberTxid) { + matched = true; + } else { + const relative = { + txid: txid, + fee: mempool[txid].fee, + weight: mempool[txid].weight, + }; + if (matched) { + descendants.push(relative); + } else { + ancestors.push(relative); + } + } + }); + mempoolTx.ancestors = ancestors; + mempoolTx.descendants = descendants; + mempoolTx.bestDescendant = null; + } + } + } + + const mempoolBlocks = readyBlocks.map(b => this.dataToMempoolBlocks(b.transactionIds, b.transactions, b.totalSize, b.totalWeight, b.totalFees)); if (saveResults) { const deltas = this.calculateMempoolDeltas(this.mempoolBlocks, mempoolBlocks); @@ -366,27 +393,17 @@ class MempoolBlocks { return mempoolBlocks; } - private dataToMempoolBlocks(transactions: TransactionExtended[]): MempoolBlockWithTransactions { - let totalSize = 0; - let totalWeight = 0; - const fitTransactions: TransactionExtended[] = []; - transactions.forEach(tx => { - totalSize += tx.size; - totalWeight += tx.weight; - if ((totalWeight + tx.weight) <= config.MEMPOOL.BLOCK_WEIGHT_UNITS * 1.2) { - fitTransactions.push(tx); - } - }); + private dataToMempoolBlocks(transactionIds: string[], transactions: TransactionExtended[], totalSize: number, totalWeight: number, totalFees: number): MempoolBlockWithTransactions { const feeStats = Common.calcEffectiveFeeStatistics(transactions); return { blockSize: totalSize, - blockVSize: totalWeight / 4, - nTx: transactions.length, - totalFees: transactions.reduce((acc, cur) => acc + cur.fee, 0), + blockVSize: (totalWeight / 4), // fractional vsize to avoid rounding errors + nTx: transactionIds.length, + totalFees: totalFees, medianFee: feeStats.medianFee, // Common.percentile(transactions.map((tx) => tx.effectiveFeePerVsize), config.MEMPOOL.RECOMMENDED_FEE_PERCENTILE), feeRange: feeStats.feeRange, //Common.getFeesInRange(transactions, rangeLength), - transactionIds: transactions.map((tx) => tx.txid), - transactions: fitTransactions.map((tx) => Common.stripTransaction(tx)), + transactionIds: transactionIds, + transactions: transactions.map((tx) => Common.stripTransaction(tx)), }; } @@ -415,14 +432,16 @@ class MempoolBlocks { } } - private convertResultTxids({ blocks, clusters }: { blocks: any[][], clusters: Map}) - : { blocks: ThreadTransaction[][], clusters: { [root: string]: string[] }} { - for (const block of blocks) { - for (const tx of block) { - tx.txid = this.uidMap.get(tx.uid); - if (tx.cpfpRoot) { - tx.cpfpRoot = this.uidMap.get(tx.cpfpRoot); - } + private convertResultTxids({ blocks, rates, clusters }: { blocks: number[][], rates: Map, clusters: Map}) + : { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }} { + const convertedBlocks: string[][] = blocks.map(block => block.map(uid => { + return this.uidMap.get(uid) || ''; + })); + const convertedRates = {}; + for (const rateUid of rates.keys()) { + const rateTxid = this.uidMap.get(rateUid); + if (rateTxid) { + convertedRates[rateTxid] = rates.get(rateUid); } } const convertedClusters = {}; @@ -435,7 +454,7 @@ class MempoolBlocks { convertedClusters[rootTxid] = members; } } - return { blocks, clusters: convertedClusters } as { blocks: ThreadTransaction[][], clusters: { [root: string]: string[] }}; + return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; } } diff --git a/backend/src/api/tx-selection-worker.ts b/backend/src/api/tx-selection-worker.ts index 1635acac4..b22f42823 100644 --- a/backend/src/api/tx-selection-worker.ts +++ b/backend/src/api/tx-selection-worker.ts @@ -1,6 +1,6 @@ import config from '../config'; import logger from '../logger'; -import { CompactThreadTransaction, MempoolBlockWithTransactions, AuditTransaction } from '../mempool.interfaces'; +import { CompactThreadTransaction, AuditTransaction } from '../mempool.interfaces'; import { PairingHeap } from '../utils/pairing-heap'; import { parentPort } from 'worker_threads'; @@ -19,11 +19,11 @@ if (parentPort) { }); } - const { blocks, clusters } = makeBlockTemplates(mempool); + const { blocks, rates, clusters } = makeBlockTemplates(mempool); // return the result to main thread. if (parentPort) { - parentPort.postMessage({ blocks, clusters }); + parentPort.postMessage({ blocks, rates, clusters }); } }); } @@ -33,14 +33,14 @@ if (parentPort) { * (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) */ function makeBlockTemplates(mempool: Map) - : { blocks: CompactThreadTransaction[][], clusters: Map } { + : { blocks: number[][], rates: Map, clusters: Map } { const start = Date.now(); const auditPool: Map = new Map(); const mempoolArray: AuditTransaction[] = []; - const restOfArray: CompactThreadTransaction[] = []; const cpfpClusters: Map = new Map(); mempool.forEach(tx => { + tx.dirty = false; // initializing everything up front helps V8 optimize property access later auditPool.set(tx.uid, { uid: tx.uid, @@ -81,9 +81,8 @@ function makeBlockTemplates(mempool: Map) // Build blocks by greedily choosing the highest feerate package // (i.e. the package rooted in the transaction with the best ancestor score) - const blocks: CompactThreadTransaction[][] = []; + const blocks: number[][] = []; let blockWeight = 4000; - let blockSize = 0; let transactions: AuditTransaction[] = []; const modified: PairingHeap = new PairingHeap((a, b): boolean => { if (a.score === b.score) { @@ -139,13 +138,16 @@ function makeBlockTemplates(mempool: Map) ancestor.used = true; ancestor.usedBy = nextTx.uid; // update original copy of this tx with effective fee rate & relatives data - mempoolTx.effectiveFeePerVsize = effectiveFeeRate; - if (isCluster) { - mempoolTx.cpfpRoot = nextTx.uid; + if (mempoolTx.effectiveFeePerVsize !== effectiveFeeRate) { + mempoolTx.effectiveFeePerVsize = effectiveFeeRate; + mempoolTx.dirty = true; + } + if (mempoolTx.cpfpRoot !== nextTx.uid) { + mempoolTx.cpfpRoot = isCluster ? nextTx.uid : null; + mempoolTx.dirty; } mempoolTx.cpfpChecked = true; transactions.push(ancestor); - blockSize += ancestor.size; blockWeight += ancestor.weight; used.push(ancestor); } @@ -171,11 +173,10 @@ function makeBlockTemplates(mempool: Map) if ((exceededPackageTries || queueEmpty) && blocks.length < 7) { // construct this block if (transactions.length) { - blocks.push(transactions.map(t => mempool.get(t.uid) as CompactThreadTransaction)); + blocks.push(transactions.map(t => t.uid)); } // reset for the next block transactions = []; - blockSize = 0; blockWeight = 4000; // 'overflow' packages didn't fit in this block, but are valid candidates for the next @@ -196,14 +197,22 @@ function makeBlockTemplates(mempool: Map) } // add the final unbounded block if it contains any transactions if (transactions.length > 0) { - blocks.push(transactions.map(t => mempool.get(t.uid) as CompactThreadTransaction)); + blocks.push(transactions.map(t => t.uid)); + } + + // get map of dirty transactions + const rates = new Map(); + for (const tx of mempool.values()) { + if (tx?.dirty) { + rates.set(tx.uid, tx.effectiveFeePerVsize || tx.feePerVsize); + } } const end = Date.now(); const time = end - start; logger.debug('Mempool templates calculated in ' + time / 1000 + ' seconds'); - return { blocks, clusters: cpfpClusters }; + return { blocks, rates, clusters: cpfpClusters }; } // traverse in-mempool ancestors diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 53bd3ff33..ab4c4cd25 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -114,6 +114,7 @@ export interface CompactThreadTransaction { inputs: number[]; cpfpRoot?: string; cpfpChecked?: boolean; + dirty?: boolean; } export interface ThreadTransaction { From f8636d20c2e257b5783a0d8c58173a98016bbe54 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 9 May 2023 17:44:38 -0600 Subject: [PATCH 299/782] optimize batch client websocket updates --- backend/src/api/websocket-handler.ts | 143 +++++++++++++++++---------- 1 file changed, 92 insertions(+), 51 deletions(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index bc0fb8ea5..eb099f229 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -210,11 +210,12 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } + const response = JSON.stringify({ loadingIndicators: indicators }); this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { return; } - client.send(JSON.stringify({ loadingIndicators: indicators })); + client.send(response); }); } @@ -223,11 +224,12 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } + const response = JSON.stringify({ conversions: conversionRates }); this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { return; } - client.send(JSON.stringify({ conversions: conversionRates })); + client.send(response); }); } @@ -258,6 +260,10 @@ class WebsocketHandler { this.printLogs(); + const response = JSON.stringify({ + 'live-2h-chart': stats + }); + this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { return; @@ -267,9 +273,7 @@ class WebsocketHandler { return; } - client.send(JSON.stringify({ - 'live-2h-chart': stats - })); + client.send(response); }); } @@ -306,6 +310,38 @@ class WebsocketHandler { } const recommendedFees = feeApi.getRecommendedFee(); + // cache serialized objects to avoid stringify-ing the same thing for every client + const responseCache = {}; + function getCachedResponse(key: string, data): string { + if (!responseCache[key]) { + responseCache[key] = JSON.stringify(data); + } + return responseCache[key]; + } + + // pre-compute new tracked outspends + const outspendCache: { [txid: string]: { [vout: number]: { vin: number, txid: string } } } = {}; + const trackedTxs = new Set(); + this.wss.clients.forEach((client) => { + if (client['track-tx']) { + trackedTxs.add(client['track-tx']); + } + }); + if (trackedTxs.size > 0) { + for (const tx of newTransactions) { + for (let i = 0; i < tx.vin.length; i++) { + const vin = tx.vin[i]; + if (trackedTxs.has(vin.txid)) { + if (!outspendCache[vin.txid]) { + outspendCache[vin.txid] = { [vin.vout]: { vin: i, txid: tx.txid }}; + } else { + outspendCache[vin.txid][vin.vout] = { vin: i, txid: tx.txid }; + } + } + } + } + } + this.wss.clients.forEach(async (client) => { if (client.readyState !== WebSocket.OPEN) { return; @@ -314,17 +350,17 @@ class WebsocketHandler { const response = {}; if (client['want-stats']) { - response['mempoolInfo'] = mempoolInfo; - response['vBytesPerSecond'] = vBytesPerSecond; - response['transactions'] = newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx)); + response['mempoolInfo'] = getCachedResponse('mempoolInfo', mempoolInfo); + response['vBytesPerSecond'] = getCachedResponse('vBytesPerSecond', vBytesPerSecond); + response['transactions'] = getCachedResponse('transactions', newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx))); if (da?.previousTime) { - response['da'] = da; + response['da'] = getCachedResponse('da', da); } - response['fees'] = recommendedFees; + response['fees'] = getCachedResponse('fees', recommendedFees); } if (client['want-mempool-blocks']) { - response['mempool-blocks'] = mBlocks; + response['mempool-blocks'] = getCachedResponse('mempool-blocks', mBlocks); } if (client['track-mempool-tx']) { @@ -333,12 +369,12 @@ class WebsocketHandler { if (config.MEMPOOL.BACKEND !== 'esplora') { try { const fullTx = await transactionUtils.$getTransactionExtended(tx.txid, true); - response['tx'] = fullTx; + response['tx'] = JSON.stringify(fullTx); } catch (e) { logger.debug('Error finding transaction in mempool: ' + (e instanceof Error ? e.message : e)); } } else { - response['tx'] = tx; + response['tx'] = JSON.stringify(tx); } client['track-mempool-tx'] = null; } @@ -378,7 +414,7 @@ class WebsocketHandler { } if (foundTransactions.length) { - response['address-transactions'] = foundTransactions; + response['address-transactions'] = JSON.stringify(foundTransactions); } } @@ -407,65 +443,60 @@ class WebsocketHandler { }); if (foundTransactions.length) { - response['address-transactions'] = foundTransactions; + response['address-transactions'] = JSON.stringify(foundTransactions); } } if (client['track-tx']) { const trackTxid = client['track-tx']; - const outspends: object = {}; - newTransactions.forEach((tx) => tx.vin.forEach((vin, i) => { - if (vin.txid === trackTxid) { - outspends[vin.vout] = { - vin: i, - txid: tx.txid, - }; - } - })); + const outspends = outspendCache[trackTxid]; - if (Object.keys(outspends).length) { - response['utxoSpent'] = outspends; + if (outspends && Object.keys(outspends).length) { + response['utxoSpent'] = JSON.stringify(outspends); } const rbfReplacedBy = rbfCache.getReplacedBy(client['track-tx']); if (rbfReplacedBy) { - response['rbfTransaction'] = { + response['rbfTransaction'] = JSON.stringify({ txid: rbfReplacedBy, - } + }) } const rbfChange = rbfChanges.map[client['track-tx']]; if (rbfChange) { - response['rbfInfo'] = rbfChanges.trees[rbfChange]; + response['rbfInfo'] = JSON.stringify(rbfChanges.trees[rbfChange]); } const mempoolTx = newMempool[trackTxid]; if (mempoolTx && mempoolTx.position) { - response['txPosition'] = { + response['txPosition'] = JSON.stringify({ txid: trackTxid, position: mempoolTx.position, - }; + }); } } if (client['track-mempool-block'] >= 0) { const index = client['track-mempool-block']; if (mBlockDeltas[index]) { - response['projected-block-transactions'] = { + response['projected-block-transactions'] = getCachedResponse(`projected-block-transactions-${index}`, { index: index, delta: mBlockDeltas[index], - }; + }); } } if (client['track-rbf'] === 'all' && rbfReplacements) { - response['rbfLatest'] = rbfReplacements; + response['rbfLatest'] = getCachedResponse('rbfLatest', rbfReplacements); } else if (client['track-rbf'] === 'fullRbf' && fullRbfReplacements) { - response['rbfLatest'] = fullRbfReplacements; + response['rbfLatest'] = getCachedResponse('fullrbfLatest', fullRbfReplacements); } if (Object.keys(response).length) { - client.send(JSON.stringify(response)); + const serializedResponse = '{' + + Object.keys(response).map(key => `"${key}": ${response[key]}`).join(', ') + + '}'; + client.send(serializedResponse); } }); } @@ -556,6 +587,14 @@ class WebsocketHandler { const da = difficultyAdjustment.getDifficultyAdjustment(); const fees = feeApi.getRecommendedFee(); + const responseCache = {}; + function getCachedResponse(key, data) { + if (!responseCache[key]) { + responseCache[key] = JSON.stringify(data); + } + return responseCache[key]; + } + this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { return; @@ -565,28 +604,27 @@ class WebsocketHandler { return; } - const response = { - 'block': block, - 'mempoolInfo': memPool.getMempoolInfo(), - 'da': da?.previousTime ? da : undefined, - 'fees': fees, - }; + const response = {}; + response['block'] = getCachedResponse('block', block); + response['mempoolInfo'] = getCachedResponse('mempoolInfo', memPool.getMempoolInfo(),); + response['da'] = getCachedResponse('da', da?.previousTime ? da : undefined); + response['fees'] = getCachedResponse('fees', fees); if (mBlocks && client['want-mempool-blocks']) { - response['mempool-blocks'] = mBlocks; + response['mempool-blocks'] = getCachedResponse('mempool-blocks', mBlocks); } if (client['track-tx']) { const trackTxid = client['track-tx']; if (txIds.indexOf(trackTxid) > -1) { - response['txConfirmed'] = true; + response['txConfirmed'] = 'true'; } else { const mempoolTx = _memPool[trackTxid]; if (mempoolTx && mempoolTx.position) { - response['txPosition'] = { + response['txPosition'] = JSON.stringify({ txid: trackTxid, position: mempoolTx.position, - }; + }); } } } @@ -614,7 +652,7 @@ class WebsocketHandler { }; }); - response['block-transactions'] = foundTransactions; + response['block-transactions'] = JSON.stringify(foundTransactions); } } @@ -651,21 +689,24 @@ class WebsocketHandler { }; }); - response['block-transactions'] = foundTransactions; + response['block-transactions'] = JSON.stringify(foundTransactions); } } if (client['track-mempool-block'] >= 0) { const index = client['track-mempool-block']; if (mBlockDeltas && mBlockDeltas[index]) { - response['projected-block-transactions'] = { + response['projected-block-transactions'] = getCachedResponse(`projected-block-transactions-${index}`, { index: index, delta: mBlockDeltas[index], - }; + }); } } - client.send(JSON.stringify(response)); + const serializedResponse = '{' + + Object.keys(response).map(key => `"${key}": ${response[key]}`).join(', ') + + '}'; + client.send(serializedResponse); }); } From ffd7831efc93fb9d07bf8842c4d2c2fb0826a0b6 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 9 May 2023 19:48:02 -0600 Subject: [PATCH 300/782] optimize websocket init data --- backend/src/api/bitcoin/bitcoin.routes.ts | 5 +- backend/src/api/websocket-handler.ts | 90 ++++++++++++++++------- 2 files changed, 65 insertions(+), 30 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index 18d688e9b..16533b68c 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -130,8 +130,9 @@ class BitcoinRoutes { private getInitData(req: Request, res: Response) { try { - const result = websocketHandler.getInitData(); - res.json(result); + const result = websocketHandler.getSerializedInitData(); + res.set('Content-Type', 'application/json'); + res.send(result); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index eb099f229..3fa7006fb 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -30,6 +30,9 @@ class WebsocketHandler { private numConnected = 0; private numDisconnected = 0; + private initData: { [key: string]: string } = {}; + private serializedInitData: string = '{}'; + constructor() { } setWebsocketServer(wss: WebSocket.Server) { @@ -38,6 +41,41 @@ class WebsocketHandler { setExtraInitProperties(property: string, value: any) { this.extraInitProperties[property] = value; + this.setInitDataFields(this.extraInitProperties); + } + + private setInitDataFields(data: { [property: string]: any }): void { + for (const property of Object.keys(data)) { + if (data[property] != null) { + this.initData[property] = JSON.stringify(data[property]); + } else { + delete this.initData[property]; + } + } + this.serializedInitData = '{' + + Object.keys(this.initData).map(key => `"${key}": ${this.initData[key]}`).join(', ') + + '}'; + } + + private updateInitData(): void { + const _blocks = blocks.getBlocks().slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT); + const da = difficultyAdjustment.getDifficultyAdjustment(); + this.setInitDataFields({ + 'mempoolInfo': memPool.getMempoolInfo(), + 'vBytesPerSecond': memPool.getVBytesPerSecond(), + 'blocks': _blocks, + 'conversions': priceUpdater.getLatestPrices(), + 'mempool-blocks': mempoolBlocks.getMempoolBlocks(), + 'transactions': memPool.getLatestTransactions(), + 'backendInfo': backendInfo.getBackendInfo(), + 'loadingIndicators': loadingIndicators.getLoadingIndicators(), + 'da': da?.previousTime ? da : undefined, + 'fees': feeApi.getRecommendedFee(), + }); + } + + public getSerializedInitData(): string { + return this.serializedInitData; } setupConnectionHandling() { @@ -157,11 +195,13 @@ class WebsocketHandler { } if (parsedMessage.action === 'init') { - const _blocks = blocks.getBlocks().slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT); - if (!_blocks) { + if (!this.initData['blocks']?.length || !this.initData['da']) { + this.updateInitData(); + } + if (!this.initData['blocks']?.length) { return; } - client.send(JSON.stringify(this.getInitData(_blocks))); + client.send(this.serializedInitData); } if (parsedMessage.action === 'ping') { @@ -210,6 +250,8 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } + this.setInitDataFields({ 'loadingIndicators': indicators }); + const response = JSON.stringify({ loadingIndicators: indicators }); this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { @@ -224,6 +266,8 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } + this.setInitDataFields({ 'conversions': conversionRates }); + const response = JSON.stringify({ conversions: conversionRates }); this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { @@ -233,26 +277,6 @@ class WebsocketHandler { }); } - getInitData(_blocks?: BlockExtended[]) { - if (!_blocks) { - _blocks = blocks.getBlocks().slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT); - } - const da = difficultyAdjustment.getDifficultyAdjustment(); - return { - 'mempoolInfo': memPool.getMempoolInfo(), - 'vBytesPerSecond': memPool.getVBytesPerSecond(), - 'blocks': _blocks, - 'conversions': priceUpdater.getLatestPrices(), - 'mempool-blocks': mempoolBlocks.getMempoolBlocks(), - 'transactions': memPool.getLatestTransactions(), - 'backendInfo': backendInfo.getBackendInfo(), - 'loadingIndicators': loadingIndicators.getLoadingIndicators(), - 'da': da?.previousTime ? da : undefined, - 'fees': feeApi.getRecommendedFee(), - ...this.extraInitProperties - }; - } - handleNewStatistic(stats: OptimizedStatistic) { if (!this.wss) { throw new Error('WebSocket.Server is not set'); @@ -310,8 +334,11 @@ class WebsocketHandler { } const recommendedFees = feeApi.getRecommendedFee(); + // update init data + this.updateInitData(); + // cache serialized objects to avoid stringify-ing the same thing for every client - const responseCache = {}; + const responseCache = { ...this.initData }; function getCachedResponse(key: string, data): string { if (!responseCache[key]) { responseCache[key] = JSON.stringify(data); @@ -342,6 +369,8 @@ class WebsocketHandler { } } + const latestTransactions = newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx)); + this.wss.clients.forEach(async (client) => { if (client.readyState !== WebSocket.OPEN) { return; @@ -352,7 +381,7 @@ class WebsocketHandler { if (client['want-stats']) { response['mempoolInfo'] = getCachedResponse('mempoolInfo', mempoolInfo); response['vBytesPerSecond'] = getCachedResponse('vBytesPerSecond', vBytesPerSecond); - response['transactions'] = getCachedResponse('transactions', newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx))); + response['transactions'] = getCachedResponse('transactions', latestTransactions); if (da?.previousTime) { response['da'] = getCachedResponse('da', da); } @@ -587,14 +616,19 @@ class WebsocketHandler { const da = difficultyAdjustment.getDifficultyAdjustment(); const fees = feeApi.getRecommendedFee(); - const responseCache = {}; - function getCachedResponse(key, data) { + // update init data + this.updateInitData(); + + const responseCache = { ...this.initData }; + function getCachedResponse(key, data): string { if (!responseCache[key]) { responseCache[key] = JSON.stringify(data); } return responseCache[key]; } + const mempoolInfo = memPool.getMempoolInfo(); + this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { return; @@ -606,7 +640,7 @@ class WebsocketHandler { const response = {}; response['block'] = getCachedResponse('block', block); - response['mempoolInfo'] = getCachedResponse('mempoolInfo', memPool.getMempoolInfo(),); + response['mempoolInfo'] = getCachedResponse('mempoolInfo', mempoolInfo); response['da'] = getCachedResponse('da', da?.previousTime ? da : undefined); response['fees'] = getCachedResponse('fees', fees); From 4b20ea7232b45fbe7bd029f42e8dde7ff33d8152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Strnad?= <43024885+vostrnad@users.noreply.github.com> Date: Thu, 11 May 2023 00:10:57 +0200 Subject: [PATCH 301/782] Accept the CLA for @vostrnad --- contributors/vostrnad.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/vostrnad.txt diff --git a/contributors/vostrnad.txt b/contributors/vostrnad.txt new file mode 100644 index 000000000..6b295c715 --- /dev/null +++ b/contributors/vostrnad.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. + +Signed: vostrnad From be53cd8b4849579a1900394e1dda6b52962d1ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Strnad?= <43024885+vostrnad@users.noreply.github.com> Date: Thu, 11 May 2023 00:11:23 +0200 Subject: [PATCH 302/782] Display empty witness items --- .../transactions-list/transactions-list.component.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index 71eeb4aa1..0d195f2ff 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -114,7 +114,12 @@

    - {{ witness }} + + {{ witness }} + + + <empty> +

    ... From 3d1cd3193a35efae0d1ace86f8a3e48e065820a9 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 10 May 2023 12:59:05 -0600 Subject: [PATCH 303/782] online calculation of stack-of-n-blocks fee statistics --- backend/src/api/common.ts | 118 +++++++++++++++++++++++++++++- backend/src/api/mempool-blocks.ts | 53 +++++++++++--- backend/src/mempool.interfaces.ts | 5 ++ 3 files changed, 166 insertions(+), 10 deletions(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index b044e2866..fc952d6a8 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -1,4 +1,4 @@ -import { Ancestor, CpfpInfo, CpfpSummary, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, TransactionStripped } from '../mempool.interfaces'; +import { Ancestor, CpfpInfo, CpfpSummary, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, TransactionStripped, WorkingEffectiveFeeStats } from '../mempool.interfaces'; import config from '../config'; import { NodeSocket } from '../repositories/NodesSocketsRepository'; import { isIP } from 'net'; @@ -442,3 +442,119 @@ export class Common { return sortedDistribution[Math.floor((sortedDistribution.length - 1) * (n / 100))]; } } + +/** + * Class to calculate average fee rates of a list of transactions + * at certain weight percentiles, in a single pass + * + * init with: + * maxWeight - the total weight to measure percentiles relative to (e.g. 4MW for a single block) + * percentileBandWidth - how many weight units to average over for each percentile (as a % of maxWeight) + * percentiles - an array of weight percentiles to compute, in % + * + * then call .processNext(tx) for each transaction, in descending order + * + * retrieve the final results with .getFeeStats() + */ +export class OnlineFeeStatsCalculator { + private maxWeight: number; + private percentiles = [10,25,50,75,90]; + + private bandWidthPercent = 2; + private bandWidth: number = 0; + private bandIndex = 0; + private leftBound = 0; + private rightBound = 0; + private inBand = false; + private totalBandFee = 0; + private totalBandWeight = 0; + private minBandRate = Infinity; + private maxBandRate = 0; + + private feeRange: { avg: number, min: number, max: number }[] = []; + private totalWeight: number = 0; + + constructor (maxWeight: number, percentileBandWidth?: number, percentiles?: number[]) { + this.maxWeight = maxWeight; + if (percentiles && percentiles.length) { + this.percentiles = percentiles; + } + if (percentileBandWidth != null) { + this.bandWidthPercent = percentileBandWidth; + } + this.bandWidth = this.maxWeight * (this.bandWidthPercent / 100); + // add min/max percentiles aligned to the ends of the range + this.percentiles.unshift(this.bandWidthPercent / 2); + this.percentiles.push(100 - (this.bandWidthPercent / 2)); + this.setNextBounds(); + } + + processNext(tx: { weight: number, fee: number, effectiveFeePerVsize?: number, feePerVsize?: number, rate?: number, txid: string }): void { + let left = this.totalWeight; + const right = this.totalWeight + tx.weight; + if (!this.inBand && right <= this.leftBound) { + this.totalWeight += tx.weight; + return; + } + + while (left < right) { + if (right > this.leftBound) { + this.inBand = true; + const txRate = (tx.rate || tx.effectiveFeePerVsize || tx.feePerVsize || 0); + const weight = Math.min(right, this.rightBound) - Math.max(left, this.leftBound); + this.totalBandFee += (txRate * weight); + this.totalBandWeight += weight; + this.maxBandRate = Math.max(this.maxBandRate, txRate); + this.minBandRate = Math.min(this.minBandRate, txRate); + } + left = Math.min(right, this.rightBound); + + if (left >= this.rightBound) { + this.inBand = false; + const avgBandFeeRate = this.totalBandWeight ? (this.totalBandFee / this.totalBandWeight) : 0; + this.feeRange.unshift({ avg: avgBandFeeRate, min: this.minBandRate, max: this.maxBandRate }); + this.bandIndex++; + this.setNextBounds(); + this.totalBandFee = 0; + this.totalBandWeight = 0; + this.minBandRate = Infinity; + this.maxBandRate = 0; + } + } + this.totalWeight += tx.weight; + } + + private setNextBounds(): void { + const nextPercentile = this.percentiles[this.bandIndex]; + if (nextPercentile != null) { + this.leftBound = ((nextPercentile / 100) * this.maxWeight) - (this.bandWidth / 2); + this.rightBound = this.leftBound + this.bandWidth; + } else { + this.leftBound = Infinity; + this.rightBound = Infinity; + } + } + + getRawFeeStats(): WorkingEffectiveFeeStats { + if (this.totalBandWeight > 0) { + const avgBandFeeRate = this.totalBandWeight ? (this.totalBandFee / this.totalBandWeight) : 0; + this.feeRange.unshift({ avg: avgBandFeeRate, min: this.minBandRate, max: this.maxBandRate }); + } + while (this.feeRange.length < this.percentiles.length) { + this.feeRange.unshift({ avg: 0, min: 0, max: 0 }); + } + return { + minFee: this.feeRange[0].min, + medianFee: this.feeRange[Math.floor(this.feeRange.length / 2)].avg, + maxFee: this.feeRange[this.feeRange.length - 1].max, + feeRange: this.feeRange.map(f => f.avg), + }; + } + + getFeeStats(): EffectiveFeeStats { + const stats = this.getRawFeeStats(); + stats.feeRange[0] = stats.minFee; + stats.feeRange[stats.feeRange.length - 1] = stats.maxFee; + return stats; + } +} diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 62717ed7e..803b7e56e 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,6 +1,6 @@ import logger from '../logger'; -import { MempoolBlock, TransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction } from '../mempool.interfaces'; -import { Common } from './common'; +import { MempoolBlock, TransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces'; +import { Common, OnlineFeeStatsCalculator } from './common'; import config from '../config'; import { Worker } from 'worker_threads'; import path from 'path'; @@ -104,6 +104,8 @@ class MempoolBlocks { private calculateMempoolBlocks(transactionsSorted: TransactionExtended[]): MempoolBlockWithTransactions[] { const mempoolBlocks: MempoolBlockWithTransactions[] = []; + let feeStatsCalculator: OnlineFeeStatsCalculator = new OnlineFeeStatsCalculator(config.MEMPOOL.BLOCK_WEIGHT_UNITS); + let onlineStats = false; let blockSize = 0; let blockWeight = 0; let blockVsize = 0; @@ -111,7 +113,7 @@ class MempoolBlocks { const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; let transactionIds: string[] = []; let transactions: TransactionExtended[] = []; - transactionsSorted.forEach((tx) => { + transactionsSorted.forEach((tx, index) => { if (blockWeight + tx.weight <= config.MEMPOOL.BLOCK_WEIGHT_UNITS || mempoolBlocks.length === config.MEMPOOL.MEMPOOL_BLOCKS_AMOUNT - 1) { tx.position = { @@ -126,6 +128,9 @@ class MempoolBlocks { transactions.push(tx); } transactionIds.push(tx.txid); + if (onlineStats) { + feeStatsCalculator.processNext(tx); + } } else { mempoolBlocks.push(this.dataToMempoolBlocks(transactionIds, transactions, blockSize, blockWeight, blockFees)); blockVsize = 0; @@ -133,6 +138,16 @@ class MempoolBlocks { block: mempoolBlocks.length, vsize: blockVsize + (tx.vsize / 2), }; + + if (mempoolBlocks.length === config.MEMPOOL.MEMPOOL_BLOCKS_AMOUNT - 1) { + const stackWeight = transactionsSorted.slice(index).reduce((total, tx) => total + (tx.weight || 0), 0); + if (stackWeight > config.MEMPOOL.BLOCK_WEIGHT_UNITS) { + onlineStats = true; + feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5); + feeStatsCalculator.processNext(tx); + } + } + blockVsize += tx.vsize; blockWeight = tx.weight; blockSize = tx.size; @@ -142,7 +157,8 @@ class MempoolBlocks { } }); if (transactions.length) { - mempoolBlocks.push(this.dataToMempoolBlocks(transactionIds, transactions, blockSize, blockWeight, blockFees)); + const feeStats = onlineStats ? feeStatsCalculator.getRawFeeStats() : undefined; + mempoolBlocks.push(this.dataToMempoolBlocks(transactionIds, transactions, blockSize, blockWeight, blockFees, feeStats)); } return mempoolBlocks; @@ -310,7 +326,16 @@ class MempoolBlocks { } } - const readyBlocks: { transactionIds, transactions, totalSize, totalWeight, totalFees }[] = []; + let hasBlockStack = blocks.length >= 8; + let stackWeight; + let feeStatsCalculator: OnlineFeeStatsCalculator | void; + if (hasBlockStack) { + stackWeight = blocks[blocks.length - 1].reduce((total, tx) => total + (mempool[tx]?.weight || 0), 0); + hasBlockStack = stackWeight > config.MEMPOOL.BLOCK_WEIGHT_UNITS; + feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5); + } + + const readyBlocks: { transactionIds, transactions, totalSize, totalWeight, totalFees, feeStats }[] = []; const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; // update this thread's mempool with the results for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) { @@ -333,6 +358,11 @@ class MempoolBlocks { }; mempoolTx.cpfpChecked = true; + // online calculation of stack-of-blocks fee stats + if (hasBlockStack && blockIndex === blocks.length - 1 && feeStatsCalculator) { + feeStatsCalculator.processNext(mempoolTx); + } + totalSize += mempoolTx.size; totalVsize += mempoolTx.vsize; totalWeight += mempoolTx.weight; @@ -348,7 +378,8 @@ class MempoolBlocks { transactions, totalSize, totalWeight, - totalFees + totalFees, + feeStats: (hasBlockStack && blockIndex === blocks.length - 1 && feeStatsCalculator) ? feeStatsCalculator.getRawFeeStats() : undefined, }); } @@ -382,7 +413,9 @@ class MempoolBlocks { } } - const mempoolBlocks = readyBlocks.map(b => this.dataToMempoolBlocks(b.transactionIds, b.transactions, b.totalSize, b.totalWeight, b.totalFees)); + const mempoolBlocks = readyBlocks.map((b, index) => { + return this.dataToMempoolBlocks(b.transactionIds, b.transactions, b.totalSize, b.totalWeight, b.totalFees, b.feeStats); + }); if (saveResults) { const deltas = this.calculateMempoolDeltas(this.mempoolBlocks, mempoolBlocks); @@ -393,8 +426,10 @@ class MempoolBlocks { return mempoolBlocks; } - private dataToMempoolBlocks(transactionIds: string[], transactions: TransactionExtended[], totalSize: number, totalWeight: number, totalFees: number): MempoolBlockWithTransactions { - const feeStats = Common.calcEffectiveFeeStatistics(transactions); + private dataToMempoolBlocks(transactionIds: string[], transactions: TransactionExtended[], totalSize: number, totalWeight: number, totalFees: number, feeStats?: EffectiveFeeStats ): MempoolBlockWithTransactions { + if (!feeStats) { + feeStats = Common.calcEffectiveFeeStatistics(transactions); + } return { blockSize: totalSize, blockVSize: (totalWeight / 4), // fractional vsize to avoid rounding errors diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index ab4c4cd25..7204c174e 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -237,6 +237,11 @@ export interface EffectiveFeeStats { feeRange: number[]; // 2nd, 10th, 25th, 50th, 75th, 90th, 98th percentiles } +export interface WorkingEffectiveFeeStats extends EffectiveFeeStats { + minFee: number; + maxFee: number; +} + export interface CpfpSummary { transactions: TransactionExtended[]; clusters: { root: string, height: number, txs: Ancestor[], effectiveFeePerVsize: number }[]; From abbaee0274a48edd8a96a9c30b3a966dbbbf03cd Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 10 May 2023 19:57:58 -0600 Subject: [PATCH 304/782] Fix txids interpreted as addresses in search --- .../src/app/components/search-form/search-form.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/search-form/search-form.component.ts b/frontend/src/app/components/search-form/search-form.component.ts index af5ccc654..422cb2f45 100644 --- a/frontend/src/app/components/search-form/search-form.component.ts +++ b/frontend/src/app/components/search-form/search-form.component.ts @@ -153,7 +153,7 @@ export class SearchFormComponent implements OnInit { const matchesBlockHeight = this.regexBlockheight.test(searchText); const matchesTxId = this.regexTransaction.test(searchText) && !this.regexBlockhash.test(searchText); const matchesBlockHash = this.regexBlockhash.test(searchText); - const matchesAddress = this.regexAddress.test(searchText); + const matchesAddress = !matchesTxId && this.regexAddress.test(searchText); if (matchesAddress && this.network === 'bisq') { searchText = 'B' + searchText; @@ -198,7 +198,7 @@ export class SearchFormComponent implements OnInit { const searchText = result || this.searchForm.value.searchText.trim(); if (searchText) { this.isSearching = true; - if (this.regexAddress.test(searchText)) { + if (!this.regexTransaction.test(searchText) && this.regexAddress.test(searchText)) { this.navigate('/address/', searchText); } else if (this.regexBlockhash.test(searchText) || this.regexBlockheight.test(searchText)) { this.navigate('/block/', searchText); From 7bb34fe090a395779c8d62f305e9d1bd62b3758e Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 11 May 2023 14:30:57 +0200 Subject: [PATCH 305/782] [mempool graph] show horizontal guide line --- .../mempool-graph/mempool-graph.component.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/mempool-graph/mempool-graph.component.ts b/frontend/src/app/components/mempool-graph/mempool-graph.component.ts index cc53f425d..416b8f538 100644 --- a/frontend/src/app/components/mempool-graph/mempool-graph.component.ts +++ b/frontend/src/app/components/mempool-graph/mempool-graph.component.ts @@ -181,7 +181,7 @@ export class MempoolGraphComponent implements OnInit, OnChanges { alwaysShowContent: false, position: (pos, params, el, elRect, size) => { const positions = { top: (this.template === 'advanced') ? 0 : -30 }; - positions[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 60; + positions[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 100; return positions; }, extraCssText: `width: ${(this.template === 'advanced') ? '275px' : '200px'}; @@ -189,10 +189,19 @@ export class MempoolGraphComponent implements OnInit, OnChanges { border: none; box-shadow: none;`, axisPointer: { - type: 'line', + type: 'cross', + label: { + formatter: (params: any) => { + if (params.axisDimension === 'y') { + return this.vbytesPipe.transform(params.value, 2, 'vB', 'MvB', true) + } else { + return formatterXAxis(this.locale, this.windowPreference, params.value); + } + } + } }, formatter: (params: any) => { - const axisValueLabel: string = formatterXAxis(this.locale, this.windowPreference, params[0].axisValue); + const axisValueLabel: string = formatterXAxis(this.locale, this.windowPreference, params[0].axisValue); const { totalValue, totalValueArray } = this.getTotalValues(params); const itemFormatted = []; let totalParcial = 0; From e5bef55d479b6fd46a8bdc4f8887cd7f6780aae1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 11 May 2023 08:57:12 -0600 Subject: [PATCH 306/782] Fix RBF timestamps to always use seconds --- backend/src/api/rbf-cache.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 6c5afc146..d8fb8656c 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -36,7 +36,7 @@ class RbfCache { } const newTx = Common.stripTransaction(newTxExtended) as RbfTransaction; - const newTime = newTxExtended.firstSeen || Date.now(); + const newTime = newTxExtended.firstSeen || (Date.now() / 1000); newTx.rbf = newTxExtended.vin.some((v) => v.sequence < 0xfffffffe); this.txs.set(newTx.txid, newTxExtended); @@ -59,7 +59,7 @@ class RbfCache { } } } else { - const replacedTime = replacedTxExtended.firstSeen || Date.now(); + const replacedTime = replacedTxExtended.firstSeen || (Date.now() / 1000); replacedTrees.push({ tx: replacedTx, time: replacedTime, @@ -74,7 +74,7 @@ class RbfCache { const treeId = replacedTrees[0].tx.txid; const newTree = { tx: newTx, - time: newTxExtended.firstSeen || Date.now(), + time: newTime, fullRbf, replaces: replacedTrees }; From 107746feecb473c6d99a1f853f4dc3ada98a0f01 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 11 May 2023 11:38:57 -0500 Subject: [PATCH 307/782] Global footer fixes --- .../bisq-main-dashboard.component.html | 2 -- .../master-page/master-page.component.html | 4 ++-- .../master-page/master-page.component.ts | 11 +++++++++-- .../global-footer.component.html | 19 +++++++++---------- .../global-footer/global-footer.component.ts | 4 ---- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/frontend/src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html b/frontend/src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html index eab0537c7..4b2dc59c6 100644 --- a/frontend/src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html +++ b/frontend/src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html @@ -105,8 +105,6 @@
    - -
    diff --git a/frontend/src/app/components/master-page/master-page.component.html b/frontend/src/app/components/master-page/master-page.component.html index 6da59197c..0258a8e07 100644 --- a/frontend/src/app/components/master-page/master-page.component.html +++ b/frontend/src/app/components/master-page/master-page.component.html @@ -17,7 +17,7 @@ -
    - +
    {{ ticker.volume?.num_trades ? ticker.volume?.num_trades : 0 }}
    @@ -105,7 +105,6 @@ - @@ -122,4 +121,4 @@
    -
    \ No newline at end of file +
    diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html index 2054f1a5d..bf0a23e3f 100644 --- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html +++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html @@ -84,4 +84,6 @@ + +
    diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.scss b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.scss index fabb9e0e9..c4ecbb0ce 100644 --- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.scss +++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.scss @@ -17,6 +17,12 @@ li.nav-item { padding-right: 10px; } +@media (max-width: 992px) { + footer > .container-fluid { + padding-bottom: 35px; + } +} + @media (min-width: 992px) { .navbar { padding: 0rem 2rem; diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts index 0ab0259bd..921328ac9 100644 --- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts +++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts @@ -17,6 +17,7 @@ export class BisqMasterPageComponent implements OnInit { isMobile = window.innerWidth <= 767.98; urlLanguage: string; networkPaths: { [network: string]: string }; + footerVisible = false; constructor( private stateService: StateService, @@ -31,6 +32,9 @@ export class BisqMasterPageComponent implements OnInit { this.urlLanguage = this.languageService.getLanguageForUrl(); this.navigationService.subnetPaths.subscribe((paths) => { this.networkPaths = paths; + if( paths.bisq === "" ) { + this.footerVisible = true; + } }); } diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index d88a730fc..b38a60898 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -1147,7 +1147,7 @@ th { display: none; } -app-master-page, app-liquid-master-page { +app-master-page, app-liquid-master-page, app-bisq-master-page { display: flex; flex-direction: column; min-height: 100vh; From 982f1e007aca2a6f9d228ec412121215f515f71b Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 11 May 2023 18:48:53 -0400 Subject: [PATCH 316/782] Fix bisq quirks --- frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss | 5 ----- .../bisq-master-page/bisq-master-page.component.html | 4 +++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss index 3bae38e56..e8db46928 100644 --- a/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss +++ b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss @@ -1,11 +1,6 @@ .pagination-container { float: none; - margin-bottom: 200px; @media(min-width: 400px){ float: right; } } - -.container-xl { - padding-bottom: 110px; -} \ No newline at end of file diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html index bf0a23e3f..2c9eb8ebe 100644 --- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html +++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html @@ -82,7 +82,9 @@
    - +
    + +
    From 82a072bd87b9f8271397cac2fe4424fe0aeda941 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 11 May 2023 19:04:24 -0400 Subject: [PATCH 317/782] Remove footer from bisq docs --- .../bisq-master-page/bisq-master-page.component.html | 2 +- .../bisq-master-page/bisq-master-page.component.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html index 2c9eb8ebe..c1280efa1 100644 --- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html +++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html @@ -86,6 +86,6 @@ - +
    diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts index 921328ac9..f849998b1 100644 --- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts +++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts @@ -17,7 +17,7 @@ export class BisqMasterPageComponent implements OnInit { isMobile = window.innerWidth <= 767.98; urlLanguage: string; networkPaths: { [network: string]: string }; - footerVisible = false; + footerVisible = true; constructor( private stateService: StateService, @@ -32,7 +32,9 @@ export class BisqMasterPageComponent implements OnInit { this.urlLanguage = this.languageService.getLanguageForUrl(); this.navigationService.subnetPaths.subscribe((paths) => { this.networkPaths = paths; - if( paths.bisq === "" ) { + if (paths.mainnet.indexOf('docs') > -1) { + this.footerVisible = false; + } else { this.footerVisible = true; } }); From 208756bdd20fb663452ec9036a5d0e8985641014 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Thu, 11 May 2023 19:31:22 -0400 Subject: [PATCH 318/782] Show explorer links conditionally --- .../global-footer/global-footer.component.html | 9 +++++---- .../global-footer/global-footer.component.ts | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html index da9373063..a5a67ad28 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.html +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html @@ -46,10 +46,11 @@
    Match Removed Marginal fee rateHigh sigop count Recently broadcasted Added Marginal fee rate
    Effective fee rate
    @@ -490,7 +490,7 @@
    - +
    Virtual size
    Adjusted vsize
    Weight Locktime
    Sigops
    Transaction hex
    Effective fee rate
    diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index e548fdc46..60051634d 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -86,6 +86,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { segwitEnabled: boolean; rbfEnabled: boolean; taprootEnabled: boolean; + hasEffectiveFeeRate: boolean; @ViewChild('graphContainer') graphContainer: ElementRef; @@ -157,6 +158,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { .subscribe((cpfpInfo) => { if (!cpfpInfo || !this.tx) { this.cpfpInfo = null; + this.hasEffectiveFeeRate = false; return; } // merge ancestors/descendants @@ -164,7 +166,8 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { if (cpfpInfo.bestDescendant && !cpfpInfo.descendants?.length) { relatives.push(cpfpInfo.bestDescendant); } - if (!cpfpInfo.effectiveFeePerVsize) { + const hasRelatives = !!relatives.length; + if (!cpfpInfo.effectiveFeePerVsize && hasRelatives) { let totalWeight = this.tx.weight + relatives.reduce((prev, val) => prev + val.weight, 0); @@ -177,6 +180,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } this.cpfpInfo = cpfpInfo; + this.hasEffectiveFeeRate = hasRelatives || (this.tx.effectiveFeePerVsize && (Math.abs(this.tx.effectiveFeePerVsize - this.tx.feePerVsize) > 0.01)); }); this.fetchRbfSubscription = this.fetchRbfHistory$ @@ -362,6 +366,8 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { ancestors: tx.ancestors, bestDescendant: tx.bestDescendant, }; + const hasRelatives = !!(tx.ancestors.length || tx.bestDescendant); + this.hasEffectiveFeeRate = hasRelatives || (tx.effectiveFeePerVsize && (Math.abs(tx.effectiveFeePerVsize - tx.feePerVsize) > 0.01)); } else { this.fetchCpfp$.next(this.tx.txid); } @@ -503,6 +509,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.replaced = false; this.transactionTime = -1; this.cpfpInfo = null; + this.hasEffectiveFeeRate = false; this.rbfInfo = null; this.rbfReplaces = []; this.showCpfpDetails = false; From c558c85f36bb70eb3fc422e12e2b36060a08ea79 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 31 May 2023 09:48:44 -0700 Subject: [PATCH 388/782] fix possible backend crash --- backend/src/repositories/BlocksRepository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index a014e317e..5848fe331 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -928,7 +928,7 @@ class BlocksRepository { return blocks; } catch (e) { logger.err(`Cannot get blocks with missing coinstatsindex. Reason: ` + (e instanceof Error ? e.message : e)); - throw e; + return []; } } From 0b74cf1d8941ceb340ad20cb013dbea579b7c2bf Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 31 May 2023 09:58:29 -0700 Subject: [PATCH 389/782] fix possible backend crash x2, remove dead code, improve log --- backend/src/api/mining/mining.ts | 10 ++++++++-- backend/src/repositories/BlocksRepository.ts | 18 ++---------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/backend/src/api/mining/mining.ts b/backend/src/api/mining/mining.ts index 20da92de3..39a4423f2 100644 --- a/backend/src/api/mining/mining.ts +++ b/backend/src/api/mining/mining.ts @@ -472,11 +472,11 @@ class Mining { } this.blocksPriceIndexingRunning = true; + let totalInserted = 0; try { const prices: any[] = await PricesRepository.$getPricesTimesAndId(); const blocksWithoutPrices: any[] = await BlocksRepository.$getBlocksWithoutPrice(); - let totalInserted = 0; const blocksPrices: BlockPrice[] = []; for (const block of blocksWithoutPrices) { @@ -521,7 +521,13 @@ class Mining { } } catch (e) { this.blocksPriceIndexingRunning = false; - throw e; + logger.err(`Cannot index block prices. ${e}`); + } + + if (totalInserted > 0) { + logger.info(`Indexing blocks prices completed. Indexed ${totalInserted}`, logger.tags.mining); + } else { + logger.debug(`Indexing blocks prices completed. Indexed 0.`, logger.tags.mining); } this.blocksPriceIndexingRunning = false; diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 5848fe331..90cebf7e9 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -577,19 +577,6 @@ class BlocksRepository { } } - /** - * Return blocks height - */ - public async $getBlocksHeightsAndTimestamp(): Promise { - try { - const [rows]: any[] = await DB.query(`SELECT height, blockTimestamp as timestamp FROM blocks`); - return rows; - } catch (e) { - logger.err('Cannot get blocks height and timestamp from the db. Reason: ' + (e instanceof Error ? e.message : e)); - throw e; - } - } - /** * Get general block stats */ @@ -877,7 +864,7 @@ class BlocksRepository { /** * Get all blocks which have not be linked to a price yet */ - public async $getBlocksWithoutPrice(): Promise { + public async $getBlocksWithoutPrice(): Promise { try { const [rows]: any[] = await DB.query(` SELECT UNIX_TIMESTAMP(blocks.blockTimestamp) as timestamp, blocks.height @@ -889,7 +876,7 @@ class BlocksRepository { return rows; } catch (e) { logger.err('Cannot get blocks height and timestamp from the db. Reason: ' + (e instanceof Error ? e.message : e)); - throw e; + return []; } } @@ -909,7 +896,6 @@ class BlocksRepository { logger.debug(`Cannot save blocks prices for blocks [${blockPrices[0].height} to ${blockPrices[blockPrices.length - 1].height}] because it has already been indexed, ignoring`); } else { logger.err(`Cannot save blocks prices for blocks [${blockPrices[0].height} to ${blockPrices[blockPrices.length - 1].height}] into db. Reason: ` + (e instanceof Error ? e.message : e)); - throw e; } } } From b171ed6dd00a859506eee677cc4654c134a09709 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 25 May 2023 17:39:45 -0400 Subject: [PATCH 390/782] Break block templates into their own db table --- backend/src/api/database-migration.ts | 14 +++++++++++++- backend/src/repositories/BlocksAuditsRepository.ts | 1 + .../src/repositories/BlocksSummariesRepository.ts | 6 +++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index 21c87f9e2..e777d8adb 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository'; import { RowDataPacket } from 'mysql2'; class DatabaseMigration { - private static currentVersion = 60; + private static currentVersion = 61; private queryTimeout = 3600_000; private statisticsAddedIndexed = false; private uniqueLogs: string[] = []; @@ -521,6 +521,18 @@ class DatabaseMigration { await this.$executeQuery('ALTER TABLE `blocks_audits` ADD sigop_txs JSON DEFAULT "[]"'); await this.updateToSchemaVersion(60); } + + if (databaseSchemaVersion < 61 && isBitcoin === true) { + // Break block templates into their own table + if (! await this.$checkIfTableExists('blocks_templates')) { + await this.$executeQuery('CREATE TABLE blocks_templates AS SELECT id, template FROM blocks_summaries WHERE template != "[]"'); + } + await this.$executeQuery('ALTER TABLE blocks_templates MODIFY template JSON DEFAULT "[]"'); + await this.$executeQuery('ALTER TABLE blocks_templates ADD PRIMARY KEY (id)'); + await this.$executeQuery('ALTER TABLE blocks_summaries DROP COLUMN template'); + await this.updateToSchemaVersion(61); + } + } /** diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index 33075f43c..656340743 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -55,6 +55,7 @@ class BlocksAuditRepositories { transactions, template, missing_txs as missingTxs, added_txs as addedTxs, fresh_txs as freshTxs, sigop_txs as sigopTxs, match_rate as matchRate FROM blocks_audits JOIN blocks ON blocks.hash = blocks_audits.hash + JOIN blocks_templates ON blocks_templates.id = blocks_audits.hash JOIN blocks_summaries ON blocks_summaries.id = blocks_audits.hash WHERE blocks_audits.hash = "${hash}" `); diff --git a/backend/src/repositories/BlocksSummariesRepository.ts b/backend/src/repositories/BlocksSummariesRepository.ts index f2560fbe7..87d2617e6 100644 --- a/backend/src/repositories/BlocksSummariesRepository.ts +++ b/backend/src/repositories/BlocksSummariesRepository.ts @@ -36,11 +36,11 @@ class BlocksSummariesRepository { try { const transactions = JSON.stringify(params.template?.transactions || []); await DB.query(` - INSERT INTO blocks_summaries (height, id, transactions, template) - VALUE (?, ?, ?, ?) + INSERT INTO blocks_templates (id, template) + VALUE (?, ?) ON DUPLICATE KEY UPDATE template = ? - `, [params.height, blockId, '[]', transactions, transactions]); + `, [blockId, transactions, transactions]); } catch (e: any) { if (e.errno === 1062) { // ER_DUP_ENTRY - This scenario is possible upon node backend restart logger.debug(`Cannot save block template for ${blockId} because it has already been indexed, ignoring`); From c49626aefce41849f4ea65537b583d0a4fbd6c58 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 30 May 2023 16:36:49 -0400 Subject: [PATCH 391/782] Confirmation badge component, fix negative confirmations --- backend/src/api/websocket-handler.ts | 4 +-- .../bisq-transaction.component.html | 8 +++--- .../bisq-transfers.component.html | 6 +---- .../transaction/transaction.component.html | 14 +---------- .../transaction/transaction.component.ts | 2 +- .../transactions-list.component.html | 9 +------ .../src/app/interfaces/websocket.interface.ts | 2 +- frontend/src/app/services/state.service.ts | 2 +- .../src/app/services/websocket.service.ts | 2 +- .../confirmations.component.html | 13 ++++++++++ .../confirmations.component.scss | 0 .../confirmations/confirmations.component.ts | 25 +++++++++++++++++++ frontend/src/app/shared/shared.module.ts | 3 +++ 13 files changed, 53 insertions(+), 37 deletions(-) create mode 100644 frontend/src/app/shared/components/confirmations/confirmations.component.html create mode 100644 frontend/src/app/shared/components/confirmations/confirmations.component.scss create mode 100644 frontend/src/app/shared/components/confirmations/confirmations.component.ts diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 89b819b08..557d751e4 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -657,8 +657,8 @@ class WebsocketHandler { if (client['track-tx']) { const trackTxid = client['track-tx']; - if (txIds.indexOf(trackTxid) > -1) { - response['txConfirmed'] = 'true'; + if (trackTxid && txIds.indexOf(trackTxid) > -1) { + response['txConfirmed'] = JSON.stringify(trackTxid); } else { const mempoolTx = _memPool[trackTxid]; if (mempoolTx && mempoolTx.position) { diff --git a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html index 3a23688e6..44f7b840e 100644 --- a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html +++ b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html @@ -15,11 +15,9 @@
    - +
    + +
    diff --git a/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.html b/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.html index 0388ea418..dc4993e90 100644 --- a/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.html +++ b/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.html @@ -70,11 +70,7 @@
    - +   - - - - - - - +
    diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 60051634d..dd32b05e8 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -391,7 +391,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.blocksSubscription = this.stateService.blocks$.subscribe(([block, txConfirmed]) => { this.latestBlock = block; - if (txConfirmed && this.tx && !this.tx.status.confirmed) { + if (txConfirmed && this.tx && !this.tx.status.confirmed && txConfirmed === this.tx.txid) { this.tx.status = { confirmed: true, block_height: block.height, diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index 0d195f2ff..c509a799d 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -298,14 +298,7 @@
    - - - - + + + + + + + + \ No newline at end of file diff --git a/frontend/src/app/shared/components/confirmations/confirmations.component.scss b/frontend/src/app/shared/components/confirmations/confirmations.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/shared/components/confirmations/confirmations.component.ts b/frontend/src/app/shared/components/confirmations/confirmations.component.ts new file mode 100644 index 000000000..dc66673ed --- /dev/null +++ b/frontend/src/app/shared/components/confirmations/confirmations.component.ts @@ -0,0 +1,25 @@ +import { Component, Input, OnChanges } from '@angular/core'; + + +@Component({ + selector: 'app-confirmations', + templateUrl: './confirmations.component.html', + styleUrls: ['./confirmations.component.scss'], +}) +export class ConfirmationsComponent implements OnChanges { + @Input() chainTip: number; + @Input() height: number; + @Input() replaced: boolean = false; + @Input() hideUnconfirmed: boolean = false; + @Input() buttonClass: string = ''; + + confirmations: number = 0; + + ngOnChanges(): void { + if (this.chainTip != null && this.height != null) { + this.confirmations = Math.max(1, this.chainTip - this.height + 1); + } else { + this.confirmations = 0; + } + } +} diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 6e8d8d0f2..d24f5356e 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -85,6 +85,7 @@ import { SatsComponent } from './components/sats/sats.component'; import { TruncateComponent } from './components/truncate/truncate.component'; import { SearchResultsComponent } from '../components/search-form/search-results/search-results.component'; import { TimestampComponent } from './components/timestamp/timestamp.component'; +import { ConfirmationsComponent } from './components/confirmations/confirmations.component'; import { ToggleComponent } from './components/toggle/toggle.component'; import { GeolocationComponent } from '../shared/components/geolocation/geolocation.component'; import { TestnetAlertComponent } from './components/testnet-alert/testnet-alert.component'; @@ -175,6 +176,7 @@ import { ClockMempoolComponent } from '../components/clock/clock-mempool.compone TruncateComponent, SearchResultsComponent, TimestampComponent, + ConfirmationsComponent, ToggleComponent, GeolocationComponent, TestnetAlertComponent, @@ -289,6 +291,7 @@ import { ClockMempoolComponent } from '../components/clock/clock-mempool.compone TruncateComponent, SearchResultsComponent, TimestampComponent, + ConfirmationsComponent, ToggleComponent, GeolocationComponent, PreviewTitleComponent, From 9d4b58604b43706bcf5a369ec1231ad7a95af724 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 4 Jun 2023 10:32:24 +0400 Subject: [PATCH 392/782] Optimize change detection --- .../shared/components/confirmations/confirmations.component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/shared/components/confirmations/confirmations.component.ts b/frontend/src/app/shared/components/confirmations/confirmations.component.ts index dc66673ed..8d14128e5 100644 --- a/frontend/src/app/shared/components/confirmations/confirmations.component.ts +++ b/frontend/src/app/shared/components/confirmations/confirmations.component.ts @@ -1,10 +1,11 @@ -import { Component, Input, OnChanges } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; @Component({ selector: 'app-confirmations', templateUrl: './confirmations.component.html', styleUrls: ['./confirmations.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ConfirmationsComponent implements OnChanges { @Input() chainTip: number; From 8b1dff6d15697d21b3853c3c3c3793a73d9127b7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 4 Jun 2023 11:44:40 -0400 Subject: [PATCH 393/782] fix txConfirmed type --- frontend/src/app/interfaces/websocket.interface.ts | 2 +- frontend/src/app/services/state.service.ts | 4 ++-- frontend/src/app/services/websocket.service.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 20d1cbeed..83a0c636e 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -6,7 +6,7 @@ export interface WebsocketResponse { block?: BlockExtended; blocks?: BlockExtended[]; conversions?: any; - txConfirmed?: string | boolean; + txConfirmed?: string; historicalDate?: string; mempoolInfo?: MempoolInfo; vBytesPerSecond?: number; diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index d6e39ddc9..55f349cc1 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -92,7 +92,7 @@ export class StateService { networkChanged$ = new ReplaySubject(1); lightningChanged$ = new ReplaySubject(1); - blocks$: ReplaySubject<[BlockExtended, string | boolean]>; + blocks$: ReplaySubject<[BlockExtended, string]>; transactions$ = new ReplaySubject(6); conversions$ = new ReplaySubject(1); bsqPrice$ = new ReplaySubject(1); @@ -163,7 +163,7 @@ export class StateService { } }); - this.blocks$ = new ReplaySubject<[BlockExtended, boolean]>(this.env.KEEP_BLOCKS_AMOUNT); + this.blocks$ = new ReplaySubject<[BlockExtended, string]>(this.env.KEEP_BLOCKS_AMOUNT); if (this.env.BASE_MODULE === 'bisq') { this.network = this.env.BASE_MODULE; diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index 7a84aadd7..af7a465f8 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -241,7 +241,7 @@ export class WebsocketService { blocks.forEach((block: BlockExtended) => { if (block.height > this.stateService.latestBlockHeight) { maxHeight = Math.max(maxHeight, block.height); - this.stateService.blocks$.next([block, false]); + this.stateService.blocks$.next([block, '']); } }); this.stateService.updateChainTip(maxHeight); @@ -258,7 +258,7 @@ export class WebsocketService { if (response.block) { if (response.block.height > this.stateService.latestBlockHeight) { this.stateService.updateChainTip(response.block.height); - this.stateService.blocks$.next([response.block, response.txConfirmed]); + this.stateService.blocks$.next([response.block, response.txConfirmed || '']); } if (response.txConfirmed) { From 37dd95a4a01094e0947261cc55026d81147563f5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 4 Jun 2023 12:36:27 -0400 Subject: [PATCH 394/782] fix firstSeen reset bug --- backend/src/api/transaction-utils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 2d1f0f955..8523a938e 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -59,8 +59,8 @@ class TransactionUtils { feePerVsize: feePerVbytes, effectiveFeePerVsize: feePerVbytes, }, transaction); - if (!transaction?.status?.confirmed) { - transactionExtended.firstSeen = Math.round((new Date().getTime() / 1000)); + if (!transaction?.status?.confirmed && !transactionExtended.firstSeen) { + transactionExtended.firstSeen = Math.round((Date.now() / 1000)); } return transactionExtended; } @@ -83,8 +83,8 @@ class TransactionUtils { adjustedFeePerVsize: adjustedFeePerVsize, effectiveFeePerVsize: adjustedFeePerVsize, }); - if (!transaction?.status?.confirmed) { - transactionExtended.firstSeen = Math.round((new Date().getTime() / 1000)); + if (!transactionExtended?.status?.confirmed && !transactionExtended.firstSeen) { + transactionExtended.firstSeen = Math.round((Date.now() / 1000)); } return transactionExtended; } From 3c0bb11208278f68b3c627e067047a4489832946 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Mon, 5 Jun 2023 13:20:46 +0200 Subject: [PATCH 395/782] Add expected total fees audit --- backend/src/api/database-migration.ts | 7 ++++++- backend/src/api/websocket-handler.ts | 8 +++++++- backend/src/mempool.interfaces.ts | 1 + backend/src/repositories/BlocksAuditsRepository.ts | 8 ++++---- frontend/src/app/components/block/block.component.html | 9 +++++++++ frontend/src/app/interfaces/node-api.interface.ts | 1 + 6 files changed, 28 insertions(+), 6 deletions(-) diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index 21c87f9e2..7d4d461e4 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository'; import { RowDataPacket } from 'mysql2'; class DatabaseMigration { - private static currentVersion = 60; + private static currentVersion = 61; private queryTimeout = 3600_000; private statisticsAddedIndexed = false; private uniqueLogs: string[] = []; @@ -521,6 +521,11 @@ class DatabaseMigration { await this.$executeQuery('ALTER TABLE `blocks_audits` ADD sigop_txs JSON DEFAULT "[]"'); await this.updateToSchemaVersion(60); } + + if (databaseSchemaVersion < 61 && isBitcoin === true) { + await this.$executeQuery('ALTER TABLE `blocks_audits` ADD expected_fees BIGINT UNSIGNED NOT NULL DEFAULT "0"'); + await this.updateToSchemaVersion(61); + } } /** diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 557d751e4..387304165 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -559,6 +559,8 @@ class WebsocketHandler { } if (Common.indexingEnabled() && memPool.isInSync()) { + logger.debug(`Auditing block ${block.height} (${block.id})`); + const { censored, added, fresh, sigop, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool); const matchRate = Math.round(score * 100 * 100) / 100; @@ -571,11 +573,14 @@ class WebsocketHandler { }; }) : []; + const totalFees = stripped.reduce((total, transaction) => total + transaction.fee, 0); + logger.debug(`Projected block fees: ${totalFees} sats`); + BlocksSummariesRepository.$saveTemplate({ height: block.height, template: { id: block.id, - transactions: stripped + transactions: stripped, } }); @@ -588,6 +593,7 @@ class WebsocketHandler { freshTxs: fresh, sigopTxs: sigop, matchRate: matchRate, + expectedFees: totalFees }); if (block.extras) { diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index c3e0d02ba..8887dd45b 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -35,6 +35,7 @@ export interface BlockAudit { sigopTxs: string[], addedTxs: string[], matchRate: number, + expectedFees: number; } export interface AuditScore { diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index 33075f43c..aaac7018c 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -6,9 +6,9 @@ import { BlockAudit, AuditScore } from '../mempool.interfaces'; class BlocksAuditRepositories { public async $saveAudit(audit: BlockAudit): Promise { try { - await DB.query(`INSERT INTO blocks_audits(time, height, hash, missing_txs, added_txs, fresh_txs, sigop_txs, match_rate) - VALUE (FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?, ?)`, [audit.time, audit.height, audit.hash, JSON.stringify(audit.missingTxs), - JSON.stringify(audit.addedTxs), JSON.stringify(audit.freshTxs), JSON.stringify(audit.sigopTxs), audit.matchRate]); + await DB.query(`INSERT INTO blocks_audits(time, height, hash, missing_txs, added_txs, fresh_txs, sigop_txs, match_rate, expected_fees) + VALUE (FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?, ?, ?)`, [audit.time, audit.height, audit.hash, JSON.stringify(audit.missingTxs), + JSON.stringify(audit.addedTxs), JSON.stringify(audit.freshTxs), JSON.stringify(audit.sigopTxs), audit.matchRate, audit.expectedFees]); } catch (e: any) { if (e.errno === 1062) { // ER_DUP_ENTRY - This scenario is possible upon node backend restart logger.debug(`Cannot save block audit for block ${audit.hash} because it has already been indexed, ignoring`); @@ -52,7 +52,7 @@ class BlocksAuditRepositories { const [rows]: any[] = await DB.query( `SELECT blocks.height, blocks.hash as id, UNIX_TIMESTAMP(blocks.blockTimestamp) as timestamp, blocks.size, blocks.weight, blocks.tx_count, - transactions, template, missing_txs as missingTxs, added_txs as addedTxs, fresh_txs as freshTxs, sigop_txs as sigopTxs, match_rate as matchRate + transactions, template, missing_txs as missingTxs, added_txs as addedTxs, fresh_txs as freshTxs, sigop_txs as sigopTxs, match_rate as matchRate, expected_fees as expectedFees FROM blocks_audits JOIN blocks ON blocks.hash = blocks_audits.hash JOIN blocks_summaries ON blocks_summaries.id = blocks_audits.hash diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index c34a3e523..d14b70389 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -72,6 +72,15 @@
    Expected total fees + + + + +
    Mined HealthExpected fees Reward Fees + +
    Fee span{{ block.extras.feeRange[1] | number:'1.0-0' }} - {{ block.extras.feeRange[block.extras.feeRange.length - 1] | number:'1.0-0' }} sat/vB{{ block.extras.feeRange[0] | number:'1.0-0' }} - {{ block.extras.feeRange[block.extras.feeRange.length - 1] | number:'1.0-0' }} sat/vB
    Median fee
    Expected total fees - - - - -
    + + + + + + + + + + + + + + +
    Expected fees + +
    Expected weight
    Expected transactions{{ blockAudit.template?.length || 0 }}
    + + + + + + + + + + + + + + + + + + +
    Actual fees + + + {{ blockAudit.feeDelta < 0 ? '+' : '' }}{{ (-blockAudit.feeDelta * 100) | amountShortener: 2 }}% + +
    Actual weight + +
    Actual transactions + {{ block.tx_count }} +
    +
    +

    diff --git a/frontend/src/app/components/block/block.component.scss b/frontend/src/app/components/block/block.component.scss index 319f53804..48f094926 100644 --- a/frontend/src/app/components/block/block.component.scss +++ b/frontend/src/app/components/block/block.component.scss @@ -38,6 +38,17 @@ color: rgba(255, 255, 255, 0.4); margin-left: 5px; } + + .difference { + margin-left: 0.5em; + + &.positive { + color: rgb(66, 183, 71); + } + &.negative { + color: rgb(183, 66, 66); + } + } } } diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index f5fe1a469..671fd9d5b 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -388,6 +388,7 @@ export class BlockComponent implements OnInit, OnDestroy { for (const tx of blockAudit.transactions) { inBlock[tx.txid] = true; } + blockAudit.feeDelta = (blockAudit.expectedFees - this.block.extras.totalFees) / blockAudit.expectedFees; this.setAuditAvailable(true); } else { this.setAuditAvailable(false); diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 3de82b910..5aaeda545 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -151,6 +151,8 @@ export interface BlockAudit extends BlockExtended { addedTxs: string[], matchRate: number, expectedFees: number, + expectedWeight: number, + feeDelta?: number, template: TransactionStripped[], transactions: TransactionStripped[], } From 5b62966863a8bbcdb4f1aad0ad0042ac5a746599 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 9 Jun 2023 13:46:43 -0400 Subject: [PATCH 411/782] Add indexer task to backfill audit fee/weight stats --- backend/src/api/blocks.ts | 35 +++++++++++++++++ backend/src/indexer.ts | 1 + .../repositories/BlocksAuditsRepository.ts | 39 +++++++++++++++++++ .../repositories/BlocksSummariesRepository.ts | 15 +++++++ 4 files changed, 90 insertions(+) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index ef4db683e..116a99340 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -457,6 +457,41 @@ class Blocks { } } + /** + * [INDEXING] Index expected fees & weight for all audited blocks + */ + public async $generateAuditStats(): Promise { + const blockIds = await BlocksAuditsRepository.$getBlocksWithoutSummaries(); + if (!blockIds?.length) { + return; + } + let timer = Date.now(); + let indexedThisRun = 0; + let indexedTotal = 0; + logger.debug(`Indexing ${blockIds.length} block audit details`); + for (const hash of blockIds) { + const summary = await BlocksSummariesRepository.$getTemplate(hash); + let totalFees = 0; + let totalWeight = 0; + for (const tx of summary?.transactions || []) { + totalFees += tx.fee; + totalWeight += (tx.vsize * 4); + } + await BlocksAuditsRepository.$setSummary(hash, totalFees, totalWeight); + + indexedThisRun++; + indexedTotal++; + const elapsedSeconds = (Date.now() - timer) / 1000; + if (elapsedSeconds > 5) { + const blockPerSeconds = indexedThisRun / elapsedSeconds; + logger.debug(`Indexed ${indexedTotal} / ${blockIds.length} block audit details (${blockPerSeconds.toFixed(1)}/s)`); + timer = Date.now(); + indexedThisRun = 0; + } + } + logger.debug(`Indexing block audit details completed`); + } + /** * [INDEXING] Index all blocks metadata for the mining dashboard */ diff --git a/backend/src/indexer.ts b/backend/src/indexer.ts index 3b16ad155..4b120867f 100644 --- a/backend/src/indexer.ts +++ b/backend/src/indexer.ts @@ -134,6 +134,7 @@ class Indexer { await mining.$generatePoolHashrateHistory(); await blocks.$generateBlocksSummariesDatabase(); await blocks.$generateCPFPDatabase(); + await blocks.$generateAuditStats(); } catch (e) { this.indexerRunning = false; logger.err(`Indexer failed, trying again in 10 seconds. Reason: ` + (e instanceof Error ? e.message : e)); diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index d755654ea..1fa2b0209 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -18,6 +18,19 @@ class BlocksAuditRepositories { } } + public async $setSummary(hash: string, expectedFees: number, expectedWeight: number) { + try { + await DB.query(` + UPDATE blocks_audits SET + expected_fees = ?, + expected_weight = ? + WHERE hash = ? + `, [expectedFees, expectedWeight, hash]); + } catch (e: any) { + logger.err(`Cannot update block audit in db. Reason: ` + (e instanceof Error ? e.message : e)); + } + } + public async $getBlocksHealthHistory(div: number, interval: string | null): Promise { try { let query = `SELECT UNIX_TIMESTAMP(time) as time, height, match_rate FROM blocks_audits`; @@ -113,6 +126,32 @@ class BlocksAuditRepositories { throw e; } } + + public async $getBlocksWithoutSummaries(): Promise { + try { + const [fromRows]: any[] = await DB.query(` + SELECT height + FROM blocks_audits + WHERE expected_fees IS NULL + ORDER BY height DESC + LIMIT 1 + `); + if (!fromRows?.length) { + return []; + } + const fromHeight = fromRows[0].height; + const [idRows]: any[] = await DB.query(` + SELECT hash + FROM blocks_audits + WHERE height <= ? + ORDER BY height DESC + `, [fromHeight]); + return idRows.map(row => row.hash); + } catch (e: any) { + logger.err(`Cannot fetch block audit from db. Reason: ` + (e instanceof Error ? e.message : e)); + throw e; + } + } } export default new BlocksAuditRepositories(); diff --git a/backend/src/repositories/BlocksSummariesRepository.ts b/backend/src/repositories/BlocksSummariesRepository.ts index 2d2c23d07..09598db03 100644 --- a/backend/src/repositories/BlocksSummariesRepository.ts +++ b/backend/src/repositories/BlocksSummariesRepository.ts @@ -50,6 +50,21 @@ class BlocksSummariesRepository { } } + public async $getTemplate(id: string): Promise { + try { + const [templates]: any[] = await DB.query(`SELECT * from blocks_templates WHERE id = ?`, [id]); + if (templates.length > 0) { + return { + id: templates[0].id, + transactions: JSON.parse(templates[0].template), + }; + } + } catch (e) { + logger.err(`Cannot get block template for block id ${id}. Reason: ` + (e instanceof Error ? e.message : e)); + } + return undefined; + } + public async $getIndexedSummariesId(): Promise { try { const [rows]: any[] = await DB.query(`SELECT id from blocks_summaries`); From bfb842d7eaaf25a5c273b9793ec04e575c969f94 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 9 Jun 2023 14:19:26 -0400 Subject: [PATCH 412/782] Add % difference to weight and tx count in audit details --- frontend/src/app/components/block/block.component.html | 6 ++++++ frontend/src/app/components/block/block.component.ts | 6 +++++- frontend/src/app/interfaces/node-api.interface.ts | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 4e58d32f2..e3f4d195c 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -428,12 +428,18 @@
    Actual weight + + {{ blockAudit.weightDelta < 0 ? '+' : '' }}{{ (-blockAudit.weightDelta * 100) | amountShortener: 2 }}% +
    Actual transactions {{ block.tx_count }} + + {{ blockAudit.txDelta < 0 ? '+' : '' }}{{ (-blockAudit.txDelta * 100) | amountShortener: 2 }}% +
    Pool TimestampMined HealthExpected fees Reward Feesvs Expected TXs Transactions ‎{{ block.timestamp * 1000 | date:'yyyy-MM-dd HH:mm' }} - - - - + + {{ block.extras.feeDelta > 0 ? '+' : '' }}{{ (block.extras.feeDelta * 100) | amountShortener: 2 }}% + + {{ block.tx_count | number }}

    mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc.

    For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

    -

    mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, confirming your transaction quicker, etc.

    For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

    +

    mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, wallet issues, etc.

    For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

    +

    mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, wallet issues, etc.

    For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

    From ae5a0312be37168e00f09b1e500640ec3c0c308c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 12 Jun 2023 12:40:19 -0400 Subject: [PATCH 415/782] change audit detail labels --- .../src/app/components/block/block.component.html | 12 ++++++------ .../src/app/components/block/block.component.scss | 7 +++++++ .../blocks-list/blocks-list.component.html | 9 ++++++--- .../blocks-list/blocks-list.component.scss | 1 + 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index e3f4d195c..7d2652829 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -395,17 +395,17 @@ - + - + - + @@ -416,7 +416,7 @@
    Expected feesTotal fees
    Expected weightWeight
    Expected transactionsTransactions {{ blockAudit.template?.length || 0 }}
    - + - + - + - + @@ -67,9 +67,9 @@ - + diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.scss b/frontend/src/app/components/blocks-list/blocks-list.component.scss index 39d6b55b0..3d3169a69 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.scss +++ b/frontend/src/app/components/blocks-list/blocks-list.component.scss @@ -173,6 +173,7 @@ tr, td, th { } .fee-delta { width: 6%; + padding-left: 0; @media (max-width: 991px) { display: none; } From 6b93e61b56247622230db2d270de7c546b13a492 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 14 Jun 2023 11:28:39 -0400 Subject: [PATCH 416/782] minor audit details fixes --- backend/src/api/database-migration.ts | 2 +- frontend/src/app/components/block/block.component.html | 4 ++-- .../src/app/components/blocks-list/blocks-list.component.html | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index a87fdc0fd..b1e54302a 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository'; import { RowDataPacket } from 'mysql2'; class DatabaseMigration { - private static currentVersion = 61; + private static currentVersion = 62; private queryTimeout = 3600_000; private statisticsAddedIndexed = false; private uniqueLogs: string[] = []; diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 7d2652829..b5bb7d5d3 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -392,7 +392,7 @@ -
    Actual feesTotal fees @@ -425,7 +425,7 @@
    Actual weightWeight @@ -434,7 +434,7 @@
    Actual transactionsTransactions {{ block.tx_count }} diff --git a/frontend/src/app/components/block/block.component.scss b/frontend/src/app/components/block/block.component.scss index 48f094926..08091cb86 100644 --- a/frontend/src/app/components/block/block.component.scss +++ b/frontend/src/app/components/block/block.component.scss @@ -263,3 +263,10 @@ h1 { top: 11px; margin-left: 10px; } + +.audit-details-table { + margin-top: 1.25rem; + @media (max-width: 767.98px) { + margin-top: 0.75rem; + } +} diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.html b/frontend/src/app/components/blocks-list/blocks-list.component.html index 727ca2782..5197ce3b4 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.html +++ b/frontend/src/app/components/blocks-list/blocks-list.component.html @@ -18,7 +18,7 @@ Reward Feesvs Expected TXs Transactions + - {{ block.extras.feeDelta > 0 ? '+' : '' }}{{ (block.extras.feeDelta * 100) | amountShortener: 2 }}% + ({{ block.extras.feeDelta > 0 ? '+' : '' }}{{ (block.extras.feeDelta * 100) | amountShortener: 2 }}%) @@ -108,6 +108,9 @@ + +
    +
    @@ -413,7 +413,7 @@ -
    Total fees
    +
    diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.html b/frontend/src/app/components/blocks-list/blocks-list.component.html index 5197ce3b4..2ee611bc6 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.html +++ b/frontend/src/app/components/blocks-list/blocks-list.component.html @@ -69,7 +69,7 @@ - + diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index f5fe1a469..7f156eeb9 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -663,4 +663,23 @@ export class BlockComponent implements OnInit, OnDestroy { } } } + + getMinBlockFee(block: BlockExtended): number { + if (block?.extras?.feeRange) { + // heuristic to check if feeRange is adjusted for effective rates + if (block.extras.medianFee === block.extras.feeRange[3]) { + return block.extras.feeRange[1]; + } else { + return block.extras.feeRange[0]; + } + } + return 0; + } + + getMaxBlockFee(block: BlockExtended): number { + if (block?.extras?.feeRange) { + return block.extras.feeRange[block.extras.feeRange.length - 1]; + } + return 0; + } } \ No newline at end of file diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html index 8ea5acef6..3c26cb0fd 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -32,8 +32,8 @@
    - {{ block?.extras?.feeRange?.[0] | number:feeRounding }} - {{ - block?.extras?.feeRange[block?.extras?.feeRange?.length - 1] | number:feeRounding }} sat/vB
    diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 65c949b4d..c1aaa0c63 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -365,4 +365,23 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { } return emptyBlocks; } + + getMinBlockFee(block: BlockExtended): number { + if (block?.extras?.feeRange) { + // heuristic to check if feeRange is adjusted for effective rates + if (block.extras.medianFee === block.extras.feeRange[3]) { + return block.extras.feeRange[1]; + } else { + return block.extras.feeRange[0]; + } + } + return 0; + } + + getMaxBlockFee(block: BlockExtended): number { + if (block?.extras?.feeRange) { + return block.extras.feeRange[block.extras.feeRange.length - 1]; + } + return 0; + } } From 816f410855320df546b0542a4b00a1a3f8290196 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Wed, 14 Jun 2023 22:17:05 -0400 Subject: [PATCH 423/782] Make luminex css class unique --- frontend/src/app/components/about/about.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index b364ca7f3..9b2bdf6c0 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -177,14 +177,14 @@ - - - + + + Luminex From 22a491717a8466d700960ab54a6c1a915b647962 Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Wed, 14 Jun 2023 21:48:36 -0600 Subject: [PATCH 424/782] update frontend local instructions --- frontend/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/README.md b/frontend/README.md index b626a23b9..8fc77a2b4 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -17,7 +17,7 @@ Get the latest Mempool code: ``` git clone https://github.com/mempool/mempool -cd mempool +cd mempool/frontend ``` ### 2. Specify Website From fe6da62daba8fec27ca6caf3ef199443d61d8db5 Mon Sep 17 00:00:00 2001 From: secondl1ght <85003930+secondl1ght@users.noreply.github.com> Date: Wed, 14 Jun 2023 21:55:17 -0600 Subject: [PATCH 425/782] create secondl1ght.txt contributor file --- contributors/secondl1ght.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/secondl1ght.txt diff --git a/contributors/secondl1ght.txt b/contributors/secondl1ght.txt new file mode 100644 index 000000000..a386a103a --- /dev/null +++ b/contributors/secondl1ght.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of June 14, 2023. + +Signed: secondl1ght From c42670259e800a0e4d4a231785474db066c841b2 Mon Sep 17 00:00:00 2001 From: wiz Date: Thu, 15 Jun 2023 02:37:30 -0700 Subject: [PATCH 426/782] ops: Fix crash while building electrs in install script --- production/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/production/install b/production/install index 8c2eab441..8f3491591 100755 --- a/production/install +++ b/production/install @@ -1239,7 +1239,7 @@ if [ "${BITCOIN_ELECTRS_INSTALL}" = ON ];then case $OS in FreeBSD) echo "[*] Patching Bitcoin Electrs code for FreeBSD" - osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_HOME}/.cargo/registry/src/github.com-1ecc6299db9ec823/sysconf-0.3.4\" && patch -p1 < \"${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/freebsd/sysconf.patch\"" + osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_HOME}/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sysconf-0.3.4\" && patch -p1 < \"${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/freebsd/sysconf.patch\"" osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_ELECTRS_HOME}/src/new_index/\" && sed -i.bak -e s/Snappy/None/ db.rs && rm db.rs.bak" osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_ELECTRS_HOME}/src/bin/\" && sed -i.bak -e 's/from_secs(5)/from_secs(1)/' electrs.rs && rm electrs.rs.bak" ;; @@ -1289,7 +1289,7 @@ if [ "${ELEMENTS_ELECTRS_INSTALL}" = ON ];then case $OS in FreeBSD) echo "[*] Patching Liquid Electrs code for FreeBSD" - osSudo "${ELEMENTS_USER}" sh -c "cd \"${ELEMENTS_HOME}/.cargo/registry/src/github.com-1ecc6299db9ec823/sysconf-0.3.4\" && patch -p1 < \"${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/freebsd/sysconf.patch\"" + osSudo "${ELEMENTS_USER}" sh -c "cd \"${ELEMENTS_HOME}/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sysconf-0.3.4\" && patch -p1 < \"${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/freebsd/sysconf.patch\"" ;; Debian) ;; From ee39283241d35120f23c0210c2a108edf8ea8c20 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 15 Jun 2023 09:45:25 -0400 Subject: [PATCH 427/782] precompute block fee spans --- frontend/src/app/components/block/block.component.html | 2 +- frontend/src/app/components/block/block.component.ts | 4 ++++ .../blockchain-blocks/blockchain-blocks.component.html | 5 ++--- .../blockchain-blocks/blockchain-blocks.component.ts | 9 +++++++++ frontend/src/app/interfaces/node-api.interface.ts | 2 ++ 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 14635f005..981ba494a 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -121,7 +121,7 @@ - + diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 7f156eeb9..c2c2c583b 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -138,6 +138,8 @@ export class BlockComponent implements OnInit, OnDestroy { if (block.id === this.blockHash) { this.block = block; + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); if (block?.extras?.reward != undefined) { this.fees = block.extras.reward / 100000000 - this.blockSubsidy; } @@ -234,6 +236,8 @@ export class BlockComponent implements OnInit, OnDestroy { } this.updateAuditAvailableFromBlockHeight(block.height); this.block = block; + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); this.blockHeight = block.height; this.lastBlockHeight = this.blockHeight; this.nextBlockHeight = block.height + 1; diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html index 3c26cb0fd..d9518b1fa 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.html @@ -31,9 +31,8 @@
    - {{ getMinBlockFee(block) | number:feeRounding }} - {{ - getMaxBlockFee(block) | number:feeRounding }} + {{ block.extras.minFee | number:feeRounding }} - {{ block.extras.maxFee | number:feeRounding }} sat/vB
    diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index c1aaa0c63..eebf417a7 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -113,6 +113,9 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.blocksFilled = false; } + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); + this.blocks.unshift(block); this.blocks = this.blocks.slice(0, this.dynamicBlocksAmount); @@ -239,6 +242,10 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { if (height >= 0) { this.cacheService.loadBlock(height); block = this.cacheService.getCachedBlock(height) || null; + if (block) { + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); + } } this.blocks.push(block || { placeholder: height < 0, @@ -277,6 +284,8 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { onBlockLoaded(block: BlockExtended) { const blockIndex = this.height - block.height; if (blockIndex >= 0 && blockIndex < this.blocks.length) { + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); this.blocks[blockIndex] = block; this.blockStyles[blockIndex] = this.getStyleForBlock(block, blockIndex); } diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index a2e7b6537..c2aaf1151 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -129,6 +129,8 @@ export interface PoolStat { export interface BlockExtension { totalFees?: number; medianFee?: number; + minFee?: number; + maxFee?: number; feeRange?: number[]; reward?: number; coinbaseRaw?: string; From 618ba56c42cda8d904abfe13fae58e28b51b505e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 15 Jun 2023 12:57:20 -0400 Subject: [PATCH 428/782] remove redundant audit score api calls from blocks list --- .../blocks-list/blocks-list.component.html | 19 ++--- .../blocks-list/blocks-list.component.ts | 74 +++---------------- 2 files changed, 16 insertions(+), 77 deletions(-) diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.html b/frontend/src/app/components/blocks-list/blocks-list.component.html index 2ee611bc6..39fbb95e0 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.html +++ b/frontend/src/app/components/blocks-list/blocks-list.component.html @@ -44,21 +44,16 @@
    Total fees - ({{ block.extras.feeDelta > 0 ? '+' : '' }}{{ (block.extras.feeDelta * 100) | amountShortener: 2 }}%) + {{ block.extras.feeDelta > 0 ? '+' : '' }}{{ (block.extras.feeDelta * 100) | amountShortener: 2 }}% From bbe0579cdda0d64b9621c7bb8d4d0bc2ddd55439 Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 14 Jun 2023 21:53:51 +0200 Subject: [PATCH 417/782] Changing default clock to mempool --- frontend/src/app/app-routing.module.ts | 2 +- .../src/app/components/statistics/statistics.component.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 6285aef08..7a9b53ed0 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -358,7 +358,7 @@ let routes: Routes = [ }, { path: 'clock', - redirectTo: 'clock/mined/0' + redirectTo: 'clock/mempool/0' }, { path: 'clock/:mode', diff --git a/frontend/src/app/components/statistics/statistics.component.html b/frontend/src/app/components/statistics/statistics.component.html index 7f76aed78..1b291e978 100644 --- a/frontend/src/app/components/statistics/statistics.component.html +++ b/frontend/src/app/components/statistics/statistics.component.html @@ -13,7 +13,7 @@
    - + From c4f7b99978b101a5f301203c18767b810f7c59ba Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 14 Jun 2023 16:15:33 -0400 Subject: [PATCH 418/782] add backfilled audit stats to cached blocks --- backend/src/api/blocks.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index e080285ed..8d6a6b50d 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -480,6 +480,11 @@ class Blocks { totalWeight += (tx.vsize * 4); } await BlocksAuditsRepository.$setSummary(hash, totalFees, totalWeight); + const cachedBlock = this.blocks.find(block => block.id === hash); + if (cachedBlock) { + cachedBlock.extras.expectedFees = totalFees; + cachedBlock.extras.expectedWeight = totalWeight; + } indexedThisRun++; indexedTotal++; From f09939a201773da0d2e6f31a22b35e8ebefb2837 Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 14 Jun 2023 22:20:18 +0200 Subject: [PATCH 419/782] Disabling Liquid tests for now --- frontend/cypress/e2e/liquid/liquid.spec.ts | 2 +- frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/cypress/e2e/liquid/liquid.spec.ts b/frontend/cypress/e2e/liquid/liquid.spec.ts index 325a2ad0c..2d1fbd1e9 100644 --- a/frontend/cypress/e2e/liquid/liquid.spec.ts +++ b/frontend/cypress/e2e/liquid/liquid.spec.ts @@ -1,4 +1,4 @@ -describe('Liquid', () => { +describe.skip('Liquid', () => { const baseModule = Cypress.env('BASE_MODULE'); const basePath = ''; diff --git a/frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts b/frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts index 1f959dd3a..be27fa183 100644 --- a/frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts +++ b/frontend/cypress/e2e/liquidtestnet/liquidtestnet.spec.ts @@ -1,4 +1,4 @@ -describe('Liquid Testnet', () => { +describe.skip('Liquid Testnet', () => { const baseModule = Cypress.env('BASE_MODULE'); const basePath = '/testnet'; From 30f8d5cf9627f2e1806280af7e34c66c700e21e3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 14 Jun 2023 16:15:58 -0400 Subject: [PATCH 420/782] add missing markForChecks in blocks list --- .../src/app/components/blocks-list/blocks-list.component.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 9ec09bfa9..8b4aa38e7 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input } from '@angular/core'; +import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, ChangeDetectorRef } from '@angular/core'; import { BehaviorSubject, combineLatest, concat, Observable, timer, EMPTY, Subscription, of } from 'rxjs'; import { catchError, delayWhen, map, retryWhen, scan, skip, switchMap, tap } from 'rxjs/operators'; import { BlockExtended } from '../../interfaces/node-api.interface'; @@ -39,6 +39,7 @@ export class BlocksList implements OnInit, OnDestroy { private apiService: ApiService, private websocketService: WebsocketService, public stateService: StateService, + private cd: ChangeDetectorRef, ) { } @@ -114,7 +115,6 @@ export class BlocksList implements OnInit, OnDestroy { return acc; }, []), switchMap((blocks) => { - console.log(blocks); blocks.forEach(block => { block.extras.feeDelta = block.extras.expectedFees ? (block.extras.totalFees - block.extras.expectedFees) / block.extras.expectedFees : 0; }); @@ -138,6 +138,7 @@ export class BlocksList implements OnInit, OnDestroy { this.auditScores[score.hash] = score?.matchRate != null ? score.matchRate : null; }); this.loadingScores = false; + this.cd.markForCheck(); }); this.latestScoreSubscription = this.stateService.blocks$.pipe( @@ -162,6 +163,7 @@ export class BlocksList implements OnInit, OnDestroy { ).subscribe((score) => { if (score && score.hash) { this.auditScores[score.hash] = score?.matchRate != null ? score.matchRate : null; + this.cd.markForCheck(); } }); } From 73d629d319991d13e02302dc70e2e0a2606e5ede Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Wed, 14 Jun 2023 18:58:49 -0400 Subject: [PATCH 421/782] Add luminex as enterprise sponsor on about page --- .../src/app/components/about/about.component.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 2936606ad..b364ca7f3 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -173,6 +173,21 @@ Exodus + + + + + + + + + + Luminex +
    From bb61ff97fa9185b81a58dfbe6282ecf622c3b38f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 14 Jun 2023 19:04:09 -0400 Subject: [PATCH 422/782] continue to skip first rate in simple fee ranges --- .../app/components/block/block.component.html | 2 +- .../app/components/block/block.component.ts | 19 +++++++++++++++++++ .../blockchain-blocks.component.html | 4 ++-- .../blockchain-blocks.component.ts | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 4c7e4684a..14635f005 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -121,7 +121,7 @@
    Fee span{{ block.extras.feeRange[0] | number:'1.0-0' }} - {{ block.extras.feeRange[block.extras.feeRange.length - 1] | number:'1.0-0' }} sat/vB{{ getMinBlockFee(block) | number:'1.0-0' }} - {{ getMaxBlockFee(block) | number:'1.0-0' }} sat/vB
    Median fee
    Fee span{{ getMinBlockFee(block) | number:'1.0-0' }} - {{ getMaxBlockFee(block) | number:'1.0-0' }} sat/vB{{ block?.extras?.minFee | number:'1.0-0' }} - {{ block?.extras?.maxFee | number:'1.0-0' }} sat/vB
    Median fee {{ auditScores[block.id] }}% + >{{ block.extras.matchRate }}% - - Unknown - - - - + Unknown diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 8b4aa38e7..324807628 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -1,6 +1,6 @@ -import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, ChangeDetectorRef } from '@angular/core'; -import { BehaviorSubject, combineLatest, concat, Observable, timer, EMPTY, Subscription, of } from 'rxjs'; -import { catchError, delayWhen, map, retryWhen, scan, skip, switchMap, tap } from 'rxjs/operators'; +import { Component, OnInit, ChangeDetectionStrategy, Input, ChangeDetectorRef } from '@angular/core'; +import { BehaviorSubject, combineLatest, Observable, timer, of } from 'rxjs'; +import { delayWhen, map, retryWhen, scan, switchMap, tap } from 'rxjs/operators'; import { BlockExtended } from '../../interfaces/node-api.interface'; import { ApiService } from '../../services/api.service'; import { StateService } from '../../services/state.service'; @@ -12,19 +12,14 @@ import { WebsocketService } from '../../services/websocket.service'; styleUrls: ['./blocks-list.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class BlocksList implements OnInit, OnDestroy { +export class BlocksList implements OnInit { @Input() widget: boolean = false; blocks$: Observable = undefined; - auditScores: { [hash: string]: number | void } = {}; - - auditScoreSubscription: Subscription; - latestScoreSubscription: Subscription; indexingAvailable = false; auditAvailable = false; isLoading = true; - loadingScores = true; fromBlockHeight = undefined; paginationMaxSize: number; page = 1; @@ -66,7 +61,7 @@ export class BlocksList implements OnInit, OnDestroy { this.blocksCount = blocks[0].height + 1; } this.isLoading = false; - this.lastBlockHeight = Math.max(...blocks.map(o => o.height)) + this.lastBlockHeight = Math.max(...blocks.map(o => o.height)); }), map(blocks => { if (this.indexingAvailable) { @@ -82,7 +77,7 @@ export class BlocksList implements OnInit, OnDestroy { return blocks; }), retryWhen(errors => errors.pipe(delayWhen(() => timer(10000)))) - ) + ); }) ), this.stateService.blocks$ @@ -121,68 +116,17 @@ export class BlocksList implements OnInit, OnDestroy { return of(blocks); }) ); - - if (this.indexingAvailable && this.auditAvailable) { - this.auditScoreSubscription = this.fromHeightSubject.pipe( - switchMap((fromBlockHeight) => { - this.loadingScores = true; - return this.apiService.getBlockAuditScores$(this.page === 1 ? undefined : fromBlockHeight) - .pipe( - catchError(() => { - return EMPTY; - }) - ); - }) - ).subscribe((scores) => { - Object.values(scores).forEach(score => { - this.auditScores[score.hash] = score?.matchRate != null ? score.matchRate : null; - }); - this.loadingScores = false; - this.cd.markForCheck(); - }); - - this.latestScoreSubscription = this.stateService.blocks$.pipe( - switchMap((block) => { - if (block[0]?.extras?.matchRate != null) { - return of({ - hash: block[0].id, - matchRate: block[0]?.extras?.matchRate, - }); - } - else if (block[0]?.id && this.auditScores[block[0].id] === undefined) { - return this.apiService.getBlockAuditScore$(block[0].id) - .pipe( - catchError(() => { - return EMPTY; - }) - ); - } else { - return EMPTY; - } - }), - ).subscribe((score) => { - if (score && score.hash) { - this.auditScores[score.hash] = score?.matchRate != null ? score.matchRate : null; - this.cd.markForCheck(); - } - }); - } } - ngOnDestroy(): void { - this.auditScoreSubscription?.unsubscribe(); - this.latestScoreSubscription?.unsubscribe(); - } - - pageChange(page: number) { + pageChange(page: number): void { this.fromHeightSubject.next((this.blocksCount - 1) - (page - 1) * 15); } - trackByBlock(index: number, block: BlockExtended) { + trackByBlock(index: number, block: BlockExtended): number { return block.height; } - isEllipsisActive(e) { + isEllipsisActive(e): boolean { return (e.offsetWidth < e.scrollWidth); } } \ No newline at end of file From 5f3fd85834f6a0e3c47942e44dc593c38352c2d2 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 15 Jun 2023 21:39:51 -0400 Subject: [PATCH 429/782] the last two docker-compose overrides need MEMPOOL_ in front --- docker/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/README.md b/docker/README.md index b669b37c8..d95bc7aee 100644 --- a/docker/README.md +++ b/docker/README.md @@ -144,8 +144,8 @@ Corresponding `docker-compose.yml` overrides: MEMPOOL_ADVANCED_GBT_AUDIT: "" MEMPOOL_ADVANCED_GBT_MEMPOOL: "" MEMPOOL_CPFP_INDEXING: "" - MAX_BLOCKS_BULK_QUERY: "" - DISK_CACHE_BLOCK_INTERVAL: "" + MEMPOOL_MAX_BLOCKS_BULK_QUERY: "" + MEMPOOL_DISK_CACHE_BLOCK_INTERVAL: "" ... ``` From e8aea3832074956690c7df4d60f0668d733568f4 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 15 Jun 2023 21:46:09 -0400 Subject: [PATCH 430/782] contributer license --- contributors/pfoytik.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/pfoytik.txt diff --git a/contributors/pfoytik.txt b/contributors/pfoytik.txt new file mode 100644 index 000000000..f15f7cb33 --- /dev/null +++ b/contributors/pfoytik.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of June 15, 2023. + +Signed pfoytik From c0e235c01ac54d17242d310ee1feb9525d7f98eb Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 16 Jun 2023 13:47:09 -0400 Subject: [PATCH 431/782] Mark RBF transactions as removed if earlier version is mined --- .../app/components/transaction/transaction.component.html | 7 ++++++- .../components/confirmations/confirmations.component.html | 5 ++++- .../components/confirmations/confirmations.component.ts | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 64eeeaecd..a5a44ee90 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -18,7 +18,12 @@
    - +
    diff --git a/frontend/src/app/shared/components/confirmations/confirmations.component.html b/frontend/src/app/shared/components/confirmations/confirmations.component.html index 1d7138c7c..914ed714f 100644 --- a/frontend/src/app/shared/components/confirmations/confirmations.component.html +++ b/frontend/src/app/shared/components/confirmations/confirmations.component.html @@ -8,6 +8,9 @@ - + + + + \ No newline at end of file diff --git a/frontend/src/app/shared/components/confirmations/confirmations.component.ts b/frontend/src/app/shared/components/confirmations/confirmations.component.ts index 8d14128e5..624c58278 100644 --- a/frontend/src/app/shared/components/confirmations/confirmations.component.ts +++ b/frontend/src/app/shared/components/confirmations/confirmations.component.ts @@ -11,6 +11,7 @@ export class ConfirmationsComponent implements OnChanges { @Input() chainTip: number; @Input() height: number; @Input() replaced: boolean = false; + @Input() removed: boolean = false; @Input() hideUnconfirmed: boolean = false; @Input() buttonClass: string = ''; From 176f5e137706dcdc51a9f206b8bd710a03a7307b Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 16 Jun 2023 20:42:31 +0200 Subject: [PATCH 432/782] Reinstate the mempool loop time limit --- backend/src/api/mempool.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index e3543f4fc..70635237f 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -186,6 +186,12 @@ class Mempool { loadingIndicators.setProgress('mempool', progress); loggerTimer = new Date().getTime() / 1000; } + // Break and restart mempool loop if we spend too much time processing + // new transactions that may lead to falling behind on block height + if (this.inSync && (new Date().getTime()) - start > 10_000) { + logger.debug('Breaking mempool loop because the 10s time limit exceeded.'); + break; + } } // Reset esplora 404 counter and log a warning if needed From 1872e5d12f8dd2ba4e9bfc270d941b662ad52285 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 16 Jun 2023 17:35:07 -0400 Subject: [PATCH 433/782] change "removed" and "replaced" badges to yellow --- .../components/confirmations/confirmations.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/shared/components/confirmations/confirmations.component.html b/frontend/src/app/shared/components/confirmations/confirmations.component.html index 914ed714f..0c947eb39 100644 --- a/frontend/src/app/shared/components/confirmations/confirmations.component.html +++ b/frontend/src/app/shared/components/confirmations/confirmations.component.html @@ -6,10 +6,10 @@ - + - + From a5575c087683c5f724d4e3f6f56bd776d96290fa Mon Sep 17 00:00:00 2001 From: softsimon Date: Fri, 16 Jun 2023 23:42:57 +0200 Subject: [PATCH 434/782] Sanitize node pubkey search --- backend/src/api/explorer/nodes.api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/explorer/nodes.api.ts b/backend/src/api/explorer/nodes.api.ts index d86ecf665..d429299e1 100644 --- a/backend/src/api/explorer/nodes.api.ts +++ b/backend/src/api/explorer/nodes.api.ts @@ -373,7 +373,7 @@ class NodesApi { public async $searchNodeByPublicKeyOrAlias(search: string) { try { - const publicKeySearch = search.replace('%', '') + '%'; + const publicKeySearch = search.replace(/[^a-zA-Z0-9]/g, '') + '%'; const aliasSearch = search .replace(/[-_.]/g, ' ') // Replace all -_. characters with empty space. Eg: "ln.nicehash" becomes "ln nicehash". .replace(/[^a-zA-Z0-9 ]/g, '') // Remove all special characters and keep just A to Z, 0 to 9. From c8d3653ef3745dd8ab7f1b3ca7bfcd3e370a4270 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 17 Jun 2023 00:32:58 +0200 Subject: [PATCH 435/782] Updating tests --- frontend/cypress/e2e/mainnet/mainnet.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/cypress/e2e/mainnet/mainnet.spec.ts b/frontend/cypress/e2e/mainnet/mainnet.spec.ts index da9e00b9f..b12b93cf1 100644 --- a/frontend/cypress/e2e/mainnet/mainnet.spec.ts +++ b/frontend/cypress/e2e/mainnet/mainnet.spec.ts @@ -537,7 +537,7 @@ describe('Mainnet', () => { cy.get('.container-xl > :nth-child(3)').invoke('css', 'width').should('equal', alertWidth); }); - cy.get('.btn-danger').then(getRectangle).then((rectA) => { + cy.get('.btn-warning').then(getRectangle).then((rectA) => { cy.get('.alert').then(getRectangle).then((rectB) => { expect(areOverlapping(rectA, rectB), 'Confirmations box and RBF alert are overlapping').to.be.false; }); @@ -582,7 +582,7 @@ describe('Mainnet', () => { cy.get(alertLocator).invoke('css', 'width').should('equal', firstWidth); }); - cy.get('.btn-danger').then(getRectangle).then((rectA) => { + cy.get('.btn-warning').then(getRectangle).then((rectA) => { cy.get('.alert').then(getRectangle).then((rectB) => { expect(areOverlapping(rectA, rectB), 'Confirmations box and RBF alert are overlapping').to.be.false; }); From 39bde6153885bc13b0f16faf2ba80efc86ba4bcf Mon Sep 17 00:00:00 2001 From: wiz Date: Fri, 16 Jun 2023 17:15:31 -0700 Subject: [PATCH 436/782] ops: Set cache time for /api/v1 endpoints to 2 sec --- production/nginx/location-api.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/production/nginx/location-api.conf b/production/nginx/location-api.conf index 638e1911c..2b2b85411 100644 --- a/production/nginx/location-api.conf +++ b/production/nginx/location-api.conf @@ -97,10 +97,10 @@ location @mempool-api-v1-cache-normal { proxy_set_header X-Forwarded-Proto $scheme; proxy_cache api; - proxy_cache_valid 200 10s; + proxy_cache_valid 200 2s; proxy_redirect off; - expires 10s; + expires 2s; } location @mempool-api-v1-cache-disabled { From 20d7e56de285e8d135370659ed8b67849b2dbf0d Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 17 Jun 2023 15:04:46 +0200 Subject: [PATCH 437/782] Update i18n --- .../components/confirmations/confirmations.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/shared/components/confirmations/confirmations.component.html b/frontend/src/app/shared/components/confirmations/confirmations.component.html index 0c947eb39..e785ce4dd 100644 --- a/frontend/src/app/shared/components/confirmations/confirmations.component.html +++ b/frontend/src/app/shared/components/confirmations/confirmations.component.html @@ -6,7 +6,7 @@ - + From 4fbab08586d6ae1eb4c4aabb9b6dbd237ede1625 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 20 Jun 2023 14:54:25 -0400 Subject: [PATCH 438/782] Separate summary and audit-summary API endpoints --- backend/src/api/bitcoin/bitcoin.routes.ts | 10 +- backend/src/api/blocks.ts | 14 +- .../repositories/BlocksAuditsRepository.ts | 7 +- .../app/components/block/block.component.html | 2 +- .../app/components/block/block.component.ts | 246 ++++++++---------- .../src/app/interfaces/node-api.interface.ts | 3 + frontend/src/app/services/api.service.ts | 8 +- 7 files changed, 129 insertions(+), 161 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index 0a343c376..f4176e67b 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -394,9 +394,13 @@ class BitcoinRoutes { private async getBlockAuditSummary(req: Request, res: Response) { try { - const transactions = await blocks.$getBlockAuditSummary(req.params.hash); - res.setHeader('Expires', new Date(Date.now() + 1000 * 3600 * 24 * 30).toUTCString()); - res.json(transactions); + const auditSummary = await blocks.$getBlockAuditSummary(req.params.hash); + if (auditSummary) { + res.setHeader('Expires', new Date(Date.now() + 1000 * 3600 * 24 * 30).toUTCString()); + res.json(auditSummary); + } else { + return res.status(404).send(`audit not available`); + } } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); } diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index fae1d453b..12203068f 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -1007,19 +1007,11 @@ class Blocks { } public async $getBlockAuditSummary(hash: string): Promise { - let summary; if (['mainnet', 'testnet', 'signet'].includes(config.MEMPOOL.NETWORK)) { - summary = await BlocksAuditsRepository.$getBlockAudit(hash); + return BlocksAuditsRepository.$getBlockAudit(hash); + } else { + return null; } - - // fallback to non-audited transaction summary - if (!summary?.transactions?.length) { - const strippedTransactions = await this.$getStrippedBlockTransactions(hash); - summary = { - transactions: strippedTransactions - }; - } - return summary; } public getLastDifficultyAdjustmentTime(): number { diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index 1fa2b0209..8ad035f32 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -64,7 +64,6 @@ class BlocksAuditRepositories { const [rows]: any[] = await DB.query( `SELECT blocks.height, blocks.hash as id, UNIX_TIMESTAMP(blocks.blockTimestamp) as timestamp, blocks.size, blocks.weight, blocks.tx_count, - transactions, template, missing_txs as missingTxs, added_txs as addedTxs, @@ -76,7 +75,6 @@ class BlocksAuditRepositories { FROM blocks_audits JOIN blocks ON blocks.hash = blocks_audits.hash JOIN blocks_templates ON blocks_templates.id = blocks_audits.hash - JOIN blocks_summaries ON blocks_summaries.id = blocks_audits.hash WHERE blocks_audits.hash = "${hash}" `); @@ -85,12 +83,9 @@ class BlocksAuditRepositories { rows[0].addedTxs = JSON.parse(rows[0].addedTxs); rows[0].freshTxs = JSON.parse(rows[0].freshTxs); rows[0].sigopTxs = JSON.parse(rows[0].sigopTxs); - rows[0].transactions = JSON.parse(rows[0].transactions); rows[0].template = JSON.parse(rows[0].template); - if (rows[0].transactions.length) { - return rows[0]; - } + return rows[0]; } return null; } catch (e: any) { diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 1a0a81026..00cb2fcb1 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -63,7 +63,7 @@ *ngIf="blockAudit?.matchRate != null; else nullHealth" >{{ blockAudit?.matchRate }}% - + Unknown diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 17e6e9b7f..927222dbc 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -2,9 +2,9 @@ import { Component, OnInit, OnDestroy, ViewChildren, QueryList } from '@angular/ import { Location } from '@angular/common'; import { ActivatedRoute, ParamMap, Router } from '@angular/router'; import { ElectrsApiService } from '../../services/electrs-api.service'; -import { switchMap, tap, throttleTime, catchError, map, shareReplay, startWith, pairwise, filter } from 'rxjs/operators'; +import { switchMap, tap, throttleTime, catchError, map, shareReplay, startWith } from 'rxjs/operators'; import { Transaction, Vout } from '../../interfaces/electrs.interface'; -import { Observable, of, Subscription, asyncScheduler, EMPTY, combineLatest } from 'rxjs'; +import { Observable, of, Subscription, asyncScheduler, EMPTY, combineLatest, forkJoin } from 'rxjs'; import { StateService } from '../../services/state.service'; import { SeoService } from '../../services/seo.service'; import { WebsocketService } from '../../services/websocket.service'; @@ -44,7 +44,6 @@ export class BlockComponent implements OnInit, OnDestroy { strippedTransactions: TransactionStripped[]; overviewTransitionDirection: string; isLoadingOverview = true; - isLoadingAudit = true; error: any; blockSubsidy: number; fees: number; @@ -281,143 +280,111 @@ export class BlockComponent implements OnInit, OnDestroy { this.isLoadingOverview = false; }); - if (!this.auditSupported) { - this.overviewSubscription = block$.pipe( - startWith(null), - pairwise(), - switchMap(([prevBlock, block]) => this.apiService.getStrippedBlockTransactions$(block.id) - .pipe( - catchError((err) => { - this.overviewError = err; - return of([]); - }), - switchMap((transactions) => { - if (prevBlock) { - return of({ transactions, direction: (prevBlock.height < block.height) ? 'right' : 'left' }); - } else { - return of({ transactions, direction: 'down' }); - } - }) - ) - ), - ) - .subscribe(({transactions, direction}: {transactions: TransactionStripped[], direction: string}) => { - this.strippedTransactions = transactions; - this.isLoadingOverview = false; - this.setupBlockGraphs(); - }, - (error) => { - this.error = error; - this.isLoadingOverview = false; - }); - } - - if (this.auditSupported) { - this.auditSubscription = block$.pipe( - startWith(null), - pairwise(), - switchMap(([prevBlock, block]) => { - this.isLoadingAudit = true; - this.blockAudit = null; - return this.apiService.getBlockAudit$(block.id) + this.overviewSubscription = block$.pipe( + switchMap((block) => { + return forkJoin([ + this.apiService.getStrippedBlockTransactions$(block.id) .pipe( catchError((err) => { this.overviewError = err; - this.isLoadingAudit = false; - return of([]); + return of(null); }) - ); - } - ), - filter((response) => response != null), - map((response) => { - const blockAudit = response.body; - const inTemplate = {}; - const inBlock = {}; - const isAdded = {}; - const isCensored = {}; - const isMissing = {}; - const isSelected = {}; - const isFresh = {}; - const isSigop = {}; - this.numMissing = 0; - this.numUnexpected = 0; + ), + !this.isAuditAvailableFromBlockHeight(block.height) ? of(null) : this.apiService.getBlockAudit$(block.id) + .pipe( + catchError((err) => { + this.overviewError = err; + return of(null); + }) + ) + ]); + }) + ) + .subscribe(([transactions, blockAudit]) => { + if (transactions) { + this.strippedTransactions = transactions; + } else { + this.strippedTransactions = []; + } - if (blockAudit?.template) { - for (const tx of blockAudit.template) { - inTemplate[tx.txid] = true; - } - for (const tx of blockAudit.transactions) { - inBlock[tx.txid] = true; - } - for (const txid of blockAudit.addedTxs) { - isAdded[txid] = true; - } - for (const txid of blockAudit.missingTxs) { - isCensored[txid] = true; - } - for (const txid of blockAudit.freshTxs || []) { - isFresh[txid] = true; - } - for (const txid of blockAudit.sigopTxs || []) { - isSigop[txid] = true; - } - // set transaction statuses - for (const tx of blockAudit.template) { - tx.context = 'projected'; - if (isCensored[tx.txid]) { - tx.status = 'censored'; - } else if (inBlock[tx.txid]) { - tx.status = 'found'; - } else { - tx.status = isFresh[tx.txid] ? 'fresh' : (isSigop[tx.txid] ? 'sigop' : 'missing'); - isMissing[tx.txid] = true; - this.numMissing++; - } - } - for (const [index, tx] of blockAudit.transactions.entries()) { - tx.context = 'actual'; - if (index === 0) { - tx.status = null; - } else if (isAdded[tx.txid]) { - tx.status = 'added'; - } else if (inTemplate[tx.txid]) { - tx.status = 'found'; - } else { - tx.status = 'selected'; - isSelected[tx.txid] = true; - this.numUnexpected++; - } - } - for (const tx of blockAudit.transactions) { - inBlock[tx.txid] = true; - } + this.blockAudit = null; + if (transactions && blockAudit) { + const inTemplate = {}; + const inBlock = {}; + const isAdded = {}; + const isCensored = {}; + const isMissing = {}; + const isSelected = {}; + const isFresh = {}; + const isSigop = {}; + this.numMissing = 0; + this.numUnexpected = 0; - blockAudit.feeDelta = blockAudit.expectedFees > 0 ? (blockAudit.expectedFees - this.block.extras.totalFees) / blockAudit.expectedFees : 0; - blockAudit.weightDelta = blockAudit.expectedWeight > 0 ? (blockAudit.expectedWeight - this.block.weight) / blockAudit.expectedWeight : 0; - blockAudit.txDelta = blockAudit.template.length > 0 ? (blockAudit.template.length - this.block.tx_count) / blockAudit.template.length : 0; - - this.setAuditAvailable(true); - } else { - this.setAuditAvailable(false); + if (blockAudit?.template) { + for (const tx of blockAudit.template) { + inTemplate[tx.txid] = true; } - return blockAudit; - }), - catchError((err) => { - console.log(err); - this.error = err; - this.isLoadingOverview = false; - this.isLoadingAudit = false; + for (const tx of transactions) { + inBlock[tx.txid] = true; + } + for (const txid of blockAudit.addedTxs) { + isAdded[txid] = true; + } + for (const txid of blockAudit.missingTxs) { + isCensored[txid] = true; + } + for (const txid of blockAudit.freshTxs || []) { + isFresh[txid] = true; + } + for (const txid of blockAudit.sigopTxs || []) { + isSigop[txid] = true; + } + // set transaction statuses + for (const tx of blockAudit.template) { + tx.context = 'projected'; + if (isCensored[tx.txid]) { + tx.status = 'censored'; + } else if (inBlock[tx.txid]) { + tx.status = 'found'; + } else { + tx.status = isFresh[tx.txid] ? 'fresh' : (isSigop[tx.txid] ? 'sigop' : 'missing'); + isMissing[tx.txid] = true; + this.numMissing++; + } + } + for (const [index, tx] of transactions.entries()) { + tx.context = 'actual'; + if (index === 0) { + tx.status = null; + } else if (isAdded[tx.txid]) { + tx.status = 'added'; + } else if (inTemplate[tx.txid]) { + tx.status = 'found'; + } else { + tx.status = 'selected'; + isSelected[tx.txid] = true; + this.numUnexpected++; + } + } + for (const tx of transactions) { + inBlock[tx.txid] = true; + } + + blockAudit.feeDelta = blockAudit.expectedFees > 0 ? (blockAudit.expectedFees - this.block.extras.totalFees) / blockAudit.expectedFees : 0; + blockAudit.weightDelta = blockAudit.expectedWeight > 0 ? (blockAudit.expectedWeight - this.block.weight) / blockAudit.expectedWeight : 0; + blockAudit.txDelta = blockAudit.template.length > 0 ? (blockAudit.template.length - this.block.tx_count) / blockAudit.template.length : 0; + this.blockAudit = blockAudit; + this.setAuditAvailable(true); + } else { this.setAuditAvailable(false); - return of(null); - }), - ).subscribe((blockAudit) => { - this.blockAudit = blockAudit; - this.setupBlockGraphs(); - this.isLoadingOverview = false; - this.isLoadingAudit = false; - }); - } + } + } else { + this.setAuditAvailable(false); + } + + this.isLoadingOverview = false; + this.setupBlockGraphs(); + }); this.networkChangedSubscription = this.stateService.networkChanged$ .subscribe((network) => this.network = network); @@ -652,25 +619,32 @@ export class BlockComponent implements OnInit, OnDestroy { } updateAuditAvailableFromBlockHeight(blockHeight: number): void { - if (!this.auditSupported) { + if (!this.isAuditAvailableFromBlockHeight(blockHeight)) { this.setAuditAvailable(false); } + } + + isAuditAvailableFromBlockHeight(blockHeight: number): boolean { + if (!this.auditSupported) { + return false; + } switch (this.stateService.network) { case 'testnet': if (blockHeight < this.stateService.env.TESTNET_BLOCK_AUDIT_START_HEIGHT) { - this.setAuditAvailable(false); + return false; } break; case 'signet': if (blockHeight < this.stateService.env.SIGNET_BLOCK_AUDIT_START_HEIGHT) { - this.setAuditAvailable(false); + return false; } break; default: if (blockHeight < this.stateService.env.MAINNET_BLOCK_AUDIT_START_HEIGHT) { - this.setAuditAvailable(false); + return false; } } + return true; } getMinBlockFee(block: BlockExtended): number { diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 2f9b95ab1..648eb38ea 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -153,6 +153,8 @@ export interface BlockExtended extends Block { export interface BlockAudit extends BlockExtended { missingTxs: string[], addedTxs: string[], + freshTxs: string[], + sigopTxs: string[], matchRate: number, expectedFees: number, expectedWeight: number, @@ -169,6 +171,7 @@ export interface TransactionStripped { vsize: number; value: number; status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected'; + context?: 'projected' | 'actual'; } interface RbfTransaction extends TransactionStripped { diff --git a/frontend/src/app/services/api.service.ts b/frontend/src/app/services/api.service.ts index 8521ddc83..45fa7e9fc 100644 --- a/frontend/src/app/services/api.service.ts +++ b/frontend/src/app/services/api.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http'; import { CpfpInfo, OptimizedMempoolStats, AddressInformation, LiquidPegs, ITranslators, - PoolStat, BlockExtended, TransactionStripped, RewardStats, AuditScore, BlockSizesAndWeights, RbfTree } from '../interfaces/node-api.interface'; + PoolStat, BlockExtended, TransactionStripped, RewardStats, AuditScore, BlockSizesAndWeights, RbfTree, BlockAudit } from '../interfaces/node-api.interface'; import { Observable } from 'rxjs'; import { StateService } from './state.service'; import { WebsocketResponse } from '../interfaces/websocket.interface'; @@ -245,9 +245,9 @@ export class ApiService { ); } - getBlockAudit$(hash: string) : Observable { - return this.httpClient.get( - this.apiBaseUrl + this.apiBasePath + `/api/v1/block/${hash}/audit-summary`, { observe: 'response' } + getBlockAudit$(hash: string) : Observable { + return this.httpClient.get( + this.apiBaseUrl + this.apiBasePath + `/api/v1/block/${hash}/audit-summary` ); } From 9bfc2c9413ba1fb002d186160bce2016dd81526e Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Tue, 20 Jun 2023 19:49:58 -0400 Subject: [PATCH 439/782] Update ronindojo link on about page --- frontend/src/app/components/about/about.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 2936606ad..b6fc127d6 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -205,7 +205,7 @@ myNode - + RoninDojo From e18f3800be99a3eeb87443ce822a1dc3d244a6c8 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 21 Jun 2023 19:07:00 -0400 Subject: [PATCH 440/782] Hotfix for undefined cpfp cluster bug --- backend/src/repositories/CpfpRepository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/repositories/CpfpRepository.ts b/backend/src/repositories/CpfpRepository.ts index e712e6009..1ad80864b 100644 --- a/backend/src/repositories/CpfpRepository.ts +++ b/backend/src/repositories/CpfpRepository.ts @@ -120,8 +120,8 @@ class CpfpRepository { [clusterRoot] ); const cluster = clusterRows[0]; - cluster.effectiveFeePerVsize = cluster.fee_rate; if (cluster?.txs) { + cluster.effectiveFeePerVsize = cluster.fee_rate; cluster.txs = this.unpack(cluster.txs); return cluster; } From 329c635da5a0416c573af32502479a29ba2bc9df Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 21 Jun 2023 19:53:35 -0400 Subject: [PATCH 441/782] Fix getCpfpInfo error handling --- backend/src/api/bitcoin/bitcoin.routes.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index 0a343c376..c31fe1a09 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -224,7 +224,12 @@ class BitcoinRoutes { } else { let cpfpInfo; if (config.DATABASE.ENABLED) { - cpfpInfo = await transactionRepository.$getCpfpInfo(req.params.txId); + try { + cpfpInfo = await transactionRepository.$getCpfpInfo(req.params.txId); + } catch (e) { + res.status(500).send('failed to get CPFP info'); + return; + } } if (cpfpInfo) { res.json(cpfpInfo); From 9ff5ce0d372c627205e11c107aaa73cb06c22ab2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 21 Jun 2023 19:54:02 -0400 Subject: [PATCH 442/782] Change order of cpfp db operations --- backend/src/repositories/CpfpRepository.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/backend/src/repositories/CpfpRepository.ts b/backend/src/repositories/CpfpRepository.ts index 1ad80864b..90ba2ac80 100644 --- a/backend/src/repositories/CpfpRepository.ts +++ b/backend/src/repositories/CpfpRepository.ts @@ -78,14 +78,6 @@ class CpfpRepository { const maxChunk = 100; let chunkIndex = 0; - // insert transactions in batches of up to 100 rows - while (chunkIndex < txs.length) { - const chunk = txs.slice(chunkIndex, chunkIndex + maxChunk); - await transactionRepository.$batchSetCluster(chunk); - chunkIndex += maxChunk; - } - - chunkIndex = 0; // insert clusters in batches of up to 100 rows while (chunkIndex < clusterValues.length) { const chunk = clusterValues.slice(chunkIndex, chunkIndex + maxChunk); @@ -103,6 +95,15 @@ class CpfpRepository { ); chunkIndex += maxChunk; } + + chunkIndex = 0; + // insert transactions in batches of up to 100 rows + while (chunkIndex < txs.length) { + const chunk = txs.slice(chunkIndex, chunkIndex + maxChunk); + await transactionRepository.$batchSetCluster(chunk); + chunkIndex += maxChunk; + } + return true; } catch (e: any) { logger.err(`Cannot save cpfp clusters into db. Reason: ` + (e instanceof Error ? e.message : e)); From 1f442b9ea61c0a88911084f6ca4d6f285fff40d8 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 22 Jun 2023 11:52:43 -0400 Subject: [PATCH 443/782] Make cpfp db save operations atomic --- backend/src/api/blocks.ts | 10 +++- backend/src/database.ts | 33 ++++++++++- backend/src/repositories/CpfpRepository.ts | 58 ++++--------------- .../src/repositories/TransactionRepository.ts | 26 ++++++--- 4 files changed, 65 insertions(+), 62 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index fae1d453b..a91281050 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -1050,9 +1050,13 @@ class Blocks { } public async $saveCpfp(hash: string, height: number, cpfpSummary: CpfpSummary): Promise { - const result = await cpfpRepository.$batchSaveClusters(cpfpSummary.clusters); - if (!result) { - await cpfpRepository.$insertProgressMarker(height); + try { + const result = await cpfpRepository.$batchSaveClusters(cpfpSummary.clusters); + if (!result) { + await cpfpRepository.$insertProgressMarker(height); + } + } catch (e) { + // not a fatal error, we'll try again next time the indexer runs } } } diff --git a/backend/src/database.ts b/backend/src/database.ts index 070774c92..6ad545fda 100644 --- a/backend/src/database.ts +++ b/backend/src/database.ts @@ -30,7 +30,7 @@ import { FieldPacket, OkPacket, PoolOptions, ResultSetHeader, RowDataPacket } fr } public async query(query, params?): Promise<[T, FieldPacket[]]> + OkPacket[] | ResultSetHeader>(query, params?, connection?: PoolConnection): Promise<[T, FieldPacket[]]> { this.checkDBFlag(); let hardTimeout; @@ -45,7 +45,9 @@ import { FieldPacket, OkPacket, PoolOptions, ResultSetHeader, RowDataPacket } fr reject(new Error(`DB query failed to return, reject or time out within ${hardTimeout / 1000}s - ${query?.sql?.slice(0, 160) || (typeof(query) === 'string' || query instanceof String ? query?.slice(0, 160) : 'unknown query')}`)); }, hardTimeout); - this.getPool().then(pool => { + // Use a specific connection if provided, otherwise delegate to the pool + const connectionPromise = connection ? Promise.resolve(connection) : this.getPool(); + connectionPromise.then((pool: PoolConnection | Pool) => { return pool.query(query, params) as Promise<[T, FieldPacket[]]>; }).then(result => { resolve(result); @@ -61,6 +63,33 @@ import { FieldPacket, OkPacket, PoolOptions, ResultSetHeader, RowDataPacket } fr } } + public async $atomicQuery(queries: { query, params }[]): Promise<[T, FieldPacket[]][]> + { + const pool = await this.getPool(); + const connection = await pool.getConnection(); + try { + await connection.beginTransaction(); + + const results: [T, FieldPacket[]][] = []; + for (const query of queries) { + const result = await this.query(query.query, query.params, connection) as [T, FieldPacket[]]; + results.push(result); + } + + await connection.commit(); + + return results; + } catch (e) { + logger.err('Could not complete db transaction, rolling back: ' + (e instanceof Error ? e.message : e)); + connection.rollback(); + connection.release(); + throw e; + } finally { + connection.release(); + } + } + public async checkDbConnection() { this.checkDBFlag(); try { diff --git a/backend/src/repositories/CpfpRepository.ts b/backend/src/repositories/CpfpRepository.ts index 90ba2ac80..b33ff1e4a 100644 --- a/backend/src/repositories/CpfpRepository.ts +++ b/backend/src/repositories/CpfpRepository.ts @@ -5,52 +5,10 @@ import { Ancestor, CpfpCluster } from '../mempool.interfaces'; import transactionRepository from '../repositories/TransactionRepository'; class CpfpRepository { - public async $saveCluster(clusterRoot: string, height: number, txs: Ancestor[], effectiveFeePerVsize: number): Promise { - if (!txs[0]) { - return false; - } - // skip clusters of transactions with the same fees - const roundedEffectiveFee = Math.round(effectiveFeePerVsize * 100) / 100; - const equalFee = txs.length > 1 && txs.reduce((acc, tx) => { - return (acc && Math.round(((tx.fee || 0) / (tx.weight / 4)) * 100) / 100 === roundedEffectiveFee); - }, true); - if (equalFee) { - return false; - } - - try { - const packedTxs = Buffer.from(this.pack(txs)); - await DB.query( - ` - INSERT INTO compact_cpfp_clusters(root, height, txs, fee_rate) - VALUE (UNHEX(?), ?, ?, ?) - ON DUPLICATE KEY UPDATE - height = ?, - txs = ?, - fee_rate = ? - `, - [clusterRoot, height, packedTxs, effectiveFeePerVsize, height, packedTxs, effectiveFeePerVsize] - ); - const maxChunk = 10; - let chunkIndex = 0; - while (chunkIndex < txs.length) { - const chunk = txs.slice(chunkIndex, chunkIndex + maxChunk).map(tx => { - return { txid: tx.txid, cluster: clusterRoot }; - }); - await transactionRepository.$batchSetCluster(chunk); - chunkIndex += maxChunk; - } - return true; - } catch (e: any) { - logger.err(`Cannot save cpfp cluster into db. Reason: ` + (e instanceof Error ? e.message : e)); - throw e; - } - } - public async $batchSaveClusters(clusters: { root: string, height: number, txs: Ancestor[], effectiveFeePerVsize: number }[]): Promise { try { - const clusterValues: any[] = []; - const txs: any[] = []; + const clusterValues: [string, number, Buffer, number][] = []; + const txs: { txid: string, cluster: string }[] = []; for (const cluster of clusters) { if (cluster.txs?.length) { @@ -76,6 +34,8 @@ class CpfpRepository { return false; } + const queries: { query, params }[] = []; + const maxChunk = 100; let chunkIndex = 0; // insert clusters in batches of up to 100 rows @@ -89,10 +49,10 @@ class CpfpRepository { return (' (UNHEX(?), ?, ?, ?)'); }) + ';'; const values = chunk.flat(); - await DB.query( + queries.push({ query, - values - ); + params: values, + }); chunkIndex += maxChunk; } @@ -100,10 +60,12 @@ class CpfpRepository { // insert transactions in batches of up to 100 rows while (chunkIndex < txs.length) { const chunk = txs.slice(chunkIndex, chunkIndex + maxChunk); - await transactionRepository.$batchSetCluster(chunk); + queries.push(transactionRepository.buildBatchSetQuery(chunk)); chunkIndex += maxChunk; } + await DB.$atomicQuery(queries); + return true; } catch (e: any) { logger.err(`Cannot save cpfp clusters into db. Reason: ` + (e instanceof Error ? e.message : e)); diff --git a/backend/src/repositories/TransactionRepository.ts b/backend/src/repositories/TransactionRepository.ts index bde95df9b..b5067f790 100644 --- a/backend/src/repositories/TransactionRepository.ts +++ b/backend/src/repositories/TransactionRepository.ts @@ -25,9 +25,8 @@ class TransactionRepository { } } - public async $batchSetCluster(txs): Promise { - try { - let query = ` + public buildBatchSetQuery(txs: { txid: string, cluster: string }[]): { query, params } { + let query = ` INSERT IGNORE INTO compact_transactions ( txid, @@ -35,13 +34,22 @@ class TransactionRepository { ) VALUES `; - query += txs.map(tx => { - return (' (UNHEX(?), UNHEX(?))'); - }) + ';'; - const values = txs.map(tx => [tx.txid, tx.cluster]).flat(); + query += txs.map(tx => { + return (' (UNHEX(?), UNHEX(?))'); + }) + ';'; + const values = txs.map(tx => [tx.txid, tx.cluster]).flat(); + return { + query, + params: values, + }; + } + + public async $batchSetCluster(txs): Promise { + try { + const query = this.buildBatchSetQuery(txs); await DB.query( - query, - values + query.query, + query.params, ); } catch (e: any) { logger.err(`Cannot save cpfp transactions into db. Reason: ` + (e instanceof Error ? e.message : e)); From dbf759fc763d0191bc984b43734a64923570e023 Mon Sep 17 00:00:00 2001 From: 0xflick Date: Sat, 24 Jun 2023 16:29:25 -0500 Subject: [PATCH 444/782] sign contributor agreement --- contributors/0xflicker.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/0xflicker.txt diff --git a/contributors/0xflicker.txt b/contributors/0xflicker.txt new file mode 100644 index 000000000..fb3f198e2 --- /dev/null +++ b/contributors/0xflicker.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of June 24, 2023. + +Signed: 0xflicker From c89b15fdbc4294a645f96854b9d50d895db2451c Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:24:31 -0400 Subject: [PATCH 445/782] Update mosp strings from tm to r --- LICENSE | 2 +- README.md | 2 +- frontend/src/app/components/about/about.component.html | 2 +- .../components/privacy-policy/privacy-policy.component.html | 2 +- .../trademark-policy/trademark-policy.component.html | 4 ++-- .../components/global-footer/global-footer.component.html | 4 ++-- frontend/src/index.bisq.html | 4 ++-- frontend/src/index.liquid.html | 4 ++-- frontend/src/index.mempool.html | 4 ++-- unfurler/src/index.ts | 4 ++-- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/LICENSE b/LICENSE index ac267d120..9f8592854 100644 --- a/LICENSE +++ b/LICENSE @@ -13,7 +13,7 @@ the terms of (at your option) either: proxy statement published on . However, this copyright license does not include an implied right or license to -use our trademarks: The Mempool Open Source Project™, mempool.space™, the +use our trademarks: The Mempool Open Source Project®, mempool.space™, the mempool Logo™, the mempool.space Vertical Logo™, the mempool.space Horizontal Logo™, the mempool Square Logo™, and the mempool Blocks logo™ are registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, diff --git a/README.md b/README.md index b7a455cd5..dd2e62478 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# The Mempool Open Source Project™ [![mempool](https://img.shields.io/endpoint?url=https://dashboard.cypress.io/badge/simple/ry4br7/master&style=flat-square)](https://dashboard.cypress.io/projects/ry4br7/runs) +# The Mempool Open Source Project® [![mempool](https://img.shields.io/endpoint?url=https://dashboard.cypress.io/badge/simple/ry4br7/master&style=flat-square)](https://dashboard.cypress.io/projects/ry4br7/runs) https://user-images.githubusercontent.com/93150691/226236121-375ea64f-b4a1-4cc0-8fad-a6fb33226840.mp4 diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 9b2bdf6c0..4100273dd 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -411,7 +411,7 @@ Trademark Notice

    - The Mempool Open Source Project™, mempool.space™, the mempool logo®, the mempool.space logos™, the mempool square logo®, and the mempool blocks logo™ are either registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, and/or other countries. + The Mempool Open Source Project®, mempool.space™, the mempool logo®, the mempool.space logos™, the mempool square logo®, and the mempool blocks logo™ are either registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, and/or other countries.

    While our software is available under an open source software license, the copyright license does not include an implied right or license to use our trademarks. See our Trademark Policy and Guidelines for more details, published on <https://mempool.space/trademark-policy>. diff --git a/frontend/src/app/components/privacy-policy/privacy-policy.component.html b/frontend/src/app/components/privacy-policy/privacy-policy.component.html index fc93b9aa9..e0979ce24 100644 --- a/frontend/src/app/components/privacy-policy/privacy-policy.component.html +++ b/frontend/src/app/components/privacy-policy/privacy-policy.component.html @@ -43,7 +43,7 @@

    TRUST YOUR OWN SELF-HOSTED MEMPOOL EXPLORER

    -

    For maximum privacy, we recommend that you use your own self-hosted instance of The Mempool Open Source Project™ on your own hardware. You can easily install your own self-hosted instance of this website on a Raspberry Pi using a one-click installation method maintained by various Bitcoin fullnode distributions such as Umbrel, RaspiBlitz, MyNode, and RoninDojo. See our project's GitHub page for more details about self-hosting this website.

    +

    For maximum privacy, we recommend that you use your own self-hosted instance of The Mempool Open Source Project® on your own hardware. You can easily install your own self-hosted instance of this website on a Raspberry Pi using a one-click installation method maintained by various Bitcoin fullnode distributions such as Umbrel, RaspiBlitz, MyNode, and RoninDojo. See our project's GitHub page for more details about self-hosting this website.


    diff --git a/frontend/src/app/components/trademark-policy/trademark-policy.component.html b/frontend/src/app/components/trademark-policy/trademark-policy.component.html index 4f9419642..3a3da15dd 100644 --- a/frontend/src/app/components/trademark-policy/trademark-policy.component.html +++ b/frontend/src/app/components/trademark-policy/trademark-policy.component.html @@ -7,7 +7,7 @@

    Trademark Policy and Guidelines

    -
    The Mempool Open Source Project ™
    +
    The Mempool Open Source Project ®
    Updated: July 19, 2021

    @@ -304,7 +304,7 @@

    Also, if you are using our Marks in a way described in the sections "Uses for Which We Are Granting a License," you must include the following trademark attribution at the foot of the webpage where you have used the Mark (or, if in a book, on the credits page), on any packaging or labeling, and on advertising or marketing materials:

    -

    “The Mempool Space K.K.™, The Mempool Open Source Project™, mempool.space™, the mempool logo®, the mempool.space logos™, the mempool square logo®, and the mempool blocks logo™ are either registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, and/or other countries, and are used with permission. Mempool Space K.K. has no affiliation with and does not sponsor or endorse the information provided herein.”

    +

    “The Mempool Space K.K.™, The Mempool Open Source Project®, mempool.space™, the mempool logo®, the mempool.space logos™, the mempool square logo®, and the mempool blocks logo™ are either registered trademarks or trademarks of Mempool Space K.K in Japan, the United States, and/or other countries, and are used with permission. Mempool Space K.K. has no affiliation with and does not sponsor or endorse the information provided herein.”

  • What to Do When You See Abuse
  • diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html index 0bac1f9ff..c188e42dd 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.html +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html @@ -2,7 +2,7 @@
    -
    The Mempool Open Source Project
    +
    The Mempool Open Source Project ®

    Explore the full Bitcoin ecosystem

    - +
    - +
    diff --git a/frontend/src/app/components/mempool-block/mempool-block.component.ts b/frontend/src/app/components/mempool-block/mempool-block.component.ts index b9bdc55bb..cb3a38172 100644 --- a/frontend/src/app/components/mempool-block/mempool-block.component.ts +++ b/frontend/src/app/components/mempool-block/mempool-block.component.ts @@ -17,6 +17,7 @@ export class MempoolBlockComponent implements OnInit, OnDestroy { network$: Observable; mempoolBlockIndex: number; mempoolBlock$: Observable; + mempoolBlockTransactions$: Observable; ordinal$: BehaviorSubject = new BehaviorSubject(''); previewTx: TransactionStripped | void; webGlEnabled: boolean; @@ -62,6 +63,8 @@ export class MempoolBlockComponent implements OnInit, OnDestroy { }) ); + this.mempoolBlockTransactions$ = this.stateService.liveMempoolBlockTransactions$.pipe(map(txMap => Object.values(txMap))); + this.network$ = this.stateService.networkChanged$; } diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 31f5f3aab..fb3b37e05 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -1,11 +1,11 @@ import { Inject, Injectable, PLATFORM_ID, LOCALE_ID } from '@angular/core'; -import { ReplaySubject, BehaviorSubject, Subject, fromEvent, Observable } from 'rxjs'; +import { ReplaySubject, BehaviorSubject, Subject, fromEvent, Observable, merge } from 'rxjs'; import { Transaction } from '../interfaces/electrs.interface'; import { IBackendInfo, MempoolBlock, MempoolBlockWithTransactions, MempoolBlockDelta, MempoolInfo, Recommendedfees, ReplacedTransaction, TransactionStripped } from '../interfaces/websocket.interface'; import { BlockExtended, DifficultyAdjustment, MempoolPosition, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface'; import { Router, NavigationStart } from '@angular/router'; import { isPlatformBrowser } from '@angular/common'; -import { map, shareReplay } from 'rxjs/operators'; +import { map, scan, shareReplay, tap } from 'rxjs/operators'; import { StorageService } from './storage.service'; interface MarkBlockState { @@ -100,6 +100,7 @@ export class StateService { mempoolBlocks$ = new ReplaySubject(1); mempoolBlockTransactions$ = new Subject(); mempoolBlockDelta$ = new Subject(); + liveMempoolBlockTransactions$: Observable<{ [txid: string]: TransactionStripped}>; txReplaced$ = new Subject(); txRbfInfo$ = new Subject(); rbfLatest$ = new Subject(); @@ -166,6 +167,30 @@ export class StateService { this.blocks$ = new ReplaySubject<[BlockExtended, string]>(this.env.KEEP_BLOCKS_AMOUNT); + this.liveMempoolBlockTransactions$ = merge( + this.mempoolBlockTransactions$.pipe(map(transactions => { return { transactions }; })), + this.mempoolBlockDelta$.pipe(map(delta => { return { delta }; })), + ).pipe(scan((transactions: { [txid: string]: TransactionStripped }, change: any): { [txid: string]: TransactionStripped } => { + if (change.transactions) { + const txMap = {} + change.transactions.forEach(tx => { + txMap[tx.txid] = tx; + }) + return txMap; + } else { + change.delta.changed.forEach(tx => { + transactions[tx.txid].rate = tx.rate; + }) + change.delta.removed.forEach(txid => { + delete transactions[txid]; + }); + change.delta.added.forEach(tx => { + transactions[tx.txid] = tx; + }); + return transactions; + } + }, {})); + if (this.env.BASE_MODULE === 'bisq') { this.network = this.env.BASE_MODULE; this.networkChanged$.next(this.env.BASE_MODULE); diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index b38a60898..aea8e8d6e 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -500,7 +500,7 @@ html:lang(ru) .card-title { } .fee-distribution-chart { - height: 250px; + height: 265px; } .fees-wrapper-tooltip-chart { From 9f2b98b246e184b4cf140fedbe7ccc7741cf3c67 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 7 Jun 2023 13:22:27 -0400 Subject: [PATCH 451/782] Handle stack-of-N-blocks in new fee graph --- backend/src/api/mempool-blocks.ts | 4 ++-- .../fee-distribution-graph.component.ts | 17 +++++++++++++---- .../mempool-block/mempool-block.component.html | 4 ++-- .../mempool-block/mempool-block.component.ts | 1 + 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 224e31744..57d1a393f 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -143,7 +143,7 @@ class MempoolBlocks { const stackWeight = transactionsSorted.slice(index).reduce((total, tx) => total + (tx.weight || 0), 0); if (stackWeight > config.MEMPOOL.BLOCK_WEIGHT_UNITS) { onlineStats = true; - feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5); + feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5, [10, 20, 30, 40, 50, 60, 70, 80, 90]); feeStatsCalculator.processNext(tx); } } @@ -334,7 +334,7 @@ class MempoolBlocks { if (hasBlockStack) { stackWeight = blocks[blocks.length - 1].reduce((total, tx) => total + (mempool[tx]?.weight || 0), 0); hasBlockStack = stackWeight > config.MEMPOOL.BLOCK_WEIGHT_UNITS; - feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5); + feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5, [10, 20, 30, 40, 50, 60, 70, 80, 90]); } const readyBlocks: { transactionIds, transactions, totalSize, totalWeight, totalFees, feeStats }[] = []; diff --git a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts index e75719191..d20a9612f 100644 --- a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts +++ b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts @@ -10,6 +10,8 @@ import { VbytesPipe } from '../../shared/pipes/bytes-pipe/vbytes.pipe'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class FeeDistributionGraphComponent implements OnInit, OnChanges { + @Input() feeRange: number[]; + @Input() vsize: number; @Input() transactions: TransactionStripped[]; @Input() height: number | string = 210; @Input() top: number | string = 20; @@ -18,6 +20,7 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { @Input() numSamples: number = 200; @Input() numLabels: number = 10; + simple: boolean = false; data: number[][]; labelInterval: number = 50; @@ -36,11 +39,17 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { } ngOnChanges() { + this.simple = !!this.feeRange?.length; this.prepareChart(); this.mountChart(); } prepareChart() { + if (this.simple) { + this.data = this.feeRange.map((rate, index) => [index * 10, rate]); + this.labelInterval = 1; + return; + } this.data = []; if (!this.transactions?.length) { return; @@ -56,14 +65,14 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { this.labelInterval = this.numSamples / this.numLabels; while (nextSample <= maxBlockVSize) { if (txIndex >= txs.length) { - samples.push([1 - (sampleIndex / this.numSamples), 0]); + samples.push([(1 - (sampleIndex / this.numSamples)) * 100, 0]); nextSample += sampleInterval; sampleIndex++; break; } while (txs[txIndex] && nextSample < cumVSize + txs[txIndex].vsize) { - samples.push([1 - (sampleIndex / this.numSamples), txs[txIndex].rate]); + samples.push([(1 - (sampleIndex / this.numSamples)) * 100, txs[txIndex].rate]); nextSample += sampleInterval; sampleIndex++; } @@ -84,7 +93,7 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { xAxis: { type: 'category', boundaryGap: false, - name: 'MvB', + name: '% Weight', nameLocation: 'middle', nameGap: 0, nameTextStyle: { @@ -93,7 +102,7 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { }, axisLabel: { interval: (index: number): boolean => { return index && (index % this.labelInterval === 0); }, - formatter: (value: number): string => { return Number(value).toFixed(1); }, + formatter: (value: number): string => { return Number(value).toFixed(0); }, }, axisTick: { interval: (index:number): boolean => { return (index % this.labelInterval === 0); }, diff --git a/frontend/src/app/components/mempool-block/mempool-block.component.html b/frontend/src/app/components/mempool-block/mempool-block.component.html index 66d024b8c..7d5b18ccb 100644 --- a/frontend/src/app/components/mempool-block/mempool-block.component.html +++ b/frontend/src/app/components/mempool-block/mempool-block.component.html @@ -39,11 +39,11 @@
    - +
    - +
    diff --git a/frontend/src/app/components/mempool-block/mempool-block.component.ts b/frontend/src/app/components/mempool-block/mempool-block.component.ts index cb3a38172..6e0b21196 100644 --- a/frontend/src/app/components/mempool-block/mempool-block.component.ts +++ b/frontend/src/app/components/mempool-block/mempool-block.component.ts @@ -54,6 +54,7 @@ export class MempoolBlockComponent implements OnInit, OnDestroy { const ordinal = this.getOrdinal(mempoolBlocks[this.mempoolBlockIndex]); this.ordinal$.next(ordinal); this.seoService.setTitle(ordinal); + mempoolBlocks[this.mempoolBlockIndex].isStack = mempoolBlocks[this.mempoolBlockIndex].blockVSize > this.stateService.blockVSize; return mempoolBlocks[this.mempoolBlockIndex]; }) ); From 86f51e39020401b48a0c8c3195f0153a73ddecef Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 12 Jun 2023 11:54:58 -0400 Subject: [PATCH 452/782] fix fee graph for underfilled blocks --- .../fee-distribution-graph.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts index d20a9612f..d41aa444d 100644 --- a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts +++ b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts @@ -68,7 +68,7 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { samples.push([(1 - (sampleIndex / this.numSamples)) * 100, 0]); nextSample += sampleInterval; sampleIndex++; - break; + continue; } while (txs[txIndex] && nextSample < cumVSize + txs[txIndex].vsize) { @@ -128,7 +128,7 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { position: 'top', color: '#ffffff', textShadowBlur: 0, - formatter: (label: any): string => '' + Math.floor(label.data[1]), + formatter: (label: any): string => '' + (label.data[1] > 99.5 ? Math.round(label.data[1]) : label.data[1].toFixed(1)), }, showAllSymbol: false, smooth: true, From eca40f94c9f62dbedf618c306f424f954dae4fa7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 30 Jun 2023 19:41:12 -0400 Subject: [PATCH 453/782] use power-of-ten formatting for large fee rates --- .../fee-distribution-graph.component.ts | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts index d41aa444d..823d271a1 100644 --- a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts +++ b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts @@ -3,6 +3,7 @@ import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core import { TransactionStripped } from '../../interfaces/websocket.interface'; import { StateService } from '../../services/state.service'; import { VbytesPipe } from '../../shared/pipes/bytes-pipe/vbytes.pipe'; +import { selectPowerOfTen } from '../../bitcoin.utils'; @Component({ selector: 'app-fee-distribution-graph', @@ -34,17 +35,17 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { private vbytesPipe: VbytesPipe, ) { } - ngOnInit() { + ngOnInit(): void { this.mountChart(); } - ngOnChanges() { + ngOnChanges(): void { this.simple = !!this.feeRange?.length; this.prepareChart(); this.mountChart(); } - prepareChart() { + prepareChart(): void { if (this.simple) { this.data = this.feeRange.map((rate, index) => [index * 10, rate]); this.labelInterval = 1; @@ -82,7 +83,7 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { this.data = samples.reverse(); } - mountChart() { + mountChart(): void { this.mempoolVsizeFeesOptions = { grid: { height: '210', @@ -118,6 +119,13 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { color: '#ffffff66', opacity: 0.25, } + }, + axisLabel: { + formatter: (value: number): string => { + const selectedPowerOfTen = selectPowerOfTen(value); + const newVal = Math.round(value / selectedPowerOfTen.divider); + return `${newVal}${selectedPowerOfTen.unit}`; + }, } }, series: [{ @@ -128,7 +136,12 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { position: 'top', color: '#ffffff', textShadowBlur: 0, - formatter: (label: any): string => '' + (label.data[1] > 99.5 ? Math.round(label.data[1]) : label.data[1].toFixed(1)), + formatter: (label: { data: number[] }): string => { + const value = label.data[1]; + const selectedPowerOfTen = selectPowerOfTen(value); + const newVal = Math.round(value / selectedPowerOfTen.divider); + return `${newVal}${selectedPowerOfTen.unit}`; + }, }, showAllSymbol: false, smooth: true, From ca6ddd609d13fdccf31b1ba36593a25412baf0dc Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 12 Jun 2023 15:31:47 -0400 Subject: [PATCH 454/782] clean up backend websocket logic --- backend/src/api/blocks.ts | 10 +- backend/src/api/websocket-handler.ts | 164 ++++++++++++++++++--------- backend/src/index.ts | 2 +- 3 files changed, 117 insertions(+), 59 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index fae1d453b..bc6c9638e 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -730,6 +730,11 @@ class Blocks { this.currentDifficulty = block.difficulty; } + // wait for pending async callbacks to finish + this.updateTimerProgress(timer, `waiting for async callbacks to complete for ${this.currentBlockHeight}`); + await Promise.all(callbackPromises); + this.updateTimerProgress(timer, `async callbacks completed for ${this.currentBlockHeight}`); + this.blocks.push(blockExtended); if (this.blocks.length > config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4) { this.blocks = this.blocks.slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4); @@ -746,11 +751,6 @@ class Blocks { diskCache.$saveCacheToDisk(); } - // wait for pending async callbacks to finish - this.updateTimerProgress(timer, `waiting for async callbacks to complete for ${this.currentBlockHeight}`); - await Promise.all(callbackPromises); - this.updateTimerProgress(timer, `async callbacks completed for ${this.currentBlockHeight}`); - handledBlocks++; } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 8aaab5ab5..dd7cdc8f2 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -22,6 +22,14 @@ import { deepClone } from '../utils/clone'; import priceUpdater from '../tasks/price-updater'; import { ApiPrice } from '../repositories/PricesRepository'; +// valid 'want' subscriptions +const wantable = [ + 'blocks', + 'mempool-blocks', + 'live-2h-chart', + 'stats', +]; + class WebsocketHandler { private wss: WebSocket.Server | undefined; private extraInitProperties = {}; @@ -30,7 +38,7 @@ class WebsocketHandler { private numConnected = 0; private numDisconnected = 0; - private initData: { [key: string]: string } = {}; + private socketData: { [key: string]: string } = {}; private serializedInitData: string = '{}'; constructor() { } @@ -39,28 +47,28 @@ class WebsocketHandler { this.wss = wss; } - setExtraInitProperties(property: string, value: any) { + setExtraInitData(property: string, value: any) { this.extraInitProperties[property] = value; - this.setInitDataFields(this.extraInitProperties); + this.updateSocketDataFields(this.extraInitProperties); } - private setInitDataFields(data: { [property: string]: any }): void { + private updateSocketDataFields(data: { [property: string]: any }): void { for (const property of Object.keys(data)) { if (data[property] != null) { - this.initData[property] = JSON.stringify(data[property]); + this.socketData[property] = JSON.stringify(data[property]); } else { - delete this.initData[property]; + delete this.socketData[property]; } } this.serializedInitData = '{' - + Object.keys(this.initData).map(key => `"${key}": ${this.initData[key]}`).join(', ') - + '}'; + + Object.keys(this.socketData).map(key => `"${key}": ${this.socketData[key]}`).join(', ') + + '}'; } - private updateInitData(): void { + private updateSocketData(): void { const _blocks = blocks.getBlocks().slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT); const da = difficultyAdjustment.getDifficultyAdjustment(); - this.setInitDataFields({ + this.updateSocketDataFields({ 'mempoolInfo': memPool.getMempoolInfo(), 'vBytesPerSecond': memPool.getVBytesPerSecond(), 'blocks': _blocks, @@ -94,11 +102,33 @@ class WebsocketHandler { const parsedMessage: WebsocketResponse = JSON.parse(message); const response = {}; - if (parsedMessage.action === 'want') { - client['want-blocks'] = parsedMessage.data.indexOf('blocks') > -1; - client['want-mempool-blocks'] = parsedMessage.data.indexOf('mempool-blocks') > -1; - client['want-live-2h-chart'] = parsedMessage.data.indexOf('live-2h-chart') > -1; - client['want-stats'] = parsedMessage.data.indexOf('stats') > -1; + const wantNow = {}; + if (parsedMessage && parsedMessage.action === 'want' && Array.isArray(parsedMessage.data)) { + for (const sub of wantable) { + const key = `want-${sub}`; + const wants = parsedMessage.data.includes(sub); + if (wants && client['wants'] && !client[key]) { + wantNow[key] = true; + } + client[key] = wants; + } + client['wants'] = true; + } + + // send initial data when a client first starts a subscription + if (wantNow['want-blocks']) { + response['blocks'] = this.socketData['blocks']; + } + + if (wantNow['want-mempool-blocks']) { + response['mempool-blocks'] = this.socketData['mempool-blocks']; + } + + if (wantNow['want-stats']) { + response['mempoolInfo'] = this.socketData['mempoolInfo']; + response['vBytesPerSecond'] = this.socketData['vBytesPerSecond']; + response['fees'] = this.socketData['fees']; + response['da'] = this.socketData['da']; } if (parsedMessage && parsedMessage['track-tx']) { @@ -109,21 +139,21 @@ class WebsocketHandler { if (parsedMessage['watch-mempool']) { const rbfCacheTxid = rbfCache.getReplacedBy(trackTxid); if (rbfCacheTxid) { - response['txReplaced'] = { + response['txReplaced'] = JSON.stringify({ txid: rbfCacheTxid, - }; + }); client['track-tx'] = null; } else { // It might have appeared before we had the time to start watching for it const tx = memPool.getMempool()[trackTxid]; if (tx) { if (config.MEMPOOL.BACKEND === 'esplora') { - response['tx'] = tx; + response['tx'] = JSON.stringify(tx); } else { // tx.prevout is missing from transactions when in bitcoind mode try { const fullTx = await transactionUtils.$getMempoolTransactionExtended(tx.txid, true); - response['tx'] = fullTx; + response['tx'] = JSON.stringify(fullTx); } catch (e) { logger.debug('Error finding transaction: ' + (e instanceof Error ? e.message : e)); } @@ -131,7 +161,7 @@ class WebsocketHandler { } else { try { const fullTx = await transactionUtils.$getMempoolTransactionExtended(client['track-tx'], true); - response['tx'] = fullTx; + response['tx'] = JSON.stringify(fullTx); } catch (e) { logger.debug('Error finding transaction. ' + (e instanceof Error ? e.message : e)); client['track-mempool-tx'] = parsedMessage['track-tx']; @@ -141,10 +171,10 @@ class WebsocketHandler { } const tx = memPool.getMempool()[trackTxid]; if (tx && tx.position) { - response['txPosition'] = { + response['txPosition'] = JSON.stringify({ txid: trackTxid, position: tx.position, - }; + }); } } else { client['track-tx'] = null; @@ -177,10 +207,10 @@ class WebsocketHandler { const index = parsedMessage['track-mempool-block']; client['track-mempool-block'] = index; const mBlocksWithTransactions = mempoolBlocks.getMempoolBlocksWithTransactions(); - response['projected-block-transactions'] = { + response['projected-block-transactions'] = JSON.stringify({ index: index, blockTransactions: mBlocksWithTransactions[index]?.transactions || [], - }; + }); } else { client['track-mempool-block'] = null; } @@ -189,23 +219,24 @@ class WebsocketHandler { if (parsedMessage && parsedMessage['track-rbf'] !== undefined) { if (['all', 'fullRbf'].includes(parsedMessage['track-rbf'])) { client['track-rbf'] = parsedMessage['track-rbf']; + response['rbfLatest'] = JSON.stringify(rbfCache.getRbfTrees(parsedMessage['track-rbf'] === 'fullRbf')); } else { client['track-rbf'] = false; } } if (parsedMessage.action === 'init') { - if (!this.initData['blocks']?.length || !this.initData['da']) { - this.updateInitData(); + if (!this.socketData['blocks']?.length || !this.socketData['da']) { + this.updateSocketData(); } - if (!this.initData['blocks']?.length) { + if (!this.socketData['blocks']?.length) { return; } client.send(this.serializedInitData); } if (parsedMessage.action === 'ping') { - response['pong'] = true; + response['pong'] = JSON.stringify(true); } if (parsedMessage['track-donation'] && parsedMessage['track-donation'].length === 22) { @@ -221,7 +252,8 @@ class WebsocketHandler { } if (Object.keys(response).length) { - client.send(JSON.stringify(response)); + const serializedResponse = this.serializeResponse(response); + client.send(serializedResponse); } } catch (e) { logger.debug('Error parsing websocket message: ' + (e instanceof Error ? e.message : e)); @@ -250,7 +282,7 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } - this.setInitDataFields({ 'loadingIndicators': indicators }); + this.updateSocketDataFields({ 'loadingIndicators': indicators }); const response = JSON.stringify({ loadingIndicators: indicators }); this.wss.clients.forEach((client) => { @@ -266,7 +298,7 @@ class WebsocketHandler { throw new Error('WebSocket.Server is not set'); } - this.setInitDataFields({ 'conversions': conversionRates }); + this.updateSocketDataFields({ 'conversions': conversionRates }); const response = JSON.stringify({ conversions: conversionRates }); this.wss.clients.forEach((client) => { @@ -336,11 +368,21 @@ class WebsocketHandler { memPool.addToSpendMap(newTransactions); const recommendedFees = feeApi.getRecommendedFee(); + const latestTransactions = newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx)); + // update init data - this.updateInitData(); + this.updateSocketDataFields({ + 'mempoolInfo': mempoolInfo, + 'vBytesPerSecond': vBytesPerSecond, + 'mempool-blocks': mBlocks, + 'transactions': latestTransactions, + 'loadingIndicators': loadingIndicators.getLoadingIndicators(), + 'da': da?.previousTime ? da : undefined, + 'fees': recommendedFees, + }); // cache serialized objects to avoid stringify-ing the same thing for every client - const responseCache = { ...this.initData }; + const responseCache = { ...this.socketData }; function getCachedResponse(key: string, data): string { if (!responseCache[key]) { responseCache[key] = JSON.stringify(data); @@ -371,8 +413,6 @@ class WebsocketHandler { } } - const latestTransactions = newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx)); - this.wss.clients.forEach(async (client) => { if (client.readyState !== WebSocket.OPEN) { return; @@ -490,7 +530,7 @@ class WebsocketHandler { if (rbfReplacedBy) { response['rbfTransaction'] = JSON.stringify({ txid: rbfReplacedBy, - }) + }); } const rbfChange = rbfChanges.map[client['track-tx']]; @@ -524,9 +564,7 @@ class WebsocketHandler { } if (Object.keys(response).length) { - const serializedResponse = '{' - + Object.keys(response).map(key => `"${key}": ${response[key]}`).join(', ') - + '}'; + const serializedResponse = this.serializeResponse(response); client.send(serializedResponse); } }); @@ -633,11 +671,19 @@ class WebsocketHandler { const da = difficultyAdjustment.getDifficultyAdjustment(); const fees = feeApi.getRecommendedFee(); + const mempoolInfo = memPool.getMempoolInfo(); // update init data - this.updateInitData(); + this.updateSocketDataFields({ + 'mempoolInfo': mempoolInfo, + 'blocks': [...blocks.getBlocks(), block].slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT), + 'mempool-blocks': mBlocks, + 'loadingIndicators': loadingIndicators.getLoadingIndicators(), + 'da': da?.previousTime ? da : undefined, + 'fees': fees, + }); - const responseCache = { ...this.initData }; + const responseCache = { ...this.socketData }; function getCachedResponse(key, data): string { if (!responseCache[key]) { responseCache[key] = JSON.stringify(data); @@ -645,22 +691,26 @@ class WebsocketHandler { return responseCache[key]; } - const mempoolInfo = memPool.getMempoolInfo(); - this.wss.clients.forEach((client) => { if (client.readyState !== WebSocket.OPEN) { return; } - if (!client['want-blocks']) { - return; + const response = {}; + + if (client['want-blocks']) { + response['block'] = getCachedResponse('block', block); } - const response = {}; - response['block'] = getCachedResponse('block', block); - response['mempoolInfo'] = getCachedResponse('mempoolInfo', mempoolInfo); - response['da'] = getCachedResponse('da', da?.previousTime ? da : undefined); - response['fees'] = getCachedResponse('fees', fees); + if (client['want-stats']) { + response['mempoolInfo'] = getCachedResponse('mempoolInfo', mempoolInfo); + response['vBytesPerSecond'] = getCachedResponse('vBytesPerSecond', memPool.getVBytesPerSecond()); + response['fees'] = getCachedResponse('fees', fees); + + if (da?.previousTime) { + response['da'] = getCachedResponse('da', da); + } + } if (mBlocks && client['want-mempool-blocks']) { response['mempool-blocks'] = getCachedResponse('mempool-blocks', mBlocks); @@ -755,11 +805,19 @@ class WebsocketHandler { } } - const serializedResponse = '{' + if (Object.keys(response).length) { + const serializedResponse = this.serializeResponse(response); + client.send(serializedResponse); + } + }); + } + + // takes a dictionary of JSON serialized values + // and zips it together into a valid JSON object + private serializeResponse(response): string { + return '{' + Object.keys(response).map(key => `"${key}": ${response[key]}`).join(', ') + '}'; - client.send(serializedResponse); - }); } private printLogs(): void { diff --git a/backend/src/index.ts b/backend/src/index.ts index 9f543d644..81863a208 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -150,7 +150,7 @@ class Server { if (config.BISQ.ENABLED) { bisq.startBisqService(); - bisq.setPriceCallbackFunction((price) => websocketHandler.setExtraInitProperties('bsq-price', price)); + bisq.setPriceCallbackFunction((price) => websocketHandler.setExtraInitData('bsq-price', price)); blocks.setNewBlockCallback(bisq.handleNewBitcoinBlock.bind(bisq)); bisqMarkets.startBisqService(); } From eaad63a082cab89ada5e9eabcabad6fb0cf6f281 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 12 Jun 2023 16:32:04 -0400 Subject: [PATCH 455/782] frontend resync recent blocks when necessary --- backend/src/api/websocket-handler.ts | 2 +- frontend/src/app/interfaces/websocket.interface.ts | 1 + frontend/src/app/services/websocket.service.ts | 10 +++++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index dd7cdc8f2..1e2e381c2 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -116,7 +116,7 @@ class WebsocketHandler { } // send initial data when a client first starts a subscription - if (wantNow['want-blocks']) { + if (wantNow['want-blocks'] || (parsedMessage && parsedMessage['refresh-blocks'])) { response['blocks'] = this.socketData['blocks']; } diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 83a0c636e..41643fb73 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -31,6 +31,7 @@ export interface WebsocketResponse { 'track-rbf'?: string; 'watch-mempool'?: boolean; 'track-bisq-market'?: string; + 'refresh-blocks'?: boolean; } export interface ReplacedTransaction extends Transaction { diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index af7a465f8..d22717b2a 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -235,6 +235,8 @@ export class WebsocketService { } handleResponse(response: WebsocketResponse) { + let reinitBlocks = false; + if (response.blocks && response.blocks.length) { const blocks = response.blocks; let maxHeight = 0; @@ -256,9 +258,11 @@ export class WebsocketService { } if (response.block) { - if (response.block.height > this.stateService.latestBlockHeight) { + if (response.block.height === this.stateService.latestBlockHeight + 1) { this.stateService.updateChainTip(response.block.height); this.stateService.blocks$.next([response.block, response.txConfirmed || '']); + } else if (response.block.height > this.stateService.latestBlockHeight + 1) { + reinitBlocks = true; } if (response.txConfirmed) { @@ -369,5 +373,9 @@ export class WebsocketService { if (response['git-commit']) { this.stateService.backendInfo$.next(response['git-commit']); } + + if (reinitBlocks) { + this.websocketSubject.next({'refresh-blocks': true}); + } } } From d848ab4befd830a1575df6e2a7b3f243f1c2461d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 14 Jun 2023 14:33:13 -0400 Subject: [PATCH 456/782] scroll to see all mempool blocks --- .../blockchain/blockchain.component.html | 4 +- .../blockchain/blockchain.component.scss | 41 ++--------- .../blockchain/blockchain.component.ts | 70 ++++++++++++++++--- .../mempool-blocks.component.ts | 21 ++++-- .../app/components/start/start.component.html | 2 +- .../app/components/start/start.component.ts | 23 ++++-- 6 files changed, 105 insertions(+), 56 deletions(-) diff --git a/frontend/src/app/components/blockchain/blockchain.component.html b/frontend/src/app/components/blockchain/blockchain.component.html index 0c4a1cbb7..2c3f1ad8c 100644 --- a/frontend/src/app/components/blockchain/blockchain.component.html +++ b/frontend/src/app/components/blockchain/blockchain.component.html @@ -1,9 +1,9 @@
    -
    +
    - + diff --git a/frontend/src/app/components/blockchain/blockchain.component.scss b/frontend/src/app/components/blockchain/blockchain.component.scss index 63ca22626..135a8b842 100644 --- a/frontend/src/app/components/blockchain/blockchain.component.scss +++ b/frontend/src/app/components/blockchain/blockchain.component.scss @@ -26,43 +26,14 @@ position: absolute; left: 0; top: 75px; - transform: translateX(50vw); + --divider-offset: 50vw; + --mempool-offset: 0px; + transform: translateX(calc(var(--divider-offset) + var(--mempool-offset))); } -.position-container.liquid, .position-container.liquidtestnet { - transform: translateX(420px); -} - -@media (min-width: 768px) { - .blockchain-wrapper.time-ltr { - .position-container.liquid, .position-container.liquidtestnet { - transform: translateX(calc(100vw - 420px)); - } - } -} - -@media (max-width: 767.98px) { - .blockchain-wrapper { - .position-container { - transform: translateX(95vw); - } - .position-container.liquid, .position-container.liquidtestnet { - transform: translateX(50vw); - } - .position-container.loading { - transform: translateX(50vw); - } - } - .blockchain-wrapper.time-ltr { - .position-container { - transform: translateX(5vw); - } - .position-container.liquid, .position-container.liquidtestnet { - transform: translateX(50vw); - } - .position-container.loading { - transform: translateX(50vw); - } +.blockchain-wrapper.time-ltr { + .position-container { + transform: translateX(calc(100vw - var(--divider-offset) - var(--mempool-offset))); } } diff --git a/frontend/src/app/components/blockchain/blockchain.component.ts b/frontend/src/app/components/blockchain/blockchain.component.ts index ab9875a4c..5eb2ed481 100644 --- a/frontend/src/app/components/blockchain/blockchain.component.ts +++ b/frontend/src/app/components/blockchain/blockchain.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, Output, EventEmitter, HostListener, ChangeDetectorRef } from '@angular/core'; import { firstValueFrom, Subscription } from 'rxjs'; import { StateService } from '../../services/state.service'; @@ -13,43 +13,95 @@ export class BlockchainComponent implements OnInit, OnDestroy { @Input() pageIndex: number; @Input() blocksPerPage: number = 8; @Input() minScrollWidth: number = 0; + @Input() scrollableMempool: boolean = false; + + @Output() mempoolOffsetChange: EventEmitter = new EventEmitter(); network: string; timeLtrSubscription: Subscription; timeLtr: boolean = this.stateService.timeLtr.value; ltrTransitionEnabled = false; + flipping = false; connectionStateSubscription: Subscription; loadingTip: boolean = true; connected: boolean = true; + dividerOffset: number = 0; + mempoolOffset: number = 0; + constructor( public stateService: StateService, + private cd: ChangeDetectorRef, ) {} - ngOnInit() { + ngOnInit(): void { + this.onResize(); this.network = this.stateService.network; this.timeLtrSubscription = this.stateService.timeLtr.subscribe((ltr) => { this.timeLtr = !!ltr; }); this.connectionStateSubscription = this.stateService.connectionState$.subscribe(state => { this.connected = (state === 2); - }) - firstValueFrom(this.stateService.chainTip$).then(tip => { + }); + firstValueFrom(this.stateService.chainTip$).then(() => { this.loadingTip = false; }); } - ngOnDestroy() { + ngOnDestroy(): void { this.timeLtrSubscription.unsubscribe(); this.connectionStateSubscription.unsubscribe(); } - trackByPageFn(index: number, item: { index: number }) { + trackByPageFn(index: number, item: { index: number }): number { return item.index; } - toggleTimeDirection() { - this.ltrTransitionEnabled = true; - this.stateService.timeLtr.next(!this.timeLtr); + toggleTimeDirection(): void { + this.ltrTransitionEnabled = false; + const prevOffset = this.mempoolOffset; + this.mempoolOffset = 0; + this.mempoolOffsetChange.emit(0); + setTimeout(() => { + this.ltrTransitionEnabled = true; + this.flipping = true; + this.stateService.timeLtr.next(!this.timeLtr); + setTimeout(() => { + this.ltrTransitionEnabled = false; + this.flipping = false; + this.mempoolOffset = prevOffset; + this.mempoolOffsetChange.emit(this.mempoolOffset); + }, 1000); + }, 0); + this.cd.markForCheck(); + } + + onMempoolWidthChange(width): void { + if (this.flipping) { + return; + } + this.mempoolOffset = Math.max(0, width - this.dividerOffset); + this.cd.markForCheck(); + setTimeout(() => { + this.mempoolOffsetChange.emit(this.mempoolOffset); + }, 0); + } + + @HostListener('window:resize', ['$event']) + onResize(): void { + if (window.innerWidth >= 768) { + if (this.stateService.isLiquid()) { + this.dividerOffset = 420; + } else { + this.dividerOffset = window.innerWidth * 0.5; + } + } else { + if (this.stateService.isLiquid()) { + this.dividerOffset = window.innerWidth * 0.5; + } else { + this.dividerOffset = window.innerWidth * 0.95; + } + } + this.cd.markForCheck(); } } diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 561f01585..3e7ba310a 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, HostListener, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, HostListener, Input, OnChanges, SimpleChanges, Output, EventEmitter } from '@angular/core'; import { Subscription, Observable, fromEvent, merge, of, combineLatest } from 'rxjs'; import { MempoolBlock } from '../../interfaces/websocket.interface'; import { StateService } from '../../services/state.service'; import { Router } from '@angular/router'; -import { take, map, switchMap } from 'rxjs/operators'; +import { take, map, switchMap, tap } from 'rxjs/operators'; import { feeLevels, mempoolFeeColors } from '../../app.constants'; import { specialBlocks } from '../../app.constants'; import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; @@ -29,6 +29,9 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { @Input() count: number = null; @Input() spotlight: number = 0; @Input() getHref?: (index) => string = (index) => `/mempool-block/${index}`; + @Input() allBlocks: boolean = false; + + @Output() widthChange: EventEmitter = new EventEmitter(); specialBlocks = specialBlocks; mempoolBlocks: MempoolBlock[] = []; @@ -145,7 +148,12 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { this.updateMempoolBlockStyles(); this.calculateTransactionPosition(); + return this.mempoolBlocks; + }), + tap(() => { + this.cd.markForCheck(); + this.widthChange.emit(this.containerOffset + this.mempoolBlocks.length * this.blockOffset); }) ); @@ -254,7 +262,10 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { reduceEmptyBlocksToFitScreen(blocks: MempoolBlock[]): MempoolBlock[] { const innerWidth = this.stateService.env.BASE_MODULE !== 'liquid' && window.innerWidth <= 767.98 ? window.innerWidth : window.innerWidth / 2; - const blocksAmount = Math.min(this.stateService.env.MEMPOOL_BLOCKS_AMOUNT, Math.floor(innerWidth / (this.blockWidth + this.blockPadding))); + let blocksAmount = this.stateService.env.MEMPOOL_BLOCKS_AMOUNT; + if (!this.allBlocks) { + blocksAmount = Math.min(this.stateService.env.MEMPOOL_BLOCKS_AMOUNT, Math.floor(innerWidth / (this.blockWidth + this.blockPadding))); + } while (blocks.length < blocksAmount) { blocks.push({ blockSize: 0, @@ -274,10 +285,10 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { reduceMempoolBlocksToFitScreen(blocks: MempoolBlock[]): MempoolBlock[] { const innerWidth = this.stateService.env.BASE_MODULE !== 'liquid' && window.innerWidth <= 767.98 ? window.innerWidth : window.innerWidth / 2; - let blocksAmount; + let blocksAmount = this.stateService.env.MEMPOOL_BLOCKS_AMOUNT; if (this.count) { blocksAmount = 8; - } else { + } else if (!this.allBlocks) { blocksAmount = Math.min(this.stateService.env.MEMPOOL_BLOCKS_AMOUNT, Math.floor(innerWidth / (this.blockWidth + this.blockPadding))); } while (blocks.length > blocksAmount) { diff --git a/frontend/src/app/components/start/start.component.html b/frontend/src/app/components/start/start.component.html index ec4bf4805..5cf7b4fd9 100644 --- a/frontend/src/app/components/start/start.component.html +++ b/frontend/src/app/components/start/start.component.html @@ -18,7 +18,7 @@ (dragstart)="onDragStart($event)" (scroll)="onScroll($event)" > - +
    diff --git a/frontend/src/app/components/start/start.component.ts b/frontend/src/app/components/start/start.component.ts index 3bd0c086e..1793818a9 100644 --- a/frontend/src/app/components/start/start.component.ts +++ b/frontend/src/app/components/start/start.component.ts @@ -44,6 +44,7 @@ export class StartComponent implements OnInit, OnDestroy { lastUpdate: number = 0; lastMouseX: number; velocity: number = 0; + mempoolOffset: number = 0; constructor( private stateService: StateService, @@ -117,6 +118,12 @@ export class StartComponent implements OnInit, OnDestroy { }); } + onMempoolOffsetChange(offset): void { + const delta = offset - this.mempoolOffset; + this.addConvertedScrollOffset(delta); + this.mempoolOffset = offset; + } + @HostListener('window:resize', ['$event']) onResize(): void { this.isMobile = window.innerWidth <= 767.98; @@ -350,7 +357,7 @@ export class StartComponent implements OnInit, OnDestroy { resetScroll(): void { this.scrollToBlock(this.chainTip); - this.blockchainContainer.nativeElement.scrollLeft = 0; + this.setScrollLeft(0); } getPageIndexOf(height: number): number { @@ -368,9 +375,17 @@ export class StartComponent implements OnInit, OnDestroy { getConvertedScrollOffset(): number { if (this.timeLtr) { - return -this.blockchainContainer?.nativeElement?.scrollLeft || 0; + return -(this.blockchainContainer?.nativeElement?.scrollLeft || 0) - this.mempoolOffset; } else { - return this.blockchainContainer?.nativeElement?.scrollLeft || 0; + return (this.blockchainContainer?.nativeElement?.scrollLeft || 0) - this.mempoolOffset; + } + } + + setScrollLeft(offset: number): void { + if (this.timeLtr) { + this.blockchainContainer.nativeElement.scrollLeft = offset - this.mempoolOffset; + } else { + this.blockchainContainer.nativeElement.scrollLeft = offset + this.mempoolOffset; } } @@ -388,7 +403,7 @@ export class StartComponent implements OnInit, OnDestroy { ngOnDestroy() { if (this.blockchainContainer?.nativeElement) { // clean up scroll position to prevent caching wrong scroll in Firefox - this.blockchainContainer.nativeElement.scrollLeft = 0; + this.setScrollLeft(0); } this.timeLtrSubscription.unsubscribe(); this.chainTipSubscription.unsubscribe(); From 9d606d0006e092a8fba2a813536d3af1b1198bc2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 16 Jun 2023 12:44:55 -0400 Subject: [PATCH 457/782] scroll selected mempool block into view --- .../app/components/start/start.component.ts | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/start/start.component.ts b/frontend/src/app/components/start/start.component.ts index 1793818a9..7a3b6b492 100644 --- a/frontend/src/app/components/start/start.component.ts +++ b/frontend/src/app/components/start/start.component.ts @@ -40,7 +40,7 @@ export class StartComponent implements OnInit, OnDestroy { minScrollWidth: number; pageIndex: number = 0; pages: any[] = []; - pendingMark: number | void = null; + pendingMark: number | null = null; lastUpdate: number = 0; lastMouseX: number; velocity: number = 0; @@ -71,19 +71,29 @@ export class StartComponent implements OnInit, OnDestroy { this.chainTip = height; this.tipIsSet = true; this.updatePages(); - if (this.pendingMark != null) { - this.scrollToBlock(this.pendingMark); - this.pendingMark = null; - } + this.applyPendingMarkArrow(); }); this.markBlockSubscription = this.stateService.markBlock$.subscribe((mark) => { + let blockHeight; if (mark?.blockHeight != null) { + blockHeight = mark.blockHeight; + } else if (mark?.mempoolBlockIndex != null) { + blockHeight = -1 - mark.mempoolBlockIndex; + } else if (mark?.mempoolPosition?.block != null) { + blockHeight = -1 - mark.mempoolPosition.block; + } + if (blockHeight != null) { if (this.tipIsSet) { - if (!this.blockInViewport(mark.blockHeight)) { - this.scrollToBlock(mark.blockHeight); + let scrollToHeight = blockHeight; + if (blockHeight < 0) { + scrollToHeight = this.chainTip - blockHeight; } - } else { - this.pendingMark = mark.blockHeight; + if (!this.blockInViewport(scrollToHeight)) { + this.scrollToBlock(scrollToHeight); + } + } + if (!this.tipIsSet || (blockHeight < 0 && !this.mempoolOffset)) { + this.pendingMark = blockHeight; } } }); @@ -122,6 +132,18 @@ export class StartComponent implements OnInit, OnDestroy { const delta = offset - this.mempoolOffset; this.addConvertedScrollOffset(delta); this.mempoolOffset = offset; + this.applyPendingMarkArrow(); + } + + applyPendingMarkArrow(): void { + if (this.pendingMark != null) { + if (this.pendingMark < 0) { + this.scrollToBlock(this.chainTip - this.pendingMark); + } else { + this.scrollToBlock(this.pendingMark); + } + this.pendingMark = null; + } } @HostListener('window:resize', ['$event']) From 58b805253029f71bd1ce98dd5d160231e48fceb4 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 19 Jun 2023 15:19:34 -0400 Subject: [PATCH 458/782] don't reset blockchain position on every mempool update --- .../src/app/components/start/start.component.ts | 16 ++++++++++++++-- .../transaction/transaction.component.ts | 2 ++ frontend/src/app/services/state.service.ts | 3 ++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/start/start.component.ts b/frontend/src/app/components/start/start.component.ts index 7a3b6b492..22d3d6350 100644 --- a/frontend/src/app/components/start/start.component.ts +++ b/frontend/src/app/components/start/start.component.ts @@ -1,6 +1,6 @@ import { Component, ElementRef, HostListener, OnInit, OnDestroy, ViewChild, Input } from '@angular/core'; import { Subscription } from 'rxjs'; -import { StateService } from '../../services/state.service'; +import { MarkBlockState, StateService } from '../../services/state.service'; import { specialBlocks } from '../../app.constants'; @Component({ @@ -24,6 +24,7 @@ export class StartComponent implements OnInit, OnDestroy { chainTipSubscription: Subscription; chainTip: number = -1; tipIsSet: boolean = false; + lastMark: MarkBlockState; markBlockSubscription: Subscription; blockCounterSubscription: Subscription; @ViewChild('blockchainContainer') blockchainContainer: ElementRef; @@ -75,20 +76,31 @@ export class StartComponent implements OnInit, OnDestroy { }); this.markBlockSubscription = this.stateService.markBlock$.subscribe((mark) => { let blockHeight; + let newMark = true; if (mark?.blockHeight != null) { + if (this.lastMark?.blockHeight === mark.blockHeight) { + newMark = false; + } blockHeight = mark.blockHeight; } else if (mark?.mempoolBlockIndex != null) { + if (this.lastMark?.mempoolBlockIndex === mark.mempoolBlockIndex || (mark.txid && this.lastMark?.txid === mark.txid)) { + newMark = false; + } blockHeight = -1 - mark.mempoolBlockIndex; } else if (mark?.mempoolPosition?.block != null) { + if (this.lastMark?.txid === mark.txid) { + newMark = false; + } blockHeight = -1 - mark.mempoolPosition.block; } + this.lastMark = mark; if (blockHeight != null) { if (this.tipIsSet) { let scrollToHeight = blockHeight; if (blockHeight < 0) { scrollToHeight = this.chainTip - blockHeight; } - if (!this.blockInViewport(scrollToHeight)) { + if (newMark && !this.blockInViewport(scrollToHeight)) { this.scrollToBlock(scrollToHeight); } } diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index dd32b05e8..85b90a378 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -240,6 +240,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.mempoolPosition = txPosition.position; if (this.tx && !this.tx.status.confirmed) { this.stateService.markBlock$.next({ + txid: txPosition.txid, mempoolPosition: this.mempoolPosition }); this.txInBlockIndex = this.mempoolPosition.block; @@ -359,6 +360,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } else { if (tx.cpfpChecked) { this.stateService.markBlock$.next({ + txid: tx.txid, txFeePerVSize: tx.effectiveFeePerVsize, mempoolPosition: this.mempoolPosition, }); diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 31f5f3aab..4f00622a8 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -8,8 +8,9 @@ import { isPlatformBrowser } from '@angular/common'; import { map, shareReplay } from 'rxjs/operators'; import { StorageService } from './storage.service'; -interface MarkBlockState { +export interface MarkBlockState { blockHeight?: number; + txid?: string; mempoolBlockIndex?: number; txFeePerVSize?: number; mempoolPosition?: MempoolPosition; From 22baf4186e04c221634aa1ba0d28b4dcb0995d3f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 19 Jun 2023 12:46:10 -0400 Subject: [PATCH 459/782] Add 'all time' option for mempool graph --- backend/src/api/statistics/statistics-api.ts | 15 +++++++++++++-- backend/src/api/statistics/statistics.routes.ts | 12 +++++++----- .../statistics/statistics.component.html | 3 +++ .../components/statistics/statistics.component.ts | 11 +++++++++-- frontend/src/app/services/api.service.ts | 4 ++++ 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/backend/src/api/statistics/statistics-api.ts b/backend/src/api/statistics/statistics-api.ts index 1e8b0b7bb..77bf66a2c 100644 --- a/backend/src/api/statistics/statistics-api.ts +++ b/backend/src/api/statistics/statistics-api.ts @@ -211,7 +211,7 @@ class StatisticsApi { CAST(avg(vsize_1800) as DOUBLE) as vsize_1800, CAST(avg(vsize_2000) as DOUBLE) as vsize_2000 \ FROM statistics \ - WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW() \ + ${interval === 'ALL TIME' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ GROUP BY UNIX_TIMESTAMP(added) DIV ${div} \ ORDER BY statistics.added DESC;`; } @@ -259,7 +259,7 @@ class StatisticsApi { vsize_1800, vsize_2000 \ FROM statistics \ - WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW() \ + ${interval === 'ALL TIME' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ GROUP BY UNIX_TIMESTAMP(added) DIV ${div} \ ORDER BY statistics.added DESC;`; } @@ -386,6 +386,17 @@ class StatisticsApi { } } + public async $listAll(): Promise { + try { + const query = this.getQueryForDays(43200, 'ALL TIME'); // 12h interval + const [rows] = await DB.query({ sql: query, timeout: this.queryTimeout }); + return this.mapStatisticToOptimizedStatistic(rows as Statistic[]); + } catch (e) { + logger.err('$listAll() error' + (e instanceof Error ? e.message : e)); + return []; + } + } + private mapStatisticToOptimizedStatistic(statistic: Statistic[]): OptimizedStatistic[] { return statistic.map((s) => { return { diff --git a/backend/src/api/statistics/statistics.routes.ts b/backend/src/api/statistics/statistics.routes.ts index 2a5871dd6..31db5198c 100644 --- a/backend/src/api/statistics/statistics.routes.ts +++ b/backend/src/api/statistics/statistics.routes.ts @@ -15,10 +15,11 @@ class StatisticsRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'statistics/2y', this.$getStatisticsByTime.bind(this, '2y')) .get(config.MEMPOOL.API_URL_PREFIX + 'statistics/3y', this.$getStatisticsByTime.bind(this, '3y')) .get(config.MEMPOOL.API_URL_PREFIX + 'statistics/4y', this.$getStatisticsByTime.bind(this, '4y')) + .get(config.MEMPOOL.API_URL_PREFIX + 'statistics/all', this.$getStatisticsByTime.bind(this, 'all')) ; } - private async $getStatisticsByTime(time: '2h' | '24h' | '1w' | '1m' | '3m' | '6m' | '1y' | '2y' | '3y' | '4y', req: Request, res: Response) { + private async $getStatisticsByTime(time: '2h' | '24h' | '1w' | '1m' | '3m' | '6m' | '1y' | '2y' | '3y' | '4y' | 'all', req: Request, res: Response) { res.header('Pragma', 'public'); res.header('Cache-control', 'public'); res.setHeader('Expires', new Date(Date.now() + 1000 * 300).toUTCString()); @@ -26,10 +27,6 @@ class StatisticsRoutes { try { let result; switch (time as string) { - case '2h': - result = await statisticsApi.$list2H(); - res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); - break; case '24h': result = await statisticsApi.$list24H(); res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString()); @@ -58,8 +55,13 @@ class StatisticsRoutes { case '4y': result = await statisticsApi.$list4Y(); break; + case 'all': + result = await statisticsApi.$listAll(); + break; default: result = await statisticsApi.$list2H(); + res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); + break; } res.json(result); } catch (e) { diff --git a/frontend/src/app/components/statistics/statistics.component.html b/frontend/src/app/components/statistics/statistics.component.html index 1b291e978..f36d74963 100644 --- a/frontend/src/app/components/statistics/statistics.component.html +++ b/frontend/src/app/components/statistics/statistics.component.html @@ -53,6 +53,9 @@ +
    diff --git a/frontend/src/app/components/statistics/statistics.component.ts b/frontend/src/app/components/statistics/statistics.component.ts index 35137bff1..eebee5bce 100644 --- a/frontend/src/app/components/statistics/statistics.component.ts +++ b/frontend/src/app/components/statistics/statistics.component.ts @@ -72,8 +72,10 @@ export class StatisticsComponent implements OnInit { this.route .fragment .subscribe((fragment) => { - if (['2h', '24h', '1w', '1m', '3m', '6m', '1y', '2y', '3y', '4y'].indexOf(fragment) > -1) { + if (['2h', '24h', '1w', '1m', '3m', '6m', '1y', '2y', '3y', '4y', 'all'].indexOf(fragment) > -1) { this.radioGroupForm.controls.dateSpan.setValue(fragment, { emitEvent: false }); + } else { + this.radioGroupForm.controls.dateSpan.setValue('2h', { emitEvent: false }); } }); @@ -114,7 +116,12 @@ export class StatisticsComponent implements OnInit { if (this.radioGroupForm.controls.dateSpan.value === '3y') { return this.apiService.list3YStatistics$(); } - return this.apiService.list4YStatistics$(); + if (this.radioGroupForm.controls.dateSpan.value === '4y') { + return this.apiService.list4YStatistics$(); + } + if (this.radioGroupForm.controls.dateSpan.value === 'all') { + return this.apiService.listAllTimeStatistics$(); + } }) ) .subscribe((mempoolStats: any) => { diff --git a/frontend/src/app/services/api.service.ts b/frontend/src/app/services/api.service.ts index 8521ddc83..029d2183c 100644 --- a/frontend/src/app/services/api.service.ts +++ b/frontend/src/app/services/api.service.ts @@ -72,6 +72,10 @@ export class ApiService { return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/4y'); } + listAllTimeStatistics$(): Observable { + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/statistics/all'); + } + getTransactionTimes$(txIds: string[]): Observable { let params = new HttpParams(); txIds.forEach((txId: string) => { From d4ed238ae176a362d5decf48715a748fad5fd08f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 21 Jun 2023 09:49:54 -0400 Subject: [PATCH 460/782] Add statistics/all to cache warmer, change query keyword --- backend/src/api/statistics/statistics-api.ts | 6 +++--- production/nginx-cache-warmer | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/src/api/statistics/statistics-api.ts b/backend/src/api/statistics/statistics-api.ts index 77bf66a2c..837d0ae44 100644 --- a/backend/src/api/statistics/statistics-api.ts +++ b/backend/src/api/statistics/statistics-api.ts @@ -211,7 +211,7 @@ class StatisticsApi { CAST(avg(vsize_1800) as DOUBLE) as vsize_1800, CAST(avg(vsize_2000) as DOUBLE) as vsize_2000 \ FROM statistics \ - ${interval === 'ALL TIME' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ + ${interval === 'ALL' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ GROUP BY UNIX_TIMESTAMP(added) DIV ${div} \ ORDER BY statistics.added DESC;`; } @@ -259,7 +259,7 @@ class StatisticsApi { vsize_1800, vsize_2000 \ FROM statistics \ - ${interval === 'ALL TIME' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ + ${interval === 'ALL' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ GROUP BY UNIX_TIMESTAMP(added) DIV ${div} \ ORDER BY statistics.added DESC;`; } @@ -388,7 +388,7 @@ class StatisticsApi { public async $listAll(): Promise { try { - const query = this.getQueryForDays(43200, 'ALL TIME'); // 12h interval + const query = this.getQueryForDays(43200, 'ALL'); // 12h interval const [rows] = await DB.query({ sql: query, timeout: this.queryTimeout }); return this.mapStatisticToOptimizedStatistic(rows as Statistic[]); } catch (e) { diff --git a/production/nginx-cache-warmer b/production/nginx-cache-warmer index 6b58e5b78..6a82871a5 100755 --- a/production/nginx-cache-warmer +++ b/production/nginx-cache-warmer @@ -21,6 +21,7 @@ do for url in / \ '/api/v1/statistics/2y' \ '/api/v1/statistics/3y' \ '/api/v1/statistics/4y' \ + '/api/v1/statistics/all' \ '/api/v1/mining/pools/24h' \ '/api/v1/mining/pools/3d' \ '/api/v1/mining/pools/1w' \ From ca1a1228a97f043a6e687816ca596144ef70ded9 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 21 Jun 2023 09:52:06 -0400 Subject: [PATCH 461/782] break graph toggles into two rows on small screens --- .../statistics/statistics.component.html | 76 ++++++++++--------- .../statistics/statistics.component.scss | 40 ++++++++++ 2 files changed, 80 insertions(+), 36 deletions(-) diff --git a/frontend/src/app/components/statistics/statistics.component.html b/frontend/src/app/components/statistics/statistics.component.html index f36d74963..29089e43d 100644 --- a/frontend/src/app/components/statistics/statistics.component.html +++ b/frontend/src/app/components/statistics/statistics.component.html @@ -20,42 +20,46 @@
    -
    - - - - - - - - - - - +
    +
    + + + + + +
    +
    + + + + + + +
    diff --git a/frontend/src/app/components/statistics/statistics.component.scss b/frontend/src/app/components/statistics/statistics.component.scss index f7230ce4b..f9e220daa 100644 --- a/frontend/src/app/components/statistics/statistics.component.scss +++ b/frontend/src/app/components/statistics/statistics.component.scss @@ -183,3 +183,43 @@ } } } + +.btn-toggle-rows { + display: flex; + flex-direction: row; + align-items: stretch; + justify-content: stretch; + + .btn-group { + flex-grow: 1; + flex-shrink: 1; + } + + @media (min-width: 500px) { + .btn-group:first-child > .btn:last-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .btn-group:last-child > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + + @media (max-width: 499px) { + flex-direction: column; + + .btn-group:first-child > .btn:first-child { + border-bottom-left-radius: 0; + } + .btn-group:first-child > .btn:last-child { + border-bottom-right-radius: 0; + } + .btn-group:last-child > .btn:first-child { + border-top-left-radius: 0; + } + .btn-group:last-child > .btn:last-child { + border-top-right-radius: 0; + } + } +} \ No newline at end of file From 85e33e689db9bab07c7f34d7d7f48258cb1f4e87 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 21 Jun 2023 18:06:14 +0200 Subject: [PATCH 462/782] break graph toggles into another line earlier --- .../src/app/components/statistics/statistics.component.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/statistics/statistics.component.scss b/frontend/src/app/components/statistics/statistics.component.scss index f9e220daa..d883e48c3 100644 --- a/frontend/src/app/components/statistics/statistics.component.scss +++ b/frontend/src/app/components/statistics/statistics.component.scss @@ -53,17 +53,17 @@ } } .formRadioGroup.mining { - @media (min-width: 991px) { + @media (min-width: 1035px) { position: relative; top: -100px; } - @media (min-width: 830px) and (max-width: 991px) { + @media (min-width: 830px) and (max-width: 1035px) { position: relative; top: 0px; } } .formRadioGroup.no-menu { - @media (min-width: 991px) { + @media (min-width: 1035px) { position: relative; top: -33px; } From d939391e62a34782768e0229d872a69278a1c09c Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 21 Jun 2023 18:14:32 +0200 Subject: [PATCH 463/782] ALL -> all (no caps needed, match the url parameters as well) --- backend/src/api/statistics/statistics-api.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/api/statistics/statistics-api.ts b/backend/src/api/statistics/statistics-api.ts index 837d0ae44..9df12d704 100644 --- a/backend/src/api/statistics/statistics-api.ts +++ b/backend/src/api/statistics/statistics-api.ts @@ -211,7 +211,7 @@ class StatisticsApi { CAST(avg(vsize_1800) as DOUBLE) as vsize_1800, CAST(avg(vsize_2000) as DOUBLE) as vsize_2000 \ FROM statistics \ - ${interval === 'ALL' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ + ${interval === 'all' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ GROUP BY UNIX_TIMESTAMP(added) DIV ${div} \ ORDER BY statistics.added DESC;`; } @@ -259,7 +259,7 @@ class StatisticsApi { vsize_1800, vsize_2000 \ FROM statistics \ - ${interval === 'ALL' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ + ${interval === 'all' ? '' : `WHERE added BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`} \ GROUP BY UNIX_TIMESTAMP(added) DIV ${div} \ ORDER BY statistics.added DESC;`; } @@ -388,7 +388,7 @@ class StatisticsApi { public async $listAll(): Promise { try { - const query = this.getQueryForDays(43200, 'ALL'); // 12h interval + const query = this.getQueryForDays(43200, 'all'); // 12h interval const [rows] = await DB.query({ sql: query, timeout: this.queryTimeout }); return this.mapStatisticToOptimizedStatistic(rows as Statistic[]); } catch (e) { From 1e83a99bae287dbfb26b664740108ded559d1de2 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 2 Jul 2023 18:10:02 +0200 Subject: [PATCH 464/782] Update backend/src/api/mempool.ts Co-authored-by: mononaut <83316221+mononaut@users.noreply.github.com> --- backend/src/api/mempool.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index e2dc09ada..1a6bce853 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -156,6 +156,7 @@ class Mempool { } }; + let intervalTimer = Date.now(); for (const txid of transactions) { if (!this.mempoolCache[txid]) { try { From 59713e21322dd97d548fcf6a26ecb709aa4e1085 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 2 Jul 2023 18:10:08 +0200 Subject: [PATCH 465/782] Update backend/src/api/mempool.ts Co-authored-by: mononaut <83316221+mononaut@users.noreply.github.com> --- backend/src/api/mempool.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 1a6bce853..4d47fa0c1 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -180,9 +180,7 @@ class Mempool { } } - if (new Date().getTime() - start > 5_000) { - const progress = (currentMempoolSize + newTransactions.length) / transactions.length * 100; - logger.debug(`Mempool is synchronizing. Processed ${newTransactions.length}/${diff} txs (${Math.round(progress)}%)`); + if (Date.now() - intervalTimer > 5_000) { if (this.inSync) { // Break and restart mempool loop if we spend too much time processing From a567a28c5cb8c82a1c42605f7580b7b2172d80d1 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 2 Jul 2023 18:10:14 +0200 Subject: [PATCH 466/782] Update backend/src/api/mempool.ts Co-authored-by: mononaut <83316221+mononaut@users.noreply.github.com> --- backend/src/api/mempool.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 4d47fa0c1..d237818b2 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -188,7 +188,10 @@ class Mempool { logger.debug('Breaking mempool loop because the 5s time limit exceeded.'); break; } else { + const progress = (currentMempoolSize + newTransactions.length) / transactions.length * 100; + logger.debug(`Mempool is synchronizing. Processed ${newTransactions.length}/${diff} txs (${Math.round(progress)}%)`); loadingIndicators.setProgress('mempool', progress); + intervalTimer = Date.now() } } } From 52bb8b4a4d2a8d03da22b997f6e49c0827c0cd8a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 23 Jun 2023 16:42:58 -0400 Subject: [PATCH 467/782] Rust GBT proof of concept --- backend/package.json | 5 +- backend/rust-gbt/.gitignore | 5 + backend/rust-gbt/Cargo.lock | 156 +++++++++++ backend/rust-gbt/Cargo.toml | 21 ++ backend/rust-gbt/README.md | 121 ++++++++ backend/rust-gbt/package-lock.json | 25 ++ backend/rust-gbt/package.json | 17 ++ backend/rust-gbt/src/audit_transaction.rs | 53 ++++ backend/rust-gbt/src/gbt.rs | 312 +++++++++++++++++++++ backend/rust-gbt/src/lib.rs | 75 +++++ backend/rust-gbt/src/thread_transaction.rs | 45 +++ backend/src/api/mempool-blocks.ts | 109 ++++++- backend/src/api/websocket-handler.ts | 6 +- backend/src/mempool.interfaces.ts | 2 +- 14 files changed, 943 insertions(+), 9 deletions(-) create mode 100644 backend/rust-gbt/.gitignore create mode 100644 backend/rust-gbt/Cargo.lock create mode 100644 backend/rust-gbt/Cargo.toml create mode 100644 backend/rust-gbt/README.md create mode 100644 backend/rust-gbt/package-lock.json create mode 100644 backend/rust-gbt/package.json create mode 100644 backend/rust-gbt/src/audit_transaction.rs create mode 100644 backend/rust-gbt/src/gbt.rs create mode 100644 backend/rust-gbt/src/lib.rs create mode 100644 backend/rust-gbt/src/thread_transaction.rs diff --git a/backend/package.json b/backend/package.json index 42b82717f..5337ff508 100644 --- a/backend/package.json +++ b/backend/package.json @@ -22,7 +22,7 @@ "main": "index.ts", "scripts": { "tsc": "./node_modules/typescript/bin/tsc -p tsconfig.build.json", - "build": "npm run tsc && npm run create-resources", + "build": "npm run build-rust && npm run tsc && npm run create-resources", "create-resources": "cp ./src/tasks/price-feeds/mtgox-weekly.json ./dist/tasks && node dist/api/fetch-version.js", "package": "npm run build && rm -rf package && mv dist package && mv node_modules package && npm run package-rm-build-deps", "package-rm-build-deps": "(cd package/node_modules; rm -r typescript @typescript-eslint)", @@ -33,7 +33,8 @@ "test": "./node_modules/.bin/jest --coverage", "lint": "./node_modules/.bin/eslint . --ext .ts", "lint:fix": "./node_modules/.bin/eslint . --ext .ts --fix", - "prettier": "./node_modules/.bin/prettier --write \"src/**/*.{js,ts}\"" + "prettier": "./node_modules/.bin/prettier --write \"src/**/*.{js,ts}\"", + "build-rust": "cd rust-gbt && npm install" }, "dependencies": { "@babel/core": "^7.21.3", diff --git a/backend/rust-gbt/.gitignore b/backend/rust-gbt/.gitignore new file mode 100644 index 000000000..6ca71fb5f --- /dev/null +++ b/backend/rust-gbt/.gitignore @@ -0,0 +1,5 @@ +target +index.node +**/node_modules +**/.DS_Store +npm-debug.log* diff --git a/backend/rust-gbt/Cargo.lock b/backend/rust-gbt/Cargo.lock new file mode 100644 index 000000000..0407bcc14 --- /dev/null +++ b/backend/rust-gbt/Cargo.lock @@ -0,0 +1,156 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "gbt" +version = "0.1.0" +dependencies = [ + "neon", +] + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "neon" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e15415261d880aed48122e917a45e87bb82cf0260bb6db48bbab44b7464373" +dependencies = [ + "neon-build", + "neon-macros", + "neon-runtime", + "semver", + "smallvec", +] + +[[package]] +name = "neon-build" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bac98a702e71804af3dacfde41edde4a16076a7bbe889ae61e56e18c5b1c811" + +[[package]] +name = "neon-macros" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7288eac8b54af7913c60e0eb0e2a7683020dffa342ab3fd15e28f035ba897cf" +dependencies = [ + "quote", + "syn", + "syn-mid", +] + +[[package]] +name = "neon-runtime" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4676720fa8bb32c64c3d9f49c47a47289239ec46b4bdb66d0913cc512cb0daca" +dependencies = [ + "cfg-if", + "libloading", + "smallvec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-mid" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa8e7560a164edb1621a55d18a0c59abf49d360f47aa7b821061dd7eea7fac9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml new file mode 100644 index 000000000..abd55fbd8 --- /dev/null +++ b/backend/rust-gbt/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "gbt" +version = "0.1.0" +description = "An inefficient re-implementation of the getBlockTemplate algorithm in Rust" +authors = ["mononaut"] +edition = "2018" +exclude = ["index.node"] + +[lib] +crate-type = ["cdylib"] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +priority-queue = "1.3.2" +bytes = "1.4.0" + +[dependencies.neon] +version = "0.10" +default-features = false +features = ["napi-6","channel-api"] diff --git a/backend/rust-gbt/README.md b/backend/rust-gbt/README.md new file mode 100644 index 000000000..f437527d8 --- /dev/null +++ b/backend/rust-gbt/README.md @@ -0,0 +1,121 @@ +# gbt + +**gbt:** rust implementation of the getBlockTemplate algorithm + +This project was bootstrapped by [create-neon](https://www.npmjs.com/package/create-neon). + +## Installing gbt + +Installing gbt requires a [supported version of Node and Rust](https://github.com/neon-bindings/neon#platform-support). + +You can install the project with npm. In the project directory, run: + +```sh +$ npm install +``` + +This fully installs the project, including installing any dependencies and running the build. + +## Building gbt + +If you have already installed the project and only want to run the build, run: + +```sh +$ npm run build +``` + +This command uses the [cargo-cp-artifact](https://github.com/neon-bindings/cargo-cp-artifact) utility to run the Rust build and copy the built library into `./index.node`. + +## Exploring gbt + +After building gbt, you can explore its exports at the Node REPL: + +```sh +$ npm install +$ node +> require('.').hello() +"hello node" +``` + +## Available Scripts + +In the project directory, you can run: + +### `npm install` + +Installs the project, including running `npm run build`. + +### `npm build` + +Builds the Node addon (`index.node`) from source. + +Additional [`cargo build`](https://doc.rust-lang.org/cargo/commands/cargo-build.html) arguments may be passed to `npm build` and `npm build-*` commands. For example, to enable a [cargo feature](https://doc.rust-lang.org/cargo/reference/features.html): + +``` +npm run build -- --feature=beetle +``` + +#### `npm build-debug` + +Alias for `npm build`. + +#### `npm build-release` + +Same as [`npm build`](#npm-build) but, builds the module with the [`release`](https://doc.rust-lang.org/cargo/reference/profiles.html#release) profile. Release builds will compile slower, but run faster. + +### `npm test` + +Runs the unit tests by calling `cargo test`. You can learn more about [adding tests to your Rust code](https://doc.rust-lang.org/book/ch11-01-writing-tests.html) from the [Rust book](https://doc.rust-lang.org/book/). + +## Project Layout + +The directory structure of this project is: + +``` +gbt/ +├── Cargo.toml +├── README.md +├── index.node +├── package.json +├── src/ +| └── lib.rs +└── target/ +``` + +### Cargo.toml + +The Cargo [manifest file](https://doc.rust-lang.org/cargo/reference/manifest.html), which informs the `cargo` command. + +### README.md + +This file. + +### index.node + +The Node addon—i.e., a binary Node module—generated by building the project. This is the main module for this package, as dictated by the `"main"` key in `package.json`. + +Under the hood, a [Node addon](https://nodejs.org/api/addons.html) is a [dynamically-linked shared object](https://en.wikipedia.org/wiki/Library_(computing)#Shared_libraries). The `"build"` script produces this file by copying it from within the `target/` directory, which is where the Rust build produces the shared object. + +### package.json + +The npm [manifest file](https://docs.npmjs.com/cli/v7/configuring-npm/package-json), which informs the `npm` command. + +### src/ + +The directory tree containing the Rust source code for the project. + +### src/lib.rs + +The Rust library's main module. + +### target/ + +Binary artifacts generated by the Rust build. + +## Learn More + +To learn more about Neon, see the [Neon documentation](https://neon-bindings.com). + +To learn more about Rust, see the [Rust documentation](https://www.rust-lang.org). + +To learn more about Node, see the [Node documentation](https://nodejs.org). diff --git a/backend/rust-gbt/package-lock.json b/backend/rust-gbt/package-lock.json new file mode 100644 index 000000000..6a6cc5fb7 --- /dev/null +++ b/backend/rust-gbt/package-lock.json @@ -0,0 +1,25 @@ +{ + "name": "gbt", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gbt", + "version": "0.1.0", + "hasInstallScript": true, + "devDependencies": { + "cargo-cp-artifact": "^0.1" + } + }, + "node_modules/cargo-cp-artifact": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.8.tgz", + "integrity": "sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA==", + "dev": true, + "bin": { + "cargo-cp-artifact": "bin/cargo-cp-artifact.js" + } + } + } +} diff --git a/backend/rust-gbt/package.json b/backend/rust-gbt/package.json new file mode 100644 index 000000000..bb45af85e --- /dev/null +++ b/backend/rust-gbt/package.json @@ -0,0 +1,17 @@ +{ + "name": "gbt", + "version": "0.1.0", + "description": "An inefficient re-implementation of the getBlockTemplate algorithm in Rust", + "main": "index.node", + "scripts": { + "build": "cargo-cp-artifact -nc index.node -- cargo build --message-format=json-render-diagnostics", + "build-debug": "npm run build --", + "build-release": "npm run build -- --release", + "install": "npm run build-release", + "test": "cargo test" + }, + "author": "mononaut", + "devDependencies": { + "cargo-cp-artifact": "^0.1" + } +} \ No newline at end of file diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs new file mode 100644 index 000000000..4b23b9a21 --- /dev/null +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -0,0 +1,53 @@ +use std::{collections::{HashSet}, hash::{Hash, Hasher}, cmp::Ordering}; + +#[derive(Clone)] +pub struct AuditTransaction { + pub uid: u32, + pub fee: u64, + pub weight: u32, + pub sigops: u32, + pub fee_per_vsize: f64, + pub effective_fee_per_vsize: f64, + pub dependency_rate: f64, + pub inputs: Vec, + pub is_relatives_set: bool, + pub ancestors: HashSet, + pub children: HashSet, + pub ancestor_fee: u64, + pub ancestor_weight: u32, + pub ancestor_sigops: u32, + pub score: f64, + pub used: bool, + pub modified: bool, + pub dirty: bool, +} + +impl Hash for AuditTransaction { + fn hash(&self, state: &mut H) { + self.uid.hash(state); + } +} + +impl PartialEq for AuditTransaction { + fn eq(&self, other: &Self) -> bool { + self.uid == other.uid + } +} + +impl Eq for AuditTransaction {} + +impl PartialOrd for AuditTransaction { + fn partial_cmp(&self, other: &AuditTransaction) -> Option { + if self.score == other.score { + return Some(self.uid.cmp(&other.uid)); + } else { + return self.score.partial_cmp(&other.score); + } + } +} + +impl Ord for AuditTransaction { + fn cmp(&self, other: &AuditTransaction) -> Ordering { + self.partial_cmp(other).unwrap() + } +} \ No newline at end of file diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs new file mode 100644 index 000000000..98c0d9178 --- /dev/null +++ b/backend/rust-gbt/src/gbt.rs @@ -0,0 +1,312 @@ +use std::cmp::Ordering; +use std::collections::{HashMap, HashSet, VecDeque}; +use std::f64::INFINITY; +use priority_queue::PriorityQueue; + +use crate::thread_transaction::{ThreadTransaction}; +use crate::audit_transaction::{AuditTransaction}; + +const BLOCK_WEIGHT_UNITS: u32 = 4_000_000; +const BLOCK_SIGOPS: u32 = 80_000; + +struct TxPriority { + uid: u32, + score: f64, +} +impl PartialEq for TxPriority { + fn eq(&self, other: &Self) -> bool { + self.uid == other.uid + } +} +impl Eq for TxPriority {} +impl PartialOrd for TxPriority { + fn partial_cmp(&self, other: &TxPriority) -> Option { + if self.score == other.score { + return Some(self.uid.cmp(&other.uid)); + } else { + return other.score.partial_cmp(&self.score); + } + } +} +impl Ord for TxPriority { + fn cmp(&self, other: &Self) -> Ordering { + self.partial_cmp(other).unwrap() + } +} + +pub fn gbt(mempool_array: Vec) -> (Vec>, Vec<(u32, f64)>, Vec>) { + let mut mempool: HashMap = HashMap::new(); + for transaction in mempool_array { + mempool.insert(transaction.uid, transaction); + } + + + return make_block_templates(mempool); +} + +/* +* Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core +* (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) +* Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts +*/ +fn make_block_templates(mempool: HashMap) -> (Vec>, Vec<(u32, f64)>, Vec>) { + let mut audit_pool: HashMap = HashMap::new(); + let mut mempool_array: VecDeque = VecDeque::new(); + let mut cluster_array: Vec> = Vec::new(); + + // Initialize working structs + for (uid, tx) in &mempool { + let audit_tx = AuditTransaction { + uid: tx.uid, + fee: tx.fee, + weight: tx.weight, + sigops: tx.sigops, + fee_per_vsize: tx.fee_per_vsize, + effective_fee_per_vsize: tx.effective_fee_per_vsize, + dependency_rate: INFINITY, + inputs: tx.inputs.clone(), + is_relatives_set: false, + ancestors: HashSet::new(), + children: HashSet::new(), + ancestor_fee: tx.fee, + ancestor_weight: tx.weight, + ancestor_sigops: tx.sigops, + score: 0.0, + used: false, + modified: false, + dirty: false, + }; + audit_pool.insert(audit_tx.uid, audit_tx); + mempool_array.push_back(*uid); + } + + // Build relatives graph & calculate ancestor scores + for txid in &mempool_array { + set_relatives(*txid, &mut audit_pool); + } + + // Sort by descending ancestor score + mempool_array.make_contiguous().sort_unstable_by(|a, b| { + let a_tx = audit_pool.get(a).unwrap(); + let b_tx = audit_pool.get(b).unwrap(); + b_tx.cmp(a_tx) + }); + + // Build blocks by greedily choosing the highest feerate package + // (i.e. the package rooted in the transaction with the best ancestor score) + let mut blocks: Vec> = Vec::new(); + let mut block_weight: u32 = 4000; + let mut block_sigops: u32 = 0; + let mut transactions: Vec = Vec::new(); + let mut modified: PriorityQueue = PriorityQueue::new(); + let mut overflow: Vec = Vec::new(); + let mut failures = 0; + while mempool_array.len() > 0 || !modified.is_empty() { + let next_txid: u32; + if modified.is_empty() { + next_txid = mempool_array.pop_front().unwrap(); + } else if mempool_array.len() == 0 { + next_txid = modified.pop().unwrap().0; + } else { + let next_array_txid = mempool_array.front().unwrap(); + let next_modified_txid = modified.peek().unwrap().0; + let array_tx: &AuditTransaction = audit_pool.get(next_array_txid).unwrap(); + let modified_tx: &AuditTransaction = audit_pool.get(next_modified_txid).unwrap(); + match array_tx.cmp(&modified_tx) { + std::cmp::Ordering::Equal | std::cmp::Ordering::Greater => { + next_txid = mempool_array.pop_front().unwrap(); + } + std::cmp::Ordering::Less => { + next_txid = modified.pop().unwrap().0; + } + } + } + let next_tx: AuditTransaction = audit_pool.get(&next_txid).unwrap().clone(); + + if next_tx.used { + continue; + } + + if blocks.len() < 7 && ((block_weight + next_tx.ancestor_weight >= BLOCK_WEIGHT_UNITS) || (block_sigops + next_tx.ancestor_sigops > BLOCK_SIGOPS)) { + // hold this package in an overflow list while we check for smaller options + overflow.push(next_txid); + failures += 1; + } else { + let mut package: Vec<(u32, usize, u32)> = Vec::new(); + let mut cluster: Vec = Vec::new(); + let is_cluster: bool = next_tx.ancestors.len() > 0; + package.push((next_tx.uid, next_tx.ancestors.len(), next_tx.weight)); + cluster.push(next_tx.uid); + for ancestor_id in &next_tx.ancestors { + if let Some(ancestor) = audit_pool.get(ancestor_id) { + package.push((*ancestor_id, ancestor.ancestors.len(), ancestor.weight)); + cluster.push(*ancestor_id); + } + } + package.sort_unstable_by_key(|a| 0 - a.1); + + if is_cluster { + cluster_array.push(cluster); + } + + let cluster_rate = next_tx.dependency_rate.min(next_tx.ancestor_fee as f64 / (next_tx.ancestor_weight as f64 / 4.0)); + + for package_entry in &package { + if let Some(tx) = audit_pool.get_mut(&package_entry.0) { + tx.used = true; + if tx.effective_fee_per_vsize != cluster_rate { + tx.effective_fee_per_vsize = cluster_rate; + tx.dirty = true; + } + transactions.push(tx.uid); + block_weight += tx.weight; + block_sigops += tx.sigops; + } + update_descendants(package_entry.0, &mut audit_pool, &mut modified, cluster_rate); + } + + failures = 0; + } + + // this block is full + let exceeded_package_tries = failures > 1000 && block_weight > (BLOCK_WEIGHT_UNITS - 4000); + let queue_is_empty = mempool_array.len() == 0 && modified.is_empty(); + if (exceeded_package_tries || queue_is_empty) && blocks.len() < 7 { + // finalize this block + if transactions.len() > 0 { + blocks.push(transactions); + } + // reset for the next block + transactions = Vec::new(); + block_weight = 4000; + // 'overflow' packages didn't fit in this block, but are valid candidates for the next + overflow.reverse(); + for overflowed in &overflow { + if let Some(overflowed_tx) = audit_pool.get(overflowed) { + if overflowed_tx.modified { + modified.push(*overflowed, TxPriority{ uid: *overflowed, score: overflowed_tx.score}); + } else { + mempool_array.push_front(*overflowed); + } + } + } + overflow = Vec::new(); + } + } + // add the final unbounded block if it contains any transactions + if transactions.len() > 0 { + blocks.push(transactions); + } + + // make a list of dirty transactions and their new rates + let mut rates: Vec<(u32, f64)> = Vec::new(); + for (txid, tx) in audit_pool { + if tx.dirty { + rates.push((txid, tx.effective_fee_per_vsize)); + } + } + + return (blocks, rates, cluster_array); +} + +fn set_relatives(txid: u32, audit_pool: &mut HashMap) { + let mut parents: HashSet = HashSet::new(); + if let Some(tx) = audit_pool.get(&txid) { + if tx.is_relatives_set { + return; + } + for input in &tx.inputs { + parents.insert(*input); + } + } else { + return; + } + + let mut ancestors: HashSet = HashSet::new(); + for parent_id in &parents { + set_relatives(*parent_id, audit_pool); + + let parent_entry: Option<&mut AuditTransaction> = audit_pool.get_mut(&parent_id); + match parent_entry { + Some(parent) => { + ancestors.insert(*parent_id); + parent.children.insert(txid); + for ancestor in &parent.ancestors { + ancestors.insert(*ancestor); + } + } + + None => {} + } + } + + let mut total_fee: u64 = 0; + let mut total_weight: u32 = 0; + let mut total_sigops: u32 = 0; + + for ancestor_id in &ancestors { + let ancestor = audit_pool.get(&ancestor_id).unwrap(); + total_fee += ancestor.fee; + total_weight += ancestor.weight; + total_sigops += ancestor.sigops; + } + + if let Some(tx) = audit_pool.get_mut(&txid) { + tx.ancestors = ancestors; + tx.ancestor_fee = tx.fee + total_fee; + tx.ancestor_weight = tx.weight + total_weight; + tx.ancestor_sigops = tx.sigops + total_sigops; + tx.score = (tx.ancestor_fee as f64) / (if tx.ancestor_weight != 0 {tx.ancestor_weight as f64 / 4.0} else { 1.0 }); + tx.is_relatives_set = true; + } +} + +// iterate over remaining descendants, removing the root as a valid ancestor & updating the ancestor score +fn update_descendants(root_txid: u32, audit_pool: &mut HashMap, modified: &mut PriorityQueue, cluster_rate: f64) { + let mut visited: HashSet = HashSet::new(); + let mut descendant_stack: Vec = Vec::new(); + let root_fee: u64; + let root_weight: u32; + let root_sigops: u32; + if let Some(root_tx) = audit_pool.get(&root_txid) { + for descendant_id in &root_tx.children { + if !visited.contains(descendant_id) { + descendant_stack.push(*descendant_id); + visited.insert(*descendant_id); + } + } + root_fee = root_tx.fee; + root_weight = root_tx.weight; + root_sigops = root_tx.sigops; + } else { + return; + } + while descendant_stack.len() > 0 { + let next_txid: u32 = descendant_stack.pop().unwrap(); + if let Some(descendant) = audit_pool.get_mut(&next_txid) { + // remove root tx as ancestor + descendant.ancestors.remove(&root_txid); + descendant.ancestor_fee -= root_fee; + descendant.ancestor_weight -= root_weight; + descendant.ancestor_sigops -= root_sigops; + let current_score = descendant.score; + descendant.score = (descendant.ancestor_fee as f64) / (if descendant.ancestor_weight != 0 {descendant.ancestor_weight as f64 / 4.0} else { 1.0 }); + descendant.dependency_rate = descendant.dependency_rate.min(cluster_rate); + descendant.modified = true; + // update modified priority if score has changed + if !descendant.modified || descendant.score < current_score { + modified.push_decrease(descendant.uid, TxPriority { uid: descendant.uid, score: descendant.score}); + } else if descendant.score > current_score { + modified.push_increase(descendant.uid, TxPriority { uid: descendant.uid, score: descendant.score}); + } + + // add this node's children to the stack + for child_id in &descendant.children { + if !visited.contains(child_id) { + descendant_stack.push(*child_id); + visited.insert(*child_id); + } + } + } + } +} \ No newline at end of file diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs new file mode 100644 index 000000000..ff7d6c208 --- /dev/null +++ b/backend/rust-gbt/src/lib.rs @@ -0,0 +1,75 @@ +use neon::{prelude::*, types::buffer::TypedArray}; + +mod gbt; +mod thread_transaction; +mod audit_transaction; +use thread_transaction::{ThreadTransaction}; + +fn go(mut cx: FunctionContext) -> JsResult { + let mempool_arg = cx.argument::(0)?.root(&mut cx).into_inner(&mut cx); + let callback = cx.argument::(1)?.root(&mut cx); + let channel = cx.channel(); + + let buffer = mempool_arg.as_slice(&mut cx); + let thread_transactions = ThreadTransaction::batch_from_buffer(buffer); + + std::thread::spawn(move || { + let (blocks, rates, clusters) = gbt::gbt(thread_transactions); + + channel.send(move |mut cx| { + let result = JsObject::new(&mut cx); + + let js_blocks = JsArray::new(&mut cx, blocks.len() as u32); + for (i, block) in blocks.iter().enumerate() { + let inner = JsArray::new(&mut cx, block.len() as u32); + for (j, uid) in block.iter().enumerate() { + let v = cx.number(*uid); + inner.set(&mut cx, j as u32, v)?; + } + js_blocks.set(&mut cx, i as u32, inner)?; + } + + let js_clusters = JsArray::new(&mut cx, clusters.len() as u32); + for (i, cluster) in clusters.iter().enumerate() { + let inner = JsArray::new(&mut cx, cluster.len() as u32); + for (j, uid) in cluster.iter().enumerate() { + let v = cx.number(*uid); + inner.set(&mut cx, j as u32, v)?; + } + js_clusters.set(&mut cx, i as u32, inner)?; + } + + let js_rates = JsArray::new(&mut cx, rates.len() as u32); + for (i, (uid, rate)) in rates.iter().enumerate() { + let inner = JsArray::new(&mut cx, 2); + let js_uid = cx.number(*uid); + let js_rate = cx.number(*rate); + inner.set(&mut cx, 0, js_uid)?; + inner.set(&mut cx, 1, js_rate)?; + js_rates.set(&mut cx, i as u32, inner)?; + } + + result.set(&mut cx, "blocks", js_blocks)?; + result.set(&mut cx, "clusters", js_clusters)?; + result.set(&mut cx, "rates", js_rates)?; + + let callback = callback.into_inner(&mut cx); + let this = cx.undefined(); + let args = vec![ + result.upcast() + ]; + + callback.call(&mut cx, this, args)?; + + Ok(()) + }); + }); + + Ok(cx.undefined()) +} + +#[neon::main] +fn main(mut cx: ModuleContext) -> NeonResult<()> { + cx.export_function("go", go)?; + Ok(()) +} diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs new file mode 100644 index 000000000..fa977c3e9 --- /dev/null +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -0,0 +1,45 @@ +// use neon::{types::{JsObject, JsNumber, JsArray, JsValue, JsBoolean, JsArrayBuffer, buffer::TypedArray}, prelude::{Object, FunctionContext, Handle}}; +extern crate bytes; +use std::io::Cursor; +use bytes::buf::Buf; +pub struct ThreadTransaction { + pub uid: u32, + pub fee: u64, + pub weight: u32, + pub sigops: u32, + pub fee_per_vsize: f64, + pub effective_fee_per_vsize: f64, + pub inputs: Vec, +} + +impl ThreadTransaction { + pub fn batch_from_buffer(buffer: &[u8]) -> Vec { + let mut transactions: Vec = Vec::new(); + let mut cursor = Cursor::new(buffer); + let size = cursor.get_u32(); + for _ in 0..size { + let uid = cursor.get_u32(); + let fee = cursor.get_f64() as u64; + let weight = cursor.get_u32(); + let sigops = cursor.get_u32(); + let fee_per_vsize = cursor.get_f64(); + let effective_fee_per_vsize = cursor.get_f64(); + let input_count = cursor.get_u32(); + let mut inputs: Vec = Vec::new(); + for _ in 0..input_count { + inputs.push(cursor.get_u32()); + } + transactions.push(ThreadTransaction { + uid, + fee, + weight, + sigops, + fee_per_vsize, + effective_fee_per_vsize, + inputs, + }) + } + + return transactions; + } +} \ No newline at end of file diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 57d1a393f..7f4490477 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,10 +1,12 @@ import logger from '../logger'; -import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces'; +import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, AuditTransaction } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; import config from '../config'; import { Worker } from 'worker_threads'; import path from 'path'; +const neonAddon = require('../../rust-gbt'); + class MempoolBlocks { private mempoolBlocks: MempoolBlockWithTransactions[] = []; private mempoolBlockDeltas: MempoolBlockDelta[] = []; @@ -219,7 +221,7 @@ class MempoolBlocks { const strippedMempool: Map = new Map(); Object.values(newMempool).forEach(entry => { if (entry.uid != null) { - strippedMempool.set(entry.uid, { + const stripped = { uid: entry.uid, fee: entry.fee, weight: (entry.adjustedVsize * 4), @@ -227,7 +229,8 @@ class MempoolBlocks { feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, effectiveFeePerVsize: entry.effectiveFeePerVsize || entry.adjustedFeePerVsize || entry.feePerVsize, inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], - }); + }; + strippedMempool.set(entry.uid, stripped); } }); @@ -261,7 +264,9 @@ class MempoolBlocks { this.txSelectionWorker?.removeListener('error', threadErrorListener); const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + logger.debug(`makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); + return processed; } catch (e) { logger.err('makeBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); @@ -321,6 +326,36 @@ class MempoolBlocks { } } + public async $rustMakeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): Promise { + const start = Date.now(); + + // reset mempool short ids + this.resetUids(); + for (const tx of Object.values(newMempool)) { + this.setUid(tx); + } + + // serialize relevant mempool data into an ArrayBuffer + // to reduce the overhead of passing this data to the rust thread + const mempoolBuffer = this.mempoolToArrayBuffer(newMempool); + + // run the block construction algorithm in a separate thread, and wait for a result + try { + const { blocks, rates, clusters } = this.convertNeonResultTxids(await new Promise((resolve) => { neonAddon.go(mempoolBuffer, resolve); })); + const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + logger.debug(`RUST makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); + return processed; + } catch (e) { + logger.err('RUST makeBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); + } + return this.mempoolBlocks; + } + + public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], saveResults: boolean = false): Promise { + await this.$rustMakeBlockTemplates(newMempool, saveResults); + return; + } + private processBlockTemplates(mempool, blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }, saveResults): MempoolBlockWithTransactions[] { for (const txid of Object.keys(rates)) { if (txid in mempool) { @@ -496,6 +531,74 @@ class MempoolBlocks { } return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; } + + private convertNeonResultTxids({ blocks, rates, clusters }: { blocks: number[][], rates: number[][], clusters: number[][]}) + : { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }} { + const rateMap = new Map(); + const clusterMap = new Map(); + for (const rate of rates) { + rateMap.set(rate[0], rate[1]); + } + for (const cluster of clusters) { + clusterMap.set(cluster[0], cluster); + } + const convertedBlocks: string[][] = blocks.map(block => block.map(uid => { + return this.uidMap.get(uid) || ''; + })); + const convertedRates = {}; + for (const rateUid of rateMap.keys()) { + const rateTxid = this.uidMap.get(rateUid); + if (rateTxid) { + convertedRates[rateTxid] = rateMap.get(rateUid); + } + } + const convertedClusters = {}; + for (const rootUid of clusterMap.keys()) { + const rootTxid = this.uidMap.get(rootUid); + if (rootTxid) { + const members = clusterMap.get(rootUid)?.map(uid => { + return this.uidMap.get(uid); + }); + convertedClusters[rootTxid] = members; + } + } + return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; + } + + private mempoolToArrayBuffer(mempool: { [txid: string]: MempoolTransactionExtended }): ArrayBuffer { + let len = 4; + const inputs: { [uid: number]: number[] } = {}; + let validCount = 0; + for (const tx of Object.values(mempool)) { + if (tx.uid != null) { + validCount++; + const txInputs = tx.vin.map(v => this.getUid(mempool[v.txid])).filter(uid => uid != null) as number[] + inputs[tx.uid] = txInputs; + len += (10 + txInputs.length) * 4; + } + } + const buf = new ArrayBuffer(len); + const view = new DataView(buf); + view.setUint32(0, validCount, false); + let offset = 4; + for (const tx of Object.values(mempool)) { + if (tx.uid != null) { + view.setUint32(offset, tx.uid, false); + view.setFloat64(offset + 4, tx.fee, false); + view.setUint32(offset + 12, (tx.adjustedVsize * 4), false); + view.setUint32(offset + 16, tx.sigops, false); + view.setFloat64(offset + 20, (tx.adjustedFeePerVsize || tx.feePerVsize), false); + view.setFloat64(offset + 28, (tx.effectiveFeePerVsize || tx.adjustedFeePerVsize || tx.feePerVsize), false); + view.setUint32(offset + 36, inputs[tx.uid].length, false); + offset += 40; + for (const input of inputs[tx.uid]) { + view.setUint32(offset, input, false); + offset += 4; + } + } + } + return buf; + } } export default new MempoolBlocks(); diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 041c7e767..c32aee4cd 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -342,7 +342,7 @@ class WebsocketHandler { this.printLogs(); if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { - await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); + await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); } else { mempoolBlocks.updateMempoolBlocks(newMempool, true); } @@ -588,7 +588,7 @@ class WebsocketHandler { if (separateAudit) { auditMempool = deepClone(_memPool); if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { - projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false); + projectedBlocks = await mempoolBlocks.$rustMakeBlockTemplates(auditMempool, false); } else { projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false); } @@ -655,7 +655,7 @@ class WebsocketHandler { } if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { - await mempoolBlocks.$makeBlockTemplates(_memPool, true); + await mempoolBlocks.$rustMakeBlockTemplates(_memPool, true); } else { mempoolBlocks.updateMempoolBlocks(_memPool, true); } diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 3edd84cde..5958f464f 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -127,7 +127,7 @@ export interface CompactThreadTransaction { feePerVsize: number; effectiveFeePerVsize?: number; inputs: number[]; - cpfpRoot?: string; + cpfpRoot?: number; cpfpChecked?: boolean; dirty?: boolean; } From 1d51b01bd1020a6cd46dcc59cabb8cdb4abf0089 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 23 Jun 2023 18:37:03 -0400 Subject: [PATCH 468/782] Implement rust gbt updateBlockTemplates --- backend/rust-gbt/Cargo.lock | 47 ++++++++++++++ backend/rust-gbt/Cargo.toml | 1 + backend/rust-gbt/src/gbt.rs | 12 +--- backend/rust-gbt/src/lib.rs | 60 ++++++++++++++++-- backend/rust-gbt/src/thread_transaction.rs | 1 + backend/rust-gbt/src/utils.rs | 14 ++++ backend/src/api/mempool-blocks.ts | 74 +++++++++++++++++----- 7 files changed, 179 insertions(+), 30 deletions(-) create mode 100644 backend/rust-gbt/src/utils.rs diff --git a/backend/rust-gbt/Cargo.lock b/backend/rust-gbt/Cargo.lock index 0407bcc14..d8f1bd6ad 100644 --- a/backend/rust-gbt/Cargo.lock +++ b/backend/rust-gbt/Cargo.lock @@ -2,6 +2,18 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cfg-if" version = "1.0.0" @@ -12,7 +24,26 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" name = "gbt" version = "0.1.0" dependencies = [ + "bytes", "neon", + "once_cell", + "priority-queue", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", ] [[package]] @@ -66,6 +97,22 @@ dependencies = [ "smallvec", ] +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "priority-queue" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff39edfcaec0d64e8d0da38564fad195d2d51b680940295fcc307366e101e61" +dependencies = [ + "autocfg", + "indexmap", +] + [[package]] name = "proc-macro2" version = "1.0.60" diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml index abd55fbd8..87155c59d 100644 --- a/backend/rust-gbt/Cargo.toml +++ b/backend/rust-gbt/Cargo.toml @@ -14,6 +14,7 @@ crate-type = ["cdylib"] [dependencies] priority-queue = "1.3.2" bytes = "1.4.0" +once_cell = "1.18.0" [dependencies.neon] version = "0.10" diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 98c0d9178..aecf2bff0 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -34,13 +34,7 @@ impl Ord for TxPriority { } } -pub fn gbt(mempool_array: Vec) -> (Vec>, Vec<(u32, f64)>, Vec>) { - let mut mempool: HashMap = HashMap::new(); - for transaction in mempool_array { - mempool.insert(transaction.uid, transaction); - } - - +pub fn gbt(mempool: &mut HashMap) -> (Vec>, Vec<(u32, f64)>, Vec>) { return make_block_templates(mempool); } @@ -49,13 +43,13 @@ pub fn gbt(mempool_array: Vec) -> (Vec>, Vec<(u32, f * (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) * Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts */ -fn make_block_templates(mempool: HashMap) -> (Vec>, Vec<(u32, f64)>, Vec>) { +fn make_block_templates(mempool: &mut HashMap) -> (Vec>, Vec<(u32, f64)>, Vec>) { let mut audit_pool: HashMap = HashMap::new(); let mut mempool_array: VecDeque = VecDeque::new(); let mut cluster_array: Vec> = Vec::new(); // Initialize working structs - for (uid, tx) in &mempool { + for (uid, tx) in mempool { let audit_tx = AuditTransaction { uid: tx.uid, fee: tx.fee, diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index ff7d6c208..12583300a 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -1,11 +1,20 @@ use neon::{prelude::*, types::buffer::TypedArray}; +use std::collections::HashMap; +use std::ops::DerefMut; +use std::sync::Mutex; +use once_cell::sync::Lazy; mod gbt; mod thread_transaction; mod audit_transaction; -use thread_transaction::{ThreadTransaction}; +mod utils; +use thread_transaction::ThreadTransaction; -fn go(mut cx: FunctionContext) -> JsResult { +static THREAD_TRANSACTIONS: Lazy>> = Lazy::new(|| { + Mutex::new(HashMap::new()) +}); + +fn make(mut cx: FunctionContext) -> JsResult { let mempool_arg = cx.argument::(0)?.root(&mut cx).into_inner(&mut cx); let callback = cx.argument::(1)?.root(&mut cx); let channel = cx.channel(); @@ -13,8 +22,48 @@ fn go(mut cx: FunctionContext) -> JsResult { let buffer = mempool_arg.as_slice(&mut cx); let thread_transactions = ThreadTransaction::batch_from_buffer(buffer); + let mut map = THREAD_TRANSACTIONS.lock().unwrap(); + map.clear(); + for tx in thread_transactions { + map.insert(tx.uid, tx); + } + drop(map); + + run_in_thread(channel, callback); + + Ok(cx.undefined()) +} + +fn update(mut cx: FunctionContext) -> JsResult { + let new_txs_arg = cx.argument::(0)?.root(&mut cx).into_inner(&mut cx); + let remove_txs_arg = cx.argument::(1)?.root(&mut cx).into_inner(&mut cx); + let callback = cx.argument::(2)?.root(&mut cx); + let channel = cx.channel(); + + let mut map = THREAD_TRANSACTIONS.lock().unwrap(); + let new_tx_buffer = new_txs_arg.as_slice(&mut cx); + let thread_transactions = ThreadTransaction::batch_from_buffer(new_tx_buffer); + for tx in thread_transactions { + map.insert(tx.uid, tx); + } + + let remove_tx_buffer = remove_txs_arg.as_slice(&mut cx); + let remove_ids = utils::txids_from_buffer(remove_tx_buffer); + for txid in &remove_ids { + map.remove(txid); + } + drop(map); + + run_in_thread(channel, callback); + + Ok(cx.undefined()) +} + +fn run_in_thread(channel: Channel, callback: Root) { std::thread::spawn(move || { - let (blocks, rates, clusters) = gbt::gbt(thread_transactions); + let mut map = THREAD_TRANSACTIONS.lock().unwrap(); + let (blocks, rates, clusters) = gbt::gbt(map.deref_mut()); + drop(map); channel.send(move |mut cx| { let result = JsObject::new(&mut cx); @@ -64,12 +113,11 @@ fn go(mut cx: FunctionContext) -> JsResult { Ok(()) }); }); - - Ok(cx.undefined()) } #[neon::main] fn main(mut cx: ModuleContext) -> NeonResult<()> { - cx.export_function("go", go)?; + cx.export_function("make", make)?; + cx.export_function("update", update)?; Ok(()) } diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs index fa977c3e9..f429613a6 100644 --- a/backend/rust-gbt/src/thread_transaction.rs +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -2,6 +2,7 @@ extern crate bytes; use std::io::Cursor; use bytes::buf::Buf; + pub struct ThreadTransaction { pub uid: u32, pub fee: u64, diff --git a/backend/rust-gbt/src/utils.rs b/backend/rust-gbt/src/utils.rs new file mode 100644 index 000000000..569b858e8 --- /dev/null +++ b/backend/rust-gbt/src/utils.rs @@ -0,0 +1,14 @@ +extern crate bytes; +use std::io::Cursor; +use bytes::buf::Buf; + +pub fn txids_from_buffer(buffer: &[u8]) -> Vec { + let mut txids: Vec = Vec::new(); + let mut cursor = Cursor::new(buffer); + let size = cursor.get_u32(); + for _ in 0..size { + txids.push(cursor.get_u32()); + } + + return txids; +} \ No newline at end of file diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 7f4490477..b82946a9e 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -11,6 +11,7 @@ class MempoolBlocks { private mempoolBlocks: MempoolBlockWithTransactions[] = []; private mempoolBlockDeltas: MempoolBlockDelta[] = []; private txSelectionWorker: Worker | null = null; + private rustInitialized: boolean = false; private nextUid: number = 1; private uidMap: Map = new Map(); // map short numerical uids to full txids @@ -284,7 +285,7 @@ class MempoolBlocks { const start = Date.now(); for (const tx of Object.values(added)) { - this.setUid(tx); + this.setUid(tx, true); } const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => uid != null) as number[]; // prepare a stripped down version of the mempool with only the minimum necessary data @@ -337,23 +338,49 @@ class MempoolBlocks { // serialize relevant mempool data into an ArrayBuffer // to reduce the overhead of passing this data to the rust thread - const mempoolBuffer = this.mempoolToArrayBuffer(newMempool); + const mempoolBuffer = this.mempoolToArrayBuffer(Object.values(newMempool), newMempool); // run the block construction algorithm in a separate thread, and wait for a result try { - const { blocks, rates, clusters } = this.convertNeonResultTxids(await new Promise((resolve) => { neonAddon.go(mempoolBuffer, resolve); })); + const { blocks, rates, clusters } = this.convertNeonResultTxids(await new Promise((resolve) => { neonAddon.make(mempoolBuffer, resolve); })); + this.rustInitialized = true; const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); logger.debug(`RUST makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); return processed; } catch (e) { + this.rustInitialized = false; logger.err('RUST makeBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); } return this.mempoolBlocks; } public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], saveResults: boolean = false): Promise { - await this.$rustMakeBlockTemplates(newMempool, saveResults); - return; + if (!this.rustInitialized) { + // need to reset the worker + await this.$rustMakeBlockTemplates(newMempool, saveResults); + return; + } + + const start = Date.now(); + + for (const tx of Object.values(added)) { + this.setUid(tx, true); + } + const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => uid != null) as number[]; + // serialize relevant mempool data into an ArrayBuffer + // to reduce the overhead of passing this data to the rust thread + const addedBuffer = this.mempoolToArrayBuffer(added, newMempool); + const removedBuffer = this.uidsToArrayBuffer(removedUids); + + // run the block construction algorithm in a separate thread, and wait for a result + try { + const { blocks, rates, clusters } = this.convertNeonResultTxids(await new Promise((resolve) => { neonAddon.update(addedBuffer, removedBuffer, resolve); })); + this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); + } catch (e) { + this.rustInitialized = false; + logger.err('RUST updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); + } } private processBlockTemplates(mempool, blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }, saveResults): MempoolBlockWithTransactions[] { @@ -487,12 +514,16 @@ class MempoolBlocks { this.nextUid = 1; } - private setUid(tx: MempoolTransactionExtended): number { - const uid = this.nextUid; - this.nextUid++; - this.uidMap.set(uid, tx.txid); - tx.uid = uid; - return uid; + private setUid(tx: MempoolTransactionExtended, skipSet = false): number { + if (tx.uid == null || !skipSet) { + const uid = this.nextUid; + this.nextUid++; + this.uidMap.set(uid, tx.txid); + tx.uid = uid; + return uid; + } else { + return tx.uid; + } } private getUid(tx: MempoolTransactionExtended): number | void { @@ -565,14 +596,14 @@ class MempoolBlocks { return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; } - private mempoolToArrayBuffer(mempool: { [txid: string]: MempoolTransactionExtended }): ArrayBuffer { + private mempoolToArrayBuffer(txs: MempoolTransactionExtended[], mempool: { [txid: string]: MempoolTransactionExtended }): ArrayBuffer { let len = 4; const inputs: { [uid: number]: number[] } = {}; let validCount = 0; - for (const tx of Object.values(mempool)) { + for (const tx of txs) { if (tx.uid != null) { validCount++; - const txInputs = tx.vin.map(v => this.getUid(mempool[v.txid])).filter(uid => uid != null) as number[] + const txInputs = tx.vin.map(v => this.getUid(mempool[v.txid])).filter(uid => uid != null) as number[]; inputs[tx.uid] = txInputs; len += (10 + txInputs.length) * 4; } @@ -581,7 +612,7 @@ class MempoolBlocks { const view = new DataView(buf); view.setUint32(0, validCount, false); let offset = 4; - for (const tx of Object.values(mempool)) { + for (const tx of txs) { if (tx.uid != null) { view.setUint32(offset, tx.uid, false); view.setFloat64(offset + 4, tx.fee, false); @@ -599,6 +630,19 @@ class MempoolBlocks { } return buf; } + + private uidsToArrayBuffer(uids: number[]): ArrayBuffer { + let len = (uids.length + 1) * 4; + const buf = new ArrayBuffer(len); + const view = new DataView(buf); + view.setUint32(0, uids.length, false); + let offset = 4; + for (const uid of uids) { + view.setUint32(offset, uid, false); + offset += 4; + } + return buf; + } } export default new MempoolBlocks(); From 0e0088182680d66eb63e0f5b1e751574a4ae3f60 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 23 Jun 2023 20:41:39 -0400 Subject: [PATCH 469/782] Refactor rust code for style --- backend/rust-gbt/src/audit_transaction.rs | 74 +-- backend/rust-gbt/src/gbt.rs | 566 +++++++++++---------- backend/rust-gbt/src/lib.rs | 170 ++++--- backend/rust-gbt/src/thread_transaction.rs | 76 ++- backend/rust-gbt/src/utils.rs | 19 +- 5 files changed, 480 insertions(+), 425 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 4b23b9a21..df6371456 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -1,53 +1,57 @@ -use std::{collections::{HashSet}, hash::{Hash, Hasher}, cmp::Ordering}; +use std::{ + cmp::Ordering, + collections::HashSet, + hash::{Hash, Hasher}, +}; #[derive(Clone)] pub struct AuditTransaction { - pub uid: u32, - pub fee: u64, - pub weight: u32, - pub sigops: u32, - pub fee_per_vsize: f64, - pub effective_fee_per_vsize: f64, - pub dependency_rate: f64, - pub inputs: Vec, - pub is_relatives_set: bool, - pub ancestors: HashSet, - pub children: HashSet, - pub ancestor_fee: u64, - pub ancestor_weight: u32, - pub ancestor_sigops: u32, - pub score: f64, - pub used: bool, - pub modified: bool, - pub dirty: bool, + pub uid: u32, + pub fee: u64, + pub weight: u32, + pub sigops: u32, + pub fee_per_vsize: f64, + pub effective_fee_per_vsize: f64, + pub dependency_rate: f64, + pub inputs: Vec, + pub relatives_set_flag: bool, + pub ancestors: HashSet, + pub children: HashSet, + pub ancestor_fee: u64, + pub ancestor_weight: u32, + pub ancestor_sigops: u32, + pub score: f64, + pub used: bool, + pub modified: bool, + pub dirty: bool, } impl Hash for AuditTransaction { - fn hash(&self, state: &mut H) { - self.uid.hash(state); - } + fn hash(&self, state: &mut H) { + self.uid.hash(state); + } } impl PartialEq for AuditTransaction { - fn eq(&self, other: &Self) -> bool { - self.uid == other.uid - } + fn eq(&self, other: &Self) -> bool { + self.uid == other.uid + } } impl Eq for AuditTransaction {} impl PartialOrd for AuditTransaction { - fn partial_cmp(&self, other: &AuditTransaction) -> Option { - if self.score == other.score { - return Some(self.uid.cmp(&other.uid)); - } else { - return self.score.partial_cmp(&other.score); + fn partial_cmp(&self, other: &AuditTransaction) -> Option { + if self.score == other.score { + return Some(self.uid.cmp(&other.uid)); + } else { + return self.score.partial_cmp(&other.score); + } } - } } impl Ord for AuditTransaction { - fn cmp(&self, other: &AuditTransaction) -> Ordering { - self.partial_cmp(other).unwrap() - } -} \ No newline at end of file + fn cmp(&self, other: &AuditTransaction) -> Ordering { + self.partial_cmp(other).unwrap() + } +} diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index aecf2bff0..ff491d52c 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -1,41 +1,45 @@ +use priority_queue::PriorityQueue; use std::cmp::Ordering; use std::collections::{HashMap, HashSet, VecDeque}; use std::f64::INFINITY; -use priority_queue::PriorityQueue; -use crate::thread_transaction::{ThreadTransaction}; -use crate::audit_transaction::{AuditTransaction}; +use crate::audit_transaction::AuditTransaction; +use crate::thread_transaction::ThreadTransaction; const BLOCK_WEIGHT_UNITS: u32 = 4_000_000; const BLOCK_SIGOPS: u32 = 80_000; +const BLOCK_RESERVED_WEIGHT: u32 = 4_000; +const MAX_BLOCKS: usize = 8; struct TxPriority { - uid: u32, - score: f64, + uid: u32, + score: f64, } impl PartialEq for TxPriority { - fn eq(&self, other: &Self) -> bool { - self.uid == other.uid - } + fn eq(&self, other: &Self) -> bool { + self.uid == other.uid + } } impl Eq for TxPriority {} impl PartialOrd for TxPriority { - fn partial_cmp(&self, other: &TxPriority) -> Option { - if self.score == other.score { - return Some(self.uid.cmp(&other.uid)); - } else { - return other.score.partial_cmp(&self.score); + fn partial_cmp(&self, other: &TxPriority) -> Option { + if self.score == other.score { + return Some(self.uid.cmp(&other.uid)); + } else { + return other.score.partial_cmp(&self.score); + } } - } } impl Ord for TxPriority { - fn cmp(&self, other: &Self) -> Ordering { - self.partial_cmp(other).unwrap() - } + fn cmp(&self, other: &Self) -> Ordering { + self.partial_cmp(other).unwrap() + } } -pub fn gbt(mempool: &mut HashMap) -> (Vec>, Vec<(u32, f64)>, Vec>) { - return make_block_templates(mempool); +pub fn gbt( + mempool: &mut HashMap, +) -> Option<(Vec>, Vec<(u32, f64)>, Vec>)> { + make_block_templates(mempool) } /* @@ -43,264 +47,310 @@ pub fn gbt(mempool: &mut HashMap) -> (Vec>, Vec< * (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) * Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts */ -fn make_block_templates(mempool: &mut HashMap) -> (Vec>, Vec<(u32, f64)>, Vec>) { - let mut audit_pool: HashMap = HashMap::new(); - let mut mempool_array: VecDeque = VecDeque::new(); - let mut cluster_array: Vec> = Vec::new(); +fn make_block_templates( + mempool: &mut HashMap, +) -> Option<(Vec>, Vec<(u32, f64)>, Vec>)> { + let mut audit_pool: HashMap = HashMap::new(); + let mut mempool_array: VecDeque = VecDeque::new(); + let mut cluster_array: Vec> = Vec::new(); - // Initialize working structs - for (uid, tx) in mempool { - let audit_tx = AuditTransaction { - uid: tx.uid, - fee: tx.fee, - weight: tx.weight, - sigops: tx.sigops, - fee_per_vsize: tx.fee_per_vsize, - effective_fee_per_vsize: tx.effective_fee_per_vsize, - dependency_rate: INFINITY, - inputs: tx.inputs.clone(), - is_relatives_set: false, - ancestors: HashSet::new(), - children: HashSet::new(), - ancestor_fee: tx.fee, - ancestor_weight: tx.weight, - ancestor_sigops: tx.sigops, - score: 0.0, - used: false, - modified: false, - dirty: false, - }; - audit_pool.insert(audit_tx.uid, audit_tx); - mempool_array.push_back(*uid); - } - - // Build relatives graph & calculate ancestor scores - for txid in &mempool_array { - set_relatives(*txid, &mut audit_pool); - } - - // Sort by descending ancestor score - mempool_array.make_contiguous().sort_unstable_by(|a, b| { - let a_tx = audit_pool.get(a).unwrap(); - let b_tx = audit_pool.get(b).unwrap(); - b_tx.cmp(a_tx) - }); - - // Build blocks by greedily choosing the highest feerate package - // (i.e. the package rooted in the transaction with the best ancestor score) - let mut blocks: Vec> = Vec::new(); - let mut block_weight: u32 = 4000; - let mut block_sigops: u32 = 0; - let mut transactions: Vec = Vec::new(); - let mut modified: PriorityQueue = PriorityQueue::new(); - let mut overflow: Vec = Vec::new(); - let mut failures = 0; - while mempool_array.len() > 0 || !modified.is_empty() { - let next_txid: u32; - if modified.is_empty() { - next_txid = mempool_array.pop_front().unwrap(); - } else if mempool_array.len() == 0 { - next_txid = modified.pop().unwrap().0; - } else { - let next_array_txid = mempool_array.front().unwrap(); - let next_modified_txid = modified.peek().unwrap().0; - let array_tx: &AuditTransaction = audit_pool.get(next_array_txid).unwrap(); - let modified_tx: &AuditTransaction = audit_pool.get(next_modified_txid).unwrap(); - match array_tx.cmp(&modified_tx) { - std::cmp::Ordering::Equal | std::cmp::Ordering::Greater => { - next_txid = mempool_array.pop_front().unwrap(); - } - std::cmp::Ordering::Less => { - next_txid = modified.pop().unwrap().0; - } - } - } - let next_tx: AuditTransaction = audit_pool.get(&next_txid).unwrap().clone(); - - if next_tx.used { - continue; + // Initialize working structs + for (uid, tx) in mempool { + let audit_tx = AuditTransaction { + uid: tx.uid, + fee: tx.fee, + weight: tx.weight, + sigops: tx.sigops, + fee_per_vsize: tx.fee_per_vsize, + effective_fee_per_vsize: tx.effective_fee_per_vsize, + dependency_rate: INFINITY, + inputs: tx.inputs.clone(), + relatives_set_flag: false, + ancestors: HashSet::new(), + children: HashSet::new(), + ancestor_fee: tx.fee, + ancestor_weight: tx.weight, + ancestor_sigops: tx.sigops, + score: 0.0, + used: false, + modified: false, + dirty: false, + }; + audit_pool.insert(audit_tx.uid, audit_tx); + mempool_array.push_back(*uid); } - if blocks.len() < 7 && ((block_weight + next_tx.ancestor_weight >= BLOCK_WEIGHT_UNITS) || (block_sigops + next_tx.ancestor_sigops > BLOCK_SIGOPS)) { - // hold this package in an overflow list while we check for smaller options - overflow.push(next_txid); - failures += 1; - } else { - let mut package: Vec<(u32, usize, u32)> = Vec::new(); - let mut cluster: Vec = Vec::new(); - let is_cluster: bool = next_tx.ancestors.len() > 0; - package.push((next_tx.uid, next_tx.ancestors.len(), next_tx.weight)); - cluster.push(next_tx.uid); - for ancestor_id in &next_tx.ancestors { - if let Some(ancestor) = audit_pool.get(ancestor_id) { - package.push((*ancestor_id, ancestor.ancestors.len(), ancestor.weight)); - cluster.push(*ancestor_id); - } - } - package.sort_unstable_by_key(|a| 0 - a.1); - - if is_cluster { - cluster_array.push(cluster); - } - - let cluster_rate = next_tx.dependency_rate.min(next_tx.ancestor_fee as f64 / (next_tx.ancestor_weight as f64 / 4.0)); - - for package_entry in &package { - if let Some(tx) = audit_pool.get_mut(&package_entry.0) { - tx.used = true; - if tx.effective_fee_per_vsize != cluster_rate { - tx.effective_fee_per_vsize = cluster_rate; - tx.dirty = true; - } - transactions.push(tx.uid); - block_weight += tx.weight; - block_sigops += tx.sigops; - } - update_descendants(package_entry.0, &mut audit_pool, &mut modified, cluster_rate); - } - - failures = 0; + // Build relatives graph & calculate ancestor scores + for txid in &mempool_array { + set_relatives(*txid, &mut audit_pool); } - // this block is full - let exceeded_package_tries = failures > 1000 && block_weight > (BLOCK_WEIGHT_UNITS - 4000); - let queue_is_empty = mempool_array.len() == 0 && modified.is_empty(); - if (exceeded_package_tries || queue_is_empty) && blocks.len() < 7 { - // finalize this block - if transactions.len() > 0 { + // Sort by descending ancestor score + mempool_array.make_contiguous().sort_unstable_by(|a, b| { + let a_tx = audit_pool.get(a).unwrap(); + let b_tx = audit_pool.get(b).unwrap(); + b_tx.cmp(a_tx) + }); + + // Build blocks by greedily choosing the highest feerate package + // (i.e. the package rooted in the transaction with the best ancestor score) + let mut blocks: Vec> = Vec::new(); + let mut block_weight: u32 = BLOCK_RESERVED_WEIGHT; + let mut block_sigops: u32 = 0; + let mut transactions: Vec = Vec::new(); + let mut modified: PriorityQueue = PriorityQueue::new(); + let mut overflow: Vec = Vec::new(); + let mut failures = 0; + while mempool_array.len() > 0 || !modified.is_empty() { + let next_txid: u32; + if modified.is_empty() { + next_txid = mempool_array.pop_front()?; + } else if mempool_array.len() == 0 { + next_txid = modified.pop()?.0; + } else { + let next_array_txid = mempool_array.front()?; + let next_modified_txid = modified.peek()?.0; + let array_tx: &AuditTransaction = audit_pool.get(next_array_txid)?; + let modified_tx: &AuditTransaction = audit_pool.get(next_modified_txid)?; + match array_tx.cmp(&modified_tx) { + std::cmp::Ordering::Equal | std::cmp::Ordering::Greater => { + next_txid = mempool_array.pop_front()?; + } + std::cmp::Ordering::Less => { + next_txid = modified.pop()?.0; + } + } + } + + let next_tx = audit_pool.get(&next_txid)?; + + if next_tx.used { + continue; + } + + if blocks.len() < (MAX_BLOCKS - 1) + && ((block_weight + next_tx.ancestor_weight >= BLOCK_WEIGHT_UNITS) + || (block_sigops + next_tx.ancestor_sigops > BLOCK_SIGOPS)) + { + // hold this package in an overflow list while we check for smaller options + overflow.push(next_txid); + failures += 1; + } else { + let mut package: Vec<(u32, usize, u32)> = Vec::new(); + let mut cluster: Vec = Vec::new(); + let is_cluster: bool = next_tx.ancestors.len() > 0; + package.push((next_txid, next_tx.ancestors.len(), next_tx.weight)); + cluster.push(next_txid); + for ancestor_id in &next_tx.ancestors { + if let Some(ancestor) = audit_pool.get(ancestor_id) { + package.push((*ancestor_id, ancestor.ancestors.len(), ancestor.weight)); + cluster.push(*ancestor_id); + } + } + package.sort_unstable_by_key(|a| 0 - a.1); + + if is_cluster { + cluster_array.push(cluster); + } + + let cluster_rate = next_tx + .dependency_rate + .min(next_tx.ancestor_fee as f64 / (next_tx.ancestor_weight as f64 / 4.0)); + + for package_entry in &package { + if let Some(tx) = audit_pool.get_mut(&package_entry.0) { + tx.used = true; + if tx.effective_fee_per_vsize != cluster_rate { + tx.effective_fee_per_vsize = cluster_rate; + tx.dirty = true; + } + transactions.push(tx.uid); + block_weight += tx.weight; + block_sigops += tx.sigops; + } + update_descendants( + package_entry.0, + &mut audit_pool, + &mut modified, + cluster_rate, + ); + } + + failures = 0; + } + + // this block is full + let exceeded_package_tries = + failures > 1000 && block_weight > (BLOCK_WEIGHT_UNITS - BLOCK_RESERVED_WEIGHT); + let queue_is_empty = mempool_array.len() == 0 && modified.is_empty(); + if (exceeded_package_tries || queue_is_empty) && blocks.len() < (MAX_BLOCKS - 1) { + // finalize this block + if transactions.len() > 0 { + blocks.push(transactions); + } + // reset for the next block + transactions = Vec::new(); + block_weight = 4000; + // 'overflow' packages didn't fit in this block, but are valid candidates for the next + overflow.reverse(); + for overflowed in &overflow { + if let Some(overflowed_tx) = audit_pool.get(overflowed) { + if overflowed_tx.modified { + modified.push( + *overflowed, + TxPriority { + uid: *overflowed, + score: overflowed_tx.score, + }, + ); + } else { + mempool_array.push_front(*overflowed); + } + } + } + overflow = Vec::new(); + } + } + // add the final unbounded block if it contains any transactions + if transactions.len() > 0 { blocks.push(transactions); - } - // reset for the next block - transactions = Vec::new(); - block_weight = 4000; - // 'overflow' packages didn't fit in this block, but are valid candidates for the next - overflow.reverse(); - for overflowed in &overflow { - if let Some(overflowed_tx) = audit_pool.get(overflowed) { - if overflowed_tx.modified { - modified.push(*overflowed, TxPriority{ uid: *overflowed, score: overflowed_tx.score}); - } else { - mempool_array.push_front(*overflowed); - } + } + + // make a list of dirty transactions and their new rates + let mut rates: Vec<(u32, f64)> = Vec::new(); + for (txid, tx) in audit_pool { + if tx.dirty { + rates.push((txid, tx.effective_fee_per_vsize)); } - } - overflow = Vec::new(); } - } - // add the final unbounded block if it contains any transactions - if transactions.len() > 0 { - blocks.push(transactions); - } - // make a list of dirty transactions and their new rates - let mut rates: Vec<(u32, f64)> = Vec::new(); - for (txid, tx) in audit_pool { - if tx.dirty { - rates.push((txid, tx.effective_fee_per_vsize)); - } - } - - return (blocks, rates, cluster_array); + Some((blocks, rates, cluster_array)) } fn set_relatives(txid: u32, audit_pool: &mut HashMap) { - let mut parents: HashSet = HashSet::new(); - if let Some(tx) = audit_pool.get(&txid) { - if tx.is_relatives_set { - return; - } - for input in &tx.inputs { - parents.insert(*input); - } - } else { - return; - } - - let mut ancestors: HashSet = HashSet::new(); - for parent_id in &parents { - set_relatives(*parent_id, audit_pool); - - let parent_entry: Option<&mut AuditTransaction> = audit_pool.get_mut(&parent_id); - match parent_entry { - Some(parent) => { - ancestors.insert(*parent_id); - parent.children.insert(txid); - for ancestor in &parent.ancestors { - ancestors.insert(*ancestor); + let mut parents: HashSet = HashSet::new(); + if let Some(tx) = audit_pool.get(&txid) { + if tx.relatives_set_flag { + return; } - } - - None => {} + for input in &tx.inputs { + parents.insert(*input); + } + } else { + return; } - } - let mut total_fee: u64 = 0; - let mut total_weight: u32 = 0; - let mut total_sigops: u32 = 0; + let mut ancestors: HashSet = HashSet::new(); + for parent_id in &parents { + set_relatives(*parent_id, audit_pool); - for ancestor_id in &ancestors { - let ancestor = audit_pool.get(&ancestor_id).unwrap(); - total_fee += ancestor.fee; - total_weight += ancestor.weight; - total_sigops += ancestor.sigops; - } + match audit_pool.get_mut(&parent_id) { + Some(parent) => { + ancestors.insert(*parent_id); + parent.children.insert(txid); + for ancestor in &parent.ancestors { + ancestors.insert(*ancestor); + } + } - if let Some(tx) = audit_pool.get_mut(&txid) { - tx.ancestors = ancestors; - tx.ancestor_fee = tx.fee + total_fee; - tx.ancestor_weight = tx.weight + total_weight; - tx.ancestor_sigops = tx.sigops + total_sigops; - tx.score = (tx.ancestor_fee as f64) / (if tx.ancestor_weight != 0 {tx.ancestor_weight as f64 / 4.0} else { 1.0 }); - tx.is_relatives_set = true; - } + None => {} + } + } + + let mut total_fee: u64 = 0; + let mut total_weight: u32 = 0; + let mut total_sigops: u32 = 0; + + for ancestor_id in &ancestors { + let ancestor = audit_pool.get(&ancestor_id).unwrap(); + total_fee += ancestor.fee; + total_weight += ancestor.weight; + total_sigops += ancestor.sigops; + } + + if let Some(tx) = audit_pool.get_mut(&txid) { + tx.ancestors = ancestors; + tx.ancestor_fee = tx.fee + total_fee; + tx.ancestor_weight = tx.weight + total_weight; + tx.ancestor_sigops = tx.sigops + total_sigops; + tx.score = (tx.ancestor_fee as f64) + / (if tx.ancestor_weight != 0 { + tx.ancestor_weight as f64 / 4.0 + } else { + 1.0 + }); + tx.relatives_set_flag = true; + } } // iterate over remaining descendants, removing the root as a valid ancestor & updating the ancestor score -fn update_descendants(root_txid: u32, audit_pool: &mut HashMap, modified: &mut PriorityQueue, cluster_rate: f64) { - let mut visited: HashSet = HashSet::new(); - let mut descendant_stack: Vec = Vec::new(); - let root_fee: u64; - let root_weight: u32; - let root_sigops: u32; - if let Some(root_tx) = audit_pool.get(&root_txid) { - for descendant_id in &root_tx.children { - if !visited.contains(descendant_id) { - descendant_stack.push(*descendant_id); - visited.insert(*descendant_id); - } - } - root_fee = root_tx.fee; - root_weight = root_tx.weight; - root_sigops = root_tx.sigops; - } else { - return; - } - while descendant_stack.len() > 0 { - let next_txid: u32 = descendant_stack.pop().unwrap(); - if let Some(descendant) = audit_pool.get_mut(&next_txid) { - // remove root tx as ancestor - descendant.ancestors.remove(&root_txid); - descendant.ancestor_fee -= root_fee; - descendant.ancestor_weight -= root_weight; - descendant.ancestor_sigops -= root_sigops; - let current_score = descendant.score; - descendant.score = (descendant.ancestor_fee as f64) / (if descendant.ancestor_weight != 0 {descendant.ancestor_weight as f64 / 4.0} else { 1.0 }); - descendant.dependency_rate = descendant.dependency_rate.min(cluster_rate); - descendant.modified = true; - // update modified priority if score has changed - if !descendant.modified || descendant.score < current_score { - modified.push_decrease(descendant.uid, TxPriority { uid: descendant.uid, score: descendant.score}); - } else if descendant.score > current_score { - modified.push_increase(descendant.uid, TxPriority { uid: descendant.uid, score: descendant.score}); - } - - // add this node's children to the stack - for child_id in &descendant.children { - if !visited.contains(child_id) { - descendant_stack.push(*child_id); - visited.insert(*child_id); +fn update_descendants( + root_txid: u32, + audit_pool: &mut HashMap, + modified: &mut PriorityQueue, + cluster_rate: f64, +) { + let mut visited: HashSet = HashSet::new(); + let mut descendant_stack: Vec = Vec::new(); + let root_fee: u64; + let root_weight: u32; + let root_sigops: u32; + if let Some(root_tx) = audit_pool.get(&root_txid) { + for descendant_id in &root_tx.children { + if !visited.contains(descendant_id) { + descendant_stack.push(*descendant_id); + visited.insert(*descendant_id); + } } - } + root_fee = root_tx.fee; + root_weight = root_tx.weight; + root_sigops = root_tx.sigops; + } else { + return; } - } -} \ No newline at end of file + while descendant_stack.len() > 0 { + let next_txid: u32 = descendant_stack.pop().unwrap(); + if let Some(descendant) = audit_pool.get_mut(&next_txid) { + // remove root tx as ancestor + descendant.ancestors.remove(&root_txid); + descendant.ancestor_fee -= root_fee; + descendant.ancestor_weight -= root_weight; + descendant.ancestor_sigops -= root_sigops; + let current_score = descendant.score; + descendant.score = (descendant.ancestor_fee as f64) + / (if descendant.ancestor_weight != 0 { + descendant.ancestor_weight as f64 / 4.0 + } else { + 1.0 + }); + descendant.dependency_rate = descendant.dependency_rate.min(cluster_rate); + descendant.modified = true; + // update modified priority if score has changed + if !descendant.modified || descendant.score < current_score { + modified.push_decrease( + descendant.uid, + TxPriority { + uid: descendant.uid, + score: descendant.score, + }, + ); + } else if descendant.score > current_score { + modified.push_increase( + descendant.uid, + TxPriority { + uid: descendant.uid, + score: descendant.score, + }, + ); + } + + // add this node's children to the stack + for child_id in &descendant.children { + if !visited.contains(child_id) { + descendant_stack.push(*child_id); + visited.insert(*child_id); + } + } + } + } +} diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 12583300a..375575908 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -1,123 +1,127 @@ use neon::{prelude::*, types::buffer::TypedArray}; +use once_cell::sync::Lazy; use std::collections::HashMap; use std::ops::DerefMut; use std::sync::Mutex; -use once_cell::sync::Lazy; +mod audit_transaction; mod gbt; mod thread_transaction; -mod audit_transaction; mod utils; use thread_transaction::ThreadTransaction; -static THREAD_TRANSACTIONS: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::new()) -}); +static THREAD_TRANSACTIONS: Lazy>> = + Lazy::new(|| Mutex::new(HashMap::new())); fn make(mut cx: FunctionContext) -> JsResult { - let mempool_arg = cx.argument::(0)?.root(&mut cx).into_inner(&mut cx); - let callback = cx.argument::(1)?.root(&mut cx); - let channel = cx.channel(); + let mempool_arg = cx + .argument::(0)? + .root(&mut cx) + .into_inner(&mut cx); + let callback = cx.argument::(1)?.root(&mut cx); + let channel = cx.channel(); - let buffer = mempool_arg.as_slice(&mut cx); - let thread_transactions = ThreadTransaction::batch_from_buffer(buffer); + let buffer = mempool_arg.as_slice(&mut cx); - let mut map = THREAD_TRANSACTIONS.lock().unwrap(); - map.clear(); - for tx in thread_transactions { - map.insert(tx.uid, tx); - } - drop(map); + let mut map = HashMap::new(); + for tx in ThreadTransaction::batch_from_buffer(buffer) { + map.insert(tx.uid, tx); + } - run_in_thread(channel, callback); + let mut global_map = THREAD_TRANSACTIONS.lock().unwrap(); + *global_map = map; - Ok(cx.undefined()) + run_in_thread(channel, callback); + + Ok(cx.undefined()) } fn update(mut cx: FunctionContext) -> JsResult { - let new_txs_arg = cx.argument::(0)?.root(&mut cx).into_inner(&mut cx); - let remove_txs_arg = cx.argument::(1)?.root(&mut cx).into_inner(&mut cx); - let callback = cx.argument::(2)?.root(&mut cx); - let channel = cx.channel(); + let new_txs_arg = cx + .argument::(0)? + .root(&mut cx) + .into_inner(&mut cx); + let remove_txs_arg = cx + .argument::(1)? + .root(&mut cx) + .into_inner(&mut cx); + let callback = cx.argument::(2)?.root(&mut cx); + let channel = cx.channel(); - let mut map = THREAD_TRANSACTIONS.lock().unwrap(); - let new_tx_buffer = new_txs_arg.as_slice(&mut cx); - let thread_transactions = ThreadTransaction::batch_from_buffer(new_tx_buffer); - for tx in thread_transactions { - map.insert(tx.uid, tx); - } + let mut map = THREAD_TRANSACTIONS.lock().unwrap(); + let new_tx_buffer = new_txs_arg.as_slice(&mut cx); + for tx in ThreadTransaction::batch_from_buffer(new_tx_buffer) { + map.insert(tx.uid, tx); + } - let remove_tx_buffer = remove_txs_arg.as_slice(&mut cx); - let remove_ids = utils::txids_from_buffer(remove_tx_buffer); - for txid in &remove_ids { - map.remove(txid); - } - drop(map); + let remove_tx_buffer = remove_txs_arg.as_slice(&mut cx); + for txid in &utils::txids_from_buffer(remove_tx_buffer) { + map.remove(txid); + } + drop(map); - run_in_thread(channel, callback); + run_in_thread(channel, callback); - Ok(cx.undefined()) + Ok(cx.undefined()) } fn run_in_thread(channel: Channel, callback: Root) { - std::thread::spawn(move || { - let mut map = THREAD_TRANSACTIONS.lock().unwrap(); - let (blocks, rates, clusters) = gbt::gbt(map.deref_mut()); - drop(map); + std::thread::spawn(move || { + let mut map = THREAD_TRANSACTIONS.lock().unwrap(); + let (blocks, rates, clusters) = gbt::gbt(map.deref_mut()).unwrap(); + drop(map); - channel.send(move |mut cx| { - let result = JsObject::new(&mut cx); + channel.send(move |mut cx| { + let result = JsObject::new(&mut cx); - let js_blocks = JsArray::new(&mut cx, blocks.len() as u32); - for (i, block) in blocks.iter().enumerate() { - let inner = JsArray::new(&mut cx, block.len() as u32); - for (j, uid) in block.iter().enumerate() { - let v = cx.number(*uid); - inner.set(&mut cx, j as u32, v)?; - } - js_blocks.set(&mut cx, i as u32, inner)?; - } + let js_blocks = JsArray::new(&mut cx, blocks.len() as u32); + for (i, block) in blocks.iter().enumerate() { + let inner = JsArray::new(&mut cx, block.len() as u32); + for (j, uid) in block.iter().enumerate() { + let v = cx.number(*uid); + inner.set(&mut cx, j as u32, v)?; + } + js_blocks.set(&mut cx, i as u32, inner)?; + } - let js_clusters = JsArray::new(&mut cx, clusters.len() as u32); - for (i, cluster) in clusters.iter().enumerate() { - let inner = JsArray::new(&mut cx, cluster.len() as u32); - for (j, uid) in cluster.iter().enumerate() { - let v = cx.number(*uid); - inner.set(&mut cx, j as u32, v)?; - } - js_clusters.set(&mut cx, i as u32, inner)?; - } + let js_clusters = JsArray::new(&mut cx, clusters.len() as u32); + for (i, cluster) in clusters.iter().enumerate() { + let inner = JsArray::new(&mut cx, cluster.len() as u32); + for (j, uid) in cluster.iter().enumerate() { + let v = cx.number(*uid); + inner.set(&mut cx, j as u32, v)?; + } + js_clusters.set(&mut cx, i as u32, inner)?; + } - let js_rates = JsArray::new(&mut cx, rates.len() as u32); - for (i, (uid, rate)) in rates.iter().enumerate() { - let inner = JsArray::new(&mut cx, 2); - let js_uid = cx.number(*uid); - let js_rate = cx.number(*rate); - inner.set(&mut cx, 0, js_uid)?; - inner.set(&mut cx, 1, js_rate)?; - js_rates.set(&mut cx, i as u32, inner)?; - } + let js_rates = JsArray::new(&mut cx, rates.len() as u32); + for (i, (uid, rate)) in rates.iter().enumerate() { + let inner = JsArray::new(&mut cx, 2); + let js_uid = cx.number(*uid); + let js_rate = cx.number(*rate); + inner.set(&mut cx, 0, js_uid)?; + inner.set(&mut cx, 1, js_rate)?; + js_rates.set(&mut cx, i as u32, inner)?; + } - result.set(&mut cx, "blocks", js_blocks)?; - result.set(&mut cx, "clusters", js_clusters)?; - result.set(&mut cx, "rates", js_rates)?; + result.set(&mut cx, "blocks", js_blocks)?; + result.set(&mut cx, "clusters", js_clusters)?; + result.set(&mut cx, "rates", js_rates)?; - let callback = callback.into_inner(&mut cx); - let this = cx.undefined(); - let args = vec![ - result.upcast() - ]; + let callback = callback.into_inner(&mut cx); + let this = cx.undefined(); + let args = vec![result.upcast()]; - callback.call(&mut cx, this, args)?; + callback.call(&mut cx, this, args)?; - Ok(()) + Ok(()) + }); }); - }); } #[neon::main] fn main(mut cx: ModuleContext) -> NeonResult<()> { - cx.export_function("make", make)?; - cx.export_function("update", update)?; - Ok(()) + cx.export_function("make", make)?; + cx.export_function("update", update)?; + Ok(()) } diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs index f429613a6..bfcd17932 100644 --- a/backend/rust-gbt/src/thread_transaction.rs +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -1,46 +1,44 @@ -// use neon::{types::{JsObject, JsNumber, JsArray, JsValue, JsBoolean, JsArrayBuffer, buffer::TypedArray}, prelude::{Object, FunctionContext, Handle}}; -extern crate bytes; -use std::io::Cursor; use bytes::buf::Buf; +use std::io::Cursor; pub struct ThreadTransaction { - pub uid: u32, - pub fee: u64, - pub weight: u32, - pub sigops: u32, - pub fee_per_vsize: f64, - pub effective_fee_per_vsize: f64, - pub inputs: Vec, + pub uid: u32, + pub fee: u64, + pub weight: u32, + pub sigops: u32, + pub fee_per_vsize: f64, + pub effective_fee_per_vsize: f64, + pub inputs: Vec, } impl ThreadTransaction { - pub fn batch_from_buffer(buffer: &[u8]) -> Vec { - let mut transactions: Vec = Vec::new(); - let mut cursor = Cursor::new(buffer); - let size = cursor.get_u32(); - for _ in 0..size { - let uid = cursor.get_u32(); - let fee = cursor.get_f64() as u64; - let weight = cursor.get_u32(); - let sigops = cursor.get_u32(); - let fee_per_vsize = cursor.get_f64(); - let effective_fee_per_vsize = cursor.get_f64(); - let input_count = cursor.get_u32(); - let mut inputs: Vec = Vec::new(); - for _ in 0..input_count { - inputs.push(cursor.get_u32()); - } - transactions.push(ThreadTransaction { - uid, - fee, - weight, - sigops, - fee_per_vsize, - effective_fee_per_vsize, - inputs, - }) - } + pub fn batch_from_buffer(buffer: &[u8]) -> Vec { + let mut transactions: Vec = Vec::new(); + let mut cursor = Cursor::new(buffer); + let size = cursor.get_u32(); + for _ in 0..size { + let uid = cursor.get_u32(); + let fee = cursor.get_f64().round() as u64; + let weight = cursor.get_u32(); + let sigops = cursor.get_u32(); + let fee_per_vsize = cursor.get_f64(); + let effective_fee_per_vsize = cursor.get_f64(); + let input_count = cursor.get_u32(); + let mut inputs: Vec = Vec::new(); + for _ in 0..input_count { + inputs.push(cursor.get_u32()); + } + transactions.push(ThreadTransaction { + uid, + fee, + weight, + sigops, + fee_per_vsize, + effective_fee_per_vsize, + inputs, + }) + } - return transactions; - } -} \ No newline at end of file + transactions + } +} diff --git a/backend/rust-gbt/src/utils.rs b/backend/rust-gbt/src/utils.rs index 569b858e8..c1b6063a1 100644 --- a/backend/rust-gbt/src/utils.rs +++ b/backend/rust-gbt/src/utils.rs @@ -1,14 +1,13 @@ -extern crate bytes; -use std::io::Cursor; use bytes::buf::Buf; +use std::io::Cursor; pub fn txids_from_buffer(buffer: &[u8]) -> Vec { - let mut txids: Vec = Vec::new(); - let mut cursor = Cursor::new(buffer); - let size = cursor.get_u32(); - for _ in 0..size { - txids.push(cursor.get_u32()); - } + let mut txids: Vec = Vec::new(); + let mut cursor: Cursor<&[u8]> = Cursor::new(buffer); + let size: u32 = cursor.get_u32(); + for _ in 0..size { + txids.push(cursor.get_u32()); + } - return txids; -} \ No newline at end of file + txids +} From 891acf30bff861e110f201751a2150d43cc6a2d1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 23 Jun 2023 22:40:51 -0400 Subject: [PATCH 470/782] Fix vscode rust-analyzer config --- .vscode/settings.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 692791184..8ff18083a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,8 @@ { "editor.tabSize": 2, "typescript.preferences.importModuleSpecifier": "relative", - "typescript.tsdk": "./backend/node_modules/typescript/lib" + "typescript.tsdk": "./backend/node_modules/typescript/lib", + "rust-analyzer.linkedProjects": [ + "./backend/rust-gbt/Cargo.toml" + ] } \ No newline at end of file From 178bb960e93aa1c5a69dc548ef9d8332b0d36e3f Mon Sep 17 00:00:00 2001 From: mononaut <83316221+mononaut@users.noreply.github.com> Date: Sat, 24 Jun 2023 10:25:45 -0400 Subject: [PATCH 471/782] Remove redundant gbt function Co-authored-by: Jonathan Underwood --- backend/rust-gbt/src/gbt.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index ff491d52c..a138ac1d2 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -36,18 +36,12 @@ impl Ord for TxPriority { } } -pub fn gbt( - mempool: &mut HashMap, -) -> Option<(Vec>, Vec<(u32, f64)>, Vec>)> { - make_block_templates(mempool) -} - /* * Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core * (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) * Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts */ -fn make_block_templates( +pub fn gbt( mempool: &mut HashMap, ) -> Option<(Vec>, Vec<(u32, f64)>, Vec>)> { let mut audit_pool: HashMap = HashMap::new(); From 83bf9229e7e79964e8699ec09f35382c6330e585 Mon Sep 17 00:00:00 2001 From: junderw Date: Fri, 23 Jun 2023 21:51:03 -0700 Subject: [PATCH 472/782] Fix: Some of the clippy pedantic lints --- backend/rust-gbt/Cargo.toml | 2 +- backend/rust-gbt/src/audit_transaction.rs | 4 +- backend/rust-gbt/src/gbt.rs | 64 ++++++++++++---------- backend/rust-gbt/src/lib.rs | 9 ++- backend/rust-gbt/src/thread_transaction.rs | 2 +- 5 files changed, 43 insertions(+), 38 deletions(-) diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml index 87155c59d..9ff511966 100644 --- a/backend/rust-gbt/Cargo.toml +++ b/backend/rust-gbt/Cargo.toml @@ -3,7 +3,7 @@ name = "gbt" version = "0.1.0" description = "An inefficient re-implementation of the getBlockTemplate algorithm in Rust" authors = ["mononaut"] -edition = "2018" +edition = "2021" exclude = ["index.node"] [lib] diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index df6371456..1bf9a049e 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -43,9 +43,9 @@ impl Eq for AuditTransaction {} impl PartialOrd for AuditTransaction { fn partial_cmp(&self, other: &AuditTransaction) -> Option { if self.score == other.score { - return Some(self.uid.cmp(&other.uid)); + Some(self.uid.cmp(&other.uid)) } else { - return self.score.partial_cmp(&other.score); + self.score.partial_cmp(&other.score) } } } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index a138ac1d2..6cea51554 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -24,9 +24,9 @@ impl Eq for TxPriority {} impl PartialOrd for TxPriority { fn partial_cmp(&self, other: &TxPriority) -> Option { if self.score == other.score { - return Some(self.uid.cmp(&other.uid)); + Some(self.uid.cmp(&other.uid)) } else { - return other.score.partial_cmp(&self.score); + other.score.partial_cmp(&self.score) } } } @@ -36,14 +36,24 @@ impl Ord for TxPriority { } } +/// The result from calling the gbt function. +/// +/// This tuple contains the following: +/// 1. A 2D Vector of transaction IDs (u32), the inner Vecs each represent a block. +/// 2. A Vector of tuples containing transaction IDs (u32) and effective fee per vsize (f64) +/// 3. A 2D Vector of transaction IDs representing clusters of dependent mempool transactions +pub type GbtResult = (Vec>, Vec<(u32, f64)>, Vec>); + +pub fn gbt(mempool: &mut HashMap) -> Option { + make_block_templates(mempool) +} + /* * Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core * (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) * Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts */ -pub fn gbt( - mempool: &mut HashMap, -) -> Option<(Vec>, Vec<(u32, f64)>, Vec>)> { +fn make_block_templates(mempool: &mut HashMap) -> Option { let mut audit_pool: HashMap = HashMap::new(); let mut mempool_array: VecDeque = VecDeque::new(); let mut cluster_array: Vec> = Vec::new(); @@ -95,18 +105,18 @@ pub fn gbt( let mut modified: PriorityQueue = PriorityQueue::new(); let mut overflow: Vec = Vec::new(); let mut failures = 0; - while mempool_array.len() > 0 || !modified.is_empty() { + while !mempool_array.is_empty() || !modified.is_empty() { let next_txid: u32; if modified.is_empty() { next_txid = mempool_array.pop_front()?; - } else if mempool_array.len() == 0 { + } else if mempool_array.is_empty() { next_txid = modified.pop()?.0; } else { let next_array_txid = mempool_array.front()?; let next_modified_txid = modified.peek()?.0; let array_tx: &AuditTransaction = audit_pool.get(next_array_txid)?; let modified_tx: &AuditTransaction = audit_pool.get(next_modified_txid)?; - match array_tx.cmp(&modified_tx) { + match array_tx.cmp(modified_tx) { std::cmp::Ordering::Equal | std::cmp::Ordering::Greater => { next_txid = mempool_array.pop_front()?; } @@ -132,7 +142,7 @@ pub fn gbt( } else { let mut package: Vec<(u32, usize, u32)> = Vec::new(); let mut cluster: Vec = Vec::new(); - let is_cluster: bool = next_tx.ancestors.len() > 0; + let is_cluster: bool = !next_tx.ancestors.is_empty(); package.push((next_txid, next_tx.ancestors.len(), next_tx.weight)); cluster.push(next_txid); for ancestor_id in &next_tx.ancestors { @@ -176,10 +186,10 @@ pub fn gbt( // this block is full let exceeded_package_tries = failures > 1000 && block_weight > (BLOCK_WEIGHT_UNITS - BLOCK_RESERVED_WEIGHT); - let queue_is_empty = mempool_array.len() == 0 && modified.is_empty(); + let queue_is_empty = mempool_array.is_empty() && modified.is_empty(); if (exceeded_package_tries || queue_is_empty) && blocks.len() < (MAX_BLOCKS - 1) { // finalize this block - if transactions.len() > 0 { + if !transactions.is_empty() { blocks.push(transactions); } // reset for the next block @@ -206,7 +216,7 @@ pub fn gbt( } } // add the final unbounded block if it contains any transactions - if transactions.len() > 0 { + if !transactions.is_empty() { blocks.push(transactions); } @@ -238,16 +248,12 @@ fn set_relatives(txid: u32, audit_pool: &mut HashMap) { for parent_id in &parents { set_relatives(*parent_id, audit_pool); - match audit_pool.get_mut(&parent_id) { - Some(parent) => { - ancestors.insert(*parent_id); - parent.children.insert(txid); - for ancestor in &parent.ancestors { - ancestors.insert(*ancestor); - } + if let Some(parent) = audit_pool.get_mut(parent_id) { + ancestors.insert(*parent_id); + parent.children.insert(txid); + for ancestor in &parent.ancestors { + ancestors.insert(*ancestor); } - - None => {} } } @@ -256,7 +262,7 @@ fn set_relatives(txid: u32, audit_pool: &mut HashMap) { let mut total_sigops: u32 = 0; for ancestor_id in &ancestors { - let ancestor = audit_pool.get(&ancestor_id).unwrap(); + let ancestor = audit_pool.get(ancestor_id).unwrap(); total_fee += ancestor.fee; total_weight += ancestor.weight; total_sigops += ancestor.sigops; @@ -268,10 +274,10 @@ fn set_relatives(txid: u32, audit_pool: &mut HashMap) { tx.ancestor_weight = tx.weight + total_weight; tx.ancestor_sigops = tx.sigops + total_sigops; tx.score = (tx.ancestor_fee as f64) - / (if tx.ancestor_weight != 0 { - tx.ancestor_weight as f64 / 4.0 - } else { + / (if tx.ancestor_weight == 0 { 1.0 + } else { + tx.ancestor_weight as f64 / 4.0 }); tx.relatives_set_flag = true; } @@ -302,7 +308,7 @@ fn update_descendants( } else { return; } - while descendant_stack.len() > 0 { + while !descendant_stack.is_empty() { let next_txid: u32 = descendant_stack.pop().unwrap(); if let Some(descendant) = audit_pool.get_mut(&next_txid) { // remove root tx as ancestor @@ -312,10 +318,10 @@ fn update_descendants( descendant.ancestor_sigops -= root_sigops; let current_score = descendant.score; descendant.score = (descendant.ancestor_fee as f64) - / (if descendant.ancestor_weight != 0 { - descendant.ancestor_weight as f64 / 4.0 - } else { + / (if descendant.ancestor_weight == 0 { 1.0 + } else { + descendant.ancestor_weight as f64 / 4.0 }); descendant.dependency_rate = descendant.dependency_rate.min(cluster_rate); descendant.modified = true; diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 375575908..1bf06f780 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -1,7 +1,6 @@ use neon::{prelude::*, types::buffer::TypedArray}; use once_cell::sync::Lazy; use std::collections::HashMap; -use std::ops::DerefMut; use std::sync::Mutex; mod audit_transaction; @@ -21,7 +20,7 @@ fn make(mut cx: FunctionContext) -> JsResult { let callback = cx.argument::(1)?.root(&mut cx); let channel = cx.channel(); - let buffer = mempool_arg.as_slice(&mut cx); + let buffer = mempool_arg.as_slice(&cx); let mut map = HashMap::new(); for tx in ThreadTransaction::batch_from_buffer(buffer) { @@ -49,12 +48,12 @@ fn update(mut cx: FunctionContext) -> JsResult { let channel = cx.channel(); let mut map = THREAD_TRANSACTIONS.lock().unwrap(); - let new_tx_buffer = new_txs_arg.as_slice(&mut cx); + let new_tx_buffer = new_txs_arg.as_slice(&cx); for tx in ThreadTransaction::batch_from_buffer(new_tx_buffer) { map.insert(tx.uid, tx); } - let remove_tx_buffer = remove_txs_arg.as_slice(&mut cx); + let remove_tx_buffer = remove_txs_arg.as_slice(&cx); for txid in &utils::txids_from_buffer(remove_tx_buffer) { map.remove(txid); } @@ -68,7 +67,7 @@ fn update(mut cx: FunctionContext) -> JsResult { fn run_in_thread(channel: Channel, callback: Root) { std::thread::spawn(move || { let mut map = THREAD_TRANSACTIONS.lock().unwrap(); - let (blocks, rates, clusters) = gbt::gbt(map.deref_mut()).unwrap(); + let (blocks, rates, clusters) = gbt::gbt(&mut map).unwrap(); drop(map); channel.send(move |mut cx| { diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs index bfcd17932..79f93746b 100644 --- a/backend/rust-gbt/src/thread_transaction.rs +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -36,7 +36,7 @@ impl ThreadTransaction { fee_per_vsize, effective_fee_per_vsize, inputs, - }) + }); } transactions From 920232be4cb70011d6922c20a32e68a7fec47e15 Mon Sep 17 00:00:00 2001 From: junderw Date: Fri, 23 Jun 2023 22:07:43 -0700 Subject: [PATCH 473/782] Use Cargo workspace Cargo workspace in the root will help make the IDE experience universal. Cargo.lock and the target directory for build artifacts will be in the root of the mempool repository (with ./target ignored by git). --- .gitignore | 1 + .vscode/settings.json | 5 +---- backend/rust-gbt/Cargo.lock => Cargo.lock | 0 Cargo.toml | 4 ++++ backend/rust-gbt/.gitignore | 1 - 5 files changed, 6 insertions(+), 5 deletions(-) rename backend/rust-gbt/Cargo.lock => Cargo.lock (100%) create mode 100644 Cargo.toml diff --git a/.gitignore b/.gitignore index b41b0db08..4f19f2522 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ backend/mempool-config.json *.swp frontend/src/resources/config.template.js frontend/src/resources/config.js +target diff --git a/.vscode/settings.json b/.vscode/settings.json index 8ff18083a..692791184 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,5 @@ { "editor.tabSize": 2, "typescript.preferences.importModuleSpecifier": "relative", - "typescript.tsdk": "./backend/node_modules/typescript/lib", - "rust-analyzer.linkedProjects": [ - "./backend/rust-gbt/Cargo.toml" - ] + "typescript.tsdk": "./backend/node_modules/typescript/lib" } \ No newline at end of file diff --git a/backend/rust-gbt/Cargo.lock b/Cargo.lock similarity index 100% rename from backend/rust-gbt/Cargo.lock rename to Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..e682bbcbc --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "./backend/rust-gbt", +] \ No newline at end of file diff --git a/backend/rust-gbt/.gitignore b/backend/rust-gbt/.gitignore index 6ca71fb5f..17ca706a8 100644 --- a/backend/rust-gbt/.gitignore +++ b/backend/rust-gbt/.gitignore @@ -1,4 +1,3 @@ -target index.node **/node_modules **/.DS_Store From d2a47b92c85af07ea4cae27b2525fde51ebc792e Mon Sep 17 00:00:00 2001 From: junderw Date: Fri, 23 Jun 2023 23:06:13 -0700 Subject: [PATCH 474/782] Move conversion logic to struct file --- backend/rust-gbt/src/audit_transaction.rs | 26 +++++++++++++++++++++++ backend/rust-gbt/src/gbt.rs | 22 +------------------ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 1bf9a049e..90fe275ae 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -1,3 +1,4 @@ +use crate::thread_transaction::ThreadTransaction; use std::{ cmp::Ordering, collections::HashSet, @@ -55,3 +56,28 @@ impl Ord for AuditTransaction { self.partial_cmp(other).unwrap() } } + +impl AuditTransaction { + pub fn from_thread_transaction(tx: &ThreadTransaction) -> Self { + AuditTransaction { + uid: tx.uid, + fee: tx.fee, + weight: tx.weight, + sigops: tx.sigops, + fee_per_vsize: tx.fee_per_vsize, + effective_fee_per_vsize: tx.effective_fee_per_vsize, + dependency_rate: f64::INFINITY, + inputs: tx.inputs.clone(), + relatives_set_flag: false, + ancestors: HashSet::new(), + children: HashSet::new(), + ancestor_fee: tx.fee, + ancestor_weight: tx.weight, + ancestor_sigops: tx.sigops, + score: 0.0, + used: false, + modified: false, + dirty: false, + } + } +} diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 6cea51554..912ec5956 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -1,7 +1,6 @@ use priority_queue::PriorityQueue; use std::cmp::Ordering; use std::collections::{HashMap, HashSet, VecDeque}; -use std::f64::INFINITY; use crate::audit_transaction::AuditTransaction; use crate::thread_transaction::ThreadTransaction; @@ -60,26 +59,7 @@ fn make_block_templates(mempool: &mut HashMap) -> Option // Initialize working structs for (uid, tx) in mempool { - let audit_tx = AuditTransaction { - uid: tx.uid, - fee: tx.fee, - weight: tx.weight, - sigops: tx.sigops, - fee_per_vsize: tx.fee_per_vsize, - effective_fee_per_vsize: tx.effective_fee_per_vsize, - dependency_rate: INFINITY, - inputs: tx.inputs.clone(), - relatives_set_flag: false, - ancestors: HashSet::new(), - children: HashSet::new(), - ancestor_fee: tx.fee, - ancestor_weight: tx.weight, - ancestor_sigops: tx.sigops, - score: 0.0, - used: false, - modified: false, - dirty: false, - }; + let audit_tx = AuditTransaction::from_thread_transaction(tx); audit_pool.insert(audit_tx.uid, audit_tx); mempool_array.push_back(*uid); } From 0f1f151d65aa0ac5cfb8dca97d0a7425e1acca5c Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 09:23:09 -0700 Subject: [PATCH 475/782] Remove empty function --- backend/rust-gbt/src/gbt.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 912ec5956..9cab724a4 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -43,16 +43,12 @@ impl Ord for TxPriority { /// 3. A 2D Vector of transaction IDs representing clusters of dependent mempool transactions pub type GbtResult = (Vec>, Vec<(u32, f64)>, Vec>); -pub fn gbt(mempool: &mut HashMap) -> Option { - make_block_templates(mempool) -} - /* * Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core * (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) * Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts */ -fn make_block_templates(mempool: &mut HashMap) -> Option { +pub fn gbt(mempool: &mut HashMap) -> Option { let mut audit_pool: HashMap = HashMap::new(); let mut mempool_array: VecDeque = VecDeque::new(); let mut cluster_array: Vec> = Vec::new(); From 2d4963c2dfdcdf523a45192457c4465bb0e5da00 Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 11:21:58 -0700 Subject: [PATCH 476/782] Feature: Use napi-rs instead of neon --- Cargo.lock | 152 ++++++++++++----- Cargo.toml | 6 +- backend/rust-gbt/.gitignore | 2 +- backend/rust-gbt/Cargo.toml | 8 +- backend/rust-gbt/build.rs | 3 + backend/rust-gbt/index.d.ts | 13 ++ backend/rust-gbt/index.js | 259 +++++++++++++++++++++++++++++ backend/rust-gbt/package-lock.json | 22 ++- backend/rust-gbt/package.json | 22 ++- backend/rust-gbt/src/gbt.rs | 33 ++-- backend/rust-gbt/src/lib.rs | 135 +++++---------- 11 files changed, 489 insertions(+), 166 deletions(-) create mode 100644 backend/rust-gbt/build.rs create mode 100644 backend/rust-gbt/index.d.ts create mode 100644 backend/rust-gbt/index.js diff --git a/Cargo.lock b/Cargo.lock index d8f1bd6ad..350e25fb7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,27 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aho-corasick" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +dependencies = [ + "memchr", +] + [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "bitflags" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbe3c979c178231552ecba20214a8272df4e09f232a87aef4320cf06539aded" + [[package]] name = "bytes" version = "1.4.0" @@ -20,12 +35,33 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "ctor" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1586fa608b1dab41f667475b4a41faec5ba680aee428bfa5de4ea520fdc6e901" +dependencies = [ + "quote", + "syn 2.0.20", +] + [[package]] name = "gbt" version = "0.1.0" dependencies = [ "bytes", - "neon", + "napi", + "napi-build", + "napi-derive", "once_cell", "priority-queue", ] @@ -48,53 +84,75 @@ dependencies = [ [[package]] name = "libloading" -version = "0.6.7" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ "cfg-if", "winapi", ] [[package]] -name = "neon" -version = "0.10.1" +name = "memchr" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e15415261d880aed48122e917a45e87bb82cf0260bb6db48bbab44b7464373" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "napi" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede2d12cd6fce44da537a4be1f5510c73be2506c2e32dfaaafd1f36968f3a0e" dependencies = [ - "neon-build", - "neon-macros", - "neon-runtime", - "semver", - "smallvec", + "bitflags", + "ctor", + "napi-derive", + "napi-sys", + "once_cell", ] [[package]] -name = "neon-build" -version = "0.10.1" +name = "napi-build" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bac98a702e71804af3dacfde41edde4a16076a7bbe889ae61e56e18c5b1c811" +checksum = "882a73d9ef23e8dc2ebbffb6a6ae2ef467c0f18ac10711e4cc59c5485d41df0e" [[package]] -name = "neon-macros" -version = "0.10.1" +name = "napi-derive" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7288eac8b54af7913c60e0eb0e2a7683020dffa342ab3fd15e28f035ba897cf" -dependencies = [ - "quote", - "syn", - "syn-mid", -] - -[[package]] -name = "neon-runtime" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4676720fa8bb32c64c3d9f49c47a47289239ec46b4bdb66d0913cc512cb0daca" +checksum = "da1c6a8fa84d549aa8708fcd062372bf8ec6e849de39016ab921067d21bde367" dependencies = [ "cfg-if", + "convert_case", + "napi-derive-backend", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "napi-derive-backend" +version = "1.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20bbc7c69168d06a848f925ec5f0e0997f98e8c8d4f2cc30157f0da51c009e17" +dependencies = [ + "convert_case", + "once_cell", + "proc-macro2", + "quote", + "regex", + "semver", + "syn 1.0.109", +] + +[[package]] +name = "napi-sys" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "166b5ef52a3ab5575047a9fe8d4a030cdd0f63c96f071cd6907674453b07bae3" +dependencies = [ "libloading", - "smallvec", ] [[package]] @@ -132,25 +190,27 @@ dependencies = [ ] [[package]] -name = "semver" -version = "0.9.0" +name = "regex" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390" dependencies = [ - "semver-parser", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "semver-parser" -version = "0.7.0" +name = "regex-syntax" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] -name = "smallvec" -version = "1.10.0" +name = "semver" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "syn" @@ -164,14 +224,14 @@ dependencies = [ ] [[package]] -name = "syn-mid" -version = "0.5.3" +name = "syn" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa8e7560a164edb1621a55d18a0c59abf49d360f47aa7b821061dd7eea7fac9" +checksum = "fcb8d4cebc40aa517dfb69618fa647a346562e67228e2236ae0042ee6ac14775" dependencies = [ "proc-macro2", "quote", - "syn", + "unicode-ident", ] [[package]] @@ -180,6 +240,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index e682bbcbc..59562297c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,8 @@ [workspace] members = [ "./backend/rust-gbt", -] \ No newline at end of file +] + +[profile.release] +lto = true +codegen-units = 1 diff --git a/backend/rust-gbt/.gitignore b/backend/rust-gbt/.gitignore index 17ca706a8..6b0a536a0 100644 --- a/backend/rust-gbt/.gitignore +++ b/backend/rust-gbt/.gitignore @@ -1,4 +1,4 @@ -index.node +*.node **/node_modules **/.DS_Store npm-debug.log* diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml index 9ff511966..bf5073240 100644 --- a/backend/rust-gbt/Cargo.toml +++ b/backend/rust-gbt/Cargo.toml @@ -15,8 +15,8 @@ crate-type = ["cdylib"] priority-queue = "1.3.2" bytes = "1.4.0" once_cell = "1.18.0" +napi = { version = "2.13.2", features = ["napi8"] } +napi-derive = "2.13.0" -[dependencies.neon] -version = "0.10" -default-features = false -features = ["napi-6","channel-api"] +[build-dependencies] +napi-build = "2.0.1" diff --git a/backend/rust-gbt/build.rs b/backend/rust-gbt/build.rs new file mode 100644 index 000000000..0f1b01002 --- /dev/null +++ b/backend/rust-gbt/build.rs @@ -0,0 +1,3 @@ +fn main() { + napi_build::setup(); +} diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts new file mode 100644 index 000000000..00d7f05a9 --- /dev/null +++ b/backend/rust-gbt/index.d.ts @@ -0,0 +1,13 @@ +/* tslint:disable */ +/* eslint-disable */ + +/* auto-generated by NAPI-RS */ + +export function make(mempoolBuffer: Uint8Array, callback: (arg0: GbtResult) => void): void +export function update(newTxs: Uint8Array, removeTxs: Uint8Array, callback: (arg0: GbtResult) => void): void +export class GbtResult { + blocks: Array> + clusters: Array> + rates: Array> + constructor(blocks: Array>, clusters: Array>, rates: Array>) +} diff --git a/backend/rust-gbt/index.js b/backend/rust-gbt/index.js new file mode 100644 index 000000000..5caf75b42 --- /dev/null +++ b/backend/rust-gbt/index.js @@ -0,0 +1,259 @@ +/* tslint:disable */ +/* eslint-disable */ +/* prettier-ignore */ + +/* auto-generated by NAPI-RS */ + +const { existsSync, readFileSync } = require('fs') +const { join } = require('path') + +const { platform, arch } = process + +let nativeBinding = null +let localFileExisted = false +let loadError = null + +function isMusl() { + // For Node 10 + if (!process.report || typeof process.report.getReport !== 'function') { + try { + const lddPath = require('child_process').execSync('which ldd').toString().trim() + return readFileSync(lddPath, 'utf8').includes('musl') + } catch (e) { + return true + } + } else { + const { glibcVersionRuntime } = process.report.getReport().header + return !glibcVersionRuntime + } +} + +switch (platform) { + case 'android': + switch (arch) { + case 'arm64': + localFileExisted = existsSync(join(__dirname, 'gbt.android-arm64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.android-arm64.node') + } else { + nativeBinding = require('gbt-android-arm64') + } + } catch (e) { + loadError = e + } + break + case 'arm': + localFileExisted = existsSync(join(__dirname, 'gbt.android-arm-eabi.node')) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.android-arm-eabi.node') + } else { + nativeBinding = require('gbt-android-arm-eabi') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Android ${arch}`) + } + break + case 'win32': + switch (arch) { + case 'x64': + localFileExisted = existsSync( + join(__dirname, 'gbt.win32-x64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.win32-x64-msvc.node') + } else { + nativeBinding = require('gbt-win32-x64-msvc') + } + } catch (e) { + loadError = e + } + break + case 'ia32': + localFileExisted = existsSync( + join(__dirname, 'gbt.win32-ia32-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.win32-ia32-msvc.node') + } else { + nativeBinding = require('gbt-win32-ia32-msvc') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'gbt.win32-arm64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.win32-arm64-msvc.node') + } else { + nativeBinding = require('gbt-win32-arm64-msvc') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Windows: ${arch}`) + } + break + case 'darwin': + localFileExisted = existsSync(join(__dirname, 'gbt.darwin-universal.node')) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.darwin-universal.node') + } else { + nativeBinding = require('gbt-darwin-universal') + } + break + } catch {} + switch (arch) { + case 'x64': + localFileExisted = existsSync(join(__dirname, 'gbt.darwin-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.darwin-x64.node') + } else { + nativeBinding = require('gbt-darwin-x64') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'gbt.darwin-arm64.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.darwin-arm64.node') + } else { + nativeBinding = require('gbt-darwin-arm64') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on macOS: ${arch}`) + } + break + case 'freebsd': + if (arch !== 'x64') { + throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) + } + localFileExisted = existsSync(join(__dirname, 'gbt.freebsd-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.freebsd-x64.node') + } else { + nativeBinding = require('gbt-freebsd-x64') + } + } catch (e) { + loadError = e + } + break + case 'linux': + switch (arch) { + case 'x64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'gbt.linux-x64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.linux-x64-musl.node') + } else { + nativeBinding = require('gbt-linux-x64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'gbt.linux-x64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.linux-x64-gnu.node') + } else { + nativeBinding = require('gbt-linux-x64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'gbt.linux-arm64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.linux-arm64-musl.node') + } else { + nativeBinding = require('gbt-linux-arm64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'gbt.linux-arm64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.linux-arm64-gnu.node') + } else { + nativeBinding = require('gbt-linux-arm64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm': + localFileExisted = existsSync( + join(__dirname, 'gbt.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./gbt.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('gbt-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Linux: ${arch}`) + } + break + default: + throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) +} + +if (!nativeBinding) { + if (loadError) { + throw loadError + } + throw new Error(`Failed to load native binding`) +} + +const { make, update, GbtResult } = nativeBinding + +module.exports.make = make +module.exports.update = update +module.exports.GbtResult = GbtResult diff --git a/backend/rust-gbt/package-lock.json b/backend/rust-gbt/package-lock.json index 6a6cc5fb7..5e23e425e 100644 --- a/backend/rust-gbt/package-lock.json +++ b/backend/rust-gbt/package-lock.json @@ -9,16 +9,26 @@ "version": "0.1.0", "hasInstallScript": true, "devDependencies": { - "cargo-cp-artifact": "^0.1" + "@napi-rs/cli": "^2.16.1" + }, + "engines": { + "node": ">= 12" } }, - "node_modules/cargo-cp-artifact": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.8.tgz", - "integrity": "sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA==", + "node_modules/@napi-rs/cli": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.16.1.tgz", + "integrity": "sha512-L0Gr5iEQIDEbvWdDr1HUaBOxBSHL1VZhWSk1oryawoT8qJIY+KGfLFelU+Qma64ivCPbxYpkfPoKYVG3rcoGIA==", "dev": true, "bin": { - "cargo-cp-artifact": "bin/cargo-cp-artifact.js" + "napi": "scripts/index.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" } } } diff --git a/backend/rust-gbt/package.json b/backend/rust-gbt/package.json index bb45af85e..3c6c7a8f5 100644 --- a/backend/rust-gbt/package.json +++ b/backend/rust-gbt/package.json @@ -2,16 +2,32 @@ "name": "gbt", "version": "0.1.0", "description": "An inefficient re-implementation of the getBlockTemplate algorithm in Rust", - "main": "index.node", + "main": "index.js", + "types": "index.d.ts", "scripts": { - "build": "cargo-cp-artifact -nc index.node -- cargo build --message-format=json-render-diagnostics", + "artifacts": "napi artifacts", + "build": "napi build --platform", "build-debug": "npm run build --", "build-release": "npm run build -- --release", "install": "npm run build-release", + "prepublishOnly": "napi prepublish -t npm", "test": "cargo test" }, "author": "mononaut", + "napi": { + "name": "gbt", + "triples": { + "defaults": false, + "additional": [ + "x86_64-unknown-linux-gnu", + "x86_64-unknown-freebsd" + ] + } + }, "devDependencies": { - "cargo-cp-artifact": "^0.1" + "@napi-rs/cli": "^2.16.1" + }, + "engines": { + "node": ">= 12" } } \ No newline at end of file diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 9cab724a4..b9dab0fd3 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -1,9 +1,12 @@ use priority_queue::PriorityQueue; -use std::cmp::Ordering; -use std::collections::{HashMap, HashSet, VecDeque}; +use std::{ + cmp::Ordering, + collections::{HashMap, HashSet, VecDeque}, +}; -use crate::audit_transaction::AuditTransaction; -use crate::thread_transaction::ThreadTransaction; +use crate::{ + audit_transaction::AuditTransaction, thread_transaction::ThreadTransaction, GbtResult, +}; const BLOCK_WEIGHT_UNITS: u32 = 4_000_000; const BLOCK_SIGOPS: u32 = 80_000; @@ -35,14 +38,6 @@ impl Ord for TxPriority { } } -/// The result from calling the gbt function. -/// -/// This tuple contains the following: -/// 1. A 2D Vector of transaction IDs (u32), the inner Vecs each represent a block. -/// 2. A Vector of tuples containing transaction IDs (u32) and effective fee per vsize (f64) -/// 3. A 2D Vector of transaction IDs representing clusters of dependent mempool transactions -pub type GbtResult = (Vec>, Vec<(u32, f64)>, Vec>); - /* * Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core * (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) @@ -51,7 +46,7 @@ pub type GbtResult = (Vec>, Vec<(u32, f64)>, Vec>); pub fn gbt(mempool: &mut HashMap) -> Option { let mut audit_pool: HashMap = HashMap::new(); let mut mempool_array: VecDeque = VecDeque::new(); - let mut cluster_array: Vec> = Vec::new(); + let mut clusters: Vec> = Vec::new(); // Initialize working structs for (uid, tx) in mempool { @@ -130,7 +125,7 @@ pub fn gbt(mempool: &mut HashMap) -> Option { package.sort_unstable_by_key(|a| 0 - a.1); if is_cluster { - cluster_array.push(cluster); + clusters.push(cluster); } let cluster_rate = next_tx @@ -197,14 +192,18 @@ pub fn gbt(mempool: &mut HashMap) -> Option { } // make a list of dirty transactions and their new rates - let mut rates: Vec<(u32, f64)> = Vec::new(); + let mut rates: Vec> = Vec::new(); for (txid, tx) in audit_pool { if tx.dirty { - rates.push((txid, tx.effective_fee_per_vsize)); + rates.push(vec![txid as f64, tx.effective_fee_per_vsize]); } } - Some((blocks, rates, cluster_array)) + Some(GbtResult { + blocks, + rates, + clusters, + }) } fn set_relatives(txid: u32, audit_pool: &mut HashMap) { diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 1bf06f780..e0c6ebde5 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -1,4 +1,6 @@ -use neon::{prelude::*, types::buffer::TypedArray}; +use napi::bindgen_prelude::*; +use napi_derive::napi; + use once_cell::sync::Lazy; use std::collections::HashMap; use std::sync::Mutex; @@ -12,115 +14,66 @@ use thread_transaction::ThreadTransaction; static THREAD_TRANSACTIONS: Lazy>> = Lazy::new(|| Mutex::new(HashMap::new())); -fn make(mut cx: FunctionContext) -> JsResult { - let mempool_arg = cx - .argument::(0)? - .root(&mut cx) - .into_inner(&mut cx); - let callback = cx.argument::(1)?.root(&mut cx); - let channel = cx.channel(); - - let buffer = mempool_arg.as_slice(&cx); - +#[napi] +pub fn make(mempool_buffer: Uint8Array, callback: F) -> Result<()> +where + F: Fn(GbtResult) -> Result<()>, +{ let mut map = HashMap::new(); - for tx in ThreadTransaction::batch_from_buffer(buffer) { + for tx in ThreadTransaction::batch_from_buffer(&mempool_buffer) { map.insert(tx.uid, tx); } let mut global_map = THREAD_TRANSACTIONS.lock().unwrap(); *global_map = map; - run_in_thread(channel, callback); - - Ok(cx.undefined()) + run_in_thread(callback) } -fn update(mut cx: FunctionContext) -> JsResult { - let new_txs_arg = cx - .argument::(0)? - .root(&mut cx) - .into_inner(&mut cx); - let remove_txs_arg = cx - .argument::(1)? - .root(&mut cx) - .into_inner(&mut cx); - let callback = cx.argument::(2)?.root(&mut cx); - let channel = cx.channel(); - +#[napi] +pub fn update(new_txs: Uint8Array, remove_txs: Uint8Array, callback: F) -> Result<()> +where + F: Fn(GbtResult) -> Result<()>, +{ let mut map = THREAD_TRANSACTIONS.lock().unwrap(); - let new_tx_buffer = new_txs_arg.as_slice(&cx); - for tx in ThreadTransaction::batch_from_buffer(new_tx_buffer) { + for tx in ThreadTransaction::batch_from_buffer(&new_txs) { map.insert(tx.uid, tx); } - - let remove_tx_buffer = remove_txs_arg.as_slice(&cx); - for txid in &utils::txids_from_buffer(remove_tx_buffer) { + for txid in &utils::txids_from_buffer(&remove_txs) { map.remove(txid); } drop(map); - run_in_thread(channel, callback); - - Ok(cx.undefined()) + run_in_thread(callback) } -fn run_in_thread(channel: Channel, callback: Root) { - std::thread::spawn(move || { - let mut map = THREAD_TRANSACTIONS.lock().unwrap(); - let (blocks, rates, clusters) = gbt::gbt(&mut map).unwrap(); - drop(map); +/// The result from calling the gbt function. +/// +/// This tuple contains the following: +/// blocks: A 2D Vector of transaction IDs (u32), the inner Vecs each represent a block. +/// clusters: A 2D Vector of transaction IDs representing clusters of dependent mempool transactions +/// rates: A Vector of tuples containing transaction IDs (u32) and effective fee per vsize (f64) +#[napi(constructor)] +pub struct GbtResult { + pub blocks: Vec>, + pub clusters: Vec>, + pub rates: Vec>, // Tuples not supported. u32 fits inside f64 +} - channel.send(move |mut cx| { - let result = JsObject::new(&mut cx); - - let js_blocks = JsArray::new(&mut cx, blocks.len() as u32); - for (i, block) in blocks.iter().enumerate() { - let inner = JsArray::new(&mut cx, block.len() as u32); - for (j, uid) in block.iter().enumerate() { - let v = cx.number(*uid); - inner.set(&mut cx, j as u32, v)?; - } - js_blocks.set(&mut cx, i as u32, inner)?; - } - - let js_clusters = JsArray::new(&mut cx, clusters.len() as u32); - for (i, cluster) in clusters.iter().enumerate() { - let inner = JsArray::new(&mut cx, cluster.len() as u32); - for (j, uid) in cluster.iter().enumerate() { - let v = cx.number(*uid); - inner.set(&mut cx, j as u32, v)?; - } - js_clusters.set(&mut cx, i as u32, inner)?; - } - - let js_rates = JsArray::new(&mut cx, rates.len() as u32); - for (i, (uid, rate)) in rates.iter().enumerate() { - let inner = JsArray::new(&mut cx, 2); - let js_uid = cx.number(*uid); - let js_rate = cx.number(*rate); - inner.set(&mut cx, 0, js_uid)?; - inner.set(&mut cx, 1, js_rate)?; - js_rates.set(&mut cx, i as u32, inner)?; - } - - result.set(&mut cx, "blocks", js_blocks)?; - result.set(&mut cx, "clusters", js_clusters)?; - result.set(&mut cx, "rates", js_rates)?; - - let callback = callback.into_inner(&mut cx); - let this = cx.undefined(); - let args = vec![result.upcast()]; - - callback.call(&mut cx, this, args)?; - - Ok(()) - }); +fn run_in_thread(callback: F) -> Result<()> +where + F: Fn(GbtResult) -> Result<()>, +{ + let handle = std::thread::spawn(|| -> Result { + let mut map = THREAD_TRANSACTIONS + .lock() + .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; + gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed")) }); -} -#[neon::main] -fn main(mut cx: ModuleContext) -> NeonResult<()> { - cx.export_function("make", make)?; - cx.export_function("update", update)?; - Ok(()) + callback( + handle + .join() + .map_err(|_| napi::Error::from_reason("thread panicked"))??, + ) } From 152d2c364bb0e8dbfe0445fea16e79797db5819d Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 11:40:25 -0700 Subject: [PATCH 477/782] Update TS side --- backend/src/api/mempool-blocks.ts | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index b82946a9e..ed8fbb172 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,3 +1,4 @@ +import * as napiAddon from '../../rust-gbt'; import logger from '../logger'; import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, AuditTransaction } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; @@ -5,8 +6,6 @@ import config from '../config'; import { Worker } from 'worker_threads'; import path from 'path'; -const neonAddon = require('../../rust-gbt'); - class MempoolBlocks { private mempoolBlocks: MempoolBlockWithTransactions[] = []; private mempoolBlockDeltas: MempoolBlockDelta[] = []; @@ -342,7 +341,14 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result try { - const { blocks, rates, clusters } = this.convertNeonResultTxids(await new Promise((resolve) => { neonAddon.make(mempoolBuffer, resolve); })); + const { blocks, rates, clusters } = this.convertNapiResultTxids( + await new Promise((resolve) => { + napiAddon.make( + new Uint8Array(mempoolBuffer), + resolve, + ); + }) + ); this.rustInitialized = true; const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); logger.debug(`RUST makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); @@ -374,7 +380,15 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result try { - const { blocks, rates, clusters } = this.convertNeonResultTxids(await new Promise((resolve) => { neonAddon.update(addedBuffer, removedBuffer, resolve); })); + const { blocks, rates, clusters } = this.convertNapiResultTxids( + await new Promise((resolve) => { + napiAddon.update( + new Uint8Array(addedBuffer), + new Uint8Array(removedBuffer), + resolve, + ); + }) + ); this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); } catch (e) { @@ -563,7 +577,7 @@ class MempoolBlocks { return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; } - private convertNeonResultTxids({ blocks, rates, clusters }: { blocks: number[][], rates: number[][], clusters: number[][]}) + private convertNapiResultTxids({ blocks, rates, clusters }: { blocks: number[][], rates: number[][], clusters: number[][]}) : { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }} { const rateMap = new Map(); const clusterMap = new Map(); From 4661bea2f0cf52ce8de6d3d21bf60dac79afa63d Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 12:21:33 -0700 Subject: [PATCH 478/782] Use N-API ThreadsafeFunction --- backend/rust-gbt/index.d.ts | 12 +++++++-- backend/rust-gbt/src/lib.rs | 50 +++++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index 00d7f05a9..3c8875a69 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -3,8 +3,16 @@ /* auto-generated by NAPI-RS */ -export function make(mempoolBuffer: Uint8Array, callback: (arg0: GbtResult) => void): void -export function update(newTxs: Uint8Array, removeTxs: Uint8Array, callback: (arg0: GbtResult) => void): void +export function make(mempoolBuffer: Uint8Array, callback: (result: GbtResult) => void): void +export function update(newTxs: Uint8Array, removeTxs: Uint8Array, callback: (result: GbtResult) => void): void +/** + * The result from calling the gbt function. + * + * This tuple contains the following: + * blocks: A 2D Vector of transaction IDs (u32), the inner Vecs each represent a block. + * clusters: A 2D Vector of transaction IDs representing clusters of dependent mempool transactions + * rates: A Vector of tuples containing transaction IDs (u32) and effective fee per vsize (f64) + */ export class GbtResult { blocks: Array> clusters: Array> diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index e0c6ebde5..b59c11bc9 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -1,4 +1,7 @@ -use napi::bindgen_prelude::*; +use napi::{ + bindgen_prelude::*, + threadsafe_function::{ErrorStrategy, ThreadsafeFunction, ThreadsafeFunctionCallMode}, +}; use napi_derive::napi; use once_cell::sync::Lazy; @@ -11,14 +14,14 @@ mod thread_transaction; mod utils; use thread_transaction::ThreadTransaction; +/// Used for ThreadsafeFunction's queue size parameter +const UNBOUNDED_QUEUE: usize = 0; + static THREAD_TRANSACTIONS: Lazy>> = Lazy::new(|| Mutex::new(HashMap::new())); -#[napi] -pub fn make(mempool_buffer: Uint8Array, callback: F) -> Result<()> -where - F: Fn(GbtResult) -> Result<()>, -{ +#[napi(ts_args_type = "mempoolBuffer: Uint8Array, callback: (result: GbtResult) => void")] +pub fn make(mempool_buffer: Uint8Array, callback: JsFunction) -> Result<()> { let mut map = HashMap::new(); for tx in ThreadTransaction::batch_from_buffer(&mempool_buffer) { map.insert(tx.uid, tx); @@ -30,11 +33,10 @@ where run_in_thread(callback) } -#[napi] -pub fn update(new_txs: Uint8Array, remove_txs: Uint8Array, callback: F) -> Result<()> -where - F: Fn(GbtResult) -> Result<()>, -{ +#[napi( + ts_args_type = "newTxs: Uint8Array, removeTxs: Uint8Array, callback: (result: GbtResult) => void" +)] +pub fn update(new_txs: Uint8Array, remove_txs: Uint8Array, callback: JsFunction) -> Result<()> { let mut map = THREAD_TRANSACTIONS.lock().unwrap(); for tx in ThreadTransaction::batch_from_buffer(&new_txs) { map.insert(tx.uid, tx); @@ -60,20 +62,24 @@ pub struct GbtResult { pub rates: Vec>, // Tuples not supported. u32 fits inside f64 } -fn run_in_thread(callback: F) -> Result<()> -where - F: Fn(GbtResult) -> Result<()>, -{ - let handle = std::thread::spawn(|| -> Result { +fn run_in_thread(callback: JsFunction) -> Result<()> { + let thread_safe_callback: ThreadsafeFunction = + callback.create_threadsafe_function(UNBOUNDED_QUEUE, |ctx| Ok(vec![ctx.value]))?; + + let handle = std::thread::spawn(move || { let mut map = THREAD_TRANSACTIONS .lock() .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; - gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed")) + let result = gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed"))?; + + // Note: A call mode of Blocking does not mean it will block, but rather it tells + // the N-API what to do in the event of a full queue. + // The queue will never be full, so Blocking is fine. + thread_safe_callback.call(result, ThreadsafeFunctionCallMode::Blocking); + Ok(()) }); - callback( - handle - .join() - .map_err(|_| napi::Error::from_reason("thread panicked"))??, - ) + handle + .join() + .map_err(|_| napi::Error::from_reason("thread panicked"))? } From dfe24ed9d79deda0d0b354c77915f7236377738d Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 16:41:53 -0700 Subject: [PATCH 479/782] Remove all unwrap() calls --- backend/rust-gbt/src/audit_transaction.rs | 2 +- backend/rust-gbt/src/gbt.rs | 19 +++++++++++++------ backend/rust-gbt/src/lib.rs | 8 ++++++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 90fe275ae..438058887 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -53,7 +53,7 @@ impl PartialOrd for AuditTransaction { impl Ord for AuditTransaction { fn cmp(&self, other: &AuditTransaction) -> Ordering { - self.partial_cmp(other).unwrap() + self.partial_cmp(other).expect("score will never be NaN") } } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index b9dab0fd3..e78f81604 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -34,7 +34,7 @@ impl PartialOrd for TxPriority { } impl Ord for TxPriority { fn cmp(&self, other: &Self) -> Ordering { - self.partial_cmp(other).unwrap() + self.partial_cmp(other).expect("score will never be NaN") } } @@ -51,6 +51,7 @@ pub fn gbt(mempool: &mut HashMap) -> Option { // Initialize working structs for (uid, tx) in mempool { let audit_tx = AuditTransaction::from_thread_transaction(tx); + // Safety: audit_pool and mempool_array must always contain the same transactions audit_pool.insert(audit_tx.uid, audit_tx); mempool_array.push_back(*uid); } @@ -62,8 +63,12 @@ pub fn gbt(mempool: &mut HashMap) -> Option { // Sort by descending ancestor score mempool_array.make_contiguous().sort_unstable_by(|a, b| { - let a_tx = audit_pool.get(a).unwrap(); - let b_tx = audit_pool.get(b).unwrap(); + let a_tx = audit_pool + .get(a) + .expect("audit_pool contains exact same txes as mempool_array"); + let b_tx = audit_pool + .get(b) + .expect("audit_pool contains exact same txes as mempool_array"); b_tx.cmp(a_tx) }); @@ -224,6 +229,7 @@ fn set_relatives(txid: u32, audit_pool: &mut HashMap) { set_relatives(*parent_id, audit_pool); if let Some(parent) = audit_pool.get_mut(parent_id) { + // Safety: ancestors must always contain only txes in audit_pool ancestors.insert(*parent_id); parent.children.insert(txid); for ancestor in &parent.ancestors { @@ -237,7 +243,9 @@ fn set_relatives(txid: u32, audit_pool: &mut HashMap) { let mut total_sigops: u32 = 0; for ancestor_id in &ancestors { - let ancestor = audit_pool.get(ancestor_id).unwrap(); + let ancestor = audit_pool + .get(ancestor_id) + .expect("audit_pool contains all ancestors"); total_fee += ancestor.fee; total_weight += ancestor.weight; total_sigops += ancestor.sigops; @@ -283,8 +291,7 @@ fn update_descendants( } else { return; } - while !descendant_stack.is_empty() { - let next_txid: u32 = descendant_stack.pop().unwrap(); + while let Some(next_txid) = descendant_stack.pop() { if let Some(descendant) = audit_pool.get_mut(&next_txid) { // remove root tx as ancestor descendant.ancestors.remove(&root_txid); diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index b59c11bc9..6767a8f64 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -27,7 +27,9 @@ pub fn make(mempool_buffer: Uint8Array, callback: JsFunction) -> Result<()> { map.insert(tx.uid, tx); } - let mut global_map = THREAD_TRANSACTIONS.lock().unwrap(); + let mut global_map = THREAD_TRANSACTIONS + .lock() + .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; *global_map = map; run_in_thread(callback) @@ -37,7 +39,9 @@ pub fn make(mempool_buffer: Uint8Array, callback: JsFunction) -> Result<()> { ts_args_type = "newTxs: Uint8Array, removeTxs: Uint8Array, callback: (result: GbtResult) => void" )] pub fn update(new_txs: Uint8Array, remove_txs: Uint8Array, callback: JsFunction) -> Result<()> { - let mut map = THREAD_TRANSACTIONS.lock().unwrap(); + let mut map = THREAD_TRANSACTIONS + .lock() + .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; for tx in ThreadTransaction::batch_from_buffer(&new_txs) { map.insert(tx.uid, tx); } From 5f161e73c735156b247cca906b14f4153de74844 Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 16:50:17 -0700 Subject: [PATCH 480/782] Check callback status in thread --- backend/rust-gbt/src/lib.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 6767a8f64..23f8f37e4 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -71,16 +71,23 @@ fn run_in_thread(callback: JsFunction) -> Result<()> { callback.create_threadsafe_function(UNBOUNDED_QUEUE, |ctx| Ok(vec![ctx.value]))?; let handle = std::thread::spawn(move || { - let mut map = THREAD_TRANSACTIONS - .lock() - .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; - let result = gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed"))?; + let result = { + let mut map = THREAD_TRANSACTIONS + .lock() + .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; + gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed"))? + }; // Note: A call mode of Blocking does not mean it will block, but rather it tells // the N-API what to do in the event of a full queue. // The queue will never be full, so Blocking is fine. - thread_safe_callback.call(result, ThreadsafeFunctionCallMode::Blocking); - Ok(()) + match thread_safe_callback.call(result, ThreadsafeFunctionCallMode::Blocking) { + Status::Ok => Ok(()), + error => Err(napi::Error::from_reason(format!( + "Callback failure: {}", + error + ))), + } }); handle From 8cfda1a5464e5c16ed2694f090b2102e62c3453c Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 19:28:19 -0700 Subject: [PATCH 481/782] Use tokio async/await instead of callbacks --- Cargo.lock | 110 ++++++++++++++++++++++++++++++ backend/rust-gbt/Cargo.toml | 2 +- backend/rust-gbt/index.d.ts | 4 +- backend/rust-gbt/package.json | 4 +- backend/rust-gbt/src/lib.rs | 81 ++++++++-------------- backend/src/api/mempool-blocks.ts | 14 +--- 6 files changed, 148 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 350e25fb7..7837483d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,6 +72,15 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -82,6 +91,12 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "libc" +version = "0.2.146" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" + [[package]] name = "libloading" version = "0.7.4" @@ -109,6 +124,7 @@ dependencies = [ "napi-derive", "napi-sys", "once_cell", + "tokio", ] [[package]] @@ -155,12 +171,28 @@ dependencies = [ "libloading", ] +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + [[package]] name = "priority-queue" version = "1.3.2" @@ -234,6 +266,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tokio" +version = "1.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +dependencies = [ + "autocfg", + "num_cpus", + "pin-project-lite", + "windows-sys", +] + [[package]] name = "unicode-ident" version = "1.0.9" @@ -267,3 +311,69 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml index bf5073240..a0f593518 100644 --- a/backend/rust-gbt/Cargo.toml +++ b/backend/rust-gbt/Cargo.toml @@ -15,7 +15,7 @@ crate-type = ["cdylib"] priority-queue = "1.3.2" bytes = "1.4.0" once_cell = "1.18.0" -napi = { version = "2.13.2", features = ["napi8"] } +napi = { version = "2.13.2", features = ["napi8", "tokio_rt"] } napi-derive = "2.13.0" [build-dependencies] diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index 3c8875a69..793d78c4e 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -3,8 +3,8 @@ /* auto-generated by NAPI-RS */ -export function make(mempoolBuffer: Uint8Array, callback: (result: GbtResult) => void): void -export function update(newTxs: Uint8Array, removeTxs: Uint8Array, callback: (result: GbtResult) => void): void +export function make(mempoolBuffer: Uint8Array): Promise +export function update(newTxs: Uint8Array, removeTxs: Uint8Array): Promise /** * The result from calling the gbt function. * diff --git a/backend/rust-gbt/package.json b/backend/rust-gbt/package.json index 3c6c7a8f5..57f91e781 100644 --- a/backend/rust-gbt/package.json +++ b/backend/rust-gbt/package.json @@ -7,8 +7,8 @@ "scripts": { "artifacts": "napi artifacts", "build": "napi build --platform", - "build-debug": "npm run build --", - "build-release": "npm run build -- --release", + "build-debug": "npm run build", + "build-release": "npm run build -- --release --strip", "install": "npm run build-release", "prepublishOnly": "napi prepublish -t npm", "test": "cargo test" diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 23f8f37e4..0cdeb74e3 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -1,7 +1,4 @@ -use napi::{ - bindgen_prelude::*, - threadsafe_function::{ErrorStrategy, ThreadsafeFunction, ThreadsafeFunctionCallMode}, -}; +use napi::bindgen_prelude::*; use napi_derive::napi; use once_cell::sync::Lazy; @@ -14,43 +11,41 @@ mod thread_transaction; mod utils; use thread_transaction::ThreadTransaction; -/// Used for ThreadsafeFunction's queue size parameter -const UNBOUNDED_QUEUE: usize = 0; - static THREAD_TRANSACTIONS: Lazy>> = Lazy::new(|| Mutex::new(HashMap::new())); -#[napi(ts_args_type = "mempoolBuffer: Uint8Array, callback: (result: GbtResult) => void")] -pub fn make(mempool_buffer: Uint8Array, callback: JsFunction) -> Result<()> { +#[napi(ts_args_type = "mempoolBuffer: Uint8Array")] +pub async fn make(mempool_buffer: Uint8Array) -> Result { let mut map = HashMap::new(); for tx in ThreadTransaction::batch_from_buffer(&mempool_buffer) { map.insert(tx.uid, tx); } - let mut global_map = THREAD_TRANSACTIONS - .lock() - .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; - *global_map = map; + { + let mut global_map = THREAD_TRANSACTIONS + .lock() + .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; + *global_map = map; + } - run_in_thread(callback) + run_in_thread().await } -#[napi( - ts_args_type = "newTxs: Uint8Array, removeTxs: Uint8Array, callback: (result: GbtResult) => void" -)] -pub fn update(new_txs: Uint8Array, remove_txs: Uint8Array, callback: JsFunction) -> Result<()> { - let mut map = THREAD_TRANSACTIONS - .lock() - .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; - for tx in ThreadTransaction::batch_from_buffer(&new_txs) { - map.insert(tx.uid, tx); +#[napi(ts_args_type = "newTxs: Uint8Array, removeTxs: Uint8Array")] +pub async fn update(new_txs: Uint8Array, remove_txs: Uint8Array) -> Result { + { + let mut map = THREAD_TRANSACTIONS + .lock() + .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; + for tx in ThreadTransaction::batch_from_buffer(&new_txs) { + map.insert(tx.uid, tx); + } + for txid in &utils::txids_from_buffer(&remove_txs) { + map.remove(txid); + } } - for txid in &utils::txids_from_buffer(&remove_txs) { - map.remove(txid); - } - drop(map); - run_in_thread(callback) + run_in_thread().await } /// The result from calling the gbt function. @@ -66,31 +61,15 @@ pub struct GbtResult { pub rates: Vec>, // Tuples not supported. u32 fits inside f64 } -fn run_in_thread(callback: JsFunction) -> Result<()> { - let thread_safe_callback: ThreadsafeFunction = - callback.create_threadsafe_function(UNBOUNDED_QUEUE, |ctx| Ok(vec![ctx.value]))?; - - let handle = std::thread::spawn(move || { - let result = { - let mut map = THREAD_TRANSACTIONS - .lock() - .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; - gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed"))? - }; - - // Note: A call mode of Blocking does not mean it will block, but rather it tells - // the N-API what to do in the event of a full queue. - // The queue will never be full, so Blocking is fine. - match thread_safe_callback.call(result, ThreadsafeFunctionCallMode::Blocking) { - Status::Ok => Ok(()), - error => Err(napi::Error::from_reason(format!( - "Callback failure: {}", - error - ))), - } +async fn run_in_thread() -> Result { + let handle = napi::tokio::task::spawn_blocking(move || { + let mut map = THREAD_TRANSACTIONS + .lock() + .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; + gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed")) }); handle - .join() + .await .map_err(|_| napi::Error::from_reason("thread panicked"))? } diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index ed8fbb172..a4786af7c 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -342,12 +342,7 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result try { const { blocks, rates, clusters } = this.convertNapiResultTxids( - await new Promise((resolve) => { - napiAddon.make( - new Uint8Array(mempoolBuffer), - resolve, - ); - }) + await napiAddon.make(new Uint8Array(mempoolBuffer)), ); this.rustInitialized = true; const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); @@ -381,13 +376,10 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result try { const { blocks, rates, clusters } = this.convertNapiResultTxids( - await new Promise((resolve) => { - napiAddon.update( + await napiAddon.update( new Uint8Array(addedBuffer), new Uint8Array(removedBuffer), - resolve, - ); - }) + ), ); this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); From ded2352cf8b734fbbdb1c97e17431f926b06fe9e Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 23:05:43 -0700 Subject: [PATCH 482/782] Use a class to hold state for Rust GbtGenerator --- backend/rust-gbt/index.d.ts | 7 ++- backend/rust-gbt/index.js | 5 +- backend/rust-gbt/src/gbt.rs | 6 +-- backend/rust-gbt/src/lib.rs | 89 +++++++++++++++++++------------ backend/rust-gbt/src/utils.rs | 58 +++++++++++++++++++- backend/src/api/mempool-blocks.ts | 7 +-- 6 files changed, 126 insertions(+), 46 deletions(-) diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index 793d78c4e..b02a27c45 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -3,8 +3,11 @@ /* auto-generated by NAPI-RS */ -export function make(mempoolBuffer: Uint8Array): Promise -export function update(newTxs: Uint8Array, removeTxs: Uint8Array): Promise +export class GbtGenerator { + constructor() + make(mempoolBuffer: Uint8Array): Promise + update(newTxs: Uint8Array, removeTxs: Uint8Array): Promise +} /** * The result from calling the gbt function. * diff --git a/backend/rust-gbt/index.js b/backend/rust-gbt/index.js index 5caf75b42..8680501d1 100644 --- a/backend/rust-gbt/index.js +++ b/backend/rust-gbt/index.js @@ -252,8 +252,7 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { make, update, GbtResult } = nativeBinding +const { GbtGenerator, GbtResult } = nativeBinding -module.exports.make = make -module.exports.update = update +module.exports.GbtGenerator = GbtGenerator module.exports.GbtResult = GbtResult diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index e78f81604..f657c013a 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -4,9 +4,7 @@ use std::{ collections::{HashMap, HashSet, VecDeque}, }; -use crate::{ - audit_transaction::AuditTransaction, thread_transaction::ThreadTransaction, GbtResult, -}; +use crate::{audit_transaction::AuditTransaction, GbtResult, ThreadTransactionsMap}; const BLOCK_WEIGHT_UNITS: u32 = 4_000_000; const BLOCK_SIGOPS: u32 = 80_000; @@ -43,7 +41,7 @@ impl Ord for TxPriority { * (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) * Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts */ -pub fn gbt(mempool: &mut HashMap) -> Option { +pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut audit_pool: HashMap = HashMap::new(); let mut mempool_array: VecDeque = VecDeque::new(); let mut clusters: Vec> = Vec::new(); diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 0cdeb74e3..1044d5bd5 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -1,9 +1,9 @@ use napi::bindgen_prelude::*; use napi_derive::napi; -use once_cell::sync::Lazy; use std::collections::HashMap; -use std::sync::Mutex; +use std::sync::{Arc, Mutex}; +use utils::U32HasherState; mod audit_transaction; mod gbt; @@ -11,41 +11,48 @@ mod thread_transaction; mod utils; use thread_transaction::ThreadTransaction; -static THREAD_TRANSACTIONS: Lazy>> = - Lazy::new(|| Mutex::new(HashMap::new())); +type ThreadTransactionsMap = HashMap; -#[napi(ts_args_type = "mempoolBuffer: Uint8Array")] -pub async fn make(mempool_buffer: Uint8Array) -> Result { - let mut map = HashMap::new(); - for tx in ThreadTransaction::batch_from_buffer(&mempool_buffer) { - map.insert(tx.uid, tx); - } - - { - let mut global_map = THREAD_TRANSACTIONS - .lock() - .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; - *global_map = map; - } - - run_in_thread().await +#[napi] +pub struct GbtGenerator { + thread_transactions: Arc>, } -#[napi(ts_args_type = "newTxs: Uint8Array, removeTxs: Uint8Array")] -pub async fn update(new_txs: Uint8Array, remove_txs: Uint8Array) -> Result { - { - let mut map = THREAD_TRANSACTIONS - .lock() - .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; - for tx in ThreadTransaction::batch_from_buffer(&new_txs) { - map.insert(tx.uid, tx); - } - for txid in &utils::txids_from_buffer(&remove_txs) { - map.remove(txid); +#[napi] +impl GbtGenerator { + #[napi(constructor)] + #[allow(clippy::new_without_default)] + pub fn new() -> Self { + Self { + thread_transactions: Arc::new(Mutex::new(HashMap::with_capacity_and_hasher( + 2048, + U32HasherState, + ))), } } - run_in_thread().await + #[napi] + pub async fn make(&self, mempool_buffer: Uint8Array) -> Result { + run_task(Arc::clone(&self.thread_transactions), move |map| { + for tx in ThreadTransaction::batch_from_buffer(&mempool_buffer) { + map.insert(tx.uid, tx); + } + }) + .await + } + + #[napi] + pub async fn update(&self, new_txs: Uint8Array, remove_txs: Uint8Array) -> Result { + run_task(Arc::clone(&self.thread_transactions), move |map| { + for tx in ThreadTransaction::batch_from_buffer(&new_txs) { + map.insert(tx.uid, tx); + } + for txid in &utils::txids_from_buffer(&remove_txs) { + map.remove(txid); + } + }) + .await + } } /// The result from calling the gbt function. @@ -61,11 +68,27 @@ pub struct GbtResult { pub rates: Vec>, // Tuples not supported. u32 fits inside f64 } -async fn run_in_thread() -> Result { +/// All on another thread, this runs an arbitrary task in between +/// taking the lock and running gbt. +/// +/// Rather than filling / updating the HashMap on the main thread, +/// this allows for HashMap modifying tasks to be run before running and returning gbt results. +/// +/// `thread_transactions` is a cloned Arc of the Mutex for the HashMap state. +/// `callback` is a `'static + Send` `FnOnce` closure/function that takes a mutable reference +/// to the HashMap as the only argument. (A move closure is recommended to meet the bounds) +async fn run_task( + thread_transactions: Arc>, + callback: F, +) -> Result +where + F: FnOnce(&mut ThreadTransactionsMap) + Send + 'static, +{ let handle = napi::tokio::task::spawn_blocking(move || { - let mut map = THREAD_TRANSACTIONS + let mut map = thread_transactions .lock() .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; + callback(&mut map); gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed")) }); diff --git a/backend/rust-gbt/src/utils.rs b/backend/rust-gbt/src/utils.rs index c1b6063a1..b969c8361 100644 --- a/backend/rust-gbt/src/utils.rs +++ b/backend/rust-gbt/src/utils.rs @@ -1,5 +1,8 @@ use bytes::buf::Buf; -use std::io::Cursor; +use std::{ + hash::{BuildHasher, Hasher}, + io::Cursor, +}; pub fn txids_from_buffer(buffer: &[u8]) -> Vec { let mut txids: Vec = Vec::new(); @@ -11,3 +14,56 @@ pub fn txids_from_buffer(buffer: &[u8]) -> Vec { txids } + +pub struct U32HasherState; + +impl BuildHasher for U32HasherState { + type Hasher = U32Hasher; + + fn build_hasher(&self) -> Self::Hasher { + U32Hasher(0) + } +} + +pub struct U32Hasher(u32); + +impl Hasher for U32Hasher { + fn finish(&self) -> u64 { + // Safety: Two u32s next to each other will make a u64 + unsafe { core::mem::transmute::<(u32, u32), u64>((self.0, 0_u32)) } + } + + fn write(&mut self, bytes: &[u8]) { + // Assert in debug builds (testing too) that only 4 byte keys (u32, i32, f32, etc.) run + debug_assert!(bytes.len() == 4); + // Safety: We know that the size of the key is at least 4 bytes + self.0 = unsafe { *bytes.as_ptr().cast::() }; + } +} + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + + use super::U32HasherState; + + #[test] + fn test_me() { + let mut hm: HashMap = HashMap::with_hasher(U32HasherState); + + hm.insert(0, String::from("0")); + hm.insert(42, String::from("42")); + hm.insert(256, String::from("256")); + hm.insert(u32::MAX, String::from("MAX")); + hm.insert(u32::MAX >> 2, String::from("MAX >> 2")); + + assert_eq!(hm.get(&0), Some(&String::from("0"))); + assert_eq!(hm.get(&42), Some(&String::from("42"))); + assert_eq!(hm.get(&256), Some(&String::from("256"))); + assert_eq!(hm.get(&u32::MAX), Some(&String::from("MAX"))); + assert_eq!(hm.get(&(u32::MAX >> 2)), Some(&String::from("MAX >> 2"))); + assert_eq!(hm.get(&(u32::MAX >> 4)), None); + assert_eq!(hm.get(&3), None); + assert_eq!(hm.get(&43), None); + } +} diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index a4786af7c..e0362b6ce 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,4 +1,4 @@ -import * as napiAddon from '../../rust-gbt'; +import { GbtGenerator } from '../../rust-gbt'; import logger from '../logger'; import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, AuditTransaction } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; @@ -11,6 +11,7 @@ class MempoolBlocks { private mempoolBlockDeltas: MempoolBlockDelta[] = []; private txSelectionWorker: Worker | null = null; private rustInitialized: boolean = false; + private rustGbtGenerator: GbtGenerator = new GbtGenerator(); private nextUid: number = 1; private uidMap: Map = new Map(); // map short numerical uids to full txids @@ -342,7 +343,7 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result try { const { blocks, rates, clusters } = this.convertNapiResultTxids( - await napiAddon.make(new Uint8Array(mempoolBuffer)), + await this.rustGbtGenerator.make(new Uint8Array(mempoolBuffer)), ); this.rustInitialized = true; const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); @@ -376,7 +377,7 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result try { const { blocks, rates, clusters } = this.convertNapiResultTxids( - await napiAddon.update( + await this.rustGbtGenerator.update( new Uint8Array(addedBuffer), new Uint8Array(removedBuffer), ), From 3c652bdcbc09a83dfd9a0538bee9bf33219f08a1 Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 24 Jun 2023 23:42:18 -0700 Subject: [PATCH 483/782] Optimize audit_pool key hashing as well. Use a const for starting capacity for tx related lists. --- backend/rust-gbt/src/gbt.rs | 20 +++++++++++++------- backend/rust-gbt/src/lib.rs | 10 +++++++++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index f657c013a..84d5753eb 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -4,13 +4,18 @@ use std::{ collections::{HashMap, HashSet, VecDeque}, }; -use crate::{audit_transaction::AuditTransaction, GbtResult, ThreadTransactionsMap}; +use crate::{ + audit_transaction::AuditTransaction, utils::U32HasherState, GbtResult, ThreadTransactionsMap, + STARTING_CAPACITY, +}; const BLOCK_WEIGHT_UNITS: u32 = 4_000_000; const BLOCK_SIGOPS: u32 = 80_000; const BLOCK_RESERVED_WEIGHT: u32 = 4_000; const MAX_BLOCKS: usize = 8; +type AuditPool = HashMap; + struct TxPriority { uid: u32, score: f64, @@ -42,8 +47,9 @@ impl Ord for TxPriority { * Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts */ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { - let mut audit_pool: HashMap = HashMap::new(); - let mut mempool_array: VecDeque = VecDeque::new(); + let mut audit_pool: AuditPool = + HashMap::with_capacity_and_hasher(STARTING_CAPACITY, U32HasherState); + let mut mempool_array: VecDeque = VecDeque::with_capacity(STARTING_CAPACITY); let mut clusters: Vec> = Vec::new(); // Initialize working structs @@ -75,7 +81,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut blocks: Vec> = Vec::new(); let mut block_weight: u32 = BLOCK_RESERVED_WEIGHT; let mut block_sigops: u32 = 0; - let mut transactions: Vec = Vec::new(); + let mut transactions: Vec = Vec::with_capacity(STARTING_CAPACITY); let mut modified: PriorityQueue = PriorityQueue::new(); let mut overflow: Vec = Vec::new(); let mut failures = 0; @@ -167,7 +173,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { blocks.push(transactions); } // reset for the next block - transactions = Vec::new(); + transactions = Vec::with_capacity(STARTING_CAPACITY); block_weight = 4000; // 'overflow' packages didn't fit in this block, but are valid candidates for the next overflow.reverse(); @@ -209,7 +215,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { }) } -fn set_relatives(txid: u32, audit_pool: &mut HashMap) { +fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { let mut parents: HashSet = HashSet::new(); if let Some(tx) = audit_pool.get(&txid) { if tx.relatives_set_flag { @@ -267,7 +273,7 @@ fn set_relatives(txid: u32, audit_pool: &mut HashMap) { // iterate over remaining descendants, removing the root as a valid ancestor & updating the ancestor score fn update_descendants( root_txid: u32, - audit_pool: &mut HashMap, + audit_pool: &mut AuditPool, modified: &mut PriorityQueue, cluster_rate: f64, ) { diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 1044d5bd5..81236e443 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -11,6 +11,14 @@ mod thread_transaction; mod utils; use thread_transaction::ThreadTransaction; +/// This is the starting capacity for HashMap/Vec/etc. that deal with transactions. +/// HashMap doubles capacity when it hits it, so 2048 is a decent tradeoff between +/// not wasting too much memory when it's below this, and allowing for less re-allocations +/// by virtue of starting with such a large capacity. +/// +/// Note: This doesn't *have* to be a power of 2. (uwu) +const STARTING_CAPACITY: usize = 2048; + type ThreadTransactionsMap = HashMap; #[napi] @@ -25,7 +33,7 @@ impl GbtGenerator { pub fn new() -> Self { Self { thread_transactions: Arc::new(Mutex::new(HashMap::with_capacity_and_hasher( - 2048, + STARTING_CAPACITY, U32HasherState, ))), } From 59b19eefe3263279055e38565dc327978688d30d Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 00:29:03 -0700 Subject: [PATCH 484/782] Move u32hasher into its own module, don't expose the Hasher for use. --- backend/rust-gbt/src/gbt.rs | 8 ++-- backend/rust-gbt/src/lib.rs | 8 ++-- backend/rust-gbt/src/u32_hashmap.rs | 72 +++++++++++++++++++++++++++++ backend/rust-gbt/src/utils.rs | 58 +---------------------- 4 files changed, 80 insertions(+), 66 deletions(-) create mode 100644 backend/rust-gbt/src/u32_hashmap.rs diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 84d5753eb..f0c9ffda5 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -5,8 +5,9 @@ use std::{ }; use crate::{ - audit_transaction::AuditTransaction, utils::U32HasherState, GbtResult, ThreadTransactionsMap, - STARTING_CAPACITY, + audit_transaction::AuditTransaction, + u32_hashmap::{u32hashmap_with_capacity, U32HasherState}, + GbtResult, ThreadTransactionsMap, STARTING_CAPACITY, }; const BLOCK_WEIGHT_UNITS: u32 = 4_000_000; @@ -47,8 +48,7 @@ impl Ord for TxPriority { * Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts */ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { - let mut audit_pool: AuditPool = - HashMap::with_capacity_and_hasher(STARTING_CAPACITY, U32HasherState); + let mut audit_pool: AuditPool = u32hashmap_with_capacity(STARTING_CAPACITY); let mut mempool_array: VecDeque = VecDeque::with_capacity(STARTING_CAPACITY); let mut clusters: Vec> = Vec::new(); diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 81236e443..b6ed322e0 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -3,11 +3,12 @@ use napi_derive::napi; use std::collections::HashMap; use std::sync::{Arc, Mutex}; -use utils::U32HasherState; +use u32_hashmap::{u32hashmap_with_capacity, U32HasherState}; mod audit_transaction; mod gbt; mod thread_transaction; +mod u32_hashmap; mod utils; use thread_transaction::ThreadTransaction; @@ -32,10 +33,7 @@ impl GbtGenerator { #[allow(clippy::new_without_default)] pub fn new() -> Self { Self { - thread_transactions: Arc::new(Mutex::new(HashMap::with_capacity_and_hasher( - STARTING_CAPACITY, - U32HasherState, - ))), + thread_transactions: Arc::new(Mutex::new(u32hashmap_with_capacity(STARTING_CAPACITY))), } } diff --git a/backend/rust-gbt/src/u32_hashmap.rs b/backend/rust-gbt/src/u32_hashmap.rs new file mode 100644 index 000000000..26ab38718 --- /dev/null +++ b/backend/rust-gbt/src/u32_hashmap.rs @@ -0,0 +1,72 @@ +use std::{ + collections::HashMap, + hash::{BuildHasher, Hasher}, +}; + +// Note: If needed, this will create a new HashMap without initial capacity. +// /// This is the only way to create a HashMap with the U32HasherState +// pub fn u32hashmap_new() -> HashMap { +// HashMap::with_hasher(U32HasherState(())) +// } + +/// This is the only way to create a HashMap with the U32HasherState and capacity +pub fn u32hashmap_with_capacity(capacity: usize) -> HashMap { + HashMap::with_capacity_and_hasher(capacity, U32HasherState(())) +} + +/// A private unit type is contained so no one can make an instance of it. +pub struct U32HasherState(()); + +impl BuildHasher for U32HasherState { + type Hasher = U32Hasher; + + fn build_hasher(&self) -> Self::Hasher { + U32Hasher(0) + } +} + +/// This also can't be created outside this module due to private field. +pub struct U32Hasher(u32); + +impl Hasher for U32Hasher { + fn finish(&self) -> u64 { + // Safety: Two u32s next to each other will make a u64 + unsafe { core::mem::transmute::<(u32, u32), u64>((self.0, 0_u32)) } + } + + fn write(&mut self, bytes: &[u8]) { + // Assert in debug builds (testing too) that only 4 byte keys (u32, i32, f32, etc.) run + debug_assert!(bytes.len() == 4); + // Safety: We know that the size of the key is at least 4 bytes + // We also know that the only way to get an instance of HashMap using this "hasher" + // is through the public functions in this module which set the key to u32. + self.0 = unsafe { *bytes.as_ptr().cast::() }; + } +} + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + + use super::U32HasherState; + + #[test] + fn test_me() { + let mut hm: HashMap = HashMap::with_hasher(U32HasherState(())); + + hm.insert(0, String::from("0")); + hm.insert(42, String::from("42")); + hm.insert(256, String::from("256")); + hm.insert(u32::MAX, String::from("MAX")); + hm.insert(u32::MAX >> 2, String::from("MAX >> 2")); + + assert_eq!(hm.get(&0), Some(&String::from("0"))); + assert_eq!(hm.get(&42), Some(&String::from("42"))); + assert_eq!(hm.get(&256), Some(&String::from("256"))); + assert_eq!(hm.get(&u32::MAX), Some(&String::from("MAX"))); + assert_eq!(hm.get(&(u32::MAX >> 2)), Some(&String::from("MAX >> 2"))); + assert_eq!(hm.get(&(u32::MAX >> 4)), None); + assert_eq!(hm.get(&3), None); + assert_eq!(hm.get(&43), None); + } +} diff --git a/backend/rust-gbt/src/utils.rs b/backend/rust-gbt/src/utils.rs index b969c8361..c1b6063a1 100644 --- a/backend/rust-gbt/src/utils.rs +++ b/backend/rust-gbt/src/utils.rs @@ -1,8 +1,5 @@ use bytes::buf::Buf; -use std::{ - hash::{BuildHasher, Hasher}, - io::Cursor, -}; +use std::io::Cursor; pub fn txids_from_buffer(buffer: &[u8]) -> Vec { let mut txids: Vec = Vec::new(); @@ -14,56 +11,3 @@ pub fn txids_from_buffer(buffer: &[u8]) -> Vec { txids } - -pub struct U32HasherState; - -impl BuildHasher for U32HasherState { - type Hasher = U32Hasher; - - fn build_hasher(&self) -> Self::Hasher { - U32Hasher(0) - } -} - -pub struct U32Hasher(u32); - -impl Hasher for U32Hasher { - fn finish(&self) -> u64 { - // Safety: Two u32s next to each other will make a u64 - unsafe { core::mem::transmute::<(u32, u32), u64>((self.0, 0_u32)) } - } - - fn write(&mut self, bytes: &[u8]) { - // Assert in debug builds (testing too) that only 4 byte keys (u32, i32, f32, etc.) run - debug_assert!(bytes.len() == 4); - // Safety: We know that the size of the key is at least 4 bytes - self.0 = unsafe { *bytes.as_ptr().cast::() }; - } -} - -#[cfg(test)] -mod tests { - use std::collections::HashMap; - - use super::U32HasherState; - - #[test] - fn test_me() { - let mut hm: HashMap = HashMap::with_hasher(U32HasherState); - - hm.insert(0, String::from("0")); - hm.insert(42, String::from("42")); - hm.insert(256, String::from("256")); - hm.insert(u32::MAX, String::from("MAX")); - hm.insert(u32::MAX >> 2, String::from("MAX >> 2")); - - assert_eq!(hm.get(&0), Some(&String::from("0"))); - assert_eq!(hm.get(&42), Some(&String::from("42"))); - assert_eq!(hm.get(&256), Some(&String::from("256"))); - assert_eq!(hm.get(&u32::MAX), Some(&String::from("MAX"))); - assert_eq!(hm.get(&(u32::MAX >> 2)), Some(&String::from("MAX >> 2"))); - assert_eq!(hm.get(&(u32::MAX >> 4)), None); - assert_eq!(hm.get(&3), None); - assert_eq!(hm.get(&43), None); - } -} From 939d2230d293a7bb939d8760d1fd74af76da8e18 Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 00:44:08 -0700 Subject: [PATCH 485/782] Use bytemuck instead of unsafe Rust --- Cargo.lock | 7 +++++++ backend/rust-gbt/Cargo.toml | 1 + backend/rust-gbt/src/u32_hashmap.rs | 8 ++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7837483d7..16fdc9c54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,12 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbe3c979c178231552ecba20214a8272df4e09f232a87aef4320cf06539aded" +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + [[package]] name = "bytes" version = "1.4.0" @@ -58,6 +64,7 @@ dependencies = [ name = "gbt" version = "0.1.0" dependencies = [ + "bytemuck", "bytes", "napi", "napi-build", diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml index a0f593518..2585a09e6 100644 --- a/backend/rust-gbt/Cargo.toml +++ b/backend/rust-gbt/Cargo.toml @@ -17,6 +17,7 @@ bytes = "1.4.0" once_cell = "1.18.0" napi = { version = "2.13.2", features = ["napi8", "tokio_rt"] } napi-derive = "2.13.0" +bytemuck = "1.13.1" [build-dependencies] napi-build = "2.0.1" diff --git a/backend/rust-gbt/src/u32_hashmap.rs b/backend/rust-gbt/src/u32_hashmap.rs index 26ab38718..cfa513301 100644 --- a/backend/rust-gbt/src/u32_hashmap.rs +++ b/backend/rust-gbt/src/u32_hashmap.rs @@ -31,16 +31,16 @@ pub struct U32Hasher(u32); impl Hasher for U32Hasher { fn finish(&self) -> u64 { // Safety: Two u32s next to each other will make a u64 - unsafe { core::mem::transmute::<(u32, u32), u64>((self.0, 0_u32)) } + bytemuck::cast([self.0, 0]) } fn write(&mut self, bytes: &[u8]) { // Assert in debug builds (testing too) that only 4 byte keys (u32, i32, f32, etc.) run debug_assert!(bytes.len() == 4); - // Safety: We know that the size of the key is at least 4 bytes + // Safety: We know that the size of the key is 4 bytes // We also know that the only way to get an instance of HashMap using this "hasher" - // is through the public functions in this module which set the key to u32. - self.0 = unsafe { *bytes.as_ptr().cast::() }; + // is through the public functions in this module which set the key type to u32. + self.0 = *bytemuck::from_bytes(bytes); } } From af4919a98bd74bab8c4b40aba93643d13f14246a Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 08:17:30 -0700 Subject: [PATCH 486/782] Use u32hasher with PriorityQueue as well --- Cargo.lock | 1 - backend/rust-gbt/Cargo.toml | 1 - backend/rust-gbt/src/gbt.rs | 7 +- backend/rust-gbt/src/lib.rs | 4 +- backend/rust-gbt/src/u32_hasher_types.rs | 119 +++++++++++++++++++++++ backend/rust-gbt/src/u32_hashmap.rs | 72 -------------- 6 files changed, 125 insertions(+), 79 deletions(-) create mode 100644 backend/rust-gbt/src/u32_hasher_types.rs delete mode 100644 backend/rust-gbt/src/u32_hashmap.rs diff --git a/Cargo.lock b/Cargo.lock index 16fdc9c54..d7e7ef21a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,7 +69,6 @@ dependencies = [ "napi", "napi-build", "napi-derive", - "once_cell", "priority-queue", ] diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml index 2585a09e6..4a8de082f 100644 --- a/backend/rust-gbt/Cargo.toml +++ b/backend/rust-gbt/Cargo.toml @@ -14,7 +14,6 @@ crate-type = ["cdylib"] [dependencies] priority-queue = "1.3.2" bytes = "1.4.0" -once_cell = "1.18.0" napi = { version = "2.13.2", features = ["napi8", "tokio_rt"] } napi-derive = "2.13.0" bytemuck = "1.13.1" diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index f0c9ffda5..5109b044b 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -6,7 +6,7 @@ use std::{ use crate::{ audit_transaction::AuditTransaction, - u32_hashmap::{u32hashmap_with_capacity, U32HasherState}, + u32_hasher_types::{u32hashmap_with_capacity, u32priority_queue_with_capacity, U32HasherState}, GbtResult, ThreadTransactionsMap, STARTING_CAPACITY, }; @@ -16,6 +16,7 @@ const BLOCK_RESERVED_WEIGHT: u32 = 4_000; const MAX_BLOCKS: usize = 8; type AuditPool = HashMap; +type ModifiedQueue = PriorityQueue; struct TxPriority { uid: u32, @@ -82,7 +83,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut block_weight: u32 = BLOCK_RESERVED_WEIGHT; let mut block_sigops: u32 = 0; let mut transactions: Vec = Vec::with_capacity(STARTING_CAPACITY); - let mut modified: PriorityQueue = PriorityQueue::new(); + let mut modified: ModifiedQueue = u32priority_queue_with_capacity(STARTING_CAPACITY); let mut overflow: Vec = Vec::new(); let mut failures = 0; while !mempool_array.is_empty() || !modified.is_empty() { @@ -274,7 +275,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { fn update_descendants( root_txid: u32, audit_pool: &mut AuditPool, - modified: &mut PriorityQueue, + modified: &mut ModifiedQueue, cluster_rate: f64, ) { let mut visited: HashSet = HashSet::new(); diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index b6ed322e0..b22862a55 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -3,12 +3,12 @@ use napi_derive::napi; use std::collections::HashMap; use std::sync::{Arc, Mutex}; -use u32_hashmap::{u32hashmap_with_capacity, U32HasherState}; +use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState}; mod audit_transaction; mod gbt; mod thread_transaction; -mod u32_hashmap; +mod u32_hasher_types; mod utils; use thread_transaction::ThreadTransaction; diff --git a/backend/rust-gbt/src/u32_hasher_types.rs b/backend/rust-gbt/src/u32_hasher_types.rs new file mode 100644 index 000000000..4f5985ec2 --- /dev/null +++ b/backend/rust-gbt/src/u32_hasher_types.rs @@ -0,0 +1,119 @@ +use priority_queue::PriorityQueue; +use std::{ + collections::HashMap, + hash::{BuildHasher, Hasher}, +}; + +/// This is the only way to create a HashMap with the U32HasherState and capacity +pub fn u32hashmap_with_capacity(capacity: usize) -> HashMap { + HashMap::with_capacity_and_hasher(capacity, U32HasherState(())) +} + +/// This is the only way to create a PriorityQueue with the U32HasherState and capacity +pub fn u32priority_queue_with_capacity( + capacity: usize, +) -> PriorityQueue { + PriorityQueue::with_capacity_and_hasher(capacity, U32HasherState(())) +} + +/// A private unit type is contained so no one can make an instance of it. +pub struct U32HasherState(()); + +impl BuildHasher for U32HasherState { + type Hasher = U32Hasher; + + fn build_hasher(&self) -> Self::Hasher { + U32Hasher(0) + } +} + +/// This also can't be created outside this module due to private field. +pub struct U32Hasher(u32); + +impl Hasher for U32Hasher { + fn finish(&self) -> u64 { + // Safety: Two u32s next to each other will make a u64 + bytemuck::cast([self.0, 0]) + } + + fn write(&mut self, bytes: &[u8]) { + // Assert in debug builds (testing too) that only 4 byte keys (u32, i32, f32, etc.) run + debug_assert!(bytes.len() == 4); + // Safety: We know that the size of the key is 4 bytes + // We also know that the only way to get an instance of HashMap using this "hasher" + // is through the public functions in this module which set the key type to u32. + self.0 = *bytemuck::from_bytes(bytes); + } +} + +#[cfg(test)] +mod tests { + use super::U32HasherState; + use priority_queue::PriorityQueue; + use std::collections::HashMap; + + #[test] + fn test_hashmap() { + let mut hm: HashMap = HashMap::with_hasher(U32HasherState(())); + + // Testing basic operations with the custom hasher + hm.insert(0, String::from("0")); + hm.insert(42, String::from("42")); + hm.insert(256, String::from("256")); + hm.insert(u32::MAX, String::from("MAX")); + hm.insert(u32::MAX >> 2, String::from("MAX >> 2")); + + assert_eq!(hm.get(&0), Some(&String::from("0"))); + assert_eq!(hm.get(&42), Some(&String::from("42"))); + assert_eq!(hm.get(&256), Some(&String::from("256"))); + assert_eq!(hm.get(&u32::MAX), Some(&String::from("MAX"))); + assert_eq!(hm.get(&(u32::MAX >> 2)), Some(&String::from("MAX >> 2"))); + assert_eq!(hm.get(&(u32::MAX >> 4)), None); + assert_eq!(hm.get(&3), None); + assert_eq!(hm.get(&43), None); + } + + #[test] + fn test_priority_queue() { + let mut pq: PriorityQueue = + PriorityQueue::with_hasher(U32HasherState(())); + + // Testing basic operations with the custom hasher + assert_eq!(pq.push(1, 5), None); + assert_eq!(pq.push(2, -10), None); + assert_eq!(pq.push(3, 7), None); + assert_eq!(pq.push(4, 20), None); + assert_eq!(pq.push(u32::MAX, -42), None); + + assert_eq!(pq.push_increase(1, 4), Some(4)); + assert_eq!(pq.push_increase(2, -8), Some(-10)); + assert_eq!(pq.push_increase(3, 5), Some(5)); + assert_eq!(pq.push_increase(4, 21), Some(20)); + assert_eq!(pq.push_increase(u32::MAX, -99), Some(-99)); + assert_eq!(pq.push_increase(42, 1337), None); + + assert_eq!(pq.push_decrease(1, 4), Some(5)); + assert_eq!(pq.push_decrease(2, -10), Some(-8)); + assert_eq!(pq.push_decrease(3, 5), Some(7)); + assert_eq!(pq.push_decrease(4, 20), Some(21)); + assert_eq!(pq.push_decrease(u32::MAX, 100), Some(100)); + assert_eq!(pq.push_decrease(69, 420), None); + + assert_eq!(pq.peek(), Some((&42, &1337))); + assert_eq!(pq.pop(), Some((42, 1337))); + assert_eq!(pq.peek(), Some((&69, &420))); + assert_eq!(pq.pop(), Some((69, 420))); + assert_eq!(pq.peek(), Some((&4, &20))); + assert_eq!(pq.pop(), Some((4, 20))); + assert_eq!(pq.peek(), Some((&3, &5))); + assert_eq!(pq.pop(), Some((3, 5))); + assert_eq!(pq.peek(), Some((&1, &4))); + assert_eq!(pq.pop(), Some((1, 4))); + assert_eq!(pq.peek(), Some((&2, &-10))); + assert_eq!(pq.pop(), Some((2, -10))); + assert_eq!(pq.peek(), Some((&u32::MAX, &-42))); + assert_eq!(pq.pop(), Some((u32::MAX, -42))); + assert_eq!(pq.peek(), None); + assert_eq!(pq.pop(), None); + } +} diff --git a/backend/rust-gbt/src/u32_hashmap.rs b/backend/rust-gbt/src/u32_hashmap.rs deleted file mode 100644 index cfa513301..000000000 --- a/backend/rust-gbt/src/u32_hashmap.rs +++ /dev/null @@ -1,72 +0,0 @@ -use std::{ - collections::HashMap, - hash::{BuildHasher, Hasher}, -}; - -// Note: If needed, this will create a new HashMap without initial capacity. -// /// This is the only way to create a HashMap with the U32HasherState -// pub fn u32hashmap_new() -> HashMap { -// HashMap::with_hasher(U32HasherState(())) -// } - -/// This is the only way to create a HashMap with the U32HasherState and capacity -pub fn u32hashmap_with_capacity(capacity: usize) -> HashMap { - HashMap::with_capacity_and_hasher(capacity, U32HasherState(())) -} - -/// A private unit type is contained so no one can make an instance of it. -pub struct U32HasherState(()); - -impl BuildHasher for U32HasherState { - type Hasher = U32Hasher; - - fn build_hasher(&self) -> Self::Hasher { - U32Hasher(0) - } -} - -/// This also can't be created outside this module due to private field. -pub struct U32Hasher(u32); - -impl Hasher for U32Hasher { - fn finish(&self) -> u64 { - // Safety: Two u32s next to each other will make a u64 - bytemuck::cast([self.0, 0]) - } - - fn write(&mut self, bytes: &[u8]) { - // Assert in debug builds (testing too) that only 4 byte keys (u32, i32, f32, etc.) run - debug_assert!(bytes.len() == 4); - // Safety: We know that the size of the key is 4 bytes - // We also know that the only way to get an instance of HashMap using this "hasher" - // is through the public functions in this module which set the key type to u32. - self.0 = *bytemuck::from_bytes(bytes); - } -} - -#[cfg(test)] -mod tests { - use std::collections::HashMap; - - use super::U32HasherState; - - #[test] - fn test_me() { - let mut hm: HashMap = HashMap::with_hasher(U32HasherState(())); - - hm.insert(0, String::from("0")); - hm.insert(42, String::from("42")); - hm.insert(256, String::from("256")); - hm.insert(u32::MAX, String::from("MAX")); - hm.insert(u32::MAX >> 2, String::from("MAX >> 2")); - - assert_eq!(hm.get(&0), Some(&String::from("0"))); - assert_eq!(hm.get(&42), Some(&String::from("42"))); - assert_eq!(hm.get(&256), Some(&String::from("256"))); - assert_eq!(hm.get(&u32::MAX), Some(&String::from("MAX"))); - assert_eq!(hm.get(&(u32::MAX >> 2)), Some(&String::from("MAX >> 2"))); - assert_eq!(hm.get(&(u32::MAX >> 4)), None); - assert_eq!(hm.get(&3), None); - assert_eq!(hm.get(&43), None); - } -} From e3f4c33f03d8299f7cadf32e5b79974b2b2e164a Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 11:19:33 -0700 Subject: [PATCH 487/782] Protect score from outside assignment and document the requirements --- backend/rust-gbt/src/audit_transaction.rs | 22 ++++++++++++++++++- backend/rust-gbt/src/gbt.rs | 26 +++++++---------------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 438058887..3468accd8 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -21,7 +21,8 @@ pub struct AuditTransaction { pub ancestor_fee: u64, pub ancestor_weight: u32, pub ancestor_sigops: u32, - pub score: f64, + // Safety: Must be private to prevent NaN breaking Ord impl. + score: f64, pub used: bool, pub modified: bool, pub dirty: bool, @@ -53,6 +54,9 @@ impl PartialOrd for AuditTransaction { impl Ord for AuditTransaction { fn cmp(&self, other: &AuditTransaction) -> Ordering { + // Safety: The only possible values for score are f64 + // that are not NaN. This is because outside code can not + // freely assign score. Also, calc_new_score guarantees no NaN. self.partial_cmp(other).expect("score will never be NaN") } } @@ -80,4 +84,20 @@ impl AuditTransaction { dirty: false, } } + + #[inline] + pub fn score(&self) -> f64 { + self.score + } + + /// Safety: This function must NEVER set score to NaN. + #[inline] + pub fn calc_new_score(&mut self) { + self.score = (self.ancestor_fee as f64) + / (if self.ancestor_weight == 0 { + 1.0 + } else { + self.ancestor_weight as f64 / 4.0 + }); + } } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 5109b044b..6299ea21c 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -185,7 +185,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { *overflowed, TxPriority { uid: *overflowed, - score: overflowed_tx.score, + score: overflowed_tx.score(), }, ); } else { @@ -261,12 +261,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { tx.ancestor_fee = tx.fee + total_fee; tx.ancestor_weight = tx.weight + total_weight; tx.ancestor_sigops = tx.sigops + total_sigops; - tx.score = (tx.ancestor_fee as f64) - / (if tx.ancestor_weight == 0 { - 1.0 - } else { - tx.ancestor_weight as f64 / 4.0 - }); + tx.calc_new_score(); tx.relatives_set_flag = true; } } @@ -303,30 +298,25 @@ fn update_descendants( descendant.ancestor_fee -= root_fee; descendant.ancestor_weight -= root_weight; descendant.ancestor_sigops -= root_sigops; - let current_score = descendant.score; - descendant.score = (descendant.ancestor_fee as f64) - / (if descendant.ancestor_weight == 0 { - 1.0 - } else { - descendant.ancestor_weight as f64 / 4.0 - }); + let current_score = descendant.score(); + descendant.calc_new_score(); descendant.dependency_rate = descendant.dependency_rate.min(cluster_rate); descendant.modified = true; // update modified priority if score has changed - if !descendant.modified || descendant.score < current_score { + if !descendant.modified || descendant.score() < current_score { modified.push_decrease( descendant.uid, TxPriority { uid: descendant.uid, - score: descendant.score, + score: descendant.score(), }, ); - } else if descendant.score > current_score { + } else if descendant.score() > current_score { modified.push_increase( descendant.uid, TxPriority { uid: descendant.uid, - score: descendant.score, + score: descendant.score(), }, ); } From e61ae59e53ddc261958dc9aa4c131e5302bc8637 Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 11:36:04 -0700 Subject: [PATCH 488/782] Add safety comments --- backend/rust-gbt/src/audit_transaction.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 3468accd8..392c54d3c 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -44,6 +44,8 @@ impl Eq for AuditTransaction {} impl PartialOrd for AuditTransaction { fn partial_cmp(&self, other: &AuditTransaction) -> Option { + // If either score is NaN, this is false, + // and partial_cmp will return None if self.score == other.score { Some(self.uid.cmp(&other.uid)) } else { From 609df31e0cc413f28434ca31cea2bbbe815889da Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 16:08:16 -0700 Subject: [PATCH 489/782] Fix clippy pedantic and nursery lints as well --- backend/rust-gbt/index.d.ts | 10 ++++ backend/rust-gbt/src/audit_transaction.rs | 47 ++++++++++++++++-- backend/rust-gbt/src/gbt.rs | 56 +++++++++------------- backend/rust-gbt/src/lib.rs | 27 ++++++++--- backend/rust-gbt/src/thread_transaction.rs | 6 +-- backend/rust-gbt/src/u32_hasher_types.rs | 4 +- 6 files changed, 101 insertions(+), 49 deletions(-) diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index b02a27c45..c2c4854ee 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -5,7 +5,17 @@ export class GbtGenerator { constructor() + /** + * # Errors + * + * Rejects if the thread panics or if the Mutex is poisoned. + */ make(mempoolBuffer: Uint8Array): Promise + /** + * # Errors + * + * Rejects if the thread panics or if the Mutex is poisoned. + */ update(newTxs: Uint8Array, removeTxs: Uint8Array): Promise } /** diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 392c54d3c..409a6a905 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -5,6 +5,7 @@ use std::{ hash::{Hash, Hasher}, }; +#[allow(clippy::struct_excessive_bools)] #[derive(Clone)] pub struct AuditTransaction { pub uid: u32, @@ -43,7 +44,7 @@ impl PartialEq for AuditTransaction { impl Eq for AuditTransaction {} impl PartialOrd for AuditTransaction { - fn partial_cmp(&self, other: &AuditTransaction) -> Option { + fn partial_cmp(&self, other: &Self) -> Option { // If either score is NaN, this is false, // and partial_cmp will return None if self.score == other.score { @@ -55,7 +56,7 @@ impl PartialOrd for AuditTransaction { } impl Ord for AuditTransaction { - fn cmp(&self, other: &AuditTransaction) -> Ordering { + fn cmp(&self, other: &Self) -> Ordering { // Safety: The only possible values for score are f64 // that are not NaN. This is because outside code can not // freely assign score. Also, calc_new_score guarantees no NaN. @@ -65,7 +66,7 @@ impl Ord for AuditTransaction { impl AuditTransaction { pub fn from_thread_transaction(tx: &ThreadTransaction) -> Self { - AuditTransaction { + Self { uid: tx.uid, fee: tx.fee, weight: tx.weight, @@ -88,7 +89,7 @@ impl AuditTransaction { } #[inline] - pub fn score(&self) -> f64 { + pub const fn score(&self) -> f64 { self.score } @@ -99,7 +100,43 @@ impl AuditTransaction { / (if self.ancestor_weight == 0 { 1.0 } else { - self.ancestor_weight as f64 / 4.0 + f64::from(self.ancestor_weight) / 4.0 }); } + + #[inline] + pub fn set_ancestors( + &mut self, + ancestors: HashSet, + total_fee: u64, + total_weight: u32, + total_sigops: u32, + ) { + self.ancestors = ancestors; + self.ancestor_fee = self.fee + total_fee; + self.ancestor_weight = self.weight + total_weight; + self.ancestor_sigops = self.sigops + total_sigops; + self.calc_new_score(); + self.relatives_set_flag = true; + } + + #[inline] + pub fn remove_root( + &mut self, + root_txid: u32, + root_fee: u64, + root_weight: u32, + root_sigops: u32, + cluster_rate: f64, + ) -> f64 { + self.ancestors.remove(&root_txid); + self.ancestor_fee -= root_fee; + self.ancestor_weight -= root_weight; + self.ancestor_sigops -= root_sigops; + let old_score = self.score(); + self.calc_new_score(); + self.dependency_rate = self.dependency_rate.min(cluster_rate); + self.modified = true; + old_score + } } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 6299ea21c..46b763e2c 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -29,7 +29,7 @@ impl PartialEq for TxPriority { } impl Eq for TxPriority {} impl PartialOrd for TxPriority { - fn partial_cmp(&self, other: &TxPriority) -> Option { + fn partial_cmp(&self, other: &Self) -> Option { if self.score == other.score { Some(self.uid.cmp(&other.uid)) } else { @@ -43,11 +43,16 @@ impl Ord for TxPriority { } } -/* -* Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core -* (see BlockAssembler in https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp) -* Ported from https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts -*/ +/// Build projected mempool blocks using an approximation of the transaction selection algorithm from Bitcoin Core +/// +/// See `BlockAssembler` in Bitcoin Core's +/// [miner.cpp](https://github.com/bitcoin/bitcoin/blob/master/src/node/miner.cpp). +/// Ported from mempool backend's +/// [tx-selection-worker.ts](https://github.com/mempool/mempool/blob/master/backend/src/api/tx-selection-worker.ts). +// +// TODO: Make gbt smaller to fix these lints. +#[allow(clippy::too_many_lines)] +#[allow(clippy::cognitive_complexity)] pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut audit_pool: AuditPool = u32hashmap_with_capacity(STARTING_CAPACITY); let mut mempool_array: VecDeque = VecDeque::with_capacity(STARTING_CAPACITY); @@ -140,10 +145,10 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let cluster_rate = next_tx .dependency_rate - .min(next_tx.ancestor_fee as f64 / (next_tx.ancestor_weight as f64 / 4.0)); + .min(next_tx.ancestor_fee as f64 / (f64::from(next_tx.ancestor_weight) / 4.0)); - for package_entry in &package { - if let Some(tx) = audit_pool.get_mut(&package_entry.0) { + for (txid, _, _) in &package { + if let Some(tx) = audit_pool.get_mut(txid) { tx.used = true; if tx.effective_fee_per_vsize != cluster_rate { tx.effective_fee_per_vsize = cluster_rate; @@ -153,12 +158,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { block_weight += tx.weight; block_sigops += tx.sigops; } - update_descendants( - package_entry.0, - &mut audit_pool, - &mut modified, - cluster_rate, - ); + update_descendants(*txid, &mut audit_pool, &mut modified, cluster_rate); } failures = 0; @@ -205,14 +205,14 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut rates: Vec> = Vec::new(); for (txid, tx) in audit_pool { if tx.dirty { - rates.push(vec![txid as f64, tx.effective_fee_per_vsize]); + rates.push(vec![f64::from(txid), tx.effective_fee_per_vsize]); } } Some(GbtResult { blocks, - rates, clusters, + rates, }) } @@ -257,12 +257,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { } if let Some(tx) = audit_pool.get_mut(&txid) { - tx.ancestors = ancestors; - tx.ancestor_fee = tx.fee + total_fee; - tx.ancestor_weight = tx.weight + total_weight; - tx.ancestor_sigops = tx.sigops + total_sigops; - tx.calc_new_score(); - tx.relatives_set_flag = true; + tx.set_ancestors(ancestors, total_fee, total_weight, total_sigops); } } @@ -294,16 +289,11 @@ fn update_descendants( while let Some(next_txid) = descendant_stack.pop() { if let Some(descendant) = audit_pool.get_mut(&next_txid) { // remove root tx as ancestor - descendant.ancestors.remove(&root_txid); - descendant.ancestor_fee -= root_fee; - descendant.ancestor_weight -= root_weight; - descendant.ancestor_sigops -= root_sigops; - let current_score = descendant.score(); - descendant.calc_new_score(); - descendant.dependency_rate = descendant.dependency_rate.min(cluster_rate); - descendant.modified = true; + let old_score = + descendant.remove_root(root_txid, root_fee, root_weight, root_sigops, cluster_rate); // update modified priority if score has changed - if !descendant.modified || descendant.score() < current_score { + // remove_root() always sets modified to true + if descendant.score() < old_score { modified.push_decrease( descendant.uid, TxPriority { @@ -311,7 +301,7 @@ fn update_descendants( score: descendant.score(), }, ); - } else if descendant.score() > current_score { + } else if descendant.score() > old_score { modified.push_increase( descendant.uid, TxPriority { diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index b22862a55..31b93d154 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -1,4 +1,12 @@ -use napi::bindgen_prelude::*; +#![warn(clippy::all)] +#![warn(clippy::pedantic)] +#![warn(clippy::nursery)] +#![allow(clippy::cast_precision_loss)] +#![allow(clippy::cast_possible_truncation)] +#![allow(clippy::cast_sign_loss)] +#![allow(clippy::float_cmp)] + +use napi::bindgen_prelude::{Result, Uint8Array}; use napi_derive::napi; use std::collections::HashMap; @@ -13,7 +21,7 @@ mod utils; use thread_transaction::ThreadTransaction; /// This is the starting capacity for HashMap/Vec/etc. that deal with transactions. -/// HashMap doubles capacity when it hits it, so 2048 is a decent tradeoff between +/// `HashMap` doubles capacity when it hits it, so 2048 is a decent tradeoff between /// not wasting too much memory when it's below this, and allowing for less re-allocations /// by virtue of starting with such a large capacity. /// @@ -31,12 +39,16 @@ pub struct GbtGenerator { impl GbtGenerator { #[napi(constructor)] #[allow(clippy::new_without_default)] + #[must_use] pub fn new() -> Self { Self { thread_transactions: Arc::new(Mutex::new(u32hashmap_with_capacity(STARTING_CAPACITY))), } } + /// # Errors + /// + /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] pub async fn make(&self, mempool_buffer: Uint8Array) -> Result { run_task(Arc::clone(&self.thread_transactions), move |map| { @@ -47,6 +59,9 @@ impl GbtGenerator { .await } + /// # Errors + /// + /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] pub async fn update(&self, new_txs: Uint8Array, remove_txs: Uint8Array) -> Result { run_task(Arc::clone(&self.thread_transactions), move |map| { @@ -77,12 +92,12 @@ pub struct GbtResult { /// All on another thread, this runs an arbitrary task in between /// taking the lock and running gbt. /// -/// Rather than filling / updating the HashMap on the main thread, -/// this allows for HashMap modifying tasks to be run before running and returning gbt results. +/// Rather than filling / updating the `HashMap` on the main thread, +/// this allows for `HashMap` modifying tasks to be run before running and returning gbt results. /// -/// `thread_transactions` is a cloned Arc of the Mutex for the HashMap state. +/// `thread_transactions` is a cloned `Arc` of the `Mutex` for the `HashMap` state. /// `callback` is a `'static + Send` `FnOnce` closure/function that takes a mutable reference -/// to the HashMap as the only argument. (A move closure is recommended to meet the bounds) +/// to the `HashMap` as the only argument. (A move closure is recommended to meet the bounds) async fn run_task( thread_transactions: Arc>, callback: F, diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs index 79f93746b..a16020165 100644 --- a/backend/rust-gbt/src/thread_transaction.rs +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -12,8 +12,8 @@ pub struct ThreadTransaction { } impl ThreadTransaction { - pub fn batch_from_buffer(buffer: &[u8]) -> Vec { - let mut transactions: Vec = Vec::new(); + pub fn batch_from_buffer(buffer: &[u8]) -> Vec { + let mut transactions: Vec = Vec::new(); let mut cursor = Cursor::new(buffer); let size = cursor.get_u32(); for _ in 0..size { @@ -28,7 +28,7 @@ impl ThreadTransaction { for _ in 0..input_count { inputs.push(cursor.get_u32()); } - transactions.push(ThreadTransaction { + transactions.push(Self { uid, fee, weight, diff --git a/backend/rust-gbt/src/u32_hasher_types.rs b/backend/rust-gbt/src/u32_hasher_types.rs index 4f5985ec2..4735844f3 100644 --- a/backend/rust-gbt/src/u32_hasher_types.rs +++ b/backend/rust-gbt/src/u32_hasher_types.rs @@ -4,12 +4,12 @@ use std::{ hash::{BuildHasher, Hasher}, }; -/// This is the only way to create a HashMap with the U32HasherState and capacity +/// This is the only way to create a `HashMap` with the `U32HasherState` and capacity pub fn u32hashmap_with_capacity(capacity: usize) -> HashMap { HashMap::with_capacity_and_hasher(capacity, U32HasherState(())) } -/// This is the only way to create a PriorityQueue with the U32HasherState and capacity +/// This is the only way to create a `PriorityQueue` with the `U32HasherState` and capacity pub fn u32priority_queue_with_capacity( capacity: usize, ) -> PriorityQueue { From 2dfef5a003d1e83b442d45a199d0f69671074d2b Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 16:13:01 -0700 Subject: [PATCH 490/782] Fix Rust version of compiler to prevent breakage --- rust-toolchain | 1 + 1 file changed, 1 insertion(+) create mode 100644 rust-toolchain diff --git a/rust-toolchain b/rust-toolchain new file mode 100644 index 000000000..6c623f78c --- /dev/null +++ b/rust-toolchain @@ -0,0 +1 @@ +1.70 \ No newline at end of file From 1ed0f86ed997dd213a1fda0fee7c5df5ffd64e91 Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 16:16:24 -0700 Subject: [PATCH 491/782] calc_new_score can be private --- backend/rust-gbt/src/audit_transaction.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 409a6a905..0867a317b 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -95,7 +95,7 @@ impl AuditTransaction { /// Safety: This function must NEVER set score to NaN. #[inline] - pub fn calc_new_score(&mut self) { + fn calc_new_score(&mut self) { self.score = (self.ancestor_fee as f64) / (if self.ancestor_weight == 0 { 1.0 From 8f675c70629dae0c0bb0185a0955ce5b5e3b23da Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 25 Jun 2023 20:35:41 -0400 Subject: [PATCH 492/782] Add Rust GBT config flag --- backend/mempool-config.sample.json | 1 + .../__fixtures__/mempool-config.template.json | 1 + backend/src/__tests__/config.test.ts | 1 + backend/src/api/websocket-handler.ts | 18 +++++++++++++++--- backend/src/config.ts | 2 ++ docker/backend/mempool-config.json | 1 + docker/backend/start.sh | 2 ++ production/mempool-config.mainnet.json | 1 + production/mempool-config.signet.json | 1 + production/mempool-config.testnet.json | 1 + 10 files changed, 26 insertions(+), 3 deletions(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index 32becd00d..3371a8587 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -27,6 +27,7 @@ "AUDIT": false, "ADVANCED_GBT_AUDIT": false, "ADVANCED_GBT_MEMPOOL": false, + "RUST_GBT": false, "CPFP_INDEXING": false, "DISK_CACHE_BLOCK_INTERVAL": 6 }, diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 919784464..62b2e5f45 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -27,6 +27,7 @@ "AUDIT": true, "ADVANCED_GBT_AUDIT": true, "ADVANCED_GBT_MEMPOOL": true, + "RUST_GBT": false, "CPFP_INDEXING": true, "MAX_BLOCKS_BULK_QUERY": 999, "DISK_CACHE_BLOCK_INTERVAL": 999 diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 278d83f50..937011ba2 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -40,6 +40,7 @@ describe('Mempool Backend Config', () => { AUDIT: false, ADVANCED_GBT_AUDIT: false, ADVANCED_GBT_MEMPOOL: false, + RUST_GBT: false, CPFP_INDEXING: false, MAX_BLOCKS_BULK_QUERY: 0, DISK_CACHE_BLOCK_INTERVAL: 6, diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index c32aee4cd..1bc594a83 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -342,7 +342,11 @@ class WebsocketHandler { this.printLogs(); if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { - await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); + if (config.MEMPOOL.RUST_GBT) { + await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); + } else { + await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); + } } else { mempoolBlocks.updateMempoolBlocks(newMempool, true); } @@ -588,7 +592,11 @@ class WebsocketHandler { if (separateAudit) { auditMempool = deepClone(_memPool); if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { - projectedBlocks = await mempoolBlocks.$rustMakeBlockTemplates(auditMempool, false); + if (config.MEMPOOL.RUST_GBT) { + projectedBlocks = await mempoolBlocks.$rustMakeBlockTemplates(auditMempool, false); + } else { + projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false); + } } else { projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false); } @@ -655,7 +663,11 @@ class WebsocketHandler { } if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { - await mempoolBlocks.$rustMakeBlockTemplates(_memPool, true); + if (config.MEMPOOL.RUST_GBT) { + await mempoolBlocks.$rustMakeBlockTemplates(_memPool, true); + } else { + await mempoolBlocks.$makeBlockTemplates(_memPool, true); + } } else { mempoolBlocks.updateMempoolBlocks(_memPool, true); } diff --git a/backend/src/config.ts b/backend/src/config.ts index ff5ea4f9f..fd7d7bc28 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -31,6 +31,7 @@ interface IConfig { AUDIT: boolean; ADVANCED_GBT_AUDIT: boolean; ADVANCED_GBT_MEMPOOL: boolean; + RUST_GBT: boolean; CPFP_INDEXING: boolean; MAX_BLOCKS_BULK_QUERY: number; DISK_CACHE_BLOCK_INTERVAL: number; @@ -160,6 +161,7 @@ const defaults: IConfig = { 'AUDIT': false, 'ADVANCED_GBT_AUDIT': false, 'ADVANCED_GBT_MEMPOOL': false, + 'RUST_GBT': false, 'CPFP_INDEXING': false, 'MAX_BLOCKS_BULK_QUERY': 0, 'DISK_CACHE_BLOCK_INTERVAL': 6, diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 06ed51f41..45f95a53e 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -25,6 +25,7 @@ "AUDIT": __MEMPOOL_AUDIT__, "ADVANCED_GBT_AUDIT": __MEMPOOL_ADVANCED_GBT_AUDIT__, "ADVANCED_GBT_MEMPOOL": __MEMPOOL_ADVANCED_GBT_MEMPOOL__, + "RUST_GBT": __MEMPOOL_RUST_GBT__, "CPFP_INDEXING": __MEMPOOL_CPFP_INDEXING__, "MAX_BLOCKS_BULK_QUERY": __MEMPOOL_MAX_BLOCKS_BULK_QUERY__, "DISK_CACHE_BLOCK_INTERVAL": __MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__, diff --git a/docker/backend/start.sh b/docker/backend/start.sh index cb1108a05..b746512a9 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -28,6 +28,7 @@ __MEMPOOL_POOLS_JSON_TREE_URL__=${MEMPOOL_POOLS_JSON_TREE_URL:=https://api.githu __MEMPOOL_AUDIT__=${MEMPOOL_AUDIT:=false} __MEMPOOL_ADVANCED_GBT_AUDIT__=${MEMPOOL_ADVANCED_GBT_AUDIT:=false} __MEMPOOL_ADVANCED_GBT_MEMPOOL__=${MEMPOOL_ADVANCED_GBT_MEMPOOL:=false} +__MEMPOOL_RUST_GBT__=${MEMPOOL_RUST_GBT:=false} __MEMPOOL_CPFP_INDEXING__=${MEMPOOL_CPFP_INDEXING:=false} __MEMPOOL_MAX_BLOCKS_BULK_QUERY__=${MEMPOOL_MAX_BLOCKS_BULK_QUERY:=0} __MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__=${MEMPOOL_DISK_CACHE_BLOCK_INTERVAL:=6} @@ -155,6 +156,7 @@ sed -i "s!__MEMPOOL_POOLS_JSON_URL__!${__MEMPOOL_POOLS_JSON_URL__}!g" mempool-co sed -i "s!__MEMPOOL_POOLS_JSON_TREE_URL__!${__MEMPOOL_POOLS_JSON_TREE_URL__}!g" mempool-config.json sed -i "s!__MEMPOOL_AUDIT__!${__MEMPOOL_AUDIT__}!g" mempool-config.json sed -i "s!__MEMPOOL_ADVANCED_GBT_MEMPOOL__!${__MEMPOOL_ADVANCED_GBT_MEMPOOL__}!g" mempool-config.json +sed -i "s!__MEMPOOL_RUST_GBT__!${__MEMPOOL_GBT__}!g" mempool-config.json sed -i "s!__MEMPOOL_ADVANCED_GBT_AUDIT__!${__MEMPOOL_ADVANCED_GBT_AUDIT__}!g" mempool-config.json sed -i "s!__MEMPOOL_CPFP_INDEXING__!${__MEMPOOL_CPFP_INDEXING__}!g" mempool-config.json sed -i "s!__MEMPOOL_MAX_BLOCKS_BULK_QUERY__!${__MEMPOOL_MAX_BLOCKS_BULK_QUERY__}!g" mempool-config.json diff --git a/production/mempool-config.mainnet.json b/production/mempool-config.mainnet.json index 1cbed5119..8630f1fcd 100644 --- a/production/mempool-config.mainnet.json +++ b/production/mempool-config.mainnet.json @@ -14,6 +14,7 @@ "CPFP_INDEXING": true, "ADVANCED_GBT_AUDIT": true, "ADVANCED_GBT_MEMPOOL": true, + "RUST_GBT": true, "USE_SECOND_NODE_FOR_MINFEE": true, "DISK_CACHE_BLOCK_INTERVAL": 1 }, diff --git a/production/mempool-config.signet.json b/production/mempool-config.signet.json index 8cd21047d..e216ed216 100644 --- a/production/mempool-config.signet.json +++ b/production/mempool-config.signet.json @@ -10,6 +10,7 @@ "AUDIT": true, "ADVANCED_GBT_AUDIT": true, "ADVANCED_GBT_MEMPOOL": true, + "RUST_GBT": true, "POLL_RATE_MS": 1000, "DISK_CACHE_BLOCK_INTERVAL": 1 }, diff --git a/production/mempool-config.testnet.json b/production/mempool-config.testnet.json index 9f33e7aa7..02bf892c1 100644 --- a/production/mempool-config.testnet.json +++ b/production/mempool-config.testnet.json @@ -10,6 +10,7 @@ "AUDIT": true, "ADVANCED_GBT_AUDIT": true, "ADVANCED_GBT_MEMPOOL": true, + "RUST_GBT": true, "POLL_RATE_MS": 1000, "DISK_CACHE_BLOCK_INTERVAL": 1 }, From fc504012d5a5d99908e5e1099f3e8098de93014e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 25 Jun 2023 20:37:42 -0400 Subject: [PATCH 493/782] Enforce Rust GBT instance lifecycle --- backend/src/api/blocks.ts | 6 ++--- backend/src/api/disk-cache.ts | 2 ++ backend/src/api/mempool-blocks.ts | 37 ++++++++++++++++++++-------- backend/src/api/websocket-handler.ts | 8 +++--- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 09ed0bebf..16335c36a 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -34,7 +34,7 @@ class Blocks { private lastDifficultyAdjustmentTime = 0; private previousDifficultyRetarget = 0; private newBlockCallbacks: ((block: BlockExtended, txIds: string[], transactions: TransactionExtended[]) => void)[] = []; - private newAsyncBlockCallbacks: ((block: BlockExtended, txIds: string[], transactions: TransactionExtended[]) => Promise)[] = []; + private newAsyncBlockCallbacks: ((block: BlockExtended, txIds: string[], transactions: MempoolTransactionExtended[]) => Promise)[] = []; private mainLoopTimeout: number = 120000; @@ -60,7 +60,7 @@ class Blocks { this.newBlockCallbacks.push(fn); } - public setNewAsyncBlockCallback(fn: (block: BlockExtended, txIds: string[], transactions: TransactionExtended[]) => Promise) { + public setNewAsyncBlockCallback(fn: (block: BlockExtended, txIds: string[], transactions: MempoolTransactionExtended[]) => Promise) { this.newAsyncBlockCallbacks.push(fn); } @@ -642,7 +642,7 @@ class Blocks { const verboseBlock = await bitcoinClient.getBlock(blockHash, 2); const block = BitcoinApi.convertBlock(verboseBlock); const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash); - const transactions = await this.$getTransactionsExtended(blockHash, block.height, false, false, true); + const transactions = await this.$getTransactionsExtended(blockHash, block.height, false, false, true) as MempoolTransactionExtended[]; if (config.MEMPOOL.BACKEND !== 'esplora') { // fill in missing transaction fee data from verboseBlock for (let i = 0; i < transactions.length; i++) { diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 17d75d07b..1e428d8b6 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -195,6 +195,7 @@ class DiskCache { if (data.mempoolArray) { for (const tx of data.mempoolArray) { + delete tx.uid; data.mempool[tx.txid] = tx; } } @@ -207,6 +208,7 @@ class DiskCache { const cacheData2 = JSON.parse(fs.readFileSync(fileName, 'utf8')); if (cacheData2.mempoolArray) { for (const tx of cacheData2.mempoolArray) { + delete tx.uid; data.mempool[tx.txid] = tx; } } else { diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index e0362b6ce..c753d2293 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -327,13 +327,21 @@ class MempoolBlocks { } } - public async $rustMakeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): Promise { + private resetRustGbt(): void { + this.rustInitialized = false; + this.rustGbtGenerator = new GbtGenerator(); + } + + private async $rustMakeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): Promise { const start = Date.now(); // reset mempool short ids - this.resetUids(); + if (saveResults) { + this.resetUids(); + } + // set missing short ids for (const tx of Object.values(newMempool)) { - this.setUid(tx); + this.setUid(tx, !saveResults); } // serialize relevant mempool data into an ArrayBuffer @@ -341,25 +349,34 @@ class MempoolBlocks { const mempoolBuffer = this.mempoolToArrayBuffer(Object.values(newMempool), newMempool); // run the block construction algorithm in a separate thread, and wait for a result + const rustGbt = saveResults ? this.rustGbtGenerator : new GbtGenerator(); try { const { blocks, rates, clusters } = this.convertNapiResultTxids( - await this.rustGbtGenerator.make(new Uint8Array(mempoolBuffer)), + await rustGbt.make(new Uint8Array(mempoolBuffer)), ); - this.rustInitialized = true; + if (saveResults) { + this.rustInitialized = true; + } const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); logger.debug(`RUST makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); return processed; } catch (e) { - this.rustInitialized = false; logger.err('RUST makeBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); + if (saveResults) { + this.resetRustGbt(); + } } return this.mempoolBlocks; } - public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], saveResults: boolean = false): Promise { + public async $oneOffRustBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }): Promise { + return this.$rustMakeBlockTemplates(newMempool, false); + } + + public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[]): Promise { if (!this.rustInitialized) { // need to reset the worker - await this.$rustMakeBlockTemplates(newMempool, saveResults); + await this.$rustMakeBlockTemplates(newMempool, true); return; } @@ -382,11 +399,11 @@ class MempoolBlocks { new Uint8Array(removedBuffer), ), ); - this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + this.processBlockTemplates(newMempool, blocks, rates, clusters, true); logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); } catch (e) { - this.rustInitialized = false; logger.err('RUST updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); + this.resetRustGbt(); } } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 1bc594a83..00d5a6026 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -343,7 +343,7 @@ class WebsocketHandler { if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { if (config.MEMPOOL.RUST_GBT) { - await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); + await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, newTransactions, deletedTransactions); } else { await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); } @@ -574,7 +574,7 @@ class WebsocketHandler { }); } - async handleNewBlock(block: BlockExtended, txIds: string[], transactions: TransactionExtended[]): Promise { + async handleNewBlock(block: BlockExtended, txIds: string[], transactions: MempoolTransactionExtended[]): Promise { if (!this.wss) { throw new Error('WebSocket.Server is not set'); } @@ -593,7 +593,7 @@ class WebsocketHandler { auditMempool = deepClone(_memPool); if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { if (config.MEMPOOL.RUST_GBT) { - projectedBlocks = await mempoolBlocks.$rustMakeBlockTemplates(auditMempool, false); + projectedBlocks = await mempoolBlocks.$oneOffRustBlockTemplates(auditMempool); } else { projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false); } @@ -664,7 +664,7 @@ class WebsocketHandler { if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { if (config.MEMPOOL.RUST_GBT) { - await mempoolBlocks.$rustMakeBlockTemplates(_memPool, true); + await mempoolBlocks.$rustUpdateBlockTemplates(_memPool, [], transactions); } else { await mempoolBlocks.$makeBlockTemplates(_memPool, true); } From 6829e67e15cc4cfcf6b6fe6aab13efee315c6476 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 25 Jun 2023 20:38:18 -0400 Subject: [PATCH 494/782] Add sanity check for uint32 uid overflow --- backend/src/api/mempool-blocks.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index c753d2293..ca318bb5d 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -374,6 +374,10 @@ class MempoolBlocks { } public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[]): Promise { + // sanity check to avoid approaching uint32 uid overflow + if (this.nextUid > 4_000_000_000) { + this.resetRustGbt(); + } if (!this.rustInitialized) { // need to reset the worker await this.$rustMakeBlockTemplates(newMempool, true); From a71f931d9fc1e320a7f4fb5a2736710d2424b7ad Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 25 Jun 2023 21:23:30 -0400 Subject: [PATCH 495/782] Add sanity checks for GBT cache de-sync --- backend/src/api/mempool-blocks.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index ca318bb5d..4ed296b45 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -403,7 +403,13 @@ class MempoolBlocks { new Uint8Array(removedBuffer), ), ); - this.processBlockTemplates(newMempool, blocks, rates, clusters, true); + const expectedMempoolSize = Object.keys(newMempool).length; + const actualMempoolSize = blocks.reduce((total, block) => total + block.length, 0); + if (expectedMempoolSize !== actualMempoolSize) { + throw new Error('GBT returned wrong number of transactions, cache is probably out of sync'); + } else { + this.processBlockTemplates(newMempool, blocks, rates, clusters, true); + } logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); } catch (e) { logger.err('RUST updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); @@ -602,23 +608,32 @@ class MempoolBlocks { clusterMap.set(cluster[0], cluster); } const convertedBlocks: string[][] = blocks.map(block => block.map(uid => { - return this.uidMap.get(uid) || ''; + const txid = this.uidMap.get(uid); + if (txid !== undefined) { + return txid; + } else { + throw new Error('GBT returned a block containing a transaction with unknown uid'); + } })); const convertedRates = {}; for (const rateUid of rateMap.keys()) { const rateTxid = this.uidMap.get(rateUid); - if (rateTxid) { + if (rateTxid !== undefined) { convertedRates[rateTxid] = rateMap.get(rateUid); + } else { + throw new Error('GBT returned a fee rate for a transaction with unknown uid'); } } const convertedClusters = {}; for (const rootUid of clusterMap.keys()) { const rootTxid = this.uidMap.get(rootUid); - if (rootTxid) { + if (rootTxid !== undefined) { const members = clusterMap.get(rootUid)?.map(uid => { return this.uidMap.get(uid); }); convertedClusters[rootTxid] = members; + } else { + throw new Error('GBT returned a cluster rooted in a transaction with unknown uid'); } } return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; From 5d48ae1eec8fa4dda1cbd1194e0ecebc9a0373fb Mon Sep 17 00:00:00 2001 From: junderw Date: Sun, 25 Jun 2023 19:04:01 -0700 Subject: [PATCH 496/782] Use U32HasherState for HashSet --- backend/rust-gbt/src/audit_transaction.rs | 15 +++++++++------ backend/rust-gbt/src/gbt.rs | 10 ++++++---- backend/rust-gbt/src/u32_hasher_types.rs | 8 +++++++- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 0867a317b..79697a150 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -1,4 +1,7 @@ -use crate::thread_transaction::ThreadTransaction; +use crate::{ + thread_transaction::ThreadTransaction, + u32_hasher_types::{u32hashset_new, U32HasherState}, +}; use std::{ cmp::Ordering, collections::HashSet, @@ -17,8 +20,8 @@ pub struct AuditTransaction { pub dependency_rate: f64, pub inputs: Vec, pub relatives_set_flag: bool, - pub ancestors: HashSet, - pub children: HashSet, + pub ancestors: HashSet, + pub children: HashSet, pub ancestor_fee: u64, pub ancestor_weight: u32, pub ancestor_sigops: u32, @@ -76,8 +79,8 @@ impl AuditTransaction { dependency_rate: f64::INFINITY, inputs: tx.inputs.clone(), relatives_set_flag: false, - ancestors: HashSet::new(), - children: HashSet::new(), + ancestors: u32hashset_new(), + children: u32hashset_new(), ancestor_fee: tx.fee, ancestor_weight: tx.weight, ancestor_sigops: tx.sigops, @@ -107,7 +110,7 @@ impl AuditTransaction { #[inline] pub fn set_ancestors( &mut self, - ancestors: HashSet, + ancestors: HashSet, total_fee: u64, total_weight: u32, total_sigops: u32, diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 46b763e2c..faaf27e4e 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -6,7 +6,9 @@ use std::{ use crate::{ audit_transaction::AuditTransaction, - u32_hasher_types::{u32hashmap_with_capacity, u32priority_queue_with_capacity, U32HasherState}, + u32_hasher_types::{ + u32hashmap_with_capacity, u32hashset_new, u32priority_queue_with_capacity, U32HasherState, + }, GbtResult, ThreadTransactionsMap, STARTING_CAPACITY, }; @@ -217,7 +219,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { } fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { - let mut parents: HashSet = HashSet::new(); + let mut parents: HashSet = u32hashset_new(); if let Some(tx) = audit_pool.get(&txid) { if tx.relatives_set_flag { return; @@ -229,7 +231,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { return; } - let mut ancestors: HashSet = HashSet::new(); + let mut ancestors: HashSet = u32hashset_new(); for parent_id in &parents { set_relatives(*parent_id, audit_pool); @@ -268,7 +270,7 @@ fn update_descendants( modified: &mut ModifiedQueue, cluster_rate: f64, ) { - let mut visited: HashSet = HashSet::new(); + let mut visited: HashSet = u32hashset_new(); let mut descendant_stack: Vec = Vec::new(); let root_fee: u64; let root_weight: u32; diff --git a/backend/rust-gbt/src/u32_hasher_types.rs b/backend/rust-gbt/src/u32_hasher_types.rs index 4735844f3..1995bcad2 100644 --- a/backend/rust-gbt/src/u32_hasher_types.rs +++ b/backend/rust-gbt/src/u32_hasher_types.rs @@ -1,6 +1,6 @@ use priority_queue::PriorityQueue; use std::{ - collections::HashMap, + collections::{HashMap, HashSet}, hash::{BuildHasher, Hasher}, }; @@ -16,7 +16,13 @@ pub fn u32priority_queue_with_capacity( PriorityQueue::with_capacity_and_hasher(capacity, U32HasherState(())) } +/// This is the only way to create a `HashSet` with the `U32HasherState` +pub fn u32hashset_new() -> HashSet { + HashSet::with_hasher(U32HasherState(())) +} + /// A private unit type is contained so no one can make an instance of it. +#[derive(Clone)] pub struct U32HasherState(()); impl BuildHasher for U32HasherState { From 4a15cd7abe316e8a300811921b3beff96810f57b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 25 Jun 2023 23:42:33 -0400 Subject: [PATCH 497/782] clearer uint32 uid overflow check --- backend/src/api/mempool-blocks.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 4ed296b45..0974d15a3 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -6,6 +6,8 @@ import config from '../config'; import { Worker } from 'worker_threads'; import path from 'path'; +const MAX_UINT32 = Math.pow(2, 32) - 1; + class MempoolBlocks { private mempoolBlocks: MempoolBlockWithTransactions[] = []; private mempoolBlockDeltas: MempoolBlockDelta[] = []; @@ -375,7 +377,7 @@ class MempoolBlocks { public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[]): Promise { // sanity check to avoid approaching uint32 uid overflow - if (this.nextUid > 4_000_000_000) { + if (this.nextUid + added.length > MAX_UINT32) { this.resetRustGbt(); } if (!this.rustInitialized) { From 6e7a525d12146e1c7f9a1cd7763f59e01d849445 Mon Sep 17 00:00:00 2001 From: junderw Date: Mon, 26 Jun 2023 00:03:45 -0700 Subject: [PATCH 498/782] Fix: napi macro breaks rust-analyzer See issue: https://github.com/napi-rs/napi-rs/issues/944#issuecomment-1013002760 This will ignore expanding the napi macro for rust-analyzer, letting auto-complete work inside the napi impl blocks. --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 692791184..323fa25e4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "editor.tabSize": 2, "typescript.preferences.importModuleSpecifier": "relative", - "typescript.tsdk": "./backend/node_modules/typescript/lib" + "typescript.tsdk": "./backend/node_modules/typescript/lib", + "rust-analyzer.procMacro.ignored": { "napi-derive": ["napi"] } } \ No newline at end of file From 4334b9eac114e6397b4dd38abc160d966501c9d9 Mon Sep 17 00:00:00 2001 From: junderw Date: Mon, 26 Jun 2023 01:19:34 -0700 Subject: [PATCH 499/782] Fix README and publish = false in Cargo.toml --- backend/rust-gbt/Cargo.toml | 2 +- backend/rust-gbt/README.md | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml index 4a8de082f..d529be207 100644 --- a/backend/rust-gbt/Cargo.toml +++ b/backend/rust-gbt/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" description = "An inefficient re-implementation of the getBlockTemplate algorithm in Rust" authors = ["mononaut"] edition = "2021" -exclude = ["index.node"] +publish = false [lib] crate-type = ["cdylib"] diff --git a/backend/rust-gbt/README.md b/backend/rust-gbt/README.md index f437527d8..c48b4a11f 100644 --- a/backend/rust-gbt/README.md +++ b/backend/rust-gbt/README.md @@ -2,11 +2,11 @@ **gbt:** rust implementation of the getBlockTemplate algorithm -This project was bootstrapped by [create-neon](https://www.npmjs.com/package/create-neon). +This project was bootstrapped by [napi](https://www.npmjs.com/package/@napi-rs/cli). ## Installing gbt -Installing gbt requires a [supported version of Node and Rust](https://github.com/neon-bindings/neon#platform-support). +Installing gbt requires a [supported version of Node and Rust](https://github.com/napi-rs/napi-rs#platform-support). You can install the project with npm. In the project directory, run: @@ -24,7 +24,7 @@ If you have already installed the project and only want to run the build, run: $ npm run build ``` -This command uses the [cargo-cp-artifact](https://github.com/neon-bindings/cargo-cp-artifact) utility to run the Rust build and copy the built library into `./index.node`. +This command uses the [napi build](https://www.npmjs.com/package/@napi-rs/cli) utility to run the Rust build and copy the built library into `./gbt.[TARGET_TRIPLE].node`. ## Exploring gbt @@ -43,11 +43,11 @@ In the project directory, you can run: ### `npm install` -Installs the project, including running `npm run build`. +Installs the project, including running `npm run build-release`. ### `npm build` -Builds the Node addon (`index.node`) from source. +Builds the Node addon (`gbt.[TARGET_TRIPLE].node`) from source. Additional [`cargo build`](https://doc.rust-lang.org/cargo/commands/cargo-build.html) arguments may be passed to `npm build` and `npm build-*` commands. For example, to enable a [cargo feature](https://doc.rust-lang.org/cargo/reference/features.html): @@ -75,7 +75,7 @@ The directory structure of this project is: gbt/ ├── Cargo.toml ├── README.md -├── index.node +├── gbt.[TARGET_TRIPLE].node ├── package.json ├── src/ | └── lib.rs @@ -90,7 +90,7 @@ The Cargo [manifest file](https://doc.rust-lang.org/cargo/reference/manifest.htm This file. -### index.node +### gbt.\[TARGET_TRIPLE\].node The Node addon—i.e., a binary Node module—generated by building the project. This is the main module for this package, as dictated by the `"main"` key in `package.json`. @@ -114,7 +114,7 @@ Binary artifacts generated by the Rust build. ## Learn More -To learn more about Neon, see the [Neon documentation](https://neon-bindings.com). +To learn more about Neon, see the [Napi-RS documentation](https://napi.rs/docs/introduction/getting-started). To learn more about Rust, see the [Rust documentation](https://www.rust-lang.org). From f5e066251792c879623478dfbd82cea570e70d6f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 26 Jun 2023 11:15:52 -0400 Subject: [PATCH 500/782] Fix mempool-blocks linter issues --- backend/src/api/mempool-blocks.ts | 34 ++++++++++++++----------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 0974d15a3..d9c61866d 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,6 +1,6 @@ import { GbtGenerator } from '../../rust-gbt'; import logger from '../logger'; -import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, AuditTransaction } from '../mempool.interfaces'; +import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; import config from '../config'; import { Worker } from 'worker_threads'; @@ -18,8 +18,6 @@ class MempoolBlocks { private nextUid: number = 1; private uidMap: Map = new Map(); // map short numerical uids to full txids - constructor() {} - public getMempoolBlocks(): MempoolBlock[] { return this.mempoolBlocks.map((block) => { return { @@ -45,9 +43,7 @@ class MempoolBlocks { const latestMempool = memPool; const memPoolArray: MempoolTransactionExtended[] = []; for (const i in latestMempool) { - if (latestMempool.hasOwnProperty(i)) { - memPoolArray.push(latestMempool[i]); - } + memPoolArray.push(latestMempool[i]); } const start = new Date().getTime(); @@ -223,7 +219,7 @@ class MempoolBlocks { // to reduce the overhead of passing this data to the worker thread const strippedMempool: Map = new Map(); Object.values(newMempool).forEach(entry => { - if (entry.uid != null) { + if (entry.uid !== null && entry.uid !== undefined) { const stripped = { uid: entry.uid, fee: entry.fee, @@ -231,7 +227,7 @@ class MempoolBlocks { sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, effectiveFeePerVsize: entry.effectiveFeePerVsize || entry.adjustedFeePerVsize || entry.feePerVsize, - inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], + inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => (uid !== null && uid !== undefined)) as number[], }; strippedMempool.set(entry.uid, stripped); } @@ -289,10 +285,10 @@ class MempoolBlocks { for (const tx of Object.values(added)) { this.setUid(tx, true); } - const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => uid != null) as number[]; + const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => (uid !== null && uid !== undefined)) as number[]; // prepare a stripped down version of the mempool with only the minimum necessary data // to reduce the overhead of passing this data to the worker thread - const addedStripped: CompactThreadTransaction[] = added.filter(entry => entry.uid != null).map(entry => { + const addedStripped: CompactThreadTransaction[] = added.filter(entry => (entry.uid !== null && entry.uid !== undefined)).map(entry => { return { uid: entry.uid || 0, fee: entry.fee, @@ -300,7 +296,7 @@ class MempoolBlocks { sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, effectiveFeePerVsize: entry.effectiveFeePerVsize || entry.adjustedFeePerVsize || entry.feePerVsize, - inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => uid != null) as number[], + inputs: entry.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => (uid !== null && uid !== undefined)) as number[], }; }); @@ -391,7 +387,7 @@ class MempoolBlocks { for (const tx of Object.values(added)) { this.setUid(tx, true); } - const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => uid != null) as number[]; + const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => (uid !== null && uid !== undefined)) as number[]; // serialize relevant mempool data into an ArrayBuffer // to reduce the overhead of passing this data to the rust thread const addedBuffer = this.mempoolToArrayBuffer(added, newMempool); @@ -516,7 +512,7 @@ class MempoolBlocks { } } - const mempoolBlocks = readyBlocks.map((b, index) => { + const mempoolBlocks = readyBlocks.map((b) => { return this.dataToMempoolBlocks(b.transactionIds, b.transactions, b.totalSize, b.totalWeight, b.totalFees, b.feeStats); }); @@ -551,7 +547,7 @@ class MempoolBlocks { } private setUid(tx: MempoolTransactionExtended, skipSet = false): number { - if (tx.uid == null || !skipSet) { + if (tx.uid === null || tx.uid === undefined || !skipSet) { const uid = this.nextUid; this.nextUid++; this.uidMap.set(uid, tx.txid); @@ -563,7 +559,7 @@ class MempoolBlocks { } private getUid(tx: MempoolTransactionExtended): number | void { - if (tx?.uid != null && this.uidMap.has(tx.uid)) { + if (tx?.uid !== null && tx?.uid !== undefined && this.uidMap.has(tx.uid)) { return tx.uid; } } @@ -646,9 +642,9 @@ class MempoolBlocks { const inputs: { [uid: number]: number[] } = {}; let validCount = 0; for (const tx of txs) { - if (tx.uid != null) { + if (tx.uid !== null && tx.uid !== undefined) { validCount++; - const txInputs = tx.vin.map(v => this.getUid(mempool[v.txid])).filter(uid => uid != null) as number[]; + const txInputs = tx.vin.map(v => this.getUid(mempool[v.txid])).filter(uid => (uid !== null && uid !== undefined)) as number[]; inputs[tx.uid] = txInputs; len += (10 + txInputs.length) * 4; } @@ -658,7 +654,7 @@ class MempoolBlocks { view.setUint32(0, validCount, false); let offset = 4; for (const tx of txs) { - if (tx.uid != null) { + if (tx.uid !== null && tx.uid !== undefined) { view.setUint32(offset, tx.uid, false); view.setFloat64(offset + 4, tx.fee, false); view.setUint32(offset + 12, (tx.adjustedVsize * 4), false); @@ -677,7 +673,7 @@ class MempoolBlocks { } private uidsToArrayBuffer(uids: number[]): ArrayBuffer { - let len = (uids.length + 1) * 4; + const len = (uids.length + 1) * 4; const buf = new ArrayBuffer(len); const view = new DataView(buf); view.setUint32(0, uids.length, false); From a66c0c88cef17f28d812a396dc5d156acc9ac51e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 26 Jun 2023 17:35:33 -0400 Subject: [PATCH 501/782] fix rust gbt priority queue handling --- backend/rust-gbt/src/audit_transaction.rs | 13 +++++++------ backend/rust-gbt/src/gbt.rs | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 79697a150..736ae5301 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -28,6 +28,7 @@ pub struct AuditTransaction { // Safety: Must be private to prevent NaN breaking Ord impl. score: f64, pub used: bool, + /// whether this transaction has been moved to the "modified" priority queue pub modified: bool, pub dirty: bool, } @@ -132,14 +133,14 @@ impl AuditTransaction { root_sigops: u32, cluster_rate: f64, ) -> f64 { - self.ancestors.remove(&root_txid); - self.ancestor_fee -= root_fee; - self.ancestor_weight -= root_weight; - self.ancestor_sigops -= root_sigops; let old_score = self.score(); - self.calc_new_score(); self.dependency_rate = self.dependency_rate.min(cluster_rate); - self.modified = true; + if self.ancestors.remove(&root_txid) { + self.ancestor_fee -= root_fee; + self.ancestor_weight -= root_weight; + self.ancestor_sigops -= root_sigops; + self.calc_new_score(); + } old_score } } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index faaf27e4e..6f6393752 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -35,7 +35,7 @@ impl PartialOrd for TxPriority { if self.score == other.score { Some(self.uid.cmp(&other.uid)) } else { - other.score.partial_cmp(&self.score) + self.score.partial_cmp(&other.score) } } } @@ -95,10 +95,13 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut failures = 0; while !mempool_array.is_empty() || !modified.is_empty() { let next_txid: u32; + let from_modified: bool; if modified.is_empty() { next_txid = mempool_array.pop_front()?; + from_modified = false; } else if mempool_array.is_empty() { next_txid = modified.pop()?.0; + from_modified = true; } else { let next_array_txid = mempool_array.front()?; let next_modified_txid = modified.peek()?.0; @@ -107,16 +110,20 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { match array_tx.cmp(modified_tx) { std::cmp::Ordering::Equal | std::cmp::Ordering::Greater => { next_txid = mempool_array.pop_front()?; + from_modified = false; } std::cmp::Ordering::Less => { next_txid = modified.pop()?.0; + from_modified = true; } } } let next_tx = audit_pool.get(&next_txid)?; - if next_tx.used { + // skip the transaction if it has already been used + // or has been moved to the "modified" priority queue + if next_tx.used || (!from_modified && next_tx.modified) { continue; } @@ -293,9 +300,9 @@ fn update_descendants( // remove root tx as ancestor let old_score = descendant.remove_root(root_txid, root_fee, root_weight, root_sigops, cluster_rate); - // update modified priority if score has changed - // remove_root() always sets modified to true + // add to priority queue or update priority if score has changed if descendant.score() < old_score { + descendant.modified = true; modified.push_decrease( descendant.uid, TxPriority { @@ -304,6 +311,7 @@ fn update_descendants( }, ); } else if descendant.score() > old_score { + descendant.modified = true; modified.push_increase( descendant.uid, TxPriority { From 7873f1c26a4b32663364618cd6e2770277a9cc90 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 26 Jun 2023 17:37:00 -0400 Subject: [PATCH 502/782] fix rust gbt cpfp cluster construction --- backend/rust-gbt/src/gbt.rs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 6f6393752..6fc3155ee 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -135,28 +135,23 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { overflow.push(next_txid); failures += 1; } else { - let mut package: Vec<(u32, usize, u32)> = Vec::new(); + let mut package: Vec<(u32, usize)> = Vec::new(); let mut cluster: Vec = Vec::new(); let is_cluster: bool = !next_tx.ancestors.is_empty(); - package.push((next_txid, next_tx.ancestors.len(), next_tx.weight)); - cluster.push(next_txid); for ancestor_id in &next_tx.ancestors { if let Some(ancestor) = audit_pool.get(ancestor_id) { - package.push((*ancestor_id, ancestor.ancestors.len(), ancestor.weight)); - cluster.push(*ancestor_id); + package.push((*ancestor_id, ancestor.ancestors.len())); } } - package.sort_unstable_by_key(|a| 0 - a.1); - - if is_cluster { - clusters.push(cluster); - } + package.sort_unstable_by_key(|a| a.1); + package.push((next_txid, next_tx.ancestors.len())); let cluster_rate = next_tx .dependency_rate .min(next_tx.ancestor_fee as f64 / (f64::from(next_tx.ancestor_weight) / 4.0)); - for (txid, _, _) in &package { + for (txid, _) in &package { + cluster.push(*txid); if let Some(tx) = audit_pool.get_mut(txid) { tx.used = true; if tx.effective_fee_per_vsize != cluster_rate { @@ -170,6 +165,10 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { update_descendants(*txid, &mut audit_pool, &mut modified, cluster_rate); } + if is_cluster { + clusters.push(cluster); + } + failures = 0; } @@ -185,6 +184,8 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { // reset for the next block transactions = Vec::with_capacity(STARTING_CAPACITY); block_weight = 4000; + block_sigops = 0; + failures = 0; // 'overflow' packages didn't fit in this block, but are valid candidates for the next overflow.reverse(); for overflowed in &overflow { From ac8f88da387f735879fb47e5793680f4752ea1d2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 26 Jun 2023 21:04:10 -0400 Subject: [PATCH 503/782] protect ancestor data from outside assignments --- backend/rust-gbt/src/audit_transaction.rs | 21 ++++++++++++++++++--- backend/rust-gbt/src/gbt.rs | 6 +++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 736ae5301..e9f2655f0 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -22,9 +22,9 @@ pub struct AuditTransaction { pub relatives_set_flag: bool, pub ancestors: HashSet, pub children: HashSet, - pub ancestor_fee: u64, - pub ancestor_weight: u32, - pub ancestor_sigops: u32, + ancestor_fee: u64, + ancestor_weight: u32, + ancestor_sigops: u32, // Safety: Must be private to prevent NaN breaking Ord impl. score: f64, pub used: bool, @@ -97,6 +97,21 @@ impl AuditTransaction { self.score } + #[inline] + pub const fn ancestor_fee(&self) -> u64 { + self.ancestor_fee + } + + #[inline] + pub const fn ancestor_weight(&self) -> u32 { + self.ancestor_weight + } + + #[inline] + pub const fn ancestor_sigops(&self) -> u32 { + self.ancestor_sigops + } + /// Safety: This function must NEVER set score to NaN. #[inline] fn calc_new_score(&mut self) { diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 6fc3155ee..2bf693cca 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -128,8 +128,8 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { } if blocks.len() < (MAX_BLOCKS - 1) - && ((block_weight + next_tx.ancestor_weight >= BLOCK_WEIGHT_UNITS) - || (block_sigops + next_tx.ancestor_sigops > BLOCK_SIGOPS)) + && ((block_weight + next_tx.ancestor_weight() >= BLOCK_WEIGHT_UNITS) + || (block_sigops + next_tx.ancestor_sigops() > BLOCK_SIGOPS)) { // hold this package in an overflow list while we check for smaller options overflow.push(next_txid); @@ -148,7 +148,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let cluster_rate = next_tx .dependency_rate - .min(next_tx.ancestor_fee as f64 / (f64::from(next_tx.ancestor_weight) / 4.0)); + .min(next_tx.ancestor_fee() as f64 / (f64::from(next_tx.ancestor_weight()) / 4.0)); for (txid, _) in &package { cluster.push(*txid); From 75fd4ff5e169f6bb33383f04d2f0ae68bb6f5358 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 26 Jun 2023 21:07:14 -0400 Subject: [PATCH 504/782] swap mempool_array deque for a mempool_stack vec --- backend/rust-gbt/src/gbt.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 2bf693cca..d77974497 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -1,7 +1,7 @@ use priority_queue::PriorityQueue; use std::{ cmp::Ordering, - collections::{HashMap, HashSet, VecDeque}, + collections::{HashMap, HashSet}, }; use crate::{ @@ -57,31 +57,31 @@ impl Ord for TxPriority { #[allow(clippy::cognitive_complexity)] pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut audit_pool: AuditPool = u32hashmap_with_capacity(STARTING_CAPACITY); - let mut mempool_array: VecDeque = VecDeque::with_capacity(STARTING_CAPACITY); + let mut mempool_stack: Vec = Vec::with_capacity(STARTING_CAPACITY); let mut clusters: Vec> = Vec::new(); // Initialize working structs for (uid, tx) in mempool { let audit_tx = AuditTransaction::from_thread_transaction(tx); - // Safety: audit_pool and mempool_array must always contain the same transactions + // Safety: audit_pool and mempool_stack must always contain the same transactions audit_pool.insert(audit_tx.uid, audit_tx); - mempool_array.push_back(*uid); + mempool_stack.push(*uid); } // Build relatives graph & calculate ancestor scores - for txid in &mempool_array { + for txid in &mempool_stack { set_relatives(*txid, &mut audit_pool); } // Sort by descending ancestor score - mempool_array.make_contiguous().sort_unstable_by(|a, b| { + mempool_stack.sort_unstable_by(|a, b| { let a_tx = audit_pool .get(a) - .expect("audit_pool contains exact same txes as mempool_array"); + .expect("audit_pool contains exact same txes as mempool_stack"); let b_tx = audit_pool .get(b) - .expect("audit_pool contains exact same txes as mempool_array"); - b_tx.cmp(a_tx) + .expect("audit_pool contains exact same txes as mempool_stack"); + a_tx.cmp(b_tx) }); // Build blocks by greedily choosing the highest feerate package @@ -93,23 +93,23 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut modified: ModifiedQueue = u32priority_queue_with_capacity(STARTING_CAPACITY); let mut overflow: Vec = Vec::new(); let mut failures = 0; - while !mempool_array.is_empty() || !modified.is_empty() { + while !mempool_stack.is_empty() || !modified.is_empty() { let next_txid: u32; let from_modified: bool; if modified.is_empty() { - next_txid = mempool_array.pop_front()?; + next_txid = mempool_stack.pop()?; from_modified = false; - } else if mempool_array.is_empty() { + } else if mempool_stack.is_empty() { next_txid = modified.pop()?.0; from_modified = true; } else { - let next_array_txid = mempool_array.front()?; + let next_array_txid = mempool_stack.last()?; let next_modified_txid = modified.peek()?.0; let array_tx: &AuditTransaction = audit_pool.get(next_array_txid)?; let modified_tx: &AuditTransaction = audit_pool.get(next_modified_txid)?; match array_tx.cmp(modified_tx) { std::cmp::Ordering::Equal | std::cmp::Ordering::Greater => { - next_txid = mempool_array.pop_front()?; + next_txid = mempool_stack.pop()?; from_modified = false; } std::cmp::Ordering::Less => { @@ -175,7 +175,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { // this block is full let exceeded_package_tries = failures > 1000 && block_weight > (BLOCK_WEIGHT_UNITS - BLOCK_RESERVED_WEIGHT); - let queue_is_empty = mempool_array.is_empty() && modified.is_empty(); + let queue_is_empty = mempool_stack.is_empty() && modified.is_empty(); if (exceeded_package_tries || queue_is_empty) && blocks.len() < (MAX_BLOCKS - 1) { // finalize this block if !transactions.is_empty() { @@ -199,7 +199,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { }, ); } else { - mempool_array.push_front(*overflowed); + mempool_stack.push(*overflowed); } } } From 1688b7d24eb6ad0a92e006585186f15dd029d3fa Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 26 Jun 2023 21:11:08 -0400 Subject: [PATCH 505/782] fix handling of used txs at top of mempool stack --- backend/rust-gbt/src/gbt.rs | 74 +++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index d77974497..68a54fcec 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -94,45 +94,33 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { let mut overflow: Vec = Vec::new(); let mut failures = 0; while !mempool_stack.is_empty() || !modified.is_empty() { - let next_txid: u32; - let from_modified: bool; - if modified.is_empty() { - next_txid = mempool_stack.pop()?; - from_modified = false; - } else if mempool_stack.is_empty() { - next_txid = modified.pop()?.0; - from_modified = true; - } else { - let next_array_txid = mempool_stack.last()?; - let next_modified_txid = modified.peek()?.0; - let array_tx: &AuditTransaction = audit_pool.get(next_array_txid)?; - let modified_tx: &AuditTransaction = audit_pool.get(next_modified_txid)?; - match array_tx.cmp(modified_tx) { - std::cmp::Ordering::Equal | std::cmp::Ordering::Greater => { - next_txid = mempool_stack.pop()?; - from_modified = false; - } - std::cmp::Ordering::Less => { - next_txid = modified.pop()?.0; - from_modified = true; - } - } - } - - let next_tx = audit_pool.get(&next_txid)?; - - // skip the transaction if it has already been used - // or has been moved to the "modified" priority queue - if next_tx.used || (!from_modified && next_tx.modified) { + let next_from_stack = next_valid_from_stack(&mut mempool_stack, &audit_pool); + let next_from_queue = next_valid_from_queue(&mut modified, &audit_pool); + if next_from_stack.is_none() && next_from_queue.is_none() { continue; } + let (next_tx, from_stack) = match (next_from_stack, next_from_queue) { + (Some(stack_tx), Some(queue_tx)) => match queue_tx.cmp(stack_tx) { + std::cmp::Ordering::Less => (stack_tx, true), + _ => (queue_tx, false), + }, + (Some(stack_tx), None) => (stack_tx, true), + (None, Some(queue_tx)) => (queue_tx, false), + (None, None) => unreachable!(), + }; + + if from_stack { + mempool_stack.pop(); + } else { + modified.pop(); + } if blocks.len() < (MAX_BLOCKS - 1) && ((block_weight + next_tx.ancestor_weight() >= BLOCK_WEIGHT_UNITS) || (block_sigops + next_tx.ancestor_sigops() > BLOCK_SIGOPS)) { // hold this package in an overflow list while we check for smaller options - overflow.push(next_txid); + overflow.push(next_tx.uid); failures += 1; } else { let mut package: Vec<(u32, usize)> = Vec::new(); @@ -144,7 +132,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { } } package.sort_unstable_by_key(|a| a.1); - package.push((next_txid, next_tx.ancestors.len())); + package.push((next_tx.uid, next_tx.ancestors.len())); let cluster_rate = next_tx .dependency_rate @@ -226,6 +214,28 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { }) } +fn next_valid_from_stack<'a>(mempool_stack: &mut Vec, audit_pool: &'a AuditPool) -> Option<&'a AuditTransaction> { + let mut next_txid = mempool_stack.last()?; + let mut tx: &AuditTransaction = audit_pool.get(next_txid)?; + while tx.used || tx.modified { + mempool_stack.pop(); + next_txid = mempool_stack.last()?; + tx = audit_pool.get(next_txid)?; + } + Some(tx) +} + +fn next_valid_from_queue<'a>(queue: &mut ModifiedQueue, audit_pool: &'a AuditPool) -> Option<&'a AuditTransaction> { + let mut next_txid = queue.peek()?.0; + let mut tx: &AuditTransaction = audit_pool.get(next_txid)?; + while tx.used { + queue.pop(); + next_txid = queue.peek()?.0; + tx = audit_pool.get(next_txid)?; + } + Some(tx) +} + fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { let mut parents: HashSet = u32hashset_new(); if let Some(tx) = audit_pool.get(&txid) { From 702c4c123e18fec01ce583caf99b11097360db70 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 26 Jun 2023 21:13:02 -0400 Subject: [PATCH 506/782] remove unnecessary option wrapper from gbt return value --- backend/rust-gbt/src/gbt.rs | 6 +++--- backend/rust-gbt/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 68a54fcec..896b1681b 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -55,7 +55,7 @@ impl Ord for TxPriority { // TODO: Make gbt smaller to fix these lints. #[allow(clippy::too_many_lines)] #[allow(clippy::cognitive_complexity)] -pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { +pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { let mut audit_pool: AuditPool = u32hashmap_with_capacity(STARTING_CAPACITY); let mut mempool_stack: Vec = Vec::with_capacity(STARTING_CAPACITY); let mut clusters: Vec> = Vec::new(); @@ -207,11 +207,11 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> Option { } } - Some(GbtResult { + GbtResult { blocks, clusters, rates, - }) + } } fn next_valid_from_stack<'a>(mempool_stack: &mut Vec, audit_pool: &'a AuditPool) -> Option<&'a AuditTransaction> { diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 31b93d154..f70ea989f 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -110,7 +110,7 @@ where .lock() .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; callback(&mut map); - gbt::gbt(&mut map).ok_or_else(|| napi::Error::from_reason("gbt failed")) + Ok(gbt::gbt(&mut map)) }); handle From 6650541b2dd7b9884ad7fc39f372dffbef773699 Mon Sep 17 00:00:00 2001 From: junderw Date: Mon, 26 Jun 2023 19:29:32 -0700 Subject: [PATCH 507/782] Added Logging and refactored a bit --- Cargo.lock | 150 ++++++++++++++++++++- backend/rust-gbt/Cargo.toml | 3 + backend/rust-gbt/src/audit_transaction.rs | 24 +++- backend/rust-gbt/src/gbt.rs | 53 ++++++-- backend/rust-gbt/src/lib.rs | 50 ++++++- backend/rust-gbt/src/thread_transaction.rs | 1 + backend/rust-gbt/src/u32_hasher_types.rs | 7 + 7 files changed, 265 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d7e7ef21a..e03ab2531 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,6 +70,9 @@ dependencies = [ "napi-build", "napi-derive", "priority-queue", + "tracing", + "tracing-log", + "tracing-subscriber", ] [[package]] @@ -97,6 +100,12 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.146" @@ -113,6 +122,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + [[package]] name = "memchr" version = "2.5.0" @@ -177,6 +201,16 @@ dependencies = [ "libloading", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num_cpus" version = "1.15.0" @@ -193,6 +227,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -235,9 +275,24 @@ checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.2", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.7.2" @@ -250,6 +305,21 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + [[package]] name = "syn" version = "1.0.109" @@ -272,6 +342,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tokio" version = "1.28.2" @@ -284,6 +364,68 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.20", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + [[package]] name = "unicode-ident" version = "1.0.9" @@ -296,6 +438,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "winapi" version = "0.3.9" diff --git a/backend/rust-gbt/Cargo.toml b/backend/rust-gbt/Cargo.toml index d529be207..09fde52e2 100644 --- a/backend/rust-gbt/Cargo.toml +++ b/backend/rust-gbt/Cargo.toml @@ -17,6 +17,9 @@ bytes = "1.4.0" napi = { version = "2.13.2", features = ["napi8", "tokio_rt"] } napi-derive = "2.13.0" bytemuck = "1.13.1" +tracing = "0.1.36" +tracing-log = "0.1.3" +tracing-subscriber = { version = "0.3.15", features = ["env-filter"]} [build-dependencies] napi-build = "2.0.1" diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index e9f2655f0..d4e9cf1c3 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -9,7 +9,7 @@ use std::{ }; #[allow(clippy::struct_excessive_bools)] -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct AuditTransaction { pub uid: u32, pub fee: u64, @@ -97,11 +97,6 @@ impl AuditTransaction { self.score } - #[inline] - pub const fn ancestor_fee(&self) -> u64 { - self.ancestor_fee - } - #[inline] pub const fn ancestor_weight(&self) -> u32 { self.ancestor_weight @@ -112,6 +107,23 @@ impl AuditTransaction { self.ancestor_sigops } + #[inline] + pub fn cluster_rate(&self) -> f64 { + // Safety: self.ancestor_weight can never be 0. + // Even if it could, as it approaches 0, the value inside the min() call + // grows, so if we think of 0 as "grew infinitely" then dependency_rate would be + // the smaller of the two. If either side is NaN, the other side is returned. + self.dependency_rate + .min(self.ancestor_fee as f64 / (f64::from(self.ancestor_weight) / 4.0)) + } + + pub fn set_dirty_if_different(&mut self, cluster_rate: f64) { + if self.effective_fee_per_vsize != cluster_rate { + self.effective_fee_per_vsize = cluster_rate; + self.dirty = true; + } + } + /// Safety: This function must NEVER set score to NaN. #[inline] fn calc_new_score(&mut self) { diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 896b1681b..797f7f981 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -3,6 +3,7 @@ use std::{ cmp::Ordering, collections::{HashMap, HashSet}, }; +use tracing::{info, trace}; use crate::{ audit_transaction::AuditTransaction, @@ -20,6 +21,7 @@ const MAX_BLOCKS: usize = 8; type AuditPool = HashMap; type ModifiedQueue = PriorityQueue; +#[derive(Debug)] struct TxPriority { uid: u32, score: f64, @@ -60,7 +62,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { let mut mempool_stack: Vec = Vec::with_capacity(STARTING_CAPACITY); let mut clusters: Vec> = Vec::new(); - // Initialize working structs + info!("Initializing working structs"); for (uid, tx) in mempool { let audit_tx = AuditTransaction::from_thread_transaction(tx); // Safety: audit_pool and mempool_stack must always contain the same transactions @@ -68,12 +70,13 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { mempool_stack.push(*uid); } - // Build relatives graph & calculate ancestor scores + info!("Building relatives graph & calculate ancestor scores"); for txid in &mempool_stack { set_relatives(*txid, &mut audit_pool); } + trace!("Post relative graph Audit Pool: {:#?}", audit_pool); - // Sort by descending ancestor score + info!("Sorting by descending ancestor score"); mempool_stack.sort_unstable_by(|a, b| { let a_tx = audit_pool .get(a) @@ -84,8 +87,8 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { a_tx.cmp(b_tx) }); - // Build blocks by greedily choosing the highest feerate package - // (i.e. the package rooted in the transaction with the best ancestor score) + info!("Building blocks by greedily choosing the highest feerate package"); + info!("(i.e. the package rooted in the transaction with the best ancestor score)"); let mut blocks: Vec> = Vec::new(); let mut block_weight: u32 = BLOCK_RESERVED_WEIGHT; let mut block_sigops: u32 = 0; @@ -94,6 +97,22 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { let mut overflow: Vec = Vec::new(); let mut failures = 0; while !mempool_stack.is_empty() || !modified.is_empty() { + // This trace log storm is big, so to make scrolling through + // Each iteration easier, leaving a bunch of empty rows + // And a header of ====== + trace!("\n\n\n\n\n\n\n\n\n\n=================================="); + trace!("mempool_array: {:#?}", mempool_stack); + trace!("clusters: {:#?}", clusters); + trace!("modified: {:#?}", modified); + trace!("audit_pool: {:#?}", audit_pool); + trace!("blocks: {:#?}", blocks); + trace!("block_weight: {:#?}", block_weight); + trace!("block_sigops: {:#?}", block_sigops); + trace!("transactions: {:#?}", transactions); + trace!("overflow: {:#?}", overflow); + trace!("failures: {:#?}", failures); + trace!("\n=================================="); + let next_from_stack = next_valid_from_stack(&mut mempool_stack, &audit_pool); let next_from_queue = next_valid_from_queue(&mut modified, &audit_pool); if next_from_stack.is_none() && next_from_queue.is_none() { @@ -134,18 +153,13 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { package.sort_unstable_by_key(|a| a.1); package.push((next_tx.uid, next_tx.ancestors.len())); - let cluster_rate = next_tx - .dependency_rate - .min(next_tx.ancestor_fee() as f64 / (f64::from(next_tx.ancestor_weight()) / 4.0)); + let cluster_rate = next_tx.cluster_rate(); for (txid, _) in &package { cluster.push(*txid); if let Some(tx) = audit_pool.get_mut(txid) { tx.used = true; - if tx.effective_fee_per_vsize != cluster_rate { - tx.effective_fee_per_vsize = cluster_rate; - tx.dirty = true; - } + tx.set_dirty_if_different(cluster_rate); transactions.push(tx.uid); block_weight += tx.weight; block_sigops += tx.sigops; @@ -202,10 +216,15 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { // make a list of dirty transactions and their new rates let mut rates: Vec> = Vec::new(); for (txid, tx) in audit_pool { + trace!("txid: {}, is_dirty: {}", txid, tx.dirty); if tx.dirty { rates.push(vec![f64::from(txid), tx.effective_fee_per_vsize]); } } + trace!("\n\n\n\n\n===================="); + trace!("blocks: {:#?}", blocks); + trace!("clusters: {:#?}", clusters); + trace!("rates: {:#?}\n====================\n\n\n\n\n", rates); GbtResult { blocks, @@ -214,7 +233,10 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { } } -fn next_valid_from_stack<'a>(mempool_stack: &mut Vec, audit_pool: &'a AuditPool) -> Option<&'a AuditTransaction> { +fn next_valid_from_stack<'a>( + mempool_stack: &mut Vec, + audit_pool: &'a AuditPool, +) -> Option<&'a AuditTransaction> { let mut next_txid = mempool_stack.last()?; let mut tx: &AuditTransaction = audit_pool.get(next_txid)?; while tx.used || tx.modified { @@ -225,7 +247,10 @@ fn next_valid_from_stack<'a>(mempool_stack: &mut Vec, audit_pool: &'a Audit Some(tx) } -fn next_valid_from_queue<'a>(queue: &mut ModifiedQueue, audit_pool: &'a AuditPool) -> Option<&'a AuditTransaction> { +fn next_valid_from_queue<'a>( + queue: &mut ModifiedQueue, + audit_pool: &'a AuditPool, +) -> Option<&'a AuditTransaction> { let mut next_txid = queue.peek()?.0; let mut tx: &AuditTransaction = audit_pool.get(next_txid)?; while tx.used { diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index f70ea989f..754763946 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -8,17 +8,21 @@ use napi::bindgen_prelude::{Result, Uint8Array}; use napi_derive::napi; +use tracing::{debug, info, trace}; +use tracing_log::LogTracer; +use tracing_subscriber::{EnvFilter, FmtSubscriber}; use std::collections::HashMap; use std::sync::{Arc, Mutex}; -use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState}; mod audit_transaction; mod gbt; mod thread_transaction; mod u32_hasher_types; mod utils; + use thread_transaction::ThreadTransaction; +use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState}; /// This is the starting capacity for HashMap/Vec/etc. that deal with transactions. /// `HashMap` doubles capacity when it hits it, so 2048 is a decent tradeoff between @@ -35,12 +39,36 @@ pub struct GbtGenerator { thread_transactions: Arc>, } +#[napi::module_init] +fn init() { + // Set all `tracing` logs to print to STDOUT + // Note: Passing RUST_LOG env variable to the node process + // will change the log level for the rust module. + tracing::subscriber::set_global_default( + FmtSubscriber::builder() + .with_env_filter(EnvFilter::from_default_env()) + .with_ansi( + // Default to no-color logs. + // Setting RUST_LOG_COLOR to 1 or true|TRUE|True etc. + // will enable color + std::env::var("RUST_LOG_COLOR") + .map(|s| ["1", "true"].contains(&&*s.to_lowercase())) + .unwrap_or(false), + ) + .finish(), + ) + .expect("Logging subscriber failed"); + // Convert all `log` logs into `tracing` events + LogTracer::init().expect("Legacy log subscriber failed"); +} + #[napi] impl GbtGenerator { #[napi(constructor)] #[allow(clippy::new_without_default)] #[must_use] pub fn new() -> Self { + debug!("Created new GbtGenerator"); Self { thread_transactions: Arc::new(Mutex::new(u32hashmap_with_capacity(STARTING_CAPACITY))), } @@ -51,6 +79,7 @@ impl GbtGenerator { /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] pub async fn make(&self, mempool_buffer: Uint8Array) -> Result { + trace!("make: Current State {:#?}", self.thread_transactions); run_task(Arc::clone(&self.thread_transactions), move |map| { for tx in ThreadTransaction::batch_from_buffer(&mempool_buffer) { map.insert(tx.uid, tx); @@ -64,6 +93,7 @@ impl GbtGenerator { /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] pub async fn update(&self, new_txs: Uint8Array, remove_txs: Uint8Array) -> Result { + trace!("update: Current State {:#?}", self.thread_transactions); run_task(Arc::clone(&self.thread_transactions), move |map| { for tx in ThreadTransaction::batch_from_buffer(&new_txs) { map.insert(tx.uid, tx); @@ -105,12 +135,28 @@ async fn run_task( where F: FnOnce(&mut ThreadTransactionsMap) + Send + 'static, { + debug!("Spawning thread..."); let handle = napi::tokio::task::spawn_blocking(move || { + debug!( + "Getting lock for thread_transactions from thread {:?}...", + std::thread::current().id() + ); let mut map = thread_transactions .lock() .map_err(|_| napi::Error::from_reason("THREAD_TRANSACTIONS Mutex poisoned"))?; callback(&mut map); - Ok(gbt::gbt(&mut map)) + + info!("Starting gbt algorithm for {} elements...", map.len()); + let result = gbt::gbt(&mut map); + info!("Finished gbt algorithm for {} elements...", map.len()); + + debug!( + "Releasing lock for thread_transactions from thread {:?}...", + std::thread::current().id() + ); + drop(map); + + Ok(result) }); handle diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs index a16020165..2bb3a959d 100644 --- a/backend/rust-gbt/src/thread_transaction.rs +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -1,6 +1,7 @@ use bytes::buf::Buf; use std::io::Cursor; +#[derive(Debug)] pub struct ThreadTransaction { pub uid: u32, pub fee: u64, diff --git a/backend/rust-gbt/src/u32_hasher_types.rs b/backend/rust-gbt/src/u32_hasher_types.rs index 1995bcad2..6f9f99a85 100644 --- a/backend/rust-gbt/src/u32_hasher_types.rs +++ b/backend/rust-gbt/src/u32_hasher_types.rs @@ -1,6 +1,7 @@ use priority_queue::PriorityQueue; use std::{ collections::{HashMap, HashSet}, + fmt::Debug, hash::{BuildHasher, Hasher}, }; @@ -25,6 +26,12 @@ pub fn u32hashset_new() -> HashSet { #[derive(Clone)] pub struct U32HasherState(()); +impl Debug for U32HasherState { + fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Ok(()) + } +} + impl BuildHasher for U32HasherState { type Hasher = U32Hasher; From 71f150b58762ab758018089472eec790e076da84 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 27 Jun 2023 17:42:04 -0400 Subject: [PATCH 508/782] Add end-to-end test of rust gbt against results from Core --- backend/src/__tests__/gbt/gbt-tests.ts | 27 + .../gbt/test-data/target-template.json | 7070 +++++++++++++++++ .../__tests__/gbt/test-data/test-buffer.bin | Bin 0 -> 796564 bytes .../gbt/test-data/test-data-ids.json | 1 + 4 files changed, 7098 insertions(+) create mode 100644 backend/src/__tests__/gbt/gbt-tests.ts create mode 100644 backend/src/__tests__/gbt/test-data/target-template.json create mode 100644 backend/src/__tests__/gbt/test-data/test-buffer.bin create mode 100644 backend/src/__tests__/gbt/test-data/test-data-ids.json diff --git a/backend/src/__tests__/gbt/gbt-tests.ts b/backend/src/__tests__/gbt/gbt-tests.ts new file mode 100644 index 000000000..53d05b481 --- /dev/null +++ b/backend/src/__tests__/gbt/gbt-tests.ts @@ -0,0 +1,27 @@ +import fs from 'fs'; +import { GbtGenerator } from '../../../rust-gbt'; +import path from 'path'; + +const baseline = require('./test-data/target-template.json'); +const testVector = require('./test-data/test-data-ids.json'); +const vectorUidMap: Map = new Map(testVector.map(x => [x[0], x[1]])); +const vectorTxidMap: Map = new Map(testVector.map(x => [x[1], x[0]])); +// Note that this test buffer is specially constructed +// such that uids are assigned in numerical txid order +// so that ties break the same way as in Core's implementation +const vectorBuffer: ArrayBuffer = fs.readFileSync(path.join(__dirname, './', './test-data/test-buffer.bin')); + +describe('Rust GBT', () => { + test('should produce the same template as getBlockTemplate from Bitcoin Core', async () => { + const rustGbt = new GbtGenerator(); + const result = await rustGbt.make(new Uint8Array(vectorBuffer)); + + const blocks: [string, number][][] = result.blocks.map(block => { + return block.map(uid => [vectorUidMap.get(uid) || 'missing', uid]); + }); + const template = baseline.map(tx => [tx.txid, vectorTxidMap.get(tx.txid)]); + + expect(blocks[0].length).toEqual(baseline.length); + expect(blocks[0]).toEqual(template); + }); +}); diff --git a/backend/src/__tests__/gbt/test-data/target-template.json b/backend/src/__tests__/gbt/test-data/target-template.json new file mode 100644 index 000000000..d16f717a2 --- /dev/null +++ b/backend/src/__tests__/gbt/test-data/target-template.json @@ -0,0 +1,7070 @@ +[ + { + "txid": "5ffbad40ab3f5100677bc6464c0d3d754d0ae1aea1fad597efd2b15964bb7cb8", + "weight": 892 + }, + { + "txid": "f8c3bf8e8c83e342f7ad5b18fd946cf99b05057f752a01076489dc3ed230ce5f", + "weight": 840 + }, + { + "txid": "80055b225e78b15d462178cd04e5065eb07fc2fe567836d169a1ec7da6e39259", + "weight": 1266 + }, + { + "txid": "f96aceb659ea8b78674dc8589bba2072f375d09a8fd22bdcd5e77fbf24f798f5", + "weight": 900 + }, + { + "txid": "9ba924cba0dcfe149365d2a6188ea060a3a11cfc18e685e7856e85517c7a6e65", + "weight": 561 + }, + { + "txid": "bf7065d708f4ced48f1cf3e7146336591029a1427880e2664ec5d80bcc04b3a6", + "weight": 561 + }, + { + "txid": "2030ee722a7241e62804c3aaf830b127c29fd299f1ae9c23ac99b650c573617c", + "weight": 573 + }, + { + "txid": "a1e940723ab44707fdf72c20342df361b00b32733dba6bc4ccafd67628b91f0b", + "weight": 686 + }, + { + "txid": "79d52e06b6544d101496383a3cb343c4550f816eb499d86ad826c03581e3bd8f", + "weight": 697 + }, + { + "txid": "67f3fcd7881870a6582d49473b154794070444597a7d44f11fb87586c25cb9e6", + "weight": 933 + }, + { + "txid": "d5dc3d03d2fbd7463aad963e729221a540fac3f7ca21343ae2d1450307678e10", + "weight": 1257 + }, + { + "txid": "9d4ff8fe740310e78c46825d554d3ef7b60de710d2836242329a37ea04c30e32", + "weight": 1738 + }, + { + "txid": "d68ad8e9b8078238b3ccb93141026a53506d60209e44351176b3b28188ab3319", + "weight": 561 + }, + { + "txid": "be1e4e48717741c8b3ae8429d38a311400b5f4e7dc7242ab6419995cba8ab862", + "weight": 685 + }, + { + "txid": "c64c90422a3bf3d9e3eb7c05abcf67b872abf9c8bca4eb5ee9b4eda9f8a736a7", + "weight": 685 + }, + { + "txid": "cbb0da41f1198d5eaccd905faea19aa80913b2de22a2d4c3d1f26ea280f8684f", + "weight": 737 + }, + { + "txid": "c545474d081b17a37b7fd9da57c4320547b75f7af3eacff300f6ef6449536345", + "weight": 1094 + }, + { + "txid": "13db0c88910edc12c0a8ab53b520d06bd6e9281bae192f469e62bc802d5983a9", + "weight": 1181 + }, + { + "txid": "34775cda09e514b0406266483a95f62239484a23567242dc1846575976e57527", + "weight": 573 + }, + { + "txid": "50c57ec53e491d24cacb50127e6ad69832e658a956b3136fcd7ab506290dd9ed", + "weight": 832 + }, + { + "txid": "cf56c244972305d27627e2ed38c094a5743519f4eebd84140f03ca57f77ba85c", + "weight": 888 + }, + { + "txid": "ee17c3b697d1756f1ab0c1e636ea97e7d117d15a5b43f3edb423a2be278d53e9", + "weight": 838 + }, + { + "txid": "8816f390a70f07673451f6a9dce3f75532b818884844142c42fb5ca3827c58b4", + "weight": 442 + }, + { + "txid": "70e7fff6784e58f15974e0fddf702c8447017401915b9bc175694017ec31fbf4", + "weight": 1936 + }, + { + "txid": "56b13b0a9a4a50a9dde6d37b30123b57cb62f3db5e6e7d82ea0bdd9680dc1d17", + "weight": 3041 + }, + { + "txid": "ac2f826d694bb8ffb0f79bd0e25d05ced0af2ae00bd6db6c2728293d7130813b", + "weight": 3237 + }, + { + "txid": "32ab642801fcfcc83ee24d15d6403a635ab51a5cebec98f39fbb7e2ca49ba4b3", + "weight": 562 + }, + { + "txid": "332317fdaed7b837c8a063f90de86a6ca0b5e8cc5acf88579a7c8fce465da7a1", + "weight": 438 + }, + { + "txid": "99c2fed3d6ac2fa88865a71f80c34fee536128618353cd8d337866e0b56debf1", + "weight": 437 + }, + { + "txid": "71ab4941581850b2614c9b3f8e4581986c4995e24cc6f1cc7bf0ee05cc60703a", + "weight": 661 + }, + { + "txid": "075b59a0f148a498a859b601f6a8b63b987ff6f9e5b41c61d500cfd0ecb90bd5", + "weight": 1195 + }, + { + "txid": "37fd3408532a32d161edf9ff6d9fa989c369546049510e0e32b39d093630726b", + "weight": 441 + }, + { + "txid": "eb34386807af74fc8f504c3a5ab70e8e64e834de51ce4713a842b43a95cad1a9", + "weight": 437 + }, + { + "txid": "87d479b1e4e92272204ba360294649c4417dfadc119c3a91aff4254f80bc0413", + "weight": 2113 + }, + { + "txid": "ba6960c8e263a0e02be6718651b8f076564f193b9f090325eda48b5465eac56a", + "weight": 561 + }, + { + "txid": "ec715fe2ca9b9d72d1fd27c8319fdd87bac99f4a1c593df58ba8884dbaf70fe3", + "weight": 437 + }, + { + "txid": "5a0977cf2a6e313e69b82f38c631369d2693a68068c4fda1adee66e43a30cff3", + "weight": 561 + }, + { + "txid": "4c400cf1a3f23c57e90b56afce9ce06f3ef3d7d270a3a4559677de0f51faae29", + "weight": 561 + }, + { + "txid": "5557bdafb403dff28374dd864de50ae66cf06db081929c34025fc23a30c46305", + "weight": 1022 + }, + { + "txid": "05f6fd30bdd0854212fc5ac95405bf9b250494746b1960e993b0ec123a42bdd8", + "weight": 896 + }, + { + "txid": "fb4b7e41ab3e0160db3d683ae23adb1362c8e38f6acb258e7522cbc7f4ccb2f6", + "weight": 768 + }, + { + "txid": "5b02bfac52992ba1624c19c7d0af870b527d42f703579aa70df1fa6c3905c053", + "weight": 892 + }, + { + "txid": "72c32527ec8aff746cbeb2e1c3c582b58b0caab31c083d31a4fe1641f4fe1d64", + "weight": 441 + }, + { + "txid": "e98ac78ae7e93b625ee30bf7d73dd9106d921c264426a8d045594c342dbc9447", + "weight": 752 + }, + { + "txid": "4ff239864f85e6c65583c2dec05b77ad673d59202be746aa6cd772c05ad8c553", + "weight": 1022 + }, + { + "txid": "098a41e6a200bc2415d7fdb05eeeaab711048665e2e4f9299076aa67e92a9bbc", + "weight": 900 + }, + { + "txid": "e4c436a2494c533872a985d4397fba63267b15ea3d1714649649eaca3a355e03", + "weight": 697 + }, + { + "txid": "0f162825fc8793f4060ad1b4a9ab33009425a128d8b288649b0f5ac09d1df26e", + "weight": 450 + }, + { + "txid": "9521203fd6c50d6ce636983957b5c9723f7e2e71ade074dd974e57ee6da9eb97", + "weight": 661 + }, + { + "txid": "b37c8a1edf984bb32a0eefd2985db7506a806e58fb1baadcaffdf4e09cd5d2ac", + "weight": 790 + }, + { + "txid": "4a257f26ed4a34f449da6a263c5962d86dc4d540debc7774de6bd482fcfb1e17", + "weight": 541 + }, + { + "txid": "39b23ca945d6a9944f6549fd727fc404957e5a4fe49ad5f968d6176c22cb133d", + "weight": 541 + }, + { + "txid": "fbee9e2dbd754c3b0175f3a190e2c53fc86bfc4220875abe3dc945a51c010a53", + "weight": 541 + }, + { + "txid": "1d2d78a5206941ee470038536af37b27814d82980817b9943220ed60ad0f9294", + "weight": 541 + }, + { + "txid": "ebf6b6d4d6bebddc55e0f21a72c4114fb7d4d600eb4932f2fe850bf828e09f95", + "weight": 562 + }, + { + "txid": "105c1544fefcd3f63e630c8a64a412b5dc89950ff9f825fd2285bc154602aff5", + "weight": 566 + }, + { + "txid": "406223d3dd71b0a8888a1acfcbdaae33fe3f5434545e09a25b0ac0fb12ff8664", + "weight": 561 + }, + { + "txid": "5914823b8fe5ac9355c3faf4304eb93cf0a8ffceaf7c4d40c3ffa2993100b77b", + "weight": 561 + }, + { + "txid": "ea1c0d5646ea169a9cf41c2e2492b3616234a9493108ddf7634c5feb0af445dd", + "weight": 3256 + }, + { + "txid": "b049ddfd581830a3d2d1ba6f7b672f48d71f0f09bd73a9fa9e0a629f396fbed8", + "weight": 721 + }, + { + "txid": "a9cfc6d10cb4063eaf4b647fac1eb372cfaa0ffebae8477160956aa8dc4e3a26", + "weight": 1397 + }, + { + "txid": "9dab46c9eef3e07750cd0e0653c7a1d68cc5a0a016cb88dee38f9f7ac6506bfe", + "weight": 449 + }, + { + "txid": "26e5902c18e977f0cbee7f6cd1299bacbc52b6ee3c61c55aad18f22b7fedd613", + "weight": 708 + }, + { + "txid": "1c8c86fcd811460bfe29a81028c18f8b9b04bd9ab1681575e3c596f545124ea4", + "weight": 573 + }, + { + "txid": "20d3aed522573c41e4b665d2dc447215627c3949ec5085a933235b6c61f90f67", + "weight": 574 + }, + { + "txid": "f92c18bdedabe2c0db6f555665ca86651bc030d52b03954d88e13af6c9e97f74", + "weight": 900 + }, + { + "txid": "b35dabba8bbe0c0bb484daf6dd85864168497e2bb56a7821236ce1ec354975c0", + "weight": 896 + }, + { + "txid": "d224ca2e58d16f087c139eed82c48e0d1ab0df5eb4caa032e9269f68c06991f5", + "weight": 566 + }, + { + "txid": "140795d2e9bb78a6db87e62b31d6a607879d354f735401e43a71cd49d0acbe5f", + "weight": 1250 + }, + { + "txid": "1a2ac5018d3c19f6556fb5aab7ac914cccfb973a19ce4287b781cf90157e4f8f", + "weight": 721 + }, + { + "txid": "6697bf05d9736e11d50dd1211ee6ed595cc64df8bad9ebfbca79ee5fb9b23e60", + "weight": 574 + }, + { + "txid": "45a64f6f8248d6c6c9dfff1a7fb75c91f8de57b08eb16a79b350b41b3bcf8a4a", + "weight": 661 + }, + { + "txid": "ede0f922e6a29f79ec0ab089c7ca4a1390127d56d0d2bfe819b4d11ddaeda667", + "weight": 661 + }, + { + "txid": "ad55b8b077a751d52ef04ee9af912143e5e1ca5dbc690740c53594f147033359", + "weight": 562 + }, + { + "txid": "7be1be3ea502e0de0d5636d4c85b7bf7e096e4445cad801c927cafbe11912b53", + "weight": 578 + }, + { + "txid": "52bd5990e3a153a88f420b8afa954ae13f5ff8a836bee493f022d6fb18cfd669", + "weight": 689 + }, + { + "txid": "adee059d57c10501df17394916a2928053702d02e6c87bf646d72e0ff387bec3", + "weight": 566 + }, + { + "txid": "18cf8bdf3f69f8763518b387ba2d7929ecb675e199e1e70d8cc8b8f000a086e5", + "weight": 561 + }, + { + "txid": "380ebde92db6dfe2ac4ff5b8a0b68d87294a1916e0f5929fafe7dbacdcda8f00", + "weight": 6398 + }, + { + "txid": "84a23aa4fad40b12c42c01c66c1b692028c483d7099c5dfd05b32cd4bfae7e28", + "weight": 5404 + }, + { + "txid": "5c0d5f7b15f8b455b67f53891709a21ecdb741e0474fa35ed32b18a163b35c37", + "weight": 5098 + }, + { + "txid": "26ab0fb99ad69497cd76ae2373fea3308512f128bfd24fcb661f599d32c8e45b", + "weight": 561 + }, + { + "txid": "c5cae938fcf2373a9ff11d35851f172c2c752a5e7a18fbb748a4ac1c9b5c1a6b", + "weight": 437 + }, + { + "txid": "ef63bedda5630253250add6d99cd4263759f551d5843282a1f5be8f7f934cfb4", + "weight": 5169 + }, + { + "txid": "4079901eea1f29049aed9dc569c9caebf310b05ac471ea00b81d8ee37117d9c4", + "weight": 677 + }, + { + "txid": "b66a55897f785311f315b05c2ef85e309dbaaabc385c9b3314927724f33a7ddf", + "weight": 566 + }, + { + "txid": "051598d5911c7a732b541efe75a94b3263375604894e82d078bbbd9552928db4", + "weight": 449 + }, + { + "txid": "1430e2f11a18de62e869181a22d92e7fc135f66290b1fca9fbf1cabff6097cae", + "weight": 562 + }, + { + "txid": "e94d11f0f0dabbcfe15930080179ca18542b1388473cdcad4ee8b2f8d38ccfd6", + "weight": 438 + }, + { + "txid": "3c8476a12c706ffb218ab11a8c8e6a03153e99325ed48515944a982389dfed3c", + "weight": 2075 + }, + { + "txid": "97649f8a0ac03c02078bac1a9427a6261cdce254a639da438f012c4c2e3cf268", + "weight": 670 + }, + { + "txid": "e57931909e509d1ef06dffeed0a320570431db49185c92b11764341ba9ac84f9", + "weight": 685 + }, + { + "txid": "4cc5f2f35c81cd38654aff2abc972c5257c5bd389a3d67f788132c358d3bf87d", + "weight": 832 + }, + { + "txid": "21110b58dfe9ad767d737f990cc484daf8beb5ed028cacd9032025c776efce8f", + "weight": 541 + }, + { + "txid": "3d31b668f1048d0254d7e441cef77abc3e803379431e2c51ad0de33ddde6c6c1", + "weight": 694 + }, + { + "txid": "83b34b69f2b0e822d37af309ec969294b13a542ff0e76fc64bcca4f0a26431f6", + "weight": 693 + }, + { + "txid": "2d979f70f3bdfd6502a60eb333f41af6c650cafa4f3804892dc46c2ef9fb2714", + "weight": 2300 + }, + { + "txid": "1f2748595786b692e227c8de71b356d91b6acf737adccff1d864650152e67d5f", + "weight": 8292 + }, + { + "txid": "7c03fd73a2573424b948b85d937a78cd27a45402f801b67f04db0ac7bf280c0a", + "weight": 441 + }, + { + "txid": "7d81f929e9897b2e5348b24597bb733c1efe189971f23510e983120d15760a51", + "weight": 561 + }, + { + "txid": "98813b4ee05c5d89dcf52542b14485e34f3855b6e3133515ff2b077b341e6227", + "weight": 437 + }, + { + "txid": "d71e408cf7aac112792edc16709fd8e5b2a6fd62aac213a87e536565cc3fffa4", + "weight": 437 + }, + { + "txid": "c21b147413676433d299d145479983c37d6ee8b18b726df85697d1e192fb958c", + "weight": 565 + }, + { + "txid": "a7ef17d077a697b511cea861832f19fa385ad633b490bbdf579d56ccaab7f320", + "weight": 818 + }, + { + "txid": "79919508d86fa67310986e0a2bdb7024b1465a58facbe5afca28b6ed6439117a", + "weight": 1484 + }, + { + "txid": "4731d35bc131f8c49a687b5896884d05a3f90eed1c1876152f90b1bf83b60806", + "weight": 760 + }, + { + "txid": "408b7735116df5aa2b588813bf56622dbcffda178b450c4290a6fef9009cc701", + "weight": 1250 + }, + { + "txid": "6531b7298884f5f6bc9f6f8ed352d41f2d6345ebc1e23adc5458297961845ba0", + "weight": 892 + }, + { + "txid": "0cc228fac12ec245cd9d34aaa2d5cf0c0fd38cf21c2980b776d422054b1daffb", + "weight": 892 + }, + { + "txid": "4090406e5a16a798f2c425b97f50a948de7b49450510f6c10b433e9cef4e3cc2", + "weight": 1472 + }, + { + "txid": "912a98f21c014026fcbbfc4ee098196b16b79986fbcb6b1036dd73ff3f6e3100", + "weight": 1949 + }, + { + "txid": "6442c99ac9b073058c286b51fc1e7ac2bb4115f16a9680b9bf41aeecb408f301", + "weight": 1309 + }, + { + "txid": "f7054b7052ceaafd36afbf89d104b9d58fb5df7cb3981a7fa741204fab26914f", + "weight": 661 + }, + { + "txid": "82d9ef49db22fc7c79c525ddb96cd69865744d6764556ef1c99a7a0393e7214a", + "weight": 721 + }, + { + "txid": "3b53afe38e3b22f03bcf01bd7b940e27be5011e12321795796628cb760a09801", + "weight": 752 + }, + { + "txid": "f5bea686e98c3f76c9f18d4446895039b403ceb1a6ce4cfee249dc6a4318859a", + "weight": 1065 + }, + { + "txid": "a6463f468ea409e681eb2bdf3cb9e6330f423587b83ca27300321861565173cb", + "weight": 1277 + }, + { + "txid": "7699a299ff1b19a8c7252f0fcc664009f86131d3955685598dcb739e9f4d7e55", + "weight": 566 + }, + { + "txid": "8d95f46dd684d3075f14f365c7f0a529288e5f72ddc9c3a05dcbfd69472d1cf2", + "weight": 2299 + }, + { + "txid": "d4155c0916e2a8f23bdd170dc02c392786dec17ddbca81840f891a2664a3ec69", + "weight": 935 + }, + { + "txid": "43aceec8a9d665a8a541da12b21ed9bd5d1d357f2ef452537df9084bec2061dc", + "weight": 533 + }, + { + "txid": "274884686e2608052e4c682c55b6ccaf973dc5e66345f115eb8a9d5356893add", + "weight": 565 + }, + { + "txid": "65c30c0609a7939202cd4f2ed19ebfe29fe5910ebee6c7b617303d17da2bb837", + "weight": 442 + }, + { + "txid": "22b765bf9bc20a33b44aeb2b9a90949569ff5a28f62f4590d2c54cc807df13b6", + "weight": 1352 + }, + { + "txid": "daf79e2c299ae3ada1c23fec2cc878df5d1bc1a38bbacfda75d841b1986a5707", + "weight": 561 + }, + { + "txid": "248c6447ec5f3c5624bff8b10da059b99358d8bf5759ea078bc177e1d5e1c35b", + "weight": 561 + }, + { + "txid": "f602405d62d81d1c74a96895d66138de480fcb052c63c5c92a5e744667f17a7c", + "weight": 561 + }, + { + "txid": "41b7d3f15da84b161158f12f140218025d20a28cc0ebd27608fe2985209c40c2", + "weight": 561 + }, + { + "txid": "998ad5aa35a85e081ebd62222d9ed01b5717cdaa53b2e64eccb4a3b0a54e12f3", + "weight": 561 + }, + { + "txid": "b6b7d33e11185d8fb7397c02550f90a222b21cd84003d3b70afe452b7a11ffd2", + "weight": 561 + }, + { + "txid": "0f9916e9e93544a7fb0b51dfdcea67918e3b1260b78739dc001b21565b9351f7", + "weight": 437 + }, + { + "txid": "b82e3f7021a423279e4cd560127f0138d0e7d88d6c26774204e553ec627a1f34", + "weight": 561 + }, + { + "txid": "a720004f24d8984272bbf6ef6346d9f1c38bc43f06e013bc1de207f28196caa6", + "weight": 755 + }, + { + "txid": "411e50511034daae1ef0d512b6e34b7bdaf273f74ac716e75265a8dba73aeaa9", + "weight": 1103 + }, + { + "txid": "3c300c070ccb8bc64490c660df2f4213b18af6b0936fe8b17efe689d32199d0f", + "weight": 832 + }, + { + "txid": "766e6bdad62c4ed39ec0556c519c3d3e737fcaae589d9d88b23d27735ae5323f", + "weight": 832 + }, + { + "txid": "286cffece22c137fb2cca1e0ff3b0b5aa62466ec010af77095073fc86e506e9e", + "weight": 1476 + }, + { + "txid": "fd659900cd2c6f3f844ecf7906ff5b6a9aed2bf0fb527ff838e0c7e15d4eca57", + "weight": 708 + }, + { + "txid": "d6645684dcc3333a46b3e943e16f1e1a3facd0ccde3794628e43d2fff3826616", + "weight": 561 + }, + { + "txid": "3f8112e5270870d902fe54080c2251aef8d8c78e64b1d72fc679baa5ab0fd086", + "weight": 758 + }, + { + "txid": "0a0e87f7c69f489c5ccd47b4003a83037a035f71921b16e6ed49ab200a7b0032", + "weight": 609 + }, + { + "txid": "7f8ea2c819e2a3ac437dfd46886c1f05e383629a45286b509ebac4cb009ba912", + "weight": 610 + }, + { + "txid": "db049d495c03cc9df148b8ee1bf35cd168ec538c578785c7da34b007c7d47efc", + "weight": 610 + }, + { + "txid": "982a0ce80caec69d5c628b0d3a448fa60ec897492f8456395e42c0456e6f0b6d", + "weight": 441 + }, + { + "txid": "c1e6137f2ed05c492fb0b2b82db74479b9e908ab4cc76a5e6ee9fa3297d75f0a", + "weight": 573 + }, + { + "txid": "6f425f3b1e83c72293f80bdd197cc18af36d6b0e56eca8dc5a66db8526f43096", + "weight": 565 + }, + { + "txid": "81a2dcaf4177540202fa3c38eb22f153879748fd133dba04d4bd2abfb3705bac", + "weight": 561 + }, + { + "txid": "eec1e47bc72b4d368a14ecbf792fc99d78e128b5153cffb8af6dbc7d44965d7f", + "weight": 561 + }, + { + "txid": "894ccabecfdb255ca833039be5295ba7870c59d4b09b44fcf9b8d0cf3c6b53bf", + "weight": 561 + }, + { + "txid": "5e2bb46fefc7ef56b0aa312a9c392a5013e671b661a4437807066fdf72af1cdb", + "weight": 561 + }, + { + "txid": "b4b6b947b1a96564698f2c986dd1150848e21559db67a9f47e7217c6053231a4", + "weight": 449 + }, + { + "txid": "82275be95487453c07f9d2c35948d1f0132a1cd9f4e8c3a2cf4ac6174c75d710", + "weight": 616 + }, + { + "txid": "03f24b91945558bafacca53e375ed02d5e19208b56908ff245bac329a50e207c", + "weight": 662 + }, + { + "txid": "eae1a6e15598b9ea9fd4bb100a60919850e6dd36182b8133b8073c1a9e1857c0", + "weight": 24636 + }, + { + "txid": "c2bd110c1cf140a7190f4accc7459c2f93c83a6eb1f663d6e047722c92a1aa68", + "weight": 1080 + }, + { + "txid": "c4cb4cc27b95d02c7fab5c5023e902bb2769d2fa084db575a08d754c01da54d4", + "weight": 893 + }, + { + "txid": "39aff51a224a75374e6059cc31744ee021ed90ce6091421c55083523cb7ce3f7", + "weight": 658 + }, + { + "txid": "72c61bf6c43daeb118031f046c72e8138597b124938c4c18f54962ec13bd3e49", + "weight": 437 + }, + { + "txid": "3602d42a5ccbb58f40b844c1fd6e7e70d58b90e19333afecc328ce752ee9f6d0", + "weight": 437 + }, + { + "txid": "a744595b12a1caf04b0aef909f69457cc2fbe1b3c5319e502227a23f96452bb6", + "weight": 708 + }, + { + "txid": "181a4e3e63476e2779f351c37fcf63076db6b1ed3c2d399283897028d3ca113c", + "weight": 438 + }, + { + "txid": "8b4009e97f28c992d12a9711523f583a5f3a9a2f561a3c84aa9e27f9c61f6643", + "weight": 438 + }, + { + "txid": "66e2d790a96e3a3c83fa9c04cd4d9974c83afda67d238ecd74c471b3af7c946a", + "weight": 437 + }, + { + "txid": "79a4a383caf45975f27a5fa57a92752856353183973029264884a8280e564c34", + "weight": 573 + }, + { + "txid": "fc9fb727a3d908e2f04f20aef23dc96d4f0add1e1481d1920709c590ace953f0", + "weight": 756 + }, + { + "txid": "27463a4e7fbbf7c86c1432889fbcf0a7244d35794de9663eec4a0ab512cbb2d5", + "weight": 2676 + }, + { + "txid": "6ec07bab41c78d101dde3a2abdab9b9a0cdfc2bafa02bc2ed6e4089dc17d6ed4", + "weight": 1677 + }, + { + "txid": "4069035e1c16b492b3262a0aad2f094e5fa3cf4e06351aae4c5de5908a465fb0", + "weight": 2007 + }, + { + "txid": "f9b09fb06fc61440559ff2103a51183823a4efbcaeedefeb288dabbfdda8f3f0", + "weight": 561 + }, + { + "txid": "c106f09ea3850ad1940aaac7658ebf810abc90d799d723ee35716a40f78ce2d8", + "weight": 561 + }, + { + "txid": "849c79035605f11d041e98cc2305d131e25ff676e9e7ac77477737feb82c72dc", + "weight": 562 + }, + { + "txid": "e7b1cbfed796fbfa60615053dc149dc27c7d82fcaa8e173c479c89593c1b8bd8", + "weight": 561 + }, + { + "txid": "b2994a76119cd5f929f8ac24dc200094dc63cbb1b570bdbafad18fec7562319d", + "weight": 609 + }, + { + "txid": "4ce90bf0fcc1f202140020028a249245e4f9d9db8f7f2b765024d740e89e91b1", + "weight": 565 + }, + { + "txid": "f35995f5cd7ceb45f1f59af1c95dd2e3645d93fe0b67df1f168b5e50ea1c088e", + "weight": 562 + }, + { + "txid": "a15d15b6b49fcfa1fe7faf4a3d4ac9745db3b664f3cfea038a8e7357ec40bbf9", + "weight": 566 + }, + { + "txid": "69283bcc0798385576983bc22ecc291bf38368261ce6301ce571042b7c91bad3", + "weight": 610 + }, + { + "txid": "cee466e8f13f11053a8cc60d57d2ba9b8e8bdf0ef988a73f259b177a4af4a870", + "weight": 562 + }, + { + "txid": "0120c0aefd86e8c46d5e883666c85b24dc094571c7c699d15e5411a2758b0db1", + "weight": 562 + }, + { + "txid": "50b2d9bf39692ac3b30cb09aec63a3b66f3d597c73fa2b5961dff7ca2a9245f0", + "weight": 561 + }, + { + "txid": "abdb4c4ec05d94de74411bf95797b030b435cac1e6be7cfbdb5f52320372c06d", + "weight": 562 + }, + { + "txid": "cd4cbf6032fc444def1c55825a7165a2ac35ff6da3b084f7842223a9c64599f4", + "weight": 561 + }, + { + "txid": "fc69fd672c049c85530896ff12419c0c43718eb0dbfb36c1af9744ab86cea4bf", + "weight": 561 + }, + { + "txid": "bdebd3c7adb592c39866940bdc2472bde70caec99f227bf78143280c824c357f", + "weight": 562 + }, + { + "txid": "fd811f85f5883481dad71c82b40d487552a29f596cd814dbde3fa7e346ec2db2", + "weight": 561 + }, + { + "txid": "2b5125751caba332db4f14d2683302ff53591e41cf589eb3c796507157fcc3ed", + "weight": 574 + }, + { + "txid": "4197fe0ec6383171456a868cbcaac86fc118208934d2c6ec0d4381c86eb49eef", + "weight": 562 + }, + { + "txid": "8fd75292554c311c46bc0077965d8a0866c9b380c156722165c40c86c13afdc7", + "weight": 562 + }, + { + "txid": "6ed824c1752fbff0aec991180c440eeb4722739f87fa2a82ddd94fc89328f932", + "weight": 561 + }, + { + "txid": "5a1be765d06123c15a04cba41f87a59c9413b3bbadf39567dfb50c4d30d5f2f4", + "weight": 562 + }, + { + "txid": "49d61c0b0a8edc95daff5da4602d0f044c5dfeeb1112f1d63fc26ff5514e7d22", + "weight": 442 + }, + { + "txid": "55eabcd38f2e7c8231ecee6094f6d0a2757fdb212844028b9e955741739e3ca0", + "weight": 437 + }, + { + "txid": "c8f5faebe054e0b1f5417be6e8cc94516012624261294e39cf08fb8ad8898f34", + "weight": 566 + }, + { + "txid": "3934db2dacaa451a62767dc8a28ef1cb107aed523f3ec4573bd45b8ad477f338", + "weight": 450 + }, + { + "txid": "b68aefbe1fb0250d8ee582c9bbbc10e3a8793c0d70eeb2079eeba96025dfee83", + "weight": 450 + }, + { + "txid": "45feffebd4f80185f20a9b739c8647b801add6dc044456318d194ce6512a25a9", + "weight": 450 + }, + { + "txid": "1ccb9f9492c466133138a7d8af3ebee15d6187c14680031121c362d9fe9e1026", + "weight": 438 + }, + { + "txid": "73052d52b85f1a97fae284bc45a08916e6f97e26f8c3f9e4b2b08e09cb082c88", + "weight": 437 + }, + { + "txid": "935236a570210d6c498036377b61f2b6232c16a9788aeb388b9955e23018c1cc", + "weight": 438 + }, + { + "txid": "2ebc18abc7eba638cd1c542b4ac2785259b435050ddfb02aebe0197ebe2dbbff", + "weight": 438 + }, + { + "txid": "999a1b372daa11a5e82a68f58cfe519236b5566081c3b55c0a7dbfe976db5a91", + "weight": 888 + }, + { + "txid": "64821a2015fe71bbdce655c5665ce1711067a1fad76b4606b5b2da0c71060636", + "weight": 892 + }, + { + "txid": "8d79b849deca33a97b6041664a0bc802ae31bb3e37136c4b8772d032f8234555", + "weight": 710 + }, + { + "txid": "28cea429d8446768bdf1ec124805c4c134dc9360cd9edf6a7654fe797849198a", + "weight": 542 + }, + { + "txid": "9de866a85f8b70892a84b696a033dee57b05c7d6531be63fe80b047ba9537d34", + "weight": 1388 + }, + { + "txid": "6ff82200d7c5135536f3cd376c1953900f113edd3fd9d45a6a94022d643fba37", + "weight": 1329 + }, + { + "txid": "08938b2abd26615731693b6e813bf3b992c428346a05ee969ee4c1f1cd0da462", + "weight": 904 + }, + { + "txid": "d1c7c1e5f77c29489e3746a75a36b7b96569031e762a28357890e1016233a1db", + "weight": 1217 + }, + { + "txid": "b41eb76ab460ba9799aaeef44f5a36e2fa0d856ff05cfef1f973b27472d8cfe9", + "weight": 844 + }, + { + "txid": "6e3f998d3ef25da153d4461b1aad66d42cfa816df0193e8447d913f1d550be0c", + "weight": 836 + }, + { + "txid": "95f05361d0ec1d53c9c5659f2f253f42ac9b3a16b41833c95292ee5200bd45ac", + "weight": 1918 + }, + { + "txid": "806ee16f522ab91d076890fa111fededd0b72eb3e09fa7bbb43be8ea3d4e8694", + "weight": 11465 + }, + { + "txid": "2fcd9d30f49d2614e4fbd25ea92a11c5a4aa032b5ba5770716a70b76d4721865", + "weight": 441 + }, + { + "txid": "df488aea4a2f5244d165b4d9d50c415207ebb20e168934b618c37b0ac15e735a", + "weight": 438 + }, + { + "txid": "69deb11622500796204a2b69d1d5b9b5ddd8e6d750617c5e6473d3c07d4a70a4", + "weight": 832 + }, + { + "txid": "117e063412203e883821ba5d4aaacd674eee11c505d058231148a60f10ef0425", + "weight": 1496 + }, + { + "txid": "68eb7e49e0462520f6bc19fee08102068343992e6a02f73d17b964bc2f91b674", + "weight": 573 + }, + { + "txid": "4266c5504c1c7c7d7108da8012198c7bd5bc646d6041c92b626f7b9649786315", + "weight": 574 + }, + { + "txid": "360c6956b21eb53e980131cb22c555da05d1b8a5934e5d637072730ebba82f8b", + "weight": 574 + }, + { + "txid": "37787b255e0ee6f5f1f86c8c555ca1ab9128377ec89934a85d379192e20aac3e", + "weight": 833 + }, + { + "txid": "a4fdb8f8f36e34ad14989fd13caae0176a9aaf779404229d164970bd8f24e804", + "weight": 566 + }, + { + "txid": "5343ae08685216e7e1d1717cd17ff6f6c819fc548ecc6133d21118d3e0a3b91b", + "weight": 566 + }, + { + "txid": "881e95cba709055cbedddb04477a7079969c78aa5db91afbc1630e38df28a81c", + "weight": 565 + }, + { + "txid": "08644f04efe429ce5f002b7627c4ed890a192fbc694e51c68e2e6d3b9185781f", + "weight": 566 + }, + { + "txid": "a99d48faf09714f637485b0657febe757ef6f061f7e0a93c00ad413998cab94c", + "weight": 566 + }, + { + "txid": "56459a2d1ea58b166a74e3ad8b454b38ac48bd17be6979d627c59ddd66ac2d52", + "weight": 565 + }, + { + "txid": "1ab9d37011eec802183b75694ae3ffdf07a2589beb71440ec2a7d5629f06d7c2", + "weight": 566 + }, + { + "txid": "cf89371d01ed244a59a12f393a0011dc8cb5d7abec1a636bb9062a04b931a7e4", + "weight": 566 + }, + { + "txid": "b1656cf2cef025a8139622e1f10d5b0b51b683c082ebc25b90dbdf167fedd20e", + "weight": 561 + }, + { + "txid": "b7f18cda12d09df7fa79fff88a8853a4b5b9303025de466ca1efcc6179ed65fb", + "weight": 566 + }, + { + "txid": "7025ea897994aea627748bba87cb07b55f97665b72196cf77197241ea7b85324", + "weight": 845 + }, + { + "txid": "b68c73c41173a4539d59ad88cb704661b88a36479b5ec0a514060f26d3a8f2b3", + "weight": 845 + }, + { + "txid": "70d01d76ac57c950e260f8f7653ed4b32d5efc23e29649d420372b37361f26f2", + "weight": 845 + }, + { + "txid": "46406270b90c084b2937763eef8e0717bb563e6805191d92fc49fa942a8fa008", + "weight": 562 + }, + { + "txid": "21e472b114c1a3e7d922331f7d47de73addb6db1da199569aeadbb19da395b36", + "weight": 562 + }, + { + "txid": "bfd876b0b4ad0e66c1a2dc6adf36573335f382ac0c880c789007c353a08afe86", + "weight": 561 + }, + { + "txid": "0890816b93a44a1847d3f7ba57e1523ad8b5751ea6bd00719f27688b5c0e698f", + "weight": 562 + }, + { + "txid": "5ed497a8544d2789863805674cfc8db075b8f61566451af60db2ea5cdb8348c6", + "weight": 561 + }, + { + "txid": "3a79123edd869a857106229adc4e6693fc9f5dddd8a22487f64bab065e3616db", + "weight": 561 + }, + { + "txid": "dea111b8d2c9fe1eb66ba80db5e71a8591a4044f3a318f411dbd6cbb79c691eb", + "weight": 562 + }, + { + "txid": "42c060dec5e0e71652af393c5cf98174ae8aa6a653989b1a5999d52758d9a9ab", + "weight": 4526 + }, + { + "txid": "026fb3ea7c8edd1175002f548c39a7ddb4562ff824d32e8da8c384671eb488b4", + "weight": 561 + }, + { + "txid": "36ee75e4e6bf756e496ed328d8c71bf23237a069fd86692fca7496e7c910650e", + "weight": 1159 + }, + { + "txid": "372e4fe80b0e203e940bf44086845a74b866c7090edd488b40953fa353d4c372", + "weight": 838 + }, + { + "txid": "161956096751137ef8b2692219e0cdaf71d199bfd2145aa3bb5d53e0094c3db6", + "weight": 837 + }, + { + "txid": "5fbea6554c4eea866a2ce041c5ea0c99fab803e1be973fddd7aea08b4dafc07b", + "weight": 721 + }, + { + "txid": "c65572d10a128c8ef8959661702acdb0a0e013fd8e94e02f1963dfacae244d7d", + "weight": 450 + }, + { + "txid": "1035c3e8059e810cbd365b07f35553db33c4ebbd2c705103ae4ca14536d6dcaf", + "weight": 450 + }, + { + "txid": "ee71d79af30fb006bf649f203366f2b18e1b7d5e9ce241c18a8845db6450450e", + "weight": 437 + }, + { + "txid": "6115a4b9a9440695a3b39e54d61e6f058004e7489e7e4e9d230010a9943111eb", + "weight": 756 + }, + { + "txid": "3274d07d28c04b07ae78a23ed2acf06e427fe66a892ec9992c3f460e923fc9f3", + "weight": 756 + }, + { + "txid": "6a786257792eb9f1df22ff98badfeabf5b6a3a2d589cb14e2c09411cd1091ac3", + "weight": 438 + }, + { + "txid": "12d7efb712576fbaa4018c74755ffd2114a7b318d9c9ea937ccff361efc92a0c", + "weight": 437 + }, + { + "txid": "a0207eda6a31ba18ce52830db589fdcef8e13b76c72011dcdf113c3d878d3797", + "weight": 437 + }, + { + "txid": "753fa12ee401fe466d6e8fb882274a34cb74292efe1978da20ea16bc012bbad4", + "weight": 1344 + }, + { + "txid": "a95482d5833bd0d482b67dc91eb96c5f56a399b8d2b7ee57a5e48559c9ee31a2", + "weight": 764 + }, + { + "txid": "d20a7c520ad5290afbcf297011fcccb7a4e4b68c9e5a9d34243e2a640704cb64", + "weight": 1760 + }, + { + "txid": "81bf837be7ac3025c8b9f1deca9fd26749d2b9a69f38315d3cf0dc1b9df9b38a", + "weight": 442 + }, + { + "txid": "c7459fcd778cf1eeeeb7d875cee56b328f7938c17378bd806c55a0e54fea5555", + "weight": 2664 + }, + { + "txid": "26c69ab8a807176b6fbfccdbe5c9879446e8da7eb7a78cfa12eb2018dec9df9e", + "weight": 752 + }, + { + "txid": "74fc822e9f9b7b97dd62ccdc02eda0a72445647ae1c93c05797c3d1caae8fe7a", + "weight": 2479 + }, + { + "txid": "93f46f360eab9957aa1cff7694e48ff91afd7883d2fca07cfedbd26d998b5092", + "weight": 3204 + }, + { + "txid": "d3afb5735e84cd1fc6f6370e76442fdac69ed901f9092c47720501d3663a219d", + "weight": 896 + }, + { + "txid": "8c8c4d77533c61546c4fe9715bc837f7de8bb8ad6268514048ff3b0f81cb73be", + "weight": 441 + }, + { + "txid": "804e21b303c9465f712b60a9134271a8bbc12e7b6de4057cfd17cd60bfb2b0cc", + "weight": 657 + }, + { + "txid": "ca1bafeb300bcb92703feb5633ae05d6ae91f6f049a5d1d5be85a05d7adc66f1", + "weight": 658 + }, + { + "txid": "6b0710a0fab17f5e62fc776c6bbbe162fac03af93671e321d0a2e77a2304c52c", + "weight": 710 + }, + { + "txid": "470536feebe9d642d8c65f8651cc9bbec10d1058cdd966fcabf8817bda47ce48", + "weight": 709 + }, + { + "txid": "9f421aaa0d49d96f2a7182049adc1b142b150a252dfd3840fc505eb0b47e02b3", + "weight": 5069 + }, + { + "txid": "16edb2473937ebb3803f9f1a99c3baa917378891bb424dd30090d27f59f6258c", + "weight": 2158 + }, + { + "txid": "d2af0ec7973d3ab95581025152bab1c3881b5e435337384ba52c482dbd017776", + "weight": 4705 + }, + { + "txid": "1edff661efce733aca4c7797c251bcba6d390749cceaa6a72e43e29478c5aae5", + "weight": 832 + }, + { + "txid": "978d680bff9b8e092f955503766354ffc73e7a619b733c1bd960bc7225bf676c", + "weight": 1672 + }, + { + "txid": "9832c0694b1a910066e49d8433c52b2853868aab307b619b0c5844ed5150f55b", + "weight": 768 + }, + { + "txid": "799b47d1c593f370d1c76974615a1a955031d2398d5c7f5ecfad2402fab1565e", + "weight": 768 + }, + { + "txid": "1f0c542c4763592a9eb7438f5322b8d1483f97427ab91f8c0ef09a71fdd69261", + "weight": 573 + }, + { + "txid": "351058d46cb93a0d2448628900ee1da82f42f81e896d1b1a9e86678fb94d27e8", + "weight": 573 + }, + { + "txid": "ffa6e6ec8e325f8ec0c6ac75ba8f3ced9053782f53a175306b3825b47f1eed46", + "weight": 574 + }, + { + "txid": "56b45d67e10a760e3c48307d5773f07bc4d33efcbb981ced82c06ee3693d6b69", + "weight": 561 + }, + { + "txid": "9ac6f1bf910c6a85ee163062c2632ce07fb78b5437356a8b7f4ffb7283085094", + "weight": 561 + }, + { + "txid": "ba368600dd69f6e0cb1e43463960a21a52fba1c4a007746d9d4acc6a3e8f2dc2", + "weight": 1116 + }, + { + "txid": "0be72753cb86008343bf8b918ddf4cc3fe857b896aef3d698f329c1c7b60c90d", + "weight": 880 + }, + { + "txid": "c00dcfb6a49ed3be60994b9631a04b62ed1bc8ce8609b1e14785cfff8ecc9bd2", + "weight": 833 + }, + { + "txid": "7bd1c3d089edc05a972278978a54aa8288846671fd3c74da2dc68b527b21cda4", + "weight": 573 + }, + { + "txid": "865c512d057d41cce4b7b51559f486c3cc46324abb2a88ca4b796507bf34c710", + "weight": 904 + }, + { + "txid": "bf918837ee2194b6333e0e91b3b437bbb5c3070c3ab502a788e45ba8bf013a3f", + "weight": 900 + }, + { + "txid": "4b81243ca197d18b6405d8243ad06d825bb12bc6e79ad5375d87118243d4f544", + "weight": 708 + }, + { + "txid": "888fac3854a76e6bbc7d0adb823211d82a1a8eb426bfa5fc2b0bc87b7f365eae", + "weight": 1814 + }, + { + "txid": "150a011d116fd2876c593038df6d542e9c2879bf828ea76a5a15b6675c724efa", + "weight": 2301 + }, + { + "txid": "870753b2a09f0bb70a5622a41cdd8d41ff7de7cf583e87f428c32698a8bec664", + "weight": 1254 + }, + { + "txid": "199cc502c73943a261684ed504242b86ad63cc5cea0e0d01e8d5b3c269873b8d", + "weight": 2113 + }, + { + "txid": "fa8649ad2397750562b3cbf79370c9105b2f038fc34fe24544537acbecebb9ec", + "weight": 3806 + }, + { + "txid": "43558393c610dd8f65c6f51bcfd6c4f2862b7c4c6ffd05c6b3c0a4c8de43a722", + "weight": 1026 + }, + { + "txid": "f1fb88e1550c5013419374df61930a5f9d37c32eaf3fde97c68dfd0544cc5ebe", + "weight": 1057 + }, + { + "txid": "aaa54c8ed7513b340b5c80d439691709b0a790242baded9a6561e10c198e21f3", + "weight": 950 + }, + { + "txid": "3eb6170d0168b2d5fd102ceba55f5d06eac49309a94edacb02233b2dda689bce", + "weight": 1305 + }, + { + "txid": "62d4721022a31c59c0da9cea7fffed827ef3d3d30ab7c4ec9b64d52daaa649d3", + "weight": 705 + }, + { + "txid": "dfc7fb7a32271b9d858bbcf8cd60cc61482732b78927c04f318610336db1377d", + "weight": 2191 + }, + { + "txid": "65e688b3a4b476c52ab49dc80aa136ca92c8b533572aed62d26fefd3be8c1ae1", + "weight": 836 + }, + { + "txid": "788d7bd016833df03f7e50f2ac01d73c85088122bfe9c5fe24b148335515cd77", + "weight": 937 + }, + { + "txid": "c7b99477b7a452de92d568521d83222a3442997f04de91f33acfc38f55524650", + "weight": 437 + }, + { + "txid": "a1bc31a2f24c47e8be40707781bf0b9467c92324d42dc0a6b311d54e5fd0868e", + "weight": 1917 + }, + { + "txid": "091ce1d4e2312cbc8cbf1853584c237d73a012cf058604e021008ca1d79c97aa", + "weight": 1105 + }, + { + "txid": "99ad9e13662fc027c7757ecca6afba240c1f23cc6f64b114f5e54781b395af51", + "weight": 1377 + }, + { + "txid": "930d1ceae5c53fc9c29441972a0a48d96e847bf306b36cd9cdda304c920697bf", + "weight": 1721 + }, + { + "txid": "3e7ec56816169f0b20767c2c67bac94872f908f3c212b40fe014600575c55008", + "weight": 1747 + }, + { + "txid": "677d17890203b0e86829e366ec0a0b0dfca8b24ca306369af5bd32bf869d9ead", + "weight": 609 + }, + { + "txid": "3b8d7293c8bba586fde191dcd8de78afde9a021a6a9aa2e69ea2e08d0c9dde30", + "weight": 437 + }, + { + "txid": "cbc448f2e20030e2b238b9648fd081a968032cc428ce6cf89d1aec882ee34a45", + "weight": 562 + }, + { + "txid": "c19b714a369c77498498abd2481ba0793abde4fe18e5769e82ad7efd6b33ca31", + "weight": 566 + }, + { + "txid": "3161764aa216210d5fa495672c4f54601007120717563718811527138e7b04e7", + "weight": 566 + }, + { + "txid": "6f028c5b706d76809465a7a922e9b9c5a6771f66234f4b71efe181124be0263f", + "weight": 566 + }, + { + "txid": "1b0193965528e766342fcf5c58b5c56efc86acbe4c1aa856f8da811ca6ae4665", + "weight": 565 + }, + { + "txid": "c4bd88181530bbf602a0ba7f2d6e59332f9e123c891f6a8514216a351d11cc85", + "weight": 566 + }, + { + "txid": "59fd34ac5f9f0b9141a65e9fe6938828c7a55ca537f2d75786cc13ed7a4a2499", + "weight": 566 + }, + { + "txid": "de15d81bb3fc5a16e9d0000a64ebd15bf9fe8c85734ee08a7579ddd24eb8d3b0", + "weight": 566 + }, + { + "txid": "5ab405019cf2d1381692a308c535df5e24198a52e2841404047fb4a09beb2aed", + "weight": 565 + }, + { + "txid": "0aa24dfc46748096e13a742bd01005de98cdf21e67a6288ff0f05e390da35526", + "weight": 833 + }, + { + "txid": "b3665903305a5a0890b19f11243bfafb48c920f49c956f735dc63e6f48520666", + "weight": 833 + }, + { + "txid": "e957c8ce55d8cd99c5b97f593cc53700a7702f64601cecf6ab713dd091c09c1a", + "weight": 845 + }, + { + "txid": "4a874ab5d55a4233e14929cd4f1b3298adee6178e148ea540868a97622d596cc", + "weight": 845 + }, + { + "txid": "4def41a3a335a2509e6ed296598b3958944579c4e64cd054c0c8e38f179ec723", + "weight": 562 + }, + { + "txid": "81012be8476d57d44aefcf380e1eee6f9a351c6c025f326e4c7eb5e0abf057bd", + "weight": 562 + }, + { + "txid": "546d6ac5ecb3a0540d14a2e9b4ab923f99ba042ba378e6ed640909e917fe2890", + "weight": 561 + }, + { + "txid": "355270a6dc46ec1cfb678b786e9f82ae4689cb359190a2514e7bb53d3b3b2ee7", + "weight": 561 + }, + { + "txid": "4dd8d0339f10baa0351a90f2cc9759d7dc84637a105ad17d2b58922368e95cec", + "weight": 562 + }, + { + "txid": "ff83221a0417432ae99dfcd4787d3775fde864af0b6b1675e830a872425f5783", + "weight": 574 + }, + { + "txid": "3820437332b66db7f8aa13580b3290f132a566db778386f08907cc08341655d9", + "weight": 573 + }, + { + "txid": "8ce2c6cbdb8552bda6ae2147b408e373a2492f9e0ef130dd9feb8e17f864960d", + "weight": 561 + }, + { + "txid": "e326e299d2333841d64b2cde4764701768604ed41afd5ec9280b5e56f0700e75", + "weight": 561 + }, + { + "txid": "037ae25fb9e66489845bb29f418b938cd657e4a83c49c040e5076405d23f5272", + "weight": 562 + }, + { + "txid": "20c106ad9f27b17bd39cac690d292d1930f0346946681177f7b414aae9582b19", + "weight": 561 + }, + { + "txid": "744c3f06132da9382319d979daeeb1e1cca8c2f5fc9d28cc44cfe3782e5d551a", + "weight": 832 + }, + { + "txid": "b6aaddc9d4129973753e0d5f788d796a843d8ac7fcc3944458e4fcf8778f7c84", + "weight": 1462 + }, + { + "txid": "f7c3b6c85a00002c3ff9e70288c20e1126fee5a10100f517c9128aaf4f4ba421", + "weight": 1701 + }, + { + "txid": "b7796025cd12a8124ad38ae145ce05748416c05d745d1150f419d27044df9d9a", + "weight": 449 + }, + { + "txid": "acb5e120725750b554449fd2d69876eddaf642de85299c910fc70e62804ba8b1", + "weight": 900 + }, + { + "txid": "bfdf7a1798e991c0c0b05c98a9d6d83987a04b270a3f165155bdd5dfb5e88587", + "weight": 714 + }, + { + "txid": "1875edea499372dc37e5c907886949b0190fb60ee4ccb8b8a1feb4ab4805ced9", + "weight": 562 + }, + { + "txid": "33e3ff205f6ee35c3f6f28e984d6e5934fdcf4d1bced8e4efa666a04c934e246", + "weight": 561 + }, + { + "txid": "ace6b791cb4ad2ceb63d84febbb08f5167d06f6f6f41dc613dcaeb940d44dd11", + "weight": 561 + }, + { + "txid": "35d71d462ebb8924344150bd8e6b65187167255d5266ccd5fa5a74cef0a17d32", + "weight": 713 + }, + { + "txid": "2efcc7314bf1399f38d12230ea65975bacb652f1ca071a0db5f55db29fb58425", + "weight": 566 + }, + { + "txid": "51dc806446567460117fbc61f4b57f392f091c66b6d4067c2d7ca49db0c98552", + "weight": 566 + }, + { + "txid": "cfa7ebd54ce719e40c866b18613b2599420d7673b5b676556143b2010041907a", + "weight": 565 + }, + { + "txid": "2586a90634cfba28d48acbf5dbb67b49a2f84eb9af236fc6a90f92f04ceaef98", + "weight": 573 + }, + { + "txid": "6619edad45b8536c877e01f1f35d23adc90deb4c5957c8b30a2c586c5fdd99b0", + "weight": 573 + }, + { + "txid": "4ce2abc121fde997424364a3af5a1b8cdd1f55b4960579fcf493c6fa4c0cf00f", + "weight": 561 + }, + { + "txid": "4fd1f46e8d7358e435f7b284014ec19ae1ef943165ea8b66895c608d31fc3a10", + "weight": 562 + }, + { + "txid": "7b5934190543b43dfea668c87abbec0c928764eefa5c81254aca7ab68aad7235", + "weight": 562 + }, + { + "txid": "fdc58cbd9abfe97c70b69f610de36e8422ea04b18840287b5368158b36ee3e46", + "weight": 561 + }, + { + "txid": "03ab6bdf473e255a4834c8b5b9a368a5b880b69f1cf20ab1b0f74bf2506c0873", + "weight": 562 + }, + { + "txid": "9fe2f57fff7aba97570f8ec01d297f46624efcb99a79d7617746301b7d187fbd", + "weight": 9618 + }, + { + "txid": "5499a8a738d01438a1e058701da936f1b6390350f548b967fcd5d414c66de87b", + "weight": 562 + }, + { + "txid": "d50261036e20833fce3a53a1ce29cccb3f139e6084509da8e57bd510167c025e", + "weight": 449 + }, + { + "txid": "5d9a86244d8ad118d37aee3a9c7b292d0ff573253506f369239357a497d49bb2", + "weight": 768 + }, + { + "txid": "2491dcbf1b379df0cfa67b40d0ceddb950706fe4d08928865cd1933a32844192", + "weight": 2075 + }, + { + "txid": "28c8399e410fa5ab5245331f5a89dce0bcc111f0bc5dbe00e496740bf44d52de", + "weight": 529 + }, + { + "txid": "0cbf632e8e87825fff3048a25e9952fce55dde016e877d8d838b6054baf34b20", + "weight": 1060 + }, + { + "txid": "b90cc4176a5de5a5c29c5845a2683b15399ac4ccfa5787d6573f9ef4c79db1dc", + "weight": 764 + }, + { + "txid": "b8a71335f702f69cd3aa4df0ec4508e2434e6a9d26c6f64f3458bc464e984a05", + "weight": 441 + }, + { + "txid": "edf3a2217c3b4bf9d3a1018d0ec6dc40486bafa7c0c53c5c38f1988cb4509130", + "weight": 437 + }, + { + "txid": "7f6919c7c31d4419d665bd46907516a79cbc405fed50a25e33574e0161e9a4c0", + "weight": 438 + }, + { + "txid": "a2d703a77e1a3a7a41321408cfe1f927a90dcd5b7c7ddafa813d42237c02bcae", + "weight": 566 + }, + { + "txid": "1a131a1222e6f82d7aa099ad91de57f4fe22b447c28dfa625abf32348994bbc0", + "weight": 565 + }, + { + "txid": "3eb0dfde0c3be47cb5f599eb9d650e7d3518537d074913276ea402348f6a3e6a", + "weight": 573 + }, + { + "txid": "f393e383c1123e8d9ee438c61409e9ac816a693af77739632575139c21b9186e", + "weight": 574 + }, + { + "txid": "e50b79af53bb21132e709057c2fc21a58650ade4d3cd9e34e760369b386939c3", + "weight": 573 + }, + { + "txid": "c918606ab9145c9d232b6482dc4ff0424746a9c93c76f52221c7f2964a7be2b0", + "weight": 1492 + }, + { + "txid": "c42a71007a3ee51642cb2faea3c1cdfdc031f6a6976c2ddb2b68f440a09ec7d8", + "weight": 2174 + }, + { + "txid": "2cfd204c9248466bb7e7a096cf6890b16c8c1815fd0af78ce66e72052ce563b7", + "weight": 1259 + }, + { + "txid": "85b67326878a24f9fdc3a61e6658d0ff0ec95bb4e83ca85c4ff95f9197f01e88", + "weight": 877 + }, + { + "txid": "2e3d56013896596103fb6c8407ed176d3eaa2a89caf05069085953411a45e834", + "weight": 441 + }, + { + "txid": "7e4e105aece4b6ccbcd52c23f3b1821d0ed9a9d22e282e50d9ddc82862a608c5", + "weight": 441 + }, + { + "txid": "e206a4f391f0d0800aad66514dc57599df8b1fe2559ebe3f9f714282f5cb446e", + "weight": 673 + }, + { + "txid": "fa063fc9f3f7c6ee599154b0cf878bb212a385e5125b546c00121d19c3dd011d", + "weight": 685 + }, + { + "txid": "f7aa1629494696fdd8b71bd1db764ae4b69a611249b80d006d2aff4e9ba126dd", + "weight": 836 + }, + { + "txid": "8870963be21dfc3af7729a7411970ec6c49195fe85ee59b32a97e1ae9451e3fd", + "weight": 738 + }, + { + "txid": "22ee70ffaf70a43e45ed7f7b7aa1488116d285f990561cdf662b918195fdb7fa", + "weight": 1264 + }, + { + "txid": "3f3698bcf8a5935b12bc662fcb9908a9c1c4efa48e9a6f886d5b3a706d4ce519", + "weight": 760 + }, + { + "txid": "bf4468844942d765e9ab6951cc34aa0224768b7338fa22484226fb14cf6d2a51", + "weight": 712 + }, + { + "txid": "08890e7e3b06101f690b41e0a152e59334ec1ab262b8ee93a864921c9e056085", + "weight": 565 + }, + { + "txid": "0ec714750f5d2178dfaa7f95c4434499a2ebd8e203b92514d909fe984eb6faf6", + "weight": 438 + }, + { + "txid": "970b685834e9c32fd90f955bf8020a72c0edd609aaf1730ed2d54cac3422934c", + "weight": 720 + }, + { + "txid": "f1f98d2086155c2031a4cd25bdbf808bf477c95e74ea9a4ec0eaa2d7f0b79b51", + "weight": 562 + }, + { + "txid": "f3fd9648c59100b776cee5e9129ca4dc3f2e35debad743930acf3c31c6dbb5ce", + "weight": 1144 + }, + { + "txid": "e4bf23fd405671b5cc4a77623baebfc1e63fe64a3bd0ba49bee66bc5ce9dfb8b", + "weight": 2063 + }, + { + "txid": "0d8449c04e357010d3ca6736464fae486aa04d3613985fc848c4fb9a0ff51947", + "weight": 832 + }, + { + "txid": "77af857a9eaa60eadda903515fa34c3575ee467775bf6b014069189e4b093313", + "weight": 1086 + }, + { + "txid": "c278a369ffa9aa466e026e019c42144445f24f8487b4abb264b62dd7003e5aa8", + "weight": 962 + }, + { + "txid": "c600ae7496253d45e56bba0413590d4b69dc5cb700f3cb63cb4a4e1acc42aa88", + "weight": 892 + }, + { + "txid": "f154c16f50c49604141da10df91951bff26e741f9638641aee090265518486cb", + "weight": 1496 + }, + { + "txid": "f4fcec01e587a539e55b05a8decb258c0c574d27e46738ab9c8cc0c1b5b1a698", + "weight": 438 + }, + { + "txid": "f6ca157137330899b0d77c131257fcd71475eb5fda5135a48f5cddaae2a1c551", + "weight": 441 + }, + { + "txid": "2ffeb1d67657b7268a105dd6458d08515bbce54ce6f050afdbff53d2dc09d6e7", + "weight": 3437 + }, + { + "txid": "48037653423c6baf4f9e78b1033fd606a453bef825128f9290cd964c781d4d3b", + "weight": 845 + }, + { + "txid": "406bb01ad8ec462d456b234f643613ca6f8e13ea05abd3c0c4938338225f10c3", + "weight": 573 + }, + { + "txid": "6c107f9828dccfd67c9bb9e86e56f41be81bca6b415d87589730cea3b172eda0", + "weight": 983 + }, + { + "txid": "4bee050694ecb91e1dad51db6645ef766bc781bb7af94df1fcf5dc117b7a4d4e", + "weight": 437 + }, + { + "txid": "02a8a0f62e0aa8acc7f18a1e36f8786c659057eeb52fcec641b7ee30651b3dee", + "weight": 88491 + }, + { + "txid": "1065289496643785985041838cac3ceb0d24214cd7ddfd3067e9e97140daeb1c", + "weight": 708 + }, + { + "txid": "5b5030d41eff64d5278699754457096a037d9a2af086baa2fdb39e460a113829", + "weight": 441 + }, + { + "txid": "4a4195846a1e0e19c4c4b5d4a15f1db0b2c6c5d4ee19eab28c5b08c22bc09dba", + "weight": 789 + }, + { + "txid": "6e6031c28c24a5c51ae7385f41fa922ff1c6860d20ecec91b82cc31d1d218bb9", + "weight": 1380 + }, + { + "txid": "f52e7163f65d116b8782c43011edb4afeddfcbc8bd8a6073de8332289d008a1b", + "weight": 832 + }, + { + "txid": "684b2fde14a9bd5487796c3cfab0ead68859bed87b5768620beaac0c5c526b4c", + "weight": 880 + }, + { + "txid": "7808fb8c9b9a732a82309148fb384ebe605d7d08e8ea63b92f98c099a5dc13bb", + "weight": 4889 + }, + { + "txid": "28a41bbfbc6bef8c74a2313852a75e845be395870192f86b3946edad46c08e74", + "weight": 559 + }, + { + "txid": "05d2579a023d8eb0ae4bf16b08dc9ca5c3e0bb3bb73ba7ead8bf53a84bd930a2", + "weight": 437 + }, + { + "txid": "00b41af1b74e54cd93097070faf8d213387be60ed415ede16e2b1de9db5b6b5f", + "weight": 1629 + }, + { + "txid": "2f08948f542b3c3a9107f92d3fcaef56f7191294664f582fee475f5510def241", + "weight": 6098 + }, + { + "txid": "354ec7ed720420da7f86b1afba28761dfa5508ab116de3faeb48aaade84a171e", + "weight": 574 + }, + { + "txid": "4e1399cc7374c05c0202da7ce9cb62ae1a5bcc8acd1b850ecddf45809bcb56ed", + "weight": 573 + }, + { + "txid": "152bfdc15c411320af8a7e043fdf52bf2a6e3ef4c9da8a7ac6320bab62089d68", + "weight": 832 + }, + { + "txid": "2d5df9cafdcb4d5cccfdce272c424041097b00b71cdf72be962c89a3d25f3f59", + "weight": 2837 + }, + { + "txid": "b1ff9b34b20218eae3bb6e9e944a77aa8e3d9e9c369d5ca9b6cbecc880fe544b", + "weight": 940 + }, + { + "txid": "f342d88ba1fce84594821b3c8358bc2266b18df0652b3e1a57b82d532eb9c34f", + "weight": 574 + }, + { + "txid": "afcf09acdb7e7d96087c00f40c61b1756ca364df60e9101ddb45321b5067b417", + "weight": 561 + }, + { + "txid": "061d0c2f04609478376d9b255e4b57c03072e12b86caaac96b210a4ed4579840", + "weight": 561 + }, + { + "txid": "eb493a326db78f77cf485efc62b5d84a0b540adcc20ee2e6d6e165381fb51d31", + "weight": 561 + }, + { + "txid": "9d3bfebef98e1d934e4328504be0af873ed0915be6cd4576775ed0e6c7085242", + "weight": 561 + }, + { + "txid": "f54b4fef317175a0abc70ba042849531ce393bb0792ec1a24a80f0a8bf3fa548", + "weight": 1480 + }, + { + "txid": "d081b0c08ee591b31a7895c067105831d57e1af8274947440d4d912f1e6aa35e", + "weight": 562 + }, + { + "txid": "b5474f1f8496e1b64729abfb5ec100561fe9c4aa97f389acf7ddf7391ef99d68", + "weight": 833 + }, + { + "txid": "78cfa954973d92d3039fa5bf8607ecbcea0aa52abc6c7857bdcecf01e67b63ad", + "weight": 860 + }, + { + "txid": "d9ad9dbccf14381d65a3e1f7951a32494e5e91cc9b988ddded25143e448e0b28", + "weight": 574 + }, + { + "txid": "35120e2fb776288ca2e3c90df803a49ccb39144d2e8a62144df2df431a27ebf0", + "weight": 1029 + }, + { + "txid": "7d8c4f2f261e6a5b85b9c3b43a93573a5f0040e9323b47f29191110448331814", + "weight": 900 + }, + { + "txid": "025265b76ffb3b2ef792fec31b5b9abaf54e74cd27e9be1e51f345edc5c44957", + "weight": 1356 + }, + { + "txid": "aef4632e0d56e7dd4ef827182f927433db63bacaf8ca05ef4bad4a4c2dd79b13", + "weight": 884 + }, + { + "txid": "a5410b464ac9e49e9acb1ba279ce9d31b133ed94e4a00d6d676105d51fbaa29c", + "weight": 876 + }, + { + "txid": "646ba27cfe17049c2c2084e5ac94c2fac7d1243743067dd748463d8ed5d45b29", + "weight": 561 + }, + { + "txid": "aabab91fec84f0fd25e87362a5022255787630fe4e29806915b356f40b51265f", + "weight": 669 + }, + { + "txid": "fdb667ebd404f7110fbbce0cac0053f64eec5235c66307dcb2aac214ff8f15ee", + "weight": 844 + }, + { + "txid": "eb81105c972ddefd6edcaebfcd16ed52bce0f74f82a84c7a14af1476d95703f2", + "weight": 892 + }, + { + "txid": "41f0be227f2ed9efc47f2a747e8959422716e59cdf78f2a3532f708e505974e1", + "weight": 892 + }, + { + "txid": "119618f020e528c2349bc7f7f9600b47255b24ffceb0462e170659d8f5fedd58", + "weight": 900 + }, + { + "txid": "26fd6ba71be91e7ba132fbcfcb0b6b9636124879e739f28b388b8df00975d9f0", + "weight": 936 + }, + { + "txid": "47e6a4b91523c50e260d95f9e2f875842e47cab7cce11174ce5001b0e12e1792", + "weight": 565 + }, + { + "txid": "aa8f3508737a85485052a2b2939705c98f589f72d7059ebce68745b081f29168", + "weight": 561 + }, + { + "txid": "2f3d320e252110a4b398de21f0758e92a18f9868a25cd61394aa12b1582ec878", + "weight": 449 + }, + { + "txid": "a2fd84f51e5e6f6821c2404141e6378aec8db9bacf909e6238c46c8872b0449b", + "weight": 940 + }, + { + "txid": "68628f8a07d3aef0a395f883b2459e504f4bec735e1f953b804ebdbfd95e8fa4", + "weight": 697 + }, + { + "txid": "3f93fd4e0fa759884c488242c1c07875da2125f634b334d254cecd9148be73c0", + "weight": 1265 + }, + { + "txid": "37d902e1cd39c99c26b3b1f9d58a120f1bbbad18d07e0a7149417668f879bc84", + "weight": 766 + }, + { + "txid": "b4777281460b4098ec94e827e3f7b3245ce36d9975eb327fcbedd372cf3c4de8", + "weight": 562 + }, + { + "txid": "401ac6370783b550a89702cec8a8238b67b7fedb3985c5d8da06a4b6d2bf93dd", + "weight": 565 + }, + { + "txid": "942a291850570238671fb8ab30f68078b839c5392c5456508b05fba415bf4ddd", + "weight": 764 + }, + { + "txid": "5f1b5bfeb5e4bb6c8b335953af0359d774c3949abebbb2141df84d08ba1aa1ae", + "weight": 566 + }, + { + "txid": "a199ec28fb461f5a36b7a56d882637e5d2d5bf0eca8b4ba4741f7040a15e753e", + "weight": 764 + }, + { + "txid": "8206d485ad13330d2bac25f8d23e0e96fc77a453e5a3d193fa93e4ff42d0979c", + "weight": 896 + }, + { + "txid": "73b800376a89eb39a869dbcbe3a656f0007411f46f8646081f39d21eff97c3a8", + "weight": 832 + }, + { + "txid": "52fd25735c0fe58e629406d815a410cecaea7dc364a47072663beb7a688122f3", + "weight": 574 + }, + { + "txid": "00a84577e72e7e8a0799a443be674898be9ffe2c44eb6c7bc1235a99e4da07d2", + "weight": 752 + }, + { + "txid": "b93142cd0e8937e82e247211167bbaa883826475f0e8a2f882b162d3789fd10f", + "weight": 713 + }, + { + "txid": "904b65106f2403d610877fcdc8fb9143b8ccc9ed77ea46742a956a17edfacc75", + "weight": 713 + }, + { + "txid": "9832abbd9d534d2a4ca9fd18a20eb6cb9f1d9568edfe6d4a3960686a0c9c754f", + "weight": 1660 + }, + { + "txid": "9092f4c4052d9d5f1b9aec4aa3027e5c66371a445091458e5876e17440a3dee6", + "weight": 834 + }, + { + "txid": "42fb3052075ee6a0af2433a102cad5a041c5157badf783d1a041db64f162afec", + "weight": 833 + }, + { + "txid": "5e97f11b629b899b88648845d932692e6ae4fac8303ad7dd85df59a2e44414c5", + "weight": 1032 + }, + { + "txid": "2447e8676f2273562a04886048347d2785b588943273e94bc2f0d3298c589b9a", + "weight": 441 + }, + { + "txid": "4e03ca78ed507b576c60c521925f9923da7651b6fe32ef8900106209d99f4595", + "weight": 2560 + }, + { + "txid": "44e180f9aa64c4269befb155d64d2ae7c1090e91893919374479c2badb35ae1f", + "weight": 1919 + }, + { + "txid": "852c32ae26be80e11fc602d34c3c1decb0bf917d2c5b2996d92285f3409b1638", + "weight": 904 + }, + { + "txid": "839a124c15d5d073a7624294e7c309b8c9362a2e9d4baf2fc5d8318339996b64", + "weight": 836 + }, + { + "txid": "6f117ae8f3f21acd812e9d5b183544840f29eeb414f349622559af0b2c10f548", + "weight": 985 + }, + { + "txid": "32890eedf05f9777ba479ec42c440fd318de022c2f62fdc604b7e8a214b1ba61", + "weight": 1172 + }, + { + "txid": "14630fad9d641c9f60bb139668c6b103d868f66db094fd46af00cb0587350531", + "weight": 1117 + }, + { + "txid": "760f63e648547d04c26faa84576524eafca6f0c5a973cf1f7319aa4fe706403d", + "weight": 562 + }, + { + "txid": "e4b35b4005227609540c20ec689ab95da27dc3e43ca683ac6cc9295f3715ede8", + "weight": 561 + }, + { + "txid": "83eb44a6cbf6292c6fca38ebdbe04f0d65818be5986d16d42bb4632ef285db1c", + "weight": 845 + }, + { + "txid": "633e2f07e17f6e6f0d4d0b73b5216a7188e461834837fb8b20b2cf848bddd74c", + "weight": 837 + }, + { + "txid": "873b65cdfa714939de0829f679a1ea5ffaa78ea4f12327cbbc7b11658b1b4cb6", + "weight": 838 + }, + { + "txid": "74e1da38eebd7eb45dff3708e900a4544c400cb4b289e2fc477cd56a3e8cee2a", + "weight": 562 + }, + { + "txid": "b6b2b708702555c0540d9f223e2e0061035cf0ff7e31e4884126f84096c7d290", + "weight": 561 + }, + { + "txid": "d6f113a8d75176d6eae6ab59a3f312943a5cace9c0f28975accced3d333a3f04", + "weight": 565 + }, + { + "txid": "ed55ddffaadc79169fc94d2c09993f199140ef516f1c21aaf0065939b056e715", + "weight": 566 + }, + { + "txid": "ee3ed7396d9f6219b2f853f178315d2ee9e95b4e50292edd24bc61c6cc67553a", + "weight": 565 + }, + { + "txid": "66a36b235db773f46f630bd9713afb7fc420024286ff7d0cebe9a8deac5ac33a", + "weight": 565 + }, + { + "txid": "2d6c378306d75d49c0c3c1bccca02ffc972cc7bf347a24e2dfc07eac7e6dde6c", + "weight": 566 + }, + { + "txid": "0cd4610c521ead0357ed4cd7f69a12d4f844ba005572357dc837b15dad3f2dc4", + "weight": 565 + }, + { + "txid": "8ce714141ebe912f093fb70e0f224499b096d90690430243f9aed35da420eb95", + "weight": 562 + }, + { + "txid": "c4fc8a045ea2f3d35136c7124a48b968529e69e13db8796216440f97506c92d4", + "weight": 437 + }, + { + "txid": "877b2aa8dee92879ea02762d9936dbc63f0dc5d6e6ae440ee9b3fd185a03db44", + "weight": 565 + }, + { + "txid": "52d0451822c5950be973cc045326bbf63716a48beeac58f542e41c2cbbf65c72", + "weight": 450 + }, + { + "txid": "d7d72b4838278443d694eb48d57936a8e0b4356bc8e89013b5b18628386e76b3", + "weight": 449 + }, + { + "txid": "c4d979632983074d884a2adcf8b90ffe0cabbc9d44677ef47bc7ad83b2194a6b", + "weight": 884 + }, + { + "txid": "6980d7e5f8742c084970eb372827cece462fda42282303aedf74e4ea2cfa9432", + "weight": 709 + }, + { + "txid": "d1371617fe92099e090fb7212a23dee274a978bc634c8fc7516561eb01e0ee39", + "weight": 892 + }, + { + "txid": "46139f36a2c40b8c158e046ec52a4e6dec9712ff7621ebebaa680a9f71518a97", + "weight": 574 + }, + { + "txid": "462b1775f7e24462135d8332a679083a2f29a3c8a0d0884b101dd633514219ec", + "weight": 573 + }, + { + "txid": "7a1db081626128e4af95382c427f2a707ae58bca343c9963f8ceb846bb16893a", + "weight": 574 + }, + { + "txid": "1fc1c0db956c5396454747c6aae05426e956d852d020c380d6ce7b394e6d9bc6", + "weight": 720 + }, + { + "txid": "b56de655df8bc2cb0ecd0ffdd398078f81e08314553cea71d1fa01a6bea77622", + "weight": 1116 + }, + { + "txid": "5624d8799075c84f0df4041a65d47d131069d84d6fa20496cce8d4dff5a3ca49", + "weight": 983 + }, + { + "txid": "4a59b792aad9dbbf1e7cf94dae111df92fecfc1bd3a504a7b1908569e19773a8", + "weight": 1108 + }, + { + "txid": "514aa0385f30ad556a67c8c4843f15b1a86783bb1d66b9bcc428cae1d3763fba", + "weight": 1115 + }, + { + "txid": "45e56456aab34fce519ba4af789c610a289a690d0dd738a56075fe46ef08f15b", + "weight": 1252 + }, + { + "txid": "8c6aa7a55a0af177a19976ec97d48ac12d73d5ab4209fc82f1ba4556b87332b4", + "weight": 1251 + }, + { + "txid": "a72e6706c2958c39b6d5718b4e16cb24e8930853d123aa2d100b37b4b2b10875", + "weight": 1263 + }, + { + "txid": "a412b7301a3ccae5979c0776009bce21c6c43249162e95670bd52e1826f23001", + "weight": 2556 + }, + { + "txid": "f4ce5fa7b5c314b3011a12c7d79624730292b44c73c843a739b956656734f066", + "weight": 1660 + }, + { + "txid": "5b248d1408798dd1f18479a9314e44d52aa2e40c164fc7647ebed922a020c9e5", + "weight": 1660 + }, + { + "txid": "7cc639174fce1534b98ba9e26ac46cc87125506f24d2fdf6c60a20cfb6f706b5", + "weight": 1032 + }, + { + "txid": "2ffd204f3df63cb87061af076b23980186ca2829222182232078b78ae709dbdc", + "weight": 3200 + }, + { + "txid": "9ca10c4b861544606205800824f770bc408f0263d9eb4fb9e5dfb72a2d122ca2", + "weight": 752 + }, + { + "txid": "1f4155af8626c83fc2c8b9deb1a226c3a62dca507f2fb3383be68e0ffacdbad1", + "weight": 1422 + }, + { + "txid": "5f6bead29c1e618057d6d521a369fc8ae6ede73c8b6a013536f653475e6de80b", + "weight": 1257 + }, + { + "txid": "6ca3a330d72a6309d93df2c44c6337a1117376de35eaa78308af888dcbe7a90d", + "weight": 565 + }, + { + "txid": "a912a2fc160e43e54665bd73ff677c3bb72db4b563c45b962d67a34a716a810f", + "weight": 442 + }, + { + "txid": "a6542b4c79de6990265f2961d2db4a5135f67927bc13183e1f990c9856e66410", + "weight": 450 + }, + { + "txid": "b9e7ad026bf8c01ceaa3fa35c86b0330cb5058381c9203fbb078f79d866ff511", + "weight": 566 + }, + { + "txid": "96aa7753ade8a985cff321b1e42d6ec58faf2b32d7197ae8c7e1a7b7a6245b13", + "weight": 562 + }, + { + "txid": "3b63fc670cc7deff36af53ffe36cc1f0786b3e5d344f3abfe213f9884e6ea915", + "weight": 566 + }, + { + "txid": "3d64743d07077312355817fbc5ba039c68f799c6132698453f40897ab3b32016", + "weight": 441 + }, + { + "txid": "e0d24720f5af64c37a16d4dc563b16640332496d47c87c49560680c926f61117", + "weight": 441 + }, + { + "txid": "f3da3721d8c3acb11df21cdba198e2c051564c45b873c164f23d073bc8637a18", + "weight": 565 + }, + { + "txid": "3384de65b9e4ffeb56ee99a7cdea3568f51c6ac5caa3bb8a4d3c4ee4b648bd18", + "weight": 562 + }, + { + "txid": "34a4cc3f318f635a8d9296468a77cce93adbb469b054245fce23f1103e2b6319", + "weight": 449 + }, + { + "txid": "168b080efea52c247de282cb13067c8b73f8ce6fb6dd5bf9e376142971a98c1a", + "weight": 449 + }, + { + "txid": "4f1b334eb32a082ba05256c95c256cc9b1237e91da93136fb4af1282a46907cf", + "weight": 900 + }, + { + "txid": "8811a1c8e93408542646d92a621d463bf3b34b21918a7cf14de310e8fd6f4d7f", + "weight": 900 + }, + { + "txid": "1f5ce761f97ef4ab81c5eddc374342b68df80513e5a049c084f7f7d611f9ad61", + "weight": 900 + }, + { + "txid": "21b6211b11615dd6ad133ce663ec026abc6e37a443df4e131a5503f90ea1b0cb", + "weight": 900 + }, + { + "txid": "85e09c6e57749900358b517da7f73b45ff7c44abdba871344033ecc85c6492b5", + "weight": 900 + }, + { + "txid": "5b6ec33d38b1b00fc62218872dfb08ab593e60ab14fe4fe5e0f7191e7f8905f1", + "weight": 900 + }, + { + "txid": "f8ea6dbcd78051a625f814adc3490b6b7d9f120d0928596ed04c564ca9b13973", + "weight": 900 + }, + { + "txid": "3a747dda6b322ded1cd6091aec102af0a001cb667200e99db26ec59f8d5efe41", + "weight": 900 + }, + { + "txid": "31bfcdc52c451a865678cf0c5e04f36d518b80f585b0ab9a347257eb62fc611f", + "weight": 900 + }, + { + "txid": "f931587b1edf90e633cb7e7b125f49d7a005ef27e376c343782405b7d7340b20", + "weight": 574 + }, + { + "txid": "c36c46b5948a3ee38cc73fe0d6cbb53c7b3412bd51c194fd9c6f307c3f139e24", + "weight": 574 + }, + { + "txid": "9382cc71fed46bdd2092a03d26c861731fd2f624f66090897f5a533836b6c129", + "weight": 562 + }, + { + "txid": "2bb9889b56fbc55b8f7d332a0392b53e7e54aefb888c4e35cc23406e21e51a2b", + "weight": 449 + }, + { + "txid": "84c0204b2bda2a75bd97e03d47c754ef65fdde60c584004d3e2750334ed87e2c", + "weight": 573 + }, + { + "txid": "33e86c991b608194f26a2fdb0978af8a2caffc8c31af77ce44b6d12f15a8a42e", + "weight": 566 + }, + { + "txid": "44a482ae1bd8ecb996cbcf3af496793dab5c9fc13754dc94a1babc9c764eb234", + "weight": 449 + }, + { + "txid": "b13374de9c373782a07b3447dc069749190cf479fe139b7dd095ff5146a45d35", + "weight": 449 + }, + { + "txid": "1affc21daf6dd14d7e12518eec31247381f5baa7fbb027ccb59162040a016b39", + "weight": 441 + }, + { + "txid": "68ad8a25d6a5e1a75e3eb79f4405e065304d675a6965b0a145a1559ea8537d3d", + "weight": 845 + }, + { + "txid": "f2a4701385e99156620fa467645c58d34f3c21681147175933b0fdfb1f99a742", + "weight": 574 + }, + { + "txid": "145d62d612517aff21e8977ce0b0b1d41c566eff0c43d934dfd911ff25f46743", + "weight": 573 + }, + { + "txid": "c3dda171e15d19cd5d8b6f74d50bf0e2771d033888f7192ce29bb29b5659ad45", + "weight": 437 + }, + { + "txid": "fe8910d5277a26e229737012df51369171eab88b181463521e110303fd242647", + "weight": 881 + }, + { + "txid": "f3b2a06271031ffed624845420a4f11332f093def132384b860cd9f653b63c4d", + "weight": 562 + }, + { + "txid": "1794a7ed7ec8218ae132ec677bfbc1b8147f3d8a2181b8000ac1d5cfeb990651", + "weight": 441 + }, + { + "txid": "4509b21646f08605a930f3ed36ec09f87cf3781e67c8a8e657925e909a261154", + "weight": 437 + }, + { + "txid": "72f2b044fe30910edfd45bd99102cdb5168b15335846d38a7be4e307a8d89d57", + "weight": 438 + }, + { + "txid": "935e092be559c869dd8ca0bb84fc85a90d6e12be7cda91b984d5d27dd9761f5a", + "weight": 438 + }, + { + "txid": "8d375e4e7587bc6ceac4f7cc947c841795fa621429fe1a47c805f15d92daf773", + "weight": 900 + }, + { + "txid": "087703ecb47629dfc06dee7e93e851e3d38ebe6477fbdf859cd6c43141f6a05c", + "weight": 900 + }, + { + "txid": "f90d0de1c0d3c7864fc2e7d3fbb63d5d238e64bdf5a3ed39dedeb2811e3adc5e", + "weight": 562 + }, + { + "txid": "199032680fec6d02bfd21e2bc93d3a3dd4a47f505ae402935aa5dca1927a5d65", + "weight": 561 + }, + { + "txid": "7ea456808d2a889e9cfa144aaf2c8f89da3af36927c2beb3bb4b438e6b5f3067", + "weight": 442 + }, + { + "txid": "03f03ed42f1105be68af51ca56b45c1f3617da8d8acb131d47f7c048ec483568", + "weight": 442 + }, + { + "txid": "67cd92c146837c101d5e374df6c49a0d8e2690190b851584d645a462d8e48d69", + "weight": 1109 + }, + { + "txid": "db2430484956c8da0a911b666517dc4693fb23a944ad5b926d9a0ae8acc13b6b", + "weight": 846 + }, + { + "txid": "e8329d14befe457124a55c1dfe778e09aeb5267dff67eb2b5589941162076871", + "weight": 574 + }, + { + "txid": "8ef38c05c63dc69ff95e47c37319f120e1043c7accc11e21a4df3c597b4a0b86", + "weight": 450 + }, + { + "txid": "27fb9925aa6b183e01c69aeb3e211964e44a16f618a0b784c97b7471da078d86", + "weight": 438 + }, + { + "txid": "b0eb01c7eb8cc1d3b88720c8bb0db83c58b2061cd9090a4d590854532a18d787", + "weight": 450 + }, + { + "txid": "02d4c42735ea003832a8b505bcb1dd5c115daa10ad585a1ea072940b5b3f258a", + "weight": 845 + }, + { + "txid": "489d245e2d8e7b95459ef0d038385ea42bd730c4fe8e079781f0e5734192a58d", + "weight": 449 + }, + { + "txid": "a978a558d22da0c460957b9d92354d1a82cd88dcb55c00b9e46ad2eaece10d91", + "weight": 561 + }, + { + "txid": "7b81a0ad636639385625f988567b04719a8ef6656dd91a09eb02263db9e91593", + "weight": 562 + }, + { + "txid": "755d5f9edeb965c4cc49c6f3d1e98b71e01d639ebb46f87b38b0ada0fcfaa495", + "weight": 437 + }, + { + "txid": "f9a24e35365683f9b5b99630673a608bc7cca52516c39b9e3bce56a2681d5897", + "weight": 438 + }, + { + "txid": "2541a2fa095cb5126eb111150f2e5258059f7074bbc7d1fe776ca8c29185e599", + "weight": 450 + }, + { + "txid": "2de3a4c6626542b5252dbf2bfcc4518fcb05c6322b1c539904d4a4e0649ad0a4", + "weight": 449 + }, + { + "txid": "b5af91cdc2a0851f6a25bc9df54e68ee4a1ca071909235e5692ccc3e2ace5fa7", + "weight": 573 + }, + { + "txid": "3d3ee49c7f95f1814dbc528b53b10d3cca8e244983d23dc8b175f5a4f35ed2a9", + "weight": 437 + }, + { + "txid": "908b6584968a80d07af8853e78db5b34fcf7fd74f6b4896c991cb18be8aaedac", + "weight": 566 + }, + { + "txid": "106016fc68c125838d57097196635659cd2b209a5cc968d0ebc5b3ccf1aa08b0", + "weight": 722 + }, + { + "txid": "9088a201578d863b92571babbffc19e82395a974df3ecced5e435694ffca11b2", + "weight": 562 + }, + { + "txid": "4b19444aa6435705f18f24ceffb8338b2b9461f8de29527c43acfab270a267bc", + "weight": 565 + }, + { + "txid": "ad972a87640ac12f93f73c323933a650689d86e9edee1b94ff2da1098be3d0be", + "weight": 565 + }, + { + "txid": "39de2f6ba9cb991cb9a62a5d55e395b4897d483982096356a5558bb424f15bc2", + "weight": 561 + }, + { + "txid": "ecbb5baa2d387b8d8f5a59936e415ede78137ba6c645fac4c716f568b033d0c4", + "weight": 438 + }, + { + "txid": "63aba44f07df8fa2beb59e19cd8703ecf752c1bb0dda24e762e925e7036d44c6", + "weight": 437 + }, + { + "txid": "8dcc133750eef368064f303087ec6b77801675957727207f9b1b9d59767ac3c7", + "weight": 566 + }, + { + "txid": "e3ccdf18409050f3fe4a78cbf210bf2f4da691104854449e0bc4cc9a47f420c8", + "weight": 450 + }, + { + "txid": "bed2db35dbf673f2914cbddc7610c5c543ba0e7712f354b12fac7afb123452cc", + "weight": 442 + }, + { + "txid": "e25bffbc9b054d7803242185066dc797a0fde6be200f3d69d62fccf729d1dddf", + "weight": 565 + }, + { + "txid": "f486d5ea0491f42a3f339e580f0d8e0fa0d2338cb2f4d59c41d6a8cf5971efe0", + "weight": 574 + }, + { + "txid": "a3b0feaf504481103a5ab00cbf93681b9ad32c6abdff1566b18de59819ddf6e5", + "weight": 833 + }, + { + "txid": "c29a5d3608da7d94a0da89030d31b10e410db82b593c15baa10e6dfe61d6c8e6", + "weight": 574 + }, + { + "txid": "b8dae176fb239a8f55c4dbf4b1f75030328870e94a52f954124626d78bb158ed", + "weight": 562 + }, + { + "txid": "2fa5b58380c4ce1832e5fa61ac56da041d060eb6e5aac6e3d9819ed04bebf6ef", + "weight": 449 + }, + { + "txid": "766cf3ae5f0cfe09125146d62f457db5d0d2e964996087451c31b05dcf02a3f0", + "weight": 438 + }, + { + "txid": "9d6cbe1aa2f293352d2e36ee764a0e71441b216e54a4a5f1f7f2a0ac5c1b29f3", + "weight": 837 + }, + { + "txid": "f1242b211ab7cc9636202a11a15d7790c71db90e2de1bdd0057803e7f2421bf9", + "weight": 574 + }, + { + "txid": "e23dcd929d6d7019c955adc4c57da9918ffde4fc1fc0e931d1fbf10f66b80cfa", + "weight": 562 + }, + { + "txid": "e4148d8d558e3fe8e16a8227231a7f1fb9639a56bed1884bc4c2ecaa43515ffc", + "weight": 562 + }, + { + "txid": "2ba0459a68cfa0582cc96caaaa2452678138ce3d9b381f106e6026c4b5050dff", + "weight": 574 + }, + { + "txid": "32caaf404cc502254f94eaaea3e1b62aa804ed5feffa0e0430443b52b66c8bff", + "weight": 450 + }, + { + "txid": "9be71d596a7f7ab41868ad89408abef7b6cb06aa7f16d92be5016a6062fd9bd8", + "weight": 844 + }, + { + "txid": "fd91301ef847370b875f501c53c980d851c892d1083e48cdb8211e7f803f24ed", + "weight": 836 + }, + { + "txid": "8f009005a505a688ef2b8b345c12a98a810a677f8a4fb1899783d9c427eb6050", + "weight": 1116 + }, + { + "txid": "ce99dc297c3f9ccaabadce211a9d05ebd5434a953389e317b5c4142cc4f5a547", + "weight": 566 + }, + { + "txid": "0877b5e1c1625be1f5bd2ba5cc939b22a2585bb51e07346bab3bca272cce0411", + "weight": 756 + }, + { + "txid": "3b6eb80d4c4e58ed068c99ab82b294f1a06816a962f8a91a283237bda50ae43c", + "weight": 892 + }, + { + "txid": "13e3a0e9188ef9f94199dd3c922d1b6a17116848b6bfbbe43c6e243d8691e0c9", + "weight": 892 + }, + { + "txid": "4194cd868b192be982fa7cef729ff1d297ea6619e2810077acb929d0755418dd", + "weight": 441 + }, + { + "txid": "2f13ac6eef15a5e1d209af6d6809cb1975d54fad1bd919732435bc6e654c2eaf", + "weight": 437 + }, + { + "txid": "5be23bd031a19446449c9a0329d981e5e105333408e9efe93650f3e6ee000318", + "weight": 881 + }, + { + "txid": "1364f22578c77e5b777152b673f2d826068a8550de79476bdaeb19efc1747d43", + "weight": 846 + }, + { + "txid": "5edac6127d768390b459e33c15b8417010ec417d93077b3e0c84e306e56c8954", + "weight": 846 + }, + { + "txid": "90aeb90be693ff3df0c5b1c86c3749c222b87a4b92103c11e1076828f89e6ee5", + "weight": 845 + }, + { + "txid": "c14966ea76429fe75f1a9c8b2d62a80147fd34cb0e4698fc75f9120d9148bff6", + "weight": 845 + }, + { + "txid": "80567310df37f722da04220988c5fb86b3e8e7aaf7171145bcd5fc6e02d7744b", + "weight": 838 + }, + { + "txid": "0cbb77ee7250670d65469758a531b859320cac96c5f05754c02a7439ec13c735", + "weight": 609 + }, + { + "txid": "8276ebf506ed125102bbfcbff9f9c7ebde427d3540ddaacba23bf2e71a89768d", + "weight": 1650 + }, + { + "txid": "a0b727f250f1cc73e6319addc75453d308a837f6eacd2b0175e1dbd6f7b5ee14", + "weight": 574 + }, + { + "txid": "0c1ed4ad999f3aa0c093ae16227a0c5d7eefd58c0036978861deafcf56308088", + "weight": 573 + }, + { + "txid": "4256998192f3d32b429866ec9bc52e0460a8938a89c5eef1c7970578f60a9d8c", + "weight": 573 + }, + { + "txid": "3bb44db87f4bc7138b7098d6466810fb5a7d3215b4d90ea4b23a324bfed5e294", + "weight": 574 + }, + { + "txid": "31cf5a63e25c365962ce6af01c0b97bba292da5de4908e72d56f8c783f00bfb1", + "weight": 573 + }, + { + "txid": "272410e4fc6852fd939bc21b9b007b12e922744fe1252443c148dff04c49cc57", + "weight": 566 + }, + { + "txid": "e9afc73b666fb60b96ef5319d075f6541983743983c40307e9d19a23b7e5b7ba", + "weight": 565 + }, + { + "txid": "c70470d60403fe33c365129f67d5a50252a60d377813f92551292dff3ec02ae5", + "weight": 566 + }, + { + "txid": "aa3a27b2ab1f79d7247a0ddcbcaa81b9d5b630a9feb345581d9e3e1548c7eee5", + "weight": 565 + }, + { + "txid": "5d77aa164afa8ff231e0e6ebc6f24a7d7681f4e095545d407439e98e2b3cc66a", + "weight": 561 + }, + { + "txid": "f75ccef5cafb2b84cce2979a1f2e50f91bf39330b1b804dddf0a7a94bdfe557d", + "weight": 562 + }, + { + "txid": "edeab627867af9c1c93b04ab32cbb4cd9273ac702f0bd8d7c643102d9d5eac7e", + "weight": 561 + }, + { + "txid": "84ed83a4d1466b987bd5934d4af3a2fd1e31ba4474c539533efaa866c93c8e94", + "weight": 561 + }, + { + "txid": "3be1e204a8a9019232cea6968f923ca41198b4dc33c8467bcbcf15e5e78e35b6", + "weight": 561 + }, + { + "txid": "31bde144cae852a2d234883c58a8b7ef359118d488b05b6db12e60a1598e6ce0", + "weight": 562 + }, + { + "txid": "cb2c63448bb3e56efcaf24fed6827a6e84bfc5fe766d6842758f3110dc32a3f4", + "weight": 561 + }, + { + "txid": "be526d40a66c2dc6d43d87a18abff21e41a8f30b87e5bd6bb3dd8d946e998618", + "weight": 837 + }, + { + "txid": "85e38456d5fa48e188c8d605cd473be9affcec0065326d2ebc04fe8797cb075f", + "weight": 562 + }, + { + "txid": "4221acbde7cbb07fed7f52a6fcb09f459236514dc0ce869b6efe664a69ab9c63", + "weight": 561 + }, + { + "txid": "adc6d53c231d0a9ad1f823e062b5c01613d3c8f38b2a1cd46be66ab3234b185f", + "weight": 662 + }, + { + "txid": "8e9146be3073a34f1b0d93f64c4e6b95c058171c82fe7b65e33eb1ce60e468c2", + "weight": 561 + }, + { + "txid": "b6f4bb5021980064169d0295c0e63fd436fd8082060e3b733eba4b1b6aded127", + "weight": 756 + }, + { + "txid": "44e5b710adf71710a3e8aaccaef1e7cae2814ca22ad25bfaed5325dd649d1925", + "weight": 573 + }, + { + "txid": "4cf97fd16fdbfef149c2bef522cc360cb75aed735dd8ce80095cdc0331dc87d2", + "weight": 574 + }, + { + "txid": "236dc9f97ff3b74285e5b7a0920d9311ea06a39f1d12c2f80f10dfa3fcf59c44", + "weight": 960 + }, + { + "txid": "cba59bdd2513de0cd9698cacbdb8477a9bfb32f5d0913bd6a19a160a883cd617", + "weight": 562 + }, + { + "txid": "fc69db47102fd8b1c3002d9e896ad2c7257e7aa3d57569592e18f342cd532c74", + "weight": 450 + }, + { + "txid": "642dec5553480366aec04e97fc97e1a8725f07400bdb9a67b814bc60726146e7", + "weight": 888 + }, + { + "txid": "44b91b7ce613bad864f239e24f212808dd4aad1761dbbd827aad28236b911f66", + "weight": 892 + }, + { + "txid": "9a9561c5896cc140e9c8e72cbcbed84d21116d73d823b5d5022bd94da82a5f69", + "weight": 6068 + }, + { + "txid": "680632b26ecc323e0fe3a1223ea0365077737a893fd635abcbcc3ff09d735b60", + "weight": 437 + }, + { + "txid": "d54d1e09b81c146b18cbc936fd7236fc0cf90e12ddd516ba17b67da2f8e7aa8a", + "weight": 900 + }, + { + "txid": "5989a8a6e3637af5f3ad3b1f6bddca26a4c2ab4b251e6e44c999ebf5d5890c2d", + "weight": 574 + }, + { + "txid": "61a2bd7fc9cdbe5345eb002c9a2653660ed921a5e5c309b8381444aa29e8f62d", + "weight": 573 + }, + { + "txid": "ad3e61fc3828e9e1ef284d4a9ee85d0ef64da92306ffa447ee8919faab2c733b", + "weight": 2061 + }, + { + "txid": "77db77634d51085a8caae3dd1ed3c1aaf9ac0377d7e3107ded15027217306f6c", + "weight": 8049 + }, + { + "txid": "65336a7ea01fbadb433e505a3c818d2f215ebdc8673f5793f62a1e59b4cc2150", + "weight": 789 + }, + { + "txid": "15e6371087e5684c14a65f80f516e2b0351de3013cf4e860b19bdf41b5f66144", + "weight": 1352 + }, + { + "txid": "3a1a88a959b6a2d7554d5890627cd6dea88c31da3c1f62f1ec81a0901f84e6df", + "weight": 720 + }, + { + "txid": "49fb495069b8ec61c8453a1a5359427518e82aa3246fe51897cfee09e16b358b", + "weight": 3131 + }, + { + "txid": "fa0a78ef69cf7e7817d00c948f22f73db6bf6aec0b8f28674e82d49260b8ff41", + "weight": 760 + }, + { + "txid": "d9d5d16eb335baf6f0e1a9cce2aa848e9ff54f139355a69ec1268215065726c2", + "weight": 900 + }, + { + "txid": "959cd9d9d99d5476025e5d0f2836808fa3c8f01898cd0f0deaa8ce6f56ff3ffb", + "weight": 904 + }, + { + "txid": "557a47a7fdb88f1d7fd6e1ab7152a9ae6c3ab12ae3b682dd79a8ba795d046ffd", + "weight": 541 + }, + { + "txid": "f31c2c38d39f694feec5bc68f884bbfb3ba543c532fe6dc409dde426e5b5b10d", + "weight": 2462 + }, + { + "txid": "7eade46c6659d55c0224b93b56dae9ae7b8da231909bc7c534172295b75211cd", + "weight": 1084 + }, + { + "txid": "fbf578755c535fcad3dc0968db9b9dfc5d9ebcc538811771ae4518fe8cb3874d", + "weight": 36917 + }, + { + "txid": "a3db6d228e0447905875b80910298831a18bfd38214134b4de5e623a4c11225f", + "weight": 1344 + }, + { + "txid": "6d2468c31aa3b0361c1a8e372adaf24aafcb6bd54dacbaffe2207eaef87d7013", + "weight": 566 + }, + { + "txid": "4a6778661c03df2bdb699a4b8fdc43f638ec416ab051cc96513600e42f62208b", + "weight": 6694 + }, + { + "txid": "d09fb2edb8863cd641143f1237d16948c5ddb385d37e90c190162cd4271257f2", + "weight": 1620 + }, + { + "txid": "168d41c7c490021722dd13fbf11bb0ee0df5a54f33788b81e2d56df79750f094", + "weight": 809 + }, + { + "txid": "3f1ad78fb4dba97c6434a75a5fa94752b5faced6d5d470adab7b77ac5b032bde", + "weight": 4261 + }, + { + "txid": "f5607e7f5cfa8782f67e86e36742800de91f8dda6d22474a1dccc27885f37301", + "weight": 561 + }, + { + "txid": "48c71023ae7dff49c88e25a39759122630859e06f9fda860f8ac39924fddc31d", + "weight": 561 + }, + { + "txid": "982cd68228d9012172dfe7cfe7cd8fea0580bf562bf3f0acb0ecb90e29352059", + "weight": 561 + }, + { + "txid": "f1c5b712e2965511761ffdcb3365f6dfcefca1b527c5c02d7e40732649ca5f73", + "weight": 561 + }, + { + "txid": "42e03a41a27eface802263442160de4fbebb9fe4b937eb23c997e60a83ad53f7", + "weight": 561 + }, + { + "txid": "bed215d08f7bfb6f0674355e596ee92a10be2e071a5ba278a2fc96d5d65d0415", + "weight": 565 + }, + { + "txid": "d77b9ac564a664fa53d4bcf951d822b6c342b77531230e46e3d3da8001ef2296", + "weight": 573 + }, + { + "txid": "3ad33a6da69f3276c52c3ca60c9d0f748d49e3f46a9cdc2e74a63113bd1bdaf6", + "weight": 573 + }, + { + "txid": "f9ab1a0d55bf7587ad7e1100d5786d2a4a0211d55afabe5746964b23050587cc", + "weight": 609 + }, + { + "txid": "2334b0561d236a27d8615a9f0a3eb64eeb0a2c2eebdfaf384e4398f6738104a2", + "weight": 653 + }, + { + "txid": "c9e586370ea8ccbda65a67e159ef327ae89f4520efc7cc13cd651875ce34021b", + "weight": 689 + }, + { + "txid": "6424093b9304b308360043423c8df6ba029d2109fc5dc3d1c309b4b3be5d8aa7", + "weight": 814 + }, + { + "txid": "4af7dc9f2d8851cf51f5b76b2013229034c80e9bb7801bd6370bd9927f81f706", + "weight": 832 + }, + { + "txid": "ae54d0e33b648fe9ce0a4a6e82299eab68d16079adda623bf8f02d7f61634b04", + "weight": 561 + }, + { + "txid": "e31257a3ef46feb9cca41de61c198fe0ff0aa2d2d48f034c452f019636842714", + "weight": 561 + }, + { + "txid": "e1e2d9f4e129dcbf1d7fca01e9010d85f68e169ceabd1e612cc7117ae660cf42", + "weight": 1915 + }, + { + "txid": "166d0802d8caa07039094d92b2531572f75c66bf0d2307459899320e61965e7c", + "weight": 573 + }, + { + "txid": "3def8f90553fd2128d3967e39373b34b9ce7b5d8bb607f4251dcf3fb1d06c498", + "weight": 561 + }, + { + "txid": "8b6079a1524bf833be87d3186edc00aa1ecd3c1b84aadaeb5770b50b305178a1", + "weight": 1057 + }, + { + "txid": "c54f1393a0262b9e9e8015dd23d18796d61ce396249ee3a86b801b379651d9b6", + "weight": 437 + }, + { + "txid": "bf9be44ac59826a2321ac4377228e98a1da848f709c47d0e738be787d30865bd", + "weight": 833 + }, + { + "txid": "9667fa1e32cb9a277cecd2aea018bcc4215601fa907841081b7b1236f05f24ea", + "weight": 574 + }, + { + "txid": "920d95529cc414786f812681d9addabd1ffeaa1afac14e5387efcfaba0b95960", + "weight": 3760 + }, + { + "txid": "f841493e23338c8d2bb718d930e2d4c8b3876336e77a6752b4ce5486cebb04fc", + "weight": 3521 + }, + { + "txid": "27035eacf4bbe868e8d92c757fe8bdc3161a9180c587d6cb7f1941d1a8fc357f", + "weight": 11293 + }, + { + "txid": "c57eddaf25c86a555d49747bd4cb0792cc3bce3d1395adbed146ee2da14a2507", + "weight": 609 + }, + { + "txid": "15343118e3abc1a4a497314832bc2ca58b989570cc60e5d33efab5dc48c7b5f0", + "weight": 895 + }, + { + "txid": "d531e9f0bc9293e30b5021f169c3e4fa0899611f8c3cd0e996359056f3c65e00", + "weight": 766 + }, + { + "txid": "ff70c2e80d44c8f3bc6e0c221d8de8b0e59b93b4a6828cc0f7c4d34260280f1d", + "weight": 767 + }, + { + "txid": "e7921d379c06c9af7d043c6f984b81d64d291eb4bfe979707db9dd10b7122625", + "weight": 767 + }, + { + "txid": "a0223ed4f38ce195c5608c55690c139cd2eac22f51024fa7e135315c168407b8", + "weight": 758 + }, + { + "txid": "9e67f83dcb99b13e27b49ae9b85363f981738cd1c20e519617c206d0bea61ff9", + "weight": 759 + }, + { + "txid": "cc3dfc427e769652bc55bcdeabcf155997c3150f3ea1c71b01d7c3dcad77ff5a", + "weight": 866 + }, + { + "txid": "8ff2be0cdcb971154735ee60c2c4e3287adbc8b54853f5ed5ba80296c6c36263", + "weight": 442 + }, + { + "txid": "a3dba27a17b4bfb9638091b228d5faee9f73237af7721f3f914e05814df2cdad", + "weight": 862 + }, + { + "txid": "97c9ca1bd96c63a76f9149ebf98627c203c5e0b8521aca9ae8b5257c24ea2264", + "weight": 1036 + }, + { + "txid": "b8cfa32fcc1d425599fd6bd4dc0715d914bc539d1c8210b50133a519f983b267", + "weight": 694 + }, + { + "txid": "1e9ac67d040dc1684b23732f40c43ece008ecd862a92e1d6131ffbf87b4e521b", + "weight": 442 + }, + { + "txid": "ddd759d8694e1f744b9ecd7ea53551a21aea5d0555e731824a36404451237be8", + "weight": 616 + }, + { + "txid": "ee5875b495cc860109d072219e1bad77c89fe278574cbe970dafa50742c2533c", + "weight": 4813 + }, + { + "txid": "2d4e94db305ce434fe19f8b6b555eef594eeef29f36ef07e5e493a7c3deddacd", + "weight": 562 + }, + { + "txid": "52242e82aec78d91c962579f6c5f140839c850caed5b5a22548ddb16b00c26dc", + "weight": 562 + }, + { + "txid": "8988947fea2cb6abdce3553a8afde35f130d62586e24ffe1b6f89a5c637fe31e", + "weight": 598 + }, + { + "txid": "eb95dd816c78cb958d7c1e6a236e0fc40fac904a3f4e61c4f0fef7a243a2d98f", + "weight": 892 + }, + { + "txid": "35b7c4c8eaa7a9794955897be296671f9b2f712cb7e037fa21aba91fc9c6d6bd", + "weight": 449 + }, + { + "txid": "0a48a964a80f125c1a4a3dad0fc98f739f754fc9e84698be50243b2d7c12ee0a", + "weight": 581 + }, + { + "txid": "f325336c6651519c238e33470f2e8818b83ec93a2492e57391ed7faa6f81fbdd", + "weight": 2876 + }, + { + "txid": "c6b30ee5823664ef1020240932156109a673f428c39c0203b8e1eb591ca86d46", + "weight": 979 + }, + { + "txid": "7d5cd89d5a06b5e55566edacc72e3ed572b17cf099985666c2b85a44fdb8ad90", + "weight": 529 + }, + { + "txid": "7e7d85cc08eafa926ee04e607c1bc1201efad71808cd0e2f81a21bef1ced5644", + "weight": 752 + }, + { + "txid": "ec8d7099c924a57ba9fa4699cb773beb1f5bfb6fe5157769a552eb1457ac9f78", + "weight": 708 + }, + { + "txid": "132ab20264465aca8cfa9ee6fbe1a08f7533360714fdcb8231925490ed7f4a9d", + "weight": 836 + }, + { + "txid": "d55d4a2e92e3c870e4a9999ba32ef6e4434238417e39bd52bc4bf09cb84d7328", + "weight": 1266 + }, + { + "txid": "548e934fbeee4a66690deb2022039acd1eed147e60e38d3408d88fc944c1e543", + "weight": 680 + }, + { + "txid": "1035545e44793aa6366fe6671b6449a428dc618ced0f7241623d5dc1d4134067", + "weight": 1103 + }, + { + "txid": "060bda3f4072b4e7406f8fadeffeeb8fbce383f2d8e507aa4a492c65d0f43104", + "weight": 1108 + }, + { + "txid": "04be7da0c11309e19e119dec0fc9bc2bf7f3c5a60aff2ca1ea7d9e1a01b177c8", + "weight": 832 + }, + { + "txid": "403d6939fdf2a734796fdd154b91b1a1c697140eb1fb94facf1cee8403d66a98", + "weight": 562 + }, + { + "txid": "0e5fc35092211406d8cbab21c986914981d95e0107bf6fc83a19300b7c9e0c2f", + "weight": 3973 + }, + { + "txid": "324773a85f912d5099485b996392b9796609ea646f3a6b2e13995c94f1b50203", + "weight": 18456 + }, + { + "txid": "86ae351c3755de9ca5692a7815aea01656b8538a7bc2d8b515bba1a490a78b00", + "weight": 437 + }, + { + "txid": "74bab55304ab09c0e44edef7d10a32e7ecfb56f92bb2b564bfebc0c7bddfc305", + "weight": 562 + }, + { + "txid": "a0c93d2e6b78fd8e4a8ffa5d7263683f691997161edb6d10b9d2b0af95e60f07", + "weight": 565 + }, + { + "txid": "85fa397d821093d9d5ddaf8cf3ec8a134994abda1fbdfaed9a300395474b3108", + "weight": 561 + }, + { + "txid": "fed77dfc26915c96341720cb5f83f871da89a80868513828d5ea28ece1661d0d", + "weight": 565 + }, + { + "txid": "48d2c9017753ec8b03af555d594f12f02ba1cad15a09246383012e32c6e03a0d", + "weight": 441 + }, + { + "txid": "9ebc48c8752c7d747f2582a97ab9a216be0bee7998cd311fd37528868334df12", + "weight": 449 + }, + { + "txid": "de867d99162cdf67fa478fbb77a1a8448dcff8c8fdabdef4f8c1a020c5290118", + "weight": 438 + }, + { + "txid": "8c73498fbe701e48a4ca7131d85aaff0671f0cf89303bce97d8c8acddba45f1a", + "weight": 838 + }, + { + "txid": "c50c6981dd73fbbdcbffacaa176425ee12f838eeacd2620b9efef2f188a77d21", + "weight": 442 + }, + { + "txid": "7b01e1a415ba7162a7a150304a3f0e26bd7847a8837b0c1e22f48f8b2e991428", + "weight": 845 + }, + { + "txid": "8569f78b1514f91a4db6dd218a52fc86f345ff20422a161adcc70891a39c1e2d", + "weight": 449 + }, + { + "txid": "b297b973313bb8d05b3562b05edad79cbe94f8e7ba2476ba3ceca0bbc857a837", + "weight": 713 + }, + { + "txid": "6268ca1e0f7a3485ef3da074daebdafd907be746a0cc687d4b04215b7df7113b", + "weight": 565 + }, + { + "txid": "2647bd174ec217c7c5498b7b9d6a661582ad59dc7396fa7951f85927fefc553d", + "weight": 562 + }, + { + "txid": "7696f6d2f115bd299e1080e3cb2ac87e4b42bd509254628acc0179c714a88a3d", + "weight": 573 + }, + { + "txid": "0c055bc9d305e70eddacf4603d42c4ca50d045faca7281fff387a1dfada62044", + "weight": 670 + }, + { + "txid": "1c954a2909ba93949d26974596dd555cf2a5f00f64ae8cfab4d80db379d75c46", + "weight": 562 + }, + { + "txid": "a513f70268ee9d58ae48313839ca5c1539d936bb55deb448083214ff07d93647", + "weight": 438 + }, + { + "txid": "d97ca9ff2dbca7e24b590d5da3f68c9780109c5f4c325d3b97c99b0bf2faec49", + "weight": 561 + }, + { + "txid": "be2cbe98e0faec5f96b233f75002a26959f552435ade406e5516b630113a804b", + "weight": 561 + }, + { + "txid": "3efa37754cc59210d6b0d8dddc6edb8be98799ebc8c62ca4e07028c03f31c34f", + "weight": 561 + }, + { + "txid": "be71554e24da80aaba212c41134bb79a3f5d050cb55ff277eb6c4322bf480558", + "weight": 562 + }, + { + "txid": "9a25d25fc31b1383dc4f4f86ab8f3c4032b6979bbe4985460d9b6b1b0ad06a5e", + "weight": 574 + }, + { + "txid": "aa32b8cfe806a88e34ca9b49232f819c1e87503ea982d3001a0736056d8eec64", + "weight": 449 + }, + { + "txid": "9a30c9b1d531ee8111c6ccfd873f276f3c3f835ab64fc29501da4838541a5367", + "weight": 562 + }, + { + "txid": "c6c3b99997da3d67597a498e9f691e86e383853c54cb0c1995f201dfd368b06c", + "weight": 449 + }, + { + "txid": "f5beec9381baf07d8eca7091737cfd83dd38acc9a98d80f1745266950fc01f6f", + "weight": 2988 + }, + { + "txid": "2a42a5bc4c8c849aac7fc4b00e536a0f344be3cff362aa1ee8036a5a9c4eb470", + "weight": 833 + }, + { + "txid": "b0940a7ebb2b253a5d7e64733b31f1a249587d6c3a7f07d31a99faba10d8a574", + "weight": 566 + }, + { + "txid": "5aa7bc9b4d01d0d1798218a20701608cf307667f6db2f9b6fa94e64284304a7e", + "weight": 565 + }, + { + "txid": "2167135f0d7604b90cc32083a9252563d5ca4cf576029a2104cb69d3ffd6ef81", + "weight": 562 + }, + { + "txid": "210c1739ad081604c4e5d9a073825c4c09da2c215b94816bce065abaa863c985", + "weight": 573 + }, + { + "txid": "2ebca6209ebe9ef3ca7fbc00b6d04150bdaa8bae2a664b8779f894df14d50c87", + "weight": 450 + }, + { + "txid": "3ec62e15da7f17a33981e3ca5af07349f743a0be0d3a3a396fa49810eeef3e87", + "weight": 565 + }, + { + "txid": "ef9cf892f7c0c9ce3ecf9635e01529d40bf003a5edf4c8ba73803b488f8c6e87", + "weight": 438 + }, + { + "txid": "c06abff5a61fd462a365dc82557a45c076357323a5014b69e2df5b6f521a8987", + "weight": 834 + }, + { + "txid": "a698ad45d305d1962972491d81e7541c37140ff576a0cca6e3b4f802c519f287", + "weight": 442 + }, + { + "txid": "37b0469b41887bf1bfee3305c79b34ef97f1675074716f767b2638e1c2604e8b", + "weight": 566 + }, + { + "txid": "cd4246c9185eab57e981bef5e6f919586affb9da39fed9685db0639059601e8c", + "weight": 838 + }, + { + "txid": "fe6fbd53291009969272f598a10e74412e758784a68148e8f962d74714a59090", + "weight": 574 + }, + { + "txid": "72be8562ae05b07d600bf5666a9258e642ecf209c1486439b7c63d7e6e7cae91", + "weight": 565 + }, + { + "txid": "2264bb68ea59c0454826a26a60f1f501550fb34d5582a410b6c478934227499a", + "weight": 561 + }, + { + "txid": "1142d71ec50b1e55e7dd5e0876d4570b1e7bc1c14825a8cd422901170d374f9d", + "weight": 566 + }, + { + "txid": "384f8e45ffbbabb1d2f66d29aac58633cb379ac24706877070b79640f3e1a29d", + "weight": 2704 + }, + { + "txid": "c0476acd964ee5de4ced7b07aab4d7ba2955f16c0f26dfeb0efe7cc8901503a1", + "weight": 566 + }, + { + "txid": "9a1b2b83a3b76bb393b605ffaf816ea275c7695b3fb0ae31c83fbec5db1554a5", + "weight": 442 + }, + { + "txid": "5fa26e79796c39288f8e4bc896d9a73f09f78048031ca6efc979ee3c91b1c0a7", + "weight": 450 + }, + { + "txid": "d9fd1796150ae4f0686c3b9b890953c9fd8b6429a5f3b436e090be0f56ed49b2", + "weight": 721 + }, + { + "txid": "652fa5808132038b41483db8f96d8adf4cb3c8cc0a80ee54d679593fa2bb37b6", + "weight": 574 + }, + { + "txid": "6747ff970762beccf2c51ef56cc74354193e5360e1b9c8f165f77ca23e3270c1", + "weight": 561 + }, + { + "txid": "042315efae42244d3c2559b4e5a9c4e065314845b3a5c9e2e0cd18dd7cc921c3", + "weight": 566 + }, + { + "txid": "7edfbd7181b03bcad226136a72f6abd68a5e00361e5ce4582d8037519512d8cd", + "weight": 2445 + }, + { + "txid": "78111a277df781c1a26d4af11170a3a7892eadf45da6a5ee381ffeef3db0cfce", + "weight": 561 + }, + { + "txid": "0b3d4d86e9d788e2b3b8ab200991d8bf9f7776443221c126764d8f3b66df7ad0", + "weight": 574 + }, + { + "txid": "75a7067dcd1fa78400f27551d69f431b840cad2446bab36640a63a9004d8f6d0", + "weight": 561 + }, + { + "txid": "c49fffa55a87641c5f95598de541b8a5fb3d895674ce0fcee118d19296ab89d1", + "weight": 573 + }, + { + "txid": "48781b9f16f7ef5b5d2b988ecca297dacaef38aecfa2fd307fbb6ebeb2e6fcd2", + "weight": 450 + }, + { + "txid": "78c6537e3d33cadcebd99a37145ed5ed6bf0751ee04a191145a5fb08df39bddc", + "weight": 562 + }, + { + "txid": "e05eae3f224b08dd746738890b4204fef8e293ce5643f4bde7e0f99c81e5e1df", + "weight": 565 + }, + { + "txid": "9936df691cb2b8f8f1cc2066b266ed6c1513e6527ca1f3c10e85cfe3176dafe0", + "weight": 449 + }, + { + "txid": "cac95f9d39fedce10da9685401c58429722e8910b6c8b780548b47d81d78a4e1", + "weight": 562 + }, + { + "txid": "0cd47f11bf34df93d2a5bf405edd8b5789dfacb7a641300224befd23f640d2e2", + "weight": 838 + }, + { + "txid": "4b23ea6b15d03fbc326727065c74bab8794bd824a98da192a3f713884918b7e3", + "weight": 566 + }, + { + "txid": "a979aab1c6ffd23a041b01390a18fcd7eb7367b92e5d551946ffab535c7dd5e6", + "weight": 834 + }, + { + "txid": "2c3a3584af272bbfe5967fddc379ea986d3a074d76eca65d025ecb523ae091ea", + "weight": 562 + }, + { + "txid": "f1e09cd4628c3df91d9b5644e175cd2c646745ae31af907b0f1fa06fe13e41f0", + "weight": 449 + }, + { + "txid": "ed35b3c5bf8b7540c6d9914ef3302400a19a0f4f283fd2c8aec785a019c476f0", + "weight": 834 + }, + { + "txid": "9d6d179def2664760a9033ccdb160d66314c942b76357f16d35b154ac568baf1", + "weight": 573 + }, + { + "txid": "dfa8480aed5dfddde5230549c75b9c46cb0a511cd8bb6aba1062ed626b02a7f4", + "weight": 449 + }, + { + "txid": "f4a79e4225f511aae20a0d524dac5cf436777e33ff71badd00c6452cec35b7f8", + "weight": 845 + }, + { + "txid": "1b20ff9963559d320ad593383ed9505531bb85b79949c76dfa0647c1af7340f9", + "weight": 450 + }, + { + "txid": "6d033b5c1f4586373afac965c90c91202da8359a7daea1f4c0e1d15a36317efc", + "weight": 562 + }, + { + "txid": "be30d4adf0dc6ead658b379e8b8cf044f6d6f9d9c7acde16f17143e24e0795fc", + "weight": 450 + }, + { + "txid": "fdd59f3080acb4bd73bc14a424a7de8cc7dac1848a0a0ee8b162bb7e5b86b865", + "weight": 5618 + }, + { + "txid": "a40ab8c0df05949c27e098e616b41c48e66d22d5ca8dba3572c6809671925282", + "weight": 1323 + }, + { + "txid": "b0d8fc958778362e422c50898bbe3725539cbc8b94b20e9e78f05f38af64cc54", + "weight": 1312 + }, + { + "txid": "fc1595fa80414e7d47ba1e9b1944aebc70ff256a9244a513e9febac143f6bc8b", + "weight": 1452 + }, + { + "txid": "ab09b9a76723912cb901e0ca09fb834adc46710a1644c85e8d65994868494a08", + "weight": 767 + }, + { + "txid": "900b82379e84a64e34e5cf1fd433cc90dbcd6a35607b3012847cd2704d1acc14", + "weight": 766 + }, + { + "txid": "14ca0b164e6356cd93691aebe8f63278c1977473c95c9217cb417db886ef3f38", + "weight": 767 + }, + { + "txid": "4cd7a6cc284abb9c40a9559c1f60244f6679bd470bc6b5ae2b0f949835e5a34f", + "weight": 766 + }, + { + "txid": "67b3f01511f5bc087f3a3fada9c2fbef52160d5f0a6930addbbd09afe367806e", + "weight": 758 + }, + { + "txid": "9de9b9178481cd689f6a0b5ca0b57842bcbe91896d5a5e3b6243d92a4ce29fe8", + "weight": 759 + }, + { + "txid": "b5bb9c81b5b9e28c3061b7ab22f89fd2afea126ea2ce0075b3d14012e7a4b6fc", + "weight": 759 + }, + { + "txid": "073c0bf0cdbf973417a0e3c25cd208c3f462e5b3d49dfe367c7ccb8272cace4b", + "weight": 754 + }, + { + "txid": "3e22a369903b3757aeb25c1c4906fdf6a533d9c825364cc55906930fa876bdaa", + "weight": 754 + }, + { + "txid": "f719d75fd9246d964b11adc447ef2e0d8e74fee5c45c3f4604f4e3a7a9ebfc1a", + "weight": 2383 + }, + { + "txid": "d68242bda218ed39f6bb66a9445b3b0dfdfd68089cf1f6d9f8a1208de9cc6cf6", + "weight": 1488 + }, + { + "txid": "ec7837c553621ba2baad016bf3dde27ffa5cc29c9791eed821996a8d77e0e4f1", + "weight": 826 + }, + { + "txid": "f538de5def35e688140b21394967602828892d0b8901007d9f75b93063e713e3", + "weight": 882 + }, + { + "txid": "89c6b4621bb6d092b165e56ef07198297205ba7c793bcc381ddd6b875e0797c2", + "weight": 927 + }, + { + "txid": "125c6959658450066a62078eb4767e3a5f3915ca2b847081cd6287ffd81ce499", + "weight": 1018 + }, + { + "txid": "2a760356541a55ee0079af6e77aa37e68409ba9d007e3c95db1e46ed1ee349f5", + "weight": 1130 + }, + { + "txid": "f0493d8d7fa523d952082a42c09494251ba6f6d72b69d914736fc35fe77ffbb8", + "weight": 2006 + }, + { + "txid": "0a548400f41f612a1e4edc9f6e0001b3161715436de19dc9f483a59679ebf89b", + "weight": 34957 + }, + { + "txid": "203ab70f46031739a529c36dd5332639550ddca22bf0b7e3eb23d53290ee02d4", + "weight": 1895 + }, + { + "txid": "e84fddc332e1904f0cf36b577456e7721de52500aa1b9aace552d45f3007b556", + "weight": 2143 + }, + { + "txid": "3e95457a7b373b1eaa7447eb332f759fbae73bc04028652424f7d4d4de516163", + "weight": 2298 + }, + { + "txid": "4d7e1ff6597905463d138cf4857bffeb3eb541c774e5579bdda8b96f67ceaee9", + "weight": 661 + }, + { + "txid": "68fda30d9acb105dcfe00c12082bce3bb93f0bb937cc7e02804cb4f742b30c6c", + "weight": 900 + }, + { + "txid": "8a8ef09609532fbf71e04b866fd63c7a34c4b839f01ba331f28a3f3d28d54b31", + "weight": 876 + }, + { + "txid": "211eb0ffe6a78f7b4697c49bafa223c415481249e73328fbc8680eb9d291a09d", + "weight": 876 + }, + { + "txid": "e1adec68f1b798a3876d4ebba852931cc7b6f1d03c0f6d0b6ff44edc637e1340", + "weight": 565 + }, + { + "txid": "3355f60f79989c5e109676687c26784b428a93e391975ea683e78fc47a605446", + "weight": 565 + }, + { + "txid": "c2dff0b697d542c8d6325cdb33495990ae8c396a9ab1bddf1d45ac05cf9101ea", + "weight": 565 + }, + { + "txid": "913d102d419a04acf821fd8cabd4bef2568eba31677d55b8fdcef897fcd12497", + "weight": 1387 + }, + { + "txid": "03ed1ce3bc9db95655c4f3013e200a363a4bf229a03a1a23ab1c8e669de5dd76", + "weight": 562 + }, + { + "txid": "d7d96688f7e158c1a68070e22334627447433791d8c3cc661f7c67b2f96d26b7", + "weight": 561 + }, + { + "txid": "9360c787a01dc1e33d46b90257c658b4f98841370557ebce78cc2ca83d6a0da8", + "weight": 892 + }, + { + "txid": "cb73c369723e418dbb9bde9e9505493cd6bc1b6036a8ad46dd2a5e9752fde2c4", + "weight": 892 + }, + { + "txid": "e624275dffa9685b065bc32ab90d601b2e286820650b0530e8348e125a0193de", + "weight": 892 + }, + { + "txid": "464684a9c8aef7ef93f223a4e5af97de4aae37443bc5765e532249a27338a242", + "weight": 653 + }, + { + "txid": "0ab77ee5c954500675a5f3425ab1234b952f9125da80ca8098781d8bb1dd6c51", + "weight": 4202 + }, + { + "txid": "6c3ad30342982930a4b34578b8d00081c0b6ffa69e8d3956a7acd9f920092702", + "weight": 4482 + }, + { + "txid": "242bab51f78473b5928d765ced924e8326c0d829a3176f1da1ebcd179e1f327e", + "weight": 4598 + }, + { + "txid": "81bd620f875330e7f55bd8a5cf62650fb7d2de3c68befc6d785ebc9c45343cef", + "weight": 4878 + }, + { + "txid": "52ab7e581582e582bafa83a0a8d416856505181d8206f1c3a25ae83d91ceb9bc", + "weight": 5621 + }, + { + "txid": "14672528f63649d7e1a0b7b1cec330422136bb68c52928c75f5fe0fd45845e01", + "weight": 5498 + }, + { + "txid": "2dbe4ff4763d05516208aef4241649d495ab7dd287608f787da9408d3ee946e9", + "weight": 5278 + }, + { + "txid": "211eb999838c8a7ec9319c46f3705f1f881ff7899111d3e936adb7304a362038", + "weight": 574 + }, + { + "txid": "21b5ff74b893685fc4355a80b5fe7fb7352c27a19983ae0f483432761b0183b8", + "weight": 573 + }, + { + "txid": "754ab2b7b05eae9dd2dbba7297aa904f0689899725e58e67127687b989c182eb", + "weight": 573 + }, + { + "txid": "0de7dc39943e9c9b2c78d3d8cdb1707958bb58a28e6e0e7ebeda65f9f7d1287a", + "weight": 609 + }, + { + "txid": "c117742ad06c956d478b7f36fdee79a87228fbd210183e7d880c4bee7d0b32b0", + "weight": 609 + }, + { + "txid": "fd90c6327db8fb7db7c62be05dc3b7e178325c1aa3082fc29e4aa9f85031e01b", + "weight": 441 + }, + { + "txid": "4f91293ffdff1f31145e6c2e304e3024442e0081b2801171baa7127589297f38", + "weight": 442 + }, + { + "txid": "f9b202a65cb7f7178f3ce2620262ed5987ad76b5af9f1a0e81b3bbc1f301bd70", + "weight": 562 + }, + { + "txid": "f4b95fb19bdfca226bd30ca824c48bf58dbd91229cee25eb41ad71b80c6fee98", + "weight": 1437 + }, + { + "txid": "a9038c89091e5d121cb7e6742f9b0ec8e7e2dee57da454047dfac2d7a4c101c1", + "weight": 1838 + }, + { + "txid": "aac7f97d4eba3f084170e85fcde9d4e8183d6a898019869c02f17df98e06142a", + "weight": 832 + }, + { + "txid": "4ebd1676c0b13bbe4e9fa6c18a812bfcd537b5b266cda0bb07cca072df857ab8", + "weight": 832 + }, + { + "txid": "018e51e66ebea58ffc6e3d8eb7a1fc5b52414455ea3e3133ed43b97d2f702ecb", + "weight": 855 + }, + { + "txid": "d5a201d925c273c82298ec437aa6014e9a00fd20df71602a8f5a808a424ca525", + "weight": 561 + }, + { + "txid": "e828d313e3a94eef22891b86da7d2c4bf3f22f090925cf83102acf75a06d2996", + "weight": 1334 + }, + { + "txid": "e372f597bc3f732a9b6b351cf3c12334868d5f1e15f680e6b9bd3c9612d3b2e0", + "weight": 2344 + }, + { + "txid": "bf5ecd1ab4c38237401da85d586af56900afda606571d69558b951cd5e4964fb", + "weight": 3006 + }, + { + "txid": "dc4cae556a68de69af00669ce5c5982bae768dfed6be756f0713746e65c8c90d", + "weight": 565 + }, + { + "txid": "d8ceed13733dca67d9d55c96f95fbcb0c0351b58b862371cd9df053072aee9d0", + "weight": 836 + }, + { + "txid": "c4de5809868ad034a18971662784a9ba0a5d891dd1f06769ee84c4c64e81032f", + "weight": 706 + }, + { + "txid": "1e8716d034bdf75de19909d87b4107904c89902e249dbeaaedab11e3b69fbc69", + "weight": 573 + }, + { + "txid": "cd0ddd428e5119d94d53daed8b4cd78bbb23d911213d5110074a08f96fad0288", + "weight": 573 + }, + { + "txid": "e133335b075c4fe81a4e2e3361d36a2c27adffdca6b0077e759ea20289512cd3", + "weight": 574 + }, + { + "txid": "b1be0a43638cb87aa1f5ad7d9d19d53ae5dcaac5937f05858b1eac3ad63e86dc", + "weight": 574 + }, + { + "txid": "e6e36ff8c0ac171c9e1e74984a2916d7bef7eac77c1901a9e92317454e56e7e6", + "weight": 441 + }, + { + "txid": "44f3949f54e2563bb9ecf4ae237bfe41c6c0ed37de3d4c16e16041c0306d9b21", + "weight": 561 + }, + { + "txid": "96408bdd88ae70942ba99a46602b117bfe3fd98207ecaf26eb80b6e327aa0832", + "weight": 562 + }, + { + "txid": "7507d90dd7c2b0b98d7d085a929e159bba2f54397480f821848d50a748ecb343", + "weight": 561 + }, + { + "txid": "a4dc35143dda4db4f8431b299e4d9a467cddbbf0faf1636248da088acc1c444f", + "weight": 562 + }, + { + "txid": "41af934dadc39902f70df0d3c77bedcea56057c8d3b896f0c51087a880eedf76", + "weight": 562 + }, + { + "txid": "01f4b791d3875ad2cebffe06f8d2d1706d873d76edd7f3f755e0162b9954fc8e", + "weight": 561 + }, + { + "txid": "d9f63c049d8aec18e6a15bef88458d3203856c9bb6805c61fc86f088281d7ac4", + "weight": 561 + }, + { + "txid": "1a455e87593f13fe35dccc224fd3477c66e3f1e818ca45350d7cb335d6c3df12", + "weight": 1753 + }, + { + "txid": "7cc0bff1338116f0c51c48017c3ac7e42dd431c6587c030766c18941af4d4e34", + "weight": 2921 + }, + { + "txid": "8c501b53573b1fd3105f4caad97547c5b4dba481ffe3f930ed8c7ea9a8ec5615", + "weight": 566 + }, + { + "txid": "17fdc0b94b97aa91e04b11bc289c71dac2ebb1ff4e0b6234ffc816c92254081f", + "weight": 565 + }, + { + "txid": "a9169ee8672b27342ae01c93481fae86980beebba9c4bec67ad4b8e1f130f69b", + "weight": 565 + }, + { + "txid": "364e0ba4d0ae8af423496db75d51551722dfd3bae60d218d545571caeb647642", + "weight": 566 + }, + { + "txid": "1834c3c6abde7afc093dc83f29bd56f91ddd325a9847c53b9e8fdffb69b9074d", + "weight": 565 + }, + { + "txid": "78142070bab16110c84b88da1fa3ac399961193e83c662cc7aa2daa2b7b0a660", + "weight": 566 + }, + { + "txid": "66cb563335ca8b483a235c5ff0700c92a66bb56b42f7df09409a6750155f2966", + "weight": 565 + }, + { + "txid": "e2a184b5990939d1960dc365311e32da5d1a78b894a09bc24ddda88840a2f90f", + "weight": 2629 + }, + { + "txid": "8ab1227dee18c2d538ea024bd32b6d4e2fa9ae729194cf8640df6eb8597f4b36", + "weight": 569 + }, + { + "txid": "b45346c8d8e4d81b3d5bce8bb4ff25e80880bc543d19998c5158e693bf1573db", + "weight": 1484 + }, + { + "txid": "b00b11939705de762645b8046b0aa84637850e0893f2ef97512bce33bb420b76", + "weight": 561 + }, + { + "txid": "ebe12990fcde3268b68260079952c80a25859c60d5cb159860665c94bc0afd14", + "weight": 565 + }, + { + "txid": "512ff899ec86cc3fcdf9fddd139399b4c7b5e865c34073c617f90d678642c9e2", + "weight": 2928 + }, + { + "txid": "efd3001a8bb1a4b169e964cbde18e9c151bc07920a1e9671a6a8dee632d79c36", + "weight": 764 + }, + { + "txid": "f7868411ee2d3d8418adae6f33b54ed0557a5f6f2ccc647f54dfdd54a7c24852", + "weight": 1352 + }, + { + "txid": "b4bc1e8a96bad158e1eeecfc2853bea08ca3c545d97666ae5b377d959eeec883", + "weight": 701 + }, + { + "txid": "9506e5efb0a39900226f415aeaaff00044c9bf0525dc4829de6e68b261ecab06", + "weight": 444 + }, + { + "txid": "0cfceb75a161a7f576bda3fe899150e77028cd41580c2df6d5a9070236e3cb06", + "weight": 904 + }, + { + "txid": "2c4179a77ad847c5aeaf2fdd1516f21703b4c903cd43f8f612f751ec00d98d07", + "weight": 444 + }, + { + "txid": "49e5f6ced7e6c05e9f3955d1f567d89cf77bd5c82f33b4faf4b2c3956b5c010a", + "weight": 444 + }, + { + "txid": "7a1bcfd2a98a3aaac4ad6c44318d8bd4292cd4f343a21f7b8d79318c7f15bf0c", + "weight": 444 + }, + { + "txid": "b6666a8751b3c6f72ffd86f968c7f61bafc5ba7cacc4d9db24a1bf59d101a813", + "weight": 444 + }, + { + "txid": "e062cf81d5106d07a8481842c25d459f769987b11acf8f3cb90defb43cc8ef18", + "weight": 444 + }, + { + "txid": "222914edb48938e10338f69e92aa6e386a0801e502dd141634db482f821eef1c", + "weight": 561 + }, + { + "txid": "fca19c07a4f6f501cb2065ffa47819371d6df7b142d81010427891c190b4bd21", + "weight": 444 + }, + { + "txid": "40169b18558f2b514df070829ed93dd05a05d0ecc145e5fe009f5d300d65ad29", + "weight": 444 + }, + { + "txid": "e8a5d3afe69a3f5943540228d5197ce7af6c450cc5b243b44f5135c062f8422f", + "weight": 444 + }, + { + "txid": "535f1f20c15f297af9c4f87834a10f388a36b43ecc6253e4157484116b4eaf31", + "weight": 444 + }, + { + "txid": "862de439f9c6b4649c5541ac1b80e72b0a28e046bffc764b71246dba8799e639", + "weight": 444 + }, + { + "txid": "99849cf76acdc97a9a5afa976eb2300bbf6525b7e133e7da0456c4554ab8bb3d", + "weight": 14134 + }, + { + "txid": "c06bea880bb85edef0a3ef07778d61ae9e71040448747ac97a54edb332f7f743", + "weight": 444 + }, + { + "txid": "6df164e24cc4f8563d7300f60389b13397c58de6d15f1f4cc68413cf604b6c4a", + "weight": 444 + }, + { + "txid": "6460807632bfdd2aa272add4628e54e14c03534a50be64cff385453e3528094b", + "weight": 444 + }, + { + "txid": "44d8d49d8883bd322eb11b99be2b9229224f7c8e8e4969d9031d4cfb3a55e64b", + "weight": 444 + }, + { + "txid": "a9e2393f4bf649c4674bf5f9061acef02ee0f3cadd6698cbff57d7399a352157", + "weight": 444 + }, + { + "txid": "26e7214b1e2e6c22e946b86babf1ea773dcfb99bdb918181faac000cda5c255a", + "weight": 444 + }, + { + "txid": "48b94707cca592eb226c8dc70fbb9475fc972ef6be4ccfdc93de8e340877a35b", + "weight": 444 + }, + { + "txid": "2fd7241161d6a0870ac4c8852c84c64b70348cf955e82064f418cfcc08139561", + "weight": 444 + }, + { + "txid": "f8959b0a6ab36d7f647e4d2abdb5bc9afd9f45022529d0d71d0d1106872c3f64", + "weight": 444 + }, + { + "txid": "a69f4e65e4387292fe8d76f3502dde11dac4f32f5e99abbb08f982400cf4f96a", + "weight": 444 + }, + { + "txid": "39767478259033cf7ca4c1225b654be611dfe7b4a59497527efc3694d7ad6478", + "weight": 444 + }, + { + "txid": "7ab90d5813eed8000afa1015bf37a2ff7077357b501887590b5eb09c36e7fd7f", + "weight": 444 + }, + { + "txid": "b6d04c848ec42969325d8f34c041839ddc3975596b3a66b08c8125aab7231780", + "weight": 444 + }, + { + "txid": "096a40099fd37b0af55e939efb4e24029702009966b6fb16589c892128f90181", + "weight": 444 + }, + { + "txid": "ce0572eeb14196a2e446ee00a028d88c03cce94d00f0b6851b6f6c5140204584", + "weight": 444 + }, + { + "txid": "ef516ecbdfd2e23944e65c4d670d2fb2525711cd2f0704d3e89875f8608dd28d", + "weight": 444 + }, + { + "txid": "fffeabcebc451e7ba08326a2faf0005905fbc8e9f180164f913089d52a49e2a1", + "weight": 444 + }, + { + "txid": "f5fe7e5b7d35814329e3840e349cb17cd638ba28d0caff42c7f65e4602f1a6a2", + "weight": 444 + }, + { + "txid": "6de05e1429117254315a5fcce89a693365711c679921fde4fff2b8ca6f8131a3", + "weight": 444 + }, + { + "txid": "b99b4e154742cdc8649b86887513fa01cd27a58a5abf251c21eba54dcc1e20a4", + "weight": 444 + }, + { + "txid": "4273c064805cfe0be0380b8e9ee42d16817ee98efef2ef69d514b24b645e11b2", + "weight": 444 + }, + { + "txid": "58f4315487f9158736f0279d00f42f0ed9ca06c59c01693b2333b89de416a9b7", + "weight": 653 + }, + { + "txid": "7bbfbbc65b7c97846e76206b27099aadb962b5c32fd4bc9de4ad449e5ac142c0", + "weight": 444 + }, + { + "txid": "8ff47f4f1b3c0030e493c0bc7eef8d903f8c9ee39e53166d9e876d2e9e2a98c3", + "weight": 444 + }, + { + "txid": "eb4e7398229616ac7fc2709c76b456f6ecefaa0b2603b60f3e1da41cf9bd93cc", + "weight": 444 + }, + { + "txid": "fd70d8e1fd83ac596473770604a71b1f9ab163f1e073c57d96b5d3f8391107ce", + "weight": 444 + }, + { + "txid": "02c581af30d4a6e6b362847ac11e5881b787d9958010e1d03a8c9530d91921d2", + "weight": 444 + }, + { + "txid": "fc733c7a699ddcf9e8849e0d23bbd6a4d5929faf40f320d904c6a3c94e1a8fdc", + "weight": 444 + }, + { + "txid": "54c730b27ce3351d95411d44585ccb8546133c279848182b974b0bb4cf3f0dec", + "weight": 444 + }, + { + "txid": "2b5bc9f033fd262655201f09be47c22930a637bbddac2fd841357cd87851e0fc", + "weight": 444 + }, + { + "txid": "67c3df0039c46ab1f013dec290204f7bd2050184a814f9ee972b8085c70fa5b8", + "weight": 1222 + }, + { + "txid": "dd43afb9504229561b30cde0d0a9940f183b95f80e0a86825b3a3ac2e56aa9f5", + "weight": 657 + }, + { + "txid": "92fb5bee1b4b3ac7125783756b01c9280aa4f98a65c353351ebfd11ac9f91f74", + "weight": 10759 + }, + { + "txid": "8f7c982f35380ba04d0104d83cb2dcde5da364c6d6209462f48867ffc1baf63f", + "weight": 720 + }, + { + "txid": "7ec5d415a20fa8587b6c29ec6fa1a2aa7d1ada843832e7f663a35c07ba8b9b6c", + "weight": 4512 + }, + { + "txid": "d1a735d34adc1c6e70b40ed72737fb4352581ac4c4e7071e9716462e439dcf3a", + "weight": 1176 + }, + { + "txid": "0846a22e9d063823669e4605b75a6daf13584b70ac4f58eb73b5f9894619bf07", + "weight": 1171 + }, + { + "txid": "c8e71b253420f072d02c7e0da93488e7ec53d6e303b29794cfcc369255d3e77e", + "weight": 542 + }, + { + "txid": "1f29a306b65dec80398e66b9ef656833dd274998f4f1fd4b99f30bac4edb0d22", + "weight": 764 + }, + { + "txid": "576256cf933d895be4e8769448514d039bf03f634b8661fbe6c6dc647e4f76c4", + "weight": 760 + }, + { + "txid": "253f9754d25ff27c9f2285883d10eda1aae2b427586e19d21b9ecf9a9ab22a48", + "weight": 8417 + }, + { + "txid": "61e123853d3c16d7ba136fe7b2df474775e9103849f5f5e3e8bd725385b462ac", + "weight": 1630 + }, + { + "txid": "ab794e6c0b0aedf0ba13eecd181ade5da4e728f741923eb0ff2479cd27dd15b9", + "weight": 561 + }, + { + "txid": "a894bf6d4b158f25e594106f96623bc9e7eee59b82f775864ec982cd722f947c", + "weight": 585 + }, + { + "txid": "3b43bb583ed1eb634d85aa14912bdb101bfe765eca1df437fbcfd21cf7d63b06", + "weight": 561 + }, + { + "txid": "e372a2af4e0d52a0f1b2fc6da3575df2fd342e36f374e6050b9205564964d444", + "weight": 1032 + }, + { + "txid": "50436d5575eb98fd010de24e91a425a98d06c8222c6a0f6a5d1093e429d12abb", + "weight": 1032 + }, + { + "txid": "f187a7cf40b653d697915bec0840eab21c5be5d29d3e5112b6b2efe4f20714f6", + "weight": 1080 + }, + { + "txid": "a49d1624762dd064516ebb413ff56b46d598726710db95bf0b047d459ff77822", + "weight": 657 + }, + { + "txid": "a55145732ddd46c217946b58206a154205832be1ccc345b6bf576b19d2d45fa6", + "weight": 658 + }, + { + "txid": "93dc5e78c8a3b48888c5b045653f2751742926143a142e795c5d1d15d011f520", + "weight": 768 + }, + { + "txid": "deeaacc4d4dd94d41dad5eb4591b24b1b7c048b9b4fd0cea1bf3552db3b2da61", + "weight": 943 + }, + { + "txid": "bf52fbb6c8a7e7c268225eb230f269f4571b3684e5bff73ada81e37244ab5ecb", + "weight": 436 + }, + { + "txid": "d8f0228c079265018c36968de67f50da04955611ae2185756bb8fc8e142430c0", + "weight": 573 + }, + { + "txid": "8b1947820dd007c16020b6d5453aead483049d08af97290be0e40010faab2760", + "weight": 561 + }, + { + "txid": "0299a03272075e30fb1ba1cecc4c64b4a7a17162d28357cddbae6ac44e9eeea1", + "weight": 541 + }, + { + "txid": "5291f12fa80ac003667ac56288343e971a9dff66c936779dc615d9da1cb22d95", + "weight": 953 + }, + { + "txid": "6b6e24b589b3bd6ad15383e7ea6791c4d8a60bbba9e8ba923a6bcdbf87088f67", + "weight": 2164 + }, + { + "txid": "2731b88928390ee4a10d88f0404503e4e7e844ab6461dd0086779cb1eeb08631", + "weight": 2119 + }, + { + "txid": "425f5d160732e95153929530b3bbb85e084ff15b3e431025bc91156dfb690cc1", + "weight": 616 + }, + { + "txid": "9e0bd2fff8e716c2ccd69f876eacdc172974a2facc01ec3db237fc922fbef957", + "weight": 585 + }, + { + "txid": "69d09f55c3b2be00e8dd493468b60fc8079257fbd0d6c156fef009a1d9759203", + "weight": 1480 + }, + { + "txid": "8fe2a6d4c8edf4475eb94ee5c5633c0cc7dc1c9322bc3d7e6b625c9834e5108b", + "weight": 529 + }, + { + "txid": "bf1637435bbb2a6ae51143d7fd44b602884c60d9bf6babce36df0007548577bd", + "weight": 845 + }, + { + "txid": "27517f5232a64178869c85d1e0c66b4710581153c80bdf17e35bda9a43f3d872", + "weight": 2112 + }, + { + "txid": "810f2bd9bfb4ba23e2de17112638b6adc3ef3f88981036ff4f6a62f8bf892336", + "weight": 1197 + }, + { + "txid": "c831caeafa55d1ccbb3597535c234d500519c657389d09194c1d45b7c94ade3c", + "weight": 616 + }, + { + "txid": "44ede340e2e2a7b4c5049fd776a8eebb52a19b6982ee28883bbcc292f6cf6f74", + "weight": 662 + }, + { + "txid": "04d9f47dd46cb306fcbaa74e31a2ab52815f2ff7caeb2294f978a1a365bda87c", + "weight": 851 + }, + { + "txid": "01cbcc2718193dd6fb869c97571ee2e9b1566fe8e673a1f5d016230e4428f98e", + "weight": 438 + }, + { + "txid": "82e3bc4a460324443c65fbd08d93b5963902155e98e27ceda09eea315fcc94be", + "weight": 662 + }, + { + "txid": "72f48e53b6146a88ae2c015086b1005e736dea301b4ef4f428ad7483b92726d8", + "weight": 573 + }, + { + "txid": "3a449e981ff6ee80fd7f9884e4aac3678bc3ce7a3688ed52fab71c7f5ba7c8ef", + "weight": 31618 + }, + { + "txid": "cd81d7cb54d4ec3ff2d1b6cdfb8bdd696b88fb2406e8c288acea326a37e72941", + "weight": 437 + }, + { + "txid": "93cc63d1d6254b1b53ad6d0a923e24c9729302ea40855e568240bcf8b0f2502e", + "weight": 1309 + }, + { + "txid": "f342fb0c8b9dc0b91fa35ecf8712b59c660b374d9649e87aa011fd3fea140633", + "weight": 993 + }, + { + "txid": "6e15f052acf8ca73e4a7a1723360296b6f9eba67167d7048dc04027052ef1302", + "weight": 662 + }, + { + "txid": "6316816af814b6a9661df496e9495ae6b851f3846636767130967b89031e762f", + "weight": 566 + }, + { + "txid": "b5f938fd7f0b017d8f311301c1ce12e305e7e6999c731f28a29c0c775ba226df", + "weight": 566 + }, + { + "txid": "0180f47f94e251c8c4ea99bf9b2b06c63050088a80fb69b74ec3b8166b4f4316", + "weight": 892 + }, + { + "txid": "2b7b43c0ef947e6642ab29edad8e9c01f9efaa1819291877ff55754363c902d5", + "weight": 2192 + }, + { + "txid": "4c06d0cfe8c068002dc39cda0a64a79909b491ddc7105cd60403eec3122d7f99", + "weight": 562 + }, + { + "txid": "b8685dda935bc907fe0bc6522f186a0ad04331428b280df7063d68427a30d2b0", + "weight": 1105 + }, + { + "txid": "4e37b8e576e36512e97058e1b0f0f5ae3530e2aff85f3519deec67bb50774761", + "weight": 609 + }, + { + "txid": "e28cd06d7b2400ebd4a94d1f3d42dcdc0031eb02910754109056f7e9a7cafb24", + "weight": 688 + }, + { + "txid": "c59c9ce2fc3bbba9a780cf7cb804d58f1d86f2e3f3407745df6f4b1dc4682b7a", + "weight": 529 + }, + { + "txid": "7328a1b35abedd74c096222d27753f1756e584a327ea19fb98622a0c3abb4b96", + "weight": 529 + }, + { + "txid": "1d9baf97ce03412876e43f8179870ca9fc52637812e981228e45ffa4bc3cf643", + "weight": 888 + }, + { + "txid": "e8eb4917f19305aacd17d96609fbc2d88a13f2fc85c10e976ee74879437df8d2", + "weight": 609 + }, + { + "txid": "bf0eef0e4bf41a1f90e0ff15e12b13211c2d7dab771d5648beabfb88b018dd10", + "weight": 689 + }, + { + "txid": "4dac2e29256756299f94e5963b8ae09dcf43d970cf9d61ad0827433fd38b10c4", + "weight": 574 + }, + { + "txid": "68dd1572c1dd7d3539004bfd35e15a029a0d4c9729b9a1dc529aa5d6b2b1692a", + "weight": 888 + }, + { + "txid": "8e416847e0bc24ae33a46fc044cd7081ae422b5c234ca81bce2a3ca8ea49d34c", + "weight": 658 + }, + { + "txid": "947131ba9b504bb911476e17c838d399f9ae5e1a40505f394456f405ac70da17", + "weight": 1936 + }, + { + "txid": "eebddb8ad9eefbc6fa33e1b548cbf540042f3196af600b47a219f8461f5ca832", + "weight": 566 + }, + { + "txid": "d992d3b452b0a317d56450899d01bb6ce349614e29acf5cae1b77721b6ec691b", + "weight": 888 + }, + { + "txid": "3d4b60383c8cb8ef66f5d4c063973aa0eda1629b2b0ec7244fd2cafb348dc7d6", + "weight": 892 + }, + { + "txid": "5a33ad230b9041f9dac402fbbf9adc8d91060ac8b5bf151da5f541b095d14168", + "weight": 5252 + }, + { + "txid": "a46bd598ba457e8a6a266ad87e03fef0ccbfb967f11a63efc6f9972be4fca877", + "weight": 616 + }, + { + "txid": "03beca5cc04891afa0fd1e75c2dc8fcf0ed3b5941de43bfac45b3f5079ad1d07", + "weight": 896 + }, + { + "txid": "f25479816e702da9bb6a4e14bb1a38aa58487cd7d85989b6c5e1e93ec3b0f20f", + "weight": 565 + }, + { + "txid": "41e1332076963d5429492f4b148d6633384df9b4829d0bd503664f17fc913dfc", + "weight": 565 + }, + { + "txid": "9dba29b5297a51991b4e2452fdfd78dc597c07e7a246de95dd9c819e4beebfde", + "weight": 573 + }, + { + "txid": "a8a3ac5ed0479b09da53fcf382431656bd2f017e64ce968a25d22467996d4a2d", + "weight": 924 + }, + { + "txid": "adcd3562308080ca8f647fd53c4c9c6fb4ecca43fdb7e20858abd3b90e368b4a", + "weight": 1060 + }, + { + "txid": "74055df153e129879c672f046dc7b6bc5a20a00e0a416b2bf1f6fd2968f292ca", + "weight": 565 + }, + { + "txid": "dc09b1f4ed462ea9b2af1db8eae90d52909ae3a8b4101c2c0cc6e5e3b287edfd", + "weight": 610 + }, + { + "txid": "562f432c9946108a8fd26a303ca092526f18bbddddaa37a3321f3c5cec3d0d14", + "weight": 561 + }, + { + "txid": "50e5eaa53230d399e2f67f20d7a27978b038dffd099085309eb386e0a37ca787", + "weight": 573 + }, + { + "txid": "881a04c81711312c9512f4f91294a7ce06c23c4b847e9d9cbf3dcac9aa561a01", + "weight": 781 + }, + { + "txid": "9f85ee19a86ea205b5d568f8c586dd8e6ea3a6bca411e968a0677006868ee028", + "weight": 573 + }, + { + "txid": "48f5e3aebfcceb58d33ce43baddb8bc60a3961129d2370d435c2b0f539d6bb3e", + "weight": 561 + }, + { + "txid": "8775870a8f83141529e2d55d0e818638acf4d22d2c28d1e3c4804ab7ec9e403f", + "weight": 781 + }, + { + "txid": "13b6f10ab4402f345b24c6d6e8884fc5c75a8c9f5f9da480c7c6db1fe76715a1", + "weight": 658 + }, + { + "txid": "d869a64522141e1e35a0a7d27d9b006e52430b67968a0a86a55fabcd3098a1b6", + "weight": 739 + }, + { + "txid": "1d8633729f24a64aa98b3ee013cd5044f35d6a223dc84d0b4ca4b75027a7af21", + "weight": 609 + }, + { + "txid": "a395855d1dd6908ecbff00d74ea3deb35c9feaf50db61eb3de1ad753e8d2f1a4", + "weight": 689 + }, + { + "txid": "bb72ffba8e6c88bde86badf7a65d8b307e5aacd490738b2bfc74e489d63063b6", + "weight": 441 + }, + { + "txid": "2d8f9f69b2b8db02ef92791658f3afb20dcad86ebf9550d8897a11763a6d603a", + "weight": 437 + }, + { + "txid": "cec4b1a55b4769dc41e8b8bc9df4e048cd296ac228fc64de79d81252dfc12cdb", + "weight": 485 + }, + { + "txid": "4ae937bc30c148571870ec9cb63de668e41ce4ef9c9317d116a21e0943759e51", + "weight": 573 + }, + { + "txid": "d04545198a98db7e0fc1ce9da2141707625e87e2b98edd4a2593f5ae89e756b2", + "weight": 574 + }, + { + "txid": "616bf5407cc415789b8e564fafcb65a8bf500fce6011db3aef6ef3bfba8863e6", + "weight": 573 + }, + { + "txid": "1ca4190b29cda641f4be7e156265f8ae8b7c51aecf186a6f465a3fd4463b17f1", + "weight": 2026 + }, + { + "txid": "61e5faeb1710475782d7961b5e9b952a2dbaf54230a3b0a4d97968187e92d4dd", + "weight": 833 + }, + { + "txid": "7af186e20fba479917ed4dbee7cead30140cdf86b17f7ef7f9035cd3a20d1535", + "weight": 562 + }, + { + "txid": "eef7a9bfaeb42e3342c11c3589c84ab5b42aaa293656d112901f526defef1503", + "weight": 565 + }, + { + "txid": "e9aedb857862af3eed42e2798c49894f3283d83d5bc3b2e3563d55f3ef1751ac", + "weight": 561 + }, + { + "txid": "68427e7797c3dbcb326111d389498afa50793ee7f7e8d398cf81dc7d3a9b6386", + "weight": 665 + }, + { + "txid": "fbc9583f58fb8e3c35cddb5ef99d9ff25afd0b8d0d2702a630a3cb575f681aaa", + "weight": 665 + }, + { + "txid": "b9f55681b437e4329ea9c54d9b38ba70b7122e2178462a43ae36ab02df7c7a0f", + "weight": 2268 + }, + { + "txid": "50f08765a58d07e43c14f506e5ba3d8338b790c40767794c56a0639b8d04b493", + "weight": 991 + }, + { + "txid": "f673a57687b00a1b642dc10935a4bd8f65e534c9f046e57ad5e9606df00ff00b", + "weight": 616 + }, + { + "txid": "2341f7e7b55462fb1372e29de52979ff68cbd240d0ca546cf56e60f2f277afd8", + "weight": 979 + }, + { + "txid": "07c36cdb6d5c3e96900756e6620ffffd6259587cc9e4ac000139cdf8ffe68474", + "weight": 1151 + }, + { + "txid": "d614d331fcf1ff82c4b078c352e6405f1b02b5e81d07e88d424350b7bd654191", + "weight": 880 + }, + { + "txid": "84a6d1158f0a8c14e5dd54d5cb0a3784e18090ee91a394bba4e4fd61d0efa10b", + "weight": 669 + }, + { + "txid": "6467c4a2b16a4db53960801cd27abf3a051a0c90d955d5498198399f93026713", + "weight": 689 + }, + { + "txid": "0b4f2392f9c97ecbb0cc1e33b4099d4c3ea78d578ca8314a2b259b6a888d73ee", + "weight": 812 + }, + { + "txid": "57ea965ee96aec0c3660f742f0a9c3be13679be1928d507f5144ba3b264a5395", + "weight": 609 + }, + { + "txid": "807d92084b06de0ece1734edb75898dd2d317352aa311b7cb94b92df5e817c5f", + "weight": 689 + }, + { + "txid": "ebd5089ef1064a2036a7c64f5559905b05da99874b463dd33a6f9b13953e254d", + "weight": 573 + }, + { + "txid": "c1c01783894e62236972cddd994707300566ec15b35598ddb5221c53fc2315eb", + "weight": 561 + }, + { + "txid": "e18bb373685ef477cecf226f9ff314b33c61dc5313c308407e7b6622dda34a07", + "weight": 561 + }, + { + "txid": "4eb51154ca6bb8f44a274896c3b058a54f6c552d11ac824816d6b4dd244c7020", + "weight": 1521 + }, + { + "txid": "c627b6d5ffcf9eda6d0693369a9aa314369e9677a314de5bc5bf07fd5e8ba3db", + "weight": 561 + }, + { + "txid": "b4ef6716a73b8d8a40727cf171594575184691748046decddfe3212c5c92be19", + "weight": 979 + }, + { + "txid": "d7529e44231b62365e33879274e7041933d54b32d750bc842087ce66ea302428", + "weight": 834 + }, + { + "txid": "2910018f0db6fd529df9ef94ee347426815cc672dc20e618fc1d0d74d7e02da2", + "weight": 838 + }, + { + "txid": "a2f451ef889340fe975e38e61049c4fa3807768d29a5a811ded399612cd66d54", + "weight": 562 + }, + { + "txid": "9fea8cf6eeefd9e1be9c2874a52d92471f838b46e708cab4eda67f88284c7831", + "weight": 1107 + }, + { + "txid": "a4b945ec837d1aecac68eb7830af925247b7eb45be01bbb1e460b4192ce2f4db", + "weight": 1519 + }, + { + "txid": "3436416fde24510f9091131a26ef5499007dbc233964132e87d8b961107297cb", + "weight": 609 + }, + { + "txid": "a2535557ab656da17d5802e8450da2d318485175bc334d4cf592d9c70079fbdc", + "weight": 687 + }, + { + "txid": "10a64f8e11085bb7d3eb902a6e527127bcb83fc4e50e5f30c0f3c4a543658ae3", + "weight": 804 + }, + { + "txid": "ec76d52a8d2763dcc99821850c95b9abe07318c8758718bf4164935185791f23", + "weight": 888 + }, + { + "txid": "b3019fd60f897f72a046ca410329664813b2f339d48edd87bcf28e9ae6b973f5", + "weight": 705 + }, + { + "txid": "33172fdc2fb4dfd1fe8be3d437b8765f75ec650ce2db4be8585f84976580913e", + "weight": 892 + }, + { + "txid": "b4401142bfdcd48ae2062fd12b3ab846f03ec8ede47c5d195655a17958355a6a", + "weight": 561 + }, + { + "txid": "eeb6ffd7acbf96f45dc265eaf5ef9038b09ed1bbc005f76e66e2ddcf3ae00a08", + "weight": 616 + }, + { + "txid": "43a94fea2f01c16fdfe8aebc3bc51d30bf4370fe9ca134b24ff7e9bb6d10559d", + "weight": 780 + }, + { + "txid": "32958875459caa94cd832e55c6eb1bd4820b494a13811c750cd7fe3864f56cb9", + "weight": 573 + }, + { + "txid": "cad5782b72d51036bebb5521fc25d9b35a696c2cb1f664dc993b18d9ab25850f", + "weight": 1350 + }, + { + "txid": "aba020405364ff24795c98d44de6457b1c9cc940d384041215d28d9277ad8e2e", + "weight": 1350 + }, + { + "txid": "2d79eeaef3ec3ed93192be2a244e0c0fb39d46079bfd88bf1d780b72733a54aa", + "weight": 817 + }, + { + "txid": "d24f9969916b2ef6142d57a4b0e8e0dd3ee0c2da04e48af226692958a622522f", + "weight": 828 + }, + { + "txid": "5ba965cf277040c478d2668cf938c64f2e92841c26b88aba8624be1bd6ef7642", + "weight": 561 + }, + { + "txid": "8f9dc33e5472167d7828b50a71525592017be295f151a09e1d3b7ea8cc4e9beb", + "weight": 2191 + }, + { + "txid": "ab1458ae6778458c1ffb344f1c1eec2f82af7d3a008d0932b25a7a1001242006", + "weight": 836 + }, + { + "txid": "1f8ac752d7dadc8d5f9b7192c5e707e3667f506e2db7b7749e026b5843c87507", + "weight": 1484 + }, + { + "txid": "64c6947011f46622d169f492563de90094f07c314aa324604b961ae311342f0d", + "weight": 985 + }, + { + "txid": "d3f23f029181feeddbac5903895fe560cb9c5e17df96cb2622693bdd0bab5c0e", + "weight": 565 + }, + { + "txid": "3644b34230f5715d89021b4a9694715207cdc1ca3afae826646a75d3d72d0f21", + "weight": 710 + }, + { + "txid": "f4875b5c64af36bf162887f78e60f2516f19486cbbdeb7575b0f86eca4bb5a2e", + "weight": 837 + }, + { + "txid": "355ed36bacdac0bb16517565ad09e90b4b9e8409973142234db1abcc64789140", + "weight": 1645 + }, + { + "txid": "2fc6afcac5c0e3780ddcbe0c7ebfe50c3d39d2c513bd0eaf9c1c5f3465d95e46", + "weight": 441 + }, + { + "txid": "b2b8ab159193e025a70c06ecc94d6efe828fceb350fbeed0c877c236e052fa54", + "weight": 561 + }, + { + "txid": "8a3b5eec0253e64641e64fefd94a85238ab16264876448f5feef5c9f490dc488", + "weight": 561 + }, + { + "txid": "53364527a2e1a2278d0d968a7efa69994d7139ad663afcd3c56ed203d525918f", + "weight": 739 + }, + { + "txid": "cc74e8b33de6e9397a410048032899b8e0591d6a1d1b912ae8545734df14b393", + "weight": 662 + }, + { + "txid": "3c1b0fd7c5a4fc419420d3438de848ba01c36c5cc8d85b3fcd61c8872ddc17a3", + "weight": 694 + }, + { + "txid": "f97c27dda92c5a559adcbfbe37479b4f4f16cef21a5e5b8930d3fc415dcdbdae", + "weight": 2462 + }, + { + "txid": "68eb5b66465445117a8b28d73486335f7c2c2b1e24971a825f08ce2e4715b1af", + "weight": 1645 + }, + { + "txid": "6666aab9f3321faffd2de436dc52a07995a693fb9d7f1a094041c7332fc0a2de", + "weight": 1374 + }, + { + "txid": "3468ae8f0d7a0d1e28c5ecf97810443e763089cf96d9f90a43e2b00d3c3d6193", + "weight": 566 + }, + { + "txid": "1e24b23430813d2be795dd1ed8a162970a3bf9a5831df3ad0e4776e9add119b5", + "weight": 1645 + }, + { + "txid": "7e8ef69be33d71d0c1739bf5b465a11585542fe3a5d6d688a77a8906e234b253", + "weight": 441 + }, + { + "txid": "886c33b0d1c38451bf5f0fa3fbed7ca065613853b7332d4076c50ec2046917cc", + "weight": 562 + }, + { + "txid": "6ee3a77848df2c5d467c406cc85675a4b361ac97b0f44df35a7338fa3c5c6dd9", + "weight": 2014 + }, + { + "txid": "c25551fcfd2bc7cd88f28337048f6ff5faee7d706712bf840d1709da0f526a5b", + "weight": 609 + }, + { + "txid": "22f13c71cf2fdedd95b12b7a6ec72ffda2ca294e27e04555f8b2fa5c2d280f10", + "weight": 609 + }, + { + "txid": "763287fe5ead7779cc06f4b76cc36bd95c358da98bfd72d7772ed384cc902fa6", + "weight": 609 + }, + { + "txid": "550f37296c685835087c3b3403df6981fc7ca6c0ed8302450c80fdbf1dfe2bfa", + "weight": 609 + }, + { + "txid": "2a4e96b0f786252b8ed17ac81231d51ccd816ce199dbf9fd8103af373b3bf71f", + "weight": 561 + }, + { + "txid": "350bae35e1b947d3fbdf9c3f280bf17c185f06d3dbcc82d69169ab8f074c15bc", + "weight": 609 + }, + { + "txid": "dcef9e9d5bed7cf8708b711477bef796fd2fea760c32de3795224b98d3ce0e56", + "weight": 609 + }, + { + "txid": "edb98eb6634043041bcaedbc69ae681638dee29c6bf9804c515e0929f6085756", + "weight": 1334 + }, + { + "txid": "731455d3215330465cb521b7281dfcaa47cc6abf05c7b9efbf9dda2b3302dd7f", + "weight": 522 + }, + { + "txid": "34cd60accb2202418544a35fb3d3b0376c1c8de951adc7127019f0a37d33828a", + "weight": 522 + }, + { + "txid": "921493178c149d7a8a5f5115a9d22fb7c7b2e9c08a71be40a1eee000a6cc9ebe", + "weight": 522 + }, + { + "txid": "009e7b664467de3283527c5783b4fe873a28bef5246a21400d0196f3ec94a2c6", + "weight": 522 + }, + { + "txid": "2ba5d77ad850527cd94d629b7290e2de1af07625c1e142ee9b15e1cbdcd958f9", + "weight": 565 + }, + { + "txid": "9740f318c36f5f514dcade4c556d736c9292df248f2e5f1b92292373a5a0a9e0", + "weight": 561 + }, + { + "txid": "45e0f0c7b7be84f2452d622c0391f90d4bddfac417b0e41ba5d903fe2adb3148", + "weight": 1856 + }, + { + "txid": "b1664abaacab7ed584c65a5dd9dad01580c08f9cf6b04b9b461429e4cbbf04db", + "weight": 561 + }, + { + "txid": "2238fff47accc8f34fd57a138199da1295067e852efa7d006648cc05b3e69d1e", + "weight": 573 + }, + { + "txid": "558ed5f72ada65a7907019bf94670b1e8d4e6d22ca7a8d454cabb5e3520cc407", + "weight": 755 + }, + { + "txid": "e8cce755b9eb40e037dab31833731927b356636cba1204d4f90ccb336bd7bb81", + "weight": 562 + }, + { + "txid": "a018878e012c8333518333d9936f20006f50f527b528c52122ecc1bb1fd4a943", + "weight": 561 + }, + { + "txid": "04ae830bc38a7886ae9624dc446b6ca644a835d8afb56decd797c1b3798c5391", + "weight": 1115 + }, + { + "txid": "3f614109bc24839fe27978123d2dd9f33c4180d1b03e16d56544ebe7deff688c", + "weight": 7426 + }, + { + "txid": "0fbbe8d7bda1885fcac531f107a6b8cf85236add093395af2b023f1c6aae20df", + "weight": 3671 + }, + { + "txid": "5627e701e91f350c056d030883c9375161053243354be7c282bcf07088b728e5", + "weight": 1383 + }, + { + "txid": "aee38756fa70cc645702c760b9fa6f1b66714f7d469c08cdd8be260e0aaeef77", + "weight": 568 + }, + { + "txid": "3c7d721752654f71e697e67827522636feafb2e42caa8bcac775a260b85f2985", + "weight": 900 + }, + { + "txid": "ecc47cdca1db338e4f6361eadf7b8905ce096101bf446778767e490ad208b76e", + "weight": 24015 + }, + { + "txid": "1df144f619a5eb0ccdb04045081860c2cc86ae501181b147d7c3de6bef0a1046", + "weight": 3865 + }, + { + "txid": "2c0a434260a9dfc76cf5f274ccfa301fd8d3c5cd686534907d76597a85a11459", + "weight": 826 + }, + { + "txid": "82d49164d7c37763d3a271f8189a483bc154c7247bfbed2b0892edb0696ee45f", + "weight": 834 + }, + { + "txid": "278873cc033943ed3c2913ba4a43150cc4813fc295c937b037b2092b299a0b22", + "weight": 752 + }, + { + "txid": "8e63233b02470da33c45a138006a801ede6dbb03662840545ea993afb9276d9e", + "weight": 3070 + }, + { + "txid": "bf893d3090fe3f9614e328264227327cf7ce016cd6f8f21e88f6c0bce6910a44", + "weight": 846 + }, + { + "txid": "715a19d55c34c90c9a0be11d837cff833cc471fc26c013a1236e0e1a004b806c", + "weight": 1032 + }, + { + "txid": "a66f999b8f08e2b8728487ea4bee095835a44d5bbcfce211befbaabd12c391a6", + "weight": 14680 + }, + { + "txid": "4f8d0d29516cc44ed1e780335adbfa7162d745813d6c03b514ef95ec10085f59", + "weight": 616 + }, + { + "txid": "cb373cd384f218827a1863ca72be70c65d5dbaf3032998537af54a330a03f1fd", + "weight": 6086 + }, + { + "txid": "299cde8a50a3c7735d7715fa9cabdb5ee09609346be7801190fb438184ce1eda", + "weight": 926 + }, + { + "txid": "37ea47751dd05f7766f81ef4626d4ccd4798346902548e04a5820efda6dcdd3d", + "weight": 1010 + }, + { + "txid": "e88eaf4166f601c278e4c479eadd98ddd8c20e9ac7caa5d7f69454f8ee15fa5d", + "weight": 3279 + }, + { + "txid": "9dc0a0edbe1fd434c6f6884c13e0961fc9e2ccb139fd87d9394ae043c5dcb88c", + "weight": 561 + }, + { + "txid": "86f9a4ccdca93f03c2c9dad6cfb504585b08b67ac1a826dfaa4d1e8daa7517c0", + "weight": 561 + }, + { + "txid": "736ba3b5a377fbeb15f185c3ea34fce236097ebd15aec9fe65a756962697b1cd", + "weight": 813 + }, + { + "txid": "2135d051130b0a2e26ede68dc204c36e7e244279e57eba595b29706f066e2b66", + "weight": 562 + }, + { + "txid": "814c962ddbb02e2d97d551b1a12c7822f24d009da9b802f4f72bf9afb05b4582", + "weight": 566 + }, + { + "txid": "de1ea13af91fc4cf57b068e706f206b109c7dbfd5c099387d0d70df4b3cb6692", + "weight": 561 + }, + { + "txid": "d91ea2c160e23d04414e3b571c8097f8fff66a312741f8e9e5ab289e6d00f91b", + "weight": 565 + }, + { + "txid": "31171449983e1ba654089bfcde8600e96caaf01a17f520d0e7b94795f2cb6f86", + "weight": 565 + }, + { + "txid": "526087ec690331bc65cb9fd12bb409de37fe4acc03c5d2abd45a46047d0106ac", + "weight": 565 + }, + { + "txid": "01f9626a8d41298dbfd4df47e31d386357d551721ec4e5d2e0c5fee9d9c16bc7", + "weight": 565 + }, + { + "txid": "310baf01277cf635ba1cb81eb7af5f9b545adb43c4c688feff86cb8022e18beb", + "weight": 565 + }, + { + "txid": "5e3f0ad1a548d01f20953902cff1ed0fda869055da93b781cfa3fe939c87e410", + "weight": 1303 + }, + { + "txid": "02de6f22c0d0c13153d3defb250b085f65951623c734276d01bbc00273e6c813", + "weight": 561 + }, + { + "txid": "8d2b753be8018c5232f806251d62a00ae1643edc65442c78c2dab87e424369ee", + "weight": 832 + }, + { + "txid": "251e6a25eefb85f9f094f796a9676751e61aebf6b43c443488f97f6daab077ff", + "weight": 832 + }, + { + "txid": "73085fe928fae02ac011f15723cd0ef5167e70f15c54def5015d47c736777f3f", + "weight": 561 + }, + { + "txid": "d1ac5c9393d0b96b59e10f00d776649ebde75477b77d68d21ee71d05b83ca1b7", + "weight": 561 + }, + { + "txid": "8ceb053700e9da00dc47985330d5d2734603fd719a3b0d565296a8a73964b3da", + "weight": 5548 + }, + { + "txid": "8620c798f90e20d8db2771cb8c758cc66e7974f86bd584336a6b712cec73d974", + "weight": 1349 + }, + { + "txid": "0c5c7187e492501a6e63bb5946bc164c5f6f53b52f99a15293bae51aa64b9b23", + "weight": 569 + }, + { + "txid": "f6d9b5b98ff70831ca3385a85cad5815d5aed9a9b93229513fa67054085123ef", + "weight": 669 + }, + { + "txid": "0f4c94b8a2b84ec09e691dbea7d241cdfda2489cf2c6e4a7614eef59407e76d1", + "weight": 561 + }, + { + "txid": "1a3f655317a3ef4434c91b74758c20f9687ed12fa3c2885f50578da4ba5f9bd4", + "weight": 764 + }, + { + "txid": "4eea7d7f73720fed1fec766ba49233cbeb864294d9769be8b7dec81d8ba4e337", + "weight": 583 + }, + { + "txid": "6c363dbd16690fd2b5676655c229b5b362f2bb3a9cfc0d250b1b267b10214835", + "weight": 706 + }, + { + "txid": "749e825c5e320bf9e9ba85451b2c0c5e7f867dfd386666ba64a478d422b49f21", + "weight": 825 + }, + { + "txid": "26e849d147291f0e6b66dfc9138ef11628e17b8a80ca7c0f1934bad4f2bcdb5a", + "weight": 1032 + }, + { + "txid": "1d216d01c9051e29b2095e60a5361e10e9376576a8a423d3e392fb1badcfba10", + "weight": 437 + }, + { + "txid": "7d9d6ff954953cecbdc69dad4bbee9775a7315c68f0b76b0398cfeaadd3da66f", + "weight": 437 + }, + { + "txid": "2cc4e918f4ee652f5ea22aeae34faf79584503a4d6152ea7088ce24f13cf20fe", + "weight": 437 + }, + { + "txid": "0cd5501c5efb8cc00415f1e734fa89bcfb85a5db6ddcb946da279c7e26d55934", + "weight": 561 + }, + { + "txid": "03909f3132736b3b4def39aef223adbe36da539f5cbd1e4f8cc1ea827790a778", + "weight": 561 + }, + { + "txid": "634b0884abdeace92409719ef7a4efb67f0af04e80090688c41d17deaf0af58c", + "weight": 561 + }, + { + "txid": "aacb88ede6873af8f36b31fd9699e4c9b99d27fc801fed693e7a851537cbf1d0", + "weight": 561 + }, + { + "txid": "59bbee8a1df3add4e0501ca1fdb59d5761855a2662dc66f3e33335b7d65b4e5a", + "weight": 441 + }, + { + "txid": "d20d89cbc44dd4f8f85144b768d4abd1b1363c7ad35efaee1da77dde4a2c8f5a", + "weight": 565 + }, + { + "txid": "c3ea54edad24df67db3cfd117794d7ed74f08875c9e6acb4fb9c74f93a700766", + "weight": 565 + }, + { + "txid": "4a157a2991a8ec478148312cd3c66be5d785390527c7c2fea28cd3d51bde4d6b", + "weight": 565 + }, + { + "txid": "a62745e3799b318c4aa5f494fd4e06fe4fea29f4dc9120119c1f501368502582", + "weight": 565 + }, + { + "txid": "7fd5134e66d741e879ba5d813fac64b4f44c902c14d5aa51615871c3f3fdb8a6", + "weight": 565 + }, + { + "txid": "18b7b838262bdfd4b9304870a10d1f28d3e53fa9a76c0211554092cfef6cc7b7", + "weight": 485 + }, + { + "txid": "83d276f2ec9313b2f949236ca2e80e5dacb21902925766887a9446d8dd1809db", + "weight": 609 + }, + { + "txid": "5d2c01daef06b9238bdd2996c1e22c5b0f869558919f5aca341611775d7786d8", + "weight": 610 + }, + { + "txid": "000907b63b59fb3b581be96993f4e05f5cd5bfc4ef23a504c44a6153a89e07c5", + "weight": 573 + }, + { + "txid": "978fb7e1aa69c7e2750ef7771ebc8f7061cbd09a8b326dcce2c51297c7a35555", + "weight": 1521 + }, + { + "txid": "dde4dab45508e7ec8992783e7dcb5d66a0abb3c7a7ea09bd5e2c291c83b447aa", + "weight": 1792 + }, + { + "txid": "c5d344bd7c5cbe2ec255e353b2c88d1a4dfc8aa43f3fc6d3c60660b4e31b2060", + "weight": 2876 + }, + { + "txid": "bbc565bac017467ec6d1d554caa92bc8268a40de9e6d664847d3daceea51732d", + "weight": 1250 + }, + { + "txid": "54fe5850174827c5354fa670cabec84646ca805a0109614aef1a2f3d0ae3c9d0", + "weight": 2605 + }, + { + "txid": "f8d87430812e23a2d7fdc5429258688313824dba74752761e93134c62c556176", + "weight": 836 + }, + { + "txid": "94746e2352b125b935f86c355f240f568422d5a7ecc5ef0f880b2d2e01d1b144", + "weight": 721 + }, + { + "txid": "081c7b6ef8c5e62138d0e4d0640fa81bb3420e753f0aab9ac763be111403f429", + "weight": 8028 + }, + { + "txid": "a216c06ade9dad56ee19acb2209b77041c865673fa9e532d77b7a0473ff14df3", + "weight": 1255 + }, + { + "txid": "036637fca0ed297172f42ce8965a1821ba4d8f80d1f3ecd1bb0a5bda021d2827", + "weight": 1383 + }, + { + "txid": "61080f9cc7c2140cc3d7f4656a5255ca1f425a20b2ee22707e6fe59b07f79d84", + "weight": 1395 + }, + { + "txid": "99ce5a1a789bb4a22e93d522ca1e8cd3fa67e0b95e4f709d95ef77d0f6e5c2df", + "weight": 2839 + }, + { + "txid": "fde85b479fc01d76001e27f1662c69e0d22f97dbcf41fd0bdedd01be2407c5ff", + "weight": 3437 + }, + { + "txid": "b6331efac5b8d82837f58b604f761a2e7a5c4b16231b065c01b42d98708cacb8", + "weight": 16268 + }, + { + "txid": "eb79487fa637fc21e4f16f499589aed732256b80b41bcd38f9d42bd99eb6010a", + "weight": 548 + }, + { + "txid": "6e7121ec686c48feab143b667aa75e29dc9e4d8d1f6883819c279e828122bc7d", + "weight": 2586 + }, + { + "txid": "0cdb321cc38a41e5deeb5747d3261a651b4c866482b8c697fc86c63ac2209f10", + "weight": 570 + }, + { + "txid": "398c1f5c4b250ca1429c019d98824790952e49d74507dabe80fbfae204662b13", + "weight": 1162 + }, + { + "txid": "45f5b403f29bdd8c9a72ccdb7d494ab1bb80948053cc709de48c4478709f661a", + "weight": 548 + }, + { + "txid": "df60e8888a24b0f90b8092ce90b01c3ae6c1329d30027135304f3cf9fdf96b25", + "weight": 548 + }, + { + "txid": "b6b4b64a583126dd5504364bb9a82c94cbb287ae2e92644276d2278656152a2f", + "weight": 570 + }, + { + "txid": "1f381b5b6bef099194aacf7725ff44dc54bd1969d7d01bc167413129e8f95d2f", + "weight": 548 + }, + { + "txid": "98cea56c631e1f87ec979eb4014bdfbb358780d73d6b9e088a2671ba53e63632", + "weight": 548 + }, + { + "txid": "1decbec18fb61a7cbaa55790cca53bc290a2365c71b5f2669d21b0ae0e13ee35", + "weight": 570 + }, + { + "txid": "591416d6573deffd4cbaacdebed9e55ad6c563ad37345c5f924908b823791038", + "weight": 548 + }, + { + "txid": "3ee8913a59532d7facfadad89ca1fda152cc4858363a5803be03eca99928733d", + "weight": 548 + }, + { + "txid": "401305e234dd1b336692f18fbe3321a7fa5f0a5f242eb97790e6cc773604463e", + "weight": 565 + }, + { + "txid": "1164cd1d09331adb8566740273a0f409b2837f7a3ca8d3a242e2c1f6e5b21e3f", + "weight": 721 + }, + { + "txid": "6cc705a2da987bc8a9dfa01a70859c75b8f798b7c3d88a6ba561450b7955264b", + "weight": 565 + }, + { + "txid": "20817398c985cf27a5d531a2673e435d86ddfc907d6f7c7cbeee84306e7eb94c", + "weight": 570 + }, + { + "txid": "31ff5d8781bdccb11d9ccf4fae2867846b466c2c32c4574b430eb76ef1b1a74e", + "weight": 561 + }, + { + "txid": "e1a94f0ea00130a647ad5581123b5fb1052c241954b1c6c39efd5e6ee2e64355", + "weight": 548 + }, + { + "txid": "6f3b270e144f45d6e0b5787938b72a17d023633a467790568aa258456578935b", + "weight": 570 + }, + { + "txid": "96204ff29e8afb92af71fd11c70bf5efa0f12a10dd5854cbc2836544e69ccd5f", + "weight": 548 + }, + { + "txid": "7b262fc1dfd84fd6fdb757f883c893de5e4a8fd63823f45f542341c847d01b65", + "weight": 548 + }, + { + "txid": "e852666cb12299212de35a0c5645a3d3b035d162c053fdcf6601367dff8d2666", + "weight": 570 + }, + { + "txid": "d110315835b0974336e7f0d2a79e96a317bdf1b8574898f0bfd9af5e89463a6e", + "weight": 442 + }, + { + "txid": "f73772f04cfc4acd0a06930012183278779f812bbec16dcdf555a8b5bee3e876", + "weight": 548 + }, + { + "txid": "04bed3397b883c4cef0f83d64ae780f5704b0f30baf050bdc415c25d7453a678", + "weight": 548 + }, + { + "txid": "0d0f4ede151a99e6fba4ca99a0a0aa89b7126e96ce500d93945058c5f558af7d", + "weight": 548 + }, + { + "txid": "bcbecae7227224dfb525fb05fd3aabfb38c7980f357d876ee6ae44ed12d2f17d", + "weight": 570 + }, + { + "txid": "5bd96255dd5b7f5d1a5bf28e9e68f473209800c71757b2a3ec3d745fbf96db7e", + "weight": 548 + }, + { + "txid": "ad685e8287793d86452fd66685d3149b6dd8bd7408a3976db64da6a453324a8c", + "weight": 548 + }, + { + "txid": "e8f7eb2d77cf01170c50f6b135d30b48245062bdc2d84c9f18ecf0b98a872b8f", + "weight": 548 + }, + { + "txid": "e12912ed4b8bbb69583b1fa87df862440e7e2b9ac39c2b137a5f8d25b2953994", + "weight": 548 + }, + { + "txid": "8952e3d80d3dd239b80773d08c4f61f51d706abca2199028f9f46bbdcf5a4c95", + "weight": 570 + }, + { + "txid": "070d06d528547d70d8185ce2fe33c9773e746bc9211e9d41660f4653412c8d9a", + "weight": 548 + }, + { + "txid": "e11fac2b04e0617a9ae25d39ded7dde5af76f4c264e6f2140e01dd7d6d8679ab", + "weight": 548 + }, + { + "txid": "0fc83e2ea223f96040da50bb296ca0bb7043189d661453c4803ad772605eeeab", + "weight": 570 + }, + { + "txid": "8b683d3a5fff739190b2cd06f6bab6928559b89dd1b4406e87470f011661eaac", + "weight": 570 + }, + { + "txid": "809b79268e7e7a820031a64709e79107cd38a70b11f9da9aa4b7ea1d8fd96dad", + "weight": 548 + }, + { + "txid": "1b48b2c1592d3d7f81691f967d7e447134750024ff145d8e44e1a705926165b3", + "weight": 548 + }, + { + "txid": "fc3e3af67e6bab8032895a2d59b12bca264f45e59503e1319520cb71bb8faab3", + "weight": 646 + }, + { + "txid": "856e978203ca52a626b7b00dbbc3128a30104767e24216876d70daef4d9a63b5", + "weight": 548 + }, + { + "txid": "505582998e07edea1052e9b739772c28d73c1ce3dfa4084f0b73342889c441bd", + "weight": 522 + }, + { + "txid": "6eab19d1944d4c6ff2ada1519b2dc0e342872436286c0f82e93c637ecd7527d0", + "weight": 522 + }, + { + "txid": "e09954f3eb3463e0509b7f7f9b78750220a993b29aec0065c8b41992bd35b9d2", + "weight": 570 + }, + { + "txid": "e5ed3ab5db1354abe7b85bbcdbc1b04b16f11cf7ce3158571ed1a5f71d8075d9", + "weight": 522 + }, + { + "txid": "738b4d4aed7b6867522327d858ddcbaf1b74a1533a50c1b7498841563cc22fe1", + "weight": 548 + }, + { + "txid": "4b8cb740bd448cb29df582c635599b13ec14cda8f48e1b1a62930b050c297de1", + "weight": 548 + }, + { + "txid": "f4b281c0b547c992323aef037dc7d70d2f77df602a704c26ed2831f99d57d0e1", + "weight": 548 + }, + { + "txid": "a4d8530789efb8bd391615192eb409da93639344cf27712f3daea135b7bd8ef3", + "weight": 705 + }, + { + "txid": "8816e6ea65d35be43659a9f482a30a20a4f43096c6967bcbfb3083fbc8acaabd", + "weight": 438 + }, + { + "txid": "5d58dff0295875fd25b3513593cf381a43280f5ca1ff0ba2268aab10254803b6", + "weight": 562 + }, + { + "txid": "dad98a335ec42e78fcec9a33d2a320b91bc17adece3a9d33f6656c80224b2fd6", + "weight": 1201 + }, + { + "txid": "89f7c346981be4b1433863885b797a9825e7e134e9ebeac5008fb5a2672e77e1", + "weight": 437 + }, + { + "txid": "e115433342c6b232616eb1f8ffd29c1a26989c8a1c605c1e5518ee06c06a6d4f", + "weight": 710 + }, + { + "txid": "49e00187c33fdd54f824ad617c9130c68da1fb626eaac9eb03fbbcb579d8b485", + "weight": 662 + }, + { + "txid": "cd20d1aace5242b669ed7af8dc6ce52b1eca83c4ca4f0a62dd51458f2bf5c0d9", + "weight": 687 + }, + { + "txid": "03d132751f94a3ecec8b12176482acb4d6e02867f02b2e0a3c610101e6415726", + "weight": 1072 + }, + { + "txid": "65a6fd00bccabf5aaee94de747a98a4e445d6f380c6b23668c1de5759586d1fd", + "weight": 437 + }, + { + "txid": "a830dad94ff278fa67dd4404485b09e9256b72463fc7fec56e40f68b94f4d0f6", + "weight": 2298 + }, + { + "txid": "4b12e756b7a937ad0ece7f3c1fc84287f1637a070489dd1b5237daa1f289b37f", + "weight": 832 + }, + { + "txid": "b56e4607c55fa7ac8c58cdce4e998fc771d9f11b816522802583d352da444793", + "weight": 1809 + }, + { + "txid": "014cf0330d8b36bbc398db3a639f3d500fba94768dcec974bc6dfecbfb3279cb", + "weight": 788 + }, + { + "txid": "64331b05c252c8dc125318c9a9cda9e3a17e182b7f34199fdce247b5944415ad", + "weight": 1377 + }, + { + "txid": "c3fbcbe63596f003eaf0ceb2b8e02c7bb81e9b61646a91379217ea6054d40ae5", + "weight": 1995 + }, + { + "txid": "bf8ea042e91e668eb225dbc7e551549e1581449fbc226f4a279df6296247e441", + "weight": 1995 + }, + { + "txid": "9b68404cbfcd753e66e04f6bcea89a6bd730eaff8d7a1ff7c3d1b0374f3dbe10", + "weight": 1995 + }, + { + "txid": "4b8cbc1cc674c46d65fe5d5dff38d0302013f10a22809e72274fc9b76e8a5458", + "weight": 760 + }, + { + "txid": "d2059a1ffb494a098463d9b4be8bb23f050305ad79b8ea06e1c22973ca49799d", + "weight": 826 + }, + { + "txid": "b08c86cca7fcba9b6ccbb5c6f437912cb6ae29c61f984d8238c7083eb5c17722", + "weight": 688 + }, + { + "txid": "f97019ba42a15b8839d4ccdf174148ae261dcba920fdb264841d3ac25ca10478", + "weight": 687 + }, + { + "txid": "3e07e65ed762bb29b92e1c551c3f0bfb591aec59b977b01afe8f673aac84c6fb", + "weight": 687 + }, + { + "txid": "f71b3a69798e3c68e47edec23b86e85c026c24b377b2029b512290c6e5d6a3d0", + "weight": 1274 + }, + { + "txid": "01b5e3bd28397465e1cfc3a98d70908451c20ba33f7675bdf6ba76d51ff1ee44", + "weight": 574 + }, + { + "txid": "1d7a1c6028297d31d1e06630faf9d452e67d41ea83ba6f2b5e614217fe5e20b4", + "weight": 2064 + }, + { + "txid": "f73510aad1e88680cffb8358ec046fb37d06ba7a5a834b19b2a4ea1c4f122cb5", + "weight": 2652 + }, + { + "txid": "864f11c01e36e7ee747e38304e1e3984e338d5ecfabf23023d85cd44961a8c61", + "weight": 3104 + }, + { + "txid": "e2d81b07f3e55b3143f109c8a3502c0db03bdcda00b2f91d379321432c278cc0", + "weight": 16266 + }, + { + "txid": "66ff17d690347742f0a452242980dc3af94c346e513abd06e12ca4ac36f5581f", + "weight": 714 + }, + { + "txid": "bd079d29315cbd890ee221fd0511d40b6fa11e84f62a960a5eddc301d7c81a05", + "weight": 3700 + }, + { + "txid": "c9befa48d8e2193617f1c50175ab629772008625fe7ad349f7bf20f3fe0aaaa0", + "weight": 609 + }, + { + "txid": "94506ec1fc85f020555d5394dd9d8108d0a56a02e4ee08623dc9332e616606fd", + "weight": 4292 + }, + { + "txid": "695a08bf533d5b2c4f38e89ee94c997ad30c557cfe061482891c4e58d5bd93b3", + "weight": 3704 + }, + { + "txid": "6b633348ea897097e82a8e7ac5819350daffa58596d38ea02f040228761f33cc", + "weight": 3704 + }, + { + "txid": "076c9833ac503b1d3cb07202156bbd8935382458eb0c95130940aa2ed9d2692c", + "weight": 657 + }, + { + "txid": "3b9e26d4733269a60a6785f1a858c0e9e97c1e9b1c867b47a23623acb2aaec52", + "weight": 706 + }, + { + "txid": "99875b0570bfe80d7eef35d8fe6a42a832ebe6b953ca1d322aa58444be8361aa", + "weight": 4296 + }, + { + "txid": "1c8614fd377942a2ef10a0fa2a51c571ac4ad7cef05bdf69f9f7187562f44c93", + "weight": 4300 + }, + { + "txid": "2de86a1fb0b07f0e1b164d7257ddc77bec7f3c68563fcd35397ce21918a2a74b", + "weight": 900 + }, + { + "txid": "c5d368f33adafea14ac401da80ec4ff2ab9a9816e8ba8abb46a12f3fe7382130", + "weight": 3712 + }, + { + "txid": "cb36e1d4c3b6335366d1f8a160979844f6e35e87d95a6a7a4236470d3a9d5531", + "weight": 1018 + }, + { + "txid": "c8d4f82a275427ca97655c77049da9a34e87adc25846a2c21e7500ca93a6ed84", + "weight": 2536 + }, + { + "txid": "d8a3d3bde469724f057a62157c2acb4fcf4744c7494cbc9d73dfdc7b55f53095", + "weight": 2224 + }, + { + "txid": "856fd65a42ca577e009806dd4080781c2be5e9945b74de41ea4113a0acd6d538", + "weight": 552 + }, + { + "txid": "0cd89d2659d2d6ca842b4000900c59a08d0d4b2f89fe1aefea604736e7c40941", + "weight": 552 + }, + { + "txid": "3d22e18e6966f0b3790845a68e675309f07902ff869758c74353c142464e9441", + "weight": 552 + }, + { + "txid": "485576e067cf4c734b5dc3ec08ef7b169da13459e8b7ebf958b1b6822138a285", + "weight": 552 + }, + { + "txid": "a0002c20f1b4dc8df05cfdcf89bda23f9bbff6d44dd86adb34f3e502b6d590aa", + "weight": 552 + }, + { + "txid": "24b88df061be7d1f9d9b86048b112cf1901290f3435fd42d5efd8fef888690e4", + "weight": 552 + }, + { + "txid": "0de6a295a1062f0ed7b3168e36763c12724307452d36faad373ddb11cddaeee4", + "weight": 552 + }, + { + "txid": "91deea6285cb6b5614d4ab6a146dae89892c4876d3d40e3b6b1151759eb949ea", + "weight": 552 + }, + { + "txid": "15c7c16f1ef11a5bc8fd3fd21b4e9dceee4314fc639218bb4d1746d50abc65f5", + "weight": 552 + }, + { + "txid": "f47db26258cd7ccfa5344c788200db264ade28e2b8f027087d326ce43c412e9e", + "weight": 561 + }, + { + "txid": "27aa493ace3139e206f91f18cf1dee38c867d72ec2219779192f83cf7a325fd0", + "weight": 1466 + }, + { + "txid": "eb74b113c91ee036607d7023035be6e480ea6f9eb700059255c8771ddc35100e", + "weight": 1016 + }, + { + "txid": "334aeaf2a3bcfad0d4cb8bdeb39c2005604fed6152d8e49b6b93ccd4d3301ee3", + "weight": 653 + }, + { + "txid": "3dfa02748a709e0ea4163a9edc5a3a50dc06cf56636944504b9162e522c0a555", + "weight": 657 + }, + { + "txid": "dc78ea0f453bbc30c502f4fe8fd14c031987d5de4586580c620390b1c8231c2b", + "weight": 26091 + }, + { + "txid": "890025de81e0fcdffa6382164e8bcbf16b5b53f1b9360bae91de639b4c53f41c", + "weight": 437 + }, + { + "txid": "3761b1f62d28aea02c6fe9884bbdc9199f5d551fba9e340dba22e8f8affbade1", + "weight": 1488 + }, + { + "txid": "37fd1509cabffbc5cdff4c04bbae3c7847d006693885d5a478d7cdd1e958d125", + "weight": 892 + }, + { + "txid": "f78007424dd75baf611d7afba5bd15ec4413dd57c3eb9b206310ffb1e73a6f18", + "weight": 834 + }, + { + "txid": "81d33aa4a0347b8e3462d2f5594d9e6f9da73a04e28ee5e406584e362e614f23", + "weight": 574 + }, + { + "txid": "a4b3620c6faa90a22719849160f13ec54930bd0182134ca82264348bade2512c", + "weight": 565 + }, + { + "txid": "49f0061cb116a42515063c197a25a117c86f6f8613b9986e2f01bd035a1a7029", + "weight": 1162 + }, + { + "txid": "e91215885277973c9ca07b3973198e243e66ad33c000808cf77e02fd732f5f08", + "weight": 522 + }, + { + "txid": "dc9fb65a5a24a5e70b1bb82d9ab884ef56699abb3d467707c2c6111347d5da08", + "weight": 565 + }, + { + "txid": "42c66faedd4c2e60f2c5c120ca348f66c45d8bc6f5c30ba200d0c2bab681a34b", + "weight": 928 + }, + { + "txid": "cc5e3f383c2822ac5f1bd755e5753e90c6b2c4dc05a0da5b58df8fa7602a9a54", + "weight": 561 + }, + { + "txid": "4f66d02254195f20011b68671d311b011a198df091d8031d162a65c2f813dc59", + "weight": 522 + }, + { + "txid": "309d3ac06b555208b9ecb6e1cb4fd54f923fee72d67b204ba1bc6bb7dd6c88bc", + "weight": 616 + }, + { + "txid": "9c0088d2d98e83db2d4d7f0b0fcc5f0b1a8d7d3a608ea7c2520a09c6fdbbc45b", + "weight": 606 + }, + { + "txid": "0a4803e3d1d2081c8783df169d2e27a7b1a75c6d246422647be1b533dab3c4eb", + "weight": 788 + }, + { + "txid": "431e8883dfcb5ca7f87d66b2f4ba2848b619c0dccb2248687250060902417b63", + "weight": 1995 + }, + { + "txid": "0701ba8dbfaea542c9272185b71e2db4de517e41f6ae63b1b5ce10e689afe17b", + "weight": 561 + }, + { + "txid": "79ad87a779adf8ab5bec543e284783f80642032b3101d681ec42698fd48fec8a", + "weight": 561 + }, + { + "txid": "f362475c168d319c91e7325bb2cb1b88a1c3266a19cba0b453900bdf29da1295", + "weight": 561 + }, + { + "txid": "c4fb3a765ec15d408378d9dbaa808206eaed97e0b534ab6ee2d92cce583510b8", + "weight": 522 + }, + { + "txid": "2e4e8753660b4e99c6995ddaee1ae4159998f9f71935e36cbcbf13395b16798d", + "weight": 33471 + }, + { + "txid": "6f2bb26a4ebb0c3a912d7533cd37672df0d8b6ddb02aa7efaa444a290a1a613c", + "weight": 437 + }, + { + "txid": "25e4818059acd4b2e502fbae2de0754b38f986d1cb244809da596b5bafaf44a6", + "weight": 1421 + }, + { + "txid": "23ab96bdec579be9ed6588f3710d5b69c7df8d723facbe0d191f45f225a2fc0c", + "weight": 892 + }, + { + "txid": "f003e7b792574f218476db5a7ce672abd2b1de67bc5ae96204d06caf43c1b95a", + "weight": 666 + }, + { + "txid": "8555e3284a46cc5e691ac66cef8071138f6d8b8c6a5f8a79bf1b2fcf077ce405", + "weight": 662 + }, + { + "txid": "5bbe0ed54d74c760ddf18b771f406af7971310475e472c70d5b6f196c737446e", + "weight": 561 + }, + { + "txid": "91b1c1f33dfb54a730d4cbb768044006aed6fa96b26f88f039d31736df1e0af7", + "weight": 530 + }, + { + "txid": "7b9cfe60f5bd97f77a351a78697dbe538f8138d7b0bd58c8187eefae25106e92", + "weight": 981 + }, + { + "txid": "187a40e60b835ad9c67d0f48726f4ea3426a8ddedf497f76f3c016a04699079b", + "weight": 437 + }, + { + "txid": "fece33ba798f6a559cbd4a1d20f5bff8f08d818e8f9ca729f68857c090cbb88f", + "weight": 450 + }, + { + "txid": "cc372df07be4ea68033f67c427d2c41dab8cbe3fe2888916fa344f25b1203165", + "weight": 674 + }, + { + "txid": "02751cf5bbc6982969c814d1579b32e889f452a337c155fbda05fb913debc87d", + "weight": 5917 + }, + { + "txid": "1832e347a54f36da3e78e4f17763ce9be5e352d268675d114d5185f3f11ead3b", + "weight": 2082 + }, + { + "txid": "3d15905fd5c4fcd766a87e7d42b353a0b753f485129126b032174a5269dd8dd6", + "weight": 832 + }, + { + "txid": "a2b005cbbe153fd21517727c923319612d99a64f0ee02961dfa5c6da77ca1ae7", + "weight": 1899 + }, + { + "txid": "213fd267c985296019bcccaf8be48d17e01686c4a342d0b06a911d5b2cb16825", + "weight": 1900 + }, + { + "txid": "64ae82d2681a92383bd02b8d97123ea21234b767101ce25d3d71b3680099b238", + "weight": 1901 + }, + { + "txid": "0d59c503f9ef466d6167abed25e6578c084770a5cc5aba593825d86efe6c7dec", + "weight": 1900 + }, + { + "txid": "3dc6b6c3c8520074f70e05f35d8491b4236381f24d8a23d82dac00e0e49c085c", + "weight": 585 + }, + { + "txid": "8a4029f57bc5286fdf41850236b36fd6bcbacf6f49bdf2cb42d6b65f50479987", + "weight": 888 + }, + { + "txid": "7d54882760fb3347305b0e6ac478bb79de6590e577c107e106b891a65e0c4c77", + "weight": 756 + }, + { + "txid": "97cb31ea818ecd09ba09b8541a3e3f09e84e0e920492da63294969d3aa599c72", + "weight": 3018 + }, + { + "txid": "795f3f943ede06823166cdea073e6812f8711b65589a8dc37a112fc2581721ac", + "weight": 34240 + }, + { + "txid": "d54ef609bf2558bc8152c8591cc391825ec0686cdabc9e7c30e5c1d9167b37b1", + "weight": 486 + }, + { + "txid": "54707c8b507af1100ad4265b71af2d30229aebbe4ee7a82e804ee096db41c63c", + "weight": 437 + }, + { + "txid": "8fcb87233243fb85713528307f93788bba0264f5936c61fb4928bd9642acba65", + "weight": 616 + }, + { + "txid": "1d9fb6df11ea353193fadfd7483ed54293c70f231be4e1cd320d43cec3df281f", + "weight": 616 + }, + { + "txid": "63230d8d49948a39a0c96b0292f083461312088f88ed64fc31429bcfdadad193", + "weight": 616 + }, + { + "txid": "47ce4d0527345cc5bdf8c3864c18acdc6a57a3fb111d7221375eaf27f7fea5d6", + "weight": 524 + }, + { + "txid": "508ae1640f1b7144ad189c9c781c4f5237ae6741191452576a31df1f307eca83", + "weight": 609 + }, + { + "txid": "ea971d302d76e6b9f8ae3cd5845f90a98c14c1e24f6c097c37c46b0ee0633ad4", + "weight": 610 + }, + { + "txid": "fee8034c04e1e1d557296de7f168150b8c568f608de330a8dcbba4d61bb3cc9f", + "weight": 880 + }, + { + "txid": "00d32fe21ecd8f71bf84fa90174ae53ee8c057a43aecea0a4aae8694c29256cd", + "weight": 7654 + }, + { + "txid": "058bc6cc5f81ce2fcd25b7f47e17e09a042a499542c05967acd992126b04fa36", + "weight": 1928 + }, + { + "txid": "e9cae5d4e0746e06684404666806195639b9e7347ee75819e092bb50f5969223", + "weight": 36580 + }, + { + "txid": "ef450ebc3b1b04415a7caed65873cef46273035659c3bc1591996bbf5f9b7976", + "weight": 36806 + }, + { + "txid": "4bc920a5bafc42d2a2aed1e5252c07ef85477ec8d1bb098e39774d1a21803433", + "weight": 437 + }, + { + "txid": "fbd24ba6a238828c9d4cd292fbcd3379fa7a98306ccc2910fbdb1068cac6966d", + "weight": 529 + }, + { + "txid": "c5fe5723967d3a30411ae7a8491d553d25d54603a98eb28887e4ea170b534234", + "weight": 36933 + }, + { + "txid": "5fb4b9c8c334cf6fa8bd1f088d40a5fb2b85a0543f7cace4bb035fc9fa7d4537", + "weight": 437 + }, + { + "txid": "50d1ffec8481a95bf34feb5150791a844429a83e69a947a159708e823da247c5", + "weight": 441 + }, + { + "txid": "2d8160b7e83ce3d8e1451a4f5b1ab35a8c0bc3fe4c564145062c6a9da083247b", + "weight": 561 + }, + { + "txid": "041fa97fbfe4fa3377acc2b6c3e2cd9bd188171cdcd10dc73bb4c6bcd35dff78", + "weight": 1103 + }, + { + "txid": "496b188b946a6406564a73c07abbafb16a2cb5d2fe7ac3faa73fd4db9d6de60d", + "weight": 449 + }, + { + "txid": "472ed68af50bf1927d536d96533fb033bdf99e6716d5b3ab7705eeafbf5d8143", + "weight": 687 + }, + { + "txid": "84cb43dcb60ccaa426ed028165cd455f08bc418e2e2e5dc974d2d148f657f758", + "weight": 565 + }, + { + "txid": "b76f880390efc8d2d0c43ff6851cbbe8907fae584c8a5d7fb24f319c053db095", + "weight": 1104 + }, + { + "txid": "708748c111b40daba63a8533575d2a9b9ab4d4377c85141e8635cf7b5ccc8eab", + "weight": 566 + }, + { + "txid": "0d5b8efaf5adb33944ffbee1d92070048f2df5d715dfc5cd3e8835ef886c5d08", + "weight": 562 + }, + { + "txid": "6b3337710a9ba2b2fa1f85b882abb0857f0ae88cb5d483b331d77f10746c6716", + "weight": 566 + }, + { + "txid": "aa086d4dbca77ca6d3f3c6fd9cf0bd5ebfc9af77aa99c9a3aed61484a8f15e10", + "weight": 561 + }, + { + "txid": "e1f8d495f5431a10f549937289e032b3b44c69a7df5201ecfcf7c25d8a4c8b49", + "weight": 561 + }, + { + "txid": "a2a0efe8555bfcc3d77a7fdc7917e3c300a0c60edb5c9b9d18f0bedc2d7d5d8b", + "weight": 566 + }, + { + "txid": "a88ecfcabe797f14063238cf0d2df86aa71573f4aa181a4d6b184b830933e8cc", + "weight": 566 + }, + { + "txid": "22d1ecbd46a0dd00f792f55277e890784f569680a7c8856e038f764e72642a07", + "weight": 698 + }, + { + "txid": "7995534d0c07840f87a6704c4ec632b6421020fe4a09705d3f1ca4424fb9e10a", + "weight": 561 + }, + { + "txid": "84fa738a6e8bfe1e390967f5639340cc7435dbfac1b2fcbd2c02ad02a081617c", + "weight": 1255 + }, + { + "txid": "416ba2b4a961829f2fac92eb21384826141c4696820a8519dee1e431f60e8913", + "weight": 615 + }, + { + "txid": "67ffcec8943baee3cda05e33cb270de2092b402fbfb10930a4ae845360bb6082", + "weight": 561 + }, + { + "txid": "f721981260d5a08db71fc78b69170ee6ebad5ca0b196b8ddb50595f9f4125317", + "weight": 561 + }, + { + "txid": "e3081866e233e212495f004cd85cf46fa7a643d0633eb8f5f3de360ec1259125", + "weight": 615 + }, + { + "txid": "62853d2494daf1543152ef0beba80330fb91ff9dd0e67504009ad75128619144", + "weight": 616 + }, + { + "txid": "762f1af32a28b353eb1ed7da9ef69c01369fb1497d0f6f649ea2f44c5d8a3248", + "weight": 693 + }, + { + "txid": "da5198b6ea868cc895cf2babfde331a09cae7d7ac44df43a82abb1b0946154fb", + "weight": 616 + }, + { + "txid": "41ab1d55ca86eaba058c896d952bbddc62aae5611bb7132ef0a3884887063955", + "weight": 606 + }, + { + "txid": "fbed2c18ae5a832d93c09608afd30309ef137061da5460208d5e59bb41aaf157", + "weight": 561 + }, + { + "txid": "2cd7eaabfbcaec9f5fd348ed97a56ea41c7d3bf8ba8622305b41cbaed6ae5d5c", + "weight": 613 + }, + { + "txid": "ee0f7e7060ab4fa009f78140d63016e5f836395b1b7fa1db51ad177d7f1e7165", + "weight": 616 + }, + { + "txid": "429a36f321c4ac12f0afdf948cd26f07fefba966b011500ce294310aee11056a", + "weight": 615 + }, + { + "txid": "cdff49b8bd21182e3b8d134600a3de19a9f6907f123ca1bffc8e6e7b007b8d73", + "weight": 573 + }, + { + "txid": "bcf79c553ff1770a3c6dd31b3628ca993b028cba5a4e60e7b1acc09c68da347b", + "weight": 606 + }, + { + "txid": "2bae66e6076190f622bd670a5c5fdef873d9c2b2215563ab09f1f144127874c7", + "weight": 573 + }, + { + "txid": "04af9962bc19247382f6ea82ee1f58517b045858627be818f8ce423fc9496be9", + "weight": 561 + }, + { + "txid": "a94be5e06ca36a59b0586ca5b60e4c1493ec9cb0787a04f3e35cb5a8575757eb", + "weight": 613 + }, + { + "txid": "2801e8df6a1f027e14fcc9edb2dff5570b8b50b70a2de5cd924faec49a30d421", + "weight": 673 + }, + { + "txid": "b03857979fe2df53f6cacbb1d3723f87a68b89e2480b405525253ed4432ad722", + "weight": 1299 + }, + { + "txid": "f3caf7673221adaf4033f93b84f7e9116fce8742e69fdb6cf92d878f5ac41621", + "weight": 658 + }, + { + "txid": "7f7c12719146e4ccbe36a8e276852579765f1e7fbb92f67b95b14580e0d0183d", + "weight": 1102 + }, + { + "txid": "e9267d362df835fc04d6d4892c55a79335e6d93cb0312926045b744230a05054", + "weight": 561 + }, + { + "txid": "f071b66f9190704f338fab565bc96f30dce61230cdd2556aa46c91875731dc95", + "weight": 562 + }, + { + "txid": "4fd29322f139b19f811445cbee63bc0fd2481690682a9cb3d785eaa00dd5df92", + "weight": 534 + }, + { + "txid": "7c74d24a92f6405803eb29856be8ecd1014e5bdc1ca9695944e7076121ab891d", + "weight": 442 + }, + { + "txid": "afe749943915ceda3355379cfcd89b59b95e846be6dfb9965baffd867f5d8023", + "weight": 1356 + }, + { + "txid": "a23aae226b81b167c08a483c49c8610fecc2ff7984e9aeaa3f91aa3309226bd9", + "weight": 561 + }, + { + "txid": "6962bd60905c84cb62305b82856b85fdfd70b7f8f770114e5a7bc59087c4d2b7", + "weight": 565 + }, + { + "txid": "d32445a7c92202902f5ae5c99bd83e53b207f9a9483c043c140863f5e0d86472", + "weight": 581 + }, + { + "txid": "3cefe9adc8a50ba9bf69183ec4ba9c05a3989809b69ede46dcbac65c9c5eaa02", + "weight": 437 + }, + { + "txid": "b9935385c4359dc2883d5b5846eaaa2a725949819614ec0101a09a8fc1e46f8d", + "weight": 449 + }, + { + "txid": "7059a5a3c27b8e4427f530e2eb854fb40d7f13e19116e92fa8c4927d919d5c47", + "weight": 437 + }, + { + "txid": "a393544818185b21a68e381fdf7cdd155d3dc87e092447ab70d29eb20e7bb56f", + "weight": 1110 + }, + { + "txid": "ae4bb428e7f268cb4876b1429cea26ac654af5478cbce501bb6f6a750d0e1301", + "weight": 892 + }, + { + "txid": "bb81aae72d0854332d4d27a163750947124d1cb9316e5f5370071ec320c8e3fc", + "weight": 896 + }, + { + "txid": "67c032054eed2091d2190b8858fb953f930513fa2dd4ad018707a225b9d3353e", + "weight": 892 + }, + { + "txid": "a25c63afc58b9789c7fc41efe3fdb3b36dcf7873acbfcb5aaef13c63d478aba9", + "weight": 1794 + }, + { + "txid": "5060bfb2393e9835a25d2bfb3a6ebbc192bb79041c3fa17eea00720864a79612", + "weight": 768 + }, + { + "txid": "619be8fc800f0896b7a25e36c68d5ca78b1215e49e3b53c0e56b2790b2596ebd", + "weight": 616 + }, + { + "txid": "18ce969251ad4b59d0fed12fc9c195c2d35173cfdeb8faf8a6e847d769345dbd", + "weight": 896 + }, + { + "txid": "aa1a4386999e5a17fc03015750b4c24cf0aa49aee4147a8f5f85f730a1c85329", + "weight": 561 + }, + { + "txid": "cda859c835dcbb47a065fd61b707d101b9f7fcff3d85513af8613677b5788cf4", + "weight": 562 + }, + { + "txid": "b2f045da699900482141f06b12f19d4359764ec9473b23ccc0a10d948ea99224", + "weight": 566 + }, + { + "txid": "87f523e417bad6d151a962a70291311fb6d742c42d19daf98f7a357baaa32be8", + "weight": 565 + }, + { + "txid": "092bdbdcd2af6c80d983565a09f0e5c584ddcac95644f6840cd678ca4c7b8b40", + "weight": 900 + }, + { + "txid": "692c1daa0749b1b72b59424bde4ee1224486e241996e19103c28fbb81ff7cc89", + "weight": 896 + }, + { + "txid": "3b4bf7472abbf74666ddac151872325c7f7bc4c4254c5116ab1d1881b1ef2448", + "weight": 845 + }, + { + "txid": "3ee75cc642b3384c01f3b5c8ea2954dec066eb0fd167c4d0a2f8663aec37f078", + "weight": 892 + }, + { + "txid": "9d20b9ee92dcda0d6d49c47ee53def83531e6819f98de91b858de66a0f80aebf", + "weight": 900 + }, + { + "txid": "f9f12381fc751a59966c1e590526def4f9b91e4d55ec821daaac7385b4f50b97", + "weight": 1620 + }, + { + "txid": "e53ec6828c4122d9f966d496b75ced906cb9b6b1c2e6af7d949315032058b2fb", + "weight": 1108 + }, + { + "txid": "3e9d295cee6f2c59cae667607bb8efc5ec2a444bdfe62cf53df3e572d8bf922b", + "weight": 1468 + }, + { + "txid": "cb28b2b43889c5a8f467414a5c1b30376135a794d35521bb6c0a0c73721a1a16", + "weight": 573 + }, + { + "txid": "6071071c5f561acf2d72dbdd67ab74315a903add8911a7bb8d5ae04a2f9b359a", + "weight": 2242 + }, + { + "txid": "0239841f96eeabd5d74d4e71023059b26778b2a253ca445c676b85e0ce133a26", + "weight": 570 + }, + { + "txid": "f6eed99f25e4fb1cb649a6c5d763c317f1801287433cf3c3468233ad27c59147", + "weight": 570 + }, + { + "txid": "5ae0ab33b3275624b3ae816787c07ebbc5cca7f3b68d908e6d75949946d24958", + "weight": 570 + }, + { + "txid": "6b2c4f5eea50f6bf1bdf2881080b09b735f9ec168f41dedbd97a928ac39c525a", + "weight": 1155 + }, + { + "txid": "47d58cf9f029372b69f034a0766d51e18703b7b6830054f22d627941d44f2460", + "weight": 570 + }, + { + "txid": "e8bab7d1ae599f66c45b148324d44472f767d9d3b433eab33188667638d4bc6a", + "weight": 570 + }, + { + "txid": "87795305b9573505e9ed5a7eb24d8a8e8dffd9b54df3708b6fa2ad35b3f9096b", + "weight": 884 + }, + { + "txid": "bcfd4004ef9764915c8338c329b97da967169b8dc69bcb8321d16764645f7585", + "weight": 570 + }, + { + "txid": "e849582e4083f706de71fa859d27f918cdaba4fddc4ce67a1ef5a301e56bb987", + "weight": 570 + }, + { + "txid": "b245855c3547cb8aa66297bb1c30124fe63c1116875ffd4de42b4ddd0723e8ab", + "weight": 570 + }, + { + "txid": "50f29cd840a26ca11760ce0ef64054afe064d25580cabf09c172437dbd609ce6", + "weight": 562 + }, + { + "txid": "f16df073dac27a97a71bb7b9f883c522aaf20dfc4b1bd95f23565394a50b3cef", + "weight": 570 + }, + { + "txid": "9d35d5c18ff03c07b090e6804428a4f96cd5ddb905e4a2af407c5ebc75bee7e6", + "weight": 2191 + }, + { + "txid": "6b7a3cb133733babd2c115436967a037a707ac06d7d685b606840c9171a911f6", + "weight": 450 + }, + { + "txid": "6eed15c0403223d740e2196b6bf43e7f7106d44d2218828c479985e1e743cf7e", + "weight": 836 + }, + { + "txid": "a52a52ca9ca69359f56252748a73392b1a647aca4ef996d98040a42a9e66413d", + "weight": 832 + }, + { + "txid": "c4975459e5efaab792a7b04966b5105c9a4f0c9e0c0ec5eaadc5ab2a711def7d", + "weight": 1104 + }, + { + "txid": "bf18b4b067e6787f9e90d33fab012d542f7698d581f1214a0dfb81a058a89889", + "weight": 1388 + }, + { + "txid": "062ff09709a75251354c888f597d60cfeffb7e13b141c4f8df31858708522c47", + "weight": 1660 + }, + { + "txid": "be83a6908138f7aed984d3b1a205a4f115c05ef5e453b618389c8eafa42bce74", + "weight": 709 + }, + { + "txid": "b22fdf4653eee57b0b58d8fd332ba2902bfe103486404f9146948a8c6c3adc8a", + "weight": 709 + }, + { + "txid": "b9a95c6e8c0fb5dc367d44d36fb76f89cfdf0a314b55f9a2ee8cc2e837cdab02", + "weight": 449 + }, + { + "txid": "a374f9a0e8925e91e40b270bbb1ccb3be2cc88d606bb5dc869b5568b970e0181", + "weight": 450 + }, + { + "txid": "020ac9f9b0418937d0942fb8a96411a85b8b2eea9d826c11582e8610e5d274b6", + "weight": 450 + }, + { + "txid": "b1699b44c8eaf7be054b562b34db92e9af5ac2e73e7f4b6ec28ace6dbf9c232c", + "weight": 561 + }, + { + "txid": "9cfefdb628e60daebb8d7787a1afe9888212c26b42355fecc56f95a06138a668", + "weight": 442 + }, + { + "txid": "459593b780dc06ab5d120d0042ce726350cc83aca4a0ef0753572c116742f8f6", + "weight": 441 + }, + { + "txid": "9f28952007de49edd74b98d2148f1f7fee8d9c44c0b5f2c0a6e0fce796e8ca76", + "weight": 437 + }, + { + "txid": "f492c68cef083d4f4bbc90ef5f71f836ab06fbd034dbdfcd13be5228085a179e", + "weight": 438 + }, + { + "txid": "40d4a8e258bc936fae302556f52dc547c40f2e112ed756a09b5bfb466c75f85b", + "weight": 574 + }, + { + "txid": "edd9e65afaeb9db028fc6d01b90a4021c95bb08cf84013916af60b21093a74e9", + "weight": 1104 + }, + { + "txid": "3d095a0d2ba3ab4bbe92ed91357e9e19b97f7e45b2cad79cc2cd42c4a510c7bb", + "weight": 845 + }, + { + "txid": "367e7c91f411979f20a893d3f806096bbeb15740ab96e299544d88c8de3866ee", + "weight": 846 + }, + { + "txid": "105c3c004aaa96d2cd4eb171e313ef3ec441c401832dd8c94aa2602aa8c3d541", + "weight": 562 + }, + { + "txid": "e8e678b6a528169491435f5c1c3bd63d71232cc88ac36ead432e9dd24c95f351", + "weight": 562 + }, + { + "txid": "6f96657e2e9ea3e4087fe67ab0242370e77d783147bcda2caa33d47e61e96269", + "weight": 562 + }, + { + "txid": "a9c9a0131f3486767882329f68646810dde7cda3c5fc12efedbe2b53145d14d9", + "weight": 561 + }, + { + "txid": "53a155c6df51987c1153594f21f9b51741e7aab6e169c99bfb9b774847f21282", + "weight": 838 + }, + { + "txid": "821c92de04e05ecf50ef493de9eae0fad83a4267bcb2c117a02f606335414b0f", + "weight": 833 + }, + { + "txid": "e3b0abe916c2ed086864863a285a195f43547c61e1218bba5b101f67520c53fe", + "weight": 609 + }, + { + "txid": "7d32ef12c6e753fb34f5c25906e0ff80bcdcce5dde9cc3bf5699e1cb60156a41", + "weight": 573 + }, + { + "txid": "bc94290ec2ed444aa17b99dc5d34299d5f34db4179df0c612106240cc30490ea", + "weight": 573 + }, + { + "txid": "44b1fa69786ae62caf71e9f9ca11d65444c088f252fdb4b1e1bde926f51118a2", + "weight": 562 + }, + { + "txid": "b7398d941f686375a7fec010c7e989013f42de3cad27197979892ee8376c7e5e", + "weight": 574 + }, + { + "txid": "d63cfa51eb7afb372c780c78be4d30178d38cbf2b7432e882b4111875b0e8521", + "weight": 566 + }, + { + "txid": "8f56229af4c4ba035a1d71809239280c1f7b98e8ee560b3034b4f59580460d3b", + "weight": 566 + }, + { + "txid": "d7b33e7c7305fc063e7dd8d75565728de4209ed33216bc07437ab2e8626ce24d", + "weight": 565 + }, + { + "txid": "2982d6cfed391292c8b6c4917c5d17b2ef67c941106f6e7552c48e454a811e83", + "weight": 565 + }, + { + "txid": "f7aa3a7ddbd9276f81b59e33a2581d7d5b6ac43822fd037d10c46ded74dcf488", + "weight": 565 + }, + { + "txid": "ca6b1ec1a7ca350d177322b50cc2b084674d86ed5d394e71c022c116681a23be", + "weight": 566 + }, + { + "txid": "92ba4bba985d78dac784101d7fb39706b5e760744fee07a986044c5c727653f7", + "weight": 566 + }, + { + "txid": "3361a5b65626314840662a0fa124c135976c587aaf79cbcf6cac0f71a039171a", + "weight": 449 + }, + { + "txid": "df138bbe511689ac11fcd64cb95978296d02ebe1ad5213fdd7ae665d82d6d80b", + "weight": 561 + }, + { + "txid": "d8cb0d59df889d14a9d482c51bbccd46519b945df256e7dcc5180940e40b4a32", + "weight": 562 + }, + { + "txid": "7c2bfbad000e21dee39f19c0e72db0825c690ccc54d71328e002599d68d1803f", + "weight": 562 + }, + { + "txid": "d38cb451c788f1c75e070a26d6bfc97448573a0680ed927ba4102c781880188a", + "weight": 561 + }, + { + "txid": "6cdeabd982136b5d3e818f6e6d1b7cb1839e74245748e050f0e25a4d3f608c96", + "weight": 562 + }, + { + "txid": "615e86f378261cf774ed34fb2d965b140674461a983a216ed727dfaede7534af", + "weight": 561 + }, + { + "txid": "9fd125e9d84b2d7548ee35d7f1a68330de3dcc1e0f7d3998fcc7d91dafdb82c9", + "weight": 562 + }, + { + "txid": "f39c14126fd7f335dab30e7e23e01c3406a3740450b42c325431a538874a15de", + "weight": 562 + }, + { + "txid": "f7cde3ba01582ee1725e1986f46295491093ce900ac61b83e5ff20d24833c8fb", + "weight": 562 + }, + { + "txid": "e98bc417164943f1217bb1b487458af151c25d94028e91e22148740c34816ca3", + "weight": 565 + }, + { + "txid": "7cbb72e74618ffd1b62745531511486a08835672a3b1cc65636261f893757567", + "weight": 562 + }, + { + "txid": "ace13aabe698b60b80e57a8d843a2c731c172894417909b0fd015d2bf09e0874", + "weight": 565 + }, + { + "txid": "077a9b1c342dd54504a9bdba12ab636b463a464db626dbecb32ec1dd2c4fb423", + "weight": 844 + }, + { + "txid": "5d290063ded01c2c59ce16247ac5080659bd3096415d78fa25914a3b174f0250", + "weight": 573 + }, + { + "txid": "a3ad5410cbcca2cf19a57c696f33a6e97e523a69548d6a1f211317dd94dee88b", + "weight": 574 + }, + { + "txid": "f2c5bf735220aae0658ab55c6c6cb6032b3910045562aead8fbfe95d7f22304a", + "weight": 574 + }, + { + "txid": "5ebc95c286f222b887fa436c38f553c5d4bf7e44a0eea8ad9859aa9d0eb4a14d", + "weight": 574 + }, + { + "txid": "b891df80e3ab7f807a152c60a36a25c4a8dce978377b38c5726ae89d124187a8", + "weight": 2188 + }, + { + "txid": "92ccd0a6a3eacc97ccd3366ec4aed15948238ba0508ccb16cc992e11d7f8c85a", + "weight": 562 + }, + { + "txid": "efc4b0574e6249ce3fbc67e22faa3b966f26720a94ef09ded96297950ed7da5b", + "weight": 685 + }, + { + "txid": "d93d4822abfd309428adb37a5ddb3565d70b1f9bf52e382671cfdce94fc8c7a8", + "weight": 561 + }, + { + "txid": "d9fc1d7c2dc0208d106262c3ac0f289dabce3d9c37a0128d80943a1664f1cb8b", + "weight": 685 + }, + { + "txid": "1230de14ba41c69f307e217d0072dbde6741026126f218f384ba887143ea2280", + "weight": 933 + }, + { + "txid": "b7898ebce3d9cf34deb1859aeb6b8202bb488d8a40e308489eb191e4d3674da2", + "weight": 572 + }, + { + "txid": "d8fe9120e1909a0b8523611209bf26abb83e37261cb4494da78976af8cb236f2", + "weight": 11034 + }, + { + "txid": "97115a397802227b4903bb3f4068d0f46f3a09098060b54d707ffd9b6d3a5196", + "weight": 820 + }, + { + "txid": "cdc40e78c5cb4622a14f05a809967b35169577abdc7abebdf8301d196a6e5c20", + "weight": 816 + }, + { + "txid": "53d9754bb11d966494463bf13dd1d4ba02412bce277de10776b40fb430aae019", + "weight": 816 + }, + { + "txid": "7e1d3a7743835d5d463a8d3fa055b1dc10d3bff28869788b8876171612bbcd2f", + "weight": 820 + }, + { + "txid": "7c18689a4b02c39aea91c488c2be8c930e4ba9b89fd7cd6fb7e42081a7338074", + "weight": 820 + }, + { + "txid": "b31456e6d1f5d272d7161a1dfd203317b7b88db9719e3fa41e0b271096ec4a7c", + "weight": 820 + }, + { + "txid": "30cbecaf0de3d23d436865cdcfcbe0f6d4fafaa625ccb95bb8528eb8fa691e25", + "weight": 820 + }, + { + "txid": "0122a175c1623054ebc1ba8c9cc04210124ae867cd9707a2a51a1b7ad8d1ed73", + "weight": 828 + }, + { + "txid": "c588b42d8768fccaa19a72428f134166a8dda967d4d4f3898e1383d4517f12f8", + "weight": 828 + }, + { + "txid": "3dc0d6429d49fcf7f5a5bdb3636927c79290ccb652e4427ac2723cf32c03746f", + "weight": 845 + }, + { + "txid": "31fdeccfdbf97b4d90175fecfd7d372cdbb368c6a8d65b6e3c606a483a6df788", + "weight": 1114 + }, + { + "txid": "3aa12e183bcbef0563531473410bea04784a937340e976e8620ec008ca71332a", + "weight": 829 + }, + { + "txid": "a2e12ba330c414e2a2b721b6070ce20e270b3dc95909a9835d534f9338b4c2e5", + "weight": 828 + }, + { + "txid": "65c24f8dae5a34c071ffa62563b9dcd91b6e8359b5657ed542acb205d88ddd95", + "weight": 1722 + }, + { + "txid": "551f338bba3f8b6674128de318d41c82b39fddbe785dae7971afe7ca96b84c55", + "weight": 568 + }, + { + "txid": "84440b65e46952b8c62039feb0a9ddcdcf59ae15db1968b8e4679ac33200f5bd", + "weight": 568 + }, + { + "txid": "facd1ba877fb337fe7e67c72c56ee525241ab430c334006490ad9d5bf048ffdb", + "weight": 561 + }, + { + "txid": "7fda85746df4b3c3049b16e646c79797b64f2a6b189e13d02e48e6548c35ef01", + "weight": 567 + }, + { + "txid": "c300bb284b8b3d613cf5b3e7d077f9f3c6cbbc55b06a446029ead1d64c66ed74", + "weight": 573 + }, + { + "txid": "3b0b79a1b1eb58f1a707fcf620f916f01e176b3f44c40e9482c8b67f89262a24", + "weight": 565 + }, + { + "txid": "7cce70035c953b45ad87842c7de03dc786ac3a2bf61b63452733af415821fb25", + "weight": 569 + }, + { + "txid": "bc3fe0dc8d83884f901c8e3525b49f45fc52397cb002c4cc28e800b2a9d02c60", + "weight": 2426 + }, + { + "txid": "0abe9469de54ca1265587c4c87d32abeaa55dce94286e27ddd9602dc0cfd7c45", + "weight": 548 + }, + { + "txid": "cee56887688b72eb11fa7faf75f7c9115a904e692814d94ee26fb707a295ac4c", + "weight": 817 + }, + { + "txid": "cc88f4c5070cc02f013adc774c5139bd0b16050938185a19becc499ad9bc4353", + "weight": 548 + }, + { + "txid": "a78cf9c0926d37f69decbce3ad8c0598784f89d108ab6259277135651dbab35b", + "weight": 570 + }, + { + "txid": "5b3074920f8e991fb3ed82d0904ef3899e40db16ced9228a5081e29c0712935d", + "weight": 4400 + }, + { + "txid": "845df5a612507b921203bd917bd0b24966f03b4f3d430a9b3824083e9b76a05f", + "weight": 565 + }, + { + "txid": "522de228f89e2f9487a5f40425b3742bde91beff0702a448abbe5bcaa9f9166a", + "weight": 548 + }, + { + "txid": "2fddaf22a6a653d97f808701057e0a8d3aa61419146c2b65571d4690d17ed188", + "weight": 567 + }, + { + "txid": "a34799cb2b7c54b57f19e88019426c0bd0957736692dd46ea62719dc317f7199", + "weight": 548 + }, + { + "txid": "497b0e8d55ed1b1e177e54d628cac88cd42f49c4b76e2f84112eb808a07d1bad", + "weight": 548 + }, + { + "txid": "88eb3fb14f8a4c1dd4cbae5e09e30daf684f7d8323911b6845bab86101fd2dbb", + "weight": 548 + }, + { + "txid": "78d8a1f4a8bdfe541e56bd4990773276908e1d13405c97585eb15e628ce516c9", + "weight": 548 + }, + { + "txid": "d41094ce6f50c3e9a6e1dcea4b4333f7195d56046676a8b3084e4cc11b95a6cf", + "weight": 565 + }, + { + "txid": "677f4d2e58069d352413e575dc7dd463a0bb81e38bc932c34df40fa6adf018e3", + "weight": 548 + }, + { + "txid": "de035fc326325e39909c126b343fd9d4d4d1a4badc6d028999dadf7f98f0bae5", + "weight": 548 + }, + { + "txid": "88e317c03068c54bc1f393f5e40ef0b8fd9f47121d4bf7d13fbb1438ce067bf9", + "weight": 548 + }, + { + "txid": "bfdc485035df02f398a60e7664f8a9d74ec48e4b41b1af1bd616979a3ca78c9c", + "weight": 1747 + }, + { + "txid": "4953247d893a38fa426c7d6c7f47192aebf64615b8539f7df98e72be2a84c106", + "weight": 602 + }, + { + "txid": "e132afffcf4bb2f0005bf6be03a014f11867e0134112020ab3a70581b7a70e08", + "weight": 602 + }, + { + "txid": "df39125f47023c4c5c95b0b90d13b043ed488b0bbc953c3884d4fffddfe1a41e", + "weight": 602 + }, + { + "txid": "06df0d3530cf88769d3c6634b828bb9940b6cfab49cd08891049d81982298c22", + "weight": 602 + }, + { + "txid": "fb2a428c3f0b47cae990fa40cd35b4f1ab78eea7f797d255059978279e16652c", + "weight": 602 + }, + { + "txid": "28f60702ebc66df82d419281a5a660269dc0c55113526a462d53e77e52831e2d", + "weight": 602 + }, + { + "txid": "e738d2e779e85db927d8b9d845ce892e8a531980e13349f02d2213a269378054", + "weight": 602 + }, + { + "txid": "3e608f90b6e2eb0ce327b40cd122e3c357634b93b32c9afb6b1e0ed1dfe25b57", + "weight": 602 + }, + { + "txid": "70960d811b9ce69a43de8678044d1995df9ca6d98e5c6f95f8efc5451d2a635e", + "weight": 602 + }, + { + "txid": "3ea125f3d382d36620dba554008cb670b87faf024ac27d4152c5aa37ee645b5f", + "weight": 602 + }, + { + "txid": "956448a2d3e31bb3ccd41ffc34fcc5c57343c4af34e42cec144ea080df95a178", + "weight": 602 + }, + { + "txid": "be19dc491fd1997b3d2913caa9aa412c5733ea212638c64206ddcd026548d67d", + "weight": 602 + }, + { + "txid": "9178253201c74a1d5d425cfcc7fafaca0f59fa6865cf493ad64410db60b6c28a", + "weight": 602 + }, + { + "txid": "1a63fa3c56f0c5c24c575a3e4e556c6782ed595ddad7b54f5908650eee4f38a0", + "weight": 602 + }, + { + "txid": "a25013fc53e4425253738df9a72c668e07942c0b07ae722bee612a72209204a2", + "weight": 602 + }, + { + "txid": "7cca13e64d0f3b1a30b0a22c85e70490a56637d8586b2974d6d8e80f5169aaba", + "weight": 602 + }, + { + "txid": "2baf1d6ba7729728102b1e37b2a0ce240e3d4216ff842b3878c70a5b9fffa9bb", + "weight": 602 + }, + { + "txid": "60dc51627d155bde752361621fae4998ffa8f1f5e66fd88e0f7ec60af2770ece", + "weight": 602 + }, + { + "txid": "0e398a827c8ae0d35457d298bfc2962a703b368cc5d15981ed1d3879aa6a74d2", + "weight": 602 + }, + { + "txid": "4ea37baaad02f3ca13cb3f789deea50541cece89b1b61c8d300742acfbcbf5e4", + "weight": 602 + }, + { + "txid": "0fb32e6c93c38589d71501eb0f0372c45ed0689377d6cef7fae80c2d438728e6", + "weight": 602 + }, + { + "txid": "6b8815ece5f0b704e35ba7a4b5663135eac753b0d1c4ffa90aa15d7617600de7", + "weight": 602 + }, + { + "txid": "59d468b07bf5d3038784e597a0b6429a4a70bac35a6e4bb00ab0b7b83e6b69f1", + "weight": 602 + }, + { + "txid": "74a205982d1cafc02f3432f07dba0a539db2415f5c6bff23b2b36e3e4d076e22", + "weight": 880 + }, + { + "txid": "8f0fabf330b594a02eba2cf3cd9e93ffc5ab16904c53193fa3e5b22b4e149664", + "weight": 880 + }, + { + "txid": "ca4b6e3ae6c838c0f444d321febd06c597b70d08dc10f34c3c8930ffd4ab4276", + "weight": 722 + }, + { + "txid": "f958d8890cf536972de8d915c03f685926cbb6b4263260fc9ade6a952815ae24", + "weight": 845 + }, + { + "txid": "f6a3b7ddd7889068ca5178388a2c81540791ba5d0eac8330dab4da9e0ccecc2a", + "weight": 449 + }, + { + "txid": "6f58d7067b085ead8cbeddb23d2b7cb6277a14f2862b581ab10a24f47c7f908b", + "weight": 561 + }, + { + "txid": "bb1767229fe5d587b95c7a1d7d57b119f701e639ec91d6285b8997f0b4cfb7ca", + "weight": 562 + }, + { + "txid": "506d7cc40a6cf9e8fffcca52d24a60ebda0b28b9bbadc07b79a4a0d13f1cc4d0", + "weight": 562 + }, + { + "txid": "42e519ead126aca07811a0b25e35e9c46393eba2b46cacbd12ea23458f04dbf0", + "weight": 561 + }, + { + "txid": "d87f4b09d00b9cdfb231189abdbc57a0b66b18f091a92c7b93fa5a40f1716b24", + "weight": 884 + }, + { + "txid": "5cce0cb66b167c65f03cd701244051eecb3aa9fee4b03bf5c24d8e9859a6d03d", + "weight": 884 + }, + { + "txid": "dae85f8f503a98a65d6da42820926a4cc07eeb887cbc5679f621b072ca402275", + "weight": 884 + }, + { + "txid": "7d2dbe41afce15b0515e9d9519d1f8a6df014001a3c824cc777f08ec6d767bda", + "weight": 884 + }, + { + "txid": "f7c42f03300cf69a815d2bf6da8eab67fa71c0390fc5b98b126a6a1569b7f442", + "weight": 530 + }, + { + "txid": "c459a3f766ac29180694e0d8b966d41825824528a467dfc002df2f8a663a2008", + "weight": 617 + }, + { + "txid": "45ca87732e08bb2d7798d2f549cdea1d96ffd38a9a3f3fab9b3495af89e2bfff", + "weight": 617 + }, + { + "txid": "dd69d577c4fb2b20e72bea0cec6d4fd3f39a50b1915ca622aaa9d65718e7665d", + "weight": 562 + }, + { + "txid": "748ca6ce7ed958f3e4c5277abecd5cb5f4989b93c594c48f45c79a1a5289460e", + "weight": 561 + }, + { + "txid": "d17a47ad9f356a5e8ae852773ab442db27d26c3f0bad8eacc594188e458eebe2", + "weight": 1082 + }, + { + "txid": "51dac90c9b6c54836e03e011422f63b7f13aaca8e0748f0d2121c2b8c9005f70", + "weight": 5327 + }, + { + "txid": "40dea0fe3abc9781a6ef01e1968a2cf09850b865096211f4b20e7bab1b9923f5", + "weight": 561 + }, + { + "txid": "926e886206c70674122cc0bbbe841bec338a509deacf3cbf1839abc35b66baab", + "weight": 561 + }, + { + "txid": "71943e3dc08cdbc89b04d5027e1c0a7a8d9eb30c76bf9441ca1dfa51689600bd", + "weight": 585 + }, + { + "txid": "a87119c3c00a220c1800b48adf6428f67d8e0a3a8e85b0b67a5159603a50d477", + "weight": 3132 + }, + { + "txid": "217df805071c7b852792e8f9f82584516b4ed0b94e70edccaf3d169db1edfcbe", + "weight": 848 + }, + { + "txid": "9319f8bb744d834ff26575d8ab1b2250324a6a39bbda59f2fdc9142f3b6710b6", + "weight": 809 + }, + { + "txid": "937085446a933913cc055bb7268f2fdcfdd9e44e3aeb7d446b5ae2f1cfc25124", + "weight": 561 + }, + { + "txid": "e8406e952f25dda6a934f155b3a5ec96e17e61d20955a17b9e4577ec2049bd17", + "weight": 561 + }, + { + "txid": "036ca35afe50aa4bf4a793439151b1e09548f17cdd71ae934fccd061fc7d448c", + "weight": 437 + }, + { + "txid": "092789fdf1a98ce76d4ee55a6ea068d8b7c45f05963548c5a48c94aa27f028f7", + "weight": 562 + }, + { + "txid": "fabaf38ce71a044256f7cd97414d5be3f4531df50f9a465c724f22488705468c", + "weight": 617 + }, + { + "txid": "f464ac171ededf8a61f6f52e0f9d66c52ca233dbd3bb28724dbdb4bddcbb3599", + "weight": 1338 + }, + { + "txid": "bba74b3c001951ba71f1a9ec2c64b18842d1d75680e1da2eb5acef451cade1d2", + "weight": 817 + }, + { + "txid": "cd5d5f6cb7fc320307cb6f6b83e26da9980cba039734a2b0b71c37d7ecf56ed1", + "weight": 1484 + }, + { + "txid": "9b7784e3eb8274c9679d4d1a4db3395dc031c19d143a9c0d499c767d3cc060e6", + "weight": 1093 + }, + { + "txid": "8485724f54dd445f68af647938c6e0f121ba99b888ed0592f341732b80b90f68", + "weight": 653 + }, + { + "txid": "79d6c6ca4eb6f16fc2c170701fdb2ba62976825a61024164fdd512ad47351c7e", + "weight": 561 + }, + { + "txid": "2857fd90f03d1cc9c8790166e980eb1fc3b3f221d935e94f478d53ad89374d17", + "weight": 585 + }, + { + "txid": "66e801a7afcf9c9730bad3d41ceaecc25c45a4d83b22966e1f0280c8b199d39d", + "weight": 561 + }, + { + "txid": "fddf595deb9e8bf4cf59bee9cbcf710734b67b898f9acb5f6d032db57989392f", + "weight": 585 + }, + { + "txid": "56c731754f4fd34682a7fad492052c976819f6a686b6a1236edf6e779b630abe", + "weight": 561 + }, + { + "txid": "d427efe28d0600fd355da9957890320a9e5f24079a98646197c94ccf3c9a9a92", + "weight": 561 + }, + { + "txid": "ec17647f1e83587a2acaeda1b428f89fd84930953f5080db755cb4736b265604", + "weight": 585 + }, + { + "txid": "3800ad77c183bd27e826b3ee739f6f879683becfdb4a7e6adbfa0b2b77ef41be", + "weight": 561 + }, + { + "txid": "bfaa4e32d71a4eaaf4d62312a3fdef447fb18311b4d426908533be042e76106d", + "weight": 561 + }, + { + "txid": "9913fa3581feb781e84a4e249da026c0830ed7fc3fee99b7a93ce501270467b0", + "weight": 585 + }, + { + "txid": "cdd9c9fe5ba0384fb9f3c8ace444e156cbdfe2f8bdc4db5851ec272f280e2508", + "weight": 561 + }, + { + "txid": "b62f615a918965a3552902b575c0b2a627e08b0e0dd71f4ab9d185df5b7b197f", + "weight": 561 + }, + { + "txid": "ca2e5d2687fadd564b77b5bef000fd9441b360db0331c91341f3ce316e95a7d9", + "weight": 708 + }, + { + "txid": "0c797156a765634cd7db0f4466fa00a9a7a2e40286d90343a8cdbabbed503b28", + "weight": 569 + }, + { + "txid": "a771915cb42099164268b32af32f52e3c24c012eb856082c38818a1a10132a51", + "weight": 4649 + }, + { + "txid": "6d788692b3cf9435788f2c9529ffd4484de422fff8dab8f46acc2969038675a5", + "weight": 561 + }, + { + "txid": "cd6a40c37ef67f4888efda9ea68da956ecb8efc463fcaec246e6fc134f6a18cc", + "weight": 1101 + }, + { + "txid": "3fc05a7eda27dadacbb72798107ea0a8f9460df1a4f50d632d6722a73e424237", + "weight": 616 + }, + { + "txid": "6520bdd59e2e60b3a874a0449883c6c2c20595b703231992a0582e6356f823de", + "weight": 565 + }, + { + "txid": "e0cef311838da0629915a38530eb04c55695d0c054531cf5e3120bba3234a203", + "weight": 1132 + }, + { + "txid": "2e24ebe194d27708efed803715065254855049a861a7b8018ceaae9919601570", + "weight": 2336 + }, + { + "txid": "074712160646d6787ec40a721b3c1b975480c36182d85e6fbfbb93e70831c809", + "weight": 548 + }, + { + "txid": "4f932be9d7bafc2e52a27d68e9f35655eaefdd43866cf560bc2a5b35a4de363d", + "weight": 548 + }, + { + "txid": "6a5558cd874ca1dfdb67388eebfdbbfdc59baa7f19d2981f2eea5cde3013ed42", + "weight": 548 + }, + { + "txid": "a600de5f846bf73aba0272f0e7a38fce82454cbd90c0e3ee508bc524d7e2d943", + "weight": 548 + }, + { + "txid": "48997d84c72e863b16e983b9c40af0312123de5696493b72dc36304ba748b15d", + "weight": 896 + }, + { + "txid": "a171b857e01b0416022761a061882ef9714bfe13e21dca2658d325a1213c3166", + "weight": 548 + }, + { + "txid": "e23fe256f4fe3b70c720e1a440cc4f0d86916a418100381de5f054dd0b77897b", + "weight": 548 + }, + { + "txid": "59738a2ba1c5473ff852e8e5377bf78df3acc1eab3ce7cadca0ea790d26e8c8c", + "weight": 548 + }, + { + "txid": "9159d6b6bc3836eb84db2aa54773d1ae60a8b2cc9730d8f45c6b3d5b67dfa1c6", + "weight": 878 + }, + { + "txid": "dba855ad422ab68234d493b979f5d4ba947b27d7281d4b84e86dcaeb4ee034b2", + "weight": 548 + }, + { + "txid": "db69d1a3758223b2d90833b644791ba052ddb7b8c0670e2900e4aa4ed24348bb", + "weight": 548 + }, + { + "txid": "e477ce1b289db7b27ced508db9a7f6632658444d0c60930e7cdd771d825ca5cc", + "weight": 548 + }, + { + "txid": "dc2925a868c702e9e59015c2e21abce435478b9daf0fdc4c0ccb087ad60fb2d2", + "weight": 548 + }, + { + "txid": "e3ce0c62eb27fffad5ae9bb91638d669a1beaa8147b6b9a481c0452b9fee84e2", + "weight": 548 + }, + { + "txid": "dcc61d066b828074190ceea6c1de007a684367938d4d17ae371d5a99dcb93cfd", + "weight": 548 + }, + { + "txid": "3f3c110a0d114dfe9d69928bcf7005fb158653c53f738ea28fec9c8aa934a5fd", + "weight": 548 + }, + { + "txid": "1d5457343ec887b54b687704a726720307f4f6862756a475a0f8bf9bb29a8872", + "weight": 28773 + }, + { + "txid": "e359a3bc274abeb52053ac68e5d37a21f4e3c96862f86d5a75f30e8203ec4211", + "weight": 24412 + }, + { + "txid": "4faf8ba290a73e67891686fb15a45ed4c4f7ecae3ff78ad3aa9957f4cf53edb9", + "weight": 17866 + }, + { + "txid": "93ad9c7595804d6c5e81994637f1939622c4ce21c4b1e8b121e26ba75af07cd1", + "weight": 7494 + }, + { + "txid": "0c810d200e525b4060a4eb67f2d3cc69d16ae814d04e6a44c5613d8678646108", + "weight": 4440 + }, + { + "txid": "3068de8c802011639c9b864302c5268cdf626cfee40a1992d3a2f6b9bf18e88d", + "weight": 565 + }, + { + "txid": "6553d05f4ecf3e6bbfe2ac55efeeab418aee107280a0a8113c69cb8110d35c3f", + "weight": 888 + }, + { + "txid": "d3e25b1c67c6a588728694446b769b56317ffbfdc23a52a9f8fb6278b93f72cb", + "weight": 892 + }, + { + "txid": "7f3de4fe48b7330ddca3bfbe5b1359dc29a6a16e5aba3486af33b64e8bd1a256", + "weight": 752 + }, + { + "txid": "4654b009031cfe00c3ec1fc77e4ab1a35d2792e190a1fef820cf7d9da31e0fee", + "weight": 565 + }, + { + "txid": "edb43ae05828408b76d0103c346bf8335c894f1330270a10f1648132f0cdfccd", + "weight": 449 + }, + { + "txid": "dbefb80edda3b3a3e5f5390a9ecff40c709c40a7a886c1e7d1c075efd7d75bf6", + "weight": 562 + }, + { + "txid": "a0bd6bfa9989d70f32baa3f527126daeadb00e086941217825926c7c1a762ef4", + "weight": 825 + }, + { + "txid": "1863d06623919580e57997d6cf96c94bf6e8afaa9eba556d201afa8a7b275da8", + "weight": 565 + }, + { + "txid": "af223c605901fa3dada16d8a4bc9c304ab73a314bf951f6d3f2f1942c4b743ba", + "weight": 564 + }, + { + "txid": "0c4dc2e3c57b9f23cd3dccaa9eb8a3c2a5bdc85c07107407c8702985e6accc7d", + "weight": 832 + }, + { + "txid": "bd5308ac018f25d64ccaebf295e5ef020782e7eac9877e99e9f22e6dd05d7d03", + "weight": 754 + }, + { + "txid": "951865d40f855e3aa81ead7d51c9dbb404889306943a22235b75b6ff5f6c3e08", + "weight": 609 + }, + { + "txid": "ce6a0537e3aafd155bf6a0c25e685f6951e53456de0c812ee05706cc694fef09", + "weight": 565 + }, + { + "txid": "814907f4c14dcd45b0c8fe274cca8b4df5a786b7e6994157401e3a6f9ee63e2e", + "weight": 1561 + }, + { + "txid": "86f71f6c70cea6ce0cc39b730eb94e2c9bede6d187720292f1c4e9d836da3824", + "weight": 1061 + }, + { + "txid": "ea9531e488abc23b391be99f39a0c6952923513a28e9af30b33982b897c0bb46", + "weight": 3189 + }, + { + "txid": "ca9afa00f0e44f7ca545567abacfebd9413c19a597871823348514b1a823ff52", + "weight": 1929 + }, + { + "txid": "70b079844c39f53a6ce56817185ede2fdcb3813713b6b5e2adc286b33f9c2ae3", + "weight": 2689 + }, + { + "txid": "3305220589eb96e009e2f8610ee58aa7d61d206bc12eb86820933e047be43e72", + "weight": 2553 + }, + { + "txid": "79ac658939bf1ef38ef8ce2df7b4a8115721713c534b199d52bcc746b1c5156b", + "weight": 4797 + }, + { + "txid": "208e2ced4cfe72224726f52f6f728033a0acfbfa233bae2c7709d362ad85278b", + "weight": 561 + }, + { + "txid": "ef1d1698876e0bd45ec67b899f22dca0b9956135fab574f2484252d1a47eb999", + "weight": 561 + }, + { + "txid": "7fc4ef2563b3686da4cbe66b1232cb95df75f69a6a429f109a6f1022d6eb90a9", + "weight": 561 + }, + { + "txid": "eb3ddaa68fa598d44c0c2a694eb2542e212671d8647059417d9d92aa30b92fb3", + "weight": 565 + }, + { + "txid": "5d9746f7ca4a5fcaa6ecdbc5e304c333c07f6e0a9601ad332716abbaf9c17ae9", + "weight": 561 + }, + { + "txid": "6b06397f01a07deb73a66909e3502a54459d1d793bd878f6f5ca7ffad0884af2", + "weight": 437 + }, + { + "txid": "bcc8da5025e64125366a8a992b94a0654e6240e5663386c34b337a15dcbb4df9", + "weight": 561 + }, + { + "txid": "cfea838c58f9d6bece8336cdce6e20dceb41a489631871ae8a731f56fe4e4afe", + "weight": 2701 + }, + { + "txid": "1f69a917aa1d1cffd1bff10ce13666758953e4886fe993df6897edc8201e1ec5", + "weight": 573 + }, + { + "txid": "8178f5b7d4ef483c866efdf5959bee3313b0789f442022a70a1a375e6ffb7c60", + "weight": 569 + }, + { + "txid": "16e266a3cfda86d3c4589e57f079c3d19b942254914580c4944cc92f2fdcf20c", + "weight": 1386 + }, + { + "txid": "63e05ded5fa51c3e676421deeab15e3f14876eefcf38597c33dd8c0f53ee82e4", + "weight": 441 + }, + { + "txid": "74e09d84ff7d7fbf5882ea479c1f133bd600d195dfaf88dff98fc8bfde69ec41", + "weight": 485 + }, + { + "txid": "7e8101b17b1b39393e86698af14eedeffa3b96e87992ae7f345eb6451e96f1b5", + "weight": 1533 + }, + { + "txid": "028188e0e2cd74f06b508478091fc7bc75f849bcc28f99afa3be84ce1b6cf267", + "weight": 18230 + }, + { + "txid": "9aca3affcac35a8f27c64dd5c1f78fc6efa38a1bb4ed26cd213c0d2ebe6df663", + "weight": 441 + }, + { + "txid": "67a139d7c9d608774c99b25e61fd37d91f67868fcb55e8faf1659656f47f0870", + "weight": 565 + }, + { + "txid": "7fa86025471d83e0bd0da3d403101fe4f6c2f801eb8fea775c0c27985c2480b3", + "weight": 449 + }, + { + "txid": "f4de7a5d4bcbab8d7c5d036d59b1c145fbefcf704a808fb8fde81d75f691d8f6", + "weight": 438 + }, + { + "txid": "a136ea276cb17effa73849787a2399d359d14649948e541c263502b83850ff68", + "weight": 581 + }, + { + "txid": "4f84a3f2b9ddeb36effd5d2fbac97b087c0b0305478b8670538bdb12b95aa048", + "weight": 118168 + }, + { + "txid": "14a690b07280dcdc9903cef8ab1397bab8478b2c1d4ca06877b319f3636406c8", + "weight": 118168 + }, + { + "txid": "e9e951f669eacc7ca9f80f1fae2ca2fb9137cfb018eccafb0e5f5f681998ee00", + "weight": 118172 + }, + { + "txid": "2908c858937960982551e981fde7cc04a583a6b9a42fb865e62f3be9945ec13e", + "weight": 118172 + }, + { + "txid": "535ac87912d217a30b55fc04d3e0527009fe90497b00c27e2b3234414e49a999", + "weight": 118172 + }, + { + "txid": "d4bd4e244613daa96f184465c272712e75c81fa2c32445f09d62380680f4a977", + "weight": 118176 + }, + { + "txid": "8c14443936301380c47a63262e2ba7168248fbd18851a0f641d95b6a6545bed9", + "weight": 118176 + }, + { + "txid": "fad10f7eb2931ee475fe2b42ec03f2da3d0b05b5e37d490b71e5febbb52fd502", + "weight": 118180 + }, + { + "txid": "50b437a6ff1cfc05576526716e7d72617abf97d8fd99d9f0212c843ed498aa48", + "weight": 118180 + }, + { + "txid": "961cbc54c3fad07ec347be7f9682f3e918e4fd1a7d4f354b7a69a339b539a04d", + "weight": 118180 + }, + { + "txid": "4c156f0988e10f5245bc11e5d3e27cf176870fb57dbb87bec36bfdf925419c91", + "weight": 118180 + }, + { + "txid": "a74a3b38a2aa12a1247ac9e94113058d409ce220216f76f1bc2a2bb48295afd6", + "weight": 118180 + }, + { + "txid": "d0c7bc320842bf23d7216efe4cae9f62f384a5eaffa8ea89c2518980b6e22c3d", + "weight": 68032 + }, + { + "txid": "92af532ba7db25c35eb2a27056027440a0d384e41c91cbc3df4f28a1519afc56", + "weight": 118188 + }, + { + "txid": "8150c08044183ddc32dcdbb0b3020d284b634a5df4a809f0647875f4e180fbec", + "weight": 118192 + }, + { + "txid": "06087bc213762c92742289ab59fd4507e8063887797aaa0959d31d972b80a5ae", + "weight": 561 + }, + { + "txid": "82fad86c5895409dcb73260ace9c32769c2dd6e0eac92492e0af25bfd8cc56ef", + "weight": 561 + }, + { + "txid": "7d3d7d8fb98c4024227e0dc92f5ccadaa456a2ec1aeeebb6fa0ec25b68452c26", + "weight": 441 + }, + { + "txid": "ab6511769073d04020d6885b7d9e27e1723cb5d18c2b7c344263ddfa4e7fe288", + "weight": 4523 + }, + { + "txid": "1e271d9bddcfa3c08b46504185fc60c6ca8c812de82beaa234a13b86222d63f9", + "weight": 1535 + }, + { + "txid": "c29ba44471739775d1976f90954e87223265e34b152f7a4948bddbad3151116a", + "weight": 3196 + }, + { + "txid": "c452b2db282c5385f55e7d26fede2277218d745c0d71acf5812b375079a22a7e", + "weight": 756 + }, + { + "txid": "2b4123aef316d052039df7973841857ea6458079e1b13952d0e604afee94bf3e", + "weight": 887 + }, + { + "txid": "d6d4e9d55ea66660022a73d36b4d57eb4ef765bc96a8c022e6be16999c8ba9d7", + "weight": 769 + }, + { + "txid": "e78bb56e891d239da15f1282920057d2d33ff45aef8330090bdefd1c0a562d00", + "weight": 569 + }, + { + "txid": "c24722351f1f53f3ffb933c13324d23360e180d920624383693db4ed93cd8c01", + "weight": 569 + }, + { + "txid": "080589920bec25a72802e5c12fdd2e6935e0555e25301cd8a14087b0563fbf01", + "weight": 569 + }, + { + "txid": "505a663d8424a8b5784f09191cd4e86e69eefd8dfcf0512898af8e82eb68d301", + "weight": 616 + }, + { + "txid": "ef143b025a71d1379941aaee3092ec1c4b8001dd3f32a373adcc46c2dc102e02", + "weight": 569 + }, + { + "txid": "232466fbed3799508ba03258e89d973e8f5a811b4f6b7913f257cc575ffc3302", + "weight": 1382 + }, + { + "txid": "2694f7216c5675b207b30e50e9d2adf2b1ed5d9afc43a78ba0c23a7483995202", + "weight": 569 + }, + { + "txid": "3bc139a1c4cbd085c39aa000442e9b49ca67e2c954aaf04e746e5fecb6b17c02", + "weight": 739 + }, + { + "txid": "412859f19076d7072915f2897875104ff8783ae68372b5e24bbf958a82b6a702", + "weight": 876 + }, + { + "txid": "74e4f87a15f6f95a01bee5408259753fb7554fcc9aebd8ef1d408f29c5e04103", + "weight": 569 + }, + { + "txid": "2e4717b7eb3cf9c4675748f8b4743b1d6d70d7cb2718c7ddf4c38eb31e159f03", + "weight": 569 + }, + { + "txid": "d4e797520e0f17657e9b67658b146f85f61ac86c31af85c08539e72b546c2005", + "weight": 565 + }, + { + "txid": "3965aee69a57cb4139964be99b100a9a61024f42495c88941365bdc977ab5505", + "weight": 569 + }, + { + "txid": "67381f0fb2cc42e084684959549605e47e7b93d71549d8e6ab65a00b59856d05", + "weight": 569 + }, + { + "txid": "b8c88254ec6940c8e455c5b60e43b5ed430037e57a78835cca4837bebd709c05", + "weight": 569 + }, + { + "txid": "137c490d4cba59b3fdf7d8ea907c218d88b62e90e90283c3db2db268914cca05", + "weight": 569 + }, + { + "txid": "f0dd6ab293b4e0af07927c86da80ff6ca27cb723886b935ff0ecd15280add505", + "weight": 569 + }, + { + "txid": "065b781c1c487604ab8e2051d7bbf7465edc8bf9994b7892482910006a721006", + "weight": 569 + }, + { + "txid": "10fc2c49e7fa2a62c60d419a14f6c9ec7c06d128e739e1eec7d754476f668606", + "weight": 450 + }, + { + "txid": "25d64245394da7fbff7b11256b0c1ad52611d7c880c23db11a3007616ad4df06", + "weight": 569 + }, + { + "txid": "28d60a0bb8396b023a37a48c042b68b76893073701055abb2c09701c02a6ea06", + "weight": 569 + }, + { + "txid": "b55cd9d6823b8dcd2d8c9a38c1d1dcb46437cb645d13ef9d9d0ca4d01fd11607", + "weight": 569 + }, + { + "txid": "b16bae83f4c371cd1be6ba3dd3731ee8ab04a3785cc95307f470afb0ea216707", + "weight": 900 + }, + { + "txid": "0d96afa5facb67275da30196eaf0919f5012a1e0df20f4e83d586156f9cfa607", + "weight": 569 + }, + { + "txid": "347aa2e03da56e7f872d1a6d74df511bdfa49f5209f22feef0794a9faae35508", + "weight": 569 + }, + { + "txid": "2abbbd7c6aad80cb5849cd983f66b63e499342250187dede321a9a3ab2dcff08", + "weight": 646 + }, + { + "txid": "91dc485c96c9eabc71d9b37be2e4c4db16cb29b1855af1390fb97bbf09276809", + "weight": 733 + }, + { + "txid": "dc136d3682d5196d099c0b0f7c55623a0f0dfdd0001b55912f2e16b5776c100a", + "weight": 569 + }, + { + "txid": "e9ef494e4b78fd1cc2bc43f2a081bc3517343d1c9fda103357b13b8ec0149f0a", + "weight": 569 + }, + { + "txid": "e0a234bcda8f346a0c6c30fea3ae8962fe175c4e28614fca5f13839be266a40a", + "weight": 705 + }, + { + "txid": "45529cfdb0fba815f9d17b96963cdacdbd8357e0b66180e83a12c3cda14dcd0a", + "weight": 569 + }, + { + "txid": "584f47a82642b6cbc0cf25a2a8f025f781e1846bbf9f7298f80871279d7c690c", + "weight": 569 + }, + { + "txid": "56f8b7d9520c8f424d848827203b459338f5757e934f693e99fec0e450d3a80c", + "weight": 569 + }, + { + "txid": "0d1ac0c5d61a1b82e74017b88a3e5fe233943333a8a45ab430b9aaa75f35bc0d", + "weight": 569 + }, + { + "txid": "3f00ac3b326f7f141720f677f98145fc41d3faa896f00967c44bbd983011ff0d", + "weight": 569 + }, + { + "txid": "ade23d93c91d39d007a851d1ebac963c9b16f22aebb4cca30f69a8a437b4100e", + "weight": 569 + }, + { + "txid": "7374bee7d5561f68f72b8987e36e5f17ca98a945978a69830c172695f3d6f50e", + "weight": 569 + }, + { + "txid": "2159034f5df0179706b228dee1c8aea5f67004d094d143f6468ad26fbadb220f", + "weight": 569 + }, + { + "txid": "7443de77676510969832dcdf113d8cf380cef0032212b8a8126dcc7d34b4620f", + "weight": 569 + }, + { + "txid": "e44e2fe52b842b15b57f84c290e92abf5f81972f8a1f679d77d494ea89119910", + "weight": 569 + }, + { + "txid": "5e68ffbce815810f532e763ddc5b6e4fdf0bbfaba6c7df7216dae24354660711", + "weight": 569 + }, + { + "txid": "cd47b9976398bedfb413ecea2cc107e9037bab3fe36e380fa4cedf0234d70812", + "weight": 569 + }, + { + "txid": "674c819538da0c28c374652d4be1d9cb2c21604c1f9688b94723a1f081cf4e13", + "weight": 569 + }, + { + "txid": "bcbcc937f9f532e8fa989c789719c03098993269104232adacfccd60e98b7513", + "weight": 569 + }, + { + "txid": "12d3e8e0d548177f98379de47a774efb77f79b1bd96bd3aac7b7bacb2dc6af13", + "weight": 569 + }, + { + "txid": "f81dfaeee671214b4f79e214e75c08c4ce76d1737bc6f43f034dd2fd4ae5f113", + "weight": 569 + }, + { + "txid": "bdee7f00abcc98186792d520805e9c525cefa7fa5bc96a568d9d88189ea92714", + "weight": 569 + }, + { + "txid": "149f314646c03cfa804fc75f4a2745b66c22c5a1ac477763a7923e2de1543d15", + "weight": 694 + }, + { + "txid": "68f45b6aeabc90652c65025f369f7232960b93dc333874946505695f87ce4415", + "weight": 569 + }, + { + "txid": "def506b254aa9f22b0d03dcaecc74b07f6aae8ddadec71487e59448d96e5de15", + "weight": 569 + }, + { + "txid": "dbe93212aa432cef24e270f6305c95b6c5297eb4209e2733c7c4b80e5bbe6616", + "weight": 569 + }, + { + "txid": "4d039bdce762b7fdc299211f8afa31fb167336ada2b8c47f025ee62608ab0117", + "weight": 569 + } +] diff --git a/backend/src/__tests__/gbt/test-data/test-buffer.bin b/backend/src/__tests__/gbt/test-data/test-buffer.bin new file mode 100644 index 0000000000000000000000000000000000000000..3a1b5b7c3eb02bcbbafd8e586afe9ff752e028ab GIT binary patch literal 796564 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 literal 0 HcmV?d00001 diff --git a/backend/src/__tests__/gbt/test-data/test-data-ids.json b/backend/src/__tests__/gbt/test-data/test-data-ids.json new file mode 100644 index 000000000..2ab632473 --- /dev/null +++ b/backend/src/__tests__/gbt/test-data/test-data-ids.json @@ -0,0 +1 @@ +[[1696,"5a1be765d06123c15a04cba41f87a59c9413b3bbadf39567dfb50c4d30d5f2f4",28.90391459074733],[8357,"a96414ddc83aff03fb9fb92241f90be67e5bc2ab350aad169b848520547bedc8",9.917710196779964],[6576,"6d3bc01b0840a108a2b317393bf616369ff849a4680e159c82ee8f5ef3c6d0d4",9.317957166392093],[7696,"21a448379ede13d7013097d1a903f60f41258a1c8c6e9313d7943db0bb5890cd",9.917710196779964],[2742,"8dbd8dd873e9782371029f729fefa0963b6c02c2ed59d9d7c0ddaaa8f0162aee",9.647446457990116],[17042,"bf4468844942d765e9ab6951cc34aa0224768b7338fa22484226fb14cf6d2a51",32.79775280898876],[2770,"581e63aebf979a15770e0caff9f689f575f408b8a5111af5289ff7cd7640f8ed",9.917710196779964],[6574,"3d0d878975ce151b083cdae5199720b9155b614400cf8258b14049c1b138e2d4",9.317957166392093],[7632,"4719ab77b8c44b1c95c3831ef42d104fc652216a4366146a97ba000a387bffcd",9.917710196779964],[8650,"193b63f5e9e70d4144f3302a511e974f168b459f8c80161a5cb1c0d27f1f0dc7",9.917710196779964],[12459,"5455a2d21c9fb93902ae74eed94c0a290e1e2f0315b51dc4a7cc188dc2303dae",9.917710196779964],[8439,"f8c6e417daf30480f07549ed6d4719430d52ce509820d261bc289100c62165c8",9.917710196779964],[16298,"cbc21433e0fef18af62297ef6b61c37d5282d18fdb3942cbd169a0ff9c402b61",9.317957166392093],[7946,"93b3b0a08d066bac7c79ac60cd35de5f1cfb8ec6aa10bd970fb9010975fdebcb",9.917710196779964],[10464,"c8981faa002768ddf46c07ccaadee20f3dad341dd830047eed27a975d33757bb",9.917710196779964],[10035,"edc26c95cecd5cdc1fcf48a82dc19de98015cd6e4e908e0a4d3467c1d0c719be",9.917710196779964],[9804,"100549ae31722c8de28bfba31c293287feca1ad59b42afb7472e1d468fc09cbf",9.917710196779964],[10637,"11cd62000dc05428f3dd38c5d019ef577654ef2dbcf2178177c3dec29fa270ba",9.317957166392093],[5835,"901a3455a7fbdb192fd221ed34a736c8883b9e2faa3287dabd6ea5e6e6e01eda",9.917710196779964],[17029,"978e13aa4467431f8af1cc3ca6ce07ed432fe2f30b13a5e63c63714799446751",9.317957166392093],[18348,"497acd50be1e1dc1f003c0c01cac527e84a9c390875ce005d8fed8d005a7d234",9.317957166392093],[4989,"1dbc8bec016bae533013eacc8087dc701f79ddfa2476d69d3e1a6ecbf7bf40df",9.917710196779964],[13203,"f0b8d95dd8dd48e7adbd76b429498b40faaf621d78bfe09814ca0f825049d2a6",10.0355871886121],[6129,"82b9dd66f945f0e1d2ebed20ea89807ddb4ae7e127902a8200304213e71943d8",9.917710196779964],[11510,"03583eec4e2cea17399e673904edc9d482fffe3f434ed415eebfc568ee5575b4",9.917710196779964],[4382,"03d646fb6eac66e63416657b2dc20587c2637ef8fe26829be93d8290dc8b2de3",9.917710196779964],[3283,"7220022334be6c172d3b8dcfa7881475ab9e90abd474d73ba4ae90e0a83482ea",9.917710196779964],[11451,"7cc9f889c46bbe44def7b833fb1f661ee7463f44c93735cb4d775986101bf0b4",9.917710196779964],[16783,"2fe4c35f2772c666f1561305ca4cd1068d8eff7a3f9e2383c5bddebe0cefbc56",9.317957166392093],[11705,"3592c18fda04778742ed1c7b7b829e58ac454f646e431dcb7fd2df808c6144b3",9.647446457990116],[4534,"c04a7a93aaabf6305380057b40367b86204b645d4382484614dddeb31f4224e2",9.917710196779964],[14944,"645ad19ea191a7e72285e0595fcfc1f28dfd0e8a53d1b2aabc52d92f1256ec7f",9.317957166392093],[16769,"733a313c2fa4349fcc98b000a78c7c154a5e75a8264d89f47209b3a6e5040c57",9.317957166392093],[19217,"84e53200936d939161da3cea308bea31608e333a3a1bf66f53dfe0817c7f1418",9.317957166392093],[2450,"84267832d71531bc7f378c810445eb68268b5c87804195b866413783edf633f0",10],[7760,"7eade46c6659d55c0224b93b56dae9ae7b8da231909bc7c534172295b75211cd",27.099630996309962],[4507,"04346fefbd322e45f6434e8a4b80171ff0ec2eb5943159b9c2ea257c52eb50e2",9.917710196779964],[18801,"0a4794a56ed0b9c830af4b704c7fdbde2ac3176e811ae6f19508781c0cefdd26",9.317957166392093],[11238,"eb76907f85fb8aa2830ce376413c3806729af10e0dbb390875c89434f2eb71b6",9.917710196779964],[8913,"93c1c5a167a41125494560a2eb53608dca3eae7815e3b24f5cbdae8dd68d5fc5",9.917710196779964],[9320,"6fa3217231ca8f253d086d3b78f67d5e1525eec3df07b3181dee2aec5a60c1c2",9.917710196779964],[19832,"aa68b830f79f58f68697e81a4d4f4164df8dd39792145fa606e5a9c90cc47901",9.317957166392093],[1502,"5de4013dd008d6909f4f15d7b89b42128175e1b1399bbd5cb11d3489608a1af6",9.317957166392093],[4700,"2c48f4f1d642ec069ee0b9106d5f0f0c9c4f0637db1cee27350dc458f8e7fee0",10.052724077328646],[4424,"d17a47ad9f356a5e8ae852773ab442db27d26c3f0bad8eacc594188e458eebe2",17.96672828096118],[10087,"2d1e1c4f9217b73b639231694dadc41946f8aa44e0a1b2b9120342f391f7ccbd",9.917710196779964],[1967,"5532115cc3ad2c6d36d408e2348601fa8a6dc351e417c586e2e0b9907a693af3",9.317957166392093],[9884,"58d60016dcd6b2fbea6d40c9d5c472c09d39e0affce7b0c8b95465544c7209bf",9.317957166392093],[7778,"5a06d5471bee5ffccccb47324d14d982c0ee71c23cccfa48ffcd00fdc455f4cc",9.917710196779964],[15532,"c5a2d4db397c5cfd1f18a55bf12e8e362df9c3844dd80b57e9c3ff5abdf74b73",9.317957166392093],[14355,"fabaf38ce71a044256f7cd97414d5be3f4531df50f9a465c724f22488705468c",14.26256077795786],[14608,"3865b5a581e1dfcec0c37e427d15b79a51dfc28574829805da7f823bd501f286",9.317957166392093],[1350,"45b003853f0d2daf3ad6e5d5387fbd2cc9104509a68bc0ad85f3a996f56412f7",9.917710196779964],[14361,"24009fb011862a1be0be6213f790b0122e889d88a39b9064ff18d438224c378c",9.317957166392093],[6457,"6f08853ffed9d1b240904bd3bb6207e36de5364aad50998ffc14ee793879d6d5",9.317957166392093],[19708,"10fc2c49e7fa2a62c60d419a14f6c9ec7c06d128e739e1eec7d754476f668606",10.044444444444444],[9847,"88f3449e066f855129c1fffc4bbdc8715f9a6c3148087798bac8c54a028b4ebf",9.917710196779964],[9895,"23de2e3bf775ac8bb5954ece3339b97ba0f87183ca1126100ae976e8747ff5be",9.917710196779964],[19467,"1d9d5b40047c84bb1af0112d3d71cacfc70847e0402a6daee6eee7ae5a917d0f",9.647446457990116],[14807,"b15894a2b66d283070fb4ca3385640c0129a055a1de735c99f7f9ef6af029e82",9.647446457990116],[3012,"a4d9c081d6d584a5159f270086d2b80a2a784df0453bb17c28b892b8a8cd34ec",9.917710196779964],[10195,"b223deebf0bea254977cf1b6142446cf865e4523f9c417b238539c14a39807bd",9.917710196779964],[16312,"ec7fde6ddb72162d09d399aec9dbb9a377b07887ab1454f0ab974bbd2ee1c660",9.317957166392093],[6256,"210dbe9d310f984a616c721b398b35029239aa8d81511fa576d8f4f457cf5dd7",9.917710196779964],[17825,"366fc2b8f37234b81dff575f8b8012c2bcaabf457a681a094a243b7077edc940",9.317957166392093],[4142,"f70dc7cb73e3c5ada63b551b67bda7b95cd5e438b85aa265cb2b962ba657c7e4",9.317957166392093],[8447,"0b5b240cfe0373b85c0ae92ed245e52badf3f8f06ce1281fa5ecb1b481da56c8",9.657015590200446],[18690,"08f25459c190e399f5ecaa5c4eeca494242100120289d5813177d9e72c4dad2a",9.497326203208557],[313,"26bf331823fe282982ab1d92bc900a97a7ec21eebe78ced6cd59372fbf2ceafd",9.917710196779964],[1129,"d690716f8f4eb1d140ff2dd69f9ffe09d32505c8bf8e98ebdeec3394cf466af8",9.917710196779964],[12471,"3de00c43cf427ff272d89de1d1a3cb5358b03ad4e86adf1399ea1a3c981828ae",9.917710196779964],[14183,"caeff3b9700657efd9c014cd84b54f553edf1a49df7d70e5d7f9eca2ca69c990",9.317957166392093],[9458,"0117e90f11c4cf5c3b6715d988793842a9f328ce2b4a3feaed73e41ca364f9c1",9.917710196779964],[4776,"0b1f35f7ee98e7ea837232b1803ce1df6a93f1861280449992363552575689e0",9.917710196779964],[12766,"5e81ec884d4900e3b838c6d834299151fedbe20e69a2063f111a1e35bca320ac",9.647446457990116],[10782,"936d282ff1e76d7a167d4e7d9ac20bfdd53b1860f713163473167fa2df116bb9",10.052724077328646],[3851,"01f3889a0359f9a881652c31a7d4c5d9c7687c004d5688f4ec9d84837fe2b5e6",9.917710196779964],[5197,"b0928c70caf11e505c53e36609be95f24ea4bf21a158bc0845ac5e14bd8cfedd",9.317957166392093],[15756,"5bbe0ed54d74c760ddf18b771f406af7971310475e472c70d5b6f196c737446e",18.003565062388592],[9519,"8f3293a184b2e7a854a1cbd948ee41b553b48def44641399bc3127ede74093c1",9.917710196779964],[11369,"562419a73d38540948eb5fddd3af4d7638a1090742e9e68f5c67b0ad3d8f92b5",9.917710196779964],[11039,"853fe323a04aaa842419c0272326a3684e46d683f7d26c57484353736aa9cab7",9.917710196779964],[14154,"999a1b372daa11a5e82a68f58cfe519236b5566081c3b55c0a7dbfe976db5a91",38.171171171171174],[5323,"8937d72feaf536f9a642b53cb8bb59335c3d6ce890b8a061b3f8db01b52547dd",9.917710196779964],[19652,"e132afffcf4bb2f0005bf6be03a014f11867e0134112020ab3a70581b7a70e08",15.003322259136212],[1180,"c4c1376495afefa0cbe53d74cda8f4b4ec61c2535a75570af61759bcb42821f8",9.917710196779964],[9136,"b230a2ef73948121d2d0530db79aa1249b1c9b83964d58a88d62d7322eace2c3",9.917710196779964],[17146,"2e5b95ab97f312715bbd0403cf3cf811545aee1b6940be9438bc97f6b67a244f",9.317957166392093],[3132,"2700bd3869fef7d0c4a7a625f7e5f6b76474816497337d28a032417edd9277eb",9.917710196779964],[8537,"38924bd6ddd5d6f5e01bc621122e61e379140a121fc62195e1db521b15fbcbc7",9.917710196779964],[3814,"694ebc693dbbf13d56bb61a349bb25cb9bcd120d2abd8d105010bf0b4d69e3e6",10.030959752321982],[14785,"d7620390c8ec1e5d09b982a8f84e3f6357323c8c0b3a435e17e22a2c1ef52d83",9.317957166392093],[16321,"a1a56247c0fc4e2ee730f9f261cca0e3fa6259f47c358f6156a9de841af6a060",9.317957166392093],[16179,"5addf2919438ed18b226f6af59cbef0c7e1ce8512d0c75c0b5610335d2046964",9.317957166392093],[19372,"b92d1eed8e06cc60cb804742d8d48ee9e8fc0d79fb662f5d9adfb81abb22eb12",9.647446457990116],[6981,"a3def81b6532a419bb87ad51d11f024e9f27f4c340c75a638c3554f24cc41cd2",9.917710196779964],[19140,"70c1e06935ebe0ff02350445412e6ba4c5e0ca9b29a5f38d83f992756637de1a",9.317957166392093],[18859,"17cfe351b404d852b882fc21c60e2f93b912241c084602df375c2ab04b21c524",9.317957166392093],[13284,"a395855d1dd6908ecbff00d74ea3deb35c9feaf50db61eb3de1ad753e8d2f1a4",23.90711175616836],[17661,"2eec7c3f066e466e7e425ad3fb9cd9ebfc8080f5e41307bb44ef808ee6cbe943",9.317957166392093],[4612,"ed5feb0f2d26adbaa3b4b5dcdf51ec728d0bbfc6e3f2b186164eca4e94228ce1",9.317957166392093],[13926,"e11f79744e92577ed4f9468671df49fc6a0939be2a99052ad1fc869721b86c96",9.317957166392093],[12405,"f2db8a3272f0dad19a08095f5639eae02d1887a81a46087d6f5e064c051694ae",9.917710196779964],[2076,"991b83f19416b2032d5738aa9990d528c66023d052299cfd8f8f3eb5919e65f2",9.917710196779964],[14644,"64ac62dc18819e20bd35710a97a06b4886b058de83ef9e176e2ee7cb070b0986",9.647446457990116],[14535,"13a08b2c4df67d90df1ab4a41caf90252e2f3c2b40b0d5b4090dcb4df6ca8788",9.317957166392093],[4655,"ca8d40c8ee18af1604687684013bedda7d158e92920db1bae4d4907752ab42e1",9.317957166392093],[2042,"70ab5c2a05accd55667c8bbd9cb2599a2ac8705d1405b98b5ccac481318fb1f2",9.917710196779964],[9664,"77dbf6d69230c051e1ad17857ed8991fd850d6ec60955a478b31116944149bc0",9.917710196779964],[13789,"6103a3521b2fe479a8f5dbacf28fec19806ed9f15cd90e05bffdd3a3e8bd9899",9.317957166392093],[2084,"d09fb2edb8863cd641143f1237d16948c5ddb385d37e90c190162cd4271257f2",27.066666666666666],[16491,"dd69d577c4fb2b20e72bea0cec6d4fd3f39a50b1915ca622aaa9d65718e7665d",11.530249110320284],[1579,"8c77d9da167b21613670007ac682ee92a1323d06ba8c5140e3302436bedea8f5",9.917710196779964],[8372,"f6e71398b612fd9093d9e66d7ef0660099dc3486415af88ad32dfd80e948cfc8",9.917710196779964],[9494,"eed6077e039e29f04a5c676a6abb982e308bc7857aed15f46c61886609d3b5c1",9.917710196779964],[17285,"b4125e04f90186417533a8efec8ec3873946c32a2cc38edd9a7cb80b632a7d4c",9.317957166392093],[17501,"746ea8344601d64289eb2b3f56768d43d9be2afb6249f1c0ced73101d8d58447",9.317957166392093],[5690,"658db390ccabef205c1f574dd5c3480aa5a0708f164e6d5763175b182a6c19db",9.917710196779964],[12420,"a8ef3a3823be798188126f12a6af34ab107c9c23ade62ebe244ac91a411b78ae",9.917710196779964],[8683,"c189712da133491cc9df111613fe1b7854afc144e77ebb8756d21cd4a30fc8c6",9.317957166392093],[8502,"35bec115e2a92daeb0ae24a8ee4378d4ba5e31853816fee277633a76a3ed02c8",9.317957166392093],[12150,"6dde5d20653c27377bc8b566dccb5b3bc71363968d2458d82668ba848b5e5cb0",9.917710196779964],[14500,"fcd2953c86bc15325ffcb060eadee2ed4d18e61cc7c2764aa20841ed0c094489",9.317957166392093],[17120,"0a5fda8360771d1065c9c95fcda3dd4c1505309d2caaf5bc72ae502ac821954f",9.317957166392093],[2354,"d6bf2c6af08e9f62a09747212f9deaa27dce6266887ce9a77095ae8c452bb9f0",9.917710196779964],[15841,"715a19d55c34c90c9a0be11d837cff833cc471fc26c013a1236e0e1a004b806c",20.11627906976744],[1980,"52fd25735c0fe58e629406d815a410cecaea7dc364a47072663beb7a688122f3",27.317073170731707],[16413,"f90d0de1c0d3c7864fc2e7d3fbb63d5d238e64bdf5a3ed39dedeb2811e3adc5e",28.09964412811388],[3724,"f9cd1e2a7c9d000b42335fea85e1b1284bd3492176e83856647dd5c1a7d96de7",9.917710196779964],[14848,"ecaf52da240c45ab544703404c7cc14b41f078c42800e9e027dd24a46f41fb81",9.317957166392093],[8041,"ce0286deac8b1a7c50e86a16332b3d07a9e9d5b0ddec3afd0da01fbf85bb4bcb",9.917710196779964],[14252,"866eced0e6c725b302286c7914475b3a49d7b65671d42e59182abce2100cf48e",9.317957166392093],[3103,"47b489a1e2cdccfdbd5976ca4469bb90cf05441d39868b7e94155403211ba2eb",9.917710196779964],[1123,"2ef56081a189f627f96b5c1d7596ecf65541f2b8f036011631a699d7bf0072f8",9.917710196779964],[5773,"0f5471eaca5c249a714cd461d456652bf2d282719f82fe406554526a9c129cda",9.317957166392093],[2762,"cbece356d04a88511d21e043c810ea4ee5a5d5086ea85f772c20feed4b7108ee",9.917710196779964],[9517,"4de57caffbaba1ac70d03c9aac2b96a226d10801fed1c5e74661385a4fa996c1",9.917710196779964],[1303,"e4a4381a81b72701743cfb384f4e3d93612ab3a1dda6172d30fc54635e0b5cf7",9.917710196779964],[4745,"d068ecb050f959997b08c5ebc5bf282d81ec229f2f62e7725c67aefc22eaaae0",9.917710196779964],[17124,"c4598ddea13b6017859f42e45cf38e65b80378f498286e963b9917476a51764f",9.317957166392093],[9425,"fa1f28930b9d70d3187566571ab92aac7a8fe466ccbf007d4a055af3f6402dc2",9.917710196779964],[17962,"718d53dbeb51ed1b6fcd6e06b05d35174c096a26d4f21646d3c0193d2441e13d",9.317957166392093],[8554,"a9868456ddbf5ae7a08937b02d34496d0652373570db8d36c1ea4d657e35b1c7",9.917710196779964],[14575,"e1107c7c65ec97bf037f0a26b60e283aba8b84e710325d6c19254781ee6b8b87",9.317957166392093],[17177,"5820e6c486fd072c051a6a4854cadf966005c00054fad6ce7422b1c191ac4b4e",9.317957166392093],[11335,"47d185b9245698bca0c233c1bff4761bb860f6c92e15233b46cce2b7eca4b9b5",9.917710196779964],[9240,"049191b7156735aec76e6c33e645c20ac0772f7d8529e1015394b32a4ce22cc3",9.917710196779964],[8446,"fdd5eb37ebda21f902d410e0986bba5c60f07c9697a7735dced241bfd50e58c8",9.317957166392093],[3335,"9ee6a9b707bc11544149a5d6d2b6b89fce96da9d299de4b54f21242435931aea",9.317957166392093],[16052,"d2eb0e1429b90e4704d2c840b3acbef187fa569a09a5ef79f5a34eed503c5e67",10.051282051282051],[14230,"1906fc47e96ab2cc726e7117407aa8da258b7c04ffe27e60990c6887db25758f",9.317957166392093],[1814,"89b7940d8be51b6fb3e6a59eb6b2d4320c1a661bc2ceff068cea7b62d17725f4",10.052724077328646],[10921,"d2b68775a50a0aca8d43f0cd4413f6da8eba7f3f57cd325eae6f83fc5c368eb8",9.917710196779964],[18328,"3bc6ae307d6e0d64592e0060c2d15f6d73dae183120831153f3cd07a9f174c35",9.317957166392093],[14833,"25fd54c3ba4ef2fd4e07f99ee304845e91bea55ffedaf9f649263c4e75303d82",9.317957166392093],[16670,"d7775cb4f8d0e57f05e044f9c008765bdb84b646aea54f78cecddb0ca8984c59",9.317957166392093],[10335,"353b86d2c0702472baa679c853b066631736a8cf479fe2cedf4c030f0a421dbc",9.917710196779964],[9063,"0de24cd7349cc93fdf0c61de539ba40c3acf0fbbed50615cbfd19a8a219362c4",9.917710196779964],[19357,"6467c4a2b16a4db53960801cd27abf3a051a0c90d955d5498198399f93026713",17.53846153846154],[5421,"d9d25f822afcd6d24a45db7ee687ecf8ac642765e849e9055143ed005568addc",9.917710196779964],[8230,"6818c09f907e1bf2a78401cab966e2af7ba0809a5087e88ba9e1ac5d449ebdc9",9.317957166392093],[12089,"c21365ab9b449040d42a0c77ed62f2139bfc4aed24bbf3e581a93046830bceb0",9.917710196779964],[563,"60f72e02c802ff95ca9cc000ff60ceefb22181bcc73a74d36c2aec41a1992ffc",9.917710196779964],[12212,"8fd98e795fe907f42f30c886e1a2b37261e9a049f4c509939f4a76d199f002b0",9.917710196779964],[9135,"761ba23b967bcac6104255deafbd26531976d91525de0c1741a289f7d941e3c3",9.917710196779964],[13662,"0a548400f41f612a1e4edc9f6e0001b3161715436de19dc9f483a59679ebf89b",25.88643190205109],[4086,"5627e701e91f350c056d030883c9375161053243354be7c282bcf07088b728e5",19.259580621836587],[98,"3eccf0dd2bbbc3581eac1cf99d652bcc3ceaaf51fb4f271e61ed3a8f0b5464ff",9.917710196779964],[13900,"6f35f6fe6ce0dd1b9bf71221e13b9dd0b3fc53cfef8f3c01e015d54191ee0897",9.317957166392093],[10187,"82645264545b9a51fb54203f45297821ff9e88cb9d66b43a43bf540789881bbd",9.917710196779964],[11975,"b13365372e9412ba82893683c5e3ee85e0d7ef588b8aba83243e22adbe4678b1",9.917710196779964],[17940,"8db2e3ad5bc866a696ba3111120180503ab976ec8dd34e9115ef0776201e703e",9.317957166392093],[4819,"f29a6b5eb1b0fdecc8e2b9d5852783ee03fd36cbcc352750ce5b7950747d4fe0",9.917710196779964],[19475,"66944caa1d4cd8a241afeb3ececfe1378183dff81bba402fac1d5e4b3080460f",9.317957166392093],[10042,"9370c7359da68572ec881d3e8c1e6fe19f4e0a0e5819f66dea2554f999c115be",9.917710196779964],[11096,"8e655229babda57f51a0e56d79c466b3c360f9d4598fff0b4381c5ed86c045b7",9.917710196779964],[17499,"e98ac78ae7e93b625ee30bf7d73dd9106d921c264426a8d045594c342dbc9447",82.29255319148936],[7764,"ad48185d76f98e314fb608fb6ca6d6133ac6f3c87931d09bed4822ddb68a0dcd",9.917710196779964],[16591,"2e3ed67ae1c898b7c5b578ce55741e58386f6f09b56dd3880dc3348145d31d5b",9.317957166392093],[10689,"c0bec8c36dd0b666a034043e10f6b348a37731efea4eede92f9f3494c09813ba",9.317957166392093],[7169,"b152a1c417d1b309ed10d2c750dddad24cdad31208dd4833a79e9fcccec1e3d0",9.917710196779964],[2912,"70e0533dc0c6502ef29849fb6e4bbc494a1905c07efdefb2283502a3537bfeec",9.917710196779964],[11520,"183df26d4b8ebaa1841762e8eda24bd9faf3a609d8c368fe5e0c3cd61c6264b4",9.917710196779964],[5330,"0183d1584aaa4dbb916983c5f62da6e0fef99ecddeaabf905508d9c3b4ff3cdd",9.647446457990116],[3305,"04b358a7980e777a6ab52fe3417ab63133c7eb302144dcaf139cc017d7a558ea",9.917710196779964],[6062,"b64661dd520dd77e501e0ae4ab610db6e54d28f29818e5a77f81dbc09fffadd8",9.917710196779964],[6030,"979b119ad5f749c039ce16c04ea6d5747e5334e9df09bdc459b946eb58b6dbd8",9.917710196779964],[580,"b2eee5611d87fe30fe1db30ce04c0aac3c6fb33ea596576b9b1f2e2448e40afc",9.917710196779964],[9271,"c0ce5a721739b50dfe6352dc26dadb12a440fef8c57819a99c7f95ea6d1108c3",9.917710196779964],[15599,"e8329d14befe457124a55c1dfe778e09aeb5267dff67eb2b5589941162076871",28.097560975609756],[2006,"5adf3f3408ad5f7dbad013fdfa6dd8cef9eb7ce5f7bdb64f92a3cbbdfb0ffef2",9.917710196779964],[11873,"500454843976b06fda9bf42b948700b021e229133600bdbadb492462c3a33fb2",9.917710196779964],[3311,"50113b1fe27fe682740af77c92f88420e9655a162d74d3b19fc8654a15b34bea",9.317957166392093],[9048,"576256cf933d895be4e8769448514d039bf03f634b8661fbe6c6dc647e4f76c4",24.557894736842105],[17519,"4d9d8e9803c852254627959abe7bcd7d712edf74d22597bf0e197c45c9782b47",9.317957166392093],[4119,"4b68ecc1c288b6efded964c7031d43158c4bdc349366517d48754ea5b781efe4",9.917710196779964],[662,"fb0bd7f3b766c6d1b5ddeb433cf35f70d4c970236a41f557b8b58466358f80fb",9.917710196779964],[8459,"dc7f10297dfcfb31e1d3bccbec8c3ffabf9a42e185505207a2df9c4cf2e043c8",9.917710196779964],[16959,"210764342fc671ce7b483318c728d070b1758f93fa42f15006ead3dd9a78fd52",9.317957166392093],[3744,"c99b6e24daae049d882d63fd4fdfe78a802e68581509f048eda332b104e947e7",9.917710196779964],[14934,"704066eddd5282e10ad162f91a97c55fae38e1f7bd2a38ff091a49fa7de11f80",9.317957166392093],[15316,"f97019ba42a15b8839d4ccdf174148ae261dcba920fdb264841d3ac25ca10478",14.375545851528384],[18378,"8d79cf560f12c77d36a915be8d3574054b1435288036e11122a19fced7af1534",9.317957166392093],[7409,"1829c7338605d81d24c49d19d1b2196fa44d56e008bf3b0ab3411c14ce7957cf",9.917710196779964],[5602,"3eba29f722517f9c1444546ff89a25703da74c1daceb541b9808aefef52f9fdb",9.917710196779964],[5939,"0b6ce927869fc452148777b2a78f463802d5f4279d0033e863864e03bab674d9",9.317957166392093],[13597,"7bd575956343f6f87c9683cab646b298d48867bbf4a6a2344cf319fe3716849d",9.317957166392093],[5731,"2937c14c8a83002f7cb6dc81057b3325d5baa898974c18cfe0fddc1c9880e1da",9.917710196779964],[14921,"d70f163e0812b9782d6bad7dead3355a46d2f5679de0ba8e96df5a10c6a48880",9.317957166392093],[3425,"0d3e988612dc765c4e90295cd963e6f8f165c1fd020c309c999c5dc6e2c37fe9",9.917710196779964],[17322,"ebf38157abc810941a1fd5aa943d83e4fb320fb38a026d8b40922a17d422754b",9.317957166392093],[18229,"5c0d5f7b15f8b455b67f53891709a21ecdb741e0474fa35ed32b18a163b35c37",50.01961553550412],[13359,"d6dcba54b9f070ce4df7fc46a607080bc771c5e1ac3a5429f49dbd01195744a3",9.317957166392093],[8407,"527110a85cb5c35336585ebe956d06c44cf105bcd0bcafe3431eac3e9f6b91c8",9.917710196779964],[12869,"79365695053e57373de40601b412dc137d1951ad4c85ffb61f34af34419771ab",9.917710196779964],[13447,"f4db851b96045455ebd8da2ed20e51d3258cd2824702c5a62659131403e617a1",9.317957166392093],[1978,"f65ceebddcd4cd71876cc90190913de5d038ebf0489104e75f20ac6e02b523f3",9.917710196779964],[4652,"3b557246310176dca2c255efe609d4b0dc28a31f7c0c6a0ecd406721451349e1",9.317957166392093],[2064,"858b09993688ea7da448ee5b8ab52ae4dde312edf177f5419c24d51943ed75f2",9.917710196779964],[5445,"f7c56b3c23111db1765e8baa49330dea0ef3e77ccc3616ab6b25e823b70781dc",9.917710196779964],[13849,"6dccbb687498a01316d207f76e6455e28ee4f27b2734ccd5007491b81add6e98",9.317957166392093],[6500,"8bb6b822f3bbae4bc29974a77b22db675ed714833a1bf4210186fafb1ace76d5",9.917710196779964],[19633,"0d5b8efaf5adb33944ffbee1d92070048f2df5d715dfc5cd3e8835ef886c5d08",16.97508896797153],[15208,"e2b15b5ab08d6bf7730432b91247894193e9d99d12c9e1949a7c8535f465577a",9.317957166392093],[5273,"b38171590931276e186da96d83d78e87e1fdfb92a71cb4ddff3c1b253faf90dd",9.317957166392093],[500,"013b01039c6dbce47d4fdf51903050322de453ff65622f0077bc8c389241acfc",9.917710196779964],[15559,"8967de171efd32c5917a532ef0060fea019187f80bfcf903eb3a1a1168c19372",9.317957166392093],[6606,"badd8aa8c729a37d2e7802f4f8dd607bf34eb7c0c8ca91ba8cfccdaff8e49cd4",9.917710196779964],[526,"6d033b5c1f4586373afac965c90c91202da8359a7daea1f4c0e1d15a36317efc",26.09252669039146],[2280,"dc89ea735a2152fa1a12f6e5a5a8e2de752334a83eac962e1a50b3a45b101bf1",9.917710196779964],[19442,"c2f376f09586ba8ed43831aa9c12c3ed039db4c309799895b3d5d13cfb500510",9.647446457990116],[15484,"a9c99958ba37eec84c82f8b8fac5ab1ab90d4c1191d52b7949232ad509cf7374",9.647446457990116],[3214,"17be8d6ec876eec233cc94165d40a3197063ce7dca5c2985f8beece65669f7ea",9.317957166392093],[3789,"2b01ee40bd7da90246b10a4869a0487ebe4f72e48069d37997a1f9efc22d05e7",9.917710196779964],[741,"6c627e8f4171041b8f1b80accbf3b039a27ca5e8a4278f9a3d44c6fb47d0f6fa",9.317957166392093],[3160,"387f0e461484752b97854d74c23ee5f0d2b8b5e294452c1c0897d3678a114feb",9.917710196779964],[5744,"b2bc6bbcedf6a9e1f5f627582a039bc8ed49526a20111c1097518f18b227d0da",9.917710196779964],[7892,"d4a731b2e88fd80761330167bed35d14250157e4ea0de31489ba0d7699904fcc",9.317957166392093],[9118,"a91773e9ab376ebc3ffb137d7d513c046a471897ebffca82ed530833fdda08c4",9.917710196779964],[19444,"e2a184b5990939d1960dc365311e32da5d1a78b894a09bc24ddda88840a2f90f",25.296310384176493],[271,"35106c2ca3ce3c3c2d729cc40adbc2874cf6f3f02a02e1691d88ec16de6022fe",9.917710196779964],[12599,"e9c514eb25addb654b7bf8d369f789419995ebd71d85f6c4a2cf4287528447ad",9.317957166392093],[3680,"d550f67822274b809089366538da60715d7a9fa2d3d3f03b54c9456740dcbce7",9.917710196779964],[7083,"369f06aad6c78216834276394eabc9b8b1ca826b22ee37b225e1ee49957171d1",9.917710196779964],[18046,"d707ebe3ab2656f6bf4d4e1db63d7661272354595f7688ddc4b90c60ebb0623c",9.317957166392093],[4411,"93b0a942a6adef9cdf9c5b7d3db482deed9f87e747ce014756186dd6ba7602e3",9.917710196779964],[3671,"35a7adf238a018198ab8c4da3d4161555cd0f81cb83450d51f28c8ab8baacae7",9.917710196779964],[9890,"217df805071c7b852792e8f9f82584516b4ed0b94e70edccaf3d169db1edfcbe",14.50943396226415],[8602,"cf720e28488813e20fb1b8ac80ec62243c4ed599c85dcfe949383bff428d6dc7",9.917710196779964],[6535,"01d00fe90e63bac9cc884fc58ebacdd3dc0a6cbca193e6dc324d408e529828d5",9.317957166392093],[16148,"e84097b9b57df70edb2639dad6763d61c0e2f52ace4c0b7bc9db42ac1da21465",9.342789598108746],[17904,"c8e03a71ce4ee4f3b415459a7bc5136a277200e76a296b2fb49a10d1b74f243f",9.317957166392093],[6218,"2c2e11aecb575ddd933ce7480cf7e99b8599777ba967ca1cf59c08086b039fd7",9.917710196779964],[1300,"1b4d9f27007d5c1e6cdc0ef2077c151246120c0776d7c9aca01a77c6c14860f7",9.917710196779964],[11136,"9ea36978f14a1e6e2c8e6e7961e753f61ef1f714f5cf6ecd96115b417a4c0eb7",9.917710196779964],[8787,"27351fc5b87db6fa2b0c6b28bd105426e0ac8ac18320d1bff2f8b53f7c1b26c6",9.917710196779964],[17754,"0cd233839219436af2b15c2201ac5c4ec2ff49471b0334f6a3abe6dec0522842",9.317957166392093],[15075,"bf658ce7e8f3b4c92c92f2cf9a30e61b04eea5ca551bfe6191abba7a0e63207d",9.647446457990116],[5236,"117d3f3a9730909f5626c1cc38f7a40df8cc37f9b81cfa6fc4afbecaa55bc4dd",9.317957166392093],[16778,"7d423e7e38760d907357678921348eec8a05982882a2abb9802106eeaf61e356",9.317957166392093],[10715,"82329b94538fc8a7ab73b5ce8fee41e40c336dd641c3c98988a6e51b338aecb9",9.317957166392093],[1463,"d68242bda218ed39f6bb66a9445b3b0dfdfd68089cf1f6d9f8a1208de9cc6cf6",25.956989247311828],[7286,"6eab19d1944d4c6ff2ada1519b2dc0e342872436286c0f82e93c637ecd7527d0",19.0727969348659],[732,"a88bbcd225e77e9937b503ecae54b0c50ea1bc12b6ca2ce5476405747a0203fb",9.917710196779964],[1306,"bdef670b12881984f369b47fd1184d771ad0a1117a34574474b06fcc8ea758f7",9.917710196779964],[17789,"01b96dd38c16ac85e083324f65fc088f992fd90c4a3f37e021eb315fdac88841",10.052724077328646],[9138,"be23348fc5079e929574a94e351e04bdaf8d103809b562ee65a345adc229e1c3",9.917710196779964],[2329,"42e519ead126aca07811a0b25e35e9c46393eba2b46cacbd12ea23458f04dbf0",14.95187165775401],[6915,"045145f290acafdd48e4aa6f43e4bca526121273e4c79d604464e909b1ab7cd2",9.917710196779964],[14745,"8d3e7ce9eee735c6d0d1fc032345a85eb6c2ecfcbf53f93b90b0e78ddfb1f783",9.317957166392093],[10490,"0f28309f07932d40ca3d7be81eb65a1ca96c91a86382c576dcc125b1861937bb",9.917710196779964],[8698,"9d71c4f330a17474361e6d74282c5cbe6cb495e1011777babc479207b7ecb7c6",9.317957166392093],[5159,"dc8417be85c27ab3afe5c9dbc8e35de7951d0b5fc0711ce162209e7373933ade",9.917710196779964],[13328,"cb5597c1907b0fc6d32197e6ac59ee318f9e8926b96a4f1f88219c532b1d19a4",9.317957166392093],[772,"14af83f1b284363da1b641b20bb95ffcc07433bbf8cfb94d1f6db5c1d453b9fa",9.917710196779964],[4337,"42f2fcb6e0605a42b0f73991071d1c8580733ec59833a5fdb7975ce1870d84e3",9.317957166392093],[2190,"466c0077f78206ff0ec21ccb191d45b094878dba696628632c5e8f43f6c49df1",9.917710196779964],[8607,"4b31ce607dd15a1d301e7d9d6b7a9eea5fa3013e07753939b47e3f3fca8f61c7",9.317957166392093],[5401,"12756011b014dd08ff23da408186bcb336139e7a906e08a88032d732ae6fcedc",9.917710196779964],[9931,"644da34ff8f3547a2f37f11469aff90e26b717533eed440ce42d72aeb20dc4be",9.917710196779964],[9632,"9068c305ecb6d007bcbd41b9e2da4999ee52db70b87978db5bc58b25adbfd7c0",9.317957166392093],[17481,"77588255f580e5a5cd7c16aefeb5edb63077e6cff47ef113a1575d6f9b690e48",9.317957166392093],[5333,"274884686e2608052e4c682c55b6ccaf973dc5e66345f115eb8a9d5356893add",42.05309734513274],[7046,"2f2bcd918c1a023ab1fb11f18e22114a036d681c832b0b2770b6c3f5053bb1d1",9.917710196779964],[10709,"37995672f397cf8b97e818584a7e81fee36ab8728ec9de6e6c82cbf4fe6ef7b9",9.917710196779964],[980,"159a10f029f00cb9b4da6557b8478581b1c1d99ea8e00cc236f46cff4f5651f9",9.317957166392093],[9844,"894ccabecfdb255ca833039be5295ba7870c59d4b09b44fcf9b8d0cf3c6b53bf",40.71301247771836],[4806,"3fdfca9ed57bd23776a39a83a3e83310a5ef8c8c99114d33ad9d8858539a5be0",9.917710196779964],[19647,"c459a3f766ac29180694e0d8b966d41825824528a467dfc002df2f8a663a2008",14.820097244732578],[18853,"e28cd06d7b2400ebd4a94d1f3d42dcdc0031eb02910754109056f7e9a7cafb24",24.296511627906977],[8117,"f2d3721fc00c08708375f117928f25659b4e6cb778942a1e03db3d05819ea3ca",9.317957166392093],[10424,"6f83d790c89742a3df55bca0476a951f19d23676647e718abe609abbdd39a7bb",9.917710196779964],[61,"d7c0cdf76639a402b3568988accbe85a24daca174be3a6dbab15cda6b5ff91ff",9.917710196779964],[8426,"d718969c6995107f8133e9f3ae70506d0af848934e15a3c317e6426d0c6377c8",9.917710196779964],[6293,"29b217cb9a89b3a13c4e422108bca27ad36b89989b15b2217030920a914916d7",9.917710196779964],[19356,"21350671981f4c9e20a0907c7a930b5bd95557b08263b5ba007f01cf8f1a6f13",9.647446457990116],[18173,"856fd65a42ca577e009806dd4080781c2be5e9945b74de41ea4113a0acd6d538",18.130434782608695],[4665,"443393894a2bb7f738f0d7b542d0c66c0c2a94b0db94a3339293e9df0d0837e1",9.917710196779964],[9175,"65128addeb555601c688c4dd7afa1164ca33bef0860c3c1e3c98ba47e37eabc3",9.917710196779964],[3821,"16177ce0c01febd53b10562767b265a4fb2f3693e4e2e53b368b17a0ae76dbe6",9.317957166392093],[6076,"bb7a0b297fe793ffcdabaf9e566c650ddc6bb36dc309f66c787441e94eb18fd8",9.917710196779964],[6405,"7f8bc070f78605a856928519979f4b361fea481bb0aad5149deb059520014ad6",9.917710196779964],[2021,"4331d8a0ee1fbef1f1a88045cc095302e5fd2fffc6f9e0fc806222b08fcad0f2",9.917710196779964],[13011,"e3fb38e5cf85284025505ebb851bc7454adbd8ab680a6731a6365ecfc37481aa",10.052724077328646],[17720,"fbe7cd2cd829f6dbc7da8cddb793f3793530a9db5c3409989b5f764ddba4c842",9.317957166392093],[5362,"c1806b6a7a393b9d9924b958928e36bbcbf60ded01ef6712dcf7cd2237e412dd",9.317957166392093],[4815,"db83efcdb38d7c93a4dcd587c1ceb8229039fc2d0b845679ba4e0584b00754e0",9.317957166392093],[11529,"8816f390a70f07673451f6a9dce3f75532b818884844142c42fb5ca3827c58b4",165.6108597285068],[19511,"83eed36344c2d754fe59e3ed5443fcde9d5585e6106359df68376e36cfc4f10d",9.317957166392093],[11264,"e2b24774e186e3eae94b38f3d24b8ad60da3d40e7f4edbc4975f50a8800546b6",9.917710196779964],[1364,"2e8574876f6647820ed2345ea29c6c400131bdcfb6b8526b4891106f1354faf6",9.917710196779964],[9455,"4e882c4d4dd459d13f922f8d4c814892cf881d6d9b678645fbe840d079b4fdc1",9.317957166392093],[5491,"98e49f6cfec575ac81acc98f77afdd0ddfe40dc58d28c9bf2b57dcf54ed844dc",9.917710196779964],[6772,"3195f70dfe10219c0e88b5c89cae1ce67a80c8eb5cb81230b00e0fe5118978d3",9.917710196779964],[9283,"9f8978e4dc755854fbff3bd0d3af06505c2022144f832253d732dc840cf4ebc2",9.917710196779964],[15279,"92bb643880bc356736571aafe7834d911dd088a0be40259c23ec48ecfbd2ca78",9.317957166392093],[3580,"6a138fc0b2071dd92a81baae6d16577c9e040c6f9e92b409be24bbaf29b36fe8",9.317957166392093],[10350,"82b38134195185fd8f37ea3dc5d83a59833b72bbaa4dbb12bd5dc9c3a9850abc",9.917710196779964],[18122,"08828cca76a0eeec163f6af637d2a75d50582317387188ef5b6ad4084627693a",9.317957166392093],[16550,"b01a126c1d5124916bc2bc83aca397d47bd00b9ecd3a51c184fa4ca2a2ba025c",9.317957166392093],[16129,"3e3217bfcc13c5df524bec370076ed5468d8940e368f8e75918d93d28bb06d65",9.317957166392093],[14055,"2c76c4e78b2403b0dc44c0533223650493249694ebdfa2a4c03bcdb80d2e9193",9.647446457990116],[7223,"98e1dd9c2ae843338f0857bcee0a97c260e2f1e8919388e04cccfbb58ea681d0",9.917710196779964],[12183,"d292ca5c0477f26fb671c5d520e7781814fa00034ea1c1d0edac9b93015928b0",9.917710196779964],[1483,"f3a948608f89a30c38c79f6896c70f6f1f8d0cbf3808fa1e203eaf7f59883bf6",9.317957166392093],[17181,"53eefdfe4ed9f775def155b0b61bec02095563d8c785bbf56182b4a4f304344e",9.647446457990116],[8408,"baccd6fb02be17d057d6b46bdcd1145890f1bb95fe686c8731ddfee7ba6891c8",9.917710196779964],[11246,"3aace3ba59120fd5e914020147dee9470a562486d101f3668d8350efec8b5eb6",9.917710196779964],[1893,"9e161c58b85e2ecbdda02a7af0d9430b041025b655115084bdc10b7a3733a4f3",9.917710196779964],[18066,"1629460205092125c89be1b89756b5b2d1d6175c712f9e8a78626db69812d23b",9.317957166392093],[2286,"47834d18a6f7df4339fd5078060a012720e29f0f2e03e3fa41ade96d0c2510f1",9.917710196779964],[14523,"0f941d50223b47273bb3f3b07d5330d77fee7a4956615789523d0de9a950b288",9.647446457990116],[2549,"f0c233a5f181833094572066227eea6c91187283d7d3e0867c235985b4418bef",9.317957166392093],[9075,"8c39c65e0b144b49e6a3f74d81f0f0bc4ff352ce869ee0675453d66c967e4ec4",9.317957166392093],[2771,"e4917d8b1bf1c59a45b475187c82bd14d9798d46696c79935d2acdc43281f7ed",9.917710196779964],[18909,"b729e9b8ee44fa11a60454a2fffcff7e88eb830380db70a00cbd8399abf90c23",9.697426239799121],[17206,"07fa4dc644b614a87978eecd667c05ea49b52c6802d154ae3283947f24ada34d",9.317957166392093],[12304,"a4bff77c14a573d0b00f44f16da0a78a0f20c723052ca8c5804ea58a5ea532af",9.917710196779964],[17920,"f7803dfc1bb079609498cd09040d3bafef354cff2964b6166dae0376a5c4df3e",9.317957166392093],[7006,"6bc7f9922a4aa50635a1bdaf86b90408997b779f9fdc4a9bbd1bd8cef1e3f5d1",9.317957166392093],[5428,"8e662d92ce040f8b7fd738d3da9b4c9128c70c0b1d3bece21697d16814619edc",9.917710196779964],[15810,"4bd02c1f0a6837d9e1d10c2cbc99b17ab5c0ac0ec199bb9e1a6c4560b274316d",9.317957166392093],[17864,"6b7ad11926fbf7bbb22dacf7fe77d480664d561a1028d329c24c862b5492e03f",9.317957166392093],[19026,"3194a3310d8445663c7aaec6ae48ae4426106788cf068d83f30c1ca67c38b21f",9.317957166392093],[6980,"73aa4bb06c43c938166d792ddf742cbbbd00e73f12a5c802c77decfdf2951dd2",9.917710196779964],[7527,"3eb6170d0168b2d5fd102ceba55f5d06eac49309a94edacb02233b2dda689bce",36.08275862068965],[13138,"1de3c364b8fffda18d83c59dfd3414fc1cc047cc53d61a6c1975850de26d36a8",9.610983981693364],[4666,"8a925ab1d9939ba9931d8f265c4f61efbc4208949a2490c6991354b1620334e1",9.317957166392093],[6433,"df7fb2aee82cd6faf14e48913a90494a6173e84a0d32441323a486031fc70ad6",9.917710196779964],[2834,"899f23e695cc2d0df56630dc1c73874e6a88ec408fea7cbfbbddfc7e2afa70ed",9.917710196779964],[1140,"a0d7ebca7cdcd4fdd279d3089f16ce623a2ffca53cbd25ea848179e368975df8",9.917710196779964],[12754,"ca734ccb2b40ec255a918f6bba36f122891f0de888ac8189a1809435aa7c36ac",9.917710196779964],[14222,"31a89e1c52536fc3b2f0abff0863ef525a06cfba8e879f4b1291ab2a50679f8f",9.317957166392093],[3190,"10b01741a014646cd7bac2b3297df22ac89e848ec9f381e11ca9d7225ec417eb",9.917710196779964],[18558,"95affc8496474885d00a5c2c474bc0151e77ab2c57763c6ced0cee903b6c3e30",9.647446457990116],[19727,"195ce15bb0d4bc35ae35ed79a55357aaa863ca1493f88c498b709af939b0d305",9.317957166392093],[15016,"66f4e63992bf182537b8352ee466defcb7454dd564ab0a867d5a82ca675d0d7e",9.338112305854242],[15963,"53e9f06b78203b9d62fdf5497aec45a6ef6a8e9f01dbd1079744c33452658b69",9.317957166392093],[1706,"35fe8da8615fe84306007126dc9296326d07a42b3fa5f9dc89aaf0819c46e3f4",9.917710196779964],[5031,"0e60fa09766d5de97188aabc528110d5e17538c5170285081a7f9461abb8fcde",9.917710196779964],[9798,"0ce8467402974c764b2e295b31379cbaa1765ba8da52e50fc103fcb63d54a6bf",9.917710196779964],[17345,"6474e9717e7110148975e3c42ce570f8573b587efeb9ba49e2abb1ccc7e4f54a",9.317957166392093],[9128,"70abfe169390d396766a755b4e5e71105e33b2ab9a734b8ec8cb46f0ff8ef7c3",9.917710196779964],[19435,"bcb178bc621219d10e37b8fc4d79285cb5298035df2e014c21e88d79169c4910",9.450184501845019],[2231,"49d823d445d079a28be389214c63ae7e59610237f94bba16b84ce930052a55f1",9.917710196779964],[7944,"28df68fbd08140a5b4a25c4fd0db825b493f2859f5af303f49931f68fa5ceecb",9.317957166392093],[12332,"1f893860f06d1d5ca4be5cb048ab9530710ca53e7b5fc00113dc7a6ad74c05af",9.917710196779964],[19661,"8dcf63c6c626f873799b3f27f7f1ad15d8917efb45008972e158b9c39337c207",9.317957166392093],[5146,"a6efbfccd4de01d1a7cd151ec76bc8169fbe1b8bf5e2eea42b74db3ef88f52de",9.917710196779964],[2858,"ba407691ae6134419afd637d4c03a752b8acd8a3d0d1a8ff762efadbbe0d58ed",9.917710196779964],[18111,"2debf53c26333bb9a3b2de91af52135b0513de0e2dbfeb1d35c60666f67ea23a",9.317957166392093],[13587,"c6ae35250caf7d1a6bbcdf3d1e1be03ba7c4c02acc823ad666b0950d50c3c59d",9.647446457990116],[6325,"e94d11f0f0dabbcfe15930080179ca18542b1388473cdcad4ee8b2f8d38ccfd6",49.64383561643836],[12303,"68e4456145061482b5f9cefd3209ac7c6093c72197f10dcf367ddd2257b032af",9.917710196779964],[18614,"366832a88857f440b1a140862608e131645100ea17470621b2b2ef9e9c0b4b2e",9.317957166392093],[8871,"40f6a215a1a8f0606998502f7d2a9072891462edb704ecbb102844c8c7289fc5",9.917710196779964],[17956,"e7c75be5a399ee858e44e2a5fe974b8def4aadff560b0bae9bb42429cc3e043e",9.647446457990116],[742,"9316c2d175e4d3ea9c034f3d21c04ae8e7d522f542b7b0c2238d8a78be28f5fa",9.917710196779964],[16813,"0af19258063af2dd5b401c6f2c69eef3c59c23a97a23190701b1ad4aad39f455",9.317957166392093],[8882,"f06e725430fb034911056149a0ab12a124832de0a1182ea3e88dec9ceecb8dc5",9.317957166392093],[16688,"c216777b22d7ef8f96502097eaee31e19add7bef05eb4af1774b8ca9e8aed658",9.317957166392093],[4275,"16a795f75739098048f075acf1b7b718626d5ec9a7fad34ffd65b2c7591debe3",9.917710196779964],[13210,"7fd5134e66d741e879ba5d813fac64b4f44c902c14d5aa51615871c3f3fdb8a6",19.2],[305,"2379dd99ad4d52614b1075be9606264929278015f2a17c507e0b6ca73c7bf0fd",9.917710196779964],[8399,"d99a03d72cac6ee93f1a9e7527ac19aa242d0877a9f61a3af2100c3ef62398c8",9.317957166392093],[5033,"62e8ac343a1509c0f54cef115d331bb78fb920153af66a521cbad50f7c6cf9de",9.917710196779964],[9076,"e2e44662a526b76f2b379bf2ff85132c1d8e287b34f9ae45e442e9a3f11e4ec4",9.917710196779964],[1953,"d440e39afa0c8007dfebef8a5e1549550c68461b25aaac177bdaf92834ea55f3",9.317957166392093],[18142,"ed199f8d3b093be19a16b813c26df5a56a976bfc684f629bddc43fe0eba6e239",9.317957166392093],[109,"3f9f8ea2070851c6c6a7286518f03435414b21a6adb128b445ea823875d054ff",9.317957166392093],[7324,"8106d317970f5eb9c83f0f9b384ad365dd5fb8170fa990a0b5e998d75026e8cf",9.917710196779964],[1390,"46941182ab864c74f300f3834575ae562a23a495804b7c3e928b6c3dd515d6f6",9.917710196779964],[327,"8c829af46c0ec390a92a3f7beb1423505ab8f7e8e94074ab77ad677df36fd8fd",9.917710196779964],[412,"0620e7ef10887237271167709154701c61ec18cc3b78dd30d369d0bc9bb748fd",9.917710196779964],[10960,"15731f447991589c7f5cb1cffbfc3284632d8fdcc1c761f213b322be587649b8",9.317957166392093],[18018,"3b6eb80d4c4e58ed068c99ab82b294f1a06816a962f8a91a283237bda50ae43c",27.87443946188341],[4357,"420a8c97347233e0f1d2fa1cff2e5fff7896db5bb73fa3cae6f13c83b30a5ce3",9.317957166392093],[2747,"bea646f5eaf6b33c21d51bed60c68e3875a93a3951c3262c52b1d6cff0c523ee",9.317957166392093],[17770,"4b6873f8d86cd4af33389db521ad377aa90df60c1f16e0fa06dbb4fdc5e1e341",9.317957166392093],[7858,"693667215eef88f7a1d55fdb836672bdb3563c0817f4b3d7ef3d721845fa7acc",9.917710196779964],[2320,"35120e2fb776288ca2e3c90df803a49ccb39144d2e8a62144df2df431a27ebf0",30.425655976676385],[10333,"13aa7dd8d5355af2ffd2dd0d6f49c4d70e3f7f9e37b81265c94ac476b0191ebc",9.317957166392093],[3144,"e2591be0a3b6436fac769eb54f8f7d624093f97a9e0218366f77dca175fc68eb",9.917710196779964],[7837,"59f1f2b8820df61929e94d78a2f7ab6071c9259892d4b55d87d7821f131190cc",9.917710196779964],[6429,"128e7a8ad39b31ef26efe822a0caa7a483b22907471df2f5cde7480f35f412d6",9.917710196779964],[2969,"8c3b5b6013018308e659c9e27c0c887e3b1d89afbc4e3b8ca9397d10af4281ec",9.917710196779964],[1490,"17005dc27a6bf86a9e078653c6898deaa94e9f321d9b50905f2b4f66bde42ff6",9.317957166392093],[11177,"3340632aea7614584f41b39b49d7163a8d013e73a270d2e7839ea42b6743d3b6",9.917710196779964],[9569,"f5dee624ccc36459fa66ecbc9e9ae62fe8b53a6912e22ae52acb6d0ea80d31c1",9.917710196779964],[11902,"d54acccb903866d8bd88f04a453df5ba81c5f32768ab201997d6635d804f06b2",9.917710196779964],[2097,"238b63ac415686e0b7f2d98844ef10bebeb1a488bcb747c9fcaff6183e7544f2",9.917710196779964],[16894,"e9267d362df835fc04d6d4892c55a79335e6d93cb0312926045b744230a05054",17.005347593582886],[4778,"3760269578bb1d3e0fe100d7c50a4dbc106a8c4bf7632ad8dcee480f1aaa86e0",9.917710196779964],[9848,"b0b66f998a2afe53ff51848f3c7bec6a40237f8af8b0877a8b10b3f08f764ebf",9.317957166392093],[6492,"6a179993e1bd04da4d7c00fb4b8298b3887ed220aef29f64cd8c317119fa8bd5",9.917710196779964],[8034,"d7d97d8d861c3975516c962ae16a3a40f2846bc27988892b529f76d4a1235acb",9.917710196779964],[15305,"5ea06c6adc8a9dde846e39b109bcf9281d486b427551d198d8aca076e9814578",9.317957166392093],[11922,"37611d79763099c36fb289a0b1b87a0f625f0e4e23d1c61663853378f680deb1",9.917710196779964],[5396,"cfbc62d7739c59fd1c438dadbb9b2e8988142200995780e5096e84c8a6f0d8dc",9.317957166392093],[7392,"2b47d9e77cc936d3b9f0aa81989ae363fad9736d36703a7b6439d2c685fd77cf",9.917710196779964],[3697,"0279133ad88701a009d3c3598935a4bcc81c62c9e74d84499565b7fb428c9ae7",9.917710196779964],[665,"0f6bacc9aede9feb1573c41103ba3033b3fb7661ddbf5f8ad68f25d1a2f579fb",9.917710196779964],[6658,"21b0d0c629aaa57af764e9ef542b2c3275b1abaa8851466aceb5e092e06742d4",9.317957166392093],[10865,"ee98e9c7a187010a3cb90880a3e8b0c3659ee197eda522e17d37ff597252ddb8",9.317957166392093],[3820,"d6229476d685193c656d207ca25fcd8e673256acccabba306c7ecd5ee05cdce6",9.917710196779964],[13916,"fe115400b5dc60312109973e11a877d444030b3a9c2d486eaf7ad602bb6fab96",9.317957166392093],[16626,"db78e84e081b0fe88e86fe0aeb05072e89c6211ed51d1e67a51f5d1f5d55485a",9.317957166392093],[15792,"40c8c38f948aa3a678f3ce36d598913f9131229b1ba3873b7e91442c8d13806d",9.317957166392093],[14504,"eb98a016cfd4d398ae81d52610791a5ca0b0557a806bb7d5d8364f4414a50689",9.317957166392093],[9120,"3e99b03f7ba537fc090be34190ce95450153c5cd01ead20dfb8b4c50582905c4",9.917710196779964],[4596,"bc7ec05911c579ea2084ea98c27db8d4dc80b73cebba85b004fba88a1413a3e1",9.917710196779964],[13072,"4fe370172a4762c73be899a9e3c5ea5007707f0222dd8ff1f7429fca126223aa",9.317957166392093],[9882,"1f26eeb435dff0f482c59d74e8a942c2d83bfbc2a6b1417b4a69e7890c0a0ebf",10.023640661938535],[14150,"212608021d34b4bc3b22406113f402c6ade49afb55ee665344fb505a3d7b7d91",9.317957166392093],[17185,"10f9cdc1ff3b38ccef83cf26fa5d92f0f527c4f94be00281db9b1b76f009204e",9.317957166392093],[8940,"769b5a660b54b5a93c9097d97417c1ad6f9645110761892aaa4587a0f2b33ec5",9.917710196779964],[4602,"fd88eda812870dbb02c68d2a19642b0e18a80cd4cd1b7ac3dbab217131679ce1",9.317957166392093],[16899,"f1e12e037ab5425ccb9359bffca89d227d54f0166a2c05bf1f9f95d9a3343b54",9.647446457990116],[18250,"635cdcb24598cc603ce588bea1478a4dbdea1609141c79a4b9245152f5c10037",9.647446457990116],[15369,"c1bd71d3142267191106ac842617bbc1839e337eef00664753996ef6fc7df076",10.052724077328646],[3381,"b0a347fd93bfa217f98763d639e6c0d8252cfa63ce4fd8c8c0240961189fd2e9",9.917710196779964],[10743,"494b5441f0740d2ee9f2d5809bc83b678062693028dd9af951105531622bbab9",9.917710196779964],[7886,"97651b2c394e8035cc63e31e9c04b15f131bd7ace57463cf508e25831c255ecc",9.917710196779964],[8903,"28716ef38330e29acef475c6c697a1b9d7a393191dfb820294c9ddbdeb6c71c5",9.917710196779964],[2314,"c1d1cdeb86c44ebdcae33cd66a4a2a1f371ed617b0f425f11ea0c3fc67e0f1f0",9.917710196779964],[11489,"49bf07518235f59fa92214050a526a7a507aa6a95647ee0ed156da8d4ce093b4",9.917710196779964],[10140,"43ff1f61dda2db4cbd8a2d72afbd9980b517bd30c26e83250e9bcfd78e1471bd",9.917710196779964],[2077,"9b25a5d266fb717d2621114aeb2157da465919ab69ce434a6933838b488d64f2",9.917710196779964],[19516,"b67df9fa96c680d3db148d705c45ac183b2f3a65538e6a4332429d3b6e31df0d",9.317957166392093],[6509,"7ef86c82c02a680ba5fb95e96f10e65cde2754dac4cfb5215d2f971128ae5ed5",9.917710196779964],[1599,"6881754e80f2dc99932cab2b98269fb9ee7fc3e7c542d74d4618a1ce6ad990f5",9.317957166392093],[11501,"134b668fb2f5b2b375ccefa25bc2505b84dc565454900f7d251b4580f7cb80b4",9.917710196779964],[557,"d2144684e6a8ee3e03c160412245c48e8b9f863bace7d4c84fffdfe3d7c63cfc",9.647446457990116],[8997,"f7cdfc8abb3f7e241dd222b637a6e66e247301e081cc7da94ea75fd0ad92cdc4",9.317957166392093],[18522,"334ce680413c78b68025362f8c116dbbaec78b30d9ed2a088d1bd4a45fa00431",9.317957166392093],[10399,"04cb4e8d4ffe8ed286a8a81c98f4bdb1ac4ffe7d6a2781c14eb1158dcb5dcdbb",9.317957166392093],[12934,"d565ebfc92e3c27860f87083aff3d9a60371781c5aa61ff8cc914a9d255c02ab",9.917710196779964],[13291,"be091b565d8fe0da7dac7ea90919e684daae0eda3b76576636e7ba78bacacaa4",9.317957166392093],[3199,"39b0cc230eb0fa8c6b705c1d6c669926049774ca49bca821b2a17688223e0feb",9.917710196779964],[820,"55a1d5073b07729b707eedb87c998c26e033eda75d88081b64f388191c0f68fa",9.917710196779964],[5379,"d62256139e6d95f7f011585dcadcd3724765f8a0dfe0195832f01bd9bf35f6dc",9.317957166392093],[3383,"4577188b8f0971b91f4d7c51f35694ed762141c54d014e79a9f7cc2c21ffd0e9",9.917710196779964],[2688,"d4dd6f63ca4d385e35230711c57c7236e5d7f7b5857b432240e232e6784d90ee",9.917710196779964],[16675,"4d6f5f45c10f7a8ea05ce10f42a9bbb7181ddedbadb90183da0f25e8f9d73459",9.317957166392093],[13638,"bfdc485035df02f398a60e7664f8a9d74ec48e4b41b1af1bd616979a3ca78c9c",15.001717229536348],[5626,"8aa604c411fa5167fc0e9701e1c70ff22a24b0d2294cc80d967aa7da89c484db",9.917710196779964],[14659,"99b403732b1cbe8e46f7556a0ff5d274a8fd26e21f198b6dc38569cb2f55ba85",9.317957166392093],[2488,"fffeca2b89656722d58d804813f55d00470e67cd33a2c8af4501b66e3377ecef",9.917710196779964],[18579,"438266d7f514b00871ded0ef105fa174061eeab0d0ff47fb7e97290ce37c642f",10.052724077328646],[4433,"c9def7181fc6ef36b27f33cce6e8538118c9406af812c0e7120d1fc2321fdde2",9.917710196779964],[8960,"af6cc1133a7e62ad9d39edd1adb76e8e75ddc18aee345abc7208f02ea2d70ec5",9.917710196779964],[1714,"35af63c434a4be040119e0cf0c8092913ad9d94fd649fa2fd97e44dcfcf3d4f4",9.917710196779964],[17059,"58acf18ff4777a1b31c7dce489a1b69715a248e1f4e9a19db2ecf7e8ce6de950",9.647446457990116],[5087,"941eee3647d90069b06a220fa751cd38582f641c72cf8795f65d7b0fef75a6de",9.917710196779964],[14923,"9bc702d45e6c45704981c34b3d2d3e4563a7f6b2c8bc4256871b8757d4957d80",9.317957166392093],[17996,"838c195b060da13af57c8f2150060295b4d34ca0e8009dc24b746a7be73c4c3d",9.317957166392093],[2641,"5cde4a2e114705ddd68ae97b00bb5a95d2b50bdb0f73d4a351391efcb009eaee",9.917710196779964],[3170,"94ed346bccdf17027c9ea35ddbda87eef4f252a71329ba1ba0aaebcfac5436eb",9.917710196779964],[1335,"1ae85cf744295f2bba3a0833cb1183323609061a7a36decb15bd28a4f72d2bf7",9.317957166392093],[2683,"59395666a57fe6921d34836a072bcfda35c46b33b72eafa760c4954e6e6295ee",9.317957166392093],[8436,"3449509d8a2d7f4ce738fce1c01a102bd22e8d9b0cbd95d9b7209deb391d6ac8",9.917710196779964],[16961,"3b9e26d4733269a60a6785f1a858c0e9e97c1e9b1c867b47a23623acb2aaec52",18.152974504249293],[3489,"80bedf44f19749bfb155821a3c2afe7f52f40606b10ffb92c727a8f241c618e9",9.917710196779964],[7680,"578f085c525d13bf015135239f84a0db427d40527e8c49d54d65016ffefbb3cd",9.317957166392093],[11428,"26e12be4792d315242970efa15d99199b9d223fb98b75e3b89a1fc92866c20b5",9.917710196779964],[5899,"d1e3b01d4553e0bc64b6ace79f413f6925b72b1906152ab73cc775bc903eb3d9",9.917710196779964],[18212,"912c75bd035323c6fc4da8ef59c3f2484a89fc30bce76fcab2b92cd5b57ec637",9.317957166392093],[3608,"87f523e417bad6d151a962a70291311fb6d742c42d19daf98f7a357baaa32be8",16.198230088495574],[6962,"597506092d93cef72be441394e29316d8bc3bb4e3cd56dca02e03642d6b733d2",9.917710196779964],[19683,"2bd9295131b3353dbcfbd3275bedd8b5962d82c9d8e45b2445294a6891724807",9.317957166392093],[16919,"5b02bfac52992ba1624c19c7d0af870b527d42f703579aa70df1fa6c3905c053",85.7085201793722],[19288,"b176210993d06632b6a93e2b65bb926bff18abbd4266584bfe650475d7103115",9.647446457990116],[18014,"8b964fd7f8d0f3e5ef15be530328669b4194f4918ffc0d08d954db4cf6d2f33c",9.317957166392093],[7435,"2af43234ce3b7ecfa7df54ab531e7d8117cc1e8c36dcada88ce9c6843c9f27cf",9.317957166392093],[851,"6d69d3331d52009a1d0df13aa347a3e3f6ea763e9dde171cf083bf285e3b3bfa",9.917710196779964],[8827,"b066821e7e129e74b1c2d6e7d85b3898fd1e2295fd84f7bfea7a73ea5dceedc5",9.917710196779964],[13245,"6ac76dffecb68b5b568dd8e2d06b590dc640a4494d4093de54d648964934f4a5",9.317957166392093],[15918,"d0a71ba1ae4ec2a3aa604c4dd4e3007a3f3e96a7a68ce6968ebe4cf9bfbdb76a",9.317957166392093],[17676,"715ad607b387984bfaae2fee27f04b4406a4a24378ca09bba8cbb9558c7da743",9.317957166392093],[17889,"c316f43cddd22976cac22aaa40d2d8e3cbba8ad3216e87d2975053f78e167b3f",9.317957166392093],[8802,"659dfe4ef5c61f1b79a230db0d27e292139df1b8ab8a477ff71ae71af8100fc6",9.317957166392093],[8746,"f03e47b791b10ecee19e7b856da1bd75ac873bd0e3a7092257d892d2561e69c6",9.917710196779964],[15335,"a46bd598ba457e8a6a266ad87e03fef0ccbfb967f11a63efc6f9972be4fca877",22.214285714285715],[18782,"85c8224ba2df5d181bee71d2ddf3b8666d083bc91419b7d4811fd0fa975b9f27",9.317957166392093],[18762,"cda42cb7306cc4e47f061e6998ee1e12d702c2af7998f77f8590de8006682b28",9.647446457990116],[2464,"793b3351b14c2f500c2bb7dff63357c53d88288df33e4af7c9b34238446817f0",9.917710196779964],[12480,"10fc72da3a247a5bb60f47d37a7fb8ca29ad339cce0591af222f3508e5870eae",9.917710196779964],[11969,"0fbe9b390d4dff946c8b7077d7511fa2c5e50c7d1c12bf8c1bed673aaa0884b1",9.917710196779964],[15079,"457471a7392a890b7513c7054a57ed79b4c93d1616d41a7304833ade0fa7167d",9.317957166392093],[8599,"c59f69eb8ae3b23629e635658777f5f2198eabf9a30c72e8cf94e211f84a73c7",9.917710196779964],[4970,"050d87543a0a46540b719eb3b5d8b63b512f2a0e1ac7a31656af0cbced1965df",9.917710196779964],[11535,"77116002a89cac76f1da3a356b60aac3e64b6127754afe5bcf6eedf541b94eb4",9.317957166392093],[9552,"4b3419a30f3bfa0b0de25e860d692c8cd263d60c00d52c58128f7b61ebdf5ec1",9.917710196779964],[16105,"b0a7aa7ada394923fe5a8f6cb0be037649a336a9ba81df0c73978c42748c0266",9.317957166392093],[16833,"3dfa02748a709e0ea4163a9edc5a3a50dc06cf56636944504b9162e522c0a555",18.11263318112633],[6529,"5a0ae08d355b62e5424115e115f877ff88839b78269c0fbdd3bca71e88ee3bd5",9.917710196779964],[3108,"eb9e393070945b7caec0f0d25cf7d6a255a87d04d043976e36a665b7e9c69beb",9.917710196779964],[12019,"e7858269da4b7622d540be14a7764286d982a7de06be7380ab3f33426ea737b1",9.317957166392093],[1169,"07c920d2c28a27c146b8203b34403837f3f2851c1f978fba17bea4e3bcc62af8",9.917710196779964],[7369,"7b33eb1ce195ff3d9b4d1d01c7a6786aafc0670842754c11f84de52feebd92cf",9.317957166392093],[3366,"c0f11376d950dfaaffd15f85fcd6c55d8b7ab352eda62f662a212ce24056f3e9",9.917710196779964],[11490,"0fbfc5e2cd4cfd295929cd9dfa4e0ac0effcd0a2f159d1267b1ceb1e51d993b4",9.317957166392093],[7904,"0da03a402bdae1127627f54751a9c747b8d0c5955992179419ef6b70dcb333cc",9.917710196779964],[6327,"22cadd143a14f2b749bcb2687ac677a2cc0906a714e541580529a6c8f05dcad6",9.917710196779964],[3137,"1378c7f9b39e4a900ef180e4be33f31a7ebd0fb52544c8aac53bca9b289071eb",9.917710196779964],[6149,"0dedac984c362e1a68164701e28297b47b8b88a3b86f93f108a54a76a57225d8",9.917710196779964],[12917,"6e3bc390f9812b7d78fd3a5b0e220ce51efb1c6751a54bbfddf22034b58f36ab",9.317957166392093],[1085,"91528dc635d96b2966b6dc6475e203e3c67d610b722df0e16da1a9fd24c2aaf8",9.917710196779964],[12376,"8aa70f47d32f626c922e4325f0ad01cd420d5ebb22b4b3bf3584402a2e77cbae",9.317957166392093],[10398,"389e80b3f23988258d9ab129ca45dcc214bce3e62ab6698473eb0b617462cfbb",9.917710196779964],[5142,"74f08305a93855737d171e593ed7d7c9b486120315d8a306154fa3f013de58de",10],[7584,"068af34fbe2226ad5579ece5ee06b6c2379d0549349ace9ed2b5f3e6066246ce",9.917710196779964],[15830,"5a4b244cd191105d5c72aa043583e0c7d83579ed79dcaa1a40fa994551b9c46c",9.317957166392093],[11049,"713f77b0784053ba2b55f3111e5de3ae9b05c26f0a13c91418725b21e4edb6b7",9.917710196779964],[6080,"b853932f50310d9ecbc554ffd78c286fc7db9bc09c3ca06a2aea7e5c11fd84d8",9.647446457990116],[7573,"b2f931f72ab52ed57006c0b816376464742f7420f789ec827f59778c590f59ce",9.317957166392093],[13703,"a2fd84f51e5e6f6821c2404141e6378aec8db9bacf909e6238c46c8872b0449b",30],[4468,"607ec05999fefc79de6cf77818baace059c47dbab755210049af8e7948d79ce2",9.917710196779964],[10351,"22b98be4e11d6f3334e6ed6b9b5c7b026ba751f60bd8ee23346ea98df93909bc",9.917710196779964],[18006,"7f7c12719146e4ccbe36a8e276852579765f1e7fbb92f67b95b14580e0d0183d",16.954627949183305],[10135,"bf1637435bbb2a6ae51143d7fd44b602884c60d9bf6babce36df0007548577bd",23.190532544378698],[9264,"87b612c6e06aab697fc0eefec00d7df95203dfcf63df9a1d6b3d0a7e803e0fc3",9.917710196779964],[16616,"4e0fc921545b9109c8fb95149d67fa9bb763d055daa4522323c5ea963bde885a",9.317957166392093],[9522,"e6ac3674ec364b150f759c77f0ec3743038efeff4b8d72ade4010b22f6f58bc1",9.917710196779964],[7089,"bf888d97e35f2ea3f0d1649f7a72803f32e034b643d6a208b4d790925ad66ad1",9.917710196779964],[4895,"cabb341c491880ba3c5b0701ab585c8f0580500214ab8c937c22e40206d2e0df",9.917710196779964],[19392,"26c2b30f2ba50ebd06b2c4e807cbc97b2957139cc42ee91246cadb65d64d0f12",9.317957166392093],[16920,"bc2d06c8213e1f5a7e2ecc8f85a617c7f71c190225b1ea12e91065301debbb53",9.317957166392093],[5203,"e5cefe80768957db34c6c010b8e380f210101ea7a871a7dcb0217cbdd10cfadd",9.917710196779964],[3745,"a5aa2b61ffaa14526d357c1cd8f7afaa56bd765f1f6a03d1ff3446c7a4bd47e7",9.317957166392093],[4435,"322dac3b8b70fc3f4461db3f17fef5a24ff206c46d253dca7e5e6ffe9bebdae2",9.647446457990116],[2647,"6ff5e9f81d1cb6e5cfbe4668f12df71c3866f752e151e1c73e6f4346e9d1daee",9.917710196779964],[18728,"80ea0ecbabcb88ef96b0ca28f6575d0313b5be175a8b5fa44ee8b18c235b6729",9.317957166392093],[16218,"f2adb3d5bd225f2c7768a1154c7e8687d457515526111001f87d82b0e8006c63",9.317957166392093],[17240,"558cc999d0b0a8916dbb9aeabb853150a3ee4a6c9e695da8e3f2fa7ee7f7174d",9.647446457990116],[11578,"6f8357a6b892c7c0d06a1bef8216c93848cde407c45ba0250ac86a3c550304b4",9.917710196779964],[6600,"2ce491b682bebbcd79bcfc06e810c1d09d2b27919f064887d197bcc81a99a5d4",9.317957166392093],[16094,"0aa907ab94359b7a8bace6c3df41cf7e38c7196c04901c7287170c460b8b5966",9.883677298311445],[3096,"41cf436729f0ccf8e3f74f41c45180d146a2d03281c5d9131a084356a8d0aaeb",9.917710196779964],[977,"32e26220faaacddc8f58441d824f27216ffdc11b93906037aad11060cda958f9",9.317957166392093],[16884,"5edac6127d768390b459e33c15b8417010ec417d93077b3e0c84e306e56c8954",27.86761229314421],[9127,"48131d81f90a1536b330baf358cd7304bd7f6b177c7d43961b571e40b041fac3",9.317957166392093],[1782,"7b2d98697244f01878d95f2a920a2f325d5dfc10dcfc3abb2e72b728455159f4",9.317957166392093],[13473,"e656b195ea2f2a8545c80a859af6e61036b990fb22d7235a555268aa38d595a0",10.052724077328646],[8305,"170ab6ce166ca1fa36e30f30adb7aa94831bda186d9d5d54c76bb5fe1cc34bc9",9.917710196779964],[6849,"56316538ca9ea5868459236ddd0ffff04a2972d3dc27f0051d7417b1e3f9fbd2",9.317957166392093],[2365,"ac24c32bf37fb52145f8316c48c259838820349fdc9756c6aa1d4628e5f0abf0",9.917710196779964],[9608,"b6d7469c48a1dabc2d43b00824e583d7c55b38c1e430bb0c033179a2a9b900c1",9.917710196779964],[16193,"e855f9fbeb7475af32f3a4814ea50e6b2787ba2a1d7b679fe33b36c1ec352264",9.317957166392093],[2587,"81bd620f875330e7f55bd8a5cf62650fb7d2de3c68befc6d785ebc9c45343cef",25.83927839278393],[14242,"15d2e88138923783f9f5fcd57aa1e7f7c6d321d9e19e8e3faf500b4c86f0268f",9.317957166392093],[18161,"253c2098efd30045a07bfec8831a07543975fe539a66b157e0aadf9e1eb41739",9.317957166392093],[2892,"b4d8206ac572ceac5b587a5172f75b075dbe4ba7e7cbcda124c8c794a9ce2eed",9.317957166392093],[16776,"866a595f2bfedf00225fcfe8979847932655d387548b8775db08afb1d963f156",9.317957166392093],[12197,"06f30cf2b42afb7475b5698df2ce7af89710147e66edf7c82112692a13b912b0",9.917710196779964],[2178,"af62f6417db231678264d65de17b50d6022b4690019e8ef3ea27e164bc08b6f1",9.917710196779964],[28,"bc7b1db04ffc8b95a5d05df32f4b118306ed5a5d14e727fe79ecc144f61bdeff",9.317957166392093],[16745,"4214fd189678a112890c7bcccca2a2cd172ab326f5d1d9ded65f0d63f11a8a57",9.317957166392093],[12225,"e0595deea20551130e9baac1ab4cb16fb3ae3e41605dbf75a00e67db6426e3af",9.917710196779964],[17267,"8e416847e0bc24ae33a46fc044cd7081ae422b5c234ca81bce2a3ca8ea49d34c",22.583586626139816],[6102,"63821156ea016ef2b1f1fb6a626cb468048135dca80e710e34ba4490f7e867d8",9.917710196779964],[4508,"8e2417067d1656b3ff0a2292e9b3bd4404e7905ab27fa70e57d60f12231c4ee2",9.917710196779964],[2403,"ed35b3c5bf8b7540c6d9914ef3302400a19a0f4f283fd2c8aec785a019c476f0",26.062350119904078],[16486,"ae854ac909a7c6dafb358f38f495d31381190d03b0414625c75ff6385a22855d",9.317957166392093],[9064,"e0ceb94af46c6da4daa8a88a338a1e9fcad4e193de7a517ad156cbef16a05fc4",9.317957166392093],[5907,"5694f618baf57a8d7ad3f7e3f80459fe6c5a79c2d63e24a7b5ebd00e58a7a5d9",9.917710196779964],[18893,"201fe51d01b5d451413da8d1dcc1ae9575cbced203e579f87112ec6a3017b023",10.052724077328646],[7824,"7542671e49ec5e89689a19c4d2211293e39e769df1ca84a9816bf98b92599ccc",9.317957166392093],[12996,"cb326d24ea5a256bd086dda2bc97f474c95d04048fb8f34fb5aab837de909baa",9.917710196779964],[17721,"afb44dadca5fb047e6de37b746f600257ab7e424a2bbd6703109d8d43436c742",9.317957166392093],[5601,"4cd216e20b07057de74f7a11becd780e5bc11d7988afd93e5cb38fd1c1fa9fdb",9.317957166392093],[12868,"774b568a328653796aefccef4241e83e544f8877ffb5520fea67d388641675ab",9.917710196779964],[18141,"862de439f9c6b4649c5541ac1b80e72b0a28e046bffc764b71246dba8799e639",25],[3385,"dac50d7d6b1290fdb8675b554a0533bb10219cdba2d8f61e7e58ecf27c6ecfe9",9.317957166392093],[17121,"fb100024a63b8e596b5f3a4e661d5a6127afc624192a1931e7ace3245721924f",9.317957166392093],[10965,"e889d9d125201287ec145bea6942195b3fac7bf2e8fd6764988c8ceb73a13cb8",9.647446457990116],[1700,"5c2b0b6492245298e552fabbe885c687833cef8ac7a5c380e43da6859d64ecf4",9.917710196779964],[1998,"eaefde4846fc3278eef7080c82446193200cdf5c05613998577dbf1ce23e0bf3",9.917710196779964],[17529,"ffa6e6ec8e325f8ec0c6ac75ba8f3ced9053782f53a175306b3825b47f1eed46",38.98954703832753],[14482,"5c43fd1654b05c144a110b6440cb5fcc37ee315f6090cc0a00f6b92853c49889",9.317957166392093],[17034,"1cded2219f35a87991858c4560c959e0ddc5a4223f539ece7bf2537122824b51",9.317957166392093],[7918,"76fbaba502a7c8258509979c48ff54800c16264990cfdd68fbf34cdec0a61ccc",9.917710196779964],[17106,"266f5e205b0ad421e0bad4712d1522299e4a5e3612b26ca6e0cd5e36c06fd54f",9.317957166392093],[6098,"c22d4d718d7e1190773da6f21473600ea5b733f3293817ebd5999557c8246cd8",9.917710196779964],[7536,"7f8007d50eec6bd000a79e82c999a77885bf5518b999d27e102faccd06da95ce",9.317957166392093],[10153,"ca1b771e2e898cd99675ecd65fd10ba22f74e15c6d551796f20c8c5721cb61bd",9.917710196779964],[13251,"0f867006cf1b691da83e1b3b3ad649dd2b38de4a3eaa14e58c718081253bc7a5",9.317957166392093],[7738,"3bbd7b97be7f1369e28be16d569209b1364c5461c8cab840bc8f53a5396c3ecd",9.917710196779964],[18680,"a822c0f82d2cf1c5a58fa7b0462682394ce1f68bedfb48679f74fecb60712e2b",9.647446457990116],[9595,"e60fdfc60ff929aec9cd49060fe1ac34bdc3202310500932001001d8a32709c1",9.317957166392093],[14816,"7412bd12eeaf65964cec3544721e27645727afed4932cdde8e7b18be1a667682",9.317957166392093],[16587,"b0a2f834478ca5e60f696aad82e51f194f513f89ef03fecc5ea7d0e637584d5b",9.317957166392093],[3804,"f264c797291ad1c97f3b322e167a92b88995a496cbc5bf1dd2785dd871f4f0e6",10.00593471810089],[15848,"2a7fc3c394524725bf9abe5c9779f7108a46a87bd6d176756165cd0feecb436c",9.317957166392093],[8946,"75a69417d0716fd3db3d66cd12775d2a218081a0adc27b84f04f0fc521eb21c5",9.917710196779964],[6253,"1802bda079dbdaf6af885ab9d5c3e3536ba0361bdf1772dfb3b777e29b0464d7",9.917710196779964],[1906,"9a88ee67b52a8ce958a804f1734c5f356e82b42486aafbd9c7045f05692899f3",9.917710196779964],[9736,"7a2c19014d86254e3abcfcc4a4797670860535a3d9f615344220ab9a537a12c0",9.917710196779964],[13247,"f39f7aa1d60317251c55f8dbbfc5557d048819fa0f97e8092cb17e8fdcf4e3a5",9.317957166392093],[1424,"db9bf3a391a5c43ca93cdd36d6c2d7dbdc82be81ee9a72efa4c2820a6800b2f6",9.917710196779964],[676,"cd12cb0f4f13aec45859880788d143be31fbf8e6b8dcfbc2f3e79f94ae7365fb",9.917710196779964],[8676,"050fd21c30fbd026cbd9cdfecb801f64ad94f07c85d5ba96454bf1d0f6d5d7c6",9.917710196779964],[18741,"5f30894ff737a398cfadb2febe139e5d67f5984c9c89dc41277e64137e5af728",9.317957166392093],[14887,"529e0e4f3e09e32ad8cbd55ff14135ff9f549861b7bd6ab99d42778ecde60481",10.052724077328646],[6961,"bb4fae3812c390a5830af06832ed1c840a97505f7255df08dd413499563635d2",9.917710196779964],[19764,"054bc7efee83d79c527da23da8b7f86ed93011395cd9d2551b5d39dc8edeea03",9.946524064171124],[14360,"d73b0472c36ca0f1db1d9c461398817b3f5e07dd5bbb74efbd485adb23f9398c",9.317957166392093],[12973,"429615dd89ccf76c9a48a6582e1fa1c0999d3cc596f36bd6b39d1d465ab1beaa",9.361256544502618],[4095,"c05e1ca5238f653aab3c15d1390b306a38a319800eacf424d5254a5a637717e5",9.917710196779964],[13098,"f5de608b3561ba79ffeba32442f979b03599e81ae4dca63571d8ea3c7e0558a9",9.317957166392093],[7771,"c460eb768db906a70fac830d3238f9295ce31739060fde8d7f5fe75af1ee00cd",9.917710196779964],[16767,"0b83572a3e06e887a30a9e0d51375132924950d461ad4ec8230390a5fdd61057",9.317957166392093],[2391,"193442b2eda612e36185ba47fe7eee8ac606f9ddf0726f81a690ac6ece7486f0",9.317957166392093],[6991,"7a7e0e48801f741b4207eb9026d5fec6a648f36e18ff48d9182b5e31addf0bd2",10.022779043280183],[7400,"32af005eb1e58cf0ef1c51081f8022f7c75be7a70785c43d45784d67bf5c6dcf",9.917710196779964],[6843,"e5843f724a8432a7ee4dbf2b2e68bb07ceab5a5f0e76a28bb727ebd37aba00d3",9.917710196779964],[19154,"48d7221fc0defe14c25a1aa79681d8a99323e4697a165ceebbff0594cdc6641a",9.317957166392093],[16186,"f8959b0a6ab36d7f647e4d2abdb5bc9afd9f45022529d0d71d0d1106872c3f64",25],[13679,"bfb8cb2a2933e2a49585b4d43db9cd3d11bbfbc7044b34845d481e3bca17b29b",9.317957166392093],[9510,"04769e62f5b426ca30248b4db5bc1951407532b8ea44880fe937c203ed30a2c1",9.917710196779964],[4408,"917ad2e9cff518d71133dec94b70d04632d7348bb86a115d942d839ea1b406e3",9.917710196779964],[2151,"ec7837c553621ba2baad016bf3dde27ffa5cc29c9791eed821996a8d77e0e4f1",26.019370460048425],[5831,"c31e02c6487ea8d41e3ce52f48068ac9fccd6e66c43d65904b30c3088c1227da",9.917710196779964],[4031,"913d7915ecaa629c0e300c7f5e8b67a325d438e97ed9e5fe6f1d4b0f59a28de5",9.917710196779964],[7102,"27a36a4d835a9231527e00780fb66082dea5bb2c8253702877a03bd9febc53d1",10.051282051282051],[7086,"cd5d5f6cb7fc320307cb6f6b83e26da9980cba039734a2b0b71c37d7ecf56ed1",15.040431266846362],[11748,"08b5426bac5039287a72bc078d9d99de3a8708ecdbab5080089c2fa0a0b804b3",9.917710196779964],[5318,"18a596b300afaae8f3f0ace8d4dea001dec295d7127e32252c12c8e2e5bb4bdd",9.317957166392093],[6780,"7821f289492acf432078e9ede64dad1b10b8d010abe2b6d662c86225637c67d3",9.917710196779964],[6523,"352c02b4c1b4df76d8b3beb1bf45ea3eef27b1aec45ea7b3a6df1f6bc65642d5",9.317957166392093],[8783,"8f915f94921d0d9e12d97510f95fabd610a2597e7917f0266dd5fe7d8d592cc6",9.917710196779964],[15629,"f5d00f57c7fd5a537f704bf8edf58f3cbc58160f975034397061aac9882bbc70",9.647446457990116],[7759,"0c444db6f2b23a6b40086ce7b80f4230721a1e99300ba8db4500fdd766af12cd",9.317957166392093],[11308,"a95f6399349cc1fbcbfccd9cd26a61d440fe5074b83aa46fce7b0d2a6d49f7b5",9.917710196779964],[12297,"c0fcf6d442892c65747abd3af83c1116555ea823e936642e0b5633af75a43aaf",9.917710196779964],[15272,"039051cf54b4916b85fbd68f6f2379eb259746181c94b40576d6760013a8f378",9.317957166392093],[11536,"8b871b63200bd2bb086b6913b6d0b157fa3ec46097c549be46122c4b72354eb4",9.317957166392093],[11275,"3be1e204a8a9019232cea6968f923ca41198b4dc33c8467bcbcf15e5e78e35b6",27.900178253119428],[1585,"35cd0cb186123de357ea4af874e1db8e5f6c2cd39de5bb30551050ccf2c49df5",9.917710196779964],[5231,"12f33044f4239340e966b043f4ba5b237c40f2e093fa1851faa9abbec365cddd",9.917710196779964],[14753,"e86e1fcc4a560bc84da3bd1790033ff8eafa15f37e636c1aff440a32e6e7d883",9.317957166392093],[19598,"5467e3f9a31410c4b5899b571072c2eef8d9101a9f8b2e14524c64c614cd1c0a",9.317957166392093],[8993,"80d818b7c3a583155b9a212cc1072b41b1bdddfd46ebb3fbfb542b9614dcd0c4",9.917710196779964],[921,"97f9bc245541de08a324ff427f4fc81c50ee5f192f1412fea2d0b4ca437cadf9",9.917710196779964],[17164,"143ef44ebf126d98de8e72f4eccc7bea8a49c75113f645222e7a61bc62d2a24e",9.317957166392093],[729,"da0258bc69039c5a0f0c7be308ef7295ab02427c1a1dedac4e5c9221bf1a06fb",9.917710196779964],[5867,"7bd8fac427ec2701a8800f1aaab10bd99ffadd3e3434557cc3470359b85fdfd9",9.917710196779964],[5023,"da89877117be8118d2569342019277003357bcd8d8a7b424906d98d95c1509df",9.317957166392093],[12446,"4fd37b3dc84b5344598ba7996108b93ae5e790baece7dca193ffba77d8324cae",9.317957166392093],[18551,"a1d49ca9d3671bb79af19d2693999430dbf0dafad8417fb142b21145fecd6c30",9.317957166392093],[13699,"cafa8bbaa1b3042f562a4d9aaa8889bfcfdfa9c0ae989935d54ab07f45054e9b",9.317957166392093],[7260,"de90862cafe3299b50af4a86f02e8eeeadf2d3d953b0012e546ede81d18646d0",10.052724077328646],[2949,"42fb3052075ee6a0af2433a102cad5a041c5157badf783d1a041db64f162afec",29.224489795918366],[7411,"24a2942ee89c3d4cc73cba6255def3aac0004dcded167badec85f1f86a7650cf",9.917710196779964],[15281,"2f3d320e252110a4b398de21f0758e92a18f9868a25cd61394aa12b1582ec878",30.20044543429844],[17171,"13de2c5095a09344d103f47ad5a7b900cc3fac4603d3029074cbee3f8362694e",9.317957166392093],[3773,"380b70fb108cfe2ff2665bebcddbb00e3b704316a4518e489cf8996fa8d022e7",9.917710196779964],[9259,"47c8c6917b08064ccdfc65a8517210a8e14f91ecf87f6746639e016fed4c15c3",9.917710196779964],[10760,"2e2666c72a65cc4f70c91ce65e62cc4278878c795b86175a73680169143497b9",10.052724077328646],[2624,"50c9e3e57e24eeef73d05b2825fa058912bed3744e9f2bc2bf2e5f8193c908ef",9.317957166392093],[5630,"b45346c8d8e4d81b3d5bce8bb4ff25e80880bc543d19998c5158e693bf1573db",25.202156334231805],[14062,"3468ae8f0d7a0d1e28c5ecf97810443e763089cf96d9f90a43e2b00d3c3d6193",20.021201413427562],[8118,"8ab8aa7f38c8db0539bf66ea85d5333ac03837b3675834e016313983ba6aa0ca",9.317957166392093],[6557,"bec14ed925d839d5d5e076f64ea201dd82d8d04105d8525a279b9127ca77fbd4",9.317957166392093],[1254,"09726b6e3ccb5f5521a9bdc0db47fc3cf5273413cdf165629e592a88549ca3f7",9.317957166392093],[4104,"fd18839ac8353b7716f65e6efd5ef568b17a215125750604d0313725034d0ee5",9.317957166392093],[14667,"24316611ab2d9a8bc8a236292934f2f781d87b29e21e962c79c88d4d4ec48f85",9.317957166392093],[15796,"b7e13a34f5fa9df92c552c6c9a047c5ebeb63c9fa77ae0bdae67012bef62726d",9.317957166392093],[13998,"affd40a1366777538f6bbbbc9cab634141c25b217ee94e722568b1ef809ffc94",9.317957166392093],[9226,"5f3d1a3d94edeb127ea8e65e3972cb9ff3c620a54d3a01b0596f50ce526951c3",9.317957166392093],[12900,"79f17dadaf86f5b6e4fd63c3580651f2d8155e4a277e5e88eb69f337439b4eab",9.917710196779964],[702,"f0b5fdadf70109a892a9f15136a5b4391809979dd7365e0ec285e6d0ca1d3efb",9.917710196779964],[6363,"9bdfb679c26d72a056d71dc234e0ac3f687c056343515bbf6099b856e43a96d6",9.917710196779964],[19728,"137c490d4cba59b3fdf7d8ea907c218d88b62e90e90283c3db2db268914cca05",10.052724077328646],[11591,"77524a6e4f02017f7c40441ab1cac41d758d654883ecfbaf259c5e141722f5b3",9.917710196779964],[9994,"f1fb88e1550c5013419374df61930a5f9d37c32eaf3fde97c68dfd0544cc5ebe",36.102175969725636],[19000,"15e34fa3cf23ad8f8582c80b548e92969cc373c6dc60f160f55dad9434978720",9.647446457990116],[3493,"f475c0a43ab10774c4e071e5f41b601315037d8485e800bafa433d00d4e407e9",9.917710196779964],[801,"6c703e2096fd8e03a9503cef086c2e699724ddc400c1ae5beac94453211588fa",9.917710196779964],[2027,"51baa0d9ec223cee8bc46005d3ca3d94d50684fe55f16059d2ece1e3bacfc8f2",9.317957166392093],[13228,"184c81a6b09831442b834f1433a75fd96d108704b994f18dcc0aeb2d335556a6",9.317957166392093],[18889,"bfb70884b0cd7b2a10ce3005adb4a70841c93860c6e5d9b7acad1dcf7dafc823",9.497326203208557],[6232,"7ff59c7c0ed1b0897d6c0a8d32dc469960ddb7ac8b501c570a146d0bceeb88d7",9.317957166392093],[9587,"46b19d94935b03cce13bb77546cb4efcff3ed55f5b452811b193041b81b110c1",9.317957166392093],[172,"7ec2bd7756c26398d36eebff5f26e33a40c9adedf6a5bcb9e7d00d74ec1dd7fe",9.647446457990116],[4454,"9fa5f803d0649b97a4707d4f8d61d7ebef2c6ea827dfd80e763708d9ec4db7e2",9.917710196779964],[18316,"ab4b638a9cdee10cc94e26858068f52a23366323e0d0786b19e3512a15288935",9.317957166392093],[10503,"90dedf59568ee1270a1b126c8707d23d10894e4bc940e1b5b2a243ecaea628bb",9.917710196779964],[5302,"bf265247cc2fd7567823591130dfd2ae1bc44e2d439de0494de9bf26005463dd",9.917710196779964],[7699,"2482e8dd41c559be985a43dd7139861f0ceca2fc9ad9e754ba2f6d85e86d8dcd",9.917710196779964],[17348,"a7252f4c258c19e53e22d93a460c4015e6f7d2d7a3200a23556907d15207e04a",9.317957166392093],[5347,"4b9ca84f2df15e2d2894c8cbc034286242caf2a54bcc5bd7f6a9e9b356012add",9.317957166392093],[7725,"00d32fe21ecd8f71bf84fa90174ae53ee8c057a43aecea0a4aae8694c29256cd",17.110530441599163],[1759,"41bfb85866b2361e71a84831bd81732b7d6e4e677c3966ebb127e55f3f438af4",9.917710196779964],[5909,"9ba455267bd0b07fc9717d15c45046668694ab0912040a876b46accd28979dd9",9.917710196779964],[259,"a152997af44e4b1270587ed1e4666d13d4c123d0a0a4f476bf9bba1edfc235fe",9.917710196779964],[6501,"4a806996292b66d6426b733d96f123075d053b3aa188b1e53f17b85e200b73d5",9.317957166392093],[17126,"9832abbd9d534d2a4ca9fd18a20eb6cb9f1d9568edfe6d4a3960686a0c9c754f",29.13975903614458],[12776,"7f32abc2a01a775cd8c95ae43804dcbe5f9a3efa3cee0b2614054158c0ec11ac",9.917710196779964],[17628,"5009ab92363541e849446ab6972dc18defa845994b8235b911689f960532a544",9.647446457990116],[1801,"baa9986e6b6d9874b5322b55214d18b1da9b2746380702cd6991323cfed33df4",9.917710196779964],[4186,"63e05ded5fa51c3e676421deeab15e3f14876eefcf38597c33dd8c0f53ee82e4",11.328798185941043],[12044,"945bda1893e4fbf41f0c46fafe3bbfc7ac75c89d857ca906339834ed748406b1",9.647446457990116],[12285,"ca632f5aeab926d1fb91e85e0f80f43bed3b255180ceab5478c276c2d2e35caf",9.317957166392093],[9971,"a0ce3c4e60f6a2a6b3a671666c75fd439a052906de3e36a4fe50ab5286067ebe",9.317957166392093],[6354,"fe6f5759584f7ca3a755a3e2a03641cec24ee39989d259208f27a7f2168ba8d6",9.317957166392093],[18532,"d3d24f5aff3029cd795d4e7a75efe22d0216a45bf714243c7b48dd03bfead430",9.317957166392093],[13301,"836b1dde3a299c7c4fd1d131763e55df6b5050adc376dabbb45c31a0aa8486a4",9.317957166392093],[11045,"27e8c0f8a5518d4f4cd27cc374eb5c8258d99c030e0e52f4bcbfbd312500bbb7",9.917710196779964],[19500,"aa9878de7cb971319c3a2cedf2a23dedd1bce2cb3f02b69498ed6c5cb638500e",9.317957166392093],[19200,"eb46f7b43aacaa45ed88d9c41bd440b65f34ad32e219f0feea0641a2304e8f18",9.647446457990116],[7302,"2cd182000acf28d0d45f275ee96ca398423fd2cf6932fbc7b034197bf36810d0",9.917710196779964],[5037,"e6e71637d0ef4ba56dbc061a20068db8ea9ba233b51165528d5ea9843248f5de",10.023640661938535],[16676,"ad55b8b077a751d52ef04ee9af912143e5e1ca5dbc690740c53594f147033359",53.188612099644125],[4427,"7a08e16e837a792678340c2f7c8e351783dbad140d0629f3449d1ceac9dce8e2",9.917710196779964],[9363,"f4704b5834e870a52b6bca6e882aa1b0c5c8c1d1282c6931319620b2d3157dc2",9.917710196779964],[7973,"1b57923f9429eacd3963f0d22f5d6e3cdd23d942508b965f60a5b1e674c2b4cb",9.317957166392093],[2782,"b4be3b6c87b309bda432d43c9ee011b7e1e3a1647189c77b55c35a99e988dfed",9.917710196779964],[10948,"44a71edade53429dd827b4b9a33a5eb023cd9fc0e19cc7e2b5ce8c83854862b8",9.917710196779964],[9636,"8dde5d142ac263e106fd859053a3ed69cfe3c3a2a8f055bce1c8d52a23fccec0",9.917710196779964],[17374,"1e95399eeeea54b65d58dbe254ed8d0badd17dc3d5e53b80026e940458dd574a",9.317957166392093],[8002,"0c403ab7fbf613bb458f4cb18cd7aa58820a6cf844f0fc64b5508b39c74d84cb",9.917710196779964],[90,"91443a801c2806d0a8a1ddabc9850ec44723ce37e7bc81ce53f236dc99ff6bff",9.917710196779964],[4941,"a7bfecc7a527b8ef52ff34fd6ffece9924b1c0fcb4e5118e7961f63a7c8192df",9.317957166392093],[19381,"3651bc7445be445cd9b32090665d9b5e926a1a228346025a38052ec6e66e8f12",9.317957166392093],[2521,"40444b39c5348d416acd9fb795c67325f5788957fbadd2268052cdd67395abef",9.917710196779964],[9915,"ac330cb95aa9251060303fc0627d9f424997dcef58fedb9163ad4028598fe0be",9.917710196779964],[8540,"c899af1ceab92e6f1ff49db274cfb6344d62ceb17fbb53abfbabf88bcfdec8c7",9.317957166392093],[10840,"0aefa1dac0751c445cf28c3ad161391cd69705b6d9de608cd789c10bc0440cb9",9.317957166392093],[11052,"7ddf2bfe75c743cd4eb1867dfa89a2227274ddec842fdd3a233894c3d232a8b7",9.917710196779964],[5680,"8e8038c170ddd971a40502d653e5b7a74e996078803e348ab559639740dc29db",9.917710196779964],[479,"29dcf2a595081b3dd654fbea3befdf27354cddbd9c87ed156769f70567afcbfc",9.917710196779964],[3316,"4f231d0eddc63290fdb3c725f7ee82d7437562cb6947e2fcf79594cf211140ea",9.317957166392093],[4334,"00cc9968988bbd69ec07afe7caf448cc1f2d000175c3cd94d27d873c37ec8be3",9.917710196779964],[11984,"8ec7c895c363343f1ffdbd7489188b029e644dca5a586cc27c1e7ae59b1e6db1",9.317957166392093],[17465,"4b69deb8b3f5caa8006c1d86d95398c43c6ba34e7da8821fd363cfd813e27f48",9.317957166392093],[8896,"259ed5cdd48934926afedb80cc3de248a57ed703a6079439f2d64c55a4dc75c5",9.317957166392093],[7033,"47103e4b2915750e426dc30fac260c17af367ec9470bbc0782e1f48e5021ccd1",9.917710196779964],[16249,"13113c7637cb6825ecb918a61dd286d360255b36f7488a67e1561a4190e75e62",9.317957166392093],[11587,"b34934b0743b7cbbbe08d7a6df968add2b6b6b52d58e667f8f10d2e37677f7b3",9.917710196779964],[10223,"8aca4ab368790a08f33962d446e164db061056a65de11067738865c64528d1bc",9.917710196779964],[8211,"102e4262e56d4b9827e3585e9191f7faa4346c4994cefc4f0cb897edd6c1e7c9",9.917710196779964],[11961,"54b62845b289a965eda0e14cb031184ee1fe19167d499e7c6a937e8a98e797b1",9.917710196779964],[5497,"6bbc488dbb78ccdeadd6c8fe3be9f3d67ca484e9a359fdb6b525aea4a9aa3cdc",9.917710196779964],[3005,"1f436a5b45f8f03c69dbbe46df03ad469ddd3c6823515b7367de70dec1cd40ec",9.317957166392093],[14244,"ef5d261c3f93e1f42d475cfdd06a35edd646490dbdbb3e32d941c83b8c10228f",9.317957166392093],[15730,"b2d26fc853a4d1161b504db31f4ce33c8ba797f8a21842acf4dcaee2bd1eea6e",9.647446457990116],[5883,"1289e98f902a11fa07320c65ecb697ffb5b646f55f9226473642d4ed5f4cc8d9",9.317957166392093],[2100,"fb8f471c91cdc515ca11ca135736eeb64b15662ef41b564ce9d76951d43543f2",9.917710196779964],[3061,"1e5fca0e93507bfdca6589595af104ad63b355f3fa70fed74c61fa7d4de7e6eb",9.917710196779964],[9143,"ab0d8951460b10fcf0066fff38cb9a791d0917d1a7a05f6f4e4b514dfe3fd9c3",9.317957166392093],[17700,"6ca303126ac9195aef58d62e533166f6b2365619dd56a2b3d426defd2b732843",9.317957166392093],[6073,"ba904a4a1b66a800e7518a0ddaa707e570ef66f9f89a1f90d6c188cf49b798d8",9.917710196779964],[8094,"830d6cfe13b74e3a412ef92176a1737b7339c19089c7e02e92e25a143610d1ca",9.917710196779964],[3642,"cf0de18ea1561e60aad8d58cb97f3fa16a2e5465ee874b7f2354739e254effe7",9.917710196779964],[10747,"9a441e58ddc82ab587be4896d3e96e243de35d829aa4cc3a1880176a2f63b3b9",9.917710196779964],[6418,"fb9dd5fb2c8cdc9b024b97dafabf9289b6e879aa236f4b8464022ef27e932dd6",9.917710196779964],[16092,"e1abb02cb39f96ea550bd89793ec3caadc3009f3da9dc71c2febc5f57c726366",9.647446457990116],[7559,"8f1a7d3dd0624708315a0b6e5de744072b0393e50cca146a0d37b182918174ce",9.317957166392093],[18847,"2e4decc7dbbc8c3674625679562f8d9cefb634c991a0b3470b17b8ce7cf71f25",10.052724077328646],[10513,"f39892e8fe6a102838712a5dd6b7830b9b57339a710e1be6cd2ff390a43319bb",9.317957166392093],[7048,"e2a23b0c2379b0757a280c1e2a4fa41c88adf89eb971a3dce6678e917b90b0d1",9.917710196779964],[7489,"ac1fbdec0ceea9fb99cd2a90efbfaf7affe0d17d50f33b91e8b5eeb5ed07ccce",9.917710196779964],[17960,"072276d92d8c4ff63b7a29f26023aa575d5171d9ecbd7ed90e74721df74ff03d",9.317957166392093],[15439,"133879f2efa16dd1390dabb1fb6446112e4e5bf46c64de258daddcf9c7e16575",9.317957166392093],[11818,"1a0cea5d5574e4d688a509c7a21fa24dcb642e6e82a507b62223c4434b1997b2",9.917710196779964],[3085,"f1c1bdc329a5a1957254748832cd4d658b1f09dab3615fc67db528d12154beeb",9.917710196779964],[2191,"23435d50553d70428a8169fb0e2cbe98a2a2f5fa0c514af5f454ef97d47a9df1",9.647446457990116],[1443,"8e0edddcf2ee462c97f2ddc7f8da497a15d290483d4d8c4e19e00ef5137d89f6",9.917710196779964],[8342,"91173c84f3aa6dc91d65deef8ae8bee25548597a0b1cdf5d8727815220ca0dc9",9.317957166392093],[4743,"9936df691cb2b8f8f1cc2066b266ed6c1513e6527ca1f3c10e85cfe3176dafe0",26.173719376391983],[5418,"b90cc4176a5de5a5c29c5845a2683b15399ac4ccfa5787d6573f9ef4c79db1dc",34],[13512,"8e64e37b5c72f8848b9ff68edd8a168d4fa8790aa74844d2b44f961e8f1e839f",9.317957166392093],[16781,"0b0389ef797f31dd4541234d24c225b186d23c8b25af9076daf94fa86304c156",9.317957166392093],[2035,"174c6dd459e6eb5a6f7b1f3da88f64ea575565cb0b240639d0c380261f1fbef2",9.917710196779964],[10058,"7c631a4951021fcfe026f09ec0e8fc4ef0d97bafbf5d10bcff2fb5e4aba300be",9.917710196779964],[10237,"773dffd9895af28c8aecd9825eb23573ed370af7b723a1dc439f61379397c3bc",9.317957166392093],[6583,"a612e637ff1b7f70b759cbb3ccbab31cd42b8cd56ca81d196d285c9a15eac5d4",9.917710196779964],[15994,"0755e432ac568e008d57c3729c684fd7d027979e5d3af7323b26c7fe0fdb9868",9.647446457990116],[17094,"db4a1cc566a99b1e83a297f36d2de94a03f9ee231289dce68f9c476b71b00850",9.317957166392093],[16665,"83cd63c83f5c16ff73419e0d950f549ba461e560728865e5e5565268dfa06059",9.317957166392093],[12028,"fa62462b1e6ad0a7c3ced4efc25398cb83712143c715e3afbf3788156d0a1eb1",9.917710196779964],[2252,"948d54f1b71420162967b0beac14e4ac8d5bae5bae50fd5820e8472058003bf1",9.917710196779964],[4208,"7f44792c0fb4ed22554ae35a035aec8e890fd652531324d5ad1d7665b9375fe4",9.317957166392093],[11426,"74c4accb596edc11a5eaebf39d82d9eb9e457605c1db92015691f507716525b5",9.917710196779964],[13636,"d2a39eaa5c80fd69e80dc0d1f822ac06bd225d47c3a510fa32af5969343d979c",9.317957166392093],[11429,"6fd7f3991247d004d28ea9d608d4da81e6dab3fcfe21fb8d5bbd2f349cb41eb5",9.317957166392093],[16207,"8af53dac9bc0d3539e6aace3d4b6d89c0e68efd8265dfe96f97d47b83047b063",9.317957166392093],[3483,"646001aaded04511415420fcb3da4fc13443cdb419baa7e8729599c98dcc26e9",9.317957166392093],[19574,"037abb3a7e465c9b5a40ae0396b2f2889a6f9a398b0e028a4881f55a9b0b620b",9.647446457990116],[113,"7fda1eb53bb3a5e2dcb2ecfdf0ef43f2cdda41c700de92e1dced9daa086e4dff",9.917710196779964],[12107,"4d003eec89d1d51703cfdd81e50adb9a7fa212663eb0163cef720bc61facacb0",9.917710196779964],[12580,"10d736511b8bb0d0a05b794593ca32b81b4e3bf7a9430aafecd0a8f6afb666ad",9.917710196779964],[7907,"1713fdc237b0bc1a6b7ef228e4ca4181e7daa238314b090e863362e8777830cc",9.317957166392093],[10175,"a0385dced5ce2c8d9c24ca2a5e7ee815d0d04f7f67653fc1aedb2bb8bc9c37bd",9.917710196779964],[16952,"ccad8e3278cb3c380d7fe68ff6905097e05c7498cb96e1aebe621ee7b7371b53",9.317957166392093],[1498,"d3964f5cc448ac039e6bc5989197f529d845fc62058aba966a5886f30e1423f6",9.917710196779964],[14748,"c7663a0801a90ed28614f1b8e421f01e46c253230ee81fb9d134ff0db435f083",9.317957166392093],[9288,"2cec43da6f027714323f4501c2c4bfdfd66d7653de3983360083222c131ce3c2",9.917710196779964],[14761,"b134d81212cd86cb88bc5bf32b6bc09c654b2451621b8be5c7fd3937a419bc83",9.317957166392093],[6395,"6914a32ccec5fd431421451b442b0b5b2b12f0f18fb19ade019438cc63d05ed6",9.917710196779964],[15433,"86e40d3e21b3778b2d5653bd843a436a70d534c78fe32719051f02dfb2e07575",9.317957166392093],[6618,"77547f489012ade0fdd13f24b840f7dba547397badca9c8e32112be766cb83d4",9.317957166392093],[8007,"7c2a4b2cfd6b1e0962e0afaece11e260796228f4a184b8448a14b14346bc79cb",9.917710196779964],[8351,"0a0c40646fa383417ade6b17b870781f27869ca40e6f4462622fd68ea9c1fdc8",9.317957166392093],[15912,"ba6960c8e263a0e02be6718651b8f076564f193b9f090325eda48b5465eac56a",100.53475935828877],[19401,"1fc057ac947fddadc80e9df8464c318b637b859e6cef6d2298c05bbf3bfa7711",9.317957166392093],[11137,"26d77be51b26204f65bceef9a96b326f6f07a08be07685dae4d34586b7a50cb7",9.917710196779964],[4366,"f4470e0817bc78b045c793be36db21f38535b2f9627fae5ada82f11a5b1e4ee3",9.917710196779964],[7061,"98c0122da42d671c38941509c4cdb277e2887521aa92ea4432d1869c52b298d1",9.317957166392093],[18605,"ca803bf0933486dfd313dc082196e2c63aec1dd2e12d009ddfc999cca6448b2e",9.317957166392093],[15383,"9091f11aee97dd3a2ebbd4c6e5e79d6c26017a449d039cd013ad0478b239b476",10.052724077328646],[5699,"74c9174bfc1d7d0a12838f36dccc826331f9c93b1d10ef5b084014e91ee10bdb",9.917710196779964],[8544,"ad1e0e448bb3bd8c6b43018a1f0cf7b544eb4119562f1e9d654ecec69539c4c7",9.917710196779964],[10059,"3ed2e5144f651cca046f4fdc859b413dffbcd9bb0a3d9c8b518b9647a5f4fdbd",9.917710196779964],[16261,"8052bd77f44e6149c4d504f47854187f048db5b6023630fb61950a34b30d2762",9.647446457990116],[4810,"136ce87727c1e296e736615c25feabd78d47f28c20dee96ee35108874acb58e0",9.917710196779964],[906,"ad57fae07628f915981cacedec9cae911aff95aca33e4619b7fa490ecf85ccf9",9.317957166392093],[4919,"fccae47e6e3412a750f66ab4fe639cedc17deed5f0b49477ba13e2acc07bbcdf",9.917710196779964],[3340,"8584136c77c194ff5094086172723c5f724217d70f2a60c7811b84edb7e40dea",9.917710196779964],[16528,"163eec7845554ae110d85d74ea942048b8937b57fd2b78a8ab7d55fda224865c",9.317957166392093],[13016,"0bedc866fa366671beaf11d959ef6514b561352af3187d127b3adc5b75f67baa",9.917710196779964],[1362,"0ec714750f5d2178dfaa7f95c4434499a2ebd8e203b92514d909fe984eb6faf6",32.76712328767123],[10003,"4b929426751c7e7769b59b8fa73dfeca5b4d82daf067d58e196b94a0df9250be",9.917710196779964],[18405,"33e4e3777d36062b3a28bc08ed65e9181425d0336b19703776a8d615e36d5233",9.317957166392093],[6955,"f1ff06192ca17f30162f7ac95e81c70232a7f4f9ca455360de87d7c3042b3ed2",9.917710196779964],[13641,"91b17a51b4e548a78dfdc44d4e58de527ae400e8da74a37f55ce19a98624719c",9.317957166392093],[17142,"a4dc35143dda4db4f8431b299e4d9a467cddbbf0faf1636248da088acc1c444f",25.359430604982208],[8373,"f5e63e6adc58af92bdd9996b2621c8c295b20b2809894300c4487f0f6dcccec8",9.317957166392093],[16327,"ccde28bd01b80a5b90ac849071bd92bc805b74b63b02cdc53f9e6a021e757560",9.317957166392093],[12670,"9e5e94121c3eb8d6bddfdb35527ddc26c4b0bb5c6d4b392bf0eeb287c9c0c9ac",9.917710196779964],[15300,"4cfc2e817ceaa1b667681ae742431b6c7c7e57ece849bc5d626056153f556e78",9.317957166392093],[9067,"07b57fb33ad2978141bf0ab7047dce0e046563ca238c02cca48d476f18ef5bc4",9.317957166392093],[9443,"3cf55751c1ecffc30d2c86b91343a8403cc630f2053f8f39fdce8ae1111212c2",9.917710196779964],[16521,"20a472cc542f8747bfe51ec138f9edb0dd597c2d24e545bbe5bebfa68bfaa15c",9.317957166392093],[16586,"46e84e4b420ebc47aaa7cf021603c496cbeef81051be3dfd3249b40ac6a2535b",9.317957166392093],[7989,"3436416fde24510f9091131a26ef5499007dbc233964132e87d8b961107297cb",19.796387520525453],[16015,"9ba4e553287601e68061dc2ddf734c05d6321b3056ad11b8a6173922be762068",9.317957166392093],[1422,"32d68ecc418e1a152b4c80b8870c493eb03dafdfe15d72a8d54e3c00be15b4f6",9.917710196779964],[244,"cd18c54343b0369a3a4a807108f9c0126893cf71087eef7faf432f42890559fe",9.917710196779964],[10576,"67a8749ad1e7f2d4048201978d4cac9fcd47db295276db674f080edb7790c2ba",9.917710196779964],[1044,"06fd2042d900475c162dc3a9ef2d954632f972a8def8a4fb70738920632001f9",9.76595744680851],[18899,"81a9b0e36a3860299414a4ce6e6fbbea7bdc78811fa371a4bd24dd7005458d23",9.317957166392093],[18011,"b4432877acc94beeb5d54541f0edd79c8c1f56c352a644b00b627d0d3753023d",9.317957166392093],[1099,"081b7d101d11d8b7d7b12a60f9f63a959b470a263cb39418d947606ab35194f8",9.917710196779964],[19095,"0526c4e2163977964d0064dbfc13e52d6664123fa0ff14bc866fdc7ef1e6ec1c",9.317957166392093],[7078,"a763565459e128bfacab7291037768d22d49e424f893bd0c69dce4a062c378d1",9.317957166392093],[11437,"25f762272acf77a90a3963613d5a8e37a54246e047625e7ab67f5597eda30bb5",9.917710196779964],[2504,"26ffe0a60ed99138a3e580fbc1f990134f35c2e675eefd42529fa76cbf34cfef",9.917710196779964],[12631,"bef69a8c8450ded700bcdee20140c6e50dcf3079c857a176ae9d3b9152e713ad",9.317957166392093],[12320,"952b8bfa2f144049434dde659b96fb0cfca51be042a606de3564361809e714af",9.917710196779964],[4217,"808911acec64821c668bd0b8168f070c1fa5e2adcf87e8cc02abe50b7cff58e4",9.917710196779964],[9503,"04e046751bb94bf05ec7c81898cc4addf65fc9cff0dcf8acdd764062cc91aec1",9.917710196779964],[16553,"40d4a8e258bc936fae302556f52dc547c40f2e112ed756a09b5bfb466c75f85b",15.91637630662021],[14560,"d0c590db0864345fe2663e01efac88e8036731f973ecf6c135f71a21563add87",10.052724077328646],[17023,"fe05272af4e18dc9f1873216d566dd9e370d569e0178d12aa4529109f20b7451",9.317957166392093],[5002,"9d00464845bc226d4f91410690419dd7dfddb7cc11c85273a149c1f23bdd26df",9.917710196779964],[13461,"7d5405ae6f615dfb5dc90055cfd3fe97aa4087a287aaf875e0872d30c748cba0",9.317957166392093],[12392,"915949d55c5c7a3c70e0092afae4d457a643e53933b02d3f2185edec2ba7a8ae",9.917710196779964],[13030,"04ec8d78fb2a5faf1b023277694c81415187f06e88426be758f8e3f8e4cc65aa",9.917710196779964],[11258,"5d013a54af5d94d11c9316d644f2409e7eddbb2211542850052067fa04104eb6",9.917710196779964],[16414,"46610c981de65ac232f71eba60fa5fbaa3923435d35928ccc43619c3d3abd55e",9.317957166392093],[1072,"f20860dcc21f816762e690b92b501b0fd40f6b565f3f8d888c6e4df6bc32c2f8",9.917710196779964],[9976,"dc4671b97645be046e35097c59a75368f9017f743b71a0d121273a8ccb0676be",9.917710196779964],[1623,"a89abacd7d4616c87ee06d627751aacae8942795eb378e22957ee68a302570f5",9.917710196779964],[5607,"f744b672237dbb1571f31142d453754cd6fa741a3bfd03af8b23156602099ddb",9.917710196779964],[18039,"21e29e93a4d7856da9099cc6f1b3f845157410503c42f3ff3b153e3645f3843c",9.317957166392093],[10024,"af37b9f94efc4b939c35ac17afe921a23afd08a5c6c3dfb7fff93fd47b3230be",9.917710196779964],[13204,"1c6c6998011c89bbb2b3600803efceb61cd1c9cd968449ef52e3119f66ffcea6",9.317957166392093],[11728,"c6f4a7c9872670f1618b0c973e6ecc6f61104985102dd7c53b878221a8241db3",9.917710196779964],[128,"5e6fef413825ceb9a3069198ab85f7ee332f3c71fd343286fc8a7c5cc95421ff",9.917710196779964],[18098,"f24b51d91503132af9a5e1b6330bc654269062916e26e6344fcff4006a38063b",10.052724077328646],[3867,"bf98f88fa303f688d4deaa3d4f3d7f9a43e34ac28cce7f174606dc42241f90e6",9.917710196779964],[10501,"50436d5575eb98fd010de24e91a425a98d06c8222c6a0f6a5d1093e429d12abb",29.112403100775193],[10356,"118fd711b25bc69b74a3a2bcaaa35ee5b6e26514c7f49b29f2298561106e04bc",10.030959752321982],[7751,"946bda54a994d553441f078f6c5be681315793ff06c48c7e313479a91fc221cd",9.317957166392093],[6119,"78b42de3b50e1bdd997461c631a208efb6d73aeebb68c61e4630fbe9e0b74fd8",9.917710196779964],[689,"4b67f69f90bdab13b5ce7616cf621d9a78940d1b0dad24492decfd79a90554fb",9.917710196779964],[1702,"4ef5c7dc4993ff3ee313448344ee317ee1ce99e8853fa90f31f98acf962cebf4",9.917710196779964],[14364,"36632c1c4ff8a6f7c3f2e0cbb40735a2acce82e75b828a3e1e06919b272d298c",9.317957166392093],[13326,"b9df5d727d49e3e69b238647ee0268e90b069fe1858aee2bd65bebd950a720a4",9.317957166392093],[3581,"92db447ff7496eb3c4a7bb9ea704b31017c55062788a694f06ff1b3c9ec56ee8",9.917710196779964],[3935,"23223a9f4c18f71789dda12363f453eff08e5f0744af9b5746a348c5fe811ee6",9.317957166392093],[14428,"be3fda4bda48f4d7fdd116ab68da44851e80aa781ba6bd451c85d8ce5ddeb58a",10.00836820083682],[18534,"d7b3a653854270eec7574c614d45c54cc5aa8e1d1ed9fd5efe978d4a866ccd30",9.317957166392093],[9312,"ae0d1a14453df80a875b5c34f4c16f745d5fdaed4f77ce9d9fca374fe722c8c2",9.917710196779964],[7376,"1c0bc922fd8c75d6d462d6bf016b5c53c56064c5c320449f57d57485f5e68ecf",9.647446457990116],[8552,"bddb19311802d1d9b1fa6c02c3ecab2b2e2fa0718f8c950a775f94099ca1b4c7",9.317957166392093],[16932,"b6587671f5bc46365f03262be4cdcfb850776e9b49d8a22a6bdec7daa1457553",9.317957166392093],[16461,"6be3ca33481acc9864feafd982630c91fb7f86dc6a77c431dd955ad04fcbfe5d",9.317957166392093],[7812,"52977e01ab1ef5fa636c6151d3867dd07a3b9e2fab8eb98da74325a2ff65b0cc",9.917710196779964],[19718,"8b64d0f14f0a3f2b704ebcdbe34cd96e682a4df65b93cebea14cb6fbb6ac1c06",9.647446457990116],[1817,"cd298c4922afec6dc564ca1cfab53e5941b09c6dafd03448c5629a47dcca21f4",9.917710196779964],[18799,"293114da8744d455bb4a7420f84b59d0e121ab9e5a0d38e507a97e00ec6ae826",9.317957166392093],[16808,"ef6a5dc9f79d2f6e73991a7ad96bb94db2fe2ecfe364ed194ac4db13f28d0e56",9.317957166392093],[1766,"2e4c0ea3a3e0760d8c5f9f9a534175fca75590a7388c1c80fcec7b2517967cf4",9.917710196779964],[12764,"795f3f943ede06823166cdea073e6812f8711b65589a8dc37a112fc2581721ac",17.073014018691588],[11953,"a57e4faa1041c682ff8f17457162706ace57dac0b7bfc6e3c1a40f9c4218a3b1",9.917710196779964],[2526,"c72331266a77ee1b9dcb8b625c43be28c5e42b7339e7c898c1e7f3605836a4ef",9.917710196779964],[8039,"ab065b322f564f8f043ceb0388b781587da7304b552f918263aea29230104fcb",9.917710196779964],[5498,"db11ee56278b6ffa5e03e2bfd987b043aeb6cc29f67f48b94de516ba8c6d3adc",9.917710196779964],[3070,"adab097d40cad84cb473abc3b567d04dab0163796a124d1f2a0b670d504bdbeb",9.917710196779964],[17166,"03fb6d5e0b91fbc8ff0f6db1c8ed38bb4376f1bed049d970b7b692d73522964e",9.317957166392093],[6766,"d9761eaae7a171dae4abf36b9958f0bd6eece4c1e27a957ec0c4e935d8aa81d3",9.317957166392093],[19451,"b71d6b32eb1c37bdb4120b75b2b85ea88904b47047537108fa7cf66f726ce10f",9.317957166392093],[18732,"285a1ec43f40512be34836e1a33f2d29abcb9367a9754443944b804d2d744d29",10.052724077328646],[14600,"fc4ef2b83602f2b645e1d7aa39f1fdfd0ac083e1a61966815df6a90de8131a87",9.317957166392093],[5420,"54cf0f1186a9881aa241fc90d6c877a2518bc867d263d33e12c8c1161530afdc",9.917710196779964],[15456,"68632309fb5f33cb2d879df9d80f64b31b8fdbbe4639f5874ff0133dda070c75",9.317957166392093],[11415,"6277c79b422c2198032be3dd455356ad69af6bc3afd55bb934280e91144d40b5",9.317957166392093],[12032,"23502ce7b4960585cfa1bf7aab35a5e561810c4a612496d660dbbdbdb2a516b1",9.917710196779964],[5908,"40a486344ffdd2fca82872918f1cc3a36663b870ddbfcfe705034f9c5f6fa1d9",9.917710196779964],[15444,"e9463f105811201ee2d76e010625cbe3016b26cc45da13cd83047a89705e4375",9.317957166392093],[9542,"14eece1b751ac1fc6dde1aada6c93e443409677b0157b8df4ce953d0a3db70c1",9.317957166392093],[19813,"232466fbed3799508ba03258e89d973e8f5a811b4f6b7913f257cc575ffc3302",10.014471780028943],[10898,"34b6c12d00eba5e9773357d661710a8fc983a0de6f941946cbcc5aa7dbdcafb8",9.917710196779964],[7076,"93ad9c7595804d6c5e81994637f1939622c4ce21c4b1e8b121e26ba75af07cd1",19.17640779290099],[13590,"726d6629f1e1435928ee963866c5f5cd3f8d90716c8e1bb53697a8064698b19d",9.317957166392093],[19113,"4d940908c5a9303acfd8dae5057bff8ed2c4c7058b17d397694d6db93c04d21b",9.317957166392093],[9224,"55ee5cc5d9e18e4c1f6c759cb1e8b05f4f541c7b5e5fca270ef3c5407aca52c3",9.917710196779964],[953,"88e317c03068c54bc1f393f5e40ef0b8fd9f47121d4bf7d13fbb1438ce067bf9",15],[2735,"c7b60264c87903cd6797cd3bdf9aae394ce1f93d222f85520159358a072433ee",9.317957166392093],[3957,"5430df5ba9cbb03e341d665c83d98d888b42625e5ca9f6f51bc7d8dba83df8e5",9.917710196779964],[18119,"71ab4941581850b2614c9b3f8e4581986c4995e24cc6f1cc7bf0ee05cc60703a",141.45234493192135],[18262,"17b53013b074f86d096be911f90cb80b0bdd76ba4d70c757b803c8357961c236",10.052724077328646],[8653,"751e4efd0b315c68252307c4d359f81626e36de86fd149d505467c60ec0704c7",9.917710196779964],[4428,"58f3606453de3dfcf2be4d9450707ec5b45041ed88bba2c17f160b4a8d61e8e2",9.917710196779964],[17413,"286c6e00f4aba2915dbd1e10c16491c0ad649a0158dfedc0b3da29d468cf8f49",9.647446457990116],[8379,"8b1b5a3a2dbfaa060fa52e9140673b394649e5c17f52a710a7a306852028c9c8",9.917710196779964],[16409,"ca223190b00ee85c35e7f76245919ffbf65ab7939f8e93313797e7bc71f4f15e",9.317957166392093],[11661,"7fa86025471d83e0bd0da3d403101fe4f6c2f801eb8fea775c0c27985c2480b3",11.073496659242762],[2704,"d834b0d9fb62579c5cd7db152f650c2c8830bd9eff7f2dec33462671f79d72ee",9.917710196779964],[7131,"f545790048e348c15b0210659ec624816535ee5e1ed116df44ab4806f38f1dd1",9.917710196779964],[838,"4cc7f970590b416343fa21c6557f9442d95c9c5c97a16b9bf1d035d2780c4efa",9.917710196779964],[5346,"2272b1b77ddf77352d3b4744a06d823b1c073f84d7fb7d5aac4bea78ad7a2add",9.917710196779964],[3344,"9a9358a1f721ee716a2a786428872013cc91ef153238d87fe5981f2e28f308ea",9.317957166392093],[7747,"ef8128785986ad018875e77fd8a64b958cc2ca8ec343f44dfb8704ee2e222acd",9.917710196779964],[328,"e7bd8df053f84e24050636179fdce6b1d6e57ffb7f41a5a8191cf91c97f3d7fd",9.917710196779964],[1689,"c8e42af00827f4ce64f81fb8e12b4b07d3b771fa8742bf8c94713b75b84a01f5",9.917710196779964],[8411,"70599ea61782f96042b0304e1dbf395566ec0739fc3fa26f72b52a1b5f0e8bc8",9.917710196779964],[19025,"6f179dcc38ff474b0596aa6859e432931e4787948692f32c82de5b557e30b51f",10.052724077328646],[7678,"8d45e27a5fa31168da64ab37a6389b5986d14c36331ffd9ec2729234b794b8cd",9.917710196779964],[18181,"c762c041b1838c3d4fdd749760b26af1dcb9abde40501f1dc7ce8b18ff5fa738",9.317957166392093],[16392,"c22efe516375d3a8f201f13a938ba25d09b9765528f204ca21cf8a1095722f5f",9.317957166392093],[312,"bd61171b0c549dd51604da1c90a519fd21b1691df350705820919414ce59ebfd",9.917710196779964],[16946,"337789ad39dd590148ee1fd3d2051c58e7810a4d18169ed9b12a72a802fb3353",9.317957166392093],[8726,"8e1ddae62ed3f657849bad8211da31e27951f0e8767b356b871288a40ac487c6",9.917710196779964],[8803,"f2cd0702db1f2e85e587a173294f9ef273d8fe35f442ede4b3e57fe68ed70ec6",9.917710196779964],[5496,"a15fe4d9df236a93d763dc9cd001330c0986ca8a53fc55a5bbdf5204b11941dc",9.317957166392093],[4986,"34a9e87484fb2382288fc17fd0dffd0a2bf7ee0b363c1544226e35ef511a44df",9.917710196779964],[9821,"010cb188b6ce56848eaab996d3104ebdee1775b57eb81790d71313ed177a7fbf",9.917710196779964],[14442,"a17b4a3bdef965d76ec11da38a9b21edb48dc53ad2f1f6963d2ff1456a2a638a",9.317957166392093],[15718,"f5beec9381baf07d8eca7091737cfd83dd38acc9a98d80f1745266950fc01f6f",26],[6893,"4b836abd745543422d8fb3f7c3db1723e2e1abe5a672f747026e5d1979a1a9d2",9.317957166392093],[9753,"76f217c8d3b484773e2aaaf9227f59e4630c6e93cf1b16b3f069ee86fe6dfabf",9.917710196779964],[7342,"c5072422cdc971c75a1d1de1dfbd97731b8868516d6f01e31d93f2d5959bc0cf",9.917710196779964],[13434,"0cf5b853a481d7ea3e7ac87a88613aa2799b427cb5fcc316400a4ad7267db2a1",9.317957166392093],[13153,"686545c0d5dadfd9622a1419aa56ae852b4e0932a317b7b8e122daab1620eea7",9.317957166392093],[14502,"0c5d7816c5d4588746b34431ccb9bc05e306d577a4d61935fa57b8f30fb63689",9.317957166392093],[11262,"73d67059121835f671e24912a5d595b5f2b91150cd63b0907719fa500cba46b6",9.917710196779964],[16888,"e738d2e779e85db927d8b9d845ce892e8a531980e13349f02d2213a269378054",15.003322259136212],[18562,"a7819421821bd11a2a7545c6f4707a9e1115247305c867d3907d58aa8b562a30",9.317957166392093],[15397,"f8d87430812e23a2d7fdc5429258688313824dba74752761e93134c62c556176",19.09090909090909],[3127,"bf782472d67a8b7bf6ddc29796e9c943a89f5e50d6c79034488c388996b77eeb",9.917710196779964],[15364,"c058d194b28f1164c7c49c79b28117b3c979e0e2ecba6fa1330b9d582db20677",9.32788068318499],[6419,"77bae7776c0f8408864cb96476169dd3e55c3fee0b177b7ce9181c7583be2cd6",9.917710196779964],[13374,"14402edb2963242a1da0edba1d0a2a81cf8aad307672051c1bd1279f08eff5a2",9.317957166392093],[9533,"b8f8056ab41bd018ae8765083add96b9d070e2bbc77c7ba048d309e0aee779c1",9.317957166392093],[15003,"dc919eee644188bd537dd950b015e9b905b429532de032a8c8b677a6962a4c7e",9.317957166392093],[6371,"e87a7e0285da529e9d5591eb9d75cca25938ff96588ff6031763e7e0f9d787d6",9.917710196779964],[3777,"13ee7a864a01f7ee20bf1c52fc1d8f94cd360d5838d56b1a6df58f3c4cc91be7",9.917710196779964],[14993,"93c2248505afa3ba86c0f7f755b475bdcbbbeb6a1a526f90f89112f95a7eaa7e",9.673151750972762],[9220,"2d2d0179894370495cb1a58f74403f4253dd9d0c7fe14686c47de132af6157c3",9.317957166392093],[2734,"8ae09ec557c0731ed9791d80f775fb8e69cc77abfd2ce5a04f6f9fa2a96534ee",9.917710196779964],[2248,"39841399b6b757cbd88cb750177ebd07f58c5c534c5910a2114371a696ac41f1",9.917710196779964],[4403,"c118dac00c4bab43584ce0367c07ff128d9c46bae55f58ec14af432d91510ee3",9.917710196779964],[7936,"b7f88fdd42fb090e298d1370ab276fcfaf937154bbde6013f75bdcdb26c8f5cb",9.317957166392093],[10471,"cdc310e8228af3e851226c34d83d327ecae8cdb9c63be50d9c7d7f3875f54ebb",9.917710196779964],[5783,"5d6e363bbc22b92ac80dad458cb78d0012da9eec3a87b254fdfb91db7b3a8bda",9.917710196779964],[5412,"03de0291f3700bbe85110013f697c2084a64866ec65fa4a9691d76ae3a60bedc",9.317957166392093],[14860,"adbea8a9fd546b5d4830cb25390c8d200ee998af2f79c88ba962f72ef2dd9081",9.317957166392093],[1000,"ae9ae935b8f5d9c601f07c12d10f0628aa7596b9b59720165084882443823df9",9.917710196779964],[11497,"0dceb256f9364157c2319f6ae91e165f800756c09251cf281b93cf3d07218bb4",9.917710196779964],[14897,"2d622df033f2fcd46260b406d982d9a6de8500b09664570aed2c5de0e1b1ee80",9.317957166392093],[17568,"996f3d56dc35dd5225c5c4cac6c2f2b6e7f88f7c23328b22f4b6581468c0ee45",9.317957166392093],[3411,"eccb9eae83e6420b7a30fa11a4cfb2553f95eb70d1da745b8abbd56197bc97e9",9.917710196779964],[15429,"fb0f9b24fa8d4597db966501d59beeb65b5869307f9f8ba9583bc13bfe9da275",9.317957166392093],[2710,"f35570ade3a2973787aadf3fa5b6a9a305b72057052ef740623e252bbdca64ee",9.917710196779964],[13059,"1b00a460bb86c2ad0185e3eee497975f297ba9e9ecc6dab68a5c9a5a941c3baa",9.917710196779964],[13736,"955439b40b10deba292fad5e3be7c27e1c2d2a7995579b89c013d672e594c79a",9.317957166392093],[17026,"0ab77ee5c954500675a5f3425ab1234b952f9125da80ca8098781d8bb1dd6c51",25.84102808186578],[9282,"25af83843fb48305f8c0f814762152faa5f0c71129b33a9275b6bb205c90edc2",9.317957166392093],[900,"1be4393e3912263c966da30e1491d22651a53bb5126c940f8f953e11679fd7f9",9.917710196779964],[508,"f98b40e94018f388533063785c0a57eca7fcb140b30c492863bd63b726169ffc",9.917710196779964],[8863,"a70a0ee74c538e9a5f09f29d5d8fa6f2a91734b8d40884ce1f8586c91bddaac5",9.917710196779964],[10616,"113dfd431e93d2e2a0ae51836d899b632daf06d7d7db921507b30d7ba21094ba",9.917710196779964],[793,"eee6382d52b7eed7c79294fd97f5b794ddf95f8718266eb8723713401b7992fa",9.917710196779964],[15025,"033dea61e58ecf70ef6c0765c270918f35e18b90622954edb4ba0eedd51eea7d",9.317957166392093],[13741,"b7796025cd12a8124ad38ae145ce05748416c05d745d1150f419d27044df9d9a",35.17149220489978],[11472,"977f14cb4827820b9a982c63a5ecde7f3295e9e7d98d964812673f385c58b8b4",9.917710196779964],[17935,"33172fdc2fb4dfd1fe8be3d437b8765f75ec650ce2db4be8585f84976580913e",20.201793721973093],[17552,"c6b30ee5823664ef1020240932156109a673f428c39c0203b8e1eb591ca86d46",26.17364657814096],[1897,"e30b8e4a1ab0c1ad1fdd4ce2cdb97ab2777e3566f60f8274d4ad043f96caa2f3",9.917710196779964],[9550,"988d53f5e9b9f1190c29a6f006ebb0105be0b6eb004b07562243f2f8b8a963c1",9.317957166392093],[2375,"99971f30cebd3cafc27ba68903203c0583fba9ce865696a80b1219caeb299ff0",9.317957166392093],[15233,"fca937a04b70fa21e2b8a601eff83902f7ba4ca75e0e3ff19c2a14d535eec979",10.052724077328646],[18469,"2693e0ca56d1d20a65a37510c9534495c3646f8fb5620c0d4422d3c77ba43e32",9.317957166392093],[12611,"d961d3b4a1c927a837cd53b276db5522df16cd8fd3ffb18cd576e7b9fcdd2ead",9.917710196779964],[4615,"f12cfa0aa7d549860c884f9122cdf2b90b1d0e6f9fc505f9e4c4d96ccf7e81e1",9.917710196779964],[17104,"969a07813427d5f46cb6faf5b510aa60d8a7861a514e2864408eb40fb4a3df4f",9.317957166392093],[3934,"2962974fe251a981ac49f86d714fc7262d4ced81c3fb49659ad1f446f9fa27e6",9.917710196779964],[14362,"ab6c06ede39dede5ddc2e48a9bf1df111c9b34988f63fc032edb24c6d0ed318c",9.317957166392093],[12397,"5f1b5bfeb5e4bb6c8b335953af0359d774c3949abebbb2141df84d08ba1aa1ae",29.50530035335689],[10588,"63d628c484db64704b2c28bdb5823f3e02c48d0be269be12bc1ddea6a347b2ba",9.917710196779964],[10939,"c5a6846faa288eb4d8904022631b61cb782e7d0cec2f9816a3b18e57d39e74b8",9.917710196779964],[4653,"ba5018d79f8a90265f23e81cdb5db85162c1562f57c2c7acb3ce62acced848e1",9.917710196779964],[7458,"4f1b334eb32a082ba05256c95c256cc9b1237e91da93136fb4af1282a46907cf",28],[7938,"7fa68e60e423bfb6addc0c76bf77215a9a4c779a5940cfd16435c51c6417f3cb",9.917710196779964],[18531,"e2338d504aad856bd6aa98a6660cb29ad38eeaaebad20e1528eb2f75cf29de30",9.317957166392093],[7656,"7b3f9aca302310ed046b68c33dc928fe17c24d6bf46b092a20390e471ca1dacd",9.917710196779964],[997,"f73b22ee94420d95099fc96a9d473e5a791d76eafab38c1d065ba166781542f9",9.917710196779964],[2010,"3c1b5f205db252b614d831091daed0b41045f62dfbba83316ba9a6ca10d5f5f2",9.917710196779964],[17066,"8c753615f1e38fed52ea48ce94579f2b82e28a108ee4efaeb287105e04cec850",9.317957166392093],[9038,"462ea26da6ae48a0a1050188490ad49e659051bcb8fdf437886c57e7e7b687c4",9.917710196779964],[6732,"69283bcc0798385576983bc22ecc291bf38368261ce6301ce571042b7c91bad3",39.12786885245902],[6925,"0e398a827c8ae0d35457d298bfc2962a703b368cc5d15981ed1d3879aa6a74d2",15.003322259136212],[15759,"f66f86e5df4629703cbaef351be870fca3e394978e7d0279a93efdc486e8386e",9.317957166392093],[13454,"3783c6ca0d9e06d4f07eb207b3bf062a51915ca46aab86aec8bc094a6669ffa0",9.317957166392093],[3405,"1774470f832ad001fb42bccb43a70ec96c97590c62233b5b6d9894804933ace9",9.917710196779964],[11830,"0c111d17e27f8b5df5cfb51cbaecc10ec751406150cddbe08515ce9c5a2687b2",10.052724077328646],[1001,"2a23fc636c10cb623a651d4b6e56088123d3d46caaade633846b3c50814339f9",9.917710196779964],[16544,"d797cccf85cb30a739d06eacc87dddf604af282054439ad6838af880d47d275c",9.317957166392093],[19780,"26989941d32e2ae0a8b345fe2f52c0560594571fba1739b927ece1d409007c03",32.387083462292374],[6331,"9b771e1ec897ef449bebf67279e880ee7506b3301ff25b3f8e4aa49bf0bec7d6",9.917710196779964],[16403,"c183734212288aa66c41968f41696ad87d800f090c2b5b3b1dc02c80cec00d5f",9.317957166392093],[12241,"8d35cb5ac63f0ba78a07a589a4abe2848a60b049d4e8a9917a8cb0029cbcbbaf",9.917710196779964],[10702,"05a6bdbeb8481774cfaa77976a6e3a55c06e6c57d90c19e1a97089787951fcb9",9.317957166392093],[6063,"6070b47b782eb413d21ce70b11eccf8ec79c242ba150544d31b9d9e0b940acd8",9.917710196779964],[6508,"ff896a9404d069778ae853acc696a33a07b2d523b5ad3592d48e3cd8982961d5",9.917710196779964],[11530,"e9f222fb14e5e695cb7ebc9ba70d08e58580aa76137c4035450af5e672eb57b4",9.917710196779964],[6740,"b2d45ce569c2792afc26cf4112b0fa104b90614f36c8fec3fc3b1472b031a9d3",9.317957166392093],[11966,"1491e48bdf12beced48356fddc8e85bbe02b445a71f4ffc3c9a5d29e515287b1",9.917710196779964],[11189,"dab8ed6ba38743f2680295c8cb23f3213230265b2dc093c97b8e26a77e77bcb6",9.917710196779964],[14085,"4a7982e52aeb30c4f51e443ebf34ba3e3b7bc66779badcdcdf64f5776f75f592",9.317957166392093],[10900,"b6331efac5b8d82837f58b604f761a2e7a5c4b16231b065c01b42d98708cacb8",19.00467174821736],[8333,"8564d9cef72fab72d61fdde94774b620a5619a1f74155e8d01708ce371241ac9",9.317957166392093],[12430,"29504031e3c35fc0d123c0d4b5a16f6feefe81dcec0e68c6867c884d4b4762ae",9.917710196779964],[11588,"1e273cd3f22dbf35b8dd39f3145b55978ad07066c2c2c56422a751fc6b6af7b3",9.917710196779964],[10984,"1de9cacb07cc1faf3657a398661c616efceb05e47364dd1efad02d15f89618b8",9.317957166392093],[1493,"199b10f98e32ac7d73af3f0b804ffc76364c6b9eb043f3687a28c0f5caca2df6",9.917710196779964],[12851,"c3bc2a86194224c63706cc362842c252f15ffdc1bf75d13c7daa35f1d3a890ab",9.917710196779964],[11026,"961acc8e47564257fb6ad73b1a4b3323b26fd2553fae7b869761fccd895edbb7",9.917710196779964],[7978,"a7405a4e38a411cdd8fb88b21b1271f52691ed04db88cc8afae4ea700e0faecb",9.317957166392093],[12374,"68ac218084f7f00c150c151d79873cadc93fa876a510a162789dcead26c5cdae",9.317957166392093],[19701,"d248dbcb056ae678f204d52980a1a638f7b4a1ea33de3a38a856bae9e644cb06",9.317957166392093],[9262,"406bb01ad8ec462d456b234f643613ca6f8e13ea05abd3c0c4938338225f10c3",31.664921465968586],[14609,"7b807c32e2378b5f9fba32f8d85ed2a6d0995b2a45804a7482d1d3f0891ef186",9.317957166392093],[16460,"d50261036e20833fce3a53a1ce29cccb3f139e6084509da8e57bd510167c025e",28.187082405345212],[874,"4400d664f97b04ea2e07ea551deaf7bb9e5b7eff7ed6a1c95b79b95b398610fa",9.317957166392093],[7660,"86a6609e1cfbaddedcca2dbe80b3bc7039abff4ec6e615a5e3e08aa101cbd7cd",9.917710196779964],[10805,"75bde504ee20a125811fb83f7eec87551fd6a0214433054bdfdd1901595143b9",9.917710196779964],[224,"c77e54b18ccb08510b07c67d0b30a7f8772eedfef6d7112243c3da64fe0c7bfe",9.917710196779964],[12936,"01c5138e34ae854d6615ca4aa483c76797824d89432efc31ecc60e494bf901ab",9.917710196779964],[14067,"fcc5e774405f1ab65a0d0e25a655b5ef20161893b2502ce8b4b26bedffc64d93",9.317957166392093],[13713,"a18e9182124c4993a3e7c5df795f5f737c577eaa7b62389a66feab4586aa1c9b",9.317957166392093],[5365,"f28bde0fd565d4d1c18f8a174795c02a34b42f7776048dd61fab9d3839fd0cdd",10.052724077328646],[18218,"254bdf0202413b450572a96fe5532a15e78135b629084c4437bcfa99a136af37",9.317957166392093],[15351,"9fc03491002bd6be58063df5e8afc764805b42e71a12ce2bb6eb904455355a77",9.317957166392093],[15702,"3dc0d6429d49fcf7f5a5bdb3636927c79290ccb652e4427ac2723cf32c03746f",15.124260355029586],[19247,"7a4cb1d011219c1ae2cf2ece108a1653df92dbe5f6b8057a350a105ed02df816",9.317957166392093],[13215,"a66f999b8f08e2b8728487ea4bee095835a44d5bbcfce211befbaabd12c391a6",19.19373297002725],[8969,"61441ee40fb6db739a142a974d4e8035f7b086255037030c3ebcdbb8f61406c5",9.917710196779964],[13006,"d397e4b38ac160e0b06412f754267a025eef5d100ae730fcc2c107677df789aa",9.917710196779964],[10445,"627672a1e045d98c2a12a2b060af7f1da7ab8a289c2f1acaf0b0ac376a2971bb",9.917710196779964],[4421,"6267cabc9a0f5d6b95996ca6407ba0e90ef84338dcdec0fe72e29af0dc1ff3e2",9.917710196779964],[10230,"2f02d710be5d34c11d0d6605af0343fa43d2c769dc8e2525b5ef0883d566c9bc",9.317957166392093],[11295,"f1e130e9d92333b14cb86d1c8fd8dc660beecfdf25746587a60b1ddebc2813b6",9.317957166392093],[11270,"ac1d38ce6eac95e22be427f9754153da741a3bc216e4a6cea41cc9e5f60439b6",9.917710196779964],[9830,"bbaa8a92c4b829944da27c3d0e41a3119e67b8abb67b678e87649acca6646bbf",9.917710196779964],[16442,"6810f42348a625e66e19f4ac5f2a7085035add16f3731cea3f61b6f47b48545e",9.317957166392093],[10257,"164f0783f797f70b02d0b4d3b1aa6047f8236bcbdd7beb529eb10f0588eea6bc",9.917710196779964],[15808,"adb42ea9936d65bd3058ae3c962d4d08740f3b31791edcada5d38a65d0c2376d",9.721518987341772],[16417,"bf0d8f736f63bc2df14d1962278c47515cc6fd8f67ebd2769b14b1329ecebe5e",9.317957166392093],[9188,"f91d4c5655e2ec0f49a7f7631b6e3d9aea4152413f4899c029b6f1b3823794c3",9.917710196779964],[2984,"1a055158e7d3b394206311c8e29e106b19a131921fa035564303c8e5b2cc63ec",9.917710196779964],[14262,"c0eb926e5bfc49fa6229425487c9af9e70b05373924fb5345828710c882aa88e",9.317957166392093],[2335,"24163570ac95a05ff3939e1106a56fc909bb6ced28938e7aad0ac70d51abd3f0",9.917710196779964],[15625,"e58490268ff11330dc8a5054c0bfc7039e86c4afd53b30c50b9f1b211060d470",9.317957166392093],[7715,"3a19dbcc92b0ea97b29840d759056eda824bf75c4ea443f04cb4835607de6dcd",9.917710196779964],[899,"f693edb7fa2483a9d7238a940a921dd341e8e6241c9d970bb610bea4a300dff9",9.917710196779964],[6762,"b8a79eb6d97150db9ccd3f4865f3e2479443d251f5a59750c4075b04745583d3",9.917710196779964],[5481,"fdac5d7aaa0eec7150821739cda4a0263136f59ef6c1dc0bbf942a67c5ed4fdc",9.647446457990116],[9570,"1c4b142e9e43dc713708e01af9ce01ec6edaa759a0bc6b90fab4fe76dffb2fc1",9.317957166392093],[18994,"22412a5f25cc03bd8c7697f711d8198c392a6f129ac1f6f865ddcb17652bc020",9.317957166392093],[18482,"3063ec8b79d3ea93baa01bccdf3e15903e9a64b852c60296e4e4d7532c1cdf31",9.317957166392093],[7866,"ab6d19c8dd55aa78fc3ae43f0b56aea4c8ee1f29d7148d29cac6bf96d2a275cc",9.317957166392093],[16604,"160cd076fbcec10ae041d0818f84e44e6222825c97ccc7eae0a6bb2c8100c75a",9.317957166392093],[4078,"e49a1d5738afdadaa2f90588b542313c0587dd689c0d6433cc1a723e191335e5",9.917710196779964],[2531,"a660b45be877bee22927f0055b0b97e1cd0562f49560a7fe21b3660ee5a19cef",9.317957166392093],[13460,"ac27acc3cc07811cb4740c3e95c73aa1dc3a638e187558a6e8d31c87a72ecda0",9.317957166392093],[2779,"f208df8936e1ab50b1684d77b47ac51db5b684065121bec1efa572eb8dc6eaed",9.317957166392093],[16572,"a78cf9c0926d37f69decbce3ad8c0598784f89d108ab6259277135651dbab35b",15.052631578947368],[2575,"8d0c5ed969a20fa8a45c166b5e7bd98c55af07806111a5eeff81062350b95aef",9.317957166392093],[342,"fa7d4f35a67bb3c11e3f48f5d8eb3c7608d4d95e7e27846a516ccae029cbc1fd",9.917710196779964],[11925,"3ffb2895a8c5a70dcf2148f829daa6929ae7585e5f598318a7066c751188ddb1",9.917710196779964],[9827,"8edb9bc4ee34499fd4db6c8a1c0ac27eff9ebf209bc4783e459efc23ecf276bf",9.917710196779964],[16190,"080a6647d0bea8bdffecc9d8e1be40f586934505eefe7a0b55a8392d2c172964",9.317957166392093],[11194,"adee3dd53159af3c5bc272f3b33b55a1139816d42ed5eaf6781100609c03b5b6",9.917710196779964],[12033,"a22a6294f59bdc35f64fa951aa0da70ad2bc2655059a95b348a751515ed615b1",9.917710196779964],[10925,"3e68dae65927d78167acf4473ec8958f04864aec00d74a42e1c588000e3088b8",9.317957166392093],[8209,"5a1bf379f1407ba52b68ff6cb0e56c9ce900e74363dcb0970218dfac59bcebc9",9.917710196779964],[528,"4e330a0f1bef79295bb1818a146c9d6db7e5aa3185a768245f414915757b7dfc",10.052724077328646],[16333,"ba79622afa0350ed80ec2df7606d9440afa1e3a8b0a22c78c96580d8d1616160",9.317957166392093],[1035,"061698190b5241309e0fe8c0b3da82e506dbf4d07bedfa983b56c3788dac0df9",9.917710196779964],[16600,"26e849d147291f0e6b66dfc9138ef11628e17b8a80ca7c0f1934bad4f2bcdb5a",19.100775193798448],[3262,"1129fd135a66483febcd153e13f2618501484e64396305d2579571d1edcd9bea",9.317957166392093],[5160,"7c704459d5e83fcbfa96341385ea1d47aca2dd65eebe6085093137639fad38de",9.917710196779964],[13039,"84d5c205fc127b3b913d9d6c3bc1e426fd8b08f6a02e8892278fb72af07c53aa",9.917710196779964],[18457,"65d18c1724ddd8b208a51c99b6cb58e43b753b3d27a8155f266eea4256ba6d32",9.317957166392093],[12054,"acba13f4868535e6c4408de5bec9b596c03b0f5dd21c77d223e0a6bdbf9df5b0",9.917710196779964],[18035,"254226bec26d7b0bfe0d5652cf62ddc51340aa15a2c58ad6333948244663ac3c",9.317957166392093],[6442,"8bac918deb41c05810a4da8843e4e3280767ff39c3f8db53c5de214e357cf3d5",9.917710196779964],[11516,"c558cd4ba06709bb2e2414625615586a25ca03edfd7f3060ee8d03aec2396bb4",9.917710196779964],[14861,"6bf2aa972a55f12778030865c6f3f76113d8f954b0e9b2af403936e28cab8e81",9.647446457990116],[3550,"d1f3adba493d24eff11a7363e1534471706f44c06525efed6d63395346b89de8",9.917710196779964],[7976,"a5fcaddb64a7ba7cd1f26d6483024659afcb545b658ac764f6c3ab6218ceaecb",9.917710196779964],[18533,"4e48e5320c92270d3f8c1b6b3960591b8caea0c6633b0afa8b9b54119a57d230",9.317957166392093],[18109,"44b3a5d4dd40dcd4d98105e8801a92e286612479e7e194802693460159e7b83a",9.317957166392093],[5704,"4d75e94e3edc71228a18cc49ebf4d8923ae6bd13c6430b7a7df8aae2a2cf05db",9.917710196779964],[3947,"fdf70297fb88b34f4e89d47c4c03abd3706e53a84c3b1d21f4d6fac05e8503e6",9.917710196779964],[7056,"a40cfd4454585fbaecda5c673d88ad883f4e45cd5cd85620fff4b171479a9ed1",9.917710196779964],[6831,"85904b2702b89954635e78cb2ab30a82d9ed678f4aad3bb02c3d9b3bc9b10dd3",9.917710196779964],[1806,"f62397a31a104bd3565ca19eb2aec7d116d37dca95ea3aeac2160632e3d02ef4",9.917710196779964],[9891,"66fcacdf6f0ff464df4f9ea598bb4460c253a3484bda69b8fca13798b94bfcbe",9.317957166392093],[4229,"9095867fd22fb0e33dde19392e4bc5dacf16e496119150670b953a41cbf735e4",9.917710196779964],[10437,"82ec5fc4fa0c91d1d066dbf498311126d9b4e4eea1df9f9a5f8311bf227d8cbb",9.317957166392093],[17296,"586bfe153a4e18f5d76145bdb065bbc0bbb3b976ea87ae2ca308e67a8b173f4c",9.317957166392093],[18037,"5151e48dfb612b3a29508904a096e8bbe3d133dc2e675c4e12d9d521e0aa993c",9.317957166392093],[13682,"187c494d995fd9f8b44c4d5ea946116d1f1476434ae1be3c4cec453e0b9c989b",9.317957166392093],[4460,"c251a86d9dd2d5af571ff989cc8fc4d71957fdaa1d199ac0519ee4ee9843a9e2",9.317957166392093],[7481,"386b256299b95cea1e6ac836de3724f182d07a4d72daa658c9cc72289e7dd2ce",9.317957166392093],[7250,"27aa493ace3139e206f91f18cf1dee38c867d72ec2219779192f83cf7a325fd0",18.05729877216917],[2806,"c34704316c7123898a7c376d5c973211f8de03bb94ab36474187c1c27919a9ed",9.917710196779964],[17603,"f89ca168c095244556e12f359cf4606584b6e72deaac51d1d71c556d3e410045",10.052724077328646],[6223,"04446862ab4c85f930c1d48462148db9e778003638c65e4ad8f24c390f609ad7",9.917710196779964],[1969,"acf0c958d8cd7d7b6e4699b30314d063d8605c1912873bd2f56e480ba73137f3",9.917710196779964],[19747,"b646ab3453343936d30acc2122f9ede890fd3dd099c92b9cf4cef0f08dc7ec04",9.317957166392093],[6034,"261a90b0b636474b1d39d65e05e4154820464ef39c2a2fef87b6efbe3311d8d8",9.917710196779964],[14076,"3647a0e552a011da9368aedd13629ae1552710e6a2815c98aca18d651fa21e93",9.317957166392093],[16496,"22bbbfeceb0a41381cd6da0f518b3142b0fac7f37391ab8ff6c5c9e6354f4f5d",9.317957166392093],[12425,"579c20670706b739302607076e22cd0898500d1a0fecc65d2f5b2c3bc56769ae",9.917710196779964],[16664,"a10f555131d68dea9041f5e5a11af9072b36a3c6a5e1b730f47343f231877459",9.647446457990116],[15822,"15be6a643e5a96b72bd86e77d25ad9e4ea7677fd8c2357ca9a9e6f507ce7f36c",9.317957166392093],[16672,"f83eaf6d7979a27b5c5993e9e39020d7228aa04c228274a41fe4edaf3e5a4259",9.317957166392093],[9674,"e3806cf85e0a2a92659da638cd7ac78d6627ca104fc0980ec9db4ae4609d90c0",9.917710196779964],[8027,"ee8e7a0bc67373b6daafbad6c299461b24f4908962f251dd1f6e37595b1761cb",9.917710196779964],[13127,"4a59b792aad9dbbf1e7cf94dae111df92fecfc1bd3a504a7b1908569e19773a8",28.101083032490976],[11087,"e065e2483a99b9de7a3e3565f5fd33a17a4f3deac9683f0cc44c12e3a99a53b7",9.917710196779964],[6079,"5d2c01daef06b9238bdd2996c1e22c5b0f869558919f5aca341611775d7786d8",19.160655737704918],[11804,"eaef687d6b0b9c600b771600b7e844cba85326d2f89046d7808f777e1d41adb2",9.917710196779964],[13655,"5ca7f6fcc0fdb56c5693af4c3f002b5376533472b4353a6839c13e8ee6001f9c",9.317957166392093],[13813,"4097a0f755cb4f36c1282fd92af437dd8e7e8539fff2cfe102a3aac254802999",9.317957166392093],[12775,"cbf8d074eb9eae69ab6b56415b0a70c6655640533d0915e6054daa98ed8614ac",9.917710196779964],[15974,"e6934b85793c91ac026f15dc2b12ea1f7c655c1e7ae6dc893a7f97d619d43869",9.317957166392093],[2878,"3b05e02c7fbfeda5b16d59f825e8cf98659380601c0889c3e414d3747dc040ed",9.917710196779964],[7541,"03b5c060cd33081eb6db71b5569c1311a8a4ae14c2436ea3a18ce5a883f990ce",9.917710196779964],[19605,"0ea3af93d36f1569e6cb44a848e9009b4c41d838d99360f9296df57d4f81e409",9.317957166392093],[5869,"ace144b9b4eaa37d5152ca9f2892d4daf6051cf7ad62e4bee68263959b6bddd9",9.917710196779964],[9943,"eb80b0a18ee87275b483f757ec55015e03c312c56c99c54accbd1dc6c37aacbe",9.317957166392093],[15082,"2df3987e51a78a8437d2e12c453fcac33e59278ea5a289d98a740606f5adfd7c",9.317957166392093],[13654,"e3dbe332a8407b00d24bc6015420cb1deec299bf043c66edf66ade26feef209c",9.317957166392093],[5024,"793f669babec5cae286597906824707e4598cca0d7c2832800123058a8a008df",9.317957166392093],[1892,"b2e9f4ba4878310d404cbbe76cf72e69e516961ce865eeb0a3111ed8f55fa4f3",9.917710196779964],[14832,"a616526c98bf802cbd9c2156b6328302c65cdded3a9fd9bd09dabd000beb3f82",9.317957166392093],[12885,"bbaa2f2d2954874bd404f67f44f8bda44b4c08c5b46d645c7bdfabd7d9235eab",9.917710196779964],[2610,"c9e117d57aab070e90e8a67ff63f9ae65cbfe17eb322e3a0dd3920d4003a1aef",9.917710196779964],[4463,"e8a578501f41befc225bf523f004b0593a1769a87e3dfe6b296da4b03031a6e2",9.317957166392093],[4320,"8f72393a622f00f6ded258c1b744f22f9c45459281fd9331b179f05f9889a0e3",9.317957166392093],[18855,"5f0682bd713d0a5829ace058bd43d01a601713dd527c5eec09a9572e7b3ed624",9.647446457990116],[1955,"da9c03adaab3e1bf56005fdea2cd5b51c33651613f085bfaffcb2dcddaf953f3",9.917710196779964],[5449,"3312e8656fcfb8d4dd32f843a78e014bdab99cfc2ffa4a7e0e5997b6cfb97bdc",9.317957166392093],[12200,"089f6447aba1d32922b00cc5af55e6b589ad79f3ac025f8c2df42db3f99311b0",9.917710196779964],[9068,"5f84bfb64948d0f05937b91413fc4e06ec0abd3fd41a024a1aaabc854e375ac4",9.917710196779964],[17798,"bbfc4783c5b9a620daed774bffa23ccac3db8af936f686f1530b1979916f5341",10.052724077328646],[15990,"c2bd110c1cf140a7190f4accc7459c2f93c83a6eb1f663d6e047722c92a1aa68",40],[13532,"72ed57dcd3cd69a4aca30311f1667110a645c269c4dca56b94be3fe38965269f",9.317957166392093],[9080,"09972dff9cadfe3c75010d563b26fc69d8c1cb0b2ac6c8d961590d28a20545c4",9.917710196779964],[9538,"5586d2f4b908d86f045d452cc55c85020f33c2d631ea70be73e6109b315b74c1",9.647446457990116],[8121,"cbbc5ad9b41fc17eebb2f45faadad353ce3b8b7eec97be4423cd6127a4669eca",9.917710196779964],[16634,"935e092be559c869dd8ca0bb84fc85a90d6e12be7cda91b984d5d27dd9761f5a",28.12785388127854],[19159,"350a21181ad85a2bf9159606c431d3d876628382cab19dae5895a9590a092c1a",9.647446457990116],[4762,"43536319e9dc7d6c11df244688a666e38db9a891c77b2c59b8653ce0e02d8fe0",9.317957166392093],[761,"420415c54e6d398b3222012af56a86d06903480a8dffa1eb3f4e6fd93cdccefa",9.917710196779964],[19040,"a53ddfd4ff982b68d2b2dba17fe4cab86929a01c2a49b5b3583030de843c451f",9.317957166392093],[5047,"85e028ccef049f0c1223862ccff3cc5276ade9aa77165ed29e27489dc3ace6de",9.917710196779964],[6027,"e8d1bb082d986f69baf4b3edc0c4fb9240c59bfb53e84620b7c604e8413ee0d8",9.917710196779964],[2579,"4860bf922906788fe860031ff36a51b7cdd0d82c30e5d7043cdc0268aa9551ef",9.917710196779964],[8763,"63aba44f07df8fa2beb59e19cd8703ecf752c1bb0dda24e762e925e7036d44c6",28.19221967963387],[11313,"ab317c7e0833f3b28e7e0769a8e109efbc00d6ad0a7cead539494070affbe9b5",9.917710196779964],[1090,"a59d8a3b2712ca814eb3484c17dfcc857a549bd76be389c6bb9219c3d39d9ff8",9.317957166392093],[334,"c692cd64b6b38d7c46ed09839d11bb104189bbada78210acfa77e5366b27cffd",9.917710196779964],[16822,"c50202648b7101f3380265445c86c7963db58eb5f60796dcc7678b68dde2cf55",9.317957166392093],[3515,"0ece9c293d73b92e1d18c449334dfcdf23ae7489907779b42bfab43e1ab8dfe8",9.917710196779964],[348,"cd1c94c86ac0c298eb81c67669820b8dc19589a8f7b79c116b213f120ac9bafd",9.317957166392093],[9819,"4fc61c49d2a1030ed1f83780679439156fbb24884bfc2c2d5e18f4b9815b82bf",9.917710196779964],[12792,"e32bd232d3ecc09cebec418e74d02d4d8209ab6949121ddbefce539defaaf5ab",9.917710196779964],[4182,"924b483112ccc409bee842ba3384855be405b18dd6a871026dd775974fcb87e4",9.917710196779964],[5260,"6dbd622db24262711ebaad5ba44841080bdd256834cf1950b08d58cb28389add",9.317957166392093],[8578,"379160292026bcfe89b44c15c507bfe06d630365aa2535538b5c4dba809e92c7",9.917710196779964],[788,"c03b99c22358f933f074f85048c12290dedf64205a0dccba9c8f8b2bb83097fa",10.052724077328646],[16974,"cacaacdfc73940860e40e170a47e345780c504f9868d896d89695bbba08a9752",9.647446457990116],[18848,"30cbecaf0de3d23d436865cdcfcbe0f6d4fafaa625ccb95bb8528eb8fa691e25",15.073170731707316],[8066,"1a4561ba96400f653ae89a4b6e365b0d7a162562fcbc5e1685189968914efeca",9.917710196779964],[1837,"d17bd3a7744cc4bce5ddda53143023c90d5ed6e908f0136cc58d246f336906f4",9.38125],[15562,"af8ad037924b74527bdc01919e140b6a0a3f5da7ebf98bcb0611391f07d57d72",9.317957166392093],[644,"e47d9bc837dd1968ccddc0748cc2341cd945ef0cc363b504bad250ad2fe09efb",9.917710196779964],[16446,"d97ccc4231705b9e78e3d8978449da2cde2553cc05e62eaae6c2c55db96f475e",9.317957166392093],[8584,"65b43446193ac83f24a5d4b21d6bdcf3fc82d4ed0a3d7b5363df43e7873d87c7",9.917710196779964],[13135,"003c3488b9eddeebfaedbc555f9664e767788c4c578543103b0eced2a2af3fa8",9.317957166392093],[16080,"f525d94c2778476696f5d4eb9e2a0704995df37ceb53dd598fe2f35773cfb166",9.317957166392093],[11629,"14e53e1bea7aac2d83fa2896bc8c35a4f26b93e3dd2921b5c17549633971b8b3",9.917710196779964],[18465,"a55668cfc06a2111595ddb6f21737e97a51df6648283db724912dc3534914e32",9.317957166392093],[10454,"1794838f6352c727bc07ff781efed359db531788cc4c992fb8a9c3be1c2f66bb",9.917710196779964],[14505,"1571dd34bd29a5c40a51ddb9ede0bd29f7abdd99f9d5ec61e9d3d0ce43c5f988",9.317957166392093],[19518,"2dddc212828963e32cf622b50388419f9639f777d4b0e06188016dee416fd70d",9.317957166392093],[15711,"8cf1745503da717d6ed794736698d8d14b5ea7733853a3001a35193215a93c6f",9.317957166392093],[11645,"d281deb2c22694cf627e849b85024bdcfe36e1bca8d5724595eee4bcc8b7a3b3",9.317957166392093],[8798,"b569bb739c4f4d3f5e536e56ccbaa7a2ab4ae7230ffc2a1c9a0d59fb67b614c6",9.917710196779964],[15171,"901d82c3544f8df0f8bf4968df05916963b97e56dd1ae4184b9e80649b02167b",10.052724077328646],[1828,"b6244f290bf31f812e79c03b65e0eec2cf94f12adb9e578bf41c04cd1e8511f4",9.317957166392093],[9062,"4634cd9324f31ed1440d086bbee7bb26cf0b99b2bbb086e8496bdf7c071467c4",9.917710196779964],[1344,"e0fb861be02cc0e49c7552cc87890ebd126f234b3acafd1e726cb761a8611ef7",9.917710196779964],[12023,"b24f1205e87036da98edcf465887e1705c594b8db0ea59a1899006a88df12cb1",9.917710196779964],[11236,"75c1c73127337d8f9e138084b687c312c57719ab4c33e237361b9743449173b6",9.917710196779964],[4378,"7d7b4ce4e84e948dab1b79ffc2e5a023b34def25758d49be479f3dd8e18935e3",9.917710196779964],[1557,"7acafa2721096db1de2bab10ad228c4a2ad93aa967633323ca9344d5892bc6f5",9.917710196779964],[14661,"492abbc38e9b22df7743a84e95cb66cc54e9e038ccded78b2ed84eca9042af85",10.052724077328646],[1084,"68b52b61ab1c1defe9f5bc0c1db578e12333b50333b5b21b1229ea1c9beeaaf8",9.917710196779964],[17358,"a9bf69f72785f430b824a9aefd11678e24d7b51a70da9ccfc5a318e68740bf4a",10.052724077328646],[13140,"e2e58bfa50b2063c48eb8e4fda5a577a2df41703f00ba546d33ae8ed401b2da8",9.647446457990116],[6117,"d74751f45cc081c0c08fdb9df74b292a6544c09c1d8b0b1199f877c3eeda52d8",9.424083769633508],[2965,"533c03f0444398a958ee642c9b91581f6d666dce8260cb51abfb57f59d6388ec",9.917710196779964],[9923,"d560d2f4a6f1337a4e9128c938db7b2eb4bcbf05a5f7a02dbcd82832aa28d2be",9.344947735191637],[2843,"734329a2a3e33811d332eaa2be7030622eb74413fea0cd86db46aec4a33664ed",9.917710196779964],[3932,"a9468a2026ff0145e6668177ea1431d556e2387fbccfeca4a3021c25178a28e6",9.317957166392093],[14059,"14296d3ce34c191627fa229c75969a86f90842afc2df2f5729985279c8f67593",9.317957166392093],[3203,"d4b58a89ca4d91bc434ef6da1c194bee8958fab05195dc1ffb3f69655df406eb",9.917710196779964],[16474,"00e298a88d10e8f53969eb17a30c6bbda054e788fec34d7b3e626801e891d45d",10.052724077328646],[1011,"dff906f4a578f89d5ab6859c22ba3d9ab69d5c0a57805d07f6cecbbbce7b24f9",9.917710196779964],[10226,"216bd875529cfeee20f153f7afc7c9085c481a78abad435dbc680db3c729cebc",9.917710196779964],[12455,"33a0e7e23d174ac613fe0ac9cb88d1bbd4ffb7f75ef5e5bbe3215568663840ae",9.317957166392093],[5820,"de5645dbe15433b1d49db90d1672a714dbea63f562fa5c5d6dc670169f1941da",9.317957166392093],[4727,"9c2fecf441ba09fc6539a5742ddc7f25de5035d64c7e71af69bb5e53e42bd9e0",9.917710196779964],[7213,"89d68d9be710ec772436de875be499fa17bbb1b7207f692cd95a3968325c9fd0",9.917710196779964],[3480,"893c97332d6ee7d9b2e71ea7d5fb34b58250ab435ef904dd91559e8870632ee9",9.917710196779964],[17401,"729496df3e1b3ab85c8c89fd6c4608b3f5c68f292f8a3a8a87b0f08390f4c049",9.317957166392093],[17797,"d275e34cc1395146c4306a2b1148e0ce30474d496ce6ad7c4527b80c71be5441",10.03181049069374],[3679,"0a3bbe2551b1d7bb5ae41efb35a49528a590c2fb4eea74e80e07902b608bbfe7",10.028818443804035],[10338,"ea72b5e9f3aed9fa4b6a3951ad5da58954c6787a6c707cbd61ec526b6f1018bc",9.917710196779964],[9800,"fc69fd672c049c85530896ff12419c0c43718eb0dbfb36c1af9744ab86cea4bf",39.20855614973262],[15160,"512e253276d976a5946be500a6ee5f4898477c3bb08f65ad1e029468f5144b7b",9.317957166392093],[7093,"1faa348f8c178d07b38b9edeb303afd0428f024fc4144ab89dd54ae2a7fb5ed1",9.917710196779964],[3186,"d5a61d725e43164007a857dcd591fd58a19f09f039d2e1534274710b178f1deb",9.917710196779964],[5517,"7a6f029b53065141784c64991ba4f209eb0e0615ce5259eb96df6ae856df21dc",9.917710196779964],[16110,"ac1776d41508804215c56796e6f3feea6e327319c4c9e263d3304b8ee55bcb65",9.647446457990116],[6075,"3223e7f76a9a53dac3ed82c965c07323870293e2b3c502229379eaa92a1692d8",9.917710196779964],[19829,"c24722351f1f53f3ffb933c13324d23360e180d920624383693db4ed93cd8c01",10.052724077328646],[4622,"525c8e1c7034950c9d6e9090189faaafa59689b9d356c28246623e352f2379e1",9.917710196779964],[13341,"2facc9ec5a0139ffe02c6f11332b5c29b274fd44cb30ced5b8852eee63f1c0a3",9.647446457990116],[668,"f86eeb785d5150a8f789bffe4c8475a74f6fd8f95b6d5da01be94cbb3c9471fb",9.917710196779964],[10385,"0ce8d385e45c9a9b9134f23e0bc2096f7ba2301464e22aa9e230071d07c2e3bb",9.917710196779964],[1168,"093e0b8b591c93f71194f8391ba713ec92244803a5f5b6a9f4e28fdd0cef2af8",9.917710196779964],[12771,"0b949087cde8031d41cd372cf24316fe02307422f5b57b33f94c0496196d1cac",9.917710196779964],[5438,"bb08f0de38810996e986770caf0fe0dec42a7a13cea73decc5330a2847038adc",9.917710196779964],[13918,"6cdeabd982136b5d3e818f6e6d1b7cb1839e74245748e050f0e25a4d3f608c96",15.91459074733096],[10884,"62339b679c946af31f9103c3713dc0bf8f6709e3c0355a9757a98ec557f2beb8",9.917710196779964],[15823,"480161d7d7b752f74e5c2c8c3ac1fbea545832fa33a72f971912b515369af16c",10.052724077328646],[14686,"f2ada60c3253983e3a236b53d123495c9b8f2f72f406b8405a09e5f8baf42285",9.647446457990116],[2805,"d755ad79589ef22418b0103d2a7884197f0e5bb946112ed7ca6b22c50532aaed",9.917710196779964],[4137,"9f544d67126c7ccc3687a0ca883cdf92fb7826de5466f11f2e4bf32a1d40d0e4",9.917710196779964],[8580,"dd46533f9a4a2f17792520d9e26ba4ffe18d2df4417d5346f2a99d1b285292c7",9.917710196779964],[5121,"95deb73affe8e2cb90e1ec986c939d65095cf563f184c4ef057507a5201377de",9.317957166392093],[18564,"c5d368f33adafea14ac401da80ec4ff2ab9a9816e8ba8abb46a12f3fe7382130",18.07758620689655],[3082,"06a36547960ecbfe6d650c8fe1a646a84d0f3dcea368b05bafb78feda4c6c2eb",9.917710196779964],[16339,"6697bf05d9736e11d50dd1211ee6ed595cc64df8bad9ebfbca79ee5fb9b23e60",55.19163763066202],[16268,"deeaacc4d4dd94d41dad5eb4591b24b1b7c048b9b4fd0cea1bf3552db3b2da61",23.872746553552492],[10301,"8359e4a9f5f1a226b0a533d56911191ec945ea57707f9900eb627f28c18f5ebc",9.917710196779964],[38,"fde85b479fc01d76001e27f1662c69e0d22f97dbcf41fd0bdedd01be2407c5ff",19.03869653767821],[14819,"c9097ea287a5ba85455dfc88c9e80791c4ea652ce8db692de2fcd091f5326982",9.317957166392093],[19501,"003db652b417c5fe8a9c1565257d2c8120f8f0e9f56e3a254adcc9aede3c490e",9.317957166392093],[6694,"eb8c4174c8f83e50ba3f2810eb384e83b64bada7296848844db5f6e1d5effed3",9.317957166392093],[11826,"6f4e014578d85318d5b62ce1fe1d2b6305efae1daab2fbc13bab2ae22cc78bb2",9.917710196779964],[11249,"e6e986c9bd62a742696dad932f2da9d582fedd76f74d7cc7186cfaedf3fc59b6",9.317957166392093],[10144,"b34c03219fc8acef045405c1ad0b657c8f7747a7c5d758d4b3965905389c6abd",9.317957166392093],[9936,"abecc5862adf454476361455c56746a52c02937c00776b66a4541895a521bfbe",9.917710196779964],[723,"7848db7a90909714de68937df168f7093eadd08e8c5d70c80ece66b6999f0dfb",9.917710196779964],[3592,"796f85b76161dd7f3246183b5a8b086723cc9e54a9427b47c5472412cffc5be8",9.917710196779964],[7818,"e477ce1b289db7b27ced508db9a7f6632658444d0c60930e7cdd771d825ca5cc",14],[4692,"9b0d3be87a08ea4891119b2dd460014d572c5a1f488ca4607c7cff108c4b0de1",9.917710196779964],[15095,"ae9d0f8bff600feccc33aad55305ef6c4ffd741ada4e11126584ce2a11f2be7c",9.317957166392093],[10550,"6134185ad3abc36e3ffc9c065cd15e3ce815e9854245c59329e85f407be4edba",9.317957166392093],[3360,"25953546676692adc99371d0888556bd5feee810d652ae692dfb733e09caf9e9",9.317957166392093],[18333,"422219a59263a303cc063708bdf6fdd9fc1d4cc289f718164aaf762195653635",9.317957166392093],[11596,"87fe670fec97b7134dd68d0de41fca631baafa83ce6039fd90b686e51e0febb3",9.917710196779964],[3163,"fe6e86f8ece8446754eaee2180d42ca27246bd19361f71704b6df993f3244beb",9.917710196779964],[955,"285622ab6d272db731e5bb4f08bf3ff25d631c862e7e4540ff30912f281179f9",9.917710196779964],[19483,"3d9a15e56b32b2734b6968ac4a18dd9e06b88a0c716bcd5279f1a2be58acf60e",9.317957166392093],[1949,"d8a5f2717d9e84418182fc415633b798b02edc31a10ecc7c9182832470cc58f3",9.917710196779964],[17087,"b2c083651799bad1aec45ddb4cf9cb7369701804026ed163e28fd8f6ea4a2050",9.317957166392093],[18646,"b905b321270f871161e038cfa9af09e56f51829258492329e6984900c5d7ca2c",9.317957166392093],[9049,"7384446c60530220685c0b00b4f8498be7016ea2406e36f131695605de8e74c4",9.647446457990116],[4396,"e95a2a688a3596e02aa83c183703e7754b8ba3a202d83cf081dc8ea90b491ae3",9.917710196779964],[3535,"4096df5c3b7adf5f910e83b66561e2165078c5dfa71070ed1cf571a611c6bae8",9.397642257991386],[520,"009d07401e75da36e21a3f61e665a608a07049c27f47f79ed44724083f8689fc",9.917710196779964],[19292,"d8c14537eae540b2eb2c992f1798fc49bd5dabca55ac8ccf3f696dd68a220d15",9.317957166392093],[5571,"0c3d4fe7c4892b17ba0e4a0ccb2ce1f82b956ce4f4195c547061b7e806e7ccdb",9.317957166392093],[10998,"c168a269207e440fb56d75edef625aacbdcdd79647b89efde7ec12625b5bffb7",9.647446457990116],[7316,"10f583d343df1272d9e68ff2bb43b8354c27363a396c26365fdba29e459df7cf",9.317957166392093],[6300,"4f74b2d6054dea9da86a25a4e252749bda65a77b794bf4b1db6a037b58dc06d7",9.917710196779964],[14800,"df8d43cb7d3d7645983dde57c5e93b160dfa2945695cb0133215f36055a4e582",9.317957166392093],[3010,"dd06fd8700e59b690f02632a69cde295602b3686d076b19c21b7a13440403aec",9.317957166392093],[1266,"756ba6b3fb66013af43fccf875959a0ceecd2ea0e7b99ba3e827b051735390f7",9.917710196779964],[4449,"7fe9e1bfc9bf935460b9067397e0f4f2f786e48f0f5dcf62954566329f59c2e2",9.317957166392093],[7932,"ab6b89391b69659e185afcbc407423838d34b48bfeac0480d2d2e4754ff403cc",9.917710196779964],[8813,"92e479f84974f5f17ecfe28c62279e65f2ce1b6264c857541c7912af32ce04c6",9.917710196779964],[650,"a3698b8fdac06414f76da337fcbda7359c7c9b500d2db8f2c1da11275b7094fb",9.424083769633508],[2128,"66bc00af4f1803bf4f18a71cb903f0635e4e1000096793e858eca46be1250cf2",9.917710196779964],[17516,"4603b471f3df2adc098c6a1443eaecec656154b6f49fc667f42fbe4d59942e47",9.317957166392093],[15438,"bbbf217c51e048ddd1587f29ee786b30cc0aa693b6d9677378ca5d96c2a36c75",9.317957166392093],[7396,"36979f9e4064e196b5eed93f54f9b21c5e6412a9967cd649f14d2a7bf62672cf",9.917710196779964],[15413,"cbfb8928f3812d8a42353329fa429b2a0dba680d39349f59383dead6f2550376",9.317957166392093],[2937,"ddce6e54fcc6cdbc0e3c8eb72d3e7f842572c6087c29466ef2b8a9608434c8ec",9.917710196779964],[6373,"aba0b1396334202589cbaf3380d5c77e5e97f791dc24ec36a4e62333422079d6",10.011587485515642],[10072,"4e8b963e3a87eee9d22f20fb4f07a761259c796117f1a67406e7019b9d18e5bd",9.917710196779964],[4367,"566fa9c35ee9eede03cc97c526420583827c8c4e2caafc5d7263cf3e8ade4de3",9.917710196779964],[16580,"0ea5f6479f6c73a4b1a72105255a7e9797cab37ca999cc09d536d7b22882715b",9.317957166392093],[7271,"94056b0cb2cfd2d8a772c3b62a6ed26a62f36410ded2580858196fe8563132d0",9.917710196779964],[1429,"e03144e88ee9495c04f8e00dae87e047ab59a4b000ee6221246928cac075a7f6",9.317957166392093],[8586,"beaf11fd264c6cafb8da7040385c2ca75c5d14c9f9971a5eac91107c073285c7",9.917710196779964],[13879,"802523785a3c236acc09d3665501765872e7a962b421795789bc1e44885bad97",9.317957166392093],[10561,"00ccde5b3ae3676a25ef75b7bc301d769c16f5079cf0bdc88d3dda26c597d9ba",9.317957166392093],[2548,"f868513567e557ba921fc383153fac485c98ef3f01535f86e519adca36748bef",9.917710196779964],[1057,"a6eee25aaaadb4bdddad459daff6f0f3a405aea94321216a2901dd4709dfdef8",9.917710196779964],[14328,"d0a64a8a7d69c585e1584b4fba1fd72bc634097667c812c54a63308a01efd38c",9.472566371681417],[16927,"e3d29a76507bf658acc729e89aab67ad50e2b089ac8bc65b4e4849d0c5f6a653",9.317957166392093],[10532,"8a3774103b8ecdb1582256834c2c76618db444f4e5b54ec0b5d6ba877c11fcba",9.917710196779964],[5696,"698603634af5a8e970e2241329123bfe0f60d204c5e7f994fb0972e04f8915db",9.917710196779964],[15209,"797b5eb6a6e0a161a86c39efcfd251d486e7c1b57ee62c11c199924ebfef567a",9.317957166392093],[15251,"a9f66ea490dc7ce970f29f8f587a5fc3932d16c314dd1f13aa58ff8c53126c79",9.317957166392093],[18693,"62ec1f4bac07c66c33d405818fa4137e96edff4bf37b2fac8f82e23c49bd9c2a",9.647446457990116],[7627,"e5d9bf8663c9c8ec3dedfa17581408eed417f44fdfc2c4c29293fdeb585b0ece",9.917710196779964],[14233,"3648a3987ac48f05caf59c5fbdbb544251a185da41ef9a05bcff8d8e8fe0638f",9.317957166392093],[19019,"34cc000b92d169b80a789d34329661990901c7f55de5f5c70def0532ded0db1f",9.317957166392093],[13584,"d8ee11b501235740e08739aae550c53821ac29cbcfaf4565838b8ff8b3a8cb9d",9.317957166392093],[10980,"fbab001b7c1ae59abfd70f665fb0f0bb4eec11c1c6385b1930b8bdce46da2bb8",9.317957166392093],[4773,"62d4b56392ae0a58cf5d5f421e8cf120a960b06314810bf84119cc64e9348ae0",9.917710196779964],[1657,"4404b7f96bc9b930759ed234cdc0c1a29e3e226c425fb5e19445cfafb7f837f5",9.917710196779964],[13248,"c47a928be606ddd23d7fe1ad76d8aa0019b98de289eee1fda77fa0f15e1de3a5",9.317957166392093],[1105,"2d8bc0a64f122f90198ccf54cf567286066deac02f357d1a073e07671cff87f8",9.317957166392093],[8335,"419a076bb15046d5d7374a67260701e6ad1fed0eec0df14ff69eedf8b2b419c9",9.917710196779964],[1654,"c1f09271769de7a2df1a3fd30888313d058f227401768e3e6487bcd239413bf5",9.917710196779964],[18364,"0cd5501c5efb8cc00415f1e734fa89bcfb85a5db6ddcb946da279c7e26d55934",19.20142602495544],[17158,"48bc49501be5ffa47408297d9a45ff73c50112c71f0cbf05bf57848fc250dc4e",9.317957166392093],[14790,"2982d6cfed391292c8b6c4917c5d17b2ef67c941106f6e7552c48e454a811e83",15.943362831858407],[19049,"fe9951809362d86a12e3c1d8af25ed629826f3678fe3aae20c77693afe6fcf1e",9.317957166392093],[2052,"8a281c2bebd4866676da1df77c2ec92f946c53b7fb98547724c1607669a199f2",9.317957166392093],[6054,"b049ddfd581830a3d2d1ba6f7b672f48d71f0f09bd73a9fa9e0a629f396fbed8",68.17198335644937],[17803,"440007462921d0ddd1b36661ba29243028bbc157e854b212beb080862a073541",9.317957166392093],[4265,"4dfcff83309ab61b8d4725938806d12727f2b3edde28a955adcb98fe0c2c04e4",9.917710196779964],[12908,"fd3468208f3b5a94a9e9ff5ed45dc444bd8362b0be6a139838b95690899342ab",9.917710196779964],[16037,"ede0f922e6a29f79ec0ab089c7ca4a1390127d56d0d2bfe819b4d11ddaeda667",53.97276853252647],[8405,"84bdbe67bbc2b823caf09305fdb58337d9f26095709ac65c3f911fd8321994c8",9.917710196779964],[4835,"a362979f927f2622552e68a9c338a6793334fc2ecb14d78955612874e1aa36e0",9.917710196779964],[17108,"ac3c3ea692bca0642e1a8dfaff127fdcd3437c68a35773900d766f731e4fd34f",9.317957166392093],[10268,"29016c397a911999e6d7246feba8a4386810ad6a9adde0701a1ba9feeaef9bbc",9.917710196779964],[2081,"cc6b25919b92a926724a262cd6131c076ccd198d205869add78d128d917d5bf2",9.917710196779964],[9490,"1f9108191e179ee4c8b9418273fe5121b2aec0d5922585e6a99c7eba153dbcc1",9.647446457990116],[1835,"dc84e2a6088306e8401e4ffc38c6f337a05714d83978bc6428acef12106308f4",9.317957166392093],[641,"f76f83452ebba55e231111b023be9eddd7d8e6f7b7255efcc5054e7ea140a0fb",9.917710196779964],[10924,"207d382c288b62f04ee8ec1d816573c49b244d93714a93f634e8db6545d789b8",9.317957166392093],[11714,"37e85263d0830f8a922a4f983c66915e29ee9c878b910466640a86a68a0739b3",9.917710196779964],[518,"c3b96664d6e2274006ac7b478f4500bd4285c180dec9d390fa8a4f0543fb92fc",9.917710196779964],[16077,"5de82efaefb876526792cd392ba10ad01205057ac4c994e73675842b24bfb866",9.317957166392093],[9252,"e6f901b08196da0dbc04d3326112c3d5eeb1bbef0b1b35208d1e26e97df31fc3",9.917710196779964],[18572,"d25711aac899e223c1abca5158f7f4c52ac978d0e10ff421750955ad7dccc22f",10.052724077328646],[11963,"4ce90bf0fcc1f202140020028a249245e4f9d9db8f7f2b765024d740e89e91b1",39.2070796460177],[13480,"438d92847cc15b9c6ac5abaa9bb2ab307f7cc77e61e617327228f048702a4ca0",9.317957166392093],[14612,"645fb248826b5b0bd24cb3be87a9c16b69c4b602a8b177648d3b187f2cbed886",9.317957166392093],[2409,"8ec4e12cedf5847495b0768fc8f7b0639f2d0634add62ce2eb2983987e2969f0",9.917710196779964],[8403,"d01c3f2c403270e5ddbae672006234468f5a6b7ddcc233703da8ca1c605296c8",9.917710196779964],[9680,"087886a8b24f9f0177b04a4300a4c68a8655e21f8d42a6dec8cf41bcee1a85c0",9.317957166392093],[6173,"c55e5c77f81a2bf9b4de4778635fba20643fc061bc913147ee9e07a4bed5f6d7",9.917710196779964],[7434,"506301afca0f044ec0b2a5881172f922a924a7de77732bcebab6a8b293c829cf",9.917710196779964],[11797,"76bdeca9501e24c71e6bef28cb81acde8daf9c904af5b1c9f34b1bf57439bfb2",9.317957166392093],[9623,"6913ef9d89c12ca43a09aafac827dffe8e9b366483f6c776a111ea4e3d4de3c0",9.317957166392093],[9758,"afa7878802d9048ac2b2cdb5b2416c5610080a74c0f0a550a099076a8030f6bf",9.647446457990116],[5393,"332cbf0c2ac28d8ed5e5ca04fe3416b2324c49d074c205793dc75cba3324dddc",9.917710196779964],[7167,"48444f717223116ade65151610e1bdfb1b0e8f4ae436c82201c2e0160399e9d0",9.917710196779964],[14718,"cc4c5eaf3ea0982e1f8cd01b690427fafe912c72916a7fb40997027f51cf8f84",9.317957166392093],[857,"6ba87925da1427e8ac92d5311cb3ef058b37d9bddf256ddd4d366b187f0f2cfa",9.917710196779964],[9372,"6bcabdf7e0d5666c6f83c095abefe6df8100adba20e4516588c6e297a20368c2",9.917710196779964],[9942,"d0d144c25aff4b89b4e2a1402d6e8d38604f51c95bf57517eeb2793b09c8aebe",9.917710196779964],[16160,"d20a7c520ad5290afbcf297011fcccb7a4e4b68c9e5a9d34243e2a640704cb64",37.08409090909091],[14657,"210c1739ad081604c4e5d9a073825c4c09da2c215b94816bce065abaa863c985",26.13612565445026],[15795,"b08ee0fb896ec4cc01bd405f41e5d9dca1bb79c7d65a81ac946b59806f90786d",9.317957166392093],[9625,"0ad3a6e69df4386bfe2a5e897f5d4a18e6d3514281e9c3881b4436f7c6dee1c0",9.917710196779964],[5897,"4e932c2f3e3334f568d31a2e3d2fa7a1ae317cf5ce4495662cae9bda7dc8b9d9",9.917710196779964],[9769,"caaa245169e5540b199d57ecd4a6e84b889cb66c7e9f8903e57e42fb6146dabf",9.917710196779964],[5216,"e5a791cb71c4b02e616a44d4bdb60c328b5a15ccb5d5b34932f6ca2ad333dfdd",9.917710196779964],[10739,"6a4c5cac26c93311dd5bb026484029185e3f4998209e44d9612cfd5dfc31beb9",9.917710196779964],[6567,"6190b5c5fccb371f8dd805c04001007403eec1553b4fd17ea62f5e95bbc1ecd4",9.917710196779964],[14723,"b6aaddc9d4129973753e0d5f788d796a843d8ac7fcc3944458e4fcf8778f7c84",35.047879616963066],[5161,"7b55a4a84b3d455f8c398d732522c6e038bd0aba10d7aa47456f0541c07235de",9.917710196779964],[11658,"d0861dfc6d07fb846e59768d0f68d2039fa7928ec429d36bb8a52c0da3a388b3",9.317957166392093],[12124,"57b496230d570c68cac3e4401d6a9607585208555d1ec42b56a45f9adc4186b0",9.917710196779964],[11221,"441d1cc6a72d49090845c971a53c9ce704907c5b3c7a325d05500390f64495b6",9.917710196779964],[14870,"51371207204188f4d13ebc144587fdba22d9fc8f30c7938f9dfec62d90c06081",10.052724077328646],[10970,"673f91b0ea7c3eb12719a3b18b06d64c1afb39ff896ba64f0ab53bb9b92837b8",9.917710196779964],[2370,"493646cf74999ace37ad0d90af980d24ac141139cdd3f3b1c93506a10e82a3f0",9.917710196779964],[15000,"172840d7eb36485fa65b6aa7bb1b5cde3fe678eecd8ed8846a996ece06d4797e",9.767590618336888],[67,"add93b63288f9c5acb5b9ad76e7275d3501d4170bfc627a951ee34b5e00b8cff",9.917710196779964],[5525,"b9b4604b2266c0d90f1e34871f797a4a189d0320d3ebc7dcd42d0123aef314dc",9.917710196779964],[18947,"66a9c525cdbad14cda00a027c1d9176b0b46bb7874edf039b3bf831a60273722",9.647446457990116],[12689,"6d88d02cdbab23df4a23a7814ac860f49ff0f49d3636798e5f7c5475a591a6ac",9.917710196779964],[6103,"779daa0b50a09a28b40235b233e2b57ccff34e902453a149858c8a96788467d8",9.917710196779964],[4188,"eeacfdc24f5d8ca59087c6a2e6be357c514debda320387a046f0e90c60437ce4",9.917710196779964],[15163,"d33d495ea1f4649d3f650ed5d969d47af6a68ca9569ac60b81cfacbe8f70377b",9.317957166392093],[7846,"096f8f4e6420a7f3a8a22f888f3f1c0ed30e24f16a1d910c9e71a4ee031786cc",9.917710196779964],[3721,"4472ee9e56062a401d0dfff5c593864a5a00ec73b0b1468eddce57198b0473e7",9.317957166392093],[11065,"3a5ce1cb16d888cacc0e8b6521b817872cdbab8b283230086c1bf882cd2392b7",9.917710196779964],[19187,"44683846dd3d1e3ef7a2f6f153ba953c7f65ea4771a35040066cbc3540061b19",9.317957166392093],[3776,"3cff17538111c374cec84ed6500ea04e144bd9657e056e370c7be6bd22f61de7",9.917710196779964],[18027,"1522e75f9cc5dcff302abed35cd5d77f91d1e0a74df7ad1c7e50db1e638ebb3c",9.317957166392093],[11941,"10874377dc7699a182d726eb5827e30b1193599d432099a7ee69ff4efbcab5b1",9.917710196779964],[10923,"a9c5be386fbc52741dc8646a6461da9f73ebff812edb8e84c149e95e11f78ab8",9.917710196779964],[12759,"4f5beaf7472c7fa8e52d161f7bbde9da81cf65d25cd64c3bc4c9ed6f7af02bac",9.317957166392093],[13471,"bccc9c3dcd8ab7c2581c1a09c4a577367616548b762c4a3122c29e1149e298a0",9.317957166392093],[7139,"feeb3363d619e3ba2f33b8ca386f024460b7db6f63f71afeff0938e954f916d1",9.917710196779964],[1442,"21c33178db358d43eb2c1bc7c47653deab0ab8f9e978ee79250b9f47f1758ff6",9.917710196779964],[1940,"4a57f25e6bd0aa489a0b8edf2ce70888760f6238435055ed8d4b10c1d3976df3",9.917710196779964],[17533,"33e3ff205f6ee35c3f6f28e984d6e5934fdcf4d1bced8e4efa666a04c934e246",34.88770053475936],[9452,"bac7ba1ebe86ee5550992b1e9d0511832effea2c23e74c417fa58f2a1ebf01c2",9.917710196779964],[11735,"57452fc13655048f58ac996d316ff6f1b38c1a659daa4b1d2b2e2410245815b3",9.917710196779964],[13154,"7c1ae4fba0bbfe2df7c343bbdfe5ff10436b50d7a3711754fc84ad325ceceaa7",9.317957166392093],[16264,"7da28566482bc48465f3e2ed14b648f6bee9dd97562881b3c469aa1436480762",9.317957166392093],[344,"cf384089effa1912ee8563cee47aff0b9eec12194057adc377fd289f072bc1fd",9.317957166392093],[12582,"635275f90209b337c314cac637c9755a7bd1c56cf37f0a4a04f73a66995563ad",9.917710196779964],[12990,"86b56b9ea2098fc8790d7183dfbd2296e464329500268703479e6bae1121aeaa",9.917710196779964],[7072,"78b647d0c75b5840dc41eda29c6834f52ccf47a608b6ee5dfd66b368b7df80d1",9.917710196779964],[13559,"5af4d5974a79534f7f273e0ce651f0f35f9c366776aebda41b877d901e1b829e",9.317957166392093],[16441,"4b5949760c9ae383dffe88c92d2fad777355c7f0f5a47e5cb7cd34375917565e",9.317957166392093],[4623,"fc77aa99e4f616ed5942c39db2415786f7bce166bd70f82e233af7bc9e1078e1",9.917710196779964],[1811,"8f93ae440dbf7a9117df7301f68d8d392995cb07cfb663ee4f8844f933742af4",9.917710196779964],[1611,"ac3a5fb5f2b62dedc9f6132ea2e265a310949c70a66218e9857c0f5b113c81f5",9.917710196779964],[2388,"779a6c5f23743f8785440bf2c3370da308d17e14ae2ee67a51651dbda83a87f0",9.917710196779964],[898,"2466668ef9fdd4c73ad8ddd1b7754d9971131fe6879d60a31f6cd466a45cebf9",9.917710196779964],[6649,"c4cb4cc27b95d02c7fab5c5023e902bb2769d2fa084db575a08d754c01da54d4",40.13437849944009],[5208,"bb475301c07a5d67f2f59575c64b55c0cc91274dc25f5de435384c423942f0dd",9.917710196779964],[12457,"4e569eb056c82c937036dc3b2dec549b89c6fbecf9cb3bfe39fa42b6acad3eae",9.917710196779964],[2305,"f6f7de7b75c0a5d7728a85831558b3c88a68183c41ae64399925b7709415fff0",9.917710196779964],[12878,"87c30e38e68991e12caa4d985db59e04228843b353973a43e7720461748368ab",9.917710196779964],[19464,"6a25808f823989bc76335dfdeddafe98e89b54cc4a7a81b333ce7a97e97b8a0f",9.317957166392093],[2389,"367c516566008da737bdc3bd0da998a57da499cf51cf2e9c6cb7408e12fe86f0",9.917710196779964],[4409,"0fb84f005f9b9feb03d7d69e06a4d974fc51082e29efe79dc21db216193e05e3",9.917710196779964],[5353,"ee84398182d94207da48cea5b83d78f4af40fc03417cfd6edc71a123f26223dd",9.317957166392093],[8392,"b815bf5755c71492c535174a1392432d257a5e8f25cef3a493cffa888590a5c8",9.917710196779964],[2886,"9ed36bda0b93b0c1505763fe42fc807cec29316ba9ef35e63bb08ebf20eb36ed",9.917710196779964],[18583,"d24f9969916b2ef6142d57a4b0e8e0dd3ee0c2da04e48af226692958a622522f",20.096618357487923],[7348,"cd8e85fa49295338986ffc873871f0639a1e1404d5ef90e09b2cc296e4a5b7cf",9.917710196779964],[18280,"eb8f3c5f1da73d9e91a44c36ff8bb05a6e70b351fbc65d2d2a46279c884c4136",9.317957166392093],[2195,"b664ab5e52018326de618e9a8f89872e025c5cf79b6e1781359f1d0ab32692f1",9.917710196779964],[14485,"5e1ad287e6cf9d6b30ea0314438710b8e84f1ff66b037813f703830fd9508789",9.317957166392093],[2515,"ae6a43d784236642b95e6e528bddc7680950ecd0aee25c36d06a9c9f19acb4ef",9.917710196779964],[12067,"e64cdf6381ddc651d34a51290d08af711849241c4f62b317e1e4a70daf51e3b0",9.917710196779964],[17834,"1514167e535f9e8f0d49b0db02f346c1dce4aa2af53ef1c2ab2e36ee2b299840",9.317957166392093],[17704,"b0023c15563d2b16b28b8a5c9ef4e6ff59e85f8e13e42373feaf8e5b462c2243",9.317957166392093],[2150,"0d0a7acfe9995e34e90903aaf56e33961413df3276572df9985cf27a8af6e7f1",9.917710196779964],[1838,"65df3bac04f8b52c6d9d8740ad959302bf2e673a1e47613ff25b7e48843302f4",9.317957166392093],[13604,"981e2f6aee1a779d41c6e6283ec37ac812438ea97416ec8b9a205c4c0172569d",9.317957166392093],[2882,"1bb5f1beb681d6764f1fa1cec0b63335b905e43fcbf3fb90a70fb52446b13ced",9.317957166392093],[18160,"15f003a3f49b72d5197cdf9062705b583ac412ab78594ba87eae6c70f3eb1839",9.317957166392093],[13748,"f8a9c0075ea27e2c728e2c0bb9030677bf3a67d1108c7aac88027bc9578f7a9a",9.317957166392093],[5308,"6f84509e979997aba1fbafdf217ec4e9cf300c29aa177bcbc92037014f7f57dd",9.917710196779964],[5670,"37e2cf07599824a1005f229190e16713ad5a4f1ef57bf5f2e20b73bcbc6535db",9.917710196779964],[11870,"9e386c4410efd53cd95469c6af63416a2c135de0de948d8fc27722b3c83e41b2",9.917710196779964],[1598,"d224ca2e58d16f087c139eed82c48e0d1ab0df5eb4caa032e9269f68c06991f5",55.40636042402827],[15930,"ad0b318add472159bf619114d15ea6f89bb85fa2bc717441090dd9b19bf0856a",9.317957166392093],[3572,"9e137743f84981bf141bcf8ff83739f45d4682eb0a0dd9f693777b8a141a79e8",9.917710196779964],[11268,"62da65759d14567879c0d60cdbac6d6c783673a85a1947ba004f297fa5823cb6",9.917710196779964],[12414,"aa15de95e8520ce8c19d29bab4f8914ead8a9f1885e78abc5ca8ea8c107783ae",9.917710196779964],[19465,"cad5782b72d51036bebb5521fc25d9b35a696c2cb1f664dc993b18d9ab25850f",20.08888888888889],[15306,"9eb3cbd5b959d420b8b844fb5e486a958ff7a286fb00b2b2acd2735dbb5b4578",9.317957166392093],[13498,"a7eb2b4ea7bb93792375247e28b844903dc4bed958317c10c364aa2984eed79f",9.317957166392093],[1808,"436f10be87190f81a1efc46a50772db6ed92b6040017a459498cd9ad77552ef4",9.917710196779964],[5927,"311ec0ebf0c2455e79ab49fa697dac9e7e30dbfeddd24d1418844daf190186d9",9.317957166392093],[15165,"9207ecd34fdb1c46484f4d92d11629c0bd9f9a5705f9a2533ee65954a434297b",9.317957166392093],[15591,"f32a0a23f6585c07d1f957a6eae2683a606d2500980bc2db0f92cef449e18271",9.317957166392093],[13893,"2f4adcf5a5a66f9ab697d22f81fbed195abb7bceda1995359dba4d7a9cfa2a97",9.317957166392093],[7864,"d376fa5b784506a07be9870f4ebb2e7d96c109a89258233e005569e85c6d76cc",9.917710196779964],[11926,"9bfeb8769f0adb8d4438603c0d9e833fe191252c2b408deb13b2c876773adab1",9.917710196779964],[12546,"da3f570ebac1e214a68a792d0d73f3039a6c11b2dcc0de07f4a93733b259a5ad",9.917710196779964],[6921,"9f6ff795d687a59443681f2cb09d8c304a2137940d665c9958169a2a8f2a77d2",9.917710196779964],[10890,"1f4ef175a84cdef1faffa7445fd68e2cb9fe6c1e4ad4d2aaa90fb4784025b8b8",9.317957166392093],[1589,"a825fe42fe967da21e58fb28edbb470c385ab80c6181165bd3c5ea26f31199f5",9.317957166392093],[13001,"62fe3d412c3f09024c7159d3b27d98592048820da2a838da0fd988007e2a97aa",9.917710196779964],[3371,"c6e364e8eefef80848d98b445042c3b59fc3327120534f69ecf685144fc7e7e9",10.052724077328646],[12533,"585ffe17b1c67588cebc80f40106320d1200ea1b723715352e6a47122b25b5ad",9.917710196779964],[18318,"0caf98b567e37bc1593cc43cf3f7f4adb0fe42d8d12a3c586060ee4ad99e8435",9.317957166392093],[6647,"98e43a63dc370f2ee1842282512f76525ea3fdb614e5df7ab26ceb1f1fcd57d4",9.917710196779964],[110,"86384b5d5cc33f7bfa39e608054b1a801e7f409651856d41abf0ff837dca54ff",9.917710196779964],[13007,"f03872daef97d05381eeaa9d5d7486695215920d37ac653f1e7d327e34de89aa",9.317957166392093],[2627,"0098fc8b4c66f86ed5812f5b6703c17efb49e8b90399575a9599d11c51ec06ef",9.917710196779964],[1242,"4b666c59a755621d95fd251f0b35436e954c8cb76d86e1a14a23e16a7a32c0f7",9.917710196779964],[13700,"1db5058a44329201175adc387dfb5b0e305823588d0ba3e88e9a0b689183479b",9.317957166392093],[10031,"b4fa00ad91e9071a0cf6469d787c99347848122e881782d4bb66ebdb9d3d22be",9.917710196779964],[19768,"9230de1e49a0239818780354b33f93980d62d0d42a552d7c93b7666f43d0b703",9.317957166392093],[12816,"94535acd9dbc1419fa087d918e01b1eb1593f8b042ec2f3ad62d2c156153d8ab",9.317957166392093],[9546,"3600fe0fe32830620f32c123e0092b2a66bd5ebab7e05bb5095a3fd72f3769c1",9.917710196779964],[813,"109ccdd41289a3624d1f86bb7b95153c959eff831a69cc5d7cb9d487ae9072fa",9.917710196779964],[18787,"34775cda09e514b0406266483a95f62239484a23567242dc1846575976e57527",202.0523560209424],[10905,"67c3df0039c46ab1f013dec290204f7bd2050184a814f9ee972b8085c70fa5b8",25.031096563011456],[19003,"28a557e0e95019420d977b981e6597430962a5725b318fc2a587e04065477720",9.317957166392093],[15873,"572e47fbbe7ab600c52fa71db2c999c8fbcde64df12cc8ad9de9e7ac189d8a6b",9.317957166392093],[10357,"c943639b59432f726141dd9912ba6beb76033552c7231d84f596318738e303bc",9.917710196779964],[5163,"fdfdb9a939c7b02c477272d40ec1e01f222cccf15f826bf7644430023b9331de",9.917710196779964],[13678,"132607f8bcd5e6b67e5579f7966a5ef3efe1a726093eb0f5c41f92ff5dffb89b",9.317957166392093],[606,"001d3569344a7a88fbf1a5d6ffb95c96c09813c791ed29ccf748a1dc9703e7fb",9.917710196779964],[16555,"9832c0694b1a910066e49d8433c52b2853868aab307b619b0c5844ed5150f55b",36.807291666666664],[8853,"0fafa78c22fa6a1e0549e9fa168f316795246ae6df4e72c8faeed5af48a8c3c5",9.317957166392093],[2323,"15d24fe4f129fb5620c105b9c24dfeb00490c9a116677df75eaeb1c35067e8f0",9.917710196779964],[4902,"e25bffbc9b054d7803242185066dc797a0fde6be200f3d69d62fccf729d1dddf",28.14867256637168],[6146,"60c11f785dd7ecee8c3c8b6948843d0718c972e2b2cd2157d94f4ad09baf29d8",9.917710196779964],[9716,"1152905785a53354ae756428c49987f697f6c727be873803c4997635f0be3dc0",9.317957166392093],[6979,"33d3475ff00d8fb3aefe66fab6954a260ab64697f93455b0950ea920ebc11fd2",9.917710196779964],[9529,"46e45b2d9d37696fc3e98f8e67cfc710bb480c8434965658a666807a479080c1",9.917710196779964],[9439,"c4ece4b57dca2293d3404a7ca26da849335148a5d59dc854d76ffa2d8f9215c2",9.917710196779964],[19128,"e728123d0744fc90fbfe525d7b6b324e8d21529b0803770a1f9825664633391b",9.317957166392093],[10284,"3782794a74b261b4f8fd3edcf949c33a0326633fa283a8b2180703784cfb7bbc",9.917710196779964],[2585,"35b5775438501c60328a14502d1c445c2b1813358ce7ffb7e398b8a0d4e343ef",9.917710196779964],[1337,"092789fdf1a98ce76d4ee55a6ea068d8b7c45f05963548c5a48c94aa27f028f7",14.249110320284698],[18967,"54c05305ca56fd3d3694c304fe1076f5f420c5f0b7fd13155babe4546da19f21",9.317957166392093],[3140,"5d417fb9347741304fb974e9b4579185a4ba44cf5a890052f3d7086dea6c6eeb",9.917710196779964],[10430,"be3f157b77e6ff42433496819ca14f260b939fa480e4d949156ead15ffa99bbb",9.917710196779964],[804,"eddfe87c0a6966dd9287a8baba17b1be578c8d403eaa045f2d035bef41a586fa",9.917710196779964],[4933,"caf48a7e70ecdc333581225ee15c9694abf95e677782c8161e03a1dee20f9edf",9.317957166392093],[9645,"1963a29e204f7f5d95f51d3ad476114baad88ebc8f9c99eb47c9a2a46ccebcc0",9.917710196779964],[1922,"6a7770a06f2e91802efe8f353daeb3de09460ef37fb089628c8a6db6469f88f3",9.917710196779964],[2085,"8296c4865f62193d86cc03f8a914b3f67c3cbfc23a346303bb2c6a30883153f2",9.917710196779964],[6231,"6a7a523c30911ab4701fa1d08b1530e18250ee7a59063a946ef905b8003b89d7",9.317957166392093],[19155,"8c73498fbe701e48a4ca7131d85aaff0671f0cf89303bce97d8c8acddba45f1a",26.062052505966587],[5243,"a5e5c937000c279677fe6503fa68d112894acc7ffbda646c2944abce4c13badd",9.317957166392093],[232,"1437e699db48424cf9ea0d039e2d195e8d11525f0bfe5bfbc6761f7c4f6a71fe",9.917710196779964],[2623,"d3d78fe219f5e2a48650917f9aadf6847d762ae0f43f48944273cb148aab09ef",9.317957166392093],[19853,"5a122727d13eca20e88c65d6349647d31c4bc2750ecfbcc974b9842292e9bc00",9.317957166392093],[19081,"1521d83302d9c9437fd23e9108e4bb342e3220803656f2062daf00ea8208901d",9.317957166392093],[7155,"8e6e484359db85c37c0bf82ab23f4030375a3ca12d90b9ef44060e930d4dfad0",9.317957166392093],[11736,"cb24951b2014b2a7598a48e04362020e3197c50c20ea310211cd3e41a95415b3",9.317957166392093],[14037,"4095d05821133905663967fd43981805be6948ee121952219ae94d410cf3db93",9.317957166392093],[963,"c5ce90a395d5003f44bbecb37ebebd8085c5dfa39853ec29cc405dedf4416af9",9.917710196779964],[7961,"dabd1e53665207b5478f0e35eea0e016fc3e9d88cc8ee37538bee21720ffd8cb",9.317957166392093],[306,"03bc3c6ec4d5c9cbf9e1097776ab5e7e1660f3742b940fc4795c00a1cea4effd",9.917710196779964],[13811,"e91b00566ab17a18331cfe3908c17a4e6ff237b8c2ecf9e70dd0347517002e99",9.317957166392093],[15889,"d58b2caade8bd8560beeccaebd6aebd86a504c15a3f584cc15145e098ae7386b",9.997888067581837],[8248,"59d5449f00e4ff7b052fdc49f235f83f0622cf25394e5ca57cec29af2847a8c9",9.917710196779964],[11619,"d19c6d23c9256f54429757e253a0b184f676c7d58054be107627532fdfa4c8b3",9.917710196779964],[6897,"45a2b9b142f0b9ca8cbe545b1b42fda556c118be66cbb5301530f35fe853a3d2",9.917710196779964],[18103,"3ef2da1f1d869938d866e5d10e1b4fece5746299fc1e1346354e6c2f3879d53a",9.317957166392093],[9091,"946c6be3551988a9303a50b637dbe095c116bac01624b161fe2f3406cabd38c4",9.647446457990116],[11511,"a7e852753ee56f7cc1955652111fd63e47b2e7f8f3d3d5a2bedbfdbfc9fd71b4",9.317957166392093],[12037,"c22aba1fb381bdb2167338e2e475132392983ba8f618b60fbb68c0ea15c40db1",9.647446457990116],[2640,"0a8372aac6de561a881865db448de9aa8756e226e106f2ccee8c8048296aecee",9.917710196779964],[8933,"fb337abb01533ab839d900b782959f258bd14b7b224922747453833ac3fb4bc5",9.917710196779964],[9801,"397c6e84523039fd84070a51e5696f44ffbc524637b12bf50b5da499c1daa2bf",9.917710196779964],[18426,"0a6fb1e09fc934ff19c3256f20aabdf92106153b411d35d1b864b4cbbba21133",9.317957166392093],[19830,"1644ebe71c6c074d5390b35d85ef8afff30ed7bcb9cc312053dd5d3f84d38001",9.317957166392093],[18812,"0aa24dfc46748096e13a742bd01005de98cdf21e67a6288ff0f05e390da35526",35.831932773109244],[76,"b3903e4e7b5866c0785c69773853df9c18a6265acb544c080e7e5f0263947fff",9.917710196779964],[6403,"3de442e323043282a429a1900c73bf9f74152d2cd64a8fef7bb18959a58d51d6",9.917710196779964],[1160,"48e45dd1377eb9be4ba1971b7f807493b1159f2d83d1a46cfe597524e6ac3bf8",9.317957166392093],[12708,"b7a1db2681db17f649031cd862009cd451c2135c72a76443921b50e613a48cac",9.917710196779964],[2685,"0111ee761269cf73d29fa286fc89b5d673fd25921a865c01e16e1143d8df93ee",9.917710196779964],[10654,"f5e1f9dc8d7d76e4fab4baa191f02388ac126fc83cfc84798aafac9362a057ba",9.917710196779964],[12989,"af1241ef463389b746827589a1e540f2f3012196c0073524ba9be47f48c5aeaa",9.917710196779964],[8325,"4958edf9e5b3c7c50ce4bb1cdc708742a383289af1328f55a9afced3c77f25c9",9.917710196779964],[408,"fcceed17971fab40d6f9fba353ca770684223c5ef67213d954f21679d5684bfd",9.917710196779964],[18390,"9b33a3da671496a2ac2f0795eac21dbf6996883f6b0f829be6273a9afd079f33",10.040705563093622],[9313,"3d86f12fb8dec026c4d02ecb58ffdad44e538dab14b5587489f36d9022ccc6c2",9.917710196779964],[12074,"ea97d6422e8c6116e64ef82a9fa6f0d3ca42a1d1a589a53513d0d72ab330d8b0",9.917710196779964],[7753,"57603ee4364b40958db1c0a58c59f339cd6b795a41f3e738e52a5f93a2b51ecd",9.917710196779964],[14122,"97f5f459d3b8b36f41e0be3b7fec4fe29bb0536d53e37e600d04dae55af00d92",9.317957166392093],[12832,"926e886206c70674122cc0bbbe841bec338a509deacf3cbf1839abc35b66baab",14.188948306595366],[19628,"08697f060f7ce5f2f5a21d31285e832bcde799580f4506a4e474585d81717d08",9.647446457990116],[17085,"f43bb1a2b751dad59affbfae37235e828db2f80da4631e287f4c823903c82350",9.317957166392093],[11438,"7cc639174fce1534b98ba9e26ac46cc87125506f24d2fdf6c60a20cfb6f706b5",28.046511627906977],[14245,"05bafa768b3d48c65b806512450d65bed51053ffe0dd813a952f9dedf507168f",9.317957166392093],[17952,"535163ca4d23b8b4dce1cbb8872583dc678558b9f995ea399d0de106fa80303e",9.317957166392093],[2885,"3a73a0c7c3922f2fc7813cdfa3b83e3310821afc2f8fcf88254550ec592c38ed",9.317957166392093],[16329,"6fe67446e125575b0bb45dc40607670c6aeb931d63acc5cd83b8cf697cce6860",9.317957166392093],[15377,"c440168bc555fa4dcb372edc1ef6633a849f01cfd00d2c2cb60fcfd1e5eedb76",9.317957166392093],[19258,"d6645684dcc3333a46b3e943e16f1e1a3facd0ccde3794628e43d2fff3826616",40.76292335115865],[9140,"2d2b5af8f45db6e18770b4190469c9c17e9efa9a284d3007f3e9db7cdd79dfc3",9.917710196779964],[7315,"5ee3c747089575582803c027788642d81373fd47b1f07708629e098fcd0cfbcf",9.317957166392093],[16471,"cb185e47d6b9909638fb7a4cc7962eba9dc41a74f49eadc4230d75696afde05d",9.317957166392093],[15139,"5fbea6554c4eea866a2ce041c5ea0c99fab803e1be973fddd7aea08b4dafc07b",37.63106796116505],[5769,"9aab8a8be844a533bf26b125707f5d2a3e2cbccead000179e0b3265f20eba8da",9.917710196779964],[11364,"f782b4fba533d6d18c13612f35c140b0576907d2ee2fd9c293f34859dd849ab5",9.317957166392093],[4842,"ebdf740fa59432f3c3cd00cc466a3a61f3759030b7de4eaaf481a0a1ac922de0",9.917710196779964],[6047,"2aecd9d4597f88a46972781f86681a10433b8fe39c769b2add049bddca26c8d8",9.917710196779964],[4299,"9b8b7306927c1e83c9d14ccb85997f4f54e3ff55bbaffe3c8f324d483b7cc6e3",9.917710196779964],[18385,"6decacec836525ce0a35e6dadfdefe9d3f8850bb6c7a75b3490d03699bc9cf33",9.317957166392093],[13503,"a13a1a51ceecff084c8ce3a4345fcbe006f9a5c9da7fd4d528f01894d9e2be9f",9.317957166392093],[5470,"384845060756c64a43ea9c481c65b2e1663c9d294bb4801222fcd8d7cfc164dc",9.317957166392093],[18620,"d0178d20d1bb358c597ee8e180863a8ea120e11431ce05b18f6d144b3ffa262e",9.317957166392093],[13810,"1025d2b14e277fe5aa2fe1ec7499d41b97e20db25ff060654e5bdaf807413199",9.647446457990116],[1560,"1aa0db5d07c5749f3025305d31d9bd200397e065df8ee8d047e114f6d460c1f5",9.917710196779964],[19276,"dd7b3fc0dd24d5eb75fa792d2f3c81a4d780ab001c1bc2d56f9f86209ca5be15",9.317957166392093],[18076,"3dbb24cf5648b8b22476f5fdd4da8392e13308d8a8269085224562d1f3ab963b",9.795475113122173],[5409,"42546cdbb29f528cc937bc5cc9936a6fc167363e1caf91306fe8e1d4c9bebfdc",9.317957166392093],[14374,"661bce64f91aaa5396b4d52689705524417f1ed6655a042768a14def333fe28b",9.317957166392093],[8238,"d73b522ed197ce653d0e18b1ed42410368d62fc922f9004b81dadb82d2c6b6c9",9.917710196779964],[5717,"a6b634c244c91c8388389ae55bcfcf55192af7225dccece33fa515fc8a5ff4da",9.917710196779964],[14786,"2d463b23e1eb0ce5400f9de36082f6451ecc867f7006ff9f098f827f3ac72b83",9.317957166392093],[13233,"6aed56758b490f413922431db7420533568d323942b2968c8be472ea347244a6",10.052724077328646],[235,"e86f8cb6a0079235e9e980d6c8ec0cb46d7debbd280c4b833c5866c54adb6bfe",9.917710196779964],[8635,"8c333d1f324c1db080919850dfa54a83f7ea89d76ae0e53c51306a182f8c32c7",9.317957166392093],[18169,"7d465660c6dce953ff76a0517d5228ea1a00c9d2357e4c26fc3c4da053b8f838",10.052724077328646],[6133,"a369b67cf93358937a3648ae32d808ede45452d48ad5676a94417aec29e53dd8",9.917710196779964],[1016,"9e67f83dcb99b13e27b49ae9b85363f981738cd1c20e519617c206d0bea61ff9",26.893280632411066],[12556,"363ea3d6a48821f913a3076c7795eaeb6135ab8d705cbf8236a01f252be598ad",9.317957166392093],[4085,"f1d6a75ef3f69420a9441eaf34f2977f0c7f92c088315a4478da5941264e2ae5",9.917710196779964],[9162,"8fdd4e85f5a3a95a2dfdac09703278f80c57122eb55b5328845edde75128bfc3",9.917710196779964],[1406,"6049c1ca43a2e961215805a3b5f0ed465f0512b65236c7fe2db5d9ffbddcc8f6",9.917710196779964],[12399,"67768e67f18447074e1ab5e81b358691be7185f01012b32d22435f6195069bae",9.917710196779964],[7787,"4c08c24335a31fd5c403f354bee5ad82c64e951263efea257898d9dc0c99e6cc",9.317957166392093],[12202,"27a7a01341855155fa708683f5d5712cabf094dfbdd4751f0eb780e6d78b10b0",9.917710196779964],[8884,"717a524c495607cd7d862bada8b02178cf1428fbd0924b4b42c247b229f68cc5",9.917710196779964],[3605,"1c00a1583df38a9d81232122c63b3c05902d17dd87ecdd629dc76419cfbc2ee8",9.917710196779964],[2930,"74fe7d44c7ac79544254621adaae67fe1df3bc2f643a3df982e46d12e03dd7ec",9.917710196779964],[18517,"dc2316d786cdee57689fab6ccb5bd7a83e4edde6c78ef8aadcd0fca4c9181931",9.317957166392093],[8376,"c68c5b914831f000863c63087502ce0b72bb83cd6a8499cfe2a53c506e18cdc8",9.917710196779964],[13499,"b60cbf99a4046be532fb76b5cf5f3a366c5be7192cf497157be2d5538423d19f",9.317957166392093],[3711,"8962c25248d36b99d632e7b8e0eb2d2f621b205d01b879ac133918ec47d086e7",9.917710196779964],[16687,"119618f020e528c2349bc7f7f9600b47255b24ffceb0462e170659d8f5fedd58",30.133333333333333],[15052,"0a24c6fdc35ee85e77639cb5fbb36f4de19f6593969d9ff9d4f513e17e37797d",9.317957166392093],[17415,"3a7ca338ce2feaf219df17e1864336a65aa85ab8cf2e87afb0e905844fc96e49",9.317957166392093],[1923,"fc223d0cfebc036b9cf64b34427bfab9fc604cd7cb8c63c2d518214062c387f3",9.317957166392093],[13564,"8e63233b02470da33c45a138006a801ede6dbb03662840545ea993afb9276d9e",19.213029315960913],[3219,"4afaf3ef1fd9644af48ad8379a700a933aead263827a618bc54f35eee165f0ea",9.917710196779964],[4830,"834b27ccb71a5f2e773e744754eed78b4477c2e8d2b80f8c10c07413386e3de0",9.917710196779964],[602,"06e17c2c6d5d5905756cb1bf23d51d8cb9eb7acc76929978a465a5d5eec0eafb",9.917710196779964],[5947,"6a97043bbd96ab7013fc3714c66d63648e8368d4405ac9485fb1799550cd6cd9",9.647446457990116],[14957,"a12db2beb58a01a2d27b4d28206d86d489f28b51985776b06fed25fda7768d7f",9.317957166392093],[14586,"108b1ed4c90dc2b3b215a47ce7f9b855bb5f3b85b89899133f7a7a1fab7f6d87",9.317957166392093],[10862,"a36c354697c1999661fa3f9fc8314dba3de240e8320cb38130ee0229e614e1b8",9.917710196779964],[19786,"74e4f87a15f6f95a01bee5408259753fb7554fcc9aebd8ef1d408f29c5e04103",10.052724077328646],[19754,"d2edb31a01d603669bc16da177d64aaad3f7096f58b4589d7e9720cb39078c04",9.317957166392093],[15687,"0fefa980228aacbdd7872909dd89d70e339d99e7d45621c178896c6c9e32b16f",9.317957166392093],[4637,"3c360c88bc67130faf17e33aebdc7f0107eac75c7ededf4bec38b7c3f45166e1",9.317957166392093],[5334,"87d729bdc90455bb2b093ecab66f7ec48b7cbb12ed0fcea4ba5bd2a54b1438dd",9.917710196779964],[1326,"b8196bfe9b6ef60f77f99bc2d00a3bdc1040dc04cd6af5d14d62da17192440f7",9.917710196779964],[13442,"9da6e393b2f982788b3671a8e081bd0aa4767221656eddf1fd55ca84a35348a1",9.317957166392093],[9743,"061d90188f8aee6bf2ead260aa3040ca5a2b27a6f1679dc809b7e842512908c0",9.917710196779964],[14117,"07edb4d8725fa0c1690d865edb925404c51b41b3ff840ab4711aad27ad223492",9.317957166392093],[13884,"f9a24e35365683f9b5b99630673a608bc7cca52516c39b9e3bce56a2681d5897",28.12785388127854],[5722,"51390ebb90532c926aa4ac54dec84e871a7a8ab57c1baf5ed41732605355e7da",9.317957166392093],[11792,"28867f11f730cf1f304cc97cf01a1182da5d6c5fd64fc134b6b39beb7104c6b2",9.647446457990116],[4735,"a41e8a5c56bbc5748b3b9f1e9b752b72cd907f82dee8b8847fa8149fed56c2e0",9.917710196779964],[14478,"960ef1f5970a2cec12333302c2d0e0900122466c52993779aa21533e69f9ab89",9.317957166392093],[15430,"54d0fb92449c166d7c6e5c98b2c7499d1cfcdea72cff0f8268f3e59c73f49e75",9.317957166392093],[29,"1fd9c92091cbd61550089d19cb6ee432fb6fc6c6ab3654074c6b1249ffbdddff",9.917710196779964],[6141,"bb97ef51eaf6c7af91f3b6bb8a50fdc4cd1c8fc70feb191f800b1445488237d8",9.917710196779964],[10363,"e00b6eb017d58e9ffc89c5c979e99376791e447ed756a8c3930e1c98a5f6f9bb",9.317957166392093],[13137,"13f175cca0dda885e4be98500d28fb25423b55d1548f37ad6e778e8e1e4439a8",9.317957166392093],[18021,"499a053e122ffea7ce1d151f19d7db41353f895eddda79ada196c25b2c38dc3c",9.317957166392093],[15727,"3cd50cf99818fe7a65252394c712be2357f1733f7f865f72abbebc2b6b33f76e",9.317957166392093],[318,"c4aec5db113092c8d1ed373ab4e7cb0df26975246a8d0c45f424a61de82fe7fd",9.917710196779964],[7594,"d4d2dbfc7efeec542ed90152b0ecfa6df64d24e7ffc1c7473668c32d7d1e37ce",9.317957166392093],[9805,"c401350052ae571d54b9395f3c615a85471aa798d7817d1d58c3eb4e51c497bf",9.317957166392093],[15450,"d4b1a23f981f99040750aece9220736b7957faaba8e6cb362451c47f44252275",9.317957166392093],[17330,"5d61d188e74741ff6a98206d7cc8172c44b7fb451423ce367feebdf80a6b404b",9.317957166392093],[13160,"c1bc4a6e0da6f79982a20350df5d82d17d11ac2afc463e208e5986bd0a37d0a7",9.317957166392093],[7807,"56a2e5ac6a22aa795d2552305e9ecf1abf32a2ad65a6c010519e78a69a56becc",9.917710196779964],[16700,"7325439986486fbfa2c50f78c97d67e33250e8be5a26e696a97d1afc41927758",9.317957166392093],[5065,"ad613dc2fe5febc4c91e77e25d3ca5e1feb925a42b1ba0395d16ed8b1adcbcde",9.917710196779964],[13661,"24864157853046347919d41ca2725490e52f3344ba9a0f15b626c979ebf2099c",10.052356020942408],[18897,"e9cae5d4e0746e06684404666806195639b9e7347ee75819e092bb50f5969223",17.0744669218152],[16505,"e1c995bb4b5e826d0f00bac1082885e21fd7a961ddbf1cd6ec2d04bbf0fc235d",9.317957166392093],[15613,"4044117dd657717a17e8123082855912b32b759ddbe93481a95ac62c7eb21b71",9.317957166392093],[14029,"7537a5f8d3d55ab8bf35b63d4e4df185ccdcfa91b79a28f5c324915444762394",9.317957166392093],[19428,"55bcbedd77c788d6b4545e7acbbaadba725a96a5ab8603273990b57cea2e8e10",9.317957166392093],[17255,"7c82d45800c2bfc967629fa72f6d0294e101e17417311688be84720deb1bf54c",9.317957166392093],[6344,"3f9a8f92c4af031f17c010d2d1150de79e136ba496e7a74b689759b90968b4d6",9.917710196779964],[3706,"4c483270b37ae1a5e19bf02680611cdf5eab8a92147a9107070cfad929818ee7",9.917710196779964],[10621,"5e92e89d35070c49b0e18d13f73d2cdee1ce0ce4d980db7d3eacbf4126238cba",9.647446457990116],[10601,"e6832de8ebae25f6b7e716de9589110e96b7663978d8f33ced2cf59701f3a3ba",9.917710196779964],[1260,"829a82e00c8f75c391fa4e2c4511589e6a4968c9a73d7f4a3cc45eade44299f7",9.917710196779964],[4577,"bb694666991fc17d9f8fd8022857262568c0b393bd18661730aada29c45ec4e1",9.317957166392093],[3637,"248d9536d51de3149e0e9b6c0e97bb22cff76e55ea775967195c43f8690806e8",9.917710196779964],[14342,"961bf0d9e9675fdeb27d274070fcd4fec1e09a343fd6a5fea0738fe4c1fd7d8c",9.317957166392093],[12574,"3dc1ff395ee4753aa45d9bcf149f4c8b838abe046336b8aca27be411e9186bad",9.917710196779964],[19206,"f3da3721d8c3acb11df21cdba198e2c051564c45b873c164f23d073bc8637a18",28.14867256637168],[10543,"78e3b9823db4b14d8abefd51d6e52f2bb74114ab0afd5c58a18a20e87f76f2ba",9.917710196779964],[19137,"be8ea38be04954dc0070ab8a3a312d698c2ff8121e01120f4bebf26d0590ee1a",9.317957166392093],[7823,"f42fb957d596f63a144dd3b4e771380c1d53ff73a8a3edf267b5d03bbf9c9ccc",9.917710196779964],[7610,"2d1e0ba537daa7225f61a00c165970237973df5a43a8262f95062d9d289b27ce",9.317957166392093],[421,"d2b0b09956fb1a5f1d38bc651332f9840e35c00b685b1f952c55de3067ef3cfd",9.917710196779964],[18615,"9f367f885857ce1ac2520af4be6c4d9af8135b74f643747f08b2d9b0863f3f2e",9.317957166392093],[1409,"ed7d4f369dfed5cba242f8d0452f7601343b295d545b3f9f33a6ba319ca5c4f6",9.317957166392093],[6036,"222459a2b31c5dc9eba2563f84d8a9da1dd3b4b12729c707e1f0844ceb4bd4d8",9.917710196779964],[18513,"2fe32bb040a12fd14b76a07f26aab6891d3d94f457bd47893ef3fce908953031",9.317957166392093],[13715,"41e8c00424d09787057117ad9f6bcb278b485fa01479f063c94dee1571cb0e9b",9.647446457990116],[18986,"17f8b0d98a137a38aa0ab88ebd302979aa8bd2567b621b5ca202f19a76ea0421",9.317957166392093],[15252,"182261fa9c02083cbf07af6dd7d923b42dcf82fc76341afdc78ff15557146279",9.317957166392093],[8037,"b573ffb9822b39d26e0c97740e46fa99557eb9968e7084bac2c2f73dea8651cb",9.317957166392093],[10725,"d38ad98d2d823b0cba161751817ac4b996357fd7721bbff31787bf39598fd2b9",9.317957166392093],[11835,"f133cbf9b499a79df4ef2ccd8f402f514595ed1497536de9a8e71f5eb66d81b2",9.917710196779964],[15676,"c711bd9b75d0e643aec2dd40a433214d451146375ca944d2343263ee7e06ea6f",9.317957166392093],[3921,"a3fbba94cdebcebfae26e5875f78c471677695abd63303e6ae99b9e462f834e6",9.917710196779964],[7893,"d9c498c680e45e8fbc6214f2e1fc47d22578882b787058c93f9d58b1a0fb4ecc",9.917710196779964],[7583,"815f50ddad78098c8393524d9633308d2e265d9959597cc992e60695957747ce",9.917710196779964],[11646,"ed263892a0edca8b5f6d56dd3d3995bc50cce38f62d894bf451e04000c64a2b3",9.917710196779964],[19290,"7129f0b706d4f93b879cb6b826610e1d5b3686e8de3e8f452bf40ef8dbf71415",9.317957166392093],[12679,"75949d4219159af08ef252a4cfb927399d4498506b9077eeb47cdf5c8954bbac",9.917710196779964],[6368,"ab3925d81eb7147ae5c26a24947b1296374e24f6c46a45642c808fb879f68ad6",9.917710196779964],[4400,"48a6bb64e0f19ae5d5c16c247cdf657af7bd5832284843858916921bd24814e3",9.317957166392093],[9876,"77159f36874c7dd9d9ff30c992bae952e707e5b06e5d3e84d394ae3a135318bf",9.317957166392093],[16875,"76b27abc7a78df3b55eb01b9250d49d8a5c2c9836f87aa7aac9e1f3c6d32bd54",9.317957166392093],[2271,"d1dd6576dcc493b7cb75c85f83c737b335cdcdf38f1f625fe7ba9fb72c2025f1",9.917710196779964],[11413,"779fb186cd074d1c3090dc9d985354a2891eaefbe346d463db3a5b542c0649b5",9.917710196779964],[1941,"7cefd4b3970d0209f848c2ef62420781fb5d998df9d648f4849456aa1a776df3",9.917710196779964],[9199,"52722110c77ee9265c0dfe14d4ff4b4edbf1933e46e096bc785485adf7b172c3",9.917710196779964],[2362,"edaaafb422f0a20407941bc3e2d83cb4b5fb6002bbbff5b2674dd48ee878b1f0",9.917710196779964],[6613,"4b2e022b03f1335fd0b70cbf6df5add5c7c28be3616857ee5536cac6fe3a8ed4",9.647446457990116],[839,"ecbc6dda079d58f35890a6cdef170fbfa5295a65ef9dcadd4e517494a0204cfa",9.917710196779964],[1866,"830e336b6b6d53ef33fbcf1d2cd536147e5df82dd8c4006beb29e38c508ed3f3",9.317957166392093],[8052,"dd83af12d5fdaf4d0aedb7d2f37ef5dc5f470289900c322fa0e0c595fa7a26cb",9.917710196779964],[5609,"d90e7dceeea86fd5c1a644a1a181dff56ed9e3289c50b5f1ba5de0a5802e9cdb",9.917710196779964],[19099,"b8c9f9b177702e9d99b407ac61b3db25339cd4c3de65f81e924d404b862bd81c",9.317957166392093],[8790,"4d7880ec3becb9b457f5a40cb73695b04479aaf7c1225a1b720595830a8122c6",9.917710196779964],[1381,"45690cdc2ff85a8e25b35c8fa8e69563ca327b59d074430100156eacd5e7dff6",9.917710196779964],[17280,"989965022f4b805b923099527092e452d5ac95b708ce99f4ec88a88b1620964c",9.317957166392093],[19363,"d41df26495840cc259dc402c5574404b6f8e842b86de8bc85cefae40c9f04313",9.353846153846154],[10459,"13795a1c6838b2499001990b8d6ba4cea2eaba95034060d2c04e1312a3bb60bb",9.317957166392093],[14845,"063483fe37bb952824f15fcff851bdf241a5e778de6a15581a57f987583f0482",9.317957166392093],[19419,"82275be95487453c07f9d2c35948d1f0132a1cd9f4e8c3a2cf4ac6174c75d710",40.38961038961039],[11278,"8687ca930aa2bc6f5cfe0132eb912768d7d1a9e3b87abcb40993940b79f22eb6",9.917710196779964],[5342,"43e866dcf0a8a0ce151ec07f54647112f7a5059d1cacf638cf2425c17f5330dd",9.917710196779964],[4015,"d986cd83ee7d00bb63014957d0116230d4cd85512215d7a2724ff9723401a6e5",9.917710196779964],[19642,"f8715307865943161ff9d1b0153c9ff016bb852ddb4ea8f35938f98939f63008",9.832572298325722],[10206,"c365fa56535b4632ae3719150be05c9274a0a7df52c391f5dfabb9d1dc7defbc",9.917710196779964],[3461,"7c392facde7c4f2ab073c0d4c1b8836fde342ba33d117d1f67dd6f5b97d24ee9",9.917710196779964],[2513,"c81c1d70ef3089ed293012bbe9add19c8d00b84cca1a5eb6f369dd36918fbcef",9.317957166392093],[3329,"8e7a11402c020bf796ac075a6ab587083996cc846db2a4268097c7d057632fea",9.317957166392093],[17558,"93352df9498836e7f434d375cdddb752c02f9bd2dea2889a9f45d9b58e935c46",9.317957166392093],[16133,"c26264f284b7c3a188ff0914fd4e03f6462d3c3f50c0183ed184f4467b066065",9.317957166392093],[378,"de08f1d57049db90c4e8af42fa32bd78e764873ef62ed83e6445a34d493381fd",9.317957166392093],[10,"00458a5b693f471f1eec4fb15f3dd459acd3f3dc08efe7dcf6232abdda39f1ff",9.917710196779964],[9305,"bc0f95e6fe8b91ee466f3005d84cbd0bfdd449768d862123b2ff6473435ccec2",9.317957166392093],[17731,"6b1ebbf7194afb29b1afdf25356dc60a03075ec4c2a452175f0763d4f142a042",9.317957166392093],[10696,"d0afbcf055928b317e1adc9abc9a02f81fbacb25f028f2de6de68fe2ed7c09ba",9.917710196779964],[3187,"524df4065dbc7ae9db939a20ab1a530a3f18f900c71c1109035b7fefe7211deb",9.917710196779964],[5756,"828e7644d54c40412a37a846e7be6a4f19438241a1f0cc2adb33732c648dbdda",9.917710196779964],[1264,"b8afa8a1756cc6ec59b1fdcab7369a2827ddaf8c32dce1cde9bc34dcb25b93f7",9.917710196779964],[13175,"e648c5ef2da0303bc60bb6287497c70c578e3e8e5ee692fe580fb2cd65bc75a7",9.317957166392093],[18653,"84c0204b2bda2a75bd97e03d47c754ef65fdde60c584004d3e2750334ed87e2c",28.146596858638745],[18507,"c0fcb2378e1c58dfa1fe01b1f870285d07690f1893206fc72f65aadcc5fc4a31",9.317957166392093],[12222,"f14db22432edbf42a40a3864bbcdec85c08f93dedf9f5a12c328938e4fc3eaaf",9.917710196779964],[17681,"472ed68af50bf1927d536d96533fb033bdf99e6716d5b3ab7705eeafbf5d8143",17.04221251819505],[18898,"5d33b18ac23d17bc02b04053980c8a52482fa246981fd431c2f72068c2449023",9.317957166392093],[6135,"fd19693b19640c329ec2866b045f2aaf1cc34747bee335af1be88a60b44a3dd8",9.917710196779964],[4458,"beee9224b86f2910b453b5dd3113c350834c5d899c1b93dd69e3d54c19fda9e2",9.917710196779964],[8974,"73c469250046257ed7fa5098f0646c1f13374c436bc21bb05c60435918e7fbc4",9.917710196779964],[13257,"d4437fe490cb40b2c49956b8ace203c1cc065c8256ebdc8d52587e411b4788a5",9.317957166392093],[14588,"6d6e21329a512153af8834fe82a6b658759892e78b9042c0bd8302d7182b5f87",9.317957166392093],[19434,"aa086d4dbca77ca6d3f3c6fd9cf0bd5ebfc9af77aa99c9a3aed61484a8f15e10",17.005347593582886],[11453,"a06106aaf9ec855b3745baf5fb242e1eed2231841aa8141f8540f99cf0aceab4",9.917710196779964],[2079,"7465cbb0d27ee9624db0103540f70679a85b71b01f5e6c9e455a1c197c335ff2",9.317957166392093],[10017,"54f8518abe26d6a52cb63b4d9426eed58b314a6f83ac3cd9880a7afa537c39be",9.917710196779964],[4722,"33dd91cd13d995c7de22ce1ee86e6bfb86e811b8bd6e4d2ccc7b6164673de8e0",9.317957166392093],[7238,"3d530db52d5b29b1d26c1cb549fd786f55da12ace09cbc5cd53783d784ed72d0",9.917710196779964],[12755,"d61f4349eb48215e38d0b20cc4b48b89b4a6c06de6c1b814663797bcabf834ac",9.917710196779964],[2785,"50c57ec53e491d24cacb50127e6ad69832e658a956b3136fcd7ab506290dd9ed",192.30769230769232],[4563,"db78fb0fd9b86bfae863c67850e16526357b1d069c059857c4624687a0a5e6e1",9.317957166392093],[7466,"ba29799432addc30ea8d3df74692df4a8cdb01c644cb320e5d365645cc89f2ce",9.917710196779964],[5084,"ead32ee21149e8a8e90ba7cf053570380ba9cd1b45f3233e8380c46d64a7a9de",9.317957166392093],[17228,"97ac6b145b5830cff652054351f731e28c4c2db62899e9246ddf307570f15a4d",9.317957166392093],[2032,"69d89695daf5dd891eab9c8dec20f62ba884f4cc89205dbda0d017a3a1f5c0f2",9.917710196779964],[18856,"d91d9f2132621020dc118bcaa598c978735be6de27395de4923c7bda2e2fd424",9.317957166392093],[6626,"e7dcd8e3b18dd63b25ca008b829c05762c9de42c2532bc60bdffd57727387cd4",9.317957166392093],[7801,"fec9c3f12f00dc90c056e4293f0f6f11f7680949016f5b56206faff73f6bcacc",9.917710196779964],[10339,"80ccebceb722028662709fc33bea8a69c3f0aee1c8f1f7252181322bb06515bc",9.917710196779964],[4,"93282b44e9f6075a5129afa1b15adc11df5d57420de59d2c2af59c7280d2fbff",9.917710196779964],[2003,"eb71879f5506b77b047d7a109d23923c722bcbd4eedc27774fc7b9321e6d03f3",9.317957166392093],[16205,"632826b9db47168a0ee764a6a62d1a88c49cdfb29d8b2d70c7816a564607d463",9.647446457990116],[854,"7854398bdd0347b35d12bfcbb6572f00eec8c8d79d01f110fe1cdffc29ac31fa",9.917710196779964],[12963,"901556d2532ddb9e5caab4389492fc00507a025e70f9f0fda1e7a8c6ed83caaa",9.917710196779964],[13346,"3712b6798000cdbc723d0e5195e2621e3e35d955a5729918e88b1e3cc04597a3",9.317957166392093],[4865,"818d42883df38680ff4656d971268fe004d6ee6594a4342dde481328ae8f07e0",9.317957166392093],[3770,"ac92f7cb8c5798ba46954e9e816acd5a1fcd9c9554ba38b9097de598986426e7",9.917710196779964],[15216,"c59c9ce2fc3bbba9a780cf7cb804d58f1d86f2e3f3407745df6f4b1dc4682b7a",22.83553875236295],[6856,"68518cc2b04630e76f45e15f93d626209bf2cde08bea8790c6e254ee1cadf3d2",9.917710196779964],[9655,"eb559d237e40cddb24c8bd24f1a92a5d8db94d54f7152f50e2f069510c9dadc0",9.917710196779964],[15214,"3406846cac38536337f51af78e1ca01147a6ad310c6d8b55cadce8b0b542357a",9.317957166392093],[19063,"f04683f93e7e70fac29554d621cad9a4861f1343c6ee58f031365bdb0b9b311e",9.647446457990116],[844,"bf3c399945ee406b82ad082f97d98138ecde908a51b2345c83f300b1999b44fa",9.917710196779964],[13179,"04fd3ec9f64d42f5d24e6ca12a176f1f80922e28cd216156098f55be560667a7",9.647446457990116],[825,"9e0e979c2fb9e610d9f57db051d6606c04c2d32574ede8da88d6514aca985dfa",9.317957166392093],[18749,"e4bb97282b36454469821fd21ada24e6eb06fe501f281dd9caca4d257313a528",9.647446457990116],[13617,"5ebdfe9f4c02296e11384e4face195b6b5ed2b9e704daf82851e8c84efce019d",9.317957166392093],[14401,"811ea2f98782523a36d2f8b4bfc67013c0bdec7f760f1813b1549404ddbe388b",9.317957166392093],[16739,"911d045eadc7e7dedcd44c30ba779f887e62b4f9d7ca11f3abaef0d7696d9957",10.052724077328646],[17675,"7f953f7a6871e2b8dd2c2f23f04b82589b830c00d2b40f0634c9397e52c2a843",9.317957166392093],[17218,"b9ad201cb0728c5cf9de01c855d1472ed603d40fb5e9080df4f0cb3d1fc88c4d",9.317957166392093],[12807,"4b18f84b69ea4eccdfa077263521440e33bf36d2229558bb569b678c4288e1ab",9.317957166392093],[10000,"60552c9422e00fc2a3200ab84b5eab4ab4d3b3d9b143f3594ca29d6da4c853be",9.917710196779964],[15400,"1484ca74798b56a67c3eb4274f3aaafa21539a8bee5c9ea8f0601c67544d4a76",10.052724077328646],[1933,"940f73ad6402696c5f11238d882d8b3fc845769312572440dd827181e9c775f3",9.917710196779964],[2296,"a65730adce961da41b4b75d42301e2c79fd879af75d71bb34cb8b7603c7208f1",9.917710196779964],[12753,"2bb0db88a65afb42da16d2269351f1c009b4743f0b78f0d1d0255cd9fe9d37ac",9.317957166392093],[13317,"28d79c1acd3aff3fa8657ff2a411b9cefe40924f7a5bb67036c2b2341bff48a4",9.317957166392093],[3709,"b03f3f307658963a4e8ea36a7b0c4792ff86a45406d8aaf26ec46a01343788e7",9.917710196779964],[5167,"e72070c5d8f8918eda7f90ba17487a54289080340d860cfdfc1578ba7b512bde",9.917710196779964],[19757,"ae54d0e33b648fe9ce0a4a6e82299eab68d16079adda623bf8f02d7f61634b04",27.144385026737968],[4498,"8d2b54f73e969120300f8a03c6d47512d31425b85f877f23f63f8841d9126ce2",9.917710196779964],[6377,"cf4877affacfee4e03e9eba3a0831604c332c1a83298a33aab0e21dd68ce74d6",9.917710196779964],[523,"732f4dd719019cdf9c56d210ae321f2e7313f92d02fb7a4c2dfd2682d7b780fc",9.317957166392093],[9370,"bd2d7aedf69ea1cd289065be6929c780f2d0a3b1cfb92cb6527464e61ac868c2",9.917710196779964],[4260,"af822c43353e9a511dc947103660ff7fab364fe4870090e51da1c8ce2c0908e4",9.917710196779964],[15946,"429a36f321c4ac12f0afdf948cd26f07fefba966b011500ce294310aee11056a",17.027642276422764],[18401,"25b93d7f6da316e9456a5238ef73e100b6f7b627ccf08f010e104b249d576633",9.317957166392093],[6880,"1afb90cb7971f3807a94891b4e93e732718c712cfbbb2473247062e368e3bad2",9.917710196779964],[18609,"07882878d4373d95874d023e093813732a59e65a1bec07caf7ce38f5e67b5b2e",9.647446457990116],[16014,"f3d514d788affaa56474696f4f038bf76ed349bb0f4f4080476967c9dd642768",9.317957166392093],[15477,"e74ba621bcc7cdc1122c126d5edc364faa4eefe85150e876fbaf14413b688674",9.317957166392093],[450,"64dc4a7770d4fe33736d501bffaa402ea3a9be41a39f1ddb5654c56961e711fd",9.647446457990116],[17088,"6262ea2b329f45423b08892ea8e36a8538383f60b9081c9367fa41eff0e91f50",9.317957166392093],[3607,"ae70641e2f37c583904d76ca27c15accf07596c97817135889a3ebb758532ce8",9.917710196779964],[5742,"81fe94dab514bb89b8ee89b1a4e5938fd78f0bf5bd11be59c552859ac08ed1da",10.052724077328646],[17292,"8d8aff675f9f01e9f8c5e5879c948392601114e00f423e271a4948034f81604c",9.397642257991386],[17884,"c0b87e2f68e7b46876eff84ff769f764d8d914e6f04eb17fecbb52dfc45d933f",9.317957166392093],[1902,"f6c8448578726f2b9a55eefc5e166c9f9f6faec2c3d0c09ef2f6e780eb459bf3",9.917710196779964],[10583,"72a9df2cb91afaf2e47f8e9b2c9fa1f7a24ec6708f1378a3a4b5b6693733bbba",9.317957166392093],[10196,"a9000cd74d6af002b0c762747fe6285282c85681b2d1e0dc9523acc31a1807bd",9.917710196779964],[5091,"6666aab9f3321faffd2de436dc52a07995a693fb9d7f1a094041c7332fc0a2de",20.02911208151383],[10916,"192d98e2b2ffbe7a68e8b424ba2ca24050800faaf6496002129ba316449096b8",9.317957166392093],[10152,"530a1de13d7f836da45da977d416db0364ab3e386b2f17804b84b71abfbb62bd",9.917710196779964],[3686,"e652217b869d4a4750835bad1f1d1f711d12522a9298dcc450b5281402c7b2e7",9.917710196779964],[17452,"e9e0a52d368a85185012f75bb6eb09fa7644edff212f74944bd53fcfc66aa748",9.317957166392093],[14073,"8c4c40f3315b0b0458bba0d2b182b6ddc3a2237f6234376ac8daaa0caac32393",9.317957166392093],[6324,"a8ad3511f0ffe9a9d565ea8ebc1d0714365f0a1f98f3fd9b152bb6d89c6bd2d6",9.917710196779964],[19825,"080589920bec25a72802e5c12fdd2e6935e0555e25301cd8a14087b0563fbf01",10.052724077328646],[2809,"57fe7fc6e9ec23ee690e93081617bec89f51dfde548b74388a262fe65a409aed",9.317957166392093],[674,"7a2b20fc91c3114b151d9f0d9a3ba628fe18049a4ee8f6ab5c0efbbd74f966fb",9.917710196779964],[7403,"e00c0b45aa0b790f938723d7530fbb2ebaef2075d0cdf956c90e6c4a632667cf",9.917710196779964],[3256,"d75247d723beab2ba53d7089fd7e8728b81c82a1acb532aae3c1e20db5e4a2ea",9.917710196779964],[18601,"bb0827be7064d4b2d9175c70a559c57a416dba3549d439be23804abe3e21a92e",9.317957166392093],[18297,"e2f63aa61aa68b0bc4d9785f8ddce768cb845328c84d0bf1c687274fdf61df35",9.317957166392093],[6498,"f128deda456cdf06c39711bfe2cf02f5fc89d1794b6393ecc3487851a3d879d5",9.917710196779964],[4814,"0fe535d6bcfaf704448ddb2ffec596189e230c236ac8117e95b864fd3f3155e0",9.917710196779964],[12159,"000dd7b6ffa3893453ffc6b60ca01204ab3c9f800d0659db90ef243460bf4ab0",9.317957166392093],[18541,"bfa4ac2e00c7e5a4313a3e482a4255f350cfddcf02c07e22555326313d289630",9.647446457990116],[4844,"557acf7a3faca02a11998c239c3df8a1376aab86c5f938a93720bd42b0612ae0",9.917710196779964],[1521,"53632f4e9047ef123e253c4134ee37473efa3264444736b168f6a559296cf9f5",9.917710196779964],[7440,"0d850c7172a2eb682e1ff441a8beece294c73861904b65407b587b71137c24cf",9.317957166392093],[5020,"c799c84b6dcca40d2634e7a534165994fc0f3d257bb3f447a77adb80d9a40bdf",9.917710196779964],[16117,"e80ba4f4eec26f675f0063e19874f3819a3bd7732c9e5d870f928b9b73f4a265",9.317957166392093],[17706,"48d54f379d79e44a321bcc59c159b5aed1f83bc32e01ab5b5576eb8012c81c43",9.647446457990116],[5232,"fc4f95723986edfc56f3967413fb3bd9536a048d5e4ed5635fd174fb1714ccdd",9.917710196779964],[19855,"380ebde92db6dfe2ac4ff5b8a0b68d87294a1916e0f5929fafe7dbacdcda8f00",50.01562988433886],[11644,"43dcb7a4d73c60f479266c535ee21ac060ecfa89f5f2413bf388a3948d66a4b3",9.917710196779964],[19090,"07711e082602a1c7ac90a94acd69b0fa8d463b0be8c862cee949ec1b977a0e1d",9.317957166392093],[896,"05f55985b2cb7ea61c492ba266ff10cdd7ef00a4d858be6e162c78550675f2f9",9.917710196779964],[8754,"a57e564cce2bf5fb386eddf693dd8e67aebba3ef1b22a7148450135fc09954c6",9.317957166392093],[5175,"63c5946f1923fa49f0590b3e021c3fb0a8381d0710cd658e5374455ab36f1fde",9.917710196779964],[16171,"6cb9290e3ec82f9f6f4fb5dc22b9473a0170cc26d4e25e2ea4ed8e67cdac8764",9.317957166392093],[12473,"c3a23370ddf81624d0bc67532e06326a43ec858089d4fe0963bb1241bbd01fae",9.917710196779964],[17271,"efd03105cd0573ba0a8a2fa6dee328930184eed3631ccb0899a030b20e88bf4c",9.317957166392093],[8794,"f2c33473bf0b28a624cd1f21501e499d5742338199bc267e76e3f4ed739d18c6",10.052724077328646],[14451,"a751c02be232f90929355c59f1d8dccc783ab892dbeb4f2b12431edd8053318a",9.317957166392093],[4255,"5525228ea7be64cb5ac9f1c45f976adecc1dcef0cb786a1b1d9e3229d05018e4",9.917710196779964],[3152,"7ca59e68f11fcbded6e6e0b68f954867b9ff59e79f928f25d0f361538cc655eb",9.917710196779964],[16447,"bc1f7adfd1e19e62b182e4f8af4b0eacf0c69dd4ab5e72905c1a50895d3d475e",9.317957166392093],[13537,"cf4a4c4611d56a9c481ed2567afed91be50d86eb13bf9be1cccd2b9b288e0c9f",9.317957166392093],[19443,"32c1ce5bcd2b27f9461458d058f0a4069666bdc98995a9be6cec9184613e0510",9.317957166392093],[9934,"5568b46c8ef136661dfbc90e9de8bed2dfcc2860fad232e0c61411e785b4c2be",9.317957166392093],[159,"08f7080380143f1facc7e23b3771ea834e4dbc1a4fc3cc5ad1b9437c8eb1eefe",9.917710196779964],[2219,"7d1aaddf29af07e0107fc8d2ceec0cb5d11ab6fba0ade5857f3de7ee36d663f1",9.917710196779964],[8785,"e639997f4a70b240510547b924b69cb932b01790bf876042288f036a42b42ac6",9.917710196779964],[12693,"4da26f036af85a31747463a4f770c9048492abb942cbcd48ddb965136feea0ac",9.317957166392093],[19072,"4e0c3a21f8bf82ee2bd84eff74ed3f9b18b3efbecbc305ff11a49d8dc95fc51d",9.317957166392093],[13287,"2de3a4c6626542b5252dbf2bfcc4518fcb05c6322b1c539904d4a4e0649ad0a4",28.187082405345212],[12187,"00c14651fe4af09704b5d9c591de44b7de96672da13392b60b3bc5411b9926b0",9.917710196779964],[18809,"91641cf75446e4635ccdd38339c37f353d4ffb321672fdfd174c1613d85e6326",9.317957166392093],[10378,"a1877ebf33b75e379cda515c59bc51b07ef321998f17ebea7ccc9764305aefbb",9.917710196779964],[14051,"cc74e8b33de6e9397a410048032899b8e0591d6a1d1b912ae8545734df14b393",20.060422960725077],[2737,"2c28878d82008ec4a3ae0fd30a3d9b9c64ed589d421ca235251f4759eb4f30ee",9.317957166392093],[17216,"e126fe1fcfdfa00e7e44cc68854f72fafab58226e2abf17820c4551d4718904d",9.647446457990116],[5454,"077bb05f01d2520932c09ea809c5be99129d696d129e11f8726d4fc2bc4a76dc",9.917710196779964],[19379,"c0490e71e36f0ec709b620bb1d8dd3079f2e9dc34b402e06af1137188f479d12",9.317957166392093],[13517,"7be4d555dfe10d562eaec65acab721d51b1fc115988a98200416bba17f6f6d9f",9.317957166392093],[9004,"cef4ad4e8b898918dc0912244ea83c9716adaecb2f060f3067d298959490c5c4",9.917710196779964],[11502,"928cd4ad7883c7bed0b74c17dac4081c1785dfc7f2738c54d0c399a062a37fb4",9.917710196779964],[16518,"8adcd2b61facba6430f7b47c564c16caadc610a83bca2c0f7661bb191f64e25c",9.317957166392093],[1979,"850817d389df6491924956d5e161936024d1b63329b0fafc6b1cbec250b822f3",9.917710196779964],[7570,"368a6960158e4d2df39e3484c98377ea4ec25a06c536a1f1b7ee221d16fd5fce",9.917710196779964],[12712,"e551db0a5d12dae700c164cb9eaed7e1303a8cfd0fd1f3c797f86536e3e884ac",9.917710196779964],[17323,"80567310df37f722da04220988c5fb86b3e8e7aaf7171145bcd5fc6e02d7744b",27.86634844868735],[1555,"b001201bc879be70202f2d945ebf8e7cfbc84bcb253499cf042561bbed45caf5",9.917710196779964],[6499,"17771c16f0bdf9acd537944d2c11114f0dd4cfd3676afc4581e0754ab6bc77d5",9.317957166392093],[12261,"8ba3b2bfbf26c9c2ecd0a8721bb3426d6016425615f34ef43120e370b0b2a0af",9.917710196779964],[6844,"db43d7027dc855b8da9bcc5c25830f323daa08760938744c3a31df339fcfffd2",9.317957166392093],[11519,"3a9fb66ae88cebd4b053202fcda9d35bf5ce3356d44ec943accf86a3e2d664b4",9.317957166392093],[70,"77dce29133684ee610616f157afae246e7bec5242cb515fb83ed4766770f89ff",9.917710196779964],[3802,"08252dfb605df9274faab16d0bb0ab01106d0d70bab745a64d593d27a69ef3e6",9.549738219895287],[11380,"446f4925bf349333034a886a273bc1154554e5ac15057996b6fb257ffc8783b5",9.317957166392093],[14556,"63f940fb1b097e2fcf662d4d0d3c37377071b59398851e18fbcf502385c2ef87",10.052724077328646],[4245,"8b028d31def94c69fb5b2be1ec9ab9273c1d412590a685f994c77f90dac824e4",9.917710196779964],[18814,"a9cfc6d10cb4063eaf4b647fac1eb372cfaa0ffebae8477160956aa8dc4e3a26",66.92913385826772],[4827,"aeb43f8b42d94c4deb0a30601720d688d0f37017b9cbbd7c772aad32f0053fe0",9.917710196779964],[7019,"52c66c0ec73c47727eef7fad510e5d3032ed9247068d0d9a9fb151e03194ded1",9.917710196779964],[10907,"67d9c58397f046e4ade0bb99009c69905edf9ce3fc2507d8e9eba32cfacca0b8",9.917710196779964],[8901,"aa9cf031f529a77cc074bab83728dd54736f8c223595e5c3dcf1a7632ba973c5",9.917710196779964],[5507,"73816b60960ac3de29334a0a965be5987897469beef4cfa6798ef2e44ae12adc",9.917710196779964],[9702,"5072c0bb31ef017fa6157cf70b6996d2c968b7d667cd140416aa9a8580725dc0",9.917710196779964],[7183,"4800ac3e8a20ccaf288708abf2a45c0dbbbd9793cf7ffaa8086e8b8712cacdd0",9.917710196779964],[7830,"e42d347652547042d89e2afcf43f34ddf9f1f62defea32dc1f0f904481cd96cc",9.917710196779964],[12351,"859d06b2b4160f348798d1e17697cb96dded65d8836c42ae77dff758df84e6ae",9.317957166392093],[16702,"a728fa24ca91c152029dabfb990c375462fa683e6566a9c25df9be14735b7558",9.317957166392093],[16273,"9d659ceb49de60da975c23ce96909ff6fcbca5f90a663dc91492d13ec5e3bb61",9.317957166392093],[11897,"a338b5d0fd524fe5c760c2dd08df8b0a47969c82be1e9ac10ee1d9638a9d0fb2",9.917710196779964],[12980,"094f1c1c07427bad3945f17be1c6c55a74e6d2a6a5928b703de4ffbb3b49baaa",9.317957166392093],[10961,"811e2fdda79fcb9af158c377e649a7d703ac03d71b2c02d08f470b559a8746b8",9.317957166392093],[11640,"fc3e3af67e6bab8032895a2d59b12bca264f45e59503e1319520cb71bb8faab3",19.058823529411764],[6715,"a820832427116d4b0fad2679273a618db2f42c1e8fa4a49f7542de538218d6d3",9.917710196779964],[13904,"340a627d8c5c231f090306e4413a5a8c538feaf8aa8920f4ae11f27c8f70ef96",9.317957166392093],[11431,"94ae762048569aed6044626237e0e4c340b6a16565aa5c6de9f9a0099e201bb5",9.917710196779964],[5808,"d023353ae422171ab2cdca2a5cb9dd842eb71c996624867b02954079e0a755da",9.917710196779964],[4588,"7872ed6b16aab00f19b29dba3ccce772a8fb50b18da42f130e827dd1aeadaae1",9.917710196779964],[16182,"5cc6ad36a81b5dd184d7d56c57f09e5dedf181ec7ba9aa17b92462de7f1c5664",9.317957166392093],[11043,"4e031285ccc4b419346dad4f2264c0cf81012182a4767721491a24cb29a9c1b7",9.917710196779964],[11208,"0797fdbfc6cb4ee054a23b3258c4ec772c366b1366bfdbdc4d97b447028ea2b6",9.317957166392093],[8423,"ce22a82cee6075cc3a8d7468e80582234487f1f00e401746cb0cdeeec8c479c8",9.317957166392093],[2909,"0adbaa1c510274ef35e08fd877a9c93609b897f8d967137687bfefd85c8c0ced",9.917710196779964],[14307,"b9935385c4359dc2883d5b5846eaaa2a725949819614ec0101a09a8fc1e46f8d",16.71269487750557],[14493,"2b74cf84de871941cd551a035818d9bab749b4c5295e88b1f7965d3d8faf6989",9.317957166392093],[16617,"d3422ae1c988d6daaa07b741404af8d4d7ffa0489a2463b28855f3d2abb5825a",9.317957166392093],[6815,"26bf3651fc833af683b5aec84f5aa585928b84cb9585b3e0bf7974aae26530d3",9.917710196779964],[7201,"59202ee274222d210f22bd2251646f644c5487d5ac06a674d1970a1246a0b6d0",9.917710196779964],[8939,"e145c8e4df0e1c3a0aa215e818e98923e705854f15c8a78265e50b369fba3ec5",9.917710196779964],[4211,"04c0b287bf489f82f17b47f1f97da2381da79b46e5c5cd6e776c0497cdf35de4",9.917710196779964],[4544,"a070f094dbe965e133d9f51e9ad9096ba51c6bf37f3250debea08337419812e2",9.917710196779964],[16662,"c1fcd2a1f442be8b8a57dcb5c3b40aa798e722d4d9c404ede095b9e1e00b7559",9.317957166392093],[19431,"fce3e13441b4b4f31f190cb26ff714da75c31f40230e7e34ce0de277fe2d7810",9.317957166392093],[18592,"0e5fc35092211406d8cbab21c986914981d95e0107bf6fc83a19300b7c9e0c2f",26.04580921218223],[11419,"41c0c4651393c46533a4959f9e3fe0845ab25ca2a3b6d946ecd21198f3ca3ab5",9.917710196779964],[14115,"fd9d671c1f1878c5cfca4aebaa450a8208bafdae68bc18c903c84a043a673892",9.317957166392093],[2803,"7b9ceba90dfec5a9fd5cf70a0eee01901d191a01d3d145df568bb0af4c20afed",9.917710196779964],[14990,"164ccbb8304526f31c30958715c9642e652d446273367cbea240154425a2b27e",9.317957166392093],[10327,"fec9d7ceff4488427191708d87da009bf8a74e9c190bd8f42935678edb012abc",9.917710196779964],[10342,"206e302648b5578e79bb94c6c0367995aac1951d96a76e8bf37695baacf113bc",9.917710196779964],[4213,"b6b9c35fc2cac90d5691348a91c58154dcfe35d6b608aa708d69d0d036ba5be4",9.317957166392093],[10594,"7cca13e64d0f3b1a30b0a22c85e70490a56637d8586b2974d6d8e80f5169aaba",15.003322259136212],[13797,"59f16657311287c4f9b7a07442a61b15bf182bda94ea0439572c2a0c8d067d99",9.317957166392093],[17811,"70e3b1444a08550a76a311e98da2383054f6f24c3b5940cd879285cfea120a41",9.317957166392093],[17468,"f4899cc58da061ad0ae0ae24ca8a4459eedb020a5ad16d8ab4708811d6cf5048",9.317957166392093],[11435,"c41b4f3eba6a63c3d7514812afbee4ece9c5a5b882f4a627dc3a5622509f0eb5",9.917710196779964],[19324,"53d9c4e33f03071a91fa0f67e191e3d0fa7790c7ca4294d4f88aaa9df65f4814",9.317957166392093],[17867,"b51f744bfc2565b8e39634a9db4f5f939dff0022548245a9243d29bf0b19d23f",9.317957166392093],[14919,"7ce69e5e34a26df621c263a43cb3704adf29688fc8f10cef7322532546a88e80",9.317957166392093],[3274,"54d1c0c9783b2bde7ceea6e94073ed5d57cf6469eba0acea715f69b336018fea",9.917710196779964],[7304,"5ed5f0be133a55d45d2ea1db1a5c19f638364a84936abf54fcc254369c440ad0",9.917710196779964],[16464,"a0cdbbb38723fa2f58d41595b3d64482f4dba529b42952fc488183ecdcc8f95d",9.317957166392093],[5464,"0ad88e75a817aa78e6b55d8872d4208499d6afdbb83be5caae74e61e7bdc6adc",9.317957166392093],[3125,"754ab2b7b05eae9dd2dbba7297aa904f0689899725e58e67127687b989c182eb",25.961605584642236],[19282,"4266c5504c1c7c7d7108da8012198c7bd5bc646d6041c92b626f7b9649786315",38.99651567944251],[8162,"3b38d8bcfbd38c7362f172ea3487a6932a455ed70a4961114b608af389b341ca",9.917710196779964],[1382,"7342a29960f5f19e568078cd32a9e176805d980c1053511fe97053a2f764ddf6",9.917710196779964],[10287,"9129d5287ee1aca56b21b7c5939257c5fde088425bf380746d2160a183ae75bc",9.317957166392093],[7188,"2473ba2b0f94b8932ed35326566fefdd7ce2cba062270f7353645ceb2595c8d0",9.317957166392093],[15868,"8acfe3df27a265ba7aa49d212ba9187f984de8dc6f40abc64193114b587bbb6b",9.317957166392093],[8681,"621dcf2e7d486a9e18914875a24d73170bc8406d3b8c0ab2dd338b24cefccec6",9.917710196779964],[12645,"784f155012c926c070617cb4c613c39dace8307f4f41608fa9b10fded7a8f3ac",9.917710196779964],[17874,"867e7f424025be5ab8e8e46e3ef2e088196e6f949a22ca7099f5a2556df3bb3f",9.317957166392093],[12677,"aefa899503bde398471e975be377f05007c03979f31beef2a84bad71d685bdac",9.917710196779964],[2254,"b1fd8b0365fd97272c235c13105bbc59144c028112887363207c0e87c1313af1",9.917710196779964],[5578,"a04fc47517311bfe6a69fddbb5760a24f1f944900f5c4bb7ebe8bb95ed6bbcdb",9.917710196779964],[15202,"fc690b289c11f96ce50a56941d8bb896a165299b132a876907d2e3eb3141837a",9.317957166392093],[1385,"1c106136a637c632d95a08c2d3f4766940f0294d714620d27f37bb411c8bd9f6",9.917710196779964],[15816,"bfaa4e32d71a4eaaf4d62312a3fdef447fb18311b4d426908533be042e76106d",14.188948306595366],[19697,"28d60a0bb8396b023a37a48c042b68b76893073701055abb2c09701c02a6ea06",10.052724077328646],[13820,"e430d0264cd272c3ade640054a630babcad9320a66495cdee72d6e1be5c61a99",9.317957166392093],[17828,"643c9c2406303457e3bf031c84ab25c08cf271adb8d745384b21da0c9eaeb440",9.317957166392093],[10698,"9d2c0c792db25d2beaa4381a18e6d2311d750e474bdd320226dd009f63a203ba",9.917710196779964],[456,"f2b72d950993b9b4d754ae24fdabbdf340f72ff384371f09976121d5a795fdfc",9.917710196779964],[18908,"e85ed984240f188b591fa81a4e6f839606d4016abb41e1ba888514f36cc01c23",9.317957166392093],[16011,"39612c57bcc0686f7e878f484fc45359ad38da5c0a26e316c4626d08ccb13368",10.052724077328646],[9454,"2e9a64d7e7df5428cbeaa9f8841873bb1da2b010187d482d40195602af48fec1",9.917710196779964],[14134,"38eab0ef7af3f1be6e3f2096216792727cde5237cafa70901799ec45036cce91",9.317957166392093],[9657,"0230df4b425ea76cca339809f83d6363b8d88b38ba0724808db539a77f92a9c0",9.917710196779964],[1731,"1cf778cde50e5948ff523a4f8e3ded1778f20627f5fec77a2cbb605512a5b8f4",9.917710196779964],[17338,"392dd40403e37643700a734fcef2333256f67e227371d77c085144d8c6e0274b",9.317957166392093],[3534,"50b555d9c4406da1481da0195b36c9c3b1ce77d223e16ec85c47293a5ce3bce8",9.917710196779964],[12334,"9bdf40ab07df8f24b39c607e2a501f8c780563c4213b14ad20a1a5c21ac001af",9.917710196779964],[11701,"0bf988f50956e644d6caf29e3075e1f2f0010f4809d6db2198e8f6bc31c44fb3",9.917710196779964],[6565,"6d0677a9202984c92b27b3ebab82403e09ee6a09ae47455c64ed290e356bedd4",9.917710196779964],[13369,"3c1b0fd7c5a4fc419420d3438de848ba01c36c5cc8d85b3fcd61c8872ddc17a3",20.05763688760807],[9034,"953666ea34684c535fb35e617fdcd7bdda4f01194467734e9c9166e7b54f90c4",9.917710196779964],[2612,"d55f0b45b5d575796fba469e553d48aec8a8d637d5a2349834180b2b299f13ef",9.917710196779964],[16826,"1a293fd76eaee1bd73f35a5f1e37dc30cb05f45dc1a8705353ed13b79367bf55",9.317957166392093],[9323,"e720dc2e88ed64cceae428447b2abb3bdc30439e28a37405e24f4890561ebfc2",9.917710196779964],[5640,"58640b579df467b3d8525177d2b8c0352db18631bae07a164fe7e2a12d6863db",9.917710196779964],[10291,"45b7d47fe6d0370948752c3808ff52e1d737f2ca6ba29d1c138e9c33ce8470bc",9.317957166392093],[2963,"1593f871d590c45a58ba69bb0f242dcb0e603c55a0060b372452e7d7f0198aec",9.917710196779964],[11515,"be5e546c5539494d09de641242ae09a62d97adea3cceb964045a18e192676cb4",9.317957166392093],[8911,"cafbb71ef08181dceccc78ba498d4d5afd4e34bb1e3d983a1c3e25ca4e9662c5",9.917710196779964],[13380,"0190f2c392b14837ff81b8c1d9c5d2ae9f241a37e3cff73b7cc916822d5bc1a2",9.317957166392093],[2250,"9666fc947063c9e6a8ce816ca71b81470c7e54c50b6b6912ce22c24745c23cf1",9.917710196779964],[15514,"39a28adcb9c90bf58c01e62d2e865d6acc2cd6bffda5faba7fc746506556cf73",10.052724077328646],[16547,"092b279db7a19e78a4ca7003c33bd162fa418062d2edaab54b0e0242e069115c",9.317957166392093],[8856,"751d467e5d97dc881ec985eeb2f264eb737efbf56a03347cfd3ba7c98978bdc5",9.917710196779964],[9630,"7013776c7fbe5583778b21665546b550ae2295a64206831122c7f5f99478d9c0",9.917710196779964],[1220,"412c0d57a13b971e7778a1942d3ede18ff8df4be8f4e9dc7ece6e5c3741de1f7",9.917710196779964],[3796,"1931a9ffc8cb248d820dcbd5cf22b2b50b898203bf0d8fc39e95de000f8dfce6",9.917710196779964],[9362,"8e6d21a9604f336fa3b99c7eda4f1e6c31e91c337f1e711f815c619cc69f7dc2",9.917710196779964],[9792,"dec9860d1173d8931af91b55f0810f572074d13e9a65247cd3b7d225356dbabf",9.917710196779964],[5292,"d862e7cf52052c1ac60ed4f092fb1b48da84efb137c651dc1364c8ecd00d73dd",9.917710196779964],[4712,"e3ace376021ea1985e7101f5139e3b6c2ef0fd181b438594d68f8ddba923f3e0",9.317957166392093],[15928,"6e2284d3a60d0a1d98afd744447bbdd029cb7531f4789fb1096870e2eb518a6a",9.317957166392093],[303,"eb610a880e562bfd56ef7a299b55fce9054b6e4b283788de73652a2b36ecf0fd",9.917710196779964],[5784,"b66fec13b390970c4b8cc5438268575eb9daa74e760a50228da9188fc8c788da",9.317957166392093],[2767,"f1baaabcb9a9f3466afdf84e5155ff7ab408f1b5ee92282af89abe68c8dcf9ed",9.917710196779964],[17690,"8b4009e97f28c992d12a9711523f583a5f3a9a2f561a3c84aa9e27f9c61f6643",39.78082191780822],[17869,"927fb9648c5af5f1eb892741a6750128c1c427a6cfcb28ab1aae64efb637ce3f",9.317957166392093],[9341,"d8edccb726c006623d70c9fafc06bc82c0b43010179678800403e2faa21fa3c2",9.317957166392093],[6044,"33c9b6d1ded500a21f8eff8f6c65b6bb1401807bb70412749d6b2f1fb068cad8",9.317957166392093],[1805,"f2cbde64078ad8aa0273857cb8357757c791d99130c4170ebce0e6ae603432f4",9.917710196779964],[19281,"56db4076ecaf4afbc0a13a0b597f9690b51ad04d5444158011a96d6210a37115",9.317957166392093],[14709,"5ec440008106d0dad8949b39ecaab86ad76f6799d3deec4ea689bd5bf136bb84",9.317957166392093],[6485,"0e4c837f60e90880663e4727c50f7e9981639c4c4f14393cd7b36a5dbd4194d5",9.917710196779964],[4874,"0924a897cd368674548c3f6de18136f80060289c8952c784ae31103b028d01e0",9.917710196779964],[11017,"5d7ebf7986f7c0b991d515723634ec04d6a1f36a737316f954da7808a688e5b7",9.317957166392093],[5049,"95449599e87ca11ede5ec523b09c902e4663b679bbb89ec15471a807f9dbddde",9.917710196779964],[9401,"5275a55110aedd4e6959cda7113661d84a56079026664dfd924ab41429cc45c2",9.917710196779964],[4675,"23e527272deebb1cf272716d1d1400eabb4d2c602af5b06cafba6e57e9f125e1",9.917710196779964],[17464,"e5ab72f13820b97e4708162999a2b3b500af2e0c72a6c90d41266b80d7ca8a48",9.317957166392093],[7947,"aff0a2aebcac46ef51f0cdbdd4bcec75b0cb543aa162e2206395f8be6b51e2cb",9.917710196779964],[1200,"b02edaf59618db522cd3c1a77b3e29b1764571b5f9d450ccc97184eeb6e202f8",9.917710196779964],[209,"82ce47cc523e4ece9088c84107a35bd1cf10c353078bc40f5b49906183228ffe",9.917710196779964],[17954,"f07cfbef89e36859b78bd0c8e7d0156f3c0d9457d57989b7d3384c24932f2f3e",9.317957166392093],[3991,"24b15c52b12866ee76bc4e57eb1a2eebc202859407e16755c3c01df5b610c5e5",9.917710196779964],[19525,"dd973fd3efcc02f52cda74a21be6efd339f0fdcec175fb25b71693567d0ca70d",9.647446457990116],[9093,"68b7b82923059f40e3481597f7f75beadc79337add876f4c9ab7033868a334c4",9.917710196779964],[18057,"181a4e3e63476e2779f351c37fcf63076db6b1ed3c2d399283897028d3ca113c",39.78082191780822],[19402,"0ba1d145571754a9928b18ef77dc268c92ddbf22c0d5b892f7fee5f387e37711",9.317957166392093],[2343,"255dd89516c6c39c3f4a17c142e70ccbb067f57988add162f8e9f66d17f6c5f0",9.917710196779964],[16497,"69b5e38d0ccb674b00459c69e85b0eba9bd2e5c91ee43a5a0268fb48772c4d5d",9.647446457990116],[11479,"8b3880efd046a26148fea77aceb96d359059d1877ba803f0c773af0e51eaa8b4",9.917710196779964],[13199,"6c468b872406cdc738b8231682df1d503086cb0c217d64aeaea4fc7912c2eaa6",9.317957166392093],[15624,"6370c53aeba1f5cbc01ba7ad490874518bed561fba37b9000ad3175cddf4d570",9.317957166392093],[4254,"a46efc83058e7c36ef93436fdd42dcad6769b84ec3310ef968e77389e68219e4",9.317957166392093],[3386,"7cb424597ee2402a568e473abddbfac7ddee51b6a367723c4922b729f127cfe9",9.917710196779964],[659,"7105662c06a4d693f53bf52d2bdc96d6cd55407cb27b42b43b339415786786fb",9.917710196779964],[8501,"99b0e50e63d8502afae0d6c7f352c3b26033672b26d425937ceab1433e7804c8",9.917710196779964],[17641,"57977ac42c83964003141398a387735a472a0858dae0301a4244de28b62a5f44",10.02309468822171],[8542,"d4c473ee9d7adafd9add6adad99725b52b9089cd4f1fddc6640dc6e5ab25c6c7",9.917710196779964],[8987,"4079901eea1f29049aed9dc569c9caebf310b05ac471ea00b81d8ee37117d9c4",50.22156573116691],[8829,"f96ae2ac396ffaa0ba84e9163a8546172ce21730e3c3a32ada876992dc51ecc5",9.917710196779964],[19075,"e9a637ccfff7bda9899200ee3c748f7a4a0a0c3a9a75fac3894939647596c31d",9.317957166392093],[11361,"4312486fc328bf9f0ddcad071e845d9f08ee7661276533a29131385624c09bb5",9.317957166392093],[12968,"709c30ebe4a0459b81ccf0e7967636ecc0435f27f622eb4092131ea7657fc7aa",9.917710196779964],[6094,"34d4b87e8a725d51aac8fe9d363ebdd56e7fbdc068893c6612f1673a14d66fd8",9.317957166392093],[7628,"aaabf977d68a54e43bba0e886119866db8c04093de2cad000dbaf0afd9940dce",9.917710196779964],[10253,"f04de96515c5094aa2f7ebbafa1a615500337ed65822c305988eaadd3493adbc",9.917710196779964],[2007,"3a68ccbb4aabd7bd2fb4d5b36251f461051c22d34144be75da80a165e6dffbf2",9.917710196779964],[10987,"17f9489c45c310a489b67b70d13c84adc1388fdda6f3c1988bcc6a08eada12b8",9.317957166392093],[14169,"f2c7c3e7b38e229e64969ac50d520f93fce88c736675d0522fae6483f5471091",9.317957166392093],[14267,"a73ef972a48dfba1ad6c79e821eaeeb1df76481d29588d092383c135b2bd9a8e",9.317957166392093],[4928,"de18c03eecd02efa8e03e47de05f8e8393b7eff06b3d8fb722318335fc83aadf",9.917710196779964],[466,"2b5bc9f033fd262655201f09be47c22930a637bbddac2fd841357cd87851e0fc",25],[13155,"0df0b3a5e6ca08460d99371fd93cd6b55b16dae5f4eb42cddd5a18ea2d39dea7",9.317957166392093],[10527,"5c77984eba5ef6fee5d610f1cb0467833c51a1798c70e74bf28b3d0d921701bb",9.917710196779964],[15298,"d052563111c304c2bfea33d2bf2e80eef8058c3b8298fdd33e2734a1e73a8f78",9.317957166392093],[17881,"ab0de0f16172f1da4964e05dc7280257dac9d203b36ceefc7298fa4d0ce6a83f",9.317957166392093],[13466,"57cbcf4b4e428316504af8a5be35a5a0e5a502cb0fbdca671678ae40fb6ebba0",9.317957166392093],[7920,"fb1ccac64615d6ea6b427648bb2da672801b96a36805cc75caa349a54b0618cc",9.917710196779964],[10304,"9c5da31d2e9682a73cacb5abbd8064d40461b88ecd384be0ebdda718789155bc",9.917710196779964],[15156,"a55510ec38a02daade94751adc7d4067fcbea91e0732256c6b161fa182515a7b",9.317957166392093],[11898,"c0ea78d7ade4745cff4a5b7cb07d1adeeeed7546ea2cb053b02c2002ba5a0eb2",9.917710196779964],[2377,"d784b59cfb429f905c787ccf259817b4e0e2ba7bcf5339b3624d80001c009af0",9.917710196779964],[18917,"d42e172eb94629d2b95b6762da9439fe3fd062f11dd6283cd91e14efac71dd22",9.647446457990116],[5508,"a15dea67aa86fdeaa40c320d33c7bed0bb5e9502b22a19f2686c8a633d662adc",9.647446457990116],[13347,"2e75da4f87185c0ca74acf7db4f521c4495a85e09438a8b07c7f3592ce5490a3",9.317957166392093],[6012,"9c64bee51a59ed3b17c0d61570a3e1a7e73f94efc7a37d1cba547e7b63dcfed8",9.317957166392093],[8886,"6f64cae80c23e6ed15a6ec969ec51f6eeda7ba7674aa40db29c98255fbec88c5",9.917710196779964],[12327,"4c88480cfe8846b6abb65d8027dd25f202e3aeea7ea84af4a6674dde6b2d0daf",9.917710196779964],[3889,"28bff4d0dfe85157b4c55e47d79053701eea6b0ef36a30b1655a2bb5db7168e6",9.317957166392093],[3860,"50f29cd840a26ca11760ce0ef64054afe064d25580cabf09c172437dbd609ce6",16.05693950177936],[6615,"ae60f2c52682e6879770a05b64068388c694f0ff6cb3010c15edc450387589d4",9.647446457990116],[589,"9ba320f8bc45060733aa830cdfca077297685783a49c69aa1bc80b4c8ceff8fb",10.052724077328646],[2913,"4c2db998c9612c271f703136dd2800c0a306495cec57b4a0e1c265d36df8fcec",9.317957166392093],[3314,"214449f34454ce280e582512485989d9bc9b514808bf8e80529123d5c8d448ea",9.917710196779964],[16995,"be7bc5cf76cc051921e47d7814e4290ca0e323f444e2069c71861110633b2152",9.317957166392093],[17851,"bc937358d89a4727c987623a2f7f3d3eb2c793917f1ae284385ef7ec87073340",9.317957166392093],[5683,"67f8c7cb03270c14cd1d1236fafeea881d76eb0c1e3d2a6decb26016271d26db",9.917710196779964],[17862,"c245f13028b7132fbc880e494a82bd259e1af715c7c8933cca180d905b79f33f",9.317957166392093],[15966,"6d968e8568fca6c989ad874480034b112b2a54d1d640d484b01ac2e336cb7269",9.647446457990116],[12709,"dd619bb709a148fa0688d027ef128fcad9b51b87bc0b687ba79211fa0ad08bac",9.317957166392093],[18020,"fdce6486d5f9c8b0a7b52995dc796f63a6386d389372f253496a656a13cadd3c",9.317957166392093],[6943,"9fd3ad7d520074696e339d76a188fb5d6d545caf2416e1c1fad157e0a20756d2",9.917710196779964],[18836,"7fdcc53321e71a344c5d2b4151a8b565d4598523733a04cef94f9be42a7b8425",9.317957166392093],[9995,"21335c54dee183fe4d7b721d11e368efcc62a968b092f67172c3212942015ebe",9.317957166392093],[19417,"5e3f0ad1a548d01f20953902cff1ed0fda869055da93b781cfa3fe939c87e410",19.14044512663085],[5102,"1934507e45e0c5d07256594b4f68beefc8d070502ca2b647f91d71ee57af90de",9.917710196779964],[13601,"8bd2bd8b96b4b1b3ffc3e6925fe3b54639ef43e6ef0aa992fa7ecaa011c7679d",9.349282296650717],[6193,"f6066c71c5741d10feab52bf2158778afcabc66001f17d847a183a34f72ad4d7",9.917710196779964],[19109,"6a152f1f15af936207e2e46eda01164767d2a90e28817d4572588ada0a27e51b",9.317957166392093],[8234,"888ab935e3f8b99f4d1de6717d32d6f692dbdd5f9247ed4d26dac69d4e66bac9",9.917710196779964],[19809,"b3df9c417d85adb7bc58049436a2bc350496aa9d4e2663c42dec9c62ce345002",9.647446457990116],[12773,"341ead1a184f4f2c351ac0af4aea1552ec95326cd2e2a16d6af97d5535ee17ac",9.647446457990116],[923,"a19f935f8f1c0042d8a000d4b9ebd4f4ef4c79ffd14abc7cc9b5c1ee0f6eabf9",9.917710196779964],[6607,"1a3f655317a3ef4434c91b74758c20f9687ed12fa3c2885f50578da4ba5f9bd4",19.104712041884817],[11832,"ea5bbc097cbcbbfbffaf5f44f047c48627cfa8d82d7144ee5c543515e98c85b2",9.917710196779964],[14346,"3f614109bc24839fe27978123d2dd9f33c4180d1b03e16d56544ebe7deff688c",19.369781847562617],[13005,"a0002c20f1b4dc8df05cfdcf89bda23f9bbff6d44dd86adb34f3e502b6d590aa",18.130434782608695],[556,"4ffe1090e838222363ce55d508e24482e909b94e5cd5816981f54712ce013dfc",9.317957166392093],[5213,"443ed1cf19ba873da59aee26a91bb4a15095871ad2988ed02d5471019523e9dd",9.317957166392093],[3848,"a7bcaa15b6e1255403ccebcd8ea0502e53e6aaa4bdb482d60900d315e2e9bae6",9.917710196779964],[10473,"843de8aa887fde9499f27f673c8c8af64ea5394efd180755a7d86aa5000c4dbb",9.556547619047619],[17387,"efea3a5ae617b6e9bb3875e0c0a222baed80e7e57c018a41376e4ac1a53afe49",9.317957166392093],[9786,"9ee98ff4338ed745dcfb233d2465e865f524831589fbdfad13ff1aa1b4fbc0bf",9.747538048343777],[2906,"70212cde0e4029511e993a6782779b0a25e834a249c1391764463baf569d12ed",9.917710196779964],[15612,"ca392740224fc433e5360e857b33bb12f89c1345b3d7ec42cd82255742c11b71",9.317957166392093],[11099,"9feb2aae7405a5e933b202636aebbd2eae0ababb597fcf33f467bf1b984241b7",9.917710196779964],[3067,"10481e68232b86f19cf928de3b4a03d01b7123d2cfe1447f1b46bbd591e9e0eb",9.317957166392093],[16100,"e852666cb12299212de35a0c5645a3d3b035d162c053fdcf6601367dff8d2666",19.066666666666666],[16632,"26e7214b1e2e6c22e946b86babf1ea773dcfb99bdb918181faac000cda5c255a",25],[8437,"aeb1aba98aad26710984a51af4fb2c73e83f4a3eaba7a5763b14af5811b569c8",9.917710196779964],[5190,"cecfdf332b5ab6a33624d8fb9fb0648a4eb4ae1f6ab23424ea40015ade600bde",9.917710196779964],[9054,"0e2815ecbc59f629927e90c9121a745de07e235837d8e3a415cb37bdde046ec4",9.917710196779964],[7645,"079e2e77b9659c2a41f34ee5a72293f9b819186e1497eb71b98716166104ebcd",9.317957166392093],[10132,"960ff132b1c1ce9a23b33a27a0621cda01726aa2fe89dec41b799e9dc39f7ebd",9.917710196779964],[7860,"07adea752d0eefa3b11fe96f93a773eb8afb4118c4aa4faf0cb82a8a11687acc",9.317957166392093],[16081,"da2b041a0d4a74b4c70c4de058d9b4343311ed32a733f85fd5637a4a0b82b066",9.317957166392093],[13136,"71acec90dee1ddf6ba3e0092dec79589f97399b3ddfd14de3303df1c14873ca8",9.317957166392093],[13804,"2b35981a0f7594a839b961a8ce586bd8f43bc98bb2564dd2b2523a8687be4a99",9.317957166392093],[8909,"0461117ba173756b8feceea12817fc95ca9bdf59e51128e2ecd9eae94bcd64c5",9.917710196779964],[14557,"2372c86fd48798dd9c337f2a0c361cd890c727061d7d0775fa5d5fe5cac5ec87",9.317957166392093],[13643,"eb2e749f7486df03779304ca62bb356182703e94f43fa2fe8e3e050374e55b9c",9.317957166392093],[17975,"5af7446200291b90b33ac4661982e17f7d4f8c874191279b21b70176ec50b73d",9.317957166392093],[7049,"b6595342ca14a84cd5addc75cbbb0e0e365f2ae5b0a7a5e09b035ecb8012afd1",9.917710196779964],[9619,"ff73ae36b11e9c355c395811dac1f3538e086e63545ea975c8d5186fe353eac0",9.917710196779964],[15509,"0122a175c1623054ebc1ba8c9cc04210124ae867cd9707a2a51a1b7ad8d1ed73",15.072463768115941],[15187,"7ea6534fd121d92812944af01ede4914815249f8106de1c2f21e74e95e98c47a",10.028818443804035],[7984,"f681d9f982ef1e8f053ca0be4e885408933b5e4b3d899cffde1c7980be419dcb",9.917710196779964],[15473,"56d55800130210572f16026a528928372f9a0ed2d24e615080c7ea225abca474",9.317957166392093],[4283,"27b751d16aa464c4098ee9fc59b7af853ab78e078e2045c156806b29ae3de2e3",9.917710196779964],[13426,"fffeabcebc451e7ba08326a2faf0005905fbc8e9f180164f913089d52a49e2a1",25],[17257,"7c5ce0ce5467a7798e526e0779d0f760ae10d3f33f4e93f09b569e5458c5ee4c",9.317957166392093],[3987,"8b15ba68cebd518090067f9fc25dcb23d6345b6f7658d78ca7598ec84923c9e5",9.917710196779964],[17926,"48f5e3aebfcceb58d33ce43baddb8bc60a3961129d2370d435c2b0f539d6bb3e",22.11764705882353],[13202,"abdede0f98af0500763946e7ea04f0f655cd85de1a96daf24eb3a137dadddba6",9.317957166392093],[7467,"ac821468820cbf438ff7a582da7029ea997bc30fd3320951a50c5b0011b6f1ce",9.917710196779964],[13201,"a21afa9a46b7081f58e1865f7eb4b2dccc61156790c228931742912ce6b6e2a6",9.317957166392093],[1375,"275e886d65c742b333fb94b14178362a4101135dc0a7d2a3bda87e96bb73e6f6",9.317957166392093],[615,"21596703a651815c08110d189abadc74052e96d82c3fb7b39b1b8dbefa17d2fb",9.917710196779964],[12673,"61b4f798266626bf8fd2595c6fbda1b85e0d18ade657d1640c5725c5454dc5ac",9.917710196779964],[3800,"842e9200fc1d9d1484f1b100744802ff723a668a7e2416b3a1dd67f15ab6f6e6",9.317957166392093],[17625,"94746e2352b125b935f86c355f240f568422d5a7ecc5ef0f880b2d2e01d1b144",19.167822468793343],[135,"9719ae9b7d40b26dca18aa1013e816649d5f8fb58c9a48701faff2fc391716ff",9.917710196779964],[12716,"db1be4ebcc857fd8b3ea159eedd253ed1603629195e24b63d5bb101902427eac",9.317957166392093],[14835,"bba5447daf2f640cdfeb091b80cffc70258cf37d626a138411710af137903482",9.317957166392093],[9854,"d88fa79ff9ec95ad06362dc3e711a1fe38ce61afedfb7193126b0b4da5a947bf",9.917710196779964],[446,"548ba92f527fe2bbedc372f71520b4ff07f73b2e83acfea76fc8878375d015fd",9.917710196779964],[16452,"51b6ef5f6ca563bc5579956d4ddc25695bd1bf11eb9f8b2ff423a51839ca335e",10.052724077328646],[8503,"404efd07cd8b88757e4de47916310818a0f3ef57c4a5727be12c2c69a330ffc7",9.317957166392093],[4497,"3d1d3c239d6c1f1a010b819c17a06a49e27b93a7a28e5c4e199ae1fc99336ce2",9.317957166392093],[7098,"51c3e828079902001d9270b2ce332eb1733851f45667268ff908c64b7d645cd1",9.317957166392093],[12363,"791f56e7e652451f134c7bcd08eb23c223240b6326759938286d0e6c0648d6ae",9.917710196779964],[4599,"2b637fe096de4297c5f91768a8dd53b0bdda0ed00fa2434db9b81bed017ca0e1",9.917710196779964],[6291,"32fef3c142a8de38916172ebed7fcd8ccbcd7c08b0977c3e6e2c06e417841cd7",9.917710196779964],[7564,"62640737901d1ec56134d6f753dbc290be1a6e8cf65a9f62347bc5a08fbc68ce",9.917710196779964],[10435,"99fc55d42a2473de8a5849f0286be55d4a62f27c93d70f2e8c85d169826694bb",9.917710196779964],[6091,"bd2f1e5a1046afe1b8f304a7c3f2e6aada1d9e107b597ac74ecd3a62142571d8",9.917710196779964],[10323,"e3dfae6ea0b3ce0f74cc2fdd78102ebc2ce0c098777a41d6f63c17eb0cc130bc",9.917710196779964],[19301,"18c74ec534bd7a79135ea529a7131260146add8d6feb94a2221e079e5f63f014",9.317957166392093],[13781,"ef1d1698876e0bd45ec67b899f22dca0b9956135fab574f2484252d1a47eb999",12.064171122994653],[14472,"692c1daa0749b1b72b59424bde4ee1224486e241996e19103c28fbb81ff7cc89",16.142857142857142],[15299,"7ae96a5baafb73d4c2d984e6e6610befb07a9acc75ee073e70e3a11e97527478",9.317957166392093],[370,"8669d86bfe0096cd9d5a788625688c5137eb94b36f113e332d9cb0f9db809afd",9.917710196779964],[6264,"81e10a093c2695931a23477d11447e1b99fa175be11c7e076fa1755c414b4cd7",9.917710196779964],[7027,"2965d2aa4881b1d487962026c3298182faaa4101c821ade43c7cb5c980e9d7d1",9.317957166392093],[15370,"e8a0261ae8c7197990ee4fe7b1129e1245861de47ee7fa49202d3621abbbef76",9.317957166392093],[16790,"961c47df54eac1d685b6a96800cb7bc7d17593ee1d9642e982323af4e4de9356",9.317957166392093],[81,"37ba6d9af8f3034ab53bce277b75810014a383157cdaa471e2d2f181b91d78ff",9.917710196779964],[12324,"1c07a26744f1b7697c66cd7025e53f16ce111f8f67452ff9491ec8fcf1fc10af",9.317957166392093],[14046,"63230d8d49948a39a0c96b0292f083461312088f88ed64fc31429bcfdadad193",17.16883116883117],[17563,"fdc58cbd9abfe97c70b69f610de36e8422ea04b18840287b5368158b36ee3e46",34.83778966131907],[12224,"0de8ab02bb9d6bfb9696b3fa9d82bdbccc52b4d75ce6e2d72517eaefae58e8af",9.317957166392093],[11237,"a1e7bfe63b4f333a645e550383669a2eb15d6d361adc8eee1e2ec1ec403272b6",9.917710196779964],[12891,"8bf9e31fde7525373b8082c0959b5088e183f29e0e48d35cf299ae49c35b57ab",9.917710196779964],[3520,"ee581391ba88ff1791b046e770ace404c4d1ad9ff50e53a4e3c9abe1a587dae8",9.917710196779964],[4223,"c84d162149da785ed46610b738a4a8fe6bb88815baaf8ce4d42f98c9290050e4",9.317957166392093],[5892,"8c14443936301380c47a63262e2ba7168248fbd18851a0f641d95b6a6545bed9",10.033847820200378],[10080,"288694a66ee3e351f29e05487d83914493e8abd9f80a4607adf400c36a2cd5bd",9.917710196779964],[3825,"86afb91ea1613595527fbba7c00250be599d5673f3493e56e87bc5ccdbcad9e6",9.317957166392093],[9622,"0db4121e7f0f23762094667bfd6d418673bdd6b6ae3350b0d46590bdc2aee3c0",9.917710196779964],[7861,"5349e1a5879eaa39571e122eb8aff9db785f1e3f514347b6ce71f53f7ce979cc",9.317957166392093],[18462,"1ef8d54e4af7e9ddc77c5c300083c98e88ef5d18a4344715a513887fd2866032",9.317957166392093],[2732,"badb92698971d0012ca757b40f251a6b472de73557217022ac59258f46cc37ee",9.917710196779964],[5738,"d5f24e635f15b84762b28568ec86ab29bff8190d8f709cbdc6cb1cabed48d6da",9.917710196779964],[6109,"c043313e901c0494ffab0a6c61e527ed46221d454ff55d556f6037ed654861d8",9.917710196779964],[10942,"8d7f9786c3590ff4efe0004b031db805a7947417a7891b733b955237d7596cb8",9.917710196779964],[14427,"28e9a1ad0b301bcdadaf703dabbe673ecbb155af28c444978d08ec9c99aab78a",9.317957166392093],[9909,"fb40b09a9dce859dc643b833d287e2328499aee2d4cc1a49208a742f6105e3be",9.317957166392093],[5940,"3be824fe7dcf4aa081c8e0a57e4996c2a6ef1e2b8e7bbc94fc3326d489ed72d9",9.917710196779964],[10367,"cdb21a8589a2611fef55df9518b4c8a64ba575e5de6c03567d540f23da66f6bb",9.317957166392093],[11853,"d04545198a98db7e0fc1ce9da2141707625e87e2b98edd4a2593f5ae89e756b2",21.804878048780488],[11979,"4de42fb8472cedb4323c333b199c91a33a8a1ee8e8ae8a39ebc64821a01770b1",9.917710196779964],[18832,"d5a201d925c273c82298ec437aa6014e9a00fd20df71602a8f5a808a424ca525",25.668449197860962],[3153,"835110efdfec4a8f852ada9d026464cd2f2dda59fca50c0a0d8e53b7eac155eb",9.317957166392093],[19166,"3f3698bcf8a5935b12bc662fcb9908a9c1c4efa48e9a6f886d5b3a706d4ce519",32.87894736842105],[18703,"3aa12e183bcbef0563531473410bea04784a937340e976e8620ec008ca71332a",15.054282267792521],[7881,"307be205a2d7f244bfcd56d5d245230fa7a3e597717d8f2fc2054dae031f65cc",9.917710196779964],[9613,"40c57ffadf78ce6ff95f6edf9b2d807e918e9197936b10bca2835ee4d37af5c0",9.917710196779964],[14814,"ffaf41e87f1e514eca3c3840b44b8e9a15ea42fa2eaedb5f50f1525c27177f82",9.317957166392093],[14762,"c96e6a27c5d9293462ec4b5ecae0eed1904249fceaf95374110bc9781c3dba83",9.317957166392093],[10205,"dea50f9df1e753fff6b9a8f081e394251fe5921b6a7816b61c7dd894a7e1efbc",9.917710196779964],[15313,"8f975fb84c72b753fe21c8d0966099f8e6fa090d10363f436ca5ad61833f0f78",9.317957166392093],[8259,"d43b4ef04a2aed1b39b26fe603b94c644e229de3a50aa1eb41b628d106829ac9",9.317957166392093],[12246,"1498b8f2c35ee86565fc0879873e9036fd8f32ed8aa2178e2381a5f29876b9af",9.317957166392093],[3858,"b4cdb0b9d88ab76ee6dcf494753ba36f9d6e309e0f3fb8de5a7229678a2c9fe6",9.317957166392093],[208,"e1cb334f37d3794ded4005f9a66db254840d6377a37494261c9ec0216f638ffe",9.317957166392093],[6480,"92a86648dcde85966a2882f4ea3b630a44f39919a4c7fcee97d1ab58e5329ad5",9.917710196779964],[15267,"c25f9a9dc6e061d42a7dcfc01a178646a6999cf342f01b54f9aee2ac6d830c79",9.317957166392093],[7245,"e3c13c9bb96a834070b6c1094de15f7958c02b05bec5016532674b452b336bd0",9.917710196779964],[2363,"0ca2e82703de11ca3610edccf52f7f84a95f9b3bc381a7e1a159610b1d04aef0",9.917710196779964],[19799,"fc8134b10f021651bbdebf44832aeadf49cb2a399614548d69057f31413e7e02",9.317957166392093],[352,"8e5dd11fef631c3adbc0e17a599d13f0143d2c947e5cfbfe6751037dbeedb6fd",9.917710196779964],[6769,"1deb4447749abd04e3a9bdcca74f4b90baebd88b21b386e0c213e70fabfe79d3",9.917710196779964],[5003,"b5f938fd7f0b017d8f311301c1ce12e305e7e6999c731f28a29c0c775ba226df",23.003533568904594],[13183,"03905f3a052e760f22a5789b83ca5aa8dcab22448884c54934788b8a578b5aa7",9.317957166392093],[8648,"e6da996e8143aaf5d666715a518a681ea1024b869fa059d2e86abf2af56810c7",9.917710196779964],[1758,"00a0b97200a1b8dd4e09c00af846a98fdd2e1d283b8a9d6c078e9f03b6fe8af4",9.917710196779964],[181,"04dceab01fdf6e7c2a06741ae6432f72ad34afe21ba214ae664c67d029c6cafe",9.917710196779964],[16811,"4044bd5e16d6ecb4eb66f3a38f18740fc60a3f14a7ca35b7a07968423ab80756",9.317957166392093],[913,"f4eb060c1ea319074d08b721341efebc2c4cec0fbc93d7833a4db5b8bbfabbf9",9.317957166392093],[11598,"a699753e45d9effc070632f82f281a8c9c9658ac2eceb07db33604b3ae02e8b3",9.917710196779964],[7173,"d81b2df94447738012f58c0240d9036e324822700f74f8f3594f605a0ee8dcd0",9.317957166392093],[13323,"9616e4df4bbe7d73bdff5c50528de9a46807ce073346bdac8a778f0f307e2fa4",9.647446457990116],[9698,"0fda56ba27942e9940f91ece5984e3d1cb0c6b276c9ecb0d32384156f43f68c0",9.917710196779964],[1372,"8ec2e14f4d286741d6f1d7d6341c28f4ca677252dd122d48f0f35d3d8bc9eaf6",9.317957166392093],[4131,"8296c8c4e61d2de648efa2e9ae31b3d8dcb8508ce2a63d70b7cde77ea9d6dce4",9.917710196779964],[688,"da5198b6ea868cc895cf2babfde331a09cae7d7ac44df43a82abb1b0946154fb",17],[1088,"6df14a740cfc22e6515194c4f6bb5a93f88f69f112112fc944007e525fe2a6f8",9.317957166392093],[14102,"c991ab3c2292ba151f7ce12893e58617dd9039320556ae16686e3b7572298b92",9.317957166392093],[12558,"67b9d5eea042008097cf8a868bf046ae9529b8f8a2ca90e62469d326f75d98ad",9.917710196779964],[12068,"c918606ab9145c9d232b6482dc4ff0424746a9c93c76f52221c7f2964a7be2b0",33.52815013404826],[14429,"81bf837be7ac3025c8b9f1deca9fd26749d2b9a69f38315d3cf0dc1b9df9b38a",37.23076923076923],[17854,"df258dab4183afa3aa2957a3535e2035c3c8cb6595e9f4b5ad4ba6792c952640",9.317957166392093],[1995,"91f054cdaa49dafd9a4beca14507500fef3cfb5deaadafe8ad4d584445b00df3",9.317957166392093],[1762,"31c464118ba5e87198a9fb087c307645150c9abdc702a32ace332954e8a487f4",9.647446457990116],[11243,"c9aa8c6732aa7e5f3b024a4db59de63d1a563d56ccf9b15e8860f6a4e24165b6",9.917710196779964],[14020,"68297e8c80d58cd4a9147bf94a3277b2ab5d3eeb447d02bd2c75603de24b6694",9.317957166392093],[1026,"a1e61fcce6fd6012a66b8e888bae1b119821358479504326e44db632ca8715f9",9.917710196779964],[2536,"4b458492d6847d8e08067cc90a5a5aa421244360d6df1200cf4face0b46e95ef",9.317957166392093],[4822,"1e4d16e36f46fa782db6c180d3f386bb168ce29b11ba6b01b99d20d19ceb4be0",9.917710196779964],[18072,"1832e347a54f36da3e78e4f17763ce9be5e352d268675d114d5185f3f11ead3b",17.70605187319885],[1444,"0f1a277dc638dbcc4272c8b812e49f95cdf2b571faeee3dd058f7025bf6589f6",9.917710196779964],[17610,"e930482d8138069424d01a10523b01dffc295f2a23bdff881e7445160e17f344",9.317957166392093],[6278,"2af7a0327fd8bff915fe7645f601ed021780ef721bb9086d4a89b8a433bf3ad7",9.917710196779964],[4222,"4aa2d5491c090788b306d5fcb68b843653025067e77ca5028b9507deb78250e4",9.317957166392093],[13500,"fee8034c04e1e1d557296de7f168150b8c568f608de330a8dcbba4d61bb3cc9f",17.136363636363637],[4441,"450d36768cb5256e2f1e2c67039d2c2939666142587dfd891f35fa1d4040d0e2",9.317957166392093],[5282,"637afc29b0224fef8559d9084637bf3816d0e2e19402022f39d8016265a285dd",9.317957166392093],[330,"e778d44e7b8758e7950f1240a867f039c4653184014a092b9d6416f4397cd4fd",9.917710196779964],[4296,"ace65fdeea07eb9b2d687f60486acdcb7942c6449a8a18254ad2242ed719cee3",9.917710196779964],[14289,"5ff7e9ecbde78152698fcc223e683603288fafebc148ad87ad049f06b713ed8d",9.317957166392093],[13624,"71d7f0ce4f62ffef7bcb3b2fb6036a96f61bd6286c8a5365c394a7b7dfaed99c",9.317957166392093],[18723,"3ce2a2d25095b955ef93215ffb62c8d0ec73a6d048e5688786063774364b9229",9.647446457990116],[17095,"060a78a79193bbcdfed5267e6c390f4734df4d18a56e7653668be48585910850",9.317957166392093],[16771,"c701f83fe9b9b9d6febac3e9dde3f15de62b436875d683a56928eefecab90057",9.317957166392093],[543,"ca1fbecaf423404cd4931dc105c4cfe80c2f8b48f3d30b91c509911af52d56fc",9.917710196779964],[1288,"455f4e9ff4bc8e85d3076a87a5e4d9f9a7a645803cc97872d17c6ebd3c1670f7",9.917710196779964],[1776,"a459bcd0bf453dec056964a0d468ac6a461926cc94c56972c5a73963a14668f4",9.317957166392093],[3836,"2bac4541c6b592eeed4db71c12ae898044a415489910a5f1c8b5b5f4f7b8cde6",9.917710196779964],[10092,"10e9a617d559c3de5d20d0119c141ad2713705b7ceff8a31732fe770820bc5bd",9.917710196779964],[1983,"f748aa3b0c1bc1e9f8e3d35e96ed3e957af6a2d74ca3ba6d5593407d298820f3",9.917710196779964],[17536,"c4fec4208f9ab4c338b72bbfdb29ff8d7cb8b0860b46d763938f45bbfac9ca46",9.317957166392093],[14174,"addf424e1e7cb67e7756f47fdf02dea8e547532d6a636d3c95cc32dcebddf190",9.317957166392093],[9790,"c4b95e56b98d3b1be6fbb77372ef6e2f888b3a233671b28d0288040445fdbdbf",9.317957166392093],[7986,"44b27caf2f1c8663444f52a781cc5869c0800be99e588b5e41e871c4e5ab98cb",9.917710196779964],[14040,"e421567a9b458093e5c1a9eff81d50ddc599fc8da98f169bf438f43b74b2d793",9.317957166392093],[11981,"89251c5008cc697f01b2f3ac716d5118c4d43685bd8039eaf402751ac39d6db1",9.917710196779964],[1492,"5b4fe52e158c2d4d2fe740b542121d637bc1f592cc2b088e8d4763a596c82ef6",9.917710196779964],[750,"5b70bd713196a1cab0c1760397691d00a2ee3ce46d9c5a9a3c674b36a8a7e4fa",9.317957166392093],[984,"d5bfc5159da90603df5c8a5d591f9086365850bfccb92160c6cfb23189fd4df9",9.317957166392093],[9366,"1242ded9adea30522c64ec8e60c52eee7dfb6653600bbc0d03a56f4b589c73c2",9.917710196779964],[17844,"3b12661d7ca521b05c2653b6b997bc389a68ed1043460c32a846b5d6691f6140",9.317957166392093],[3908,"990b21539aa01ee7df52446331057caca6e55e7919e5a329a7913118ac7350e6",9.917710196779964],[8216,"9f108a69bedb18a5aee7fe3e51937a9c6964b18bae1b7c9303b65a236b9cdbc9",9.917710196779964],[6571,"88bf4c2cf14604d84640a94125d1e66c9f5be13127fefa03daad910c936ee6d4",9.559418700301618],[13218,"6a49d7b7e59ac39c3e8f0287fb73e611f9ef561c770b8cc0346900c5834286a6",10.052724077328646],[15062,"f75ccef5cafb2b84cce2979a1f2e50f91bf39330b1b804dddf0a7a94bdfe557d",27.85053380782918],[18374,"fd04529c4f5b83a1283858e980e4cc8e877d63b2a557f7f099a11927b2c73434",9.317957166392093],[2025,"7f583bd822c8b89c43396591fd77c37fe02e9755b8acdace84c19bbe1188c9f2",9.917710196779964],[18213,"8a39e6651e44645132e5344eba623ef803bd33107dbe5daad388fa641588c537",9.317957166392093],[13958,"f621f2ac6e45e7aeeb6242d9a1981bf8104812c2770d2082909e875f6aa5d495",9.317957166392093],[2041,"591c7344e212514682e09206fae6e8d22823903492f357b0d507a9e086b2b4f2",9.317957166392093],[14685,"3c7d721752654f71e697e67827522636feafb2e42caa8bcac775a260b85f2985",19.217777777777776],[17040,"6fd385ca6fdfcd0f47be473bc0375f1ff0673ad25feebc8c04fd5dc3905e2e51",10.052724077328646],[1276,"1b45b27f90729e0e9617ee993853a8599e6ac433e5177a710b2bca6035ac85f7",9.917710196779964],[2977,"58a9e2e9407f8837ec9594d85cedfaaecb038bdcefc099ec7511f3cb5da46dec",9.917710196779964],[9512,"1f8356ff386c77de1308ef8309ecbf1712b2393f09f5525603c06e71a78f9dc1",9.917710196779964],[3019,"34049251f78910d1c1cca612ff5df2957b2324df9facd4523f3e45e432df21ec",9.317957166392093],[7963,"d86a61dd5ddfb94e85b2fa9fff7c435b668a911e5893591555dc18d8dca6d1cb",9.917710196779964],[6547,"72da57ff6d9e260fde786e91f70cc354ae9c7935d6659a6a739e0b1b30820bd5",9.917710196779964],[2746,"26e21e090f77857f3bf1ea88739d070decda31fc2e5713099f82daf1e96025ee",9.917710196779964],[10595,"7ce17b4e0192efaeeaca4c07dc9ef65f7cdae8c1bc4ee47f2a8566dbac18a9ba",9.917710196779964],[15531,"b6efac0974d28cf2a193325dfbdd78faa60345cfdfc237d608ab7da11aaf5973",9.317957166392093],[13062,"414d85eea50966ddb39218f9bddb87bca65ce5b448ec474db57e94b9691337aa",9.917710196779964],[9912,"b403d1bfe7b81ba486e1a37101463b5ea1c573628335251633b90576db89e1be",9.317957166392093],[13524,"753af2fdf9b7e5857839fcdcba1b8bab553848019dc66fffa9a77a3fa5614c9f",9.647446457990116],[1025,"45bc5cf1e9c41f4c4f1c98cf67ba02aa1cb483c0fee4fcc631f73c78234b16f9",9.317957166392093],[5796,"cefc933bedae7b0d0edd6a3e54e9c9fc246a63e9d4c73984a798bceb16aa75da",9.917710196779964],[5570,"b2493a13cb5c1cb2b85b2ebf61a7e90145bd6cc0e51c43b1e4b2a53083ddcddb",9.917710196779964],[942,"ba396b14b26fa85df1b7e9aaf1822b03e5623bb3393d66d76287d3152a0e89f9",9.917710196779964],[18251,"5e51b84b8b32c11069a39b88fcf819412d9efc7e29a3e2861307c9f38914ff36",9.317957166392093],[6233,"b3749d9c9504a220b5cbaf3318b92495af95fb1b6c5e4f581e173c0ba22b88d7",9.917710196779964],[3741,"6cf4d137ae8101a53bf780fc2b35c88e9cd1a5c850f61ce9717472256e314de7",9.917710196779964],[7483,"e0c6b4af288a5e4487558ef4741a52c3115f9ba6be02d842e1a7a4a141d5cfce",9.917710196779964],[8582,"6bbcb74c6110f3a0cc92040565c4ea502f0906f67a85e3499aae5cc06cbd8dc7",9.317957166392093],[15910,"243ebd6ed9716855d0b6b6dcbddcb5585379db3dff01bfce19419a5103a7d36a",9.317957166392093],[11455,"50e0ee8f3cd7c393ea85ddf716942419728139062cd66eff1be038d1b183e4b4",9.917710196779964],[5448,"656b6c878944bd2ded5c4224eec932cd93d4802846bca5296697604d2a047ddc",9.917710196779964],[18317,"483efcc6af574bb6fb10c3fbcef0b6db55af7e06ecfcf44b4e29f925234b8835",9.317957166392093],[12118,"2be8cacf71ff2d3c92d2f62ca5470d3ed77e3e9ba84a0f1107c20571bf90a1b0",9.917710196779964],[6549,"d619525073edfe219cbbb8dddd5fe6af7755fd3da57e4e006aa570c72e3806d5",9.917710196779964],[315,"cff23d536a20dddc54f56fdf2393e016f5451a819f5d14e181583943bf42e8fd",9.317957166392093],[11446,"7dc3857493bde996666da15f4025f1001e82c5f7275580cb26b39d3e4b74f9b4",9.917710196779964],[828,"fdfb4841bb971de09af306178e8c2dd42a03c8ab64e9b5c24445a83a24df59fa",9.317957166392093],[17733,"3f2c1e1ea6f1b6b4ccb329f158b3be2aaa3b5587aff074a05744ff8f53098f42",9.317957166392093],[17395,"733381788573800192f28936f2cfea6b082a53b871d88d7929af99ba2a9fdd49",9.317957166392093],[4270,"0660cb0c9a5c449e1e05e1b1c77451d16058aaef48f6b679b943fbb5b5dbf4e3",9.917710196779964],[2442,"f019cb9f9487f30c6dca011dba932ed7a2697deac50dcebcf6cc1cf8354e37f0",9.317957166392093],[17131,"1fc2037fb1727f93d2b44d90426c7ee1a71c21c066854234d69f687af5cf614f",10.030959752321982],[15235,"bdde8b9b97bf7637ec7fbebc4da1d03a8e10891382756318fb4639016a3cc979",9.317957166392093],[18922,"2bddae3a943109759cefdc839da17b13daa8602663f155a22f65e51b9f10c122",9.317957166392093],[5665,"e72e8ef5b20c72ef44db946300f742a0e7173d4a643ba0fa69e0a6bfb54f3adb",9.917710196779964],[14318,"e5af1a99019d49cdb24253496eca4878863bd5d64c88d77dab43756b82273a8d",9.317957166392093],[15470,"68eb7e49e0462520f6bc19fee08102068343992e6a02f73d17b964bc2f91b674",36.94240837696335],[3585,"276143811404f67ecf10481916a9416a3ce273fb9058d226ca9b37b7445e66e8",9.917710196779964],[12199,"08df9c8d84854013277cb1c9bb71538fde68855d7a983c80c03489ff7ad611b0",9.687074829931973],[2395,"118f49826d927eecbd4257689761c36c17fef93b762351a9e3b50ef2949383f0",9.917710196779964],[7566,"69d33ac590be0f52457ba5e1c74de1ba0a86bc6b85a2b0f419dbb9eee11c67ce",9.917710196779964],[15589,"afc46bb48f774b256466a2f7e9e5145ed6d85f9ebbe5fe5837d9298edf798d71",9.317957166392093],[4837,"6af44800a539a9dfde4cd0d98badbe9e2f60dc84113d75dcbc58ee610f8533e0",9.317957166392093],[15839,"d86dc083262e53d0d7ffa0fd2fbab833fe5bf1506c9409c5900abffb5c0b916c",9.317957166392093],[10362,"449fe5fe251757c1d652685d43d1ead9205cdeac4cd11fdf2d01e34c61a5fdbb",9.917710196779964],[1083,"db7e3a3e87f900545500b0fee0497e134f1c5249908506d3e7d0dabed623acf8",9.917710196779964],[1601,"c8147df49d4b1476ad38bd9f1f9c6df4c8edf86fdc61a7535895c27c25f08af5",9.917710196779964],[12523,"a3dba27a17b4bfb9638091b228d5faee9f73237af7721f3f914e05814df2cdad",26.8631090487239],[10536,"c3f27fc964e1b18e7083112b43e8d456a7d8344f5fe13bd021e9b1329d68f8ba",9.917710196779964],[4401,"f538de5def35e688140b21394967602828892d0b8901007d9f75b93063e713e3",26.009070294784582],[18268,"3a1eeee0319771adb9d0723b6be97fa59f55f1e31b69cec4310b423004877e36",9.317957166392093],[13807,"865d9315bf006f272b8ceb8d643e5ad4edf3620e732e3ad41071f5c565a93e99",9.317957166392093],[18844,"e7921d379c06c9af7d043c6f984b81d64d291eb4bfe979707db9dd10b7122625",26.89439374185137],[8281,"c1e9b3b42efeb152e327e97c4fdf5150a6776445dd86df3d87ad07550d8977c9",9.917710196779964],[3945,"f91f5ea325eff8d86fc8fb58db490e0f9c59654a6c93cd6c066f1d07f33205e6",9.917710196779964],[12393,"8262ca3a1b942319718bb353cabec85ddc56ce8b1f5dc9b9def5c83a036ea8ae",9.917710196779964],[2866,"b16ce38f8b173762ed606ab24da47c89b9a20423a5ca99cc7039bf3d1a6450ed",9.917710196779964],[978,"f59714a20a707126427efa3eba8278bdc35bad9dce39d6f74c459ce008bb54f9",9.317957166392093],[4022,"4c9a47d17dc41ba77ddb1893ade2113873fc88f5e6436fa63ea304744ced9ee5",9.917710196779964],[2844,"6206485172669f6825ae4021acfe2250641efb7eeab166f3c3fc5df1a50b64ed",9.317957166392093],[4348,"ddee0c3536162f9e1a47bf2b8087018ca3e6e95449aa1b9db2255a919e0b6ce3",9.917710196779964],[12499,"2e1462af196c27cca29e7abf8887275cbaed701ed4f79b55f94041be6e33f7ad",9.917710196779964],[11485,"3f01f5855fcd11551d9ee05367520733a4f87c868d6fb7f463647c794ec69bb4",9.917710196779964],[8269,"c2d0b3ea2cb32c519e264906e94660275f950dd32cdfc65e07a3bf546f1b85c9",9.917710196779964],[18862,"1e192517d0d0e1f59d2bd76784b27b32da69048bfb1777b46a58a4d17e4ca324",9.647446457990116],[2324,"3479189f3c0dc9c375548f1c00644cc3b12313e7a3826f91ca3624a92e76e5f0",9.317957166392093],[3426,"c28fba095fcabaa036ed06f91e34fcfc0e0bb18243fa27fda0024c5b773b7fe9",9.317957166392093],[15257,"ec5b5088f1e0e10ef0f3eee9107c7348a1b4d9a9b8c6f74fe8be1ba5500e5179",9.317957166392093],[5148,"718834198b1f9e97f9978b049dde8af580c7e1018377429ae8b925281e884ede",9.317957166392093],[13647,"c93ebe80eee6c5149ca1a5ff552ebb14baabdc19ce87867953697c252d5d479c",10],[10491,"d2fb2751ba5eebb8c0aa0634dcdf345846dc908568ff3d20067b93b53e4936bb",9.917710196779964],[12396,"5d944e7da77fde9227db1ff21112c672903cdc7a30e39b8ad7c3f074d210a4ae",9.917710196779964],[13397,"eddbb78bc570e6ed4d17b3b31bdb0e707768fc57a39133792ec315c26cc155a2",9.647446457990116],[18979,"86489f0e93b466c741686a43104e1732b3d65024a13c503cf5ab86a5e1954821",9.647446457990116],[10793,"eee58ebdd779483ee8629db43e4dac1b2e3a952657bb4775132123e8d9c057b9",9.917710196779964],[1121,"9554409b494ef84215cb9c7c8e2c20d3b0818d4a7d86688049dbf4bd6c4e76f8",9.917710196779964],[14683,"c3d1b97e1e807e24b19e0af8b304977581b69cfecb910220f3192e8084843785",9.317957166392093],[14779,"4e3c01aa6683ec81d4d543848308d60bd20c2896f57a64e1c4a34662e89e5a83",9.317957166392093],[5530,"fa16b5f86acdba3f4fa48607d985854957932f10fa5b2bf574c818c65fd307dc",9.917710196779964],[15454,"e326e299d2333841d64b2cde4764701768604ed41afd5ec9280b5e56f0700e75",35.650623885918],[4088,"9e386c649e437fd919f235a7dc9065085b13d9265201d06d8a0d6bda0fd826e5",9.917710196779964],[9561,"bb9231168c81ed6983ce6fb1790f5dc292142e1096419e1f2f9dbb4dc2bb41c1",9.917710196779964],[11721,"0940959a3428e8796d947d3ecc34c626f7a276ea09c494adb15ba1cc2f7b2db3",9.917710196779964],[6040,"ada8e091484182f0de0dd956151aa72e90497510c06088aab0002305276fd1d8",9.917710196779964],[7446,"cdc065be86c3b2a12bfedd7b21cbf5722c131f7bfe0cd3300459d83ce62d1ccf",9.917710196779964],[17771,"d9d45b21d8e0a5df4c8a932bdc092d99e4987ec2767dfcbbf2f9561c6e56e341",9.317957166392093],[5577,"6ccc8811a9d607b04ee008431a3597e1ce4fb11c6c3ed6db7cd5ed9fff70bfdb",9.917710196779964],[476,"b71fd60ba2f971bcacc57171fbcb98a2864471b167c5ada8e95c2d8b8f7ecffc",9.917710196779964],[19108,"d91ea2c160e23d04414e3b571c8097f8fff66a312741f8e9e5ab289e6d00f91b",19.228318584070795],[17969,"ce53d641505b30319917b8d797165280f36f8ec2fc74d3ca9f1272593babc23d",9.317957166392093],[9572,"60008925baab753b84ac146c5aa99a2d7498dbfd6a76cbdba29ee65bd2b82cc1",9.917710196779964],[6486,"f3fc61325025028cd2a4ae52025cda48a8bcbdb28d82809f4096812063e693d5",9.917710196779964],[13095,"13db0c88910edc12c0a8ab53b520d06bd6e9281bae192f469e62bc802d5983a9",206.59102455546147],[18603,"4200c5fce9c644dd98249e51e5c76a3b2633d168b19d6de11a4d98f8b037952e",9.647446457990116],[13932,"68e100898cbb4e2ad3bed7ced13f0034b3f77f55704953a194340617e5ba5396",9.317957166392093],[5921,"2b4e461540afd79700ceb557a3619b73d1e786ac9093288b3431a3a7e2008cd9",9.917710196779964],[18312,"6e8c219390ef5a12ae6fb58503753c66f823a89e85cbcdd4ee3e152d76c9a135",9.317957166392093],[16357,"acaff58640a5605c9e76efa9f49985e094cb108cc777d6ff054357f780b9ef5f",9.647446457990116],[10757,"9e2cc06e122205f01bdddd156f9ce04bb3fabebf7dd36bde36e1e071f8afa0b9",9.917710196779964],[19649,"38249aef08ad0e10b17683ae58086c58efed2ba9277b05fd5c57f8b203c01d08",9.647446457990116],[17564,"ecfede44afb82fd9bdb716bf2daa0c8e9598dafcd7b162b972f3c078086b2446",9.317957166392093],[11597,"70a2c499463501603aee53058610a17bf32e2b4e6b5e4ea9560c6220c0b3eab3",9.825],[4661,"4b0d8462ec0396fbf2a80db666bad42d7abe9b143db4a6061245dd65b1423ae1",9.917710196779964],[17964,"a403750ac68bc14fe1909856adbb858a8f746caba6959c0d8c6452c36945da3d",9.317957166392093],[15815,"027d3310b49fd0450730dc58b2eeecdc93ede44c1b4a03af06914f76094c146d",9.317957166392093],[3327,"44b975566997f80528331169ee503191150239b4b688b3db42ed317ae8e332ea",9.917710196779964],[12493,"f7dcd1c8f1430c04529b607d5d8a4754264831e2d5aa6752ddc7699c538900ae",9.917710196779964],[10707,"844b89c8513660fe3b8b583dd3565ca70cf1e12bacde0511810dd7797308f8b9",9.317957166392093],[8755,"3dad9172c4ba341512f2a3cc4ef2c7ebd8a2ccdd1b9c2d77c34bcb65ec544fc6",9.917710196779964],[3250,"606ffd6270281c2ac45c729aefe6da7cb01d6b14d6bef21ab1bedf06ae25a8ea",9.917710196779964],[4094,"192e35703739224a590e294da6ff7d08a970895f47e7cce45c8062ff5ddf1ae5",9.917710196779964],[18341,"d62ec459b8568388495b96db284cca9f0220d7ac3343a89cbc7175521249f334",9.317957166392093],[12569,"9c2ea97e62fcc636a99197fcdea97bdbd28b9872baa85e0a9008bdb6b0317bad",9.917710196779964],[7736,"bf5515986221a301423f67bd01520011988877f83058e496fa6211a914e243cd",9.917710196779964],[11757,"a6f180627875a7f92f3dd5cdbdf102573544964f9aa92cce28c9bb723a96f3b2",9.917710196779964],[13477,"8ef27a2cf6903a3a5038041be5709f8717ccdd9ea1926695cc950697c2f867a0",9.317957166392093],[8627,"4b8af66c3ba610ad88f2f529bb0043625b1bf3c3dffc61486a90029e795442c7",9.917710196779964],[7413,"81616f1036ea688d189d5fd9f911c0e498b3068e7fe4d98dd84a1fb2d1bc4bcf",9.917710196779964],[17320,"be2cbe98e0faec5f96b233f75002a26959f552435ade406e5516b630113a804b",26.13903743315508],[14045,"2ff6978ca8f8f180e80c946502ddde9c3864a14618343302a2cf2c7c04fed193",9.317957166392093],[10417,"8f1b6c8398727b133f0c2227cb27aace5f4bed15268db5833ab56a4cd8a4b2bb",9.917710196779964],[10688,"24cf2b0f216f59374a0dd62b525a21e418e72825ecf4003304a88ed782961dba",9.317957166392093],[6646,"7996fe48aabf8324366ca5d6817afa56f07d183b5862411dc65e38dcfe3e58d4",9.917710196779964],[6183,"30bb4af194a3b8093c07a01c41bafee001ca68ba105815b62e1a1e0e8aa7ebd7",9.917710196779964],[7335,"0cbee9d9d41fc85f092cbfeb9dd4115d84a912d14fb4dd8a2a4fb477975bd5cf",9.317957166392093],[7121,"ebc31b634dc978ee696250900504b55242f5fce236dffd834d63986499be30d1",9.917710196779964],[16291,"d63e0d166c1557bd7346177749053f2ef48b51ab44090c35d9a46acb071d6161",9.317957166392093],[6123,"8b491481bbcb147f712a5f304ac351cc15ec57e492a5fcdd3bec9294a68f4ad8",9.917710196779964],[4252,"95df08cd04e96e0f77e589e2fe8c41965f07e652230bbb8bedf1e172ed8b1ce4",9.317957166392093],[15048,"737d4f28afc19414884a5b8b33e8cea59a8755b5ebbd8403128021dcc290977d",9.317957166392093],[7669,"8007790cd61684e6e259dad809ded9faabe4add59c0bf6f63059b2874a72cacd",9.917710196779964],[10104,"8816e6ea65d35be43659a9f482a30a20a4f43096c6967bcbfb3083fbc8acaabd",19.004566210045663],[10935,"fb625e507044789cf10d3be8e2663931cc032e68e352408399e8f37f284579b8",9.917710196779964],[13,"c113022287f5cf5c12a49ac5203144f8e0c6b83295dd4fd550a0d59741fbefff",9.317957166392093],[14899,"77315a65af0a50258aa5c89a89f5ad55a83f4fe159fc79b60f52c6fe9ed2e780",9.317957166392093],[8659,"cd7fa24f33e85e2a9df3edbcdc66a2e7b10cafe7c75f711a7787cb5d927df8c6",9.917710196779964],[14153,"1add42b14978e244324edb2bbf1cd5d922e43b3020f69a115d658f334d5b6491",9.647446457990116],[8081,"dc0a7ef27217ed4c8f47bd3550722138fc65de98f7221996b647c3322942e6ca",9.917710196779964],[3763,"c6789953f8b4381b2af2ed0660c1a0314e6cb4ee99acef786194fa8f185f2de7",9.917710196779964],[3632,"74395a4bf1d29fff9e8eba643076a02569f0ed8fb427a2f0d4616c7e92f50ae8",9.917710196779964],[8185,"eb64de77034cbd5f47e22bf8c43c8f436c4cfd29c109e69db6f428dbe65717ca",9.917710196779964],[6113,"94f237ea1197ec309d856adc19814cf4a18f5c11dbf6add4adf7116c367e5ad8",9.917710196779964],[4532,"7be9cac9b3e759f93e01c90d929981c4e163d004cfecc791d01a86f67c5226e2",9.917710196779964],[14495,"ae0b3df0b542093628e7246794090a15c1236450607d3dcdfdea9ecd851d5a89",9.317957166392093],[12503,"e35721b76fba5f549efb2ea76b3ef8231797468dad7f9fbeee3f6608252defad",9.317957166392093],[6358,"aebd88b9b9e926b3b18ef3938469c9c5008760f7cea9a9b81165249e69a6a3d6",9.917710196779964],[4040,"cef0a10636e054d896f698f929e9359bcec4b923baf3a4b0a48db4b571d67ee5",9.917710196779964],[19671,"bedb66c379d81d3c265a07cba7ed063af123b32c45ce51e0701ee372acf78c07",9.4279176201373],[19298,"0d41e31120d003a4fb172f06e65778beadd1dc8107f0532b39b1d4076279f814",9.317957166392093],[2359,"8e6b1730bdaaaec2e15ceda92f8824138469f95edb93c29811fd0ed4dbe3b2f0",9.917710196779964],[13684,"a07b91f87fc1038731d52433e34564694ed78870fc0062ef57825ddf8a45909b",9.317957166392093],[309,"dc09b1f4ed462ea9b2af1db8eae90d52909ae3a8b4101c2c0cc6e5e3b287edfd",22.21639344262295],[4038,"436fe71a4be243dd0e54cdfcf370ddb5c7ebecf7d410cc0487863e48922982e5",9.317957166392093],[13400,"6ba343fa0ee04b33a1456a263be0b83dcd9c20bdcf39f9dcc197299ec3e84ca2",9.317957166392093],[17273,"20817398c985cf27a5d531a2673e435d86ddfc907d6f7c7cbeee84306e7eb94c",19.066666666666666],[12056,"8204926dec24bf8d3c0580161de3c365e6a0b3f9a0ba850f40536ef29fccf1b0",9.917710196779964],[14151,"b010df49f09a88c9d190c86b7b70a7f0158346599ab35616aeaf6af36b8d6e91",9.317957166392093],[3811,"88c6a2f0c8528d24b014bf606f26b935098b6e515169b19e008a5125f0e9e6e6",9.917710196779964],[14276,"c2831ffa17fc983e865cb6b6700f119e37149c1c318c68cb91355e557369638e",9.317957166392093],[5441,"74044a237f64b4ec4e0d489a758dabe9f88a112ffec641e131f11e4e705887dc",9.917710196779964],[10233,"5e82152c82b23aff1b4c48ba2906f80d600febaf9596e2ad0f245263570cc7bc",9.917710196779964],[9762,"49d87bf1b7856c8a8a618c24b5b7e729e025d5eacc3ea9121e9b5b3a4ebfeabf",9.317957166392093],[6906,"32784a7b7ddbc6a9e24af8c73d1190b6107a6c674e1356106df205393fcb8dd2",9.917710196779964],[2687,"d9e254b90a242019f00dc9ef1c23900cf2ed9516c9ea0d5bf4e378a941cb91ee",9.317957166392093],[19604,"ce6a0537e3aafd155bf6a0c25e685f6951e53456de0c812ee05706cc694fef09",12.063716814159292],[16084,"a53791d8a5b498db299e938bd8f017c13004824d252b3257bc36d8b3a35ca066",9.317957166392093],[15549,"27517f5232a64178869c85d1e0c66b4710581153c80bdf17e35bda9a43f3d872",23.08712121212121],[12137,"4bb682310062f18caaf8a99987f46fa78b87532e51541cb8aba6cc1f0d9f6cb0",9.917710196779964],[5856,"63c96796c3ca62d3542482db108abb65177c2478532162eda33e495c4e14f6d9",9.917710196779964],[12823,"536fbcfdead127d7d6623c032a1b1c1bd3bc690f8525aa33cadd52de31afceab",10.052724077328646],[13573,"5b35426811f33997ac101685f6587558017106feb55399957da6dbdc61451a9e",9.317957166392093],[16824,"4553770879860c5f8b6e8884cb058b2b6323daf8f1504bee3413e3fcb412ca55",9.497326203208557],[19571,"6b5c7367071da53491a25a03c64983088ccc025718abf98f753429112a0ca50b",9.317957166392093],[18176,"152eda52e2ca6f177a62e003017f1b2950d75dde7d679e140b2db7e6b2d9ca38",9.317957166392093],[519,"14f5eb379b6ccb8396a3a5a08cb2b5a9ccb4338663f756afdffb894ac8d68cfc",9.917710196779964],[2463,"1f0063891ac89194bec2deb27f16d50cc3e86ec6936303c1e98236339e3a18f0",9.917710196779964],[18935,"a49d1624762dd064516ebb413ff56b46d598726710db95bf0b047d459ff77822",24.10958904109589],[16510,"4ca3c8e4691a07b8e2ddd22fe485a0a1c4ed2075924fd4c447b91b9c8197075d",9.317957166392093],[14351,"4e0399ecec34dd96154f6cbf77145475a0f5b7991468325b17697237712c558c",9.317957166392093],[19163,"267c140c61af4e0eb598db3417be54ba35a65d9da8cf19f9cc29c0ab6ce5021a",9.537836027934564],[12177,"30daf198fe8d0a2a109f24482f68328c0c37fa61fc4c683f8f5814292cf335b0",9.317957166392093],[7982,"31b152f99e316503f13e0d4a45a916f9743ef418c2fd55cd96fbe8e05b11a4cb",9.917710196779964],[7914,"a06f6be91e6e8cba9a52086cd5e850682ec8ab3d379e7a4aee935a4a698921cc",9.917710196779964],[7432,"93314d38a025771ad1ceb904ac9388c83456facc2823db918191e7bf05222ccf",9.917710196779964],[4100,"edce6e64a2da005f1541c5d590255aad38f62b8bda839ea4d6f62cafc31d11e5",9.647446457990116],[218,"0e880d1db269c6a971be3254ec61fb8d35656c08a02f3329c5f0c9f9467184fe",9.917710196779964],[6673,"7b3fffe7f82698ba13229b336d92f2c0eaf9db1b29e014dcd0bd6b8ea70c29d4",9.917710196779964],[10119,"f1224d4d7b213707df0d3b501d2d456db1d5f1a4bc3eedfb6fcec8a9d9d092bd",9.317957166392093],[16096,"25114327b3cd13f363d5526643663bbf3176a3436e27d3186fda05f2e64a3366",9.317957166392093],[13458,"85ae3e2778bf9b562caf318cced32fd4da5791eaa943dddd89725ef505bfe9a0",9.647446457990116],[14388,"daad078ea9be046e86f3076d0d6d9b99cc99504f2354e56c69693ef41fc3828b",9.317957166392093],[13788,"98856136042d6d874be40af53670b43740bf1e71a2f1bda81c893d2dd72c9a99",9.317957166392093],[11650,"2c98dccab62e51eb10870a459481ec6ad63e66695c16983ba49bf0c145309db3",9.917710196779964],[7452,"9020750b0ef7b5a319b6492c219be157fa336cbffc187c8c63db6789ec5510cf",9.917710196779964],[1810,"4548d23826a98f6231cecaf7b719840473671001e5be06c9ef705833ee332bf4",9.917710196779964],[5277,"b1b3713459c47c66cf58bd672c67f0cf4ec7eeeaed2e862bb93cb87057fc8add",9.917710196779964],[17911,"b63490bfbe00445526e4a2aaefc53393a74c31a48152187227d1d264388e0a3f",9.317957166392093],[7152,"c25b62de7f32fe181af31f6542810a6b49d11dd398e2487670c205b67c1201d1",9.317957166392093],[8967,"7e4e105aece4b6ccbcd52c23f3b1821d0ed9a9d22e282e50d9ddc82862a608c5",33.3968253968254],[10162,"81012be8476d57d44aefcf380e1eee6f9a351c6c025f326e4c7eb5e0abf057bd",34.77580071174377],[14526,"c600ae7496253d45e56bba0413590d4b69dc5cb700f3cb63cb4a4e1acc42aa88",31.690582959641254],[6544,"c2c270cd720b537a11937c1bbb93a18cf3b48e8ec2c3fe96868ca2b9e7cb0dd5",9.917710196779964],[9555,"6377d4df7ffb8e226c8a950b92635cddea9479c8f750b1ebbdfd39c9e2504fc1",9.917710196779964],[18638,"ba79aaf57643d6ddb2c8b86185548e3b32ab0b4e8d6a63890ff61bab63ed422d",9.317957166392093],[11271,"8a2b5a72d79be92dc5aaf2b0448f8055f0775fb15d6b92b5bd93030670fb38b6",9.317957166392093],[15362,"162d34e53a7ab5aa52c86a67b775645d53f850c855314260d51c0ecc94b21977",9.317957166392093],[15767,"ac46f6d38fcd94a4ce006c0eccb45c5f2b993e8926f8fcff22943b567527086e",9.317957166392093],[4900,"aebf6abe09854b190478dada7be441164dbb58d2434798f1c088ba733035dedf",9.917710196779964],[17658,"c06bea880bb85edef0a3ef07778d61ae9e71040448747ac97a54edb332f7f743",25],[7071,"7f23215fd5aa7d0daa78b1a4178d35215dff6bf4e96d738dbb0f77acd61182d1",9.917710196779964],[1224,"bbc5be700e55d6d35bc8227a918388f84ec37a3289cfc734b5fc28bd83d2daf7",9.317957166392093],[3397,"77ba7123667c29db058e0e1af6d7d8db5e662a8cad92ae9bca3c0e7f1497b1e9",9.917710196779964],[19039,"f51f601fa7bd60e4d396e93db092202485d8dfbb4bea7d471d072df70699491f",9.317957166392093],[13611,"b2994a76119cd5f929f8ac24dc200094dc63cbb1b570bdbafad18fec7562319d",39.19211822660098],[1361,"27c9dbbe22a2d90afd940b643f9f1ae6c47a61d13d29a2bb93eb7277c209fbf6",9.917710196779964],[16988,"82304db22f7e78c108a24faf2748c183806afaf1f098c8072e259cd177b64a52",9.647446457990116],[10440,"b9b568a7f9b3b09afbcd5f11e8a3ba0e991155d38e3b3a6fa988eaf4454881bb",9.917710196779964],[13816,"1f2e8f42b4765af29eb6846a005094ac5d527b4e6a740060e70a238a444e2499",9.55656108597285],[10913,"64b21cb05afa6aa5d9aba5b3b08765611557009a94cd85b83b6975be91339ab8",10.052724077328646],[7013,"0be1c27f787976f8a89b0218156eb1159678f146e60f47606c9f67963ccae9d1",9.917710196779964],[15036,"7724e5da8812932d4342ff32255c52c76456a4a13db6268eec8236ae58a0c17d",9.317957166392093],[16297,"968d9b760eb69774ab583a58d37e2754d132547e2d733e0e685ce798b9bb2e61",9.317957166392093],[13293,"4b8f788986cd8dbc7ae3298f583dbeb7769a0d6b7cba9dbcf78d1d70c5c5afa4",9.317957166392093],[7768,"af972fd284b47969ce5216cff938bd27e603725ce26009555cf99eb9ed1d07cd",9.917710196779964],[6609,"c51a78585f252fc8b188afd55cfcc0be68e1d7efbadcbb52f80f95bd300095d4",9.317957166392093],[9073,"08d7771698c5186f84ac92a9d5d0df73e29ff16e1b1e576e5caecae98ee14fc4",9.917710196779964],[5672,"0cd22e98bba7323aeaa5bb09551269eebd93c52c21bed270f5852240129f2edb",9.917710196779964],[8221,"d9045b7cb7d0737ca052af2cddd02f7c0939bcde98bec3e63f9442d922becdc9",9.647446457990116],[16646,"4f66d02254195f20011b68671d311b011a198df091d8031d162a65c2f813dc59",18.06896551724138],[4848,"0e3530983fadf841d6406e15817587c06b7a7ae50cd7b7e1f8a40616e65928e0",9.317957166392093],[7731,"820f64c3746800039462f0111542045a263288f15cedc9b24df6d654bdee47cd",9.917710196779964],[12216,"37510d50b7ba93540207259ac1073a8d7a142cd18ffb4a0c537cea93b07bfeaf",9.917710196779964],[4977,"ad697188b36a5d89ca79d5143a91e72ce7966259a5b83a2afa64d32edcd754df",9.317957166392093],[12228,"61ff68de933cb83e8cbf7bea0d55d6131269754618672d11397ce6eba645dfaf",9.917710196779964],[12743,"de98ef3530f6e8904a2ee36fde18b25cf1f77437a77ccce0ed22f2d952cf48ac",9.917710196779964],[833,"69ad4e7eab8483997067072c6764911ddee1df723a071881dbfb74a3fe2954fa",9.917710196779964],[14647,"136cd5ea82971eb4ba04a380a61fe5483a35ed6ee0724176814e509400a1e985",9.317957166392093],[9468,"68cff193b8057862c4e610aeec03f4d029d761176511832249109b9f0a8ee9c1",9.317957166392093],[6803,"ba7b9a1e7d07f6ec74f93b82bcd3fbe1a5f980a5448f854caaa709c994623cd3",9.917710196779964],[10130,"232b96618371918455835b3a764b2b676a9068704e6acdabd2c5dde7b94f7fbd",9.317957166392093],[7561,"b264794d61992466c97eb8644f10c84fa14e0ff9b5f26e3ca37cfbb902ed71ce",9.917710196779964],[7158,"75a7067dcd1fa78400f27551d69f431b840cad2446bab36640a63a9004d8f6d0",26.13903743315508],[15399,"55ebff41c9a7cd5c91ca86cb1b3c9ff429035dc850d9e5b6466fc737d7005876",10.052724077328646],[7166,"d8ceed13733dca67d9d55c96f95fbcb0c0351b58b862371cd9df053072aee9d0",25.38755980861244],[17588,"d24c8986622f8b1590ce0b0ab0dfbd60ddeb9fd836b89b9b8de79a8d5fad7245",9.317957166392093],[12235,"88756eb06ffac46ddb3d8c7d57198129261eabf6d5c517e2fb543276974fcaaf",9.917710196779964],[10322,"df5fbd153509cacd16a3946734ce4adb09b21f644fc38c7d5f00776adc1433bc",9.917710196779964],[13881,"46139f36a2c40b8c158e046ec52a4e6dec9712ff7621ebebaa680a9f71518a97",28.390243902439025],[10057,"88cde0532e2af03b72cb7a8454ccdd4da210daa8adc52c3a6bf1eab9cdbb00be",9.917710196779964],[2543,"939c8e7acc41fe2d682fd993f9d102887f7ec490e498499ce5a61818d6f98fef",9.917710196779964],[8826,"6139d44557b83589acf2e9910b98fb8ee2ada90dbad9f19d27bb15d08e5beec5",9.317957166392093],[7026,"39288bf6e7c90c85d2418bed2ede5f53e1da0868d093ee10ceeeb03b701edad1",10.052724077328646],[3402,"5a0deafed05a43d96666eda81eeeda315bc2787f1ba9494fe7850ca1fec0ace9",9.317957166392093],[5298,"996e2c78893d62092aee6b0875dc2bb2a85fcd35f1622f0a1ec0aed85aed68dd",9.917710196779964],[18398,"ce533f56d16d7538468eb1459f44d26fb81dd15efc14087f378f45517bf17333",9.317957166392093],[5164,"dbaa392f1cb27f4902d7218b62ab15ec7bbb93515b628ea3f65db061117a30de",9.917710196779964],[18484,"a85cdca72fcfab71aea622a3310867925e4769f0b904b24fb7ca909a1b38bf31",9.317957166392093],[6996,"00a84577e72e7e8a0799a443be674898be9ffe2c44eb6c7bc1235a99e4da07d2",30.79787234042553],[13468,"ad69a3ede96e81c66ed74aff858f53a3663f5278cde628f4868d5b94b7ddb0a0",9.317957166392093],[5385,"83af0b6759a733d844bcbf7cce0fb23a8d80c5ca96903a0e81deb77a32d3eadc",9.647446457990116],[2922,"edf36d23471f7ccd536233ddc25c90c04094c614b6ed945655077352b2d9eaec",9.317957166392093],[8618,"0bc89f1fc40d2351f83e110fce8450ea4e61903e8f3d9fafb23a52dedb224dc7",9.917710196779964],[15354,"0c4bf4267f8d4ed912202c05f2d56198be5e8dc27ea0aa0dab6edef9d40c4e77",9.317957166392093],[4474,"00e05df4af9ff2abec1370d150baa4f30a1edcc8b401b1eda875b8612a0791e2",9.917710196779964],[9157,"e2bb804f596a13059e74e550cfb7220bfca460b09bfb3a7f591de9f65f65c7c3",9.917710196779964],[19487,"b1656cf2cef025a8139622e1f10d5b0b51b683c082ebc25b90dbdf167fedd20e",35.893048128342244],[4595,"528c1697cb2ef4d1d0dda6cf9163d2bae922adb5a26378b6c1a11c3f8175a3e1",9.917710196779964],[7341,"8e42b9920661ec48c067fe7f9fc91a0fce3950bbcc3b5632694f9608afc2c2cf",9.917710196779964],[17461,"d5ed94ee8352b0beed31b1e9c0601ea2ed3170d3d2aa0b99c6e00b9d8f519348",9.317957166392093],[11112,"0ef3874ccc71a81832457413cea91a415ded2f04df4d9855b2dcc5366a2e31b7",9.317957166392093],[13671,"74cd04ccd7e4bc8fb07d2c5114e3f969c8c42a1b9a9f5685931f0b7b13d7d49b",9.317957166392093],[1919,"a4d8530789efb8bd391615192eb409da93639344cf27712f3daea135b7bd8ef3",19.080851063829787],[16892,"a2f451ef889340fe975e38e61049c4fa3807768d29a5a811ded399612cd66d54",20.491103202846976],[11965,"00b7f5fd65ecff90b549dc76e866164829bfc206095f69a9eb6427f9dd558eb1",9.917710196779964],[178,"12274bae5879737b6d913345ff5f7c5cbf70638574e60b6feba764a7688dcdfe",9.47085201793722],[5719,"e7cfc4281afc36de8349322c06a0189eb64028fa5681a789b3d008896052f2da",9.917710196779964],[5821,"df9cc46f5677ff0f730f4ba308c6a0e4eb70e1c928a9ec85920acdc927e23fda",9.317957166392093],[5321,"265a1dfb9888a36a4841724028db37c1aec597c2396cb8b8dbfa84c1fe1c4add",9.917710196779964],[14961,"99d6d7dfab6ced5f87ad6dc5f1bbc2e5fea604008aa807d46c24891064f96a7f",9.317957166392093],[4956,"e51fb1bf325d17f3a78243fdaa6e2086c6d274e28b2077740a1ccbf2838585df",9.917710196779964],[10769,"c1575af6f3fb14fb25a6666177dfbab925473cac27014859de473965bb3085b9",9.917710196779964],[12604,"6edf94f594fee5691f72709744d02ca344546d7987162ec693a6e5f2df3c3cad",9.917710196779964],[2230,"47ee5bf9c36edc5af702144f806d1624ceb2a06fb227ce819009e6ba83fd55f1",9.317957166392093],[12291,"e4b4122a0341afc8b57c35b7f3e91c4484fa44293f802b72904c74e1d9574caf",9.917710196779964],[15349,"ce6dce439eddef99ea6a0eb1f78ec9a1748af6997bc145ddf995c16b6ef65f77",9.317957166392093],[16463,"e88eaf4166f601c278e4c479eadd98ddd8c20e9ac7caa5d7f69454f8ee15fa5d",19.144861238182372],[9720,"4296f0d9337dd82a639997f7cc8c47afd5bacaf37d368194114fc0d1439d39c0",9.917710196779964],[10313,"4efe4f65d83ce8a502faf0461835b3bd7f7ac14d9ca9140aa45ba72cf4ce42bc",9.917710196779964],[8701,"f084ed818efe9c93ed2e5fdab86f60706a4828ba40f48a0a522afc89da6cb1c6",9.917710196779964],[1377,"124d3190096ac0d79fd0aa649f48be7102e1ddb6ac5e2095f8f776a743d1e4f6",9.317957166392093],[14614,"3f8112e5270870d902fe54080c2251aef8d8c78e64b1d72fc679baa5ab0fd086",40.63324538258575],[18739,"36b263b34ed2b03d69775ed6be571ee034656cc9e3f3e3c183b89e68474d0129",9.325283747886983],[7307,"2169be0c011b821321f27d4969a9122351c55bb89064c02e353a2750f69006d0",9.317957166392093],[4642,"071a4649d632bf07964fad559c5d74f86824e1f7b9e4aec4144475fc5b5c5ce1",9.917710196779964],[14086,"ec91668f693ff85c29c5db7c10b29992f8d174a51fe8c172fd8063832050f592",9.317957166392093],[658,"bb40967d99d6736e350936db5cb0e317bcf66b976edc6e7b71d08ad5e8cc86fb",9.317957166392093],[12468,"365581ae385fcfdee5b4dff3e03d4da299a4d8ba19fa647e41f745c5494333ae",9.917710196779964],[17508,"fcec1d0369219488cb04ad7d2bf90160988a12c82caf73d6f7c2f329c9ff4947",9.317957166392093],[7279,"88c7b5349e3d7f8afb4bee25c42898031d36b5bbdf63006125b360a4855c2bd0",9.317957166392093],[16061,"f53492e6113e22adcd04e30d16f828ac8811b0ab0dfd773eb04227e8c2fe2a67",9.317957166392093],[5294,"d62d1f2604e510b247fd24b82fa6233ce1d527a5dbdba8921b04bd6da41f72dd",9.917710196779964],[11812,"d175627d0914c54adf98f0f232e87ebd51c48f87705127ec70fb48f48dd6a2b2",9.917710196779964],[7145,"84f66daf86cd9502b028ebf84ae125f35fa08270762555f5bfbe754fb3c00ad1",9.917710196779964],[3578,"80acdbe54f0757755d78ca30eea22d17a4ddb1aad920fe510b0f5c5459db71e8",9.917710196779964],[8687,"87a2c6430cc931a7cb93ddeeaebb5118ab8b878eca73e131638eb35eea44c0c6",9.317957166392093],[7476,"c574e1cc83f559a2596b190abe91d3e53520af4017c4f5e60fba0f6846dddece",9.917710196779964],[9299,"567fe87129e4e7b53df698d99870831b7a35b90e539ddfc324de349dd297d6c2",9.317957166392093],[12548,"933812f05097772af576884be4c3b00a9afbd993c49251d2c3c087d65cc2a3ad",9.317957166392093],[2987,"4dd8d0339f10baa0351a90f2cc9759d7dc84637a105ad17d2b58922368e95cec",35.829181494661924],[7903,"91fc397cf5a43675896542142592ece3f15c60f2ac6982464d06869d75c933cc",9.917710196779964],[16226,"9b5a2394670e4091d2ad93c84a305958f2d50bc6755d78565b002ee743172763",9.549707602339181],[18595,"1b89060955b1ef497df54a831fa1c490e138371150410c4574fe30f18e67f22e",9.317957166392093],[16069,"b66bb5d85c39a369d87a9fb39c4ce9df5e9a9d6fae3e62ac00b433930c3edd66",9.317957166392093],[15797,"ada85ecacbd97a99821c0dc4c5182d458a7dd19f902ce02c388608354fc66d6d",9.317957166392093],[7670,"9e5b52d9195e29e150bb8780e081901c2a56727b624380fc70e06e5bcc04cacd",9.317957166392093],[584,"8a4a15732a655cda7c07da36478e36e4f6dd13906829539c848f0f57bc6605fc",9.917710196779964],[19558,"63ce52f499bd14bcbfc09fbb98b1f9cc6dd150b2cc9996b44b49645353fa5c0c",9.317957166392093],[12305,"bf5ed5242868dfdfa6e7d4f10b0657c1a86f25a46462e56cf91e91f93c1732af",9.917710196779964],[12317,"bf8788b6adb6ff7cdb1aa2a263a2a45fd1a78dcf9467827e1cf832b174d517af",9.317957166392093],[9562,"77000a1a803893358bf19e262fc1b46213b59b60d2984f73b9b9f6e39b203fc1",9.917710196779964],[3275,"94b42cdd822861c0dcb06e1bd174fc9d80821383d1df81425fd5c3ffee578cea",9.917710196779964],[13594,"211eb0ffe6a78f7b4697c49bafa223c415481249e73328fbc8680eb9d291a09d",25.831050228310502],[1717,"fab8d67d3aba48851a30b32547d2c4c1c2e868c1da5a89f81fdfd725a602d1f4",9.917710196779964],[6078,"e7b1cbfed796fbfa60615053dc149dc27c7d82fcaa8e173c479c89593c1b8bd8",39.20855614973262],[19590,"3645099f48efc2b85aca0a0a84971f905611a9b5e93bbb0309ce3ce35d3b930a",9.317957166392093],[292,"ce3de2712da1b775639131a0bcbcb796ae30f83c28e2ef37d42ddc4e1df001fe",9.917710196779964],[10215,"61c6ee6c1827a98d2bd84fc28314f8099e38c87b7b55956ff1bbf3a6016ae0bc",9.317957166392093],[8995,"ecbb5baa2d387b8d8f5a59936e415ede78137ba6c645fac4c716f568b033d0c4",28.12785388127854],[8709,"9159d6b6bc3836eb84db2aa54773d1ae60a8b2cc9730d8f45c6b3d5b67dfa1c6",14.031890660592255],[11837,"1c8049f7f5639524c4c863b0307ffac52079892e96891d999801170dfd2c7cb2",9.917710196779964],[15204,"1402bfec65ff3ad9d217a0d039d9e682ca6f01e346e7d17e2e01fecf365c6c7a",9.647446457990116],[972,"6b99d13e8caf1930e7fe8a69f9bf9195232706a09094560f794feb20074c5df9",9.917710196779964],[515,"7bea1dd7cd8a983d5a79deeb6cf0c3b155669a2edec0207d15d0f4be72a396fc",9.917710196779964],[1291,"b26aa27785ac284f9f6ed47659d31052f534c01a4b4f549c4e6d9c6b57796ef7",9.917710196779964],[16697,"c8d0a9051b9ce82862febf88d4b6598e0b86fdc8dd996d38b64c342a1bb28c58",9.317957166392093],[16602,"259683ace6cf8583d652bc78cd9de6780682f75cb5110e31951c4ece4ee1cb5a",9.6],[15236,"725da7f648da2650e964f2b989877b9c21c66b1e76aef84dccb3e1d8489cc079",9.317957166392093],[6025,"076ef2cf5cf6c026c4d75b66d1e3e0def1c557a899ebc7ecd928311ee483e6d8",9.338112305854242],[11144,"6e58a11770d2f8e5e72f6c7284a105c6a3e6c1517fb2ea1c91f8955fafc100b7",9.917710196779964],[18352,"44a482ae1bd8ecb996cbcf3af496793dab5c9fc13754dc94a1babc9c764eb234",28.187082405345212],[11035,"154f666dea534c810a115d51d54a3161844f1f58c08d362c8d882704850ed2b7",9.917710196779964],[3307,"7f3594978c1daa322d2302451945d4cab1fc9d46930d0495c6bb22da8d2e56ea",9.917710196779964],[16606,"1912b058e8a30dc876c557330ac0fcf70f0326b0411767e596897b54a8e6b65a",9.317957166392093],[1518,"c578f76c4ae4a261ad0171e49a18c9f171ddd645bff95784b899bc0c418afef5",9.317957166392093],[7323,"0a1df94225038f9fa84b4bd27bbcc6922a47b51090ad55b87960adfa8d9ae8cf",9.647446457990116],[15627,"1f78e4b161e9ac1d4de12ca9347577eddcc029f33ccc5dab7c2b9a3a0df0c370",9.317957166392093],[5572,"0d45f2b38c6d65e22c737c9402a665b7f98aa38a6496c60f8c45aacd8a61cbdb",10.052724077328646],[15609,"cee8125289adbc683b7f90bd1980439fbc8d30bb16ec728fa47fe814a3db4371",9.317957166392093],[1453,"92d26867a74d365379c43f91f691866248df63000e8099f982ebda73bd277cf6",10.040705563093622],[19521,"0d1ac0c5d61a1b82e74017b88a3e5fe233943333a8a45ab430b9aaa75f35bc0d",10.052724077328646],[5369,"ebb0bab7aaaf41ca6b3bdb7be2542f2ceb67c455438a07020084fe22e5a309dd",9.917710196779964],[9124,"9a43b4245e25d7bc7090c2e27b239c7adfd0cb9708db2b606e3b86d1b83efec3",9.917710196779964],[2616,"f98fc78b518c4aea49c1b50b75641eb8c225d6d0a76db897d4ef171d2f4e10ef",9.917710196779964],[7870,"a344ecbc86a9cc58e0247b62963f086d6266424638a90626f3601354164f70cc",9.317957166392093],[13529,"f51ae87e7fa832a07f1b452f02246ffbe3054760a0723e43647cf02f601a359f",10.013531799729364],[17752,"64c89892304e757f4c52e877bc2be1560de2bd2c06e24b91a5c853c18ac12e42",9.647446457990116],[18523,"38fccf05c7883591752e2046bc37a23488cac29637b5e439c6047c1b60060331",9.317957166392093],[16637,"2bb158b6dd2664baba1b5c09b290d68654254fa8c2b062638752ca58b26c185a",9.317957166392093],[16948,"ac8687a81f5ea4b22c4f742722cf10f573a56ea962fd7f9d9ec00051d94a2f53",9.317957166392093],[7591,"57e7cc8b513cb6a99ceb192488f39e5a4ba84e307c361b7596072bbf3d0f3dce",9.917710196779964],[17011,"ab79e9601c671effbb312002a3cf106fe874575dc8632d3901b817a27c31cb51",9.317957166392093],[17807,"450494a848dd1b14f8165ef93001d58e3fb85120b67d8f77895d10f816551841",9.317957166392093],[18446,"3c823f98d2b433d6832ff540699f3168900688cd86f47a65e7981a118c59b632",9.317957166392093],[2299,"5b6ec33d38b1b00fc62218872dfb08ab593e60ab14fe4fe5e0f7191e7f8905f1",28],[8797,"e1c19251cf8fb1a4d1aba7bf8671be6d19c373da18dec380d442cced906f16c6",9.917710196779964],[15452,"ca4c1bd7deb306665a1d34791f4f1c7296aa6281c4d0e467abbc2cfb517d1575",9.317957166392093],[10814,"5ab37f8ecc6302bb1d0a3c5f1b82b436fdeacc1b41c99b2ab4cf181fa7a633b9",9.917710196779964],[9498,"4119e06d57b9152b3ee741d488ce43a8d625eae506ffe69a9f797a0a039cb1c1",9.917710196779964],[542,"0922e8b229408d89d0dc1ad8ffa098153f989775165da544c90ae0a557b657fc",9.917710196779964],[9107,"81f12294b9cc34ab7f35486ab9ba568dacfbb6816f1f51bb5112b3d800e019c4",9.917710196779964],[14432,"8cc6410b8a7623faa51998045965f0a3cb096ae0c929ce38c06ecd95c887a68a",9.317957166392093],[4037,"5a5c1779153158bc5ff31e60784850fde3bbe6b060e924943c1afe30b28982e5",9.647446457990116],[12988,"839630f9842831fe8facd95b4ca0cfad77b943f5faec01ed661181918086afaa",9.917710196779964],[10610,"cebdc2a71049bb1e6f5d72a28a612ab912ea2da9962416161f931125e8069bba",9.917710196779964],[10019,"d67a190ebca7bfcb3742e72aaa3c4ee5aa9536d7fc66096e3e5b6d75b65036be",9.917710196779964],[7730,"07f052f5b192100ac6aa8ef08605948cff751746d2ff06962ffc6f7a470e4acd",9.917710196779964],[15835,"7ec5d415a20fa8587b6c29ec6fa1a2aa7d1ada843832e7f663a35c07ba8b9b6c",24.715425531914892],[6809,"403611958d97f785ad791fb1b1cefb28d4efbaaecad01635bc423f7968f237d3",9.917710196779964],[12995,"7e91418f60a4ae589aa53269da5da70a4d066d69bde454ab1d1b8a295c489daa",9.917710196779964],[13894,"c74529694b718ac7838796bdbffcf2f408137c0e9a4496a13bbf2ae3737f2997",9.317957166392093],[8680,"1018e361c5c304ac82178e7ce9033a6a7044ae8794a76fb5191660735ef1d1c6",9.917710196779964],[11624,"0384c11f73645d7535f1fdc153f7f6da88ffe221bbe00a9c0b89f87b35bbbdb3",9.917710196779964],[17062,"0c043b5837c237a164bd5f282c6355e814d251a3faf673d3d766edc19284cd50",9.317957166392093],[16552,"47ab858f9614fa70c6acd2252ffb318532d731a1243b0ff2d664b4aa1b56fa5b",9.647446457990116],[5137,"bcbd715a1559b2e590181ecddf2cc10ad6bbd3942ded386bae8365fd1f5866de",9.917710196779964],[5425,"1df11220a2c186dd8cffee8d6b586d193c7f1b5b541fc26b77f6eaa26f50a4dc",9.917710196779964],[10781,"6aabf9097553658f238fcbba475afb8fce706b461e5d7fa2c05d3e7369ce6cb9",9.917710196779964],[749,"e9265e50919b018b595e7531b9b3b6c19c641ae36c99c6bb6eafb3a0dc92e8fa",9.917710196779964],[16970,"30686ad62036b21072d92509cf46bd2158d6fb67ce578d5d07a79f9329b7b652",9.317957166392093],[16488,"2ef799efc88af15776054928704ae9aa25f27e5164aaa8be69f5dcb543ea7f5d",9.317957166392093],[16893,"3fb1c5c16384468347883b4d466f33b4074f598849d3b45e7b5bdc7bd7c45354",9.317957166392093],[5624,"74c201320c0c46be69288562379acca08e3e5496d34412237cff6ce87c8a86db",9.917710196779964],[23,"2ded328f342675d236c9be943d7297c680a5b684b5a128d439fa2088156ee0ff",9.917710196779964],[15857,"5cbea38f15e6d0a5c3e18ee27579e990c621cd487b90010625f6b3ff1e46fe6b",9.317957166392093],[2325,"7707b060e1a07880b5cb9ca15d811219ee892fcc8c217cc734d0316a8d87e2f0",9.317957166392093],[18833,"e3081866e233e212495f004cd85cf46fa7a643d0633eb8f5f3de360ec1259125",17.027642276422764],[5600,"d1c7c1e5f77c29489e3746a75a36b7b96569031e762a28357890e1016233a1db",38.0936729663106],[11109,"f3550ebd9437f0b1ebfdc4a64bb27a04899ef3d7c0071719185c8df073fd33b7",9.317957166392093],[15632,"ad8881710a40160f11167731c79a22ad84a2e259f1d21561ab74ec5fc018ae70",9.317957166392093],[19779,"bd5308ac018f25d64ccaebf295e5ef020782e7eac9877e99e9f22e6dd05d7d03",12.03183023872679],[17219,"fbf578755c535fcad3dc0968db9b9dfc5d9ebcc538811771ae4518fe8cb3874d",27.093534144161225],[8409,"d3dddbe478d656dfa5f11546b8b55be4770a0364e56014007d08fda703a290c8",9.917710196779964],[9560,"6957994badbee328925eaa80c14b5ac8f0318d199942250312eecefebf8a43c1",9.917710196779964],[13069,"8eeffee23dc6e72269808849e67c3856a00aff01405736b8feaaa0311df12daa",9.917710196779964],[3446,"ed66ee3c4d01d24b289358f40ac08f9a89add7b83130cc3c88e86db7624666e9",9.917710196779964],[7339,"4a4ebed3cd44b71076a21ffe90bdfebd56b51aa24c25a826cfef56a383cfcbcf",9.917710196779964],[11660,"c54cb635a8a728990cdca5f06b87b68767c9fb543ac47291b29482196e1a81b3",9.917710196779964],[3767,"0c7241bd1986647470ed16f2d279e53d71f5f98d9070ca5067701652d7582be7",9.917710196779964],[18242,"302f557c5e5256baa3bf248ebb22ebeb7200010e0d27d383236b83a62e101e37",9.317957166392093],[14314,"5d6c32189ba420694ae148eed6e8d6cec441ae1810f5e485f154108e6701488d",9.317957166392093],[17370,"f7dd1d78fdcf7388d02d2887463cf3a53c9ad510d16b5e640117a6291ed77c4a",9.317957166392093],[1487,"39ed0410df95f0520623cdf0a1291290905b7724d07b04bf342d2f3608ce36f6",9.917710196779964],[286,"5e94092895e34ac6a61358a4594a5b9de09d536e430e91ca5382f9292c5708fe",10.052724077328646],[13861,"99c04fcfa21509adc3989e44b208c2753d313b1b017020d7f342ce1ddccd2b98",9.317957166392093],[15991,"9cfefdb628e60daebb8d7787a1afe9888212c26b42355fecc56f95a06138a668",16],[10858,"e74ba7dcb623ce950c106f318df02736b6123625568182799e2a985434d1e8b8",9.917710196779964],[176,"a3c56a2e83edec041b798f53b85f584f6504c86fd38269c7832802ad0b42d3fe",9.917710196779964],[12421,"e019ce6bcbebd01883f31b78d847a8982074f9e66f0d94be31c4f2bad2c474ae",9.317957166392093],[5560,"74359efc42a65a89295755274787f9c66808a3e6f9284bdccacfc51c70b3dadb",9.917710196779964],[8508,"2ebb99bdc154a3949058b49a04a4ff7f8e2260ed0969ddc47b5a3efd0690fcc7",9.917710196779964],[126,"6377e84d95266e4729fd1ad2dd309cc2c0b8b139480a513fd1ae9ce5821a30ff",9.917710196779964],[7705,"de68b5bd1542ad93d98a50764984da7cdc33551308a7911a8ec5fd10876882cd",9.917710196779964],[17270,"6c3889be1a394469c654a61b90e28e06584cf3560f90aa2fdda40adafad5c64c",9.317957166392093],[19629,"4a60d4bc39e18f4b958cddc333eb82003055f4ed2e324a961c76b34e26a17c08",9.317957166392093],[908,"61de0bb6616f52b05685e52b8e9f2d8b26055606d9140d302977937319e1c0f9",9.917710196779964],[3291,"4e79dbca66205f69417fe404370ab2d24c375d3c2b18d758b89747fb813975ea",9.917710196779964],[15790,"f768f4ad5dcb5d9d1c14db5ae4c77b7c69db2924db9065ae300880ca4ad6896d",9.317957166392093],[4878,"8366e31d0960437aa410977370d825b39f3a051a862c4b7d6fc3344637caf9df",9.917710196779964],[2891,"10174cbc67fa6f8db2612c76e46dd7be98a6b6c258f2b829d6a5b08e024a31ed",9.917710196779964],[4355,"65ff26b4753e7ddb824cd9cb95461e91b49c28b0c0a14a25c86c2bd915185de3",10.052724077328646],[3045,"0d1fb99d24dc1df39ccf2e1964ac605c59269a3395b5d0b27567595b45e104ec",9.917710196779964],[10850,"0282d1aef4f4b0554075218ff1d5f683358c0e07e3418c90bd07a8676c1303b9",9.317957166392093],[10505,"37a0ab18fa32ef1c93a1dcbb1b630f4197c1cc28b214f5bc3c5144e3063c28bb",9.917710196779964],[236,"9dab46c9eef3e07750cd0e0653c7a1d68cc5a0a016cb88dee38f9f7ac6506bfe",63.625835189309576],[5113,"6eff2c6b1f10307d82755f3e449ec605c42aabf3d14d18a6eaf3091efe8f81de",9.917710196779964],[84,"c8ba30510e20fb808e2f2dc4abe5533b46915aa82fe7e3463ffc67db5ae473ff",9.917710196779964],[16146,"2fcd9d30f49d2614e4fbd25ea92a11c5a4aa032b5ba5770716a70b76d4721865",352.21768707482994],[3616,"030b59981fd2045b22629399f5faca45fbf717faafe3353413eb3473b72020e8",9.917710196779964],[11977,"dc4ada863af337d9b6a8fc06a49ab05fd3b08fba5c274f15f29e4dbfd7a573b1",9.917710196779964],[1396,"d2b740019fb71eea73b3f741d8c3778ac6e18180e11986d65e6fab0471a8d1f6",9.917710196779964],[17667,"0bfde1c814ac58359328e3b5cdb0169be4c331bd6a666f1abc269e20b101cb43",9.317957166392093],[19761,"a12faa1009eb7a4449f4d3c9ede3a7a0d69d2752917fd1ffa0a3c314fbb03404",9.317957166392093],[7340,"a14bc8355ccfe594ec66ff20a1ed4afdf749091314615eebd37ef3ecdca8c5cf",9.917710196779964],[496,"4df36ddcb63c789e2f7a6471571d06e61cb54e273a44667308ada2a8939eb4fc",9.317957166392093],[1059,"c6bc9254ad8bc66c426d7d801310f8db719d31d91cdb2a355953d175cb31ddf8",9.917710196779964],[5380,"bb821e2463403fa8ea558671382c3e560e1a6120a39c29565a8df8cc7e16f6dc",9.917710196779964],[9750,"2002ff15b58ca8cbfcab0f6c75bd0bd365bde515596e1e417a551f71cde002c0",9.917710196779964],[2181,"fce3b2ec55226ff10ee854d636e9ed4600f68ec6cf428e71cfa63301bf71acf1",9.917710196779964],[11964,"d45d5983aebb2ed68ab7481732dc19f65285eb9f16042358727829110d958fb1",9.317957166392093],[1393,"8b1ab9d09f2af610e719003683ed5dfb8307ee6fafbf63f059d8139ca35cd4f6",9.917710196779964],[18542,"5f200081558edda0d0c1ff7a0c74555063d0915d9a5e5871e950f6dd7bc49130",9.317957166392093],[17795,"7d32ef12c6e753fb34f5c25906e0ff80bcdcce5dde9cc3bf5699e1cb60156a41",15.944153577661432],[18981,"e8ff34e11f3fa45ffa8ce47cdb6cb0ee4ec3018f3aa44db63f881cd7ee0c2121",9.317957166392093],[9260,"a60ae9a09c00ec30f67522851d2bb1f72dc378cfb9b7616abb92cd194d8814c3",9.917710196779964],[10487,"615f6ca485554c05388eb8b00fba699aa0dd37b8e8609f718fda83f283ce3abb",9.917710196779964],[2127,"e60db43a19483b1499306fe42439e7020d4a2fac1eaa54d9588058c3200c12f2",9.917710196779964],[14867,"b82eecca2f36f5a9babf1df0d3fdef73eb2b2d0bc491d95dc2f11924173c7481",9.317957166392093],[3638,"c80dc394ed8d29cc320185105dfc11edf1db2510f86e7088fd2bff42e35d04e8",9.317957166392093],[1470,"93a5cc1a09aa7348d8c51634e8b1888b3bbe44eb5ec692f707372292059657f6",9.917710196779964],[9316,"4af1c3ac048b4bb757531406f72abc1e3a2dd7bc20e2a57d2dbad40c02b2c4c2",9.317957166392093],[4106,"8b17cf07d0b7ea6323229c02f756f1c3ea47bcbe92261585e0fbdd43209c02e5",9.917710196779964],[16134,"199032680fec6d02bfd21e2bc93d3a3dd4a47f505ae402935aa5dca1927a5d65",28.149732620320854],[3272,"6fc28ae51f7f93ba6d4029788bb6be64b51a3093acb869769c91ea1de74691ea",9.917710196779964],[7620,"74ef0f67f9a49a4c06e2b34c697deae1b287cf59cc23a49e1028ecc205091bce",9.917710196779964],[4658,"ba7230d2cb93aa1753d87c3205c96085542d27978cc9b628911560a1b1ec3ce1",9.917710196779964],[18116,"7a1db081626128e4af95382c427f2a707ae58bca343c9963f8ceb846bb16893a",28.29268292682927],[3674,"16751800eb2e1f66339fc55a1a0948499c14de7d463758191a052a42749ec5e7",9.647446457990116],[2205,"73080c0206764d04e13969f4f9ef9c8bb327107518f5f708e2710a1cd74182f1",9.317957166392093],[869,"4541c73357e43ef308cf2482bdff32ff5ff71b54dce46e1b7faff5e423271cfa",9.917710196779964],[3929,"3877a41979a5b8384453cf14726bf2bef3fd6308d0bb0e8df7d8b1918db929e6",9.917710196779964],[4141,"abaad5e47d42348cc11c0951720a02f605cdc8fe40e5f0987d829f1b4db3c7e4",9.317957166392093],[17211,"2a3746b1c83ebc41d284ffbfbf7e56df4605b8d491ab5e503ea4c48d59799a4d",9.317957166392093],[10827,"9b854e8a0bc14366b8a511d8ddc384a4930c3ae7882648696ebd366d294f20b9",9.917710196779964],[17737,"5ba965cf277040c478d2668cf938c64f2e92841c26b88aba8624be1bd6ef7642",20.106951871657753],[4158,"315519c17d631b48d4faaef154d2864242e2c66f20a6e169a451de4ff30bade4",9.917710196779964],[18585,"1cc8c2167df63441c3078f7e2a0953b468fb3af4678b8a0cfae041a6a85b432f",9.51504424778761],[15282,"6c63ad51b035584262e379bec37f37f744e9664b6ca81c9d0fce5deeea20b778",9.317957166392093],[14907,"1cc6a381aec613c84fa224aab5377ae466f55cf685781589b3ad91cc223cce80",9.851809304997127],[14922,"73b4da1b88732c2c55fd382fac0e730d579266570c6fda9b0e6e6959856a8480",9.317957166392093],[657,"7584520ed6d9df6519b177ee1396ccc3a7e632092cd8d488884359bf518187fb",9.647446457990116],[4373,"d1315178057528efe7c7b374b40bade7332511072e3e2ad55806d62e4d3e42e3",9.917710196779964],[11844,"62c4c96abd83bfdfe980c93bf2e3fecaae14a290bbc25d01c4d7831f00ff6eb2",9.317957166392093],[8875,"40e88aecc2d51670280825dd69bf42b2557b4ade181c793d293521fd9f1497c5",9.317957166392093],[13408,"f836e4d4c8472afc063ec3ea0481aa1416cd1f1a472f83d30724d09fbf5825a2",9.317957166392093],[4236,"37f532ab136dc3fb711e767add9481f469c891d9fbc8db072b69aafdfb0b31e4",9.917710196779964],[6677,"761c028e9ce89c1d5327aa3ea38df173574ec6f84a6987514a7fea17bacb22d4",9.917710196779964],[17005,"5657f520942b9145636cd85e54b7b814ebf72487ee30c4c651db2583059ceb51",9.317957166392093],[1438,"52928ed80fcb67d3236b86965d7c73bdb715b9a0a8a8530a7c625b770e2b94f6",9.917710196779964],[9970,"ed18a610b242c8e895590fee1f576e22f61e28920248b00228a9c60eedf880be",9.317957166392093],[9684,"f7014542aa399a25c2641166782ec96c765a4a94baa85b0f1e11fc0a3adc7ec0",9.317957166392093],[333,"4b8a8736a00e01800dfc41a3aabe597feb035981fb77656acd6b71c84a53cffd",9.917710196779964],[4467,"9def0515f59711299be1dc55e2b46cc9f59afbe7d4b05003c6d163d38c889de2",9.917710196779964],[14754,"bd7b3f118a7f6e19518136dd31761ad9648739e604c2091dc1ad56d78842cc83",9.317957166392093],[18381,"2c0e3fb0952b5570ff625239d45df097e6818d837f65ceb0b2d7ddd32f28f533",9.317957166392093],[10133,"de623240bd6614ce66d8c4f36ad08f60c639b070d85367c269966d5026c97bbd",9.917710196779964],[19193,"251379cd2ebfc91e4dfde1b47a4528037e9026c349868f451dbecb827629cd18",9.317957166392093],[18393,"77e7c24da368f392404c1dfc644bf924a0778a9905a895fcbd2f8e68555c9933",9.317957166392093],[13800,"b787f16aa66f6f3ee021b8babdabdeaf389378521e958046935c8536cf1d5999",9.317957166392093],[712,"7456a10cf27605262af9a6a355560aeb5e7c6edda0e3052b80f3443be8211ffb",9.317957166392093],[5668,"a302a67d930061f8a4969ad3e404527af013cd9eca48d3c08e1b552c257336db",9.917710196779964],[10523,"d845cfc1636443eee573027bc37d2d18ad2eb9dc614e59d0a07146ae77d605bb",9.317957166392093],[8479,"bb70c054e137b5f573eb055c3599adb48523d601e17e5f18f8bfbe2bdebd26c8",9.317957166392093],[15998,"4b07e876184265f62b3d48c7bb48ce3ac0b82f23994dc9041138810eb5778968",9.647446457990116],[18819,"76138bfde55d4486df58356f49bd6e2b64668b434c00e7189c3f6e213eed0f26",9.317957166392093],[19246,"4d039bdce762b7fdc299211f8afa31fb167336ada2b8c47f025ee62608ab0117",10.052724077328646],[7542,"3e6488c8dca82a3dfed3ead382001d019d9293374b273ccccaebe57870d18ece",9.917710196779964],[19022,"e2b3d611ecf6204143bcb1cfef08520bfb3e2170d0932b817e73ca2676f0cd1f",9.317957166392093],[17100,"9222e23b08f2a041876e467d0edf65cb39486260db3c5ce753cbfa62d0a3f84f",9.317957166392093],[3982,"9150c05afa290eb3f7c1a6c0781d3115ba968ded0b330d7e86917a4a439ed9e5",9.917710196779964],[7872,"d0296ecd0a6fc9420c2308e4b1f7cc8e08c602136b367d77aad539672ec46fcc",9.317957166392093],[14147,"963e07a1ff86de18a15783b0c9133663434096bea08bb4dd8850354072649691",9.317957166392093],[9278,"7c2f804043381e0a053b146a081af631d030b50df341026c802a4256ac91f2c2",10.052724077328646],[5025,"bf6f67433a92d8e7f9421172f5387869a945a09e29018bc9cb2aa6b639ae07df",9.317957166392093],[13981,"57ea965ee96aec0c3660f742f0a9c3be13679be1928d507f5144ba3b264a5395",19.80952380952381],[14651,"bdd3c1cce2e3cf4e81a04968855ec3e7356b0a628e77b3850167eadef71de085",9.317957166392093],[2466,"83b5b58f2d2c87476a0da290bba3d6a33ff8f667b6da3c61a50bec70152714f0",9.317957166392093],[6630,"117d3a3a6efdd6960dfd40163f1e5b3f0c302ff80a86e0c7f051519f063b74d4",9.917710196779964],[982,"f7eeba83839045800e62769b159af529236b2a4a82d9234c791ffac650fe50f9",9.917710196779964],[4041,"949d3ef065ca9eebf3565d7cea449c185d9556665b8d50f2e64260b4d6b57ee5",9.917710196779964],[3747,"eb924a8ac0df8c513cfdab808c2ce3660a76bcd9c79dd2db25c67086694b46e7",9.317957166392093],[4363,"aba5fdf1afbe1a774ae32e7f573ade391e613b8c5c76575e5402fb1e650453e3",9.317957166392093],[4756,"14189ac06ae3232de8f3e272bfaaa1358b39b0dfcb0cff70bb359ec1523c9ae0",9.917710196779964],[4195,"636f87fa600375df68d757c415c0869242680294b4dccd54bee7f526b52d73e4",9.317957166392093],[4605,"51c5923dfd715bb492d7481a48915bd143f88a29c707bba775b1d1cf96e798e1",9.647446457990116],[716,"79c743437760bc9ac932efa658959b136e4407d134e2cbb6aea638e202ff18fb",9.317957166392093],[15385,"ff7b16e7b9f91f90ebe07723387a97233b78db5088562991834cd445196e9676",9.317957166392093],[16937,"eb8c533c374dd7ca04272b29fc88df6501035678c5755075a2c3f04694ba5353",9.641748942172073],[18692,"5bb484fb906d8c0b2f559b6780012b438c8e1e4892316236e2c003030e169d2a",9.317957166392093],[10930,"68072c3752dfe8edce0bad3ee9811492b8067bc8dcbaf093d6bbacc6d53781b8",9.917710196779964],[16021,"3d1151c414e64b4ea8e061c8ab4cd18cf9f8cb4f07ae2efe53a88c0df4050268",9.317957166392093],[14070,"0f2493493e50c15759c895663e8c08c7da35a6426368d505eecb3a2c7dae4693",9.317957166392093],[13361,"db1702d158c74da986f22eb9bcdd65ab23d1ab243141096c114e8e80984242a3",9.317957166392093],[2920,"c32640059287e07c20d927f0c79e6cad859a999431437556b87320da2d55edec",9.917710196779964],[8145,"ffcb9b6035014c7297d4e2ff1fbb9dea976490d964f271e674e3cc479ef167ca",9.917710196779964],[5258,"93314285605655cb668e74c32488aa2a869a914b6fdc4b50f5de2d47cce5a1dd",9.917710196779964],[16615,"8bc6e86bfa53d8b19b71616572995eb06cb534c067fdf052410a09f6abc58a5a",10.052724077328646],[18941,"790d9537496b7df4b53d25e392fb6462d5bc18e572380c0bb8c567d6d35e5d22",9.317957166392093],[6068,"80a8ceb02db1edf32b4ccf766be28bdb873935ea63229575edaa44d82fe2a1d8",9.917710196779964],[7511,"c82ab073c73a377f7c13f665f56b97dea812756d8f986c7258081dc83013b0ce",9.917710196779964],[13770,"d1dc1b5e92f3f3fe21422a4254d3603fcde991131e39bada8dcdf7b004cdfb99",9.317957166392093],[6116,"a41d303fc3c3645f653084318c8e008678e63a2383f24844704120b265a153d8",9.317957166392093],[18228,"583c3504778ae24130a7d9a5963500b0bf0f14cf19b20f7b027feab783216e37",9.317957166392093],[8263,"15edec71d6c4f1f9f26469ddeaa92990ef1668f6d459dd339c42f6e38efd95c9",9.917710196779964],[10447,"180fd14dad1d1958fbf62e1a9efa51abb5dd622577790b962c98959875af70bb",9.917710196779964],[4885,"07a80f6cbaccd57398f7eb96960744f95a84aef6001f1d4f581ef2bbb00ceadf",9.917710196779964],[1110,"94c2daa57f7acf4d0a06eb33db042c1f9fafbd18de42ea155ed937c0f6e683f8",9.917710196779964],[19569,"6eb424d77c86421daef772c129e246ec1195d0baafab55e621d57650eafee20b",9.317957166392093],[14309,"ad52afd6f40171c27a70af0c495903f73affe8cb49df52b5fad8abae09d8688d",9.317957166392093],[10778,"97f2f21a91c08d522011792d76c62f19084d5c808c23e61c2ab277d6d7956eb9",9.917710196779964],[8415,"0bbc69bacaa57999622180e5da74a5fb45dc50dc2e4a7d6a61a98131a49087c8",9.917710196779964],[13146,"9360c787a01dc1e33d46b90257c658b4f98841370557ebce78cc2ca83d6a0da8",25.829596412556054],[8612,"543458cc680be6ea239dd1813b9dc81969ae5a01a54fd62a367afde1c66056c7",9.917710196779964],[11537,"98cd98e785c9a8c93e0e1b28ea73fc29f2e76c2a3e5448e0ae09936437e54db4",9.917710196779964],[10537,"4a2b58f07b1ca9bf4fa2db8c40f1041018c3ea0b0a067f107bf2bcaa3cacf6ba",9.917710196779964],[492,"b5bb9c81b5b9e28c3061b7ab22f89fd2afea126ea2ce0075b3d14012e7a4b6fc",26.00263504611331],[16237,"31767f42aa49c11e4f1dee5b28064e21db56e87094e9c4f5e20713c2bcb4d062",9.317957166392093],[13610,"2904e4eefc5b4ebd7f213efa77f6cb34107ee460061cff54a05dd85eea8c359d",9.397642257991386],[3343,"f79dade4480b43da0016160ad38c565b801a8e894926404d90087131d4210bea",9.917710196779964],[5758,"1f8cbc4efcf04495e2f2a2ccc9e93b1c62abc657bc78388367758b448ae2bada",9.917710196779964],[1720,"ebc12e0746939a8cbe5cd7fe6d683f2b259accce7d1fa3178d7831a8fe21caf4",9.917710196779964],[2433,"92534c868752ee69424c10b117104c63dca1407c73b71ea5bd7477681e1641f0",9.917710196779964],[19329,"2d979f70f3bdfd6502a60eb333f41af6c650cafa4f3804892dc46c2ef9fb2714",47.2],[10069,"b60b1d801eabde0284ca50c0c261188378b4ba35bb8deb32ba97b4e31daef1bd",9.917710196779964],[3948,"7db56eb563f966a7a93173723e568559b27ddf1d0c2746b9fcc04d925c2802e6",9.917710196779964],[16829,"bd78d187452df65a21d4ec7e0a021b9689742ace28a414d29412fb09002fb655",10.052724077328646],[5688,"5e2bb46fefc7ef56b0aa312a9c392a5013e671b661a4437807066fdf72af1cdb",40.71301247771836],[897,"37c4c9e14078a1913c99f44bcc31b043383d9a6627a44f3e622f0447d987f0f9",9.917710196779964],[1259,"dc446efb7f45727c2e3d36401a33e61df54485d51b5f3ec6a6b8dfb9ac439bf7",9.917710196779964],[16279,"dcfb969e7319d5c3c70b5d35afaada2cba6cb87cceae65b2cab3b65e7d889d61",9.317957166392093],[11161,"468880dc2e349fd5cfbdbff118cc6f378df51a40307fe0c9609c0030aad0ebb6",9.917710196779964],[12647,"ade1d16b0266eac025ed78363a0bc1985ce783640012905712629c1132a3f0ac",9.917710196779964],[1235,"a1e36fd2d4ffa923cffe54d2af20938ece5affe4994ecf8d753476ee4ad4cbf7",9.917710196779964],[7600,"32a973fc8e4b4b8cf0419351274d3de2e374d38113d02e56c5eee1c8861c2fce",9.917710196779964],[13698,"924d7d66f308f358392ea2f2115d0c4c0078b73cebc2679905ddded498ce519b",9.317957166392093],[16341,"be9f0eb4368dd92f2d0011aa5eaad920b5816e0d083592eff09d49fad8dd2f60",9.317957166392093],[9408,"4cde8e28b847eefe94ff5260fe049797f41c4cad3d0a67c9d93c3b955de33fc2",9.317957166392093],[12951,"c5a6e9dba82da43a519fb9e17e8bafee8c5f967082649c9416caba7e4f14e7aa",9.317957166392093],[2234,"5450a2d43cd9e3be37b993f9c6968192a9ec6f285942c4dce4710c50422f51f1",9.917710196779964],[1803,"a91e40dfbcc3d4fc56eb9dad7a6db9a29d2e68aeb78542fc4df5f1d7664439f4",9.917710196779964],[5028,"10551fec11123d15c850a59eb91a47ef090adc26137728b5b86dc553f7c0fede",9.317957166392093],[14092,"19bafdd42b855b02e919c097aaea4238a9e061d887fe2bda38411c43508fc092",9.317957166392093],[10848,"34bdcb87b1cd767cf03119a17b4467145100583505f056179fbae778abe503b9",9.917710196779964],[7868,"e1573440a42ba6b98d8a47e98fd91323a09f01f9bee43c237206f544402072cc",9.917710196779964],[11416,"3d60059576d7988bf958d39eb226d4600355a418545b15e16837babcc9463eb5",9.917710196779964],[7099,"c752519965d5ecad07899136fd5be104acb2f2cb013ef4bfbba7842281ef5ad1",9.917710196779964],[17968,"935f69ac024a7e6400784cb636e0b8165681fdd47b3263c7c7b2bae82efcc83d",9.317957166392093],[3006,"8797329216f8a178a56bc6b38587dc2fb433dfd4a98fae69586335c5d92f40ec",9.917710196779964],[12021,"c4e457ed1110a21ca62f3f5e395f6412c2ce64fe936f77aabd21b4ab337634b1",9.917710196779964],[18637,"a8a3ac5ed0479b09da53fcf382431656bd2f017e64ce968a25d22467996d4a2d",22.151515151515152],[6161,"79895a16566cf48a75678497107f48620ca7cff0edb1124c4797b5dfdfdb13d8",9.917710196779964],[19547,"7a1bcfd2a98a3aaac4ad6c44318d8bd4292cd4f343a21f7b8d79318c7f15bf0c",25],[5634,"c27f144309e83180dbe6f66048bd186509624c3892bce8ecd9966126d2fe6fdb",9.917710196779964],[3105,"a78a310ee758352205328310f7061ddaed8648ad028c867a895cc2953a869eeb",9.917710196779964],[14226,"b698efafa4f4773342466fa8ea1f0be07ed409d79db6bafe8c5a8719f7b48e8f",9.317957166392093],[6858,"d8a3087fd8d5315adbe1dafecb55a9b008615d463f060339c9772713e7c1f2d2",9.317957166392093],[4107,"3cb00f297bccc3f562b4edd4e7c8dc87bba9469410030984909369f0bb5801e5",9.917710196779964],[16315,"bc7a27dc346dc5bf2cc41be7c6cbce0a22310d17c0126c76f966b8d2cc8da860",9.317957166392093],[9096,"6c5c5c9f22b4653f176a71f2fdc946e52a0107cf227c1470f3990ddb478a2ec4",9.917710196779964],[1724,"3217f19884abddcb72b4d7540d0e7f35b59cc3646ddb3c77278ae5530ee3c6f4",9.917710196779964],[3629,"4eb1677337df8cde795191e876fe5935a9c7215140f4fa2130d64ae9847010e8",9.317957166392093],[7110,"47a2b76ecc2831ff42056d74ba64cf10a72b07cd8c0106ec6f8d8e5fe85c47d1",9.917710196779964],[15678,"8e03346e7778da2ff3a37904371e32c343d9781ec8ec41853501c0218a96d56f",9.647446457990116],[16119,"e043278652e9c475b36df2ad409d237cf3714c020312df686a259a628d4e9365",9.317957166392093],[16180,"1e48320a2656f324ca4911004401d90aa90817e9198ebecb89cd131c4b4b6864",9.317957166392093],[16511,"7107404b0806769dfdbcb07b2926dfc9526603d21836c832a906994ee19c045d",9.317957166392093],[1680,"319459962610b4366b2f0ccfdffa2593cb120196f40593e4b9a15dfc8e340af5",10.052724077328646],[8724,"f590d47666678cc00bbd6baba8c6bc0f488f260496210032972ca66b585189c6",9.917710196779964],[3662,"efe3039d527d02078d9a98ea8ea7ac6707baed8df8c6683b2d176a01e705dce7",9.917710196779964],[3146,"c5572383da7ddd1aaea8f1e8d767c05708caa71ac64d3c17c63f5ec5edf765eb",9.917710196779964],[16453,"544c554a2039e2f9863eb5d2aafa8b232b25e387060c6916b31b13491117245e",9.317957166392093],[4767,"abb462c284c0522701330a120bfc3983f49d356dba9e88d20922f45a571b8de0",9.917710196779964],[11521,"19d191eb21776313ae675e6cc208e3ec61bc74c2d8738c6c4ba84363403662b4",9.917710196779964],[18357,"7fdb8afb378ee47b31673cc0fe88fc8dc4673bf1f7e987dd8d991d0cf2769f34",9.317957166392093],[9553,"2efae45c88f114f2f980f2d2a0dfcc9906a09219cecb1d53967ae5f32a3c56c1",9.917710196779964],[7507,"f3fd9648c59100b776cee5e9129ca4dc3f2e35debad743930acf3c31c6dbb5ce",32.3006993006993],[12,"a9c5c7dfcd55c829e4c0709db8d0c6060a25f6f3552d2bba8710dc3953f8f0ff",9.917710196779964],[17195,"2274c2689fdc381f5448c0953f4ad524131e3d2b5c6cbd14084845999211d64d",9.317957166392093],[11785,"af6507a71629fab95c8efbd6342463e6d192a82167232a713b53db1bafb5cdb2",9.917710196779964],[8948,"e99021e4ebb231c9ad8b8b7afff08931cc7d9c6ab8951b442958c9631ada20c5",9.917710196779964],[8717,"a9c7978fc5d6b13b13b5dcb5a2aab271f364f59e6e5a829d9909484dc84a95c6",9.917710196779964],[2218,"0695ec885db7dbf497f17173c7659478ff6870f9f4072eaf693da528dd4564f1",9.917710196779964],[10525,"e62a958b977c387f9f9eea83b3ca561a368b4a787acd494e4f2db144282103bb",9.317957166392093],[11958,"5f962236a56fb48393858f947a59c552ba48d1172abbcd810d8bb1697b4d9ab1",10.052724077328646],[10441,"8192550ddcd713ad6febca4c7b2c4e8e096e785e429d1ae1aab89568e8ba7dbb",9.917710196779964],[6528,"37ad33902ccad889751eb1d17cd3a01717ae46fa72f62ceae61987eacc063ed5",9.917710196779964],[7332,"450ca1d414d3231a57abdef58a9f331138dbb3f2cfca0a1ebb45ebf7a116d8cf",9.917710196779964],[1004,"8f239a022bf64c2c9e418cb5724dfc28f96e33a31141243329675a3d9cde30f9",9.662745098039215],[12598,"dabb1ce8b4b635569e112ae2ecf4a813880b03eebf8a9ed625c3661e2b7549ad",10.052724077328646],[15474,"98152558608bc39c857383337b753fdd426a619ca870083629adb3e0eebd9774",9.317957166392093],[18130,"a49e481925c1bc300284b53886a1160173a31a7a7d713d9883e8ec5867233a3a",9.647446457990116],[3988,"5b248d1408798dd1f18479a9314e44d52aa2e40c164fc7647ebed922a020c9e5",28.06746987951807],[7813,"efebbca752b9576e532b19f6d7ad3de3b4ebb52beeea10a22e96ec8af01daecc",9.917710196779964],[2639,"2d09c6f14ce55d635c1f7c55f7a4dfdeb945407f5fb9fc46de47458d1198edee",9.917710196779964],[10560,"fe432869ca1d882b441a735a16b190ef71e97e3333011e47fc9bd027033cdbba",9.917710196779964],[1027,"260e6710faf634b1cb3a4049d52d04e41e896382b3eed10bd3ddf1861d4a15f9",9.917710196779964],[7266,"a2ecb9a51e4b4ca743b858b04803f4ffeea58fe85d1fe6b9ad62033d65733bd0",9.917710196779964],[647,"31d74bebb7ab017cea556b4f16e03f18db0e64e93e3fabb069f1cf3bf0969bfb",9.917710196779964],[10660,"b5a1a70e6b1f65835d3a8ebe1b1c8da8b27e619fe91e6a172e40172ac9954bba",9.917710196779964],[18147,"9482c6603839ae5774de1abc7abb88a7b58b5615788e0ffd3136a19ffdae9139",9.946524064171124],[9417,"7edbbc416181a824b5ec6485661edf1e7357e1b11902045fdd7990d2aa6e31c2",9.317957166392093],[9207,"c8375d16995e5fbbafe2190a49ecd1fcda36eec84c213b3a12dc103dda5065c3",9.917710196779964],[4522,"a3db9c8c1114ebbda98e72d6a48ada22a3ff8bec6e951c583d7bd521074b36e2",9.917710196779964],[13416,"83e7abf89385c28a5fda27e36e503b421b91469c6f90836e5a9d23c3018005a2",9.317957166392093],[4750,"c9041f1426c60cde71fa70aa9cebd0cabc69c2c05e722eeffe72bf079550a4e0",9.917710196779964],[1636,"a56a70dcde46129ba3d9d9f285c9a31ba7624f3a4100a3a47f7c46dad21c62f5",9.317957166392093],[6866,"fd01bb230e34558bf1c4c4d339ade1f1370db3764f52c2d5430746be75add8d2",9.917710196779964],[3139,"0e77e125c7b5d8d3746cdb9760e71171a6bdd36cafff6c6fc0a2c5ea6b336feb",9.917710196779964],[15276,"d9421a9c710f9ec2fcfbaacf7003bef6019a4b2ad28ad0f99ef4bbfd185fd678",9.317957166392093],[13444,"0d053a5740f348669c10b7442c7e72cf95d17c84bc3f25029b4f3613857737a1",9.647446457990116],[11367,"cba0a40c72570e6163146a1c061a9054a2208aad3bb7ac395d6b777dfac698b5",9.917710196779964],[1907,"3549482caad0e837b4e4230b8dea7e4bc871add5e4b63ca8cc20a9a8faf097f3",9.317957166392093],[19118,"5343ae08685216e7e1d1717cd17ff6f6c819fc548ecc6133d21118d3e0a3b91b",37.936395759717314],[12568,"495c89288e55513843300c0ef0a8d3457d3907d3f0c3d5a042b94057450f7dad",9.917710196779964],[16766,"369941fe2aac68a914840cc3f1674c0b95ab1548040b0a57ce7b594871f11b57",9.647446457990116],[151,"cce348a76e885a682809a32d29b17b2f4a1419363198fe5eda21b98e9882f8fe",9.917710196779964],[15153,"a9588bebc19ec3a123621c1f4991ac2e3b0c24b5db0e04398ab734fb9ff9717b",9.317957166392093],[15780,"57f040f9515403a2c727827ea3ded1129c7e98d1bd32065321244c10aae1b26d",9.647446457990116],[11708,"f76c2d431c169ff7c18d499c06d1533ca725fed53ec6ec281f4852efa84240b3",9.917710196779964],[14769,"9583b4cd5a38a290e2ce4b90a0da57916fc97b59201ac2ce26504436c6cf8883",9.317957166392093],[13622,"47ce6dc51707ab4236b50b9d9fa0696343fd7cab8b2422a694458517fef3e29c",9.317957166392093],[18308,"ee8bebd597b056c13c1cea0a8d02693f0a387f4d9dbf365546b8cf31d9d9b835",9.317957166392093],[13176,"05e619f0b3e01fdb2c4e2d38bb77919c047ba459f580ff93ac9e0aee32f371a7",9.317957166392093],[9148,"6d9530013dd0213affb577246d035386e6fb1b9e19630ce6eefbc1116cf6d3c3",9.917710196779964],[14684,"9be043ed6315757a1739bcd6c822393d0fa128340e8511e9a52015fe45c03185",9.317957166392093],[958,"7e169f1804138f0155bd3f2455e384c85fac084452987477beba1344820275f9",9.317957166392093],[5490,"395fb6f14ac73d8bc4c713205155cd384cc67647341e00b2cedc860e6a9e46dc",9.647446457990116],[3963,"8c2196dd2d322f84b0f871602e07b0b0feeb0dd02316b0d5ddb7c634814bf5e5",9.917710196779964],[9963,"fb536b732aa4d6cb7f3e73625c43d76054fc974b7e036f0eb011c799284c89be",9.917710196779964],[12128,"d2dd8cb725932d23bdd37cc27b85c8337b8bc1d9d2b97b80aaad9c2653d880b0",9.317957166392093],[6226,"76599c8c958f2d57a8149f88eae0130a1df23e89c1f33057d89d4990b2d791d7",9.917710196779964],[13352,"4225705f899b24f99d25f180e584c5b181040e3cdf6b97ffb222fee5caa76ea3",9.317957166392093],[6588,"753fa12ee401fe466d6e8fb882274a34cb74292efe1978da20ea16bc012bbad4",37.220238095238095],[18768,"1baa7e3165078422a073daeb86eb1099c7984dfdee5ac66f96253dc500101428",9.317957166392093],[18565,"cad9c73671c1a085ad4cb8c9ab7fad1d734bb8712d909172ea2db9343ef60830",9.317957166392093],[3722,"88f7e9ab03633586b37f57041137f4e17e480a21455430601cbf438b245e70e7",9.917710196779964],[14881,"f918426be750538ccb3ad1f8c70700dd36d2607ea53a6c86235e988ecd082281",9.647446457990116],[12275,"6d972ad55130a9f2fd4ca7239d341651478321a5fa6e9f9425c30778e7f271af",9.917710196779964],[14211,"eb95dd816c78cb958d7c1e6a236e0fc40fac904a3f4e61c4f0fef7a243a2d98f",26.52017937219731],[3566,"6e7f873e686ca3c77be58f30aa0ed1d14e1b074cb7fb9390d19f45cca1f27ce8",9.917710196779964],[11085,"b465dc44c14b3aa58c4acd5fafd16caaa464569cfb3e4abeaf56ec4452415eb7",9.917710196779964],[9662,"b09218b4454f67befda5dd53d0c9b77500d2d377c1401e3dbca4709b856aa3c0",9.317957166392093],[853,"044334ccb12b67091acc4f9c481e36df50bcbff39f5fb277b50630ab49d731fa",9.917710196779964],[9050,"d362f059d0cf00051fd002cfea841a3a4f8b620d98f23baaff8956ef280d73c4",9.917710196779964],[7475,"e085e3ce622af010fcb54f94b3f5cc718fcf23cb59211ee44e26b50ef602dfce",9.917710196779964],[5452,"35e615f4b709fc0d5d2060dd3c04c37d65678b6d82b4abda1ede81a2bb5079dc",9.317957166392093],[12011,"5591e97998a94c872abca008d183e7abb1c2b07090108448e581e2111c7e41b1",9.317957166392093],[2692,"6b419f38939730d0ac1d165e25d22fb63049ea6c066097c7a3185d1367a786ee",9.917710196779964],[11901,"81865ca6858ab480839f5dd658aa2071991a82f9b3b1363991db534eb51508b2",9.317957166392093],[18671,"e5fac35a3338103f2dfa937d4b93bacacb180d7fe97f90f3a33869466550c92b",9.647446457990116],[16938,"73d708915244dba5c9285371438c880b2c2de2709bea0aa15753489df4895153",9.647446457990116],[1034,"c4ff92f7fd74bd91c50d9e851aba2dd9cf653f266995cb7ce21f899cc22a10f9",9.917710196779964],[4032,"49cefc2c7522ddf2bdfdf11d736493d4aa14406abe249855a628a498a2698de5",9.917710196779964],[9480,"c4295df7b112fa6d30b5cb7593aa51fa835b5418edb51c571c0b34e892afcfc1",9.917710196779964],[11562,"c1b7f9228177f7260d564b2a9e3a436ddac09044953f85f0ccb33caed3a62cb4",9.917710196779964],[4557,"09a6946c2964b0fa412fad686d5e892ceaa7441a75d8ba834820fb94e684ede1",9.317957166392093],[11556,"ff0386440190b7f841a80b9010c6dc4eee55a9a8088e8f711a3c945a246032b4",9.917710196779964],[3723,"a448c47a37ac138acac5de113d12ca9515a9400143634a1ffa9a5abe744d6fe7",9.917710196779964],[1327,"4bff636ad2db328d4fe64be3ac73f4246edbfa7f4f7946966a454c3163cf3ef7",9.917710196779964],[13311,"077dca40936a060929134fbd62f2ae40b86313806ef93402d0e0383135ac65a4",9.317957166392093],[7096,"6ab0da96adffd872ebbb28c412dd571f3632ae47050a4b473851982ad02d5ed1",9.317957166392093],[14674,"53b73577064aae6ae8950fe767924cbe70e26baf39435e0c73ec911488245485",9.647446457990116],[1616,"656e122f331c29b902b3fbee8a9162aae04b8682cd8428d63f077e339d1d77f5",9.317957166392093],[5509,"7f1ccbc4a323b24c685189e03e2b1a0c183fadfe64995ac4c833b5f59f0b29dc",9.917710196779964],[14541,"3da05137b1f0708bb8bf0f413bfdcdc4476fa4056b4b1885a2ecfb2dd8b35588",9.317957166392093],[1824,"3abb797f2a79107da915d1e324200013df82b90e2301a26b643d6ff7c70a13f4",9.917710196779964],[18201,"393595c3ba3804bdde13ca7f9199d94a6efc06cae7ab108139f1031499981838",9.317957166392093],[17963,"37ea47751dd05f7766f81ef4626d4ccd4798346902548e04a5820efda6dcdd3d",19.211881188118813],[18658,"cf84c8f4a146ac6ba6aaec99164ffa86caa56c274776a26ee04eadca82b0642c",9.317957166392093],[12080,"fd0273d1f87aae37761cc13874541f1756a6a74c3400a2226f1b90e886bed3b0",9.917710196779964],[8928,"67c6885387c9334eac50c80e8c77c84c0f7b2ab12b71b168955cfa5771f64fc5",9.317957166392093],[11931,"8bb2b7ee7e1121da156398dbccdb1131214d9dd60c791b31f72297b2ad7bcdb1",9.917710196779964],[6655,"c391360cfc1d40612e3a533cb8de09f126c943541084d582a4437e14ed1949d4",9.917710196779964],[12762,"76938f114809ecea294b2f9e1544bd118c5cc67d0e95ba454b4005bf4ee527ac",9.917710196779964],[13664,"a9169ee8672b27342ae01c93481fae86980beebba9c4bec67ad4b8e1f130f69b",25.401769911504424],[10663,"c92e48e41b8f10ae22d28e7814caf480a47f45e0eaa72e87dee5f557f6b146ba",9.917710196779964],[12333,"fb0ed7c2d8350a01c3d17a6ad024ab5891257a5144fe11d2fd4b0dff69e701af",9.917710196779964],[1159,"af558d3effde071d9388ba3e646ed7a891a7829180e343dabc100a6fefe340f8",9.917710196779964],[9277,"1509ee3816742084c36297416bd10703f0df1b00cc5e68941acf64078fdcf5c2",9.647446457990116],[2111,"70d01d76ac57c950e260f8f7653ed4b32d5efc23e29649d420372b37361f26f2",37.936094674556216],[16730,"272410e4fc6852fd939bc21b9b007b12e922744fe1252443c148dff04c49cc57",27.851590106007066],[9304,"0d2547dcf9017e08d03a23e04eb38d629abf06ed0d10dff86e7507d4b4c6cec2",9.47085201793722],[3415,"06db7f3bd0b5b6f2dc411b4f6682ae70ff25da38356a93d7526b104ddc2592e9",9.917710196779964],[7080,"0f4c94b8a2b84ec09e691dbea7d241cdfda2489cf2c6e4a7614eef59407e76d1",19.20855614973262],[7054,"f80862684ed3e3fa92ee0d4f64ffe4017d35b514bf7062de3a94fc079b78a3d1",9.917710196779964],[10669,"20fa3743b7690f376a1f067568cd1da782180c7cd1dbb8874328a3068e083dba",9.917710196779964],[12027,"c67e63ebb186dc9e140b5cc028319061d2537df4df33d3c227be4e64b5a121b1",9.317957166392093],[16780,"43e6a1673ab7863189fab0b2027abd10ce663984f43f8a0ce45125ef59fcd256",9.317957166392093],[4294,"eadfc8bc7e731177e0ddd70319b2bace7fca2f9e9d1309f87e3ce0eb5d58d0e3",9.917710196779964],[6121,"3801a96d256a9e9bcb20c167e7a31ff6c512d057afe86768452935f8cc954cd8",9.917710196779964],[10139,"02bca3ad9b236c47d3958527a65b260e6ffe16a4007c587e9396368dae8472bd",9.917710196779964],[5424,"b4262cc4c497f6b3e2c1f42142a5c15b8ff9fcd3e77e63aa3f2787d46b18a5dc",9.917710196779964],[18346,"b1bd9d1750fa823375cb38b61961ce4b1fc44fde41b1ab76087c71c4ff2ae834",9.317957166392093],[8468,"ef9c22945fd5954b541118f27e62c3b593b6f31685ad021737006876df7c37c8",9.317957166392093],[14146,"4c156f0988e10f5245bc11e5d3e27cf176870fb57dbb87bec36bfdf925419c91",10.033508207818581],[9286,"75785dc6ed8085ec0504d1ef38dda2bb30a7ec70242071c2e3cfedce6d46e9c2",9.917710196779964],[14545,"1c648b69a1c758734e6485cf3d4a33b8b04a04854e007907594b255cf25b3a88",9.317957166392093],[6089,"ce897dbc3bfccdf7d84a55ff2cc5da0c4c8115cafc473c1f8aea865e4fd572d8",9.917710196779964],[16085,"318cd39f703cebff5c90e24b1acad47a2df387d7c7685aac78ec3dfe18029d66",9.317957166392093],[976,"2ba5d77ad850527cd94d629b7290e2de1af07625c1e142ee9b15e1cbdcd958f9",19.631858407079648],[14017,"0a194d6e792525c936c115ab6f7e2f9ab1758325f47f34644715669b4e427f94",9.647446457990116],[18424,"46eead5f0a276d46917643569444d62aafe471ff2a0a3a516b839f3913e62033",9.317957166392093],[13272,"bcd15ec653cc5998ea259c64e39388834e65fbec7e232376352225908b8c30a5",9.317957166392093],[6916,"c1f38ab1fb2944fff3d4c3253ee05d6e45c33c55e7bbdc679d7e4511220d7cd2",9.317957166392093],[14879,"6157f827fe4232453e85ddf9f025e0843778747eaedc8b9c4dd196ab664b3381",9.317957166392093],[16872,"55c15d8177ae026259914ce25128aa276091b03c1ff2f66c71683368b3a4cc54",9.317957166392093],[10609,"ea1df97ba98d2d6c3a714b99b7d35e1845988900a90e9d32be35ae56cff39bba",9.917710196779964],[17614,"ec8ec5d2268cc83bca186ebc23f3db427d03e3a9361536e8c1b0e0aa61b0e944",9.317957166392093],[2406,"0bb92a17f678bc6d41f809073daf8b5fe5b0db79e46a61870e49ad5d9e7870f0",9.917710196779964],[467,"d31a673ac0b1712a8d74ac1b28769aa632a2be29a7a497d370da9ef6b399ddfc",9.917710196779964],[14164,"1561533d36bc3871336b8911ec2daada5812521cc8e21158956fd32c2f881f91",10.04594180704441],[18923,"fe54c6ed42715d59aee8e9235e6efbd8c18e8e0ad11b17c00a49e72073b2bd22",9.647446457990116],[19361,"674c819538da0c28c374652d4be1d9cb2c21604c1f9688b94723a1f081cf4e13",10.052724077328646],[1826,"b34d4afa2f682bfa585925c955024fd92c197b78ca2b6a8bd09281f2cc0d12f4",9.917710196779964],[11892,"865976fcca60d510e6facd15e8db77bfe54157634a4be3420649d379946f11b2",9.317957166392093],[15965,"60deba671f0d9c3ce5e2a940b0bdd60a5a79dafa1ad86878c348ae9d6c647b69",9.317957166392093],[9887,"ff99751c97c3d256097c0e2d5cb58d708cc84b465652f97ed0f360fb938b04bf",9.917710196779964],[19131,"ec1fefea6bfd54279cd8673fb64a9c9d474727e73c01c085b4882f931da41e1b",9.317957166392093],[7934,"ad915e2612229bd5ae105f34c423c760dbfcd9488d97a7bc6651fbc9d377fdcb",9.917710196779964],[6666,"0cb896ed7039a98e999e67204eedc459070d6930f2e6da491afb53b4445a31d4",9.917710196779964],[18367,"d7e76617e7b170230cfe09f34b2e2a95005eb398be82e19952787686089e5334",9.317957166392093],[7217,"3927b65beac6b9f22a917e5f013b6758e2da651cff32a6d48dbcfc30fdac90d0",9.917710196779964],[18403,"b8eb9ee9ee37db09332c240f798a12353d741be1b98f9a3963f26145c7145533",9.317957166392093],[6072,"24504376ff551d2d4abf4871a80320a031f810d0e52a5d6bf886734053f398d8",9.917710196779964],[5935,"cbee5292d5e6a1e723413e82c6f50e60b730fc58ef70d01e2a6e2a63408f78d9",9.317957166392093],[6175,"db6073c7ff73f41b3efdb434eac9091dfd67b4a4f77df44286ec76da8455f6d7",9.917710196779964],[7589,"191e00623ae79ccd050a4e8c6e4a8bdb453b6759ff326bea4dbf8ebe50b240ce",9.917710196779964],[18950,"01b4a1fd3a0a6b2e0748212a59450066f8a34ffe9e8f0930127aea93bdd12222",9.647446457990116],[8643,"316c4bc3e326e2b7db1dfaf20d6161030d1c9cca13ea151acd5596d35be11cc7",9.317957166392093],[4566,"c5685c984bc33b16e18e5f0ed3c4456d92b0eaf5de074b3c6c177af11710e1e1",9.917710196779964],[5289,"88f7271922c63a123731976da1f29ca1ce84167431a25bec142c7d7d049075dd",9.917710196779964],[19610,"0501586d3f2f2752e1af83bb7d60af1260782c89fc0509cefe935812ddc87509",9.317957166392093],[6953,"9c41304539d7998142bdc55a75c44b5bf61d10cc68a5bc5befc5fd344fd03ed2",9.917710196779964],[18281,"1494bb50188e83ed47107f8280b78cc2f5b61fb893001fe355489fb1d33e3c36",9.317957166392093],[3130,"0ca3c569e72f901934bb5ed644cc8c3de91a382d23c4cb5af6a7f03d75f377eb",9.917710196779964],[17543,"1dd39a9348861a23ec6eda8e175c638678004352db27033f250315412e5aa846",9.317957166392093],[12050,"ea37177848cefcd9abc351e34f0c30d93b39664b20769adb259baa64b3cdfab0",9.917710196779964],[7015,"207256d5a14d132a196b379b9a845a7cb947cbf647616fbe3a1d8fa44454e9d1",9.317957166392093],[12105,"c31c883259f0d8a6a265482ff97470f485268eae03c64c42350f8c22b0e5aeb0",9.317957166392093],[14135,"446317779226226e123c5737e368c40337f1abae820225e385aee3aef21fce91",9.317957166392093],[6688,"0f643d93a868679c89d0543362786cef601e6242430d7bb83dc7575cfbbd0ad4",9.317957166392093],[13889,"001c3355b1b4acc152687d42ae40d4f4701a18705a5e3c49abc5119c03684397",9.317957166392093],[12941,"a528d14b5aa3e4c063b09796f8cdc77800221de6d90fd11c72576ef2f6ebfcaa",9.917710196779964],[15027,"1d37345ba67349ad58c737549ed7c14f2847c3d3091a56ade66437d0b435e17d",9.317957166392093],[15706,"4c684a50d65b071b82ad61a7b4010d61b261df3ebfd7cda23b2ccdc7b5ad606f",9.317957166392093],[1156,"2f531f9b7be8b93e17867605675baf96d4e825abe2fa457f50f95fb8750844f8",9.317957166392093],[943,"8a23c6791cade666ce03698c1b554dea716bc7bc5bbc28d8e11270d0580888f9",9.317957166392093],[7601,"7529e023e2a5599a6860e26d465fee0f026092068460ff1c09a3b880e7e72dce",9.317957166392093],[11476,"b5ad34fed448a29c1159a9f44fb454e1733f080790f32ad27265dcd528d9aeb4",9.317957166392093],[12526,"3d6084b592561da0ded42f0c46565739e6d54ebd2e7be134c6f686abacdac0ad",9.917710196779964],[17230,"2babb8992cabf646823ebadb7f9f0f0ab62001aa2e692c273087f9ded7fe4e4d",10.016260162601625],[18845,"a2f56107aa4ee976939069ac0ee01b643ca10bcb1284c2c01853e86657a52325",9.317957166392093],[14573,"50e5eaa53230d399e2f67f20d7a27978b038dffd099085309eb386e0a37ca787",22.17102966841187],[18763,"d7529e44231b62365e33879274e7041933d54b32d750bc842087ce66ea302428",12.086330935251798],[4952,"79e98b56ab8daec5dc27919fa5b0e685495d5d35d8e1b7f92488bfc23eb087df",9.317957166392093],[759,"62b2d315b4d2fd9729389e2c47ec7a40fa7ae4f60ec134f37af82114e363d1fa",9.317957166392093],[721,"7c05d9db6311dd7cd84121bfd05a02a5b526aa8d6dc7b892ebf67554637e13fb",9.917710196779964],[16316,"78142070bab16110c84b88da1fa3ac399961193e83c662cc7aa2daa2b7b0a660",25.356890459363957],[14465,"d16653468ecd20e8d500de261613556dfeffe019ce2c45c9affa9914eafcfd89",9.317957166392093],[4918,"39e5c86928fae77397f4cc4ab9ae3fb05ea2584376bd52f349c03eb54e7cc0df",9.917710196779964],[7196,"51df89d61539d68288362760b61c0e6afa2c321fb4ee83d53e53c9d5971bbcd0",9.917710196779964],[7899,"a2428668183b3307012cd012bd87ad69835c473a616eb4712af028d27c173ecc",9.917710196779964],[17865,"86b5670b1615162cb5324feb4d5232184197bc79970b9109724dee6d3031df3f",9.647446457990116],[996,"0cbeec46987f75767a92764c60888ec8ad0265cebf12b8dd4f3963d111cf42f9",9.917710196779964],[16704,"fb6d2056949cffb32c48d53b369243819267490c0542668862fbb03007657358",9.317957166392093],[1779,"9a568f77cb4fab4eddc4de65884b8ea4163d51f5bf2d61be08c956a057015ff4",9.917710196779964],[14098,"9e7d54d92cae9871768d65ae0d7f083f9a0104b7108867cfe4f33b6147c49892",9.66349670811997],[3923,"5d63ea25fc6e31a660eb787d8ed49e17a5a3c2e163d36e7005b7efbd25b730e6",9.917710196779964],[5066,"a94eeba863dfad24514ebca924071991db521777118039dec779c5adb7d9bcde",9.917710196779964],[5968,"12d3fe0f4046d7cfaf951a2aacb9c35fc9a885c449a741dcbeca4621369b4ed9",9.917710196779964],[13200,"28d6d7de9eea920631366baaf66c676ef39f7828eb90310f982fd94c553ce5a6",9.317957166392093],[8091,"c47570383eb580029936d824fef3ed299ac39113875245449db65f6bef0ed3ca",9.917710196779964],[18627,"aa519434d2e6688dd2da3330352402ed530a695949996df35a9847fd0522d62d",9.647446457990116],[4706,"34e00be9b04b19c3d9107d2b28a516f16a5081ba35d682b62a74d356306ef7e0",9.917710196779964],[6070,"0c22cb3264a2115d0d70b34bddcdc198e0af7cfca60b1a57b29458f658ff9cd8",9.317957166392093],[1445,"5dd1ff40010f38e099becfb72916afbbee7f15c941e2615d02beca394d0789f6",9.917710196779964],[14572,"34ce700e6d9cbd3120154ef0ed3a3499c4a735bd902fd8caef595619ab2eae87",9.317957166392093],[18958,"2801e8df6a1f027e14fcc9edb2dff5570b8b50b70a2de5cd924faec49a30d421",17.046062407132244],[9929,"4dccb34de213135400d968c727b68c77a0d29c1b31f615c8de9e5f23c479c5be",9.917710196779964],[3755,"6de54851b320418d9b2806e2eb153bc645993a8702aba43283bcdc6e527939e7",9.917710196779964],[17379,"4a1edd380a07bb9f0b23f2907ba11cefe8ba4e12509f735ab76bd17a0ea2374a",10.052724077328646],[4660,"36d20dc124820964344411eb94c886c28b8867397f5ed1d9ebd20bb3cb673ae1",9.317957166392093],[2580,"65c04652cfc283fa650095758998427d7972ed47b343eecd918ce5df0fa150ef",9.917710196779964],[18925,"2c327ea6b9070842cf2f974e65d18e2f11c3877e630cbac6041f1a49ddc7af22",9.647446457990116],[11443,"9455302210ff7389b25af6adc0b4ec40030a175b97dff6e0bd1197f43e01feb4",9.917710196779964],[7663,"70c149fbd8ea3b39b485b93399a378bb9ceaaa27ae36f6e458deebfc6fcbd3cd",9.317957166392093],[9445,"0613278b7fcdd24f5fee84f65d4a8194e65546546fc89d77ff31ad14833c08c2",9.917710196779964],[13707,"2418a7cf018250327ef33605c0eb08d21ffd763cdaa3c927e1d881046370349b",9.317957166392093],[19107,"7d94672207e3e9d26d769071b930cc068b33ae94df166aadaf9ffc1e62d6611c",9.647446457990116],[11166,"d103a796fe9ffa48365eb38e74dba51b3bc9f8ef61f777c6e1881ccb7b35e5b6",9.917710196779964],[8364,"fb2591b92856049cc2e114e1e3c42bd5ff837afec9f3c6d503f40ccc1784e0c8",9.917710196779964],[2635,"14887a2be9bca004576bb0a326e38d9d1fca7a3500a41e6e6235ca985759f1ee",9.333333333333334],[3131,"0d55a346b72ebba87c76794f526f90f425c8dcb3d0176abf11985e0bd3be77eb",9.917710196779964],[7443,"4d0a5588582fcb4bded0fd19bca66b6b30bccae4ccb12ccdd64ab8aecd0d1fcf",9.917710196779964],[7750,"57f3e4447f6ed534a022cebbe8e2aed712d04fb94132684508c10fea210922cd",9.917710196779964],[5806,"8c8bcb6833532323629ac3dcaf6755f893b60af6e91b319a1e0683352dd459da",9.917710196779964],[14035,"9e355701714e1522bb6898952258bfec85dfcfb77e5c6d623fb8c8455937fd93",9.317957166392093],[8558,"a8af06b79843a1ace810e566387efa3028878b935ba46a957acd1b523cb7a9c7",9.317957166392093],[1152,"570ad5911f271c70178fc2a384bb63ba5c53b0bb698aa121b732a9b8bfe148f8",9.917710196779964],[18486,"6761387bafa69f58a6e7add22c71ffd964de9f14992ea5e9c70456be3d1bb331",9.654676258992806],[4469,"cb02493788715efd3209aeca12b3b7ac662ec92849f0b8a24ced9fffd5219ce2",9.917710196779964],[14324,"682837a48eacfffe7296ee465d34086eb7c3b15aeee273895fda79a8c064ef8c",9.317957166392093],[11774,"eb09f4345a44f512f72222d12fac7397228a46b726177529ac0db9d93b76deb2",9.917710196779964],[9451,"95eb7a8bb29a6ee24649d7a6c3ecac0313120cf27c5f52bc1beac2786ec202c2",9.917710196779964],[9010,"37216cfd168d7703509f9b1b8b6174b838bb8d7c748c03ef879b00e77e1cbec4",9.917710196779964],[18129,"2f7a4812baec43e5bd332f6b166c2de35ba8f65acbc852260061902ffdcc3e3a",9.317957166392093],[10207,"12a21335a3ca05eadc0e67b8f9f269fa4e65d531a8c95da4b32a2d4c17c3eebc",9.917710196779964],[5435,"12396bed9cac7d7eaca67a886dcab25eada247923a335311bdd3c00ebcb090dc",9.917710196779964],[6518,"c62fc68b1c5d5a98f9e21fcaeb5b5520583356ed6a6333538b2e29bd01d847d5",9.917710196779964],[17595,"9fc801ea34df402b86dd11d1cb7ff140ce93b5f036e3e7491adfbf316b054945",9.317957166392093],[1574,"3a66c5f5e55a0b5bbed83eea10648b94ad6f1b370f7de4ac5d6c3cf69de4adf5",9.317957166392093],[18662,"590c50b7ad7da94d07e56f86e265e267e293af8d1e393d8f94eb45a0de29312c",9.317957166392093],[3246,"818421c4a349ec198cc1d7a595fa177cf9a388c0b02f0988a566e406dbc8b2ea",9.917710196779964],[220,"815887d0efa24291b7da766af44fdfe1cd098f8e2a9ddad8a655a40ce1fb83fe",9.917710196779964],[1737,"6d68c2f6d5d345d2b09804cc45f70a8749af41c5a7925f11c517fcfbeb3badf4",9.917710196779964],[5958,"0559eaf2ba947f1d065cdb4e414269a0ca301f98208cbe74c78c1f9ca1a15cd9",9.317957166392093],[11794,"b4e2135d974084127a4a3fffc7a83e379a2e0ac8078ab23228853b044370c3b2",9.917710196779964],[12076,"d993b88448bbf270b6e5f60feea42896de4c9b89744f17fe9b326a1a2d87d6b0",9.917710196779964],[13229,"54f0cb1ba13e322c0f13d7abb57355698ee0b62b541dc5f3a709b4d50b1a56a6",9.317957166392093],[9911,"da0dbe03ef3871fb3c49f89a98c4bc408a853e2c9612d2f11757ae120292e1be",9.917710196779964],[1448,"a9047bc5fa5379ecd0a813a1f514a4bf5eb88ca97a106dd304249eed729c81f6",9.917710196779964],[375,"15272873fe6067a019f4fc5cf74e1320a5e2de805d13225e18e0665c051188fd",9.917710196779964],[546,"c15ed78561e63f4582b74af28fbaaa18efda8f969d1d065f6bdbba71e8d14ffc",9.917710196779964],[7361,"0d3e5ef8284749b576d91b7b0b159b137916e1a5b5143b4831a5a865533ea8cf",9.917710196779964],[4051,"90aeb90be693ff3df0c5b1c86c3749c222b87a4b92103c11e1076828f89e6ee5",27.900591715976333],[17942,"0afee8871909bb410c0847d5c9c2ea37c90bf57d305e18ae73cfb12e70a75b3e",9.647446457990116],[19785,"fbb10e2afb433c059d4eb5581a653bbe0381ae8dcbe5835c0ff221a26fa44703",9.647446457990116],[296,"fff5794886c2d3768f352c75a1fbe6346fc7d5486dae3ad564a870e8af3afffd",9.917710196779964],[9571,"5adddecc31b5944ccc9ccbfec497834ff7a4f6f352a8a19afed16e6bfb102fc1",9.917710196779964],[3474,"6707cbbebac1c92c0f674df4068145080894bf395b25da4d353d2580856c33e9",9.917710196779964],[16788,"265170b2ff8f7f83c73dc8ec8b70d66fa4b25d202f434efdeed70cde26c59956",9.317957166392093],[14962,"7cf543ec46563903d414876a7052f7dfc9894804237a2e609de3502b4e9c637f",9.317957166392093],[5799,"911f10c3a6ae54a795d0ce25fbf03bccf845806bf380bfe2589e90b20b9671da",9.917710196779964],[173,"ac424188d9776cd092d94e3dc24b9d2619d34ef6b9dc0a55e3b7df850af5d6fe",9.317957166392093],[147,"091d7a4e38042a9b078d15adc8c0548dfd8ccec9936683cecf0f462e115efefe",9.917710196779964],[4138,"ccc5ae156d77b97191870807c86c515145b64820cd904947d49d89e191eacee4",9.317957166392093],[15956,"8207760fb2765d0d215d939be7f6d502a2e281ded09db9dd5e87ec3a846ed569",9.317957166392093],[7682,"6b0178304aa07d5956291f9dee3aeaf5fc2c41be146fa6e449cd362a261bb2cd",9.317957166392093],[7987,"9710a2860bbd595fa8ebaf676db2b0fc878f37e8b557a30bd32c6af1ada998cb",9.917710196779964],[14566,"d5c4d19c070b05e8c0f16cb730a175ea6bdd73bad2d607263eb4ce29f601ce87",9.317957166392093],[15375,"03ed1ce3bc9db95655c4f3013e200a363a4bf229a03a1a23ab1c8e669de5dd76",25.92170818505338],[14721,"fa92be5e7abf40945256d01c4b95eb8d614fff12125759c505051c27636a8484",9.317957166392093],[105,"3c3f8bb8f2efb0df1de362ced474caffacf54c37275ad72d730a732d16c257ff",9.917710196779964],[16592,"057e4f97d96296f72f7f65e022a26e984e7c88b2185c8e12aecfd3801d091c5b",9.317957166392093],[16330,"73d034ffc1481defbd35ade0eed534ecac5e4b6390c5646aed85ed9687ff6560",9.317957166392093],[10171,"97f4cb7f0f256a57fba878b4f880e5f1ef0315b4c6b209794842606021bc47bd",9.917710196779964],[1154,"2c5e81e228dcc6150d2a4b0bb621cbc9f53ca988daae5c759ab47bc70e3547f8",9.917710196779964],[16244,"3d7b0e3dac6ddba98856b178172ddfd5e49843682a6f056fac2040cabf789962",9.317957166392093],[7779,"9985351ffdd6b9caf0e2957e2586010f8568c961411d87065d2511b9a986f2cc",9.917710196779964],[297,"a725b2d184ad1322facc8a8b11c8e87beb87a64f2ff4e75944c9f2b0a62dfefd",9.917710196779964],[14413,"ad9fb568d3110b26e8f4731747a5332e9a3bf7c84225f80ac09c29d28a7a238b",9.317957166392093],[18591,"7bcc9c44ff1336fe8dc2a5e126562fdc791d08a56b0438cee76f1db34d1a0e2f",9.647446457990116],[1080,"de4455d97ce599bd06f31b3b838fd5f66c152ca0e4078c5d39fe84a64f2ab7f8",9.317957166392093],[7684,"1ebbb29a1d3d326a39df281cba540e261074295e246248f0e2a74c55158eb0cd",9.317957166392093],[8336,"2cf178b88ca01407e093c5d3f17697eacd02042f2c129e61f1fa81bcd71a18c9",9.917710196779964],[5902,"3fb5cf2d753cada3c596103c9c03609af0a65c6a2994ccf59c0c5bba20b7afd9",9.917710196779964],[17773,"99043d0c23397612cdfd256d13b82380df9c6d169a6030ea2d6d2d7224c6d841",9.317957166392093],[1533,"32686693895c533c0d73fcf875f2735c3b54f13d754444bf2af7135f71c1ebf5",10.052724077328646],[5778,"83443f0c91ec3843db2280410aceb5cff3bd3d27e37a83afb1c7b3f873dd93da",9.917710196779964],[2609,"2ea95d78b53383c7cf9570b4328666eb454c1334273ef10c683350b13d431aef",9.917710196779964],[18805,"c7d13697298474dcc9f8dd3f015f925bd3c243f7b1da9284fd02628192a5d326",10.052724077328646],[13148,"7fee0fd415864667701c766f4d1cada2b2523d96733f71613df0008cb92a09a8",9.317957166392093],[5094,"7415c6d58c773d14df518d95eccaef51037969fc407d6060fdb7606375979ede",9.917710196779964],[8486,"157069c7a0a5d1fc99801a75170290b8f96875a5035b20989526ea68d33e18c8",9.917710196779964],[14697,"e0060e52f1e6078b699db06a00137e88564ba733ce9123b3403715e96160ed84",9.317957166392093],[17917,"4ad17943fc057293e2ed992cc85507776a55801eec3fa37af94d717dff10f13e",9.317957166392093],[18293,"904ed3a494e487c7daf0c4aa4b80a7069d8585d68cd02c65262866fd579af735",9.317957166392093],[10306,"e23a0e14ea92a6dacbab8db0d62b7858f9d8af0d00c3695ab8e26ad8789851bc",9.917710196779964],[7337,"51b0e0e44a58d941bd37d040e14d2b0214b3182ce72d316000b2b2b2f29ccecf",9.917710196779964],[10056,"35805250325b2f4da13f02ff345511ce9d7510843540854cf90ecd951f0202be",9.317957166392093],[6664,"1baa120cd98fa73a78e04535a1b23ca86d169e379bc305420fc933486a5f34d4",10.052724077328646],[9950,"921493178c149d7a8a5f5115a9d22fb7c7b2e9c08a71be40a1eee000a6cc9ebe",20.07662835249042],[4426,"77b0dd7b4b9b3f309840581ece1a89a8d34e80c116405c258cc7c25deff7e8e2",9.917710196779964],[17097,"c7a3d1f5e20f7983976ac1023d4bb1edba207c28012148db17aef62e62150650",9.317957166392093],[5327,"de6b988eafadf3b46bda2fe40c9755c06cbdf795912af85e7c055d4694fc43dd",9.917710196779964],[17209,"9e22be69efde659dc224678e5f8c60442d2cf4065a74493647d62d2681c79f4d",9.317957166392093],[483,"15f177989fa506a5e8ff02c06822d72a0d96330d7d490f763fd1099f5bbbc1fc",9.917710196779964],[19263,"e1d07893e5aef6eab9c8bce111af13d29cd0ac97ec6da3c7765629f15c703516",9.317957166392093],[12262,"66413d3b4bcb4ddb9c7ef2d4d0283341fb7252e1bc54134c8947472ad4e99caf",9.317957166392093],[14327,"e37217f3a4eb81295c0f0558612b3957cbd2bb662d9c33169da05f0651dae88c",9.317957166392093],[7671,"a6e91e92b3120af2e3c6b81a94e905b4f6c7ff74ab5607eacb1eac83d5ddc7cd",9.917710196779964],[12265,"28fbdd0fb500f4748e54551beda5728c77b567adadfdc3770aaf72f3345d95af",9.338112305854242],[15850,"09db06746ed5900065e2a7c908dfcd5c8ac3288c455ba69fb08be93775cf2a6c",9.317957166392093],[8443,"3604a49dc1249585b76ee4406d203f979e8550f0d095964c21a3ddd1e4175cc8",9.917710196779964],[9109,"f3e8f7195371774bd6a84e26e940066504a8ed92c03ddfc8e71a940e2ebe15c4",9.917710196779964],[16130,"89eed669689d7fb0c16585f376be9c05243c8aefbb7beff1f640f12996716565",9.317957166392093],[6179,"c11a8dbf80382c4d61f23445fe7d7ef38a4a9ffab6a47ba33fdec3ecd982eed7",9.317957166392093],[2499,"d34ef6715fe1bf2f9fb3ede1d784464f2df90f0cdbb745d6ed714e7800d4d8ef",9.917710196779964],[8576,"637089b45a6908978f58a71db556885dbdd39747856e4e0df20cbbf6e4b996c7",9.917710196779964],[3420,"a142c648a1519fdbf5add7e31072c7bb2bbc3276d4a145afc1e1c2952d6686e9",9.917710196779964],[4585,"ba044978aac356aa5b77ec5bae3dfc30eac17272fa30b5f4d73060198f9db4e1",9.917710196779964],[13290,"80a8d3c5d767e24265d9da0aff006e5b417dc409a743cf25696a646254b6cba4",9.317957166392093],[18298,"fff7594294e825fc112b0603d10d80d771e338d3250a9a27a6cc85ba054dde35",9.317957166392093],[2792,"51391a48c41ae431a540340b485d5bcd3da91a445a607ccc6f941d4368edc5ed",9.917710196779964],[15386,"272585b599d8e3a1666cb6f66949af317484d0adfdb0e2b019a10ddfd53a8e76",9.317957166392093],[4083,"cc71d8e1612da8692570a2ca69183f94c2e4c2d4ea47e5a2b04ac13940c82de5",9.917710196779964],[16265,"18a3f76ff60bc80234d35050dcc06c4e2e578687f20742c1a704cc159027fc61",9.317957166392093],[4517,"da5a539b6b63956c6bed3483ec219fb1ad3238ebf167865aca21b2cf07ac3de2",9.917710196779964],[5378,"7ff091b3089122fc841499f88fcada60669e3ca03b4ef8b7cb03041c226ff7dc",9.317957166392093],[6616,"a2227c8b0a36bb3b7ce23753f0d22ae7b09606ee847fb4b5ccd902304ce987d4",9.317957166392093],[13749,"fab344536ab79775ef1a4d8892e84c8e3fdcb448e13dcade71832df8cdf1759a",9.317957166392093],[16589,"428c41610b8b57c6905781896bf67979a7e1c8fb2d497c0264d08c896826265b",9.317957166392093],[3094,"ec7d7dc08943da7a32d9241e796620649cc1baa0db1a61ffdaa283343ea8adeb",9.917710196779964],[9311,"ef701989aad9b086594ec134656e3949448dea5f7f5de7ef3ca781edc6dacbc2",9.917710196779964],[12017,"aca7cde6b70e36e113a3c095d1db10cdc7d9af1f27c8c12f5341e94abd273ab1",9.917710196779964],[19581,"33a6ad95ba09e27152ce8feb9f39856ff4b6e25e0482a23b61e2b3146f33010b",9.904761904761905],[157,"c58a151059a290d42da98a2b7062aafd5bb689da8818839cd2e5c6409381f0fe",9.317957166392093],[4212,"48d8f53cf9c618c4dee4485492ec156977ea4833f0fe84f1bbfec653fe405de4",9.917710196779964],[18327,"59c55bbf4d7057e09752aad95e6f5fac3c8168776db66f09eb8a4df9859e5335",9.317957166392093],[18369,"79a4a383caf45975f27a5fa57a92752856353183973029264884a8280e564c34",39.76265270506108],[2414,"53f6e03237cd09c21f4d79786c57eca063df9b96b446c6574ae1c8e52bf65ef0",9.917710196779964],[1789,"e4441dcaf4343f87dae901598f17bb1d33d96b4348747586bd55e94db81e51f4",9.917710196779964],[18266,"efd3001a8bb1a4b169e964cbde18e9c151bc07920a1e9671a6a8dee632d79c36",25.130890052356023],[9273,"529a4ee4f2acc7b9c3553256a9a76097f0074a1ef7699693be1060505941fdc2",9.917710196779964],[6794,"a48b3b92c2d94b287656d38279253c6b6befccb99bdbe708e18a8909b31753d3",9.917710196779964],[8689,"e42b8723d0ee834eafb4361da06ae65bd80b1f65a9e7e995c0fb260dae9cbdc6",9.317957166392093],[15621,"9684fd21d256cb9866271843db269551551ad945a70efebbfc3ec3b1f10bf070",9.317957166392093],[10172,"505582998e07edea1052e9b739772c28d73c1ce3dfa4084f0b73342889c441bd",19.0727969348659],[1430,"9301359458edafedb045456bb6d9c2a7f7497131212e62615fea86f5125ba5f6",9.647446457990116],[9426,"717626aae208c1f237ad05c0260bbea6f184cefb6fb447e036d0836ffbc42cc2",9.917710196779964],[8258,"24de35a577643f8c0ea729e3ef975538f0975de309c34de1332c75106b869ac9",9.917710196779964],[19539,"9404b14f09e6f6c08a1c7bf4cea1fd25288a35debb0390055cae6bffdbcd230d",9.317957166392093],[16468,"ab5231f94020a50008396d0b9438acc017c33d9eaaec7346b57aefd080f3ea5d",9.317957166392093],[6667,"18a5fc44ad1030a5924126ddbc93d76238ef3c31345c3cf453fd4d15775a2fd4",9.917710196779964],[10567,"3df2a00e1004061dd9ae9cb5c0e01d74173be08b7c3a43bfd6f82ac2c429c9ba",9.317957166392093],[4552,"745a0edf3c312c429733b719fc72aca508594deaaaacb2390f5f5aa10a66fbe1",9.317957166392093],[6421,"42480f64a6f8a48938cfaa775393c42e4fb75abc797d245811cff348548228d6",9.917710196779964],[18528,"b34cd1e650bf14886d333839b7c7f0bb8c816cf51e95be2117161d38b8bfe430",9.317957166392093],[13829,"3def8f90553fd2128d3967e39373b34b9ce7b5d8bb607f4251dcf3fb1d06c498",27.144385026737968],[5382,"c0e07cbd2e8324568cf5f44295a3c9707050ba090499ceaaf7257ea1a275f1dc",9.917710196779964],[19335,"562f432c9946108a8fd26a303ca092526f18bbddddaa37a3321f3c5cec3d0d14",22.174688057041],[12022,"7b5a35e458cf806c90caad777cddd1634093c964b88cae6b952d595cfa9631b1",9.917710196779964],[15238,"c891e2163fb73636c81ef72f7aa75530a983d3d842d74d59f247ed29a486b979",9.317957166392093],[2896,"5ab405019cf2d1381692a308c535df5e24198a52e2841404047fb4a09beb2aed",35.89380530973451],[12948,"5271363c3f7012e1d08859d41c805c9c3181fb5d7b3bbbba6939cdf5d32becaa",9.917710196779964],[8215,"4c23fd750e7fa6a1dc1943521cae3ac191da331e3da3c84da19a17162e37e0c9",9.317957166392093],[8658,"c541db41913e0c5365764eef06f2c021b64fac13900db4d15b97e2c19a7bf9c6",9.317957166392093],[15920,"a0e494eb4d324f612f23ade720def9d35b472580501f1c2fed3235859c73b46a",9.317957166392093],[3673,"6bb2ca27b48f2b99a196539a3f8d0e00fb085f1d6f42574331f4950e7b6bc7e7",9.917710196779964],[18882,"e2c04a6d51f4683dc095cb25ff17f4bf671ffc1bce1db948a8bb1cba32bf0124",9.647446457990116],[4197,"641a279140ad620ce8cf477225bded1b48ed74dffaad9b33409a29292ed470e4",9.317957166392093],[2108,"c585c6a7d9cb0c03268075d3737e92185b8143c1d12916a8512e3a63f24b31f2",9.917710196779964],[10407,"e7142cf132ab544d1b18c50d21b23bdbb806405bceb06b1342aa73d12aa7c4bb",9.917710196779964],[4923,"ea5deb57dba67d53c3742e86ebfb613269a5fa20c7de8a852c33682342dcb8df",9.917710196779964],[6912,"b569836639cd6f473b1be8026976decf8f8a3d1a739a21823a01cc223db17dd2",9.917710196779964],[938,"541044c1ca2a5ea487784314043acd92c57a33532067bbe1dea9f75a08d794f9",9.917710196779964],[14315,"1d8efdc9f1fe6be2f20cfe965014b8d2e82519ac491ebd7eb6f1bcfe5403408d",9.317957166392093],[3414,"ef61c12ff143791fb7ffae42532596aac6c87a17819a35251fea08ecf73a94e9",9.917710196779964],[1262,"9d913037a8371243600deeaaff2f1281349274840e4aff17e274f10a5f9f94f7",9.917710196779964],[17520,"93e4292a9a029e49e4cf7a33ecd705754f0ecc6342dbdd4ffa4d0b0412d22647",9.317957166392093],[12942,"ce446fc37dfa5a78b4b879536bc439375612edec7e11b8b04ddcca496dcefcaa",9.917710196779964],[930,"b4be727d3729c6cea1bcce14802e052bca7dba1b8e04a9729743dbcab80aa4f9",9.317957166392093],[4405,"be2d7ffc125c369a625c9362ce1142bbb01759b9ca1332dc06f27e9786150ae3",9.317957166392093],[2621,"a7a1c7a2e5e3dba6a394e025cb1d1cc17cbfd667e858fe40c4bd22eadaeb0def",10.052724077328646],[1683,"00029a626c8ea6f339ffeb935d3c37c494b510178e6bcce079e8c952e01008f5",9.917710196779964],[11572,"b543e0dbaa21716e9f541ebbf8cc7c6afa5117237088d404c12323782f5c1eb4",9.917710196779964],[12244,"06422dfbfe4fd6bdc4392676ce7094cd089209af161b7c9f6c45f02abdebb9af",9.917710196779964],[13759,"f120f2a5108f4dbbdce7748e88057528c6a0dde6f08bf8bb67b7ab4a23c71f9a",9.317957166392093],[17382,"4e8bd9361af83bbbfc319b3acd21eddcb39321c55d0f725416ae16fc8b30294a",9.317957166392093],[7407,"063e20fe8a1a632545171a8918f7a93b565a70a9efc138fc09713526fcc75dcf",9.917710196779964],[10928,"22250a35ada9d0f171260391c7359ce0cd7a74de47ce98c44dea45da220e85b8",9.917710196779964],[16433,"bd23a895f85e86625c540e9b2689d2d2a2664f42558ca8300c2d26ef3cd0775e",9.647446457990116],[2574,"1d76d241b4f16202bf8ff87be79f3701212a38965357a598c327620d77405eef",9.917710196779964],[14005,"b24e6b60598abdc5b19b301be0e4da6b6a0759557ce7c73e97c956fb2482ac94",9.317957166392093],[9492,"05247899bbf666b5f149d90947e4c513ca14fd35846122f4c997c5323fb6b7c1",9.865470852017937],[7243,"758c1350d74afc6a40bfe13e060f578da3142a34f3d5e054ceff1e7f03f26dd0",9.317957166392093],[1775,"f6cc6a193faed5124deb87332a00293cdabcc40482a0cf2831c0ed3a49a869f4",9.917710196779964],[4189,"5384e231e904e29a429c6021356282423b132eeae28b63f75266be79e6c67ae4",9.917710196779964],[15847,"f4979b165a0709439f0be4b118c8b4bd255700cab00198982f856cd6f1b1556c",9.317957166392093],[17972,"91ec7d4e5fdcdd9fe4b7f3a4ffbfbab94dd12098dcc6ca3c3890a3cd22ecba3d",10.052724077328646],[8971,"e1850b55a2e5d66c079f91c16c72aa586ccad34261d51e5899b95cb36ed9fec4",9.917710196779964],[13832,"a2774d4b9a808cb8e673eed7b5d4d395b45cfad84781344c7da2c5d1dcd3a498",9.47845804988662],[6934,"fa223a8ac7b5bb802a05cff3b7545284ffc9e6d4cc5c6d69946ce81fa38c68d2",9.917710196779964],[2239,"8327514fc44355a1a65199a0727216e6855f5df7e08f0e94b804f87f303e4ff1",9.317957166392093],[10349,"79bdfc6ca3fc381685bfaab7535b5890317e98af1cd4de8c6a9fd8c0b7b10abc",9.917710196779964],[4116,"9ae91232d572bb23c7f5d1935eb8eef185ceab406f916bc2df6c714499ecf2e4",9.917710196779964],[9549,"2e29a890186c1588bf4ab6134b2eb5cc01e8d8955cb1834429f1c4d3f9e365c1",9.917710196779964],[12025,"91d98f7975a30de4bfa63309dbf21901226668143a4579070cdf34f5dea827b1",9.317957166392093],[2476,"7b01553352488c6a5eae3e66881edff9b2d230fcc7ef4d9d43da190b05cf05f0",9.917710196779964],[17824,"1b2af1f3c577bf888d244a7e083792f89bdd2980dc8c5b11978b65e33bb3cb40",9.317957166392093],[884,"3998a3f5585f257a99b430026ff1d636c6dede573fe487d575170d41cea900fa",9.917710196779964],[4225,"de626ee6cb585d8e04d30322ce6618b7cdf9a8415399b9d392025689777641e4",9.317957166392093],[2020,"d0c95b2b4017b969d926c28574c5faa6fee2d610ffeb16ce6eeadf43e8dad2f2",9.917710196779964],[3472,"02dbffdde243626956d3c55420ef3fc8d2e394597fc02e6738011f580b0d37e9",9.917710196779964],[199,"67a135ad01a92353d779f0d6bf98cd48333556dc3d02991cee685db632fca7fe",9.317957166392093],[19740,"5557bdafb403dff28374dd864de50ae66cf06db081929c34025fc23a30c46305",91.48727984344423],[17192,"d7b33e7c7305fc063e7dd8d75565728de4209ed33216bc07437ab2e8626ce24d",15.943362831858407],[8970,"52318804e92195d614b3e939b1ec583bef6a6ff5bfa7071db3506b71c61603c5",9.917710196779964],[9935,"b5e9b8a2b88927171d9f9a9c403e7874c0d9a7c443f3ed7229f9aa3fbebbbfbe",9.317957166392093],[748,"672cfce8b96da5e93dcdccc58c02c471d805033cb95e118707dddfe3a5c1e8fa",9.917710196779964],[6551,"a04459c29db45aee66cf34fbaff116e2132ecaa66fe9542d3506e67479ce01d5",9.317957166392093],[9238,"8bf5e3653c943247265136a0ac964a621ab50e92ed66debbe9617f982ebe32c3",9.917710196779964],[13596,"e719ad2ca9feef462208767eb2f106a70e4f68f5c4533fe51c40f8a57f83919d",9.317957166392093],[17246,"1834c3c6abde7afc093dc83f29bd56f91ddd325a9847c53b9e8fdffb69b9074d",25.401769911504424],[1855,"6a39bf709401779525e46fd663658cf51e828cfb68c0f323c2d02eee215feaf3",9.317957166392093],[503,"51623b52dfaf226892e9c9de18186f2d551a68a9460ef4cc7c66d06d01bda9fc",9.917710196779964],[9003,"227c91f799b8020627b36324541c247f9936042ea7dc0e2bb2afd88287b9c6c4",9.917710196779964],[737,"428d17ddf52a0f688b18d9b5113474c2e888f20bc49191b4d6960b3f3fcb01fb",9.917710196779964],[11559,"023d085944d4b16d687414324070d678ee5e9ab4f0f00c9aa6b952302bce31b4",9.917710196779964],[4698,"d0740c547891c0e0554d82c23e19f877370092b13083de02dff395b5d2b701e1",9.917710196779964],[1285,"3d0a353e073b2412089f287f021be05d9acbc202b81a088745b4e8568ada74f7",9.917710196779964],[5972,"55b2cf4f54889bb5e3683b462c61ade3e735bb1fb50b59369b98d335a6bd49d9",9.917710196779964],[9881,"a6e075da9d18074cb5bc97b8bab174ed0a62b0c6524226fbf5777e951e8911bf",9.917710196779964],[3715,"c6cf1b2e4210ba6699d6c1646eb7d86dc5af38511333d6f62a98a74eb86281e7",9.317957166392093],[1071,"caab1c8c6133dae011b28e2a83f0d1a8f7e4f2e08ab66eb063ad9c24264bc4f8",9.917710196779964],[8067,"4200ea9eeca290eeadf903cad8eb437b3cd18a1f7a842b80ce5a9505ec84fdca",9.917710196779964],[15186,"304ddb1d3b676676fd6143a743d882fbb9894f5dfd92fd5b0074beaf3301c77a",9.317957166392093],[5843,"868d17ed78aa6fe603c40bdd7db323b3184c200472cea2c801df3613f35b09da",9.917710196779964],[10849,"a7ca26ec77aafcbb79d36e8b5914577309d94f86ec97a2a2131168149f9903b9",9.917710196779964],[695,"22d04de7f616e83e9c4d62a07a591234c2b9397b2639276598c03bfd40c944fb",9.549738219895287],[10324,"e6f2ea3e237f2c223949af6ddea9bd1913791cdfa0166ce787286b05ddd22fbc",9.917710196779964],[5433,"30eb83553671a8763464f2d3172ce5d0bba30739e4102a96252a83bcf34893dc",9.917710196779964],[9643,"9ef659c41594f06f0d113a09391ce0921066cda9357986b045ef8914ca28bfc0",9.917710196779964],[294,"385a9f94b992d58bc95be48c982e6aeaed3e11130d71315235785affc12c00fe",9.917710196779964],[11113,"bc389851e4871ce73ec150f8a0614a53291acb6384d5d26dc4af7321cf1130b7",9.917710196779964],[5117,"b4a16e5652c0637ebb553262a7be195176b2e96fed31cd80cc29101a0b3c7ade",9.917710196779964],[18895,"e3b1e26cc7884db2c95dacb287e24c703d2be994bdc3ce4237ca9d850a729d23",9.317957166392093],[17410,"a5af6d8c6a06c1d2e62f58badbae6cc6f56747c37540026862ad677425529d49",10.052724077328646],[9448,"e9652a8fca139745882bb44e6075a5f528f8908350f62583e7ca4d7d8a6806c2",9.917710196779964],[19744,"bd079d29315cbd890ee221fd0511d40b6fa11e84f62a960a5eddc301d7c81a05",18.136216216216216],[3191,"263c6e12e7e3b422bc78c87d53548a7fc4d1bcfa4ce233ed4a521ed13bbb16eb",9.917710196779964],[2714,"4ffcc7e0236da75c3c713f92f7b53f68aae6e0da3446e6984a92b886b72557ee",9.917710196779964],[10436,"eca24153b30d469ab4778846284f61b58438c76439b24d510ed7349864a093bb",9.917710196779964],[3026,"0f665aa346c1af7892f9fa69244b27ee300f41c252301e4f32a8011151ae1cec",9.917710196779964],[2333,"8877a9b0e741d3d8bed1eafc7a738692417a7002429cc23f6cb51f6bab15d5f0",9.917710196779964],[1324,"ddc39c8e36242f23c8eb5573a024c09073306111d062594d7fa82f2764b640f7",9.917710196779964],[18177,"7e2b3cf33479b1d3a2e377a0477848945ca2c4f2669e2c2fd0e3eb1f2f4bc338",10.052724077328646],[11540,"d43af20969150954a433654e44e8cad9d36aec911aa4906324d4d34a2f5d4ab4",9.647446457990116],[7617,"1d992f91e85baf06d22a3b5fe001e6d1d6d2066ff59b3cb0ac12d689674e1cce",9.917710196779964],[12356,"0a89d871e84421cbb7c8578cd9bae4c644800c9a7918c85087962b2ca5a2e2ae",9.917710196779964],[7968,"cc2528837cac3fbe9a2f92e33aff8c73cf0c888987577f7c56021665cce3c4cb",9.917710196779964],[5547,"d4560b9d23f0496a6a8f38ee2468b3caf296e014cdb46359012870d7fb7cf5db",9.317957166392093],[6773,"27180af4e50ef90e2c15e62bc83887dcc7c892c4e090c3896a6269b5c3d277d3",9.917710196779964],[18589,"77cacd92fb6fe1eaa6b1a146fe2a0756bec2b44b978234be5700a2255ec4322f",10.052724077328646],[13194,"e0e49e4d1ca75e6aa0ebe150b263f631cde058cb3a4ebc9fd6c1e5374e38fda6",9.317957166392093],[2306,"1df0e08869e16c972e45cb92ff52a451443f0d50dcc539c1a12d205837f1fdf0",9.917710196779964],[8144,"564b8e17d9d8678f5ad0d38a3e67d629acbee14b9205bda2c2036b491f8068ca",9.317957166392093],[223,"84409a16fad021338b6a0e0750a8e069e64a950fa5ac3a4276aa79aaa9207efe",9.917710196779964],[19808,"2694f7216c5675b207b30e50e9d2adf2b1ed5d9afc43a78ba0c23a7483995202",10.052724077328646],[18175,"d0e049ddec5d480b11e3718b82d0e0c21e566e1be1c3a6041b3622ccc092ce38",9.317957166392093],[11254,"28115b8e1efeb6a18e552504a8bc8e68c0950a3fad2c8abbe4ef5f84f5a950b6",9.317957166392093],[14821,"ef7e744c5e92e720505b4b034f5ab15cdcd4427baf9dcabf240e36488d876482",10.052724077328646],[5135,"897b04937959194f12ac0843c3e87ecc7fa1feb2118cb2cfd7032a644f5e68de",9.917710196779964],[17858,"abe6d1b4d45b139e26b71aeadd08880b0a417cfa0e5e04a57a96914193860f40",9.317957166392093],[7282,"31df839e11124ab2961f72cdcdcbd7fab54a7a7a662a8c851db9f8e10e0929d0",9.917710196779964],[246,"79aca0f844a0126396336577c23d6fb89b76905c05ec57ce17e61eb8250754fe",9.917710196779964],[429,"e9be3386182198448d135fbf008ec5d8b904068d3d2f11688794899ca3c228fd",9.917710196779964],[13340,"51830b2c266a57b221695a5e7986ec18cdabe67f9c30fb858ae26693ac62c9a3",9.317957166392093],[4763,"ee202af079b2d26b31842032df3f2c9c9f01ed80a60939fb44c61ae55bc28ee0",9.917710196779964],[4938,"5d07e5dc23205192bbcaada07e86a7f510a1fd5d4504001ecbe7e5da5c7996df",9.917710196779964],[15821,"1393359c86588eb3afac6134d39a3fbc1ebbb4afe53cf4d450e28a352455f66c",9.317957166392093],[9347,"b78168b0070ff477983774d3299bab3202a9992126b199f2f6ffa3d332389ac2",9.397642257991386],[16132,"d6ed4bfa001c25d181afebdb47b638bdc239cf2fd8ac4fbd0a426cf05f186465",9.317957166392093],[19295,"bed215d08f7bfb6f0674355e596ee92a10be2e071a5ba278a2fc96d5d65d0415",27.150442477876105],[956,"43f9945a35c105da0cd7b65e738ddcbd740dd022307c2b67b3940c88878e78f9",9.917710196779964],[5655,"7b99e1a9dc1cd08e0d2365fb9a252a24fe5a481285cd39434e2900f1ade84bdb",9.317957166392093],[17277,"67be2f57af3cff17b08446839fb484914a4c93a9c44c2a4c98b9b6c20673b04c",10.052724077328646],[3318,"254b8c467c274b118c8ca2612689d6b8ad18bb87d98fb3a2b0901f5a0e313eea",9.917710196779964],[1572,"105c1544fefcd3f63e630c8a64a412b5dc89950ff9f825fd2285bc154602aff5",71.65371024734982],[17363,"c67567153f9d48213bc43954f009d798c998892391f12cd3a61c668e77dd924a",9.317957166392093],[7557,"a9566272e5e9db586e69e74a4a739b0da2f6d9eb545087ae413c5e1996cf75ce",9.917710196779964],[9331,"70404b36ad105cbf77e1c410cf1faecda8492a1ed8ec82a1c863d28a0425b5c2",9.917710196779964],[13877,"e205ab0b31c03d240302717b6dbc0c3aca39ba871ff83c97f6c97ecf0704b897",9.317957166392093],[3861,"1b9ca9b3453d4e858f70eaed930d5b90414f97b4d020e4991b0ee409128d9be6",9.917710196779964],[16459,"31b0d816718d38b47d62e829c87d712e73c816d1522883c3475b6c8d27f0035e",9.317957166392093],[3841,"9e2493231f09f4edeea33a64819f98286bb5bdcab1717c87a0aaf1c6c926c7e6",9.917710196779964],[9508,"f8c0856e9f3e054e27998d365fdc9d0cd13a531315c4b542ee2d4f754c3ba3c1",9.917710196779964],[12088,"09ddc976eb29e75af3bdc6310b6e8721b5b59535c267d8c84742528182c7ceb0",9.917710196779964],[7686,"2acc3eeb280d63f2a4ed3d463cabdd30582188fa01e803d50688cfe5144fa5cd",9.917710196779964],[3903,"97605686ad0dd3927ea974db5e81d477e6e14706d02ca07e1dd43644beac59e6",9.917710196779964],[16648,"47c98f2d6f27b528640d66819a9c1a648306f4743ca3cfe1419d827d960ad159",9.647446457990116],[8463,"3c9ff8f3a100f5edd39ddc861d5a3284761d194d70b8d1b2688dbe0320793ec8",9.317957166392093],[19307,"0a0bb7545955a82b4098ad5d93a739b2d1429d4bb646c22655e3e24bb25acb14",9.317957166392093],[3058,"a0d864b9b4c0861d4ce8f4731b5087836ca434c2a53829791aaf7428a499eeeb",9.317957166392093],[9725,"e327ab9c230945342b817a16e18d2f40f90d0d22052f1e1208fd3a7c5f9d29c0",9.917710196779964],[10305,"27c0b741407a6eece2a2b1bcaea75f0517fb2ad4959eb356808f76fa468e53bc",9.472566371681417],[19806,"4ef623675b58ca433f03013d69c7c9aa0b8e5e08e2bf1df1244c8fd831125402",9.317957166392093],[19553,"b7a3d132f33aa0f44bccc290f5b5d371771b0ff0d0b24a6d282af63d5c3b7d0c",9.647446457990116],[19427,"d5dc3d03d2fbd7463aad963e729221a540fac3f7ca21343ae2d1450307678e10",252.98329355608593],[4297,"11034df960342b5027d310098f6e9f35d8ef0b6eeb659a4f490f3bbc7e63c8e3",9.917710196779964],[2361,"042893fa4d31ae797c20b7a5c93bd0f0194221c7ab99248dfb195021537bb1f0",9.917710196779964],[1642,"d68ad62128f6c6ffea0f2ab4cf5ad32fb14c6fb1fbc331f6ca2a00ddaaef58f5",9.917710196779964],[11746,"52281ab29082f27c9b9d302baac505a0e7fad92a854a99ced463be518a9e08b3",9.917710196779964],[9190,"19753a0fac7647152eb6c6aac1872085eddc1a82ab7caa02e905ba86995a8ec3",9.917710196779964],[15376,"e0e07ae77909cfcaeabba563ca4a1be6921b39eefbe3ed8554cc08a8288ddc76",9.317957166392093],[9695,"ded35809d3152e94e3a676a08e67ea1bfdf2ef228df58b4aa127de9566ca6fc0",9.317957166392093],[3817,"865ab7faa7495e1e1ba3b3058fae4f55559aa0ddba299fceefdb8ec25425dee6",9.917710196779964],[5118,"03104ee17f7b592665f04467a47dee640448658a8a1e00002b64287847f079de",9.917710196779964],[10122,"b0547a167cc160d412e7cde8265fdc7f46f502be17ef2088ba4eae2fb9558dbd",9.917710196779964],[2851,"563ee1a3a4415306d586209c4ab049cf28a193e7e731e984018bd3d343455eed",9.917710196779964],[5598,"278248e8bf0fa3323dcf17a43653d00bd301330c92a9368d79251b1d1b33a5db",9.917710196779964],[17237,"ebd5089ef1064a2036a7c64f5559905b05da99874b463dd33a6f9b13953e254d",25.158813263525307],[17778,"3fd4e5f9d6a6f0f042427b6077da86b77e8e3c4168d89421745756d87385c641",9.317957166392093],[3136,"a095dd9654171bd5fd3b55e46d6fa583d8dad60c94d2712b5a6fe22960b871eb",9.917710196779964],[1197,"7ba9154a803191e1ff1febaed0c325d308d8eced1227ec80479d4c82f1b807f8",9.917710196779964],[15247,"b0a604440aeaacc1237b62bcbf571501a06d2cf379bb90731acc02c66cf68379",9.317957166392093],[17290,"d227f3ee9b253f9c4c911066e6988d94dc8ec315a7ea88aa37d9733f6a91654c",9.647446457990116],[11340,"5af74ab9da7c3174dca659879a96a7725a05d773a9c33611c9d096723145b4b5",9.917710196779964],[2976,"c86b26ed14ec09aa6f0f2a5d779869ba3259130d6ffc3ab165a0c3fd172e70ec",9.917710196779964],[4761,"9d5129f0823f89cad83c2c0b7e6d3d07d353f3a13dfbb81f12eec87be75f8fe0",9.917710196779964],[14738,"1bf3a1343fdbadbfff4afa9cb67951619f8b46ed1707f76bf62ac933201d1b84",9.317957166392093],[4951,"a28b56f03529890058629654beaea8165db3df997f258e264061f3990a5e88df",9.917710196779964],[18222,"8b563f96d2773d23f8b9d9b373d21b28123065b9a52cf9072ce63ff0e3af9937",9.317957166392093],[14559,"3b2c6b982701772a66fbc489d9cbd4241a3886fbaab6cb6d73debcc8f8fadd87",9.317957166392093],[10991,"7a12091c651eed14594765473a4708da20ef1472906bc76a893799e51c610bb8",9.917710196779964],[10347,"f553f726327d5f2f8898601130b11727cb17b8ca7610430395059680c7ae0bbc",9.917710196779964],[17749,"66c86a50f631febf199c89c3483a706d88c043bfb95f3428c072a09b459a3242",9.317957166392093],[3471,"40a0ebe0a4cf9ccfd3cedb3d14388306c735b6a6b72f46e90baa27c0c66239e9",9.917710196779964],[11125,"033aa39525215bca66a58e962778fac6c3cbd235fc8c15f4d2b47586e0021fb7",9.647446457990116],[13802,"af61bbcad7ac074d1fde1a9e7b61140ec849565bdce7b3e43b420514dd6b5299",9.647446457990116],[19266,"10d85195e5f45466dea852462f766672f039984b07ab273a908f5247da7b1516",9.317957166392093],[16755,"3e608f90b6e2eb0ce327b40cd122e3c357634b93b32c9afb6b1e0ed1dfe25b57",15.003322259136212],[4310,"b3298dd89411fb8804bd2769794ace42b369642a731fcefbb9d48ce458f9b3e3",9.917710196779964],[19341,"f5755f65db2de440e2326b6e5af380e9bd39d2057427d0886971f99e09b9c913",9.317957166392093],[7729,"31fa587fd8a3ad4dbd3d0f619a25f6a427faa79cb88bd1a2f945c67ebf7e4acd",10.014641288433381],[1279,"466b82d3b01cefb3df6e65b3f10c7fe89ed5a9f08158b828bf56c279a6197ff7",9.997888067581837],[1360,"80c42ec9a9abe3d09590ff5e0cfe6174a3cd1eccb5bebd22f777d49a6b12fbf6",9.647446457990116],[8522,"807058a209642943cbce2bc984fbb74981f467650bff2e591767cb976910e3c7",9.917710196779964],[9201,"9a152558db0344c41973607e0ea8beda7c71c2415efd81d49a124bcf531b70c3",9.917710196779964],[4439,"8309d09a58ed1bb6798e47a4bfae71ebfae6c0588dd31043e206795a8739d5e2",9.317957166392093],[12806,"123b74e0b2fd9c9805ff769ea5bf1806621b8c7cf5d0260d83401fcf2413e2ab",9.317957166392093],[6417,"dad98a335ec42e78fcec9a33d2a320b91bc17adece3a9d33f6656c80224b2fd6",12.246461282264779],[17391,"d97ca9ff2dbca7e24b590d5da3f68c9780109c5f4c325d3b97c99b0bf2faec49",26.13903743315508],[11454,"080290b998003d1ca9fd06402d511a49de3b346db468fe331264a89d1357e5b4",9.917710196779964],[19637,"ab09b9a76723912cb901e0ca09fb834adc46710a1644c85e8d65994868494a08",26.002607561929597],[16274,"b35c3782ac171fff805e4902aa0851f762aafefc40ed14fb386440879ea9bb61",9.317957166392093],[8668,"b35fe3be8d844e7f6ee0de09a8df3e0924a4eb788b8c192ed1eeffa2d771ddc6",9.917710196779964],[2294,"23c1d669cbd27d721d912b417a1090779cc969f4f9049f7db8d98e79d88a0af1",9.917710196779964],[2999,"720fc1941917574004a0714ccc94b507b471bbd386b811bc9e043272d9f647ec",9.917710196779964],[5469,"10252f90f893e4ba3443015c4176910f6560b2dc6c1e37e53ef560cdd31a66dc",9.917710196779964],[14813,"2d223fe3f41b9bc326880e024f6ed5548b9c5172c3b781e6b392372985828282",9.317957166392093],[1669,"28f049e6b90691258b9a0af131d9f0bf8bddbf7b63fd3f66492923329ad721f5",9.917710196779964],[3444,"3c8f427fd5fb68a72b5e4859fb1dea559689d660a2c009f8a7aab7a8e05768e9",9.917710196779964],[1240,"45ee2ebc90a9a72c0a2dd87ee6cc0190104e4a42f0defa5490118a04eee6c1f7",9.317957166392093],[10169,"87d9718ac166b625b1f13fdc834aa07d8fb9ca2abad54c154b254809168c4bbd",9.917710196779964],[11247,"19b3044b2ffb0ef3579997b4672394d3c2d09ec8b332979b3e058d66b9db5bb6",9.917710196779964],[4338,"7e987f4a2dc4724639dca8cd4b5d4ff41a93dc480a5b6881878dd665a7bb81e3",9.917710196779964],[3056,"b7e299e852661207f221a18cecc474f3932b37714ed6b36be8202d58e61af1eb",9.917710196779964],[16567,"4464d5f524af247870e9b2fef553716d4f9127546123c33beaaaa342193dc65b",9.317957166392093],[15979,"e97eb40ec383f38c0509f4c45b3a64fd4662dd89523376308375931860f2f768",9.317957166392093],[14287,"fa4fcf2945a87b64ebd2c47641118c9e9019d51b87fb63d4997f9df9f19ef58d",9.317957166392093],[2242,"05f3e2ca69ac9e76653dd321825310e0c6304fc03fec5833962777d657ae49f1",9.917710196779964],[13963,"b624a24407621ebb9835491726d308cb11282b6f35e7242c69a0e78f87d5c095",9.317957166392093],[5182,"f39c14126fd7f335dab30e7e23e01c3406a3740450b42c325431a538874a15de",15.91459074733096],[9898,"6c343ff6bb3773eb238e276fb261802be76ecb1cbccef29ed79c4255c8a7efbe",9.917710196779964],[16509,"b8982536e828582c6b38bd4f42d9d83b167149522a65773a64a1f650e8ab0a5d",9.317957166392093],[10348,"be5cacf46500bc5459363a75e4734ab9c8d95e85a4f89ba779e07b360e3c0bbc",9.317957166392093],[18628,"276f9468348f46129c53eb5226bf597ea8bb7b08f1dc03c409eb86597215b52d",9.317957166392093],[6217,"18ffb06709c381f701e5b7dc6a4ca2dd74bf5173004c2b324e4592e4d719a0d7",9.917710196779964],[3905,"c3207d992c91a099e962c8b853204600099f7cce8f7328c20edd5266ded254e6",9.917710196779964],[2660,"92a17921908ee947ec907c0b1504bd7e334224e76605044846568e58b9adccee",9.917710196779964],[10148,"bf9be44ac59826a2321ac4377228e98a1da848f709c47d0e738be787d30865bd",27.097238895558224],[11771,"afed91e2c239810cd4b5521e5a2048ab363aa9d858a0c923798c8af30e7cdfb2",9.917710196779964],[9018,"e8c38ddbabbdec7d014c956eabb734e698c222637e5d69327febc5409165a6c4",9.317957166392093],[3547,"d48124c025ac16168b85f9b3c8bf1f85510522c92967534ba06cb6496614a1e8",9.317957166392093],[13593,"384f8e45ffbbabb1d2f66d29aac58633cb379ac24706877070b79640f3e1a29d",26],[18543,"edf3a2217c3b4bf9d3a1018d0ec6dc40486bafa7c0c53c5c38f1988cb4509130",34.004576659038904],[2951,"76e04ffdb3c93240e90a2e6be1c836e78d88bd031973f63e98e76d86ae80a8ec",9.917710196779964],[2298,"0c374261f6852a1cf4d853a1704c5b401da4b7f212c4562730bc669bdff106f1",9.917710196779964],[1418,"0828d981a7f0ed9cee09e5497e43293743b6a2ad85fd0160fc8ae3a6dcecb6f6",9.917710196779964],[2102,"d8fe9120e1909a0b8523611209bf26abb83e37261cb4494da78976af8cb236f2",15.078847199564981],[7193,"d824118adfcc9c7b1fc2909aa12a03d5ef7ae48567f3043e717e0758cdd0c1d0",9.917710196779964],[1982,"aaa54c8ed7513b340b5c80d439691709b0a790242baded9a6561e10c198e21f3",36.07578947368421],[1520,"73c4b8900d16ed76f69ca654a76329dad25f2e08ffc4e2900309ad36e7b9fbf5",9.917710196779964],[17204,"3e8553ac72a82770b8e7814dddd8d21c83bced808a9d99eb4a6b711e39bcb04d",9.317957166392093],[7774,"91b94f4ad2f6908eebaee38527b2774aa0b620e3e78080b86401f666b239facc",9.917710196779964],[1672,"5a2c9fdf033fc048adf3ecc5c14929d3ffff90781dd1f80dad0d9b62b7131bf5",9.917710196779964],[1697,"bea2b6a5e00d5684e7940947777e4f6227720958493e5aac27f7bfb713b7f1f4",9.917710196779964],[7367,"7afa7e3168d8695a50c78d71101b818b7bfcef9185967a80064e925333299dcf",9.917710196779964],[4976,"a780274afdf52e1bf20d0e816dd6baaf56e6e2cbd43c46796f47ab2e082757df",9.317957166392093],[12004,"1f073218e4a5607630c081ed9e53d950cd80258e28dda38a2f8a281b02404bb1",9.917710196779964],[18511,"85f0f7c21cf4a2c1857d44794bdca4c201734e42ea5630a9f57cf59218f43a31",9.317957166392093],[3102,"e1b049f12bb4f1e591ba838fec34ebd9008fd7aba5f200fca97015513bb8a2eb",9.917710196779964],[4358,"9989f7642ea8278f7aa8a290092e668543d819037b55ce9025b9e4c808c75be3",9.917710196779964],[19634,"347aa2e03da56e7f872d1a6d74df511bdfa49f5209f22feef0794a9faae35508",10.052724077328646],[14400,"9fa6649555391522223ecc3a0a6cec34070f66be8424a0ea86cbb24b28ee3f8b",9.647446457990116],[4242,"804e40761fc81e8f4901ed04894dfaab004f8e3d1a09bce7146142899b882be4",9.917710196779964],[15021,"bcbecae7227224dfb525fb05fd3aabfb38c7980f357d876ee6ae44ed12d2f17d",19.066666666666666],[3049,"3cc4267277dffd263356e7c4e27c66f2431c6d6d8f609d1193c0eaf6ec9efceb",9.917710196779964],[7262,"92ab77d856dc518bbc980d8fb44a493ee4913f036f1310d39b9849c6bdd641d0",9.917710196779964],[19782,"e4c436a2494c533872a985d4397fba63267b15ea3d1714649649eaca3a355e03",76.4648493543759],[15653,"b946f8c0cf458e9d7d9ad189aafb68c8371cc9f6b8fa2a7b79f6fd9fc9444570",9.317957166392093],[8720,"29571a43134166722505e51ba05586f593b5b052287df22f63a62504d4818fc6",9.917710196779964],[2511,"1bef220a2419d896da87422a4b77c7f5972bdbbf4961fc972ff3f78fec98c1ef",9.917710196779964],[3563,"7ed33cdcf785ac0e796cfd4f635b3fc0510e3b22d7ad8ace40f8e3e4fc2681e8",9.917710196779964],[14026,"0bc14b0b8efbe939588195c41709addd05b78bbd5756e71a13a7c2a7f38b2c94",9.914008321775311],[4774,"3c87a8b35b770fe0d803d057ba08cff176db3577f07ae4bf395fd77c9fca89e0",9.317957166392093],[11350,"d74a50d09b34a0eb1a1d0f2ef8bb1798b19009a1cfdb3d657b6f4740bec9abb5",9.317957166392093],[18919,"79f384c82266a59b76678f0be7cf98864d40c00d21ed519f3b87a8a78e2acd22",9.695708712613785],[6243,"feeab19f69a160f96a7028f0af8a013e690aa32f0d76cf0bb7c32557893570d7",9.917710196779964],[5558,"7f7589312022f829b1affcbd859fe66f318aac35d5bf0216661b129c6ba9e3db",9.917710196779964],[12322,"3d4ab692ca5bf785f85ce456b9a7863f710b480551878a210f2277241e6214af",9.917710196779964],[18438,"941fb51b3190274c22f4d89bd6ed937e27dc9ded0ad34fa31b96de1976bcda32",9.317957166392093],[18746,"f0d2781f7bb54bc1f414747d160493a7d5a9d5a7c479e0b167420e6153b8d328",9.695708712613785],[13933,"97115a397802227b4903bb3f4068d0f46f3a09098060b54d707ffd9b6d3a5196",15.073170731707316],[17332,"58f9e49eb2c0c2bdc0de942eb205363503631e26edf81e89a925962ef25b3e4b",9.647446457990116],[5888,"617aa3c95bc1d6bdd2acf79bb379e890a7d63fd5aef8bef031d525a4d1bdc0d9",9.917710196779964],[7742,"f1fecda136760933f67c4fdd22495233b00ec43c1a6e6b38120b74181b6136cd",9.917710196779964],[15560,"1d5457343ec887b54b687704a726720307f4f6862756a475a0f8bf9bb29a8872",12.905432175998332],[18650,"cc04e69079a7815b44303ec2bb7a3e13cdc99c3e2c7429f6759d0ef3c03da22c",10.052724077328646],[16050,"dcb1ce93d550544cf3db4567e53a1fd5198ce5c5dcc8b62e790b977a30f16167",9.317957166392093],[18823,"f14349d67b1b1e91b0c115c5f27e1d7c114393bf7c8df6db7fa9972227b6fa25",9.9938274535872],[8016,"d3e25b1c67c6a588728694446b769b56317ffbfdc23a52a9f8fb6278b93f72cb",12.183856502242152],[13464,"59a183c0008ceb952f533999e53d7cd79dbfac8fdc4d88237fe2874b0083c4a0",9.317957166392093],[11989,"be4256b76b21b7189051567ea4fbe4ca27c2070f927346573c13502505c462b1",9.917710196779964],[17425,"f41d052067dc5ce23353d939addef8a35a57fc31df78e72454e6606471ec4f49",9.317957166392093],[13343,"ee625e155f45a16e8c007116370414e4ddf1050b9fbac20ed33c8ca225009ca3",9.497326203208557],[14159,"b803542ebf034edcf2095a18e401d3dbb43fc6d10447872c2b57eb7e09134191",9.317957166392093],[14212,"137f019f93c7f4ba14e53261aa9ad76a5014829da8670d5319d15a3fc46dd58f",9.317957166392093],[7563,"36292607cbd24c7e9fafd439873342a675b9f8e24c177a384033397acebd6ace",9.917710196779964],[17651,"83bbd0dc7e33c63c8b97193f9f7c74397dcd77ef7822ea20f9f0bbbe4ef03344",9.647446457990116],[18969,"3dfddd48ff829c7906642c9372eb1aa743bc875738f21f8fbb10a742a5d99221",9.317957166392093],[14700,"04c5efe2c032ab743a2a23efdda77e594884bbfe27e90e666278090775aed784",9.317957166392093],[6390,"4b644a85d47de2309499c34dfa267ef31534d49b93f984c27d090c94073064d6",9.917710196779964],[12253,"8fbcb9f683f5687a5de66ccdd9bd41d74e21d141c6201428ea22dcde8bdcaeaf",9.917710196779964],[1460,"87624321790278e01f390d85f5ac4da7d95dd15ce9405967a16e9ea6631a6ef6",9.917710196779964],[17734,"cd2d58c0f304fc1ae796bfc975112db5d646c71e028d402b948009fa37868d42",9.317957166392093],[19199,"5334363b2953820969285c43c320b120fae358904b5e279d445865bb721db818",9.317957166392093],[16169,"8f0fabf330b594a02eba2cf3cd9e93ffc5ab16904c53193fa3e5b22b4e149664",14.931818181818182],[10037,"7006d3da36341b94beb986ef5917dfc539adb8f81c2314fafff102d18e6818be",9.917710196779964],[1161,"5d402640dc9cd0675f6388852057da738dd896b73678b6506342ca4882a539f8",9.917710196779964],[1716,"c5495c4eb39972cc793e1d71d87e552bb1376fc25f8665445635c7b1514fd4f4",9.317957166392093],[1513,"f264dc35dd79ef6bdc328a564d21cce3f053640f9aa3069ca929227cafcc06f6",9.917710196779964],[18221,"905b050c68c59cbd5c99ba0078b024c6a960fee3efd2c70bc28cde5cff879b37",9.317957166392093],[10902,"cbb114327ad8b87d5f7176fb40f828f02bff9d66d7dc37720b148b309a56abb8",9.317957166392093],[8043,"4d16b1aad5738b0245203c93dbe0c3e62861ffbf7fb06b0b7288a23b42cb48cb",9.647446457990116],[12629,"64331b05c252c8dc125318c9a9cda9e3a17e182b7f34199fdce247b5944415ad",18.57371096586783],[10705,"3239afc9b69f9372d0c8a89608adeb38c46f8ea2ffa1663d9b8e20b55c97f9b9",9.917710196779964],[2645,"6aa0526ba6d3705ea490dedef820d5d8804b1e5efa439109bde9524b75a6dcee",9.917710196779964],[12436,"c0d2a9e8436178e0978c89d598f999158f4a0b760a6ad46c6a2b92786a4a5cae",9.917710196779964],[336,"6e725fd85ab7b249ae9939ae5e6ef5dd3966d49206eb1414d6c0ab19a390c8fd",9.917710196779964],[10192,"8c4deeeb92143f12156339d155e1b60d446766d3cd1c879da97237dbeb250fbd",9.917710196779964],[12122,"6399943811386cdf3402c840d287388d0471a81d9a7777da31a92a0542ac95b0",9.917710196779964],[4824,"436b888ac89ee135e938fa1c2cb7a7cb3c46904ee8b74e3c24e83fa86d6341e0",9.317957166392093],[13141,"e0ed8431428dc5474d35a71711cde2d2052cacd13ac8b5dc0af124dbb22d1ba8",9.317957166392093],[1663,"3174331f470a62bf50a418811cd2f07690d77b69de4cf87add2c1f52ffcc29f5",9.917710196779964],[4489,"26f07a5a77bf8cdb5858089cf125a70624325c16459c7df1b4c540f67b817ce2",9.317957166392093],[10202,"71943e3dc08cdbc89b04d5027e1c0a7a8d9eb30c76bf9441ca1dfa51689600bd",14.188034188034187],[5667,"6d684f113ab5b9b4beb24218ed2a3ffaa387be869e5e2a2f2abbd8d4d74838db",9.647446457990116],[15284,"29933fd7705f183aec0fe086fc9d03ae028d1ae1a9aba04bcf6f12ff6688b378",9.317957166392093],[2731,"3de9f1a38d253e913ff302d81157e3723bbd9ed9e7c57524a45ac45cf75b39ee",9.917710196779964],[1003,"0a068423d45fef7d687169b2ec743f76bc9ed09f2d51b9b379d0952fc65f34f9",9.917710196779964],[10016,"77eb53e8696d964caebd1f024a18f6ea77a25d4ba2ef47f80c12c2d904bf39be",9.917710196779964],[5890,"b41bd7ff1a07555e7ea6663f062465fe9ac16e686e1fa489b0eb141d8471bfd9",9.917710196779964],[12072,"77c13af75cdc2c062a91aaf8baef5d964db36e71fed351ca22981e75fc61dfb0",9.917710196779964],[14717,"f8c9f071404502a4ec6debd1155a3347fc17c45053951259f26d6cdf31459084",9.317957166392093],[16007,"6300fd69da8fe0340add898966072e143489653b2ea127c0004aeb5c11f85268",10.052724077328646],[5422,"96f2d91c5742ed94185d17f2065947cdda165762c92cdc5872c2b78a2044addc",9.317957166392093],[10628,"92c265766a0b4787c3144245dd577fb3c1ec8083a26acd5aa8e4075da16582ba",9.917710196779964],[19332,"e31257a3ef46feb9cca41de61c198fe0ff0aa2d2d48f034c452f019636842714",27.144385026737968],[18053,"3f4b5eb31417b1d7db70e7d2111f714c1961ba62a4af4140ee53d1078b9d253c",9.317957166392093],[3648,"a5e207aba85f5eb62cd84bfa3758f119c0c9f1b83addbefeffbe735bc0bcf8e7",9.917710196779964],[764,"7b8cf28003578a1123c7acae31cf6da94008252f9bbc9254377e814d358ccbfa",9.917710196779964],[6406,"091ae562035b91f376f2556662831a64c0af8f6fbf2c098305c0165570a549d6",9.917710196779964],[6093,"5d15f57ec8a4acdd6e9199e044f5712d787efa6016f6b78dd4964d18838c70d8",9.917710196779964],[13102,"5a48d45101714364a662139c704b67fc90d648dde77fccfa55674ff7298a2da9",9.317957166392093],[834,"cea8fb3ad3219df6e52f324df59ac4d4eb1aab409c6e1766990fbceae1f451fa",9.917710196779964],[19798,"ed6c868d919fa143060adcb90cb6fbf6acbfafa2e58f8db2bdad120937719902",9.647446457990116],[15391,"f3abe69b09ab20665c6d40738e2d638676a13c4990f78b7833d793f391637176",9.317957166392093],[3174,"1cd56608e9849551e7d984880804fc445e5e704bf504582f122c0568636b31eb",10.052724077328646],[2182,"2bc16ab6c5f146bf8e4904fbed4cd52826daf8f61f140610d7970c91729aabf1",9.917710196779964],[5967,"2dd0d074e4a2439d403036136aa1b627d338b47f7be0f8ddeb3fba5a6bb44fd9",9.317957166392093],[16968,"6beb2b528ca17e24a5194a57acaf19da5ab9c70f90d7f60c24694192ca83b952",9.317957166392093],[17027,"2f74f50028c2e8f1874b0354705abff733d646dd55870a49c2a88b6b34a56a51",9.317957166392093],[2164,"a11be8aa47f09a5af700a1d3461473ac5abf7138ed5ec40a21124781f7cdcff1",9.317957166392093],[13795,"624710b50ce02ac52e83ba11f1dd3826aa5daa1a79e5aa02bf8133d31fa67f99",9.317957166392093],[9268,"4bd36ac093f2d894d7313d21ff1278829b4ab04d333732e416c8b4bdb4290cc3",9.917710196779964],[4575,"7d3112f368a231206cbfe76f66433f155dae265131a05ea7489453968a20c9e1",9.917710196779964],[9516,"cc7ead2c286fa94fda43808fc4459498820beaaad7060910ad9cc0fc4b1a97c1",9.917710196779964],[2846,"b17d164e4417352e7ee7b2a1dd35935b7d88ee3158ab25b2156baa3f2de660ed",9.317957166392093],[19070,"247723601e4095b0a5f30231b2eed26e4c445a8ffc0b54cc7c988fcfc0d5db1d",9.317957166392093],[6237,"6e33fcd423cf17a0800f147331df012650f86f89d68602f51b97e0f6b2a57cd7",9.317957166392093],[3641,"a9202813abb1782740fc36ae9a5282f66429f3bd4227a5d8d88578510cee00e8",9.317957166392093],[10557,"005a7ec9783e2e911f2f6adc4370641c7ba2ccb03744f1fcdc6b91d41e58e4ba",10.043290043290042],[5641,"e2d996e3dbc1daa8ca1b30cafaa30aa4ff0758616082f70286d37d58e54863db",9.917710196779964],[8941,"bc85d353c7181b32b667b90546c43cd71c6041f72e8b6432dc78613f05183ec5",9.917710196779964],[14737,"e03c77e00f4bf345209327add3d0c992f28ed20064d42e301c4c28c1f2cc2784",9.317957166392093],[4995,"0fe13af2391a30bc6a8af0e10ab17228b39f4c0fda0d34363998a24f546d38df",9.917710196779964],[15712,"41dccb2d4499ad2fb172a8cc579f2e0f7f8aec0491bc33355637c55053213a6f",9.317957166392093],[6930,"65c075f217af3aa664b6a051e9d08bb04c455ea4d32799dcd372d30f0b446ed2",9.917710196779964],[12474,"11190e197bde99b7dea0fb346d56b18c242f44354d78522be78e6e56298d1dae",9.917710196779964],[17038,"26b2f7377ccd7e5a99d3ebd6943f5fc7e1973db78625a891e0366414b2963351",10.053475935828876],[18419,"d15577dc745796a4be38df609f2d696088b184e1d05db6549ea74ebdd17a2833",9.317957166392093],[4118,"18e8a237240d5a8bc5285edf46a6203e0fb5fed6faf44ebf71838b401800f0e4",9.917710196779964],[4893,"8f996bcc210ce5225deb471bba61a013c4198418dc017e5cd0a684d4cc3be1df",9.917710196779964],[4483,"5f35d58c35657cad5d016feb7ef3e7a8d5be833f15c2effb3f8a657f436b85e2",9.317957166392093],[11436,"c731b5eb9d6f0b215de3c78b278c89de057dec62fbfa31bdb36eca4446350eb5",9.317957166392093],[12757,"6d2486634f70c7cd676bff5dd021ca09aaf72d0a6d9a84b7ee5a929b9f3132ac",9.917710196779964],[12314,"838c51b5e78e05fc0adffb7a10e7e66d7c73beedfdaac152e0d5bcce3d2f22af",9.917710196779964],[14988,"18e100582f02d35047f18f0e1866c5e7c411ffc747693002963bbf0ec4fcba7e",9.317957166392093],[13826,"27e5b7847f6cc4971c60b01de5a2160f9433155be43f8e76462e181af482df98",10.052724077328646],[8142,"6dbcfb9a7a0e03ef5628ddf2b28ade72eefcf3836a390ed3b177d42c1bb86aca",9.917710196779964],[1474,"530b388f077177815dd484b5491926838532a4d63429a76b5a4e5e1dc5fb51f6",9.917710196779964],[9901,"a8f9f2e0c27b746350f4b00782ec466f31504ddf2fd75a56757fb0f4cd90edbe",9.917710196779964],[6110,"ebf6c13558fb96bfffa21ad384a348e675980766b10cd4def25abe2353f860d8",9.917710196779964],[15443,"32a869bed33ccac8764f31eeb05e50ca0f22edc2f0b6cfec716e8040297d5075",9.647446457990116],[4792,"4e1166ae3419366b8c4975087eda3bb182223ff9254038001db2d57112406fe0",9.317957166392093],[5287,"fe1501edb3242e4cecfcc8414dd3df94eb55ea139e4a823754ce3b2d02867add",9.317957166392093],[1970,"c653a869dae8ad7a02252e19edeaf4e92ebd6792e82bc1af70d76b9a938033f3",9.917710196779964],[11882,"261330f5b602810dc2d54aa5099cc0c834f0f52be2de623c31b5039d109724b2",9.917710196779964],[10783,"22d3be8a19bf8c5322fe7143005e76d47c289e34a170aed715729a55832a69b9",9.917710196779964],[14221,"25d312d1c1940e9baf4c14832ceacba6e60a2beb335cfb70c068f0155f60a18f",9.747538048343777],[5969,"f44fc36d68b4d50055f63b211202be1069a655333481740c1cec8a5a8b884cd9",9.917710196779964],[12151,"b5687a8a3b4ca1be874d83970d73b15701ddb1dec71f220c764ca25d75c45bb0",9.317957166392093],[2088,"2204fbaba93f3fbaf2bd393647eb35bb9352666e13759bca15d1704998d54df2",9.917710196779964],[11151,"03ffcbf5bf55734dd256e2d88e4eb6253e1f1c3ead5b6b855f2dc10ee114f4b6",9.917710196779964],[2223,"08417ad7c7037d7567130f31919f8fde5fe327005bb315e293f26f3124185ff1",9.917710196779964],[8814,"bc4b3c590c73aec7e1dd5bbbb184b51ced25e9c033dd707b4cd0cd5f474c04c6",9.917710196779964],[8365,"406c5592bfcd297a8e8925bdf1004ba54d7243a212bf4a8f130e66db2e27dec8",9.317957166392093],[3691,"6b8f181de48b717fabc9d0edc0d5c38959bd8d146e52fe663d80f7b256c9a6e7",9.317957166392093],[11032,"b54872b3aac4a43ff73c79e90ba2728c2e9daa29df33ce0da4ff2d2cc5c9d4b7",9.917710196779964],[6777,"4df1d71a2b8807fd19fdc64b98d533a31ebcbb2ffed8349f98dd569f52e86cd3",9.917710196779964],[16605,"f003e7b792574f218476db5a7ce672abd2b1de67bc5ae96204d06caf43c1b95a",17.975975975975977],[3394,"8cc6f19da3c1b61803b73fbd8885e318b45f21d37f24e6a3a6813d1a77fdb2e9",9.917710196779964],[12617,"6029b5c571abf713f505e98d0843db0bd06e9dc7912d794f3d8e70d8cecf25ad",9.917710196779964],[7532,"7c065123d2f45795639a6105620aa1818ea27ef20accd4adb20c3897813597ce",9.917710196779964],[10788,"02598a15cc13c3d3aadcee847aa7b81b436dbeaf2947c9bb8e3ad795bf2860b9",9.317957166392093],[756,"2ef665b66939706174bb4d815540e49855b65f498c6eb9c5b2501cc32a40d3fa",9.917710196779964],[9467,"1b029ca9b25e742883e309c0efd55272d3cfe6db8c11870a1c9f57bb7306ebc1",9.917710196779964],[1216,"e602172d6102c0c7101f60d8ed1fbf6f13f0080a237f648ac751cc2a0658e7f7",9.917710196779964],[14977,"4daf6b76661f5cab864acf435b23b5a2b3c5bf2cd16bd766265a54ebe33f107f",9.317957166392093],[19665,"0d96afa5facb67275da30196eaf0919f5012a1e0df20f4e83d586156f9cfa607",10.052724077328646],[4412,"e5f501a5f081a73a04db4b28bc32454ff11f20749842d3047f1c85fd725200e3",9.317957166392093],[17835,"355ed36bacdac0bb16517565ad09e90b4b9e8409973142234db1abcc64789140",20.03647416413374],[14836,"0e450f95f97f3266fd43c6eff7fb7f6c7afd61a668df9db17be3b57eb8d73082",9.317957166392093],[275,"d476e21f3cd00f84ac63779c9e52609429088e98eea33b1b97b739faf9b61afe",9.917710196779964],[11676,"196ac44223392c63d1973d9cfc7718af458547b029b335a78e624c05533b73b3",9.917710196779964],[14910,"5a8264520a00995852d879e16660951154cbfe1065b4c1cfafa6069be9ecc880",9.647446457990116],[16928,"b533f85a8fef0b042e152ee7e59dc7496c71cc73e7c271795cef09ebc9538b53",9.317957166392093],[1567,"ce03f1a8b0176253187658c5594ee4840f85d5090680fd57516527d7b0c7b8f5",9.917710196779964],[14584,"33987c5ff9852eefb09ea9ce730045f57b33e75c5dcb12432fc5bb4b869a6e87",9.317957166392093],[10507,"9a47529342ef7ed8f5b6dfa024cd4601f71012a12c262a58d89f2666f23823bb",9.317957166392093],[14173,"437f4b1f9abe27a84c23c5a3dd2ec40f302f6356cdb427189e689f98d83ff290",9.317957166392093],[6971,"be469131c38baabf0bf8f5397e482b223b3e48b544a241cf5db0b834aa2429d2",9.317957166392093],[12254,"3b535dc5a8346229585af1dbd6f6c42a73edddd53370a5d2377fe3b313b6adaf",9.917710196779964],[17402,"6760b0dd3add51cc316f977a32fb96debad0ad3bcf07f2b500d612149e4ebe49",9.317957166392093],[14515,"a0da40f1826d6f95d79a02745cd6c700b56f9e6572ef5d3f57c6c0551e4ad288",9.317957166392093],[7354,"b7b835c1742973345d111ca37ef816a85bb466673a0699b617ff16f8a2dfaccf",9.317957166392093],[16156,"aa32b8cfe806a88e34ca9b49232f819c1e87503ea982d3001a0736056d8eec64",26.173719376391983],[5960,"5eac037f49341aa6e87613e9e3dcc5714b7a3e4fe00a6bd5af6b5818c6a859d9",9.647446457990116],[3165,"87ddd2cfd294f077868ab0f853165c34bbf29f3bbd614504dacd87b8f6a247eb",9.917710196779964],[66,"51bbbfc643354c7ca9838c517a80afa2f6b8537ea4a06c1d0ba9623667518dff",9.917710196779964],[6359,"efa682fb8c2da58156bc40cc00c797a787483b8dcb2db9485b76625b97bda1d6",9.917710196779964],[16033,"134d1c8e66d06aa73bf5667903b4a1db799b200ae2cdb15a23038e2b9f42c467",9.317957166392093],[4849,"e1914445988e96abed978cc7f9292a14f96a042df581d42c5acba556bc7525e0",9.917710196779964],[14392,"a2a0efe8555bfcc3d77a7fdc7917e3c300a0c60edb5c9b9d18f0bedc2d7d5d8b",16.975265017667844],[8044,"ef3d88819fecfb8dd624a57fda9e3371eb78de93a6a2ccbc3721004d36e841cb",9.917710196779964],[11595,"f11f9f5e267c8498b91f0c8992da2a7bf4a388c59a69b7ea1977f1a1ed69edb3",9.917710196779964],[6538,"a983137ed0e58b8ac7c2ec0780db2f0dad8b928d7d6629309b46f009aaf61bd5",9.917710196779964],[7387,"329a6c44215e869c7c4fe047365f6ba29c06c747f9d1652dc1acc9b8f07b80cf",9.917710196779964],[19158,"3186b4e8b49975e1f568ff4c36d760f0f149786171f961ab9bfd2303549c431a",10.052724077328646],[19287,"d1826849ec1683e9304e37a35c437c3eae277a3bb1e0420d9c4d4ea02fb63415",9.317957166392093],[4215,"3e61e4e9c7d69b45d3aade0ea88554dc84b16c17e2ce6414e99537650fad5ae4",9.917710196779964],[1193,"c794653caa16f84deb849431987bce32eec53c3de1faccc5c90e68d5fd100df8",9.917710196779964],[5754,"9dd8fb48fd67624d74906c0cd54d0821e8b9951f9bdf547c2e69b2d60f80c1da",9.917710196779964],[13642,"de5dfec989fe6baa4cb296274a81f0d3d3cb54dbdcfb860e68eac774705c6d9c",9.997888067581837],[6213,"47a81714c46724d0e13cc9aa03f17173f865d4cdf3a72a01f47450f9472fabd7",9.917710196779964],[4082,"db2c68273271ae4d19cbb827abe069aece48ab820703ef5a267e9462500e2ee5",9.917710196779964],[10442,"d719aae241cdd7bd108efd0d0cff58a9ac7f046d21d130493de78fcfa19c7dbb",9.317957166392093],[6478,"11987e534a2f7acca5ddf04bb6bb7e106fec6400a943e4ff40ec96ddfc619cd5",9.917710196779964],[3684,"f09c04c441ec818cb3ba5aaf2bc774bb0b2ccb1df6f05e08df664a3eced9b6e7",9.317957166392093],[7862,"46a49631fa65f5a9c54c0ec41443a9d45cd6218bdf3db02e5e58f6c656c279cc",9.917710196779964],[8751,"03a5fa5ced01c03c3c970c58c6da6c23abadee17512287b349c74bd8e3fe5bc6",9.917710196779964],[9966,"fa53b3a0d1dadc78e7e989add878262e8667ee68d2bd16aaf67a6a9c601a85be",9.917710196779964],[3978,"e27be6ea62f3b9f95e36075351c2b8bb90f331bd8cdb197c51e650191688e0e5",9.917710196779964],[10728,"60388f0259911b479f1e46eabe73c89a42e7d39d68fa86195fcf221a6706cfb9",9.917710196779964],[13189,"738f8e4e77d5ebe43054ade78ce4348df1efaf72f16a292a92c5fd0cae051ea7",9.317957166392093],[13123,"17901de614c16c2d560fb475279238cfa72ba5d6f1ce70a2a21f6c5685f27da8",9.317957166392093],[6998,"45c282207402c30aef9ee9603552de691c97279910aa1cfab0d3aa9f73cf03d2",9.317957166392093],[9381,"18d3a01e7dd9a32f82de0ee1e8d5f0caaae77b0d2f79deb67a510411ab3660c2",9.317957166392093],[6978,"afebb8bbdf7a10a3442f77374e2627e3395ac664ecdaab2f491161cb482c20d2",9.317957166392093],[3631,"406b6738ea26b2ce542114e88ff035fbb3286f0d482135839c46275048250ce8",9.317957166392093],[9734,"e6c25832a345b25e83ad0a0ed594703f51d13dcbe7501552d54fcedc53f614c0",9.396192203082503],[9604,"1ce48ede0157a4f2b39403628f8f5dcdd5c28867262b4daeeb204f9750c403c1",9.917710196779964],[4233,"4d9c59277a17ec896bf9be35dcee8dd9cee0ebad8bd6033f45512d9749e831e4",9.917710196779964],[14941,"c88a2870ca234dbaa9a0eb691a012719bf9ab0e418bf4155bdd1e6afbaeb0380",9.317957166392093],[12576,"89060392845af482014143811e40e201dbfaf8f66f3149fa6204178fbaf969ad",9.917710196779964],[11467,"807ae2209972c0d2c6f22d30a3d7d18fedc8117166399d98acb1bdbf2b49c3b4",9.917710196779964],[12029,"508cf162318149675b1b211c8e473ab29c9508f5df96bb1248dc0e9bcc611ab1",32.348688627552896],[2487,"257e41e7300165f5f64233cc27d9fddb4de3b57d9bd4057ce20092d83c14f1ef",9.317957166392093],[17229,"a65953cbe984c48b15ec690604da5da1fe5f3e8dc8bfabb5eb7f228c47f0534d",9.317957166392093],[15543,"8becda7b0cdaf4859966aa1e05846860dd299d2b263012f713579c30a7922073",9.317957166392093],[19123,"d992d3b452b0a317d56450899d01bb6ce349614e29acf5cae1b77721b6ec691b",22.3018018018018],[6659,"387066f6dd876dbd49efdc0f4abcf2ebf39070c88eb3a4324c8655deac1f42d4",9.917710196779964],[9296,"d7b5f3e3c771eae08731a6086554b92cf0567ee0d2aface767487d00fe89d9c2",9.917710196779964],[7416,"f737952a3c3f60ff0e2f7ab78af858db4dfbf5acb038acb6046dd434d5c948cf",9.917710196779964],[3962,"5fde6f2a5846a309fe675a0359c4b378a58fc0ace089b7ed80ac39cd1f2af6e5",9.917710196779964],[16860,"35ea2f47997be231e5fdd6d065ffc40d678f98e0726954985a3c2be720801855",9.317957166392093],[4342,"0cfafdc6937dab57eada0bd2d3ba3d0cf5629c44afaffc74bb4f9d0df4b077e3",9.917710196779964],[9294,"3335620c748141f47c52b024130aa6f26eaa547f39cd4e1257ad8acf4e1bdbc2",9.917710196779964],[6140,"26dc8e67ae1ab05be8c718cf45973a7f8e2816660b38dc66ad4fbb66009f37d8",9.917710196779964],[14789,"095c245aae3729aab1a45ada88748c3d205598db7089e069f465ab3763951f83",9.317957166392093],[5853,"aecfc6f26e2b3c1d314d078e4dfdffecf292d6ba477e495d441208855c81f9d9",9.317957166392093],[16861,"0a24cc615fca4fe127d6dd89a7737f5f5b5f4cbb8f33039f146301b154351455",9.317957166392093],[12400,"793504bc73c965f1249a42ae06445a5262dbc1ee89b2b348cc8dacd524af99ae",9.317957166392093],[6434,"4a35562acb537ff474edc7677bd06ea817f1c00b64a12e0823c6ec8f560707d6",9.917710196779964],[6319,"2608104fa5ea9065a70133252bb2c84fed352e159a1854f0dcb6d7b31f44e2d6",9.917710196779964],[14066,"fac30e50972271fa1741dadebe34c7196593b97abdefc28c531f8030fe9b4f93",9.317957166392093],[364,"0722171df75a262f0d4e216f24cd7f09433734db608d0b2c4f568f59ab66a7fd",9.317957166392093],[18380,"3b94707414a03b8dbf4f47692b5ce459040697d7fa47c9b40446a89ce4050b34",9.317957166392093],[6675,"0eebf543f5c66511ac00ae489be79ee8453ffd37269da21cc34fc97142fd27d4",9.917710196779964],[6397,"ddd92a714e4b9fef93591cd61a36a5f4740a6077343b5442404d230d38495bd6",9.917710196779964],[11654,"5d9f3f1b90489c8c9eff1f1a49cbb30b4f77fbd185cd3ac169b372fa092292b3",9.917710196779964],[11233,"84d8415ff7997708a2a440961bd289001e8157786ba1029e3618fc93de7678b6",9.917710196779964],[9708,"44ec7654ec6d5d9eefa9a9ba3a76b04a06d9961cd4f553c39c085d1e05c34ec0",9.917710196779964],[3973,"723187b15c0248d7cf0f1beb68dee15890de26bac077320b55273b046330e7e5",9.917710196779964],[17777,"04bb7e132eb111b317f5bac623430eaa504f1dc2046d8941cc2d3650943dc741",9.317957166392093],[2728,"02a8a0f62e0aa8acc7f18a1e36f8786c659057eeb52fcec641b7ee30651b3dee",31.40916025358511],[12390,"b118f3f12ffea21d2b6fbd704ee067c6e2859a49bbb9ab8ed2c5d41fe3b0b3ae",9.317957166392093],[13634,"8206d485ad13330d2bac25f8d23e0e96fc77a453e5a3d193fa93e4ff42d0979c",29.388392857142858],[12226,"f795cd6f52e83145ecd76767791eae9a1de7892fef7408f8ea2af0ef6104e2af",9.917710196779964],[16793,"58916ff4696e7666eecb62ff3e9c73fb5271106833a834413a468166e8cb7056",9.317957166392093],[5051,"a57d5d1daa8ed545e6aa7790f699f8088267dd29a15d649334bf14cfb9c2dcde",9.917710196779964],[11574,"6b11675d91904a4b93482fa3f167de5e4f8b788062deb17371e31292699b18b4",9.917710196779964],[4559,"c9a2813246d3dacf6f01a0b686f4606e6503e9cf2de92b3d22c40caf4758eae1",9.647446457990116],[19058,"15bd12707b71612b04792b32db9f52865b8285cf7a0c0bea8549f413e0357a1e",9.317957166392093],[10065,"65af7b33ca7e23689dc21f41105c5c91a855e57e7f4bab7af960ac82c082f8bd",9.917710196779964],[13909,"42078e35ffa4694785061ccb5de6aa7d3243d8a8d292c2e50a7be9960b72df96",9.317957166392093],[2953,"dc0866d75f2ce5c1c98e64a81383a96bd338e6df529ad3576b0931cd2a91a0ec",9.917710196779964],[14091,"1f85635ead7b23d7ba4191009be49e974359c355463cf48232e98a444b6cc592",9.647446457990116],[10099,"73be06a2492da4c16ca384ba4986cae1774beccf11b762a60f32300c94f6b0bd",9.917710196779964],[5970,"64d3a21c97e285aaff29c3714ab33221e73b0e3f3d3869d4824e334e49194cd9",9.917710196779964],[18083,"7906df24d3c79bb66e450f81d47810a5c3db1cf09bbe801990e82f64c5fa763b",9.317957166392093],[16135,"def19bf9af45e036989ce291ce73b840c342817db5bc08b526e3dc5e1d065565",9.317957166392093],[11635,"330a4479bf20e2febb18d43af78ca7e2091f90d0d39720eb0924239de393afb3",9.917710196779964],[11122,"82f2406a25c84fe5a697ca37319265cb6e486b98746e1331ef7dc4b8d23c20b7",9.917710196779964],[11082,"2cfd204c9248466bb7e7a096cf6890b16c8c1815fd0af78ce66e72052ce563b7",33.37251787132645],[17534,"9195133733f2311f932d46d0a887de0411ea352ecea3347102b459e632dcdb46",9.317957166392093],[15339,"cfdaeec42235940a7a233c1e677273f67ab34e275ca27bb479dd556e28a69777",10.030959752321982],[3863,"80c63d0b0bc7bdcb8e9c72183bb5756d36c30d37bd6189d337180e1a1ab596e6",9.917710196779964],[272,"f4780896fbe98a30941bc2f724c7d2b940f2d7da1e924d53746d1b8e94e820fe",9.917710196779964],[14369,"e4bf23fd405671b5cc4a77623baebfc1e63fe64a3bd0ba49bee66bc5ce9dfb8b",32.191953465826465],[12290,"04646fac750ba91cfcdaece71b3fd9f0c3eeac260dd9eb2dcc0d6032f1ed52af",9.917710196779964],[16194,"72c32527ec8aff746cbeb2e1c3c582b58b0caab31c083d31a4fe1641f4fe1d64",84.9795918367347],[11698,"7a67eb28a15f09ffaf750549836c8a91910220c110dbc63a44d4c46fece850b3",9.917710196779964],[705,"2bdfe8044c62b81b4450fe3378528ecc8ace0decd74e2c358742a3bb00de2efb",9.917710196779964],[3676,"054f866dbf61f70e9804764b335bdf9924e3f4b74cf01f63e58cbe717827c3e7",9.917710196779964],[1497,"403beac8d785f82106165ea5682922a19456d6f88757a49eca38d4ce684d23f6",9.917710196779964],[8649,"fe84d9a74df58fcb6271c726676d9471e2e4f03572297f12a646951b8a760dc7",9.317957166392093],[9591,"425f5d160732e95153929530b3bbb85e084ff15b3e431025bc91156dfb690cc1",23.227272727272727],[12103,"aedc0f8f879950b1ee66dc7ee99ae35fd335ed0ae5acbfa9a64bb32faef6b0b0",9.917710196779964],[4943,"38c573e1701fb9e38a2065eb28b048ff09666c5da8404cb817b587d504528fdf",9.917710196779964],[11659,"c3f40b0697c0bd3bd2551a6720528d6bded7c3bb8dcc4847fc16ad393e9786b3",9.647446457990116],[11250,"acae84e394311e524127d07938783ae21dcdc562c2f8eee6bed6fa55b40959b6",9.317957166392093],[17429,"cf535de92803cec913c6a2f60bb5b0cb2f2d5ae8f130825cf410bb1f754f2549",9.317957166392093],[17433,"52379af14b13a4ef3be9e88056f111af6aa3c12f3432cbe2e82670e692df0a49",9.501030927835052],[9833,"fe6bdde6c850602712b0238f8749f76ab361a691a212c96dd5edc253d3fb65bf",9.917710196779964],[8857,"828a6be2c266253bea691dfb3c2b12e484ffc636347dbe3ff31fa3386e8bbbc5",9.917710196779964],[7308,"a779f32c449e69204f7e84ef670ce00c939b3f2bda107e2da6cd8452a3ea04d0",9.317957166392093],[5879,"1875edea499372dc37e5c907886949b0190fb60ee4ccb8b8a1feb4ab4805ced9",34.89679715302491],[2168,"02fac7807ec9bf591d7764c5950e5344b537ba1308ce383df5f73d6b1b83ccf1",9.917710196779964],[4386,"a3c4e3498991e0009efd7f62e509d581eff5878f7e113a42dd785bcc1b0229e3",9.917710196779964],[2832,"55f8259d0b8f193acce6b07a69a26950d4b9c1e25b33b91e842eb29525827aed",9.917710196779964],[1069,"a4ef9a2bed6fedafe8edb6793ccc2bc0ec43b45d3301a3cae2721d14b978c5f8",9.317957166392093],[6215,"5b8766af02fd806084016d8d611ea6721a0af5308c4016c215813a649c8ea3d7",9.917710196779964],[1256,"5a624e2006ca20223859f52747f95b485075a0ee07104d6b0288dfcaed2e9cf7",9.917710196779964],[7468,"ba8f483a68ef1b50bc32f63433120d39f7524951c23507db54938df15704ebce",9.917710196779964],[15548,"411657fb007910cd28a766539b51876a026cf2c613b352b3998d1fa6795fed72",9.317957166392093],[17233,"f3b2a06271031ffed624845420a4f11332f093def132384b860cd9f653b63c4d",28.09964412811388],[9726,"49986361e5fdc1fde7005dabe51a9eda973f2032230eb449710b6a6e47b125c0",9.917710196779964],[8526,"66607be896644f7e5129ea81422dbee76b36b7a541669dc5a02bf97d1477d9c7",9.917710196779964],[7070,"c6ad10d5224680d6190662e7fc46312610c793c84a4ef4c2e735d1c2d6ce82d1",9.317957166392093],[14143,"bba95d72a12bc99a46cc18f60645b1b6644daed088126e85b401feab5b27aa91",9.317957166392093],[9059,"1f694f4b3eee9a417f9973dca93d90a0fe77b578667e075689946490ae1f68c4",9.917710196779964],[13321,"8cdab05829fcd051bde2a5a94b3a3ec5835c2af84c93d1650037635c5df631a4",9.317957166392093],[2509,"ea46aacde5c74c9d68f7b790c5840b3deef3fb3f572cc21a8ab424d99c8fc5ef",9.917710196779964],[1312,"910f67de2a579f9a4894917170307be127c565d72ae9eba1258b39ae22dd53f7",9.917710196779964],[16222,"4e3745d42f02077337624d97c6a6cda8d91065d05eece41e64575b4b8e0d5063",9.317957166392093],[2247,"3e09fce2ad854dd5343fe58409241a98924f8454a3378dd72d5d8144ca3243f1",9.917710196779964],[9861,"3e05dc1b9f6168558a63db6488b6c242ebb0f58835e030a2d3440833162636bf",9.917710196779964],[1580,"66f93f6be5ec1364e45fdcb2fec02b8dbd2d16bc7c702494bd8d8a4c6290a6f5",9.317957166392093],[16786,"7f3de4fe48b7330ddca3bfbe5b1359dc29a6a16e5aba3486af33b64e8bd1a256",13.22340425531915],[3469,"e1f38978641392985915e776cecb7dbcf2c3647d799ac244dfd67e465f8841e9",9.917710196779964],[11814,"e316581cce3e32c6cc63e1b0bfe2d5f7b002885eff0d9ac706040305a0429fb2",9.917710196779964],[4481,"1e65699c62ce373a1c0495528e835b4f9f15df3bb3f8c7c1dd28ee033d3e87e2",9.917710196779964],[9770,"f68a063fe074ee8a1cb837d5d44c267ab5ca8500f868d9dab03e3af56254d9bf",9.317957166392093],[19054,"df39125f47023c4c5c95b0b90d13b043ed488b0bbc953c3884d4fffddfe1a41e",15.003322259136212],[12927,"ef40f03812255599370360ecc35774163b5a75e5b75c711221a5fcc85c271aab",9.917710196779964],[8801,"270736e8a75de6a9c45c9d5be502a53994e09fac22259e8d3fd218f1ee7a13c6",9.917710196779964],[11007,"a4ae7493e8c6b5a7c5fb7dd15bc6e618466a367a5be1c1edd4ffbf588b25f3b7",9.317957166392093],[17235,"40211a88a38606d3a73483e8725353885ce0e2f5974abf834e5eeed92724344d",9.317957166392093],[19052,"c7c6b6485f0a87ef990805a66b6c2631422fe13843103e79a4f8922fe882aa1e",9.317957166392093],[8610,"14c98fac476f82f9a4f11e1e2dc5aa2df404ffb519c464b93063afb9a28d5dc7",9.917710196779964],[7253,"6a78d84ee92812ab05da2a7d7c53a8f291a7860343372e6edd87746b9c615bd0",9.317957166392093],[7189,"506d7cc40a6cf9e8fffcca52d24a60ebda0b28b9bbadc07b79a4a0d13f1cc4d0",14.92526690391459],[4927,"de057700f06208e838eef567c6c99953d0d6119bdccae5c13589df54c6faaddf",9.917710196779964],[1676,"84cfbab11ad6bf606d82e9e552c4e63c41152e33bc9e9eb2eea8640a9b5c12f5",9.917710196779964],[12267,"a5954f907d52d57d99c6d445ddbdc3f1da25fe72e7692cf256e9999dbd9290af",9.317957166392093],[15527,"5f181ada6efba620567cdd7b751dc5692a281ca9dd50bab8e5981a6980a86273",9.647446457990116],[19439,"de28cf89d4960ebb609b6c9a0cd9a39becbfed44e0164fd8ca761c2292502810",9.317957166392093],[15304,"11f2aad48589643470e5b72766da20341404abaa703ad6f16d765a69f2e34b78",9.317957166392093],[9811,"3f60b0d98630ad76248349f69628dfaee3d9e6da34d1f5ed5154043895d390bf",9.917710196779964],[8838,"7bdac251dfd86789bb911ec4a327150405c5d209f30a8ea4ef1f4b5ae03bd7c5",9.917710196779964],[15691,"7d9d6ff954953cecbdc69dad4bbee9775a7315c68f0b76b0398cfeaadd3da66f",19.23112128146453],[9921,"c6ccc524acbaf99fb309728b497dc7010121742af5a42a0c4d9abd97aa93d4be",9.917710196779964],[3347,"3ebfecf9a61cccee54d6408cf0f371a983f374d6f21679d309171b8efd0505ea",9.917710196779964],[16659,"55f83290afcf303540f55dcf598fa911dd2ac4e86cc054280ae2460a3e5e8459",9.317957166392093],[19656,"20a78604a385757984c1836ca213cae77cae97d187e2b06b05e3435256d7dc07",9.647446457990116],[1491,"794f228a31b8d4da72f4879d58c107a02fe7d2670c028711cd18977a83922ff6",9.917710196779964],[5693,"3a79123edd869a857106229adc4e6693fc9f5dddd8a22487f64bab065e3616db",38.00356506238859],[6894,"974f4899cbd2315739a96df30e68f1b264dfa95e84058f100270ecd1c963a8d2",9.917710196779964],[6789,"dde2ef340b32debe468082d6e46cc3c58f2042a96776b4b66dafece256cb5ed3",9.917710196779964],[6876,"d7aaddddd541ca9eb33a45588de4354ea141aab15bf34e87522e3e1c1a63c5d2",9.917710196779964],[4775,"6d6a7885bba0da225ee2eea0864a04cd67722f353d48cb6a9716c4dc068b89e0",9.917710196779964],[18545,"d78ca60197c696b0c38239a9046c97b6997055004a49435bb266d8dedabd8e30",9.317957166392093],[16957,"3c5192cccbead6f7c197beeb042f08e45bb966d0af872ce90d4654fa72800553",9.317957166392093],[9230,"89b781ce52faf2b34232a82ea6fe9ac23acecab0e33b15f137b5877d4cbc39c3",9.317957166392093],[8966,"367ae36af158df7c59a4a7b0b16957afed7440fde7dec42ecb81e7dc40160bc5",9.917710196779964],[6468,"733d83753dcfce815e2466eda99bea7328c946cae2c8979b7d2ac838a732b1d5",9.917710196779964],[10643,"3459e5eb24ec99b2c80a403054ca9762a055bf91c8dfc56a6ff2dfb0677767ba",9.917710196779964],[9709,"8e4fc57b20fe9076699effd2883944d5cca465db764054c1a2ba7e3f73f44cc0",9.917710196779964],[5707,"c6861e7c45e8f6aa098b819d121f56cf949001700cf8b170374ac5114ed303db",9.917710196779964],[8445,"689a25dd8ac678abd054e25f033b089a55ad43a052c4d244e3f8107df95458c8",9.917710196779964],[15680,"ba7944b8d364d378981e614a1090ebfa8cacdd4eb5b7212aeb2b31ba0310cd6f",9.317957166392093],[6813,"668e740c5defa527381f5d7c7b833baf8712f5221e5de7b3b71b076fedbe31d3",9.917710196779964],[10383,"90b793f27e84b8952aa4ef54d66201e70cdf7be53bd0e6b4f4ee427570b3e6bb",9.317957166392093],[2055,"f6738a1d668dbe588b0437f0e943d941780883a6c12a5ab72260f86dddd894f2",9.917710196779964],[18933,"49d61c0b0a8edc95daff5da4602d0f044c5dfeeb1112f1d63fc26ff5514e7d22",74.15384615384616],[16227,"f660d24b144e8c450ed122dbf88d2246c5ebbc06a4b15407b87a0a6b48f81763",9.647446457990116],[18970,"f9919f4f09bdf2cbb4fbac673baf6b4be87a26ad6efca8a24775ca1824f18721",9.317957166392093],[17872,"3bc6727e6ea71880f9a9bd1504ad2c55ff98be31abc31cf447c368975ec7bd3f",9.317957166392093],[2591,"cfd0abc4fd7292dab361f8361521a37d03798fc7157db7bcbf25b169928034ef",9.917710196779964],[11068,"d4d3301a9c8145b9f08f056dabc6a96402272b9366c69dd0935a48a7483e87b7",9.317957166392093],[6163,"a8ebbaf42ee67e2a3d3717d356f16391258038b069c31f6c7584e53a0f1c10d8",9.917710196779964],[18477,"a62145cff730b1b690f1a152875e126cd7aedfcb56f8c3af39e0d42ffb1df731",9.317957166392093],[4981,"976dadcf53ddc1c82fe086130a48018dee633002c97b25e7fd7166cab3a04edf",9.917710196779964],[10511,"28b56b59ee10dceceee3757def01fc6d72ae40c8e661c49e9190b3011a761cbb",9.317957166392093],[2266,"9fbe322cb00281eacb98ed76b9d8deb0ca0d2c51134f9f796c21b84d9ff52bf1",9.317957166392093],[8247,"f076a26c9580051558e24bf714c25dc352ebefb6b11f13357382f06e9c9ba8c9",9.917710196779964],[18998,"e54a8e9b758e05dfc97827b4785bbd626ff80e4c31a7887f922e2c5d9a559020",10.052724077328646],[16302,"07eea4ca8d5f6fce6e526fc3517d138fe53f632e7d8034fe461adcfc79a70f61",9.317957166392093],[17515,"58f7f95853547377495bea033a015a9a24b1450fa7497458801ededbb4c62e47",9.317957166392093],[9154,"7b1417b8a958ac86fd95120cb64d8cd73765bc304d523b2831eb2a09ff65cbc3",9.917710196779964],[5681,"8b57ebd57bdfc9e8465a5fb7af6a52af674695f8e8d0e1f149144dd2f08129db",9.917710196779964],[5942,"b1c77acf86411156ff5e06f268aad3fa7ddb9fcfa105bb56ee5b72c3d4df6dd9",10.052724077328646],[1667,"56e772b9d123086767b270f25dc0cfc716f4bdb32a129d24bab802c11a5222f5",9.506082725060827],[2371,"766cf3ae5f0cfe09125146d62f457db5d0d2e964996087451c31b05dcf02a3f0",28.12785388127854],[10022,"0cfe132433e8fe31942efb704832ac0ae84311715f546b15fee87184e01d33be",9.917710196779964],[2799,"c87aaf48cf714beefcd8a430c462355696455932c57f4f13e7af0424f409b6ed",9.917710196779964],[7004,"3aad47f028ab5e329446ceba3be7d6aaa95db8410163885618660ab8bf7bf8d1",9.317957166392093],[9198,"cbe2c225ad3ed194b69634f13edb3c02e0a2e0ce73ed6abea621b34b261473c3",9.917710196779964],[6209,"d7620536a1992a280340956982a492997f8cf75dde657f25fa09130273f0b0d7",9.917710196779964],[17840,"ded892c8831f424c949d4b0db37b93d90078f47ca3664158190a2f5fb5217440",9.317957166392093],[1821,"537da3a207348a0f862a017b7626df1584df08a191e532179733527cced41bf4",9.317957166392093],[5423,"d9f6525967cb0315ffedf72d64674688338fe89344dfe74e59079f824a3da8dc",9.917710196779964],[5048,"31d464ae76159ab958105492472904f5a150a0b6c791217f10aeec24ea0ee6de",9.317957166392093],[7297,"9223e06443aadca4bb2d8d7733e5c958c3667a3ef8961c8aa034f183153317d0",9.317957166392093],[17449,"915260ff005ecc6d4efda46f67f620a745ba872b4fa99c77e107144c5a3cb448",9.317957166392093],[15644,"bc530fa4d0ab31b19f13a4c4c825693b33621edf4487aed429e415ee09d17570",10.052724077328646],[18683,"2bb9889b56fbc55b8f7d332a0392b53e7e54aefb888c4e35cc23406e21e51a2b",28.187082405345212],[14707,"4e86a2fd2c04de745dcbb6a22b446583800a691171467170944029bf8b17be84",9.317957166392093],[16352,"7eb1c66a0693a9a9849c3b1e2ea7180eadcbff7389d3ea11079d48eb33a40960",9.317957166392093],[6275,"f7a0cb3f108408598a7ba98b1584eb100271135264560dd71832e5e2c5ce3ed7",9.917710196779964],[13190,"f9417192435dcf4aff6f2551b20997ddc7906496a5143c77505ebdd37d0e18a7",9.317957166392093],[18962,"aa733d34f7ec3efbc1b18a0a9dbe41956025d13c0e45fbcc34a652140eeabb21",9.317957166392093],[4686,"0c6624719aa8e16443c42c78e7a3ede27d9d08377619e88436b8b7aa38cf15e1",9.917710196779964],[14982,"c8e71b253420f072d02c7e0da93488e7ec53d6e303b29794cfcc369255d3e77e",24.70110701107011],[6200,"54f8a19e29c7d8d93511b818ba7fcf564322acc4f8cf3832044fca504cf0bdd7",9.917710196779964],[690,"2bf2db39f2a7334a93435b559893852f740b7e71f982d11497f7b224e60c51fb",9.317957166392093],[4486,"5bad36088171143b48b74434910d2de104b01ba833efa226f010931f6b9081e2",9.317957166392093],[9471,"0831df8b8739866118af4b43ef40e3e3952a59437d956688ec17e8beaaece7c1",9.917710196779964],[12344,"0f2571734ced867deb4f26658cbd3202b9c84b9248a79f28c4a6a7eff159efae",9.917710196779964],[16147,"3680e10dae62c60793a66e49349efecb109d5e889357579067f23455de461865",9.317957166392093],[7766,"d53ce4680470f5ce07694a93f7ce62f28fddfb74076b0803f944ba07b7050bcd",9.317957166392093],[17151,"453d4542c906f492c3402c5e3bf3d7487a50a7572122dfd6c8ce7b7370fb0b4f",9.317957166392093],[6652,"aef7618f8f7fa40c8b48158eb7e111569494c0312c571f466c6ebae7b6b64cd4",9.917710196779964],[18197,"14ca0b164e6356cd93691aebe8f63278c1977473c95c9217cb417db886ef3f38",26.002607561929597],[4872,"04d9c256b2fd8a6d50b2cbd17ce9b9911344efb7930d36f01a42c0525b1d02e0",9.917710196779964],[13570,"b6f74fc1cd68337d8e8d956b2a613c0605036512a64ba8ed8a46fca81091399e",9.353846153846154],[10406,"d3982c65f54c9a242988bf8fa0fe5c1b01ddf9e7f32bdd2463efe36ee4fcc4bb",9.917710196779964],[16376,"b2d19c49f6f447e6f6ac53c9a20e6ff40c1e71f05426978304f562b5e767905f",9.317957166392093],[666,"485d6c2f35d40c0912e281ca094e26d47053acbb564f593768c17f13edff78fb",9.917710196779964],[1321,"e6cc1686d41b5ca8a5e6ac0f68e163114d0dfa0e6114edd339b0893f3c3c46f7",9.317957166392093],[2063,"dc5ae2efae66dbb72fea83a2456e421e6f59aeb981b05e8927ced011dee877f2",9.917710196779964],[14030,"5b2a401e49206e9971a048e8e4595c0315f5f56af678a3c043d6ae9e25680f94",9.317957166392093],[86,"0a48d23276462c23f267f0b43ebbc05926aa0ccc3e4a69c7bee959445f1470ff",9.917710196779964],[17043,"a771915cb42099164268b32af32f52e3c24c012eb856082c38818a1a10132a51",14.11916541191654],[4690,"4a8550bd0ffd6e5827b013b98f28469129e6311deb6f7e51c19de9472d960fe1",9.917710196779964],[10741,"4a479d8e01bbe74837c4756e61659e17ca084976ad4d38fb71fd041e219dbbb9",9.917710196779964],[6701,"1ef9b5c36fe8826300218d8aa3afae87733c3913b7df52d7749ddebdfad5f7d3",9.917710196779964],[6449,"1c95660777d3caa3afbd64f7ea8cb2e9630ec6a8cf1211e3bf7a33036800e7d5",9.917710196779964],[6019,"6a9f2ff179eeb2f798505ce7610840d83b14b625c08a1d0d9e7f2ff97e1ef2d8",9.917710196779964],[6227,"4f96fff8cf684537e5bcecb6135b78133b1fb95c8f329823781c7fc1d0a091d7",9.917710196779964],[3435,"edd9e65afaeb9db028fc6d01b90a4021c95bb08cf84013916af60b21093a74e9",15.956521739130435],[16908,"4cf21d56af4e87c8e25789a7709fa3de031a1ad4407e285c9f62a6b526faf153",9.317957166392093],[12134,"9d151cccaa093956aca21b5adf24c34f2616396333628f2be187fe146fdd7ab0",9.917710196779964],[7371,"e094562af2d2596b50a46338c8fb972166597013f800786b8337cfd7233f92cf",9.917710196779964],[1615,"00bbe37a0e4e93e6a5afe8e31fa66943b50704f676cc935b3ad6a9654a7b7bf5",9.317957166392093],[11351,"2619e728ea2adc8dc9ac2447cf2af83299b38c4153ebedd4d76ac06ec940abb5",9.317957166392093],[17717,"6ee52a2fcff859482534496cd0d2ad74948c8a745621df745d6c77e7d82adb42",9.317957166392093],[607,"9a15a1358f9a7cb0798a5f82763854e4676575e7678d59a06ed3dd4fd12fe6fb",9.917710196779964],[17702,"87ad7921468b691bbbb7255c5917898fe1b6160126965251004c326026382743",9.317957166392093],[3784,"6b8815ece5f0b704e35ba7a4b5663135eac753b0d1c4ffa90aa15d7617600de7",15.003322259136212],[15502,"ae10dd01f1c91107c3a0e908aa6a1622aa65c12fde940f2cf5e2836d46f71774",9.317957166392093],[660,"6dc2937dcaace9dd1858b892739e46f0e0dc0649c5177293cdc487422bda84fb",9.917710196779964],[156,"2587bcdadd103a476b8e45050a96cba854a2cd03140a7c3c0a787d646ae7f0fe",9.917710196779964],[9293,"4b9db4c27cec5fd96f1cc79270ed49d32259f318cd63e13cd9f6aaf0a082dfc2",9.917710196779964],[1921,"28917fee220f7d08f828e1f537401632f0f64c40f5661ad66296cb6fba2389f3",10.052724077328646],[2467,"9a11cf2a6b7dd4ce9ecb80326b78b3b5a47abcd3bcc52586a75a07b6f81a13f0",9.917710196779964],[16415,"188531c01046411568244de07657e2810fc6ae3c238bba105c3259f3327ac35e",9.647446457990116],[13518,"ab49e1be871cd9c5e267f7285afdf17c31cd480901dbb96c78d5ccc0c30c679f",9.317957166392093],[13887,"ed760d8c4847830f0708af3581f4339468f2264f1066dd156525f83f7ea74997",9.317957166392093],[16308,"73c3a2195246a25e6e1225a08243e5cfdb3f03fa13147e4e9d7e40e1fd21f660",9.317957166392093],[6029,"92fc92b3a773a56745fe382d097cac69e59c127a3919d17906d90cd1c538ddd8",9.917710196779964],[11950,"7cf035351f1d85c5087a0c0c8dc6483939de561a36b617bbdb05c18ad1f8a4b1",9.917710196779964],[19138,"1eda24ae9da7ffdef548bb5b0c7f874204de0641a1d49d9314447fbc9e1feb1a",9.317957166392093],[17383,"43baeaaf586e54b4075a662da1377581d728e5d88c561f667faf2ea79473224a",9.317957166392093],[808,"87d27bde1689e22b0af090dca9b9cf4aaa7f13f0c6f17a716afc1d147c7d81fa",9.917710196779964],[19703,"4953247d893a38fa426c7d6c7f47192aebf64615b8539f7df98e72be2a84c106",15.003322259136212],[4398,"677f4d2e58069d352413e575dc7dd463a0bb81e38bc932c34df40fa6adf018e3",15],[17612,"01b5e3bd28397465e1cfc3a98d70908451c20ba33f7675bdf6ba76d51ff1ee44",18.313588850174217],[8400,"00ae03b4df7539d74d9f5b9c6b09137c450cd215a88fc041d1a3c83de01f98c8",9.917710196779964],[11993,"c02c9fbc670a8eca896d729c185062e28e83f6bb4356c1673e9e183b57ba5fb1",9.317957166392093],[1871,"2a9830a72d25ed940870e717aecda2a21d8058257903a69b838447b30727cdf3",9.917710196779964],[10274,"cb275ed5b4a59815ee82a6d98b58b2aee027a356365185b8f9b132add6b08fbc",9.647446457990116],[185,"e5ebc2d2d78306ca4282eeef1883ae1a7ff91cd4cb061cbed37b26ae2d38c6fe",9.917710196779964],[19452,"404a675917c888acb7ebc36fd93f85e221f236b70c318c98b23933f3c42bda0f",9.317957166392093],[1881,"cb66698b9e38fa6c7a5fd7e96d579ee03f142da0f8e534035a843a011e84bff3",9.917710196779964],[10812,"be661fc3e5fa324627659669d60c6eae19376b11741fa6ea27c27aa66cf834b9",9.917710196779964],[19462,"005cdecedf476270c5c682ec850ee717e775d20b93184733d696512929089a0f",9.317957166392093],[12184,"efb2433cac04c53f8d5b836f368fa52b74820edb5ed9065d014ac413b10928b0",9.917710196779964],[14155,"5bf7ae0dd7a57e055d461961d6332c9c312a0109bd32f9b03d5c8fb652a15391",9.317957166392093],[5653,"0a35ae09d99abdff276c5873c183148e39d0542b70ebcbed428109537e844edb",9.917710196779964],[2470,"d7abc94c1d1cecc5992339f38c1c81e8094f7d0bf3145ebbd51198fcc78d10f0",9.917710196779964],[4171,"55f2636167c91a6633edd33550a0659d36079599a651b3a81b29923766ee9fe4",9.917710196779964],[4128,"b252b3532215ca1c238c94d3417b158b016a902c59b979fbf59ed466462cdee4",9.917710196779964],[17173,"897113b373763306ea4a8a358b712e090db0679dd34cbab58a3b9fcf74115d4e",9.317957166392093],[7825,"2c7eae0ddbe24c49662e227089751ecc506b0ea65178e08d2a2f41a87b119bcc",9.917710196779964],[10606,"46fc55d2a78342ae5d41a5c670368457927bf6b7613b269b7fd6a63e25659dba",9.917710196779964],[13687,"d3de8562d571440c3a370e78724418a88b5139a9eeb6c2d4618425f9f7676f9b",9.317957166392093],[13891,"32c1aad8408c8b66f2c2de472e110c9b5adcfb08f751bac228319014a0ed3b97",9.317957166392093],[11839,"34ed753a23ef9764444d26d7617965dc0c761743d365abe73aadd83f40b277b2",9.917710196779964],[5646,"f182707a5afed27ac1741a750f3ef366dab05ee80d89621d0996842293795cdb",9.317957166392093],[12117,"c33e5bb27f2d6df633af995d572e7c27ba7d4aa85b0526563387baf02a70a2b0",9.317957166392093],[5234,"f0bc3c8dc45e4cdb298ba36a9e2a72f8942c642e9a39eec0070db624dc79c7dd",9.317957166392093],[4173,"31f61bdea986400e2536b6c7049c0b7911df345a63b9b1738ba982116d609ee4",9.317957166392093],[4519,"90938ec1650bcdf2e766b01c4896522949004367db911d10d846e669c6a23de2",9.647446457990116],[11123,"83097cbaa68a8a45747a8562a3a9e97625ca6f84ee8d82920e9715da0a3820b7",9.917710196779964],[15513,"ec7820eee4246844253f39008932ad72d5b90e26ac19bb98cd57860b5ac5cf73",9.317957166392093],[18834,"a1ab48e8d84ede48cc010beca3e4401695ebcf7ae050502acc42bb45a5eb8825",9.317957166392093],[2523,"8b83260b2e3205144a836230bd515e8fa418f4fbdc30603a08e2319c86cfa8ef",9.917710196779964],[15723,"ad741c1fcfe8cab0ceea756a4d13d0585095f97caec10c8832c69591c60f066f",9.647446457990116],[19153,"45f5b403f29bdd8c9a72ccdb7d494ab1bb80948053cc709de48c4478709f661a",19],[5833,"70951de30ea23877f205ad71ca1638ddeea22feb97e6d0a8295d020eed5826da",9.917710196779964],[15906,"ed6e455a746ca7c4a3db916d6161841fc261548e6746daaf1ed3230b72afeb6a",9.317957166392093],[17544,"bd20d1a3ff170abe95394d6d9b3eb376e94156c011f8ef898f73df25ae8e9d46",9.317957166392093],[15545,"426d8b58755d4e971fafbc4819c13bf0b948b1c0d5137e14e96dc95603e81b73",9.317957166392093],[2036,"f3661012d28befd409777a261cf38c61e5ea84f3cfa4e68c14ddc676b01bbdf2",9.317957166392093],[1640,"77330d4d2f6055cfd14cba3c40ca9153c44b4b8b62df165b271572b817be5cf5",9.917710196779964],[11279,"5f17b45947fcf33714ae8934fb90dca2d6a0dff5def0f4c62463bc1b6e862db6",9.917710196779964],[10839,"be8a00b6caa5ad59698919d316bb926e91e2647fa1116c529142761b33a20db9",9.917710196779964],[12220,"d14b992fb857de7e32ad86398956d43f3224d4118a5f12f529d3e7c41319f1af",9.917710196779964],[16150,"1e039429b1f2448566b964fcc2007ea0f9f74d2b819e98a2116e278e1dec0e65",9.997888067581837],[19181,"b1f3ff35b457b069294cd3b3236459bb64863b1e047d328f7a7432a8e60b3f19",9.317957166392093],[9088,"2855f90b5dd92fe6226b38905951be3a341f702de59e7ff34bc64f56b1be3dc4",9.317957166392093],[435,"675b96160a1f5a4b1c3a84f190c8ae77cbb07a450f5547cc6a50517b748021fd",9.917710196779964],[10486,"c2bc047a10aefcc41fa9f2ded0a9874d74cc9f2f99ce9049339da54e39ef3ebb",9.917710196779964],[3849,"ff0273475ddac98f045d1309ad220fe80d61e288c0aba39368f99d741af3b9e6",9.917710196779964],[6187,"2a62d263a89bbf4a30c88959f19285c1eea3be2ca0860bf59c3506578fc9dfd7",9.317957166392093],[7007,"3b0ff81b8e81325846c54a235b0794b8a2fbb6904643e7a92494d53f1258f4d1",9.917710196779964],[10575,"20ddf6dd36c7cea38a05fc2292cebe0570196dfe1e43e8bdcc7226ca443ac4ba",9.917710196779964],[12283,"dfbabe233beda454c51f3fc07adcc296727318382e96e4e10a1e2408c12263af",9.917710196779964],[12015,"afb733685dbd3cba51e4ef3669c60a6dfa1df78b06180eaab077cbbeff843db1",9.917710196779964],[17145,"715206731ffa3f78a05c48af67971ad9403875d6ab99832f7b7928a1979b254f",10.052724077328646],[16418,"0cf5804ba985ae3f5ef226a776a23fc2dea657394a5a186f1d25bff38618b55e",9.317957166392093],[15628,"f9b202a65cb7f7178f3ce2620262ed5987ad76b5af9f1a0e81b3bbc1f301bd70",25.7864768683274],[12417,"1430e2f11a18de62e869181a22d92e7fc135f66290b1fca9fbf1cabff6097cae",49.67259786476868],[5777,"23865f483b492aae42cc51b2aab5754878d0498f8628d1c7efb8c613280894da",9.917710196779964],[2030,"a66dbdc932853fe9ea6f5db173b9b6f9835b9e117dc4176e8eb84b818b8fc2f2",9.917710196779964],[4948,"6803112ddcb589c7b464d7be116f82123f05a9bb975e5adcec0067e0cd4e8cdf",9.89247311827957],[16331,"753eb373e9a7cfbef3fca92de36e151b528d8c337872e072cfa11b6af4f46360",10.052724077328646],[4464,"7293d87803e6f5c39606509314df2f8820970095aab1bd22a1f046b5cafda4e2",9.317957166392093],[2505,"42c3fd4a32642ed4e07c2ef355bb1150d720ac52987ce2dcd5e8dba4b98cceef",9.917710196779964],[5828,"83194abf603bd5e6db1e83364aec9e4afa0f0884c99bac3da169ba32a89c2bda",9.917710196779964],[5483,"c13dc8f4d59ffbfdac32026adbb43194c21c63ae8865728c5ad0034ed9024fdc",9.917710196779964],[6988,"42a90aa966af44c1cba2a7e45f9beaaca8c67e9b3a1fee98a35ad33c167915d2",9.917710196779964],[4673,"f0302a9abf986bb3d90efcf6c7127877c722c77d6b2225955fb70d58f52729e1",9.317957166392093],[5702,"83d276f2ec9313b2f949236ca2e80e5dacb21902925766887a9446d8dd1809db",19.192118226600986],[1485,"7e490fc54826c210a618be9329c3e35585afa00dec50089973232a44dc4337f6",9.917710196779964],[12563,"b1af07ebcb25e22ded0aaeef931239f6f69994f6a51f8f8e9215843955a98bad",9.917710196779964],[17653,"0c055bc9d305e70eddacf4603d42c4ca50d045faca7281fff387a1dfada62044",26.077611940298507],[8577,"0ef750fe94a10dd9a21aa046b476c8063d3a1a398f005d05b10eb39fca3b93c7",9.917710196779964],[5549,"4478a938dda358b1eb134dbd424f81487ded2c4f7137567afc811fb62b31f4db",9.917710196779964],[10413,"62864e47cddb5faaf0924eff7fedf9520a910e9d8ae20490994ee3a473c7b6bb",9.917710196779964],[17448,"418c94cc684a0c13c5b59237fbf60c7c1828b0b8dfa801299ec0f0d44000b648",9.317957166392093],[1755,"83e527316fa910c2b52a27c7abd254af613b184911d9696f5ef74a03ddd58df4",9.317957166392093],[12545,"665c4c3118a7a674ac853abb2663d6de146e4ead5ed595840023d2d358d5a6ad",9.917710196779964],[9361,"0d36d8c80bb0199ff173a76ee91b53398ef265caee8fe66a82eb68af932680c2",9.317957166392093],[16306,"2bd08532772b8152c80f3873788b36a3d6a660c08ba3509f7408b0a4b8af0261",9.647446457990116],[8282,"ebc3d481685f93f9d0dc20c06b4a0327a6b6199b21c1f76b7719a43cba1175c9",9.917710196779964],[5278,"4d09349c75ea5daa1a3755f9034092f553f6071116b83d41d95d1d86187c8add",9.917710196779964],[17385,"f621a38a4e8bd8c48932ae1ed5e0806ef563a513791dc565ccc4e04e91db0b4a",9.317957166392093],[4356,"5fcd8727f5940f5191001c1afbb9993aab5b3fc22d1431f4cb6b442f1bfa5ce3",9.917710196779964],[18616,"814907f4c14dcd45b0c8fe274cca8b4df5a786b7e6994157401e3a6f9ee63e2e",12.023062139654067],[15297,"b66d0fb92f3d692d635b01e55ab433c69e261f436ded8655a20e44a802c59478",9.317957166392093],[13401,"3f7f6b8a4f0ce4fc9028eb2b87583c99bc41a5c5a7ece55d9c2108774ba83ea2",9.317957166392093],[16432,"b7398d941f686375a7fec010c7e989013f42de3cad27197979892ee8376c7e5e",15.91637630662021],[16429,"0e1837523dbad665084253ee765a747d73ef8da1fd25e6d7e4ad6066e5fb815e",9.647446457990116],[17068,"27713985fa32406f97b33f0e3f01354762d86ae65e5c27481e1d21afff19c350",9.317957166392093],[19676,"01fbc23b8f6262926f2e1c703f682aa2f98536857c4fc12e7da8b69921a97007",9.317957166392093],[18633,"c971131a91dd110a8bcd9343a6555bd84b811b33053fc2afcf7e70a7140c7b2d",9.317957166392093],[12152,"d776b8ee8b24590501e185caa91709c040854cd4699467aee491adefcb4654b0",9.917710196779964],[15950,"79abf59ae5addbcdc9464949ecf03fa2f8798727235c0e74e5c3cefd465ef469",9.317957166392093],[9548,"4f4041ce85d4a4bb90009974216c3a99c1540a9878fbd930f8381c76035867c1",9.317957166392093],[9601,"82f5404a56e04548f0add1d3673221b39c048697bb4de42fb003aef9795e05c1",9.917710196779964],[3966,"2577f029e472510ffc4be047b449959da6257beaacc93980ed8216c1f89bf2e5",9.317957166392093],[5030,"e699c750928ade8ee92e2d4c968a10bac442f3c22f8a82c2b06e9d3a98dbfdde",9.917710196779964],[11289,"f47aa6f86da640ef5ad05f7e5f8bd36ba8664c3451ac14cfea1fcddd679a1eb6",9.317957166392093],[15096,"5ad84e20f1bc97ac49ae11cd2c765b6cbf308ae975d3ef53d14326f99db4bc7c",9.317957166392093],[4443,"b9f7d9f1667d54f08e7cd1409af6ab916f5c8c90fd10a0399793dd1d14e4cbe2",9.917710196779964],[14676,"c591f592dc086afdd15f425601feea472ea61d2b60c6fb91fe8809c185395285",9.317957166392093],[11448,"317175c1fab69fa119322e1e47740817dfa6172df19d4f0c4935284b8d57f5b4",9.917710196779964],[713,"0c67b36a5e717e29d921f1c9feac094af4dd8919698dda73dd4365ed8d571cfb",9.917710196779964],[5866,"79420ea07fa54c1f7a4399aeb05f543462d701b57d9bb1e615084e2ee96adfd9",9.917710196779964],[17755,"3758fddf71de80bdbb887cf3feac00d4424e377b739f657789f40c1318092542",9.647446457990116],[16152,"d53822e43a500e1a1ae002236fa672ad865264c508b38db9121454e6ad410565",9.317957166392093],[8199,"420c12e8258d64b5302166546c52fdb5a088bc6fcf187b42c7413de2bef1f9c9",9.317957166392093],[9843,"1331a698b674bad863b4c062fd27ea2c7ae6da447693fb0534544c41841f59bf",10.002054653790836],[15992,"b5474f1f8496e1b64729abfb5ec100561fe9c4aa97f389acf7ddf7391ef99d68",30.756302521008404],[11245,"bb72ffba8e6c88bde86badf7a65d8b307e5aacd490738b2bfc74e489d63063b6",21.950113378684808],[5325,"27c89df607dcbc216e2b89ff3e215593bd64175a32d6598d725656ebe7ad45dd",9.917710196779964],[535,"e4148d8d558e3fe8e16a8227231a7f1fb9639a56bed1884bc4c2ecaa43515ffc",28.09964412811388],[1747,"5aec8326d93e0740f0126d478131bb199bd916f3829ed19a6ecf32677c06a2f4",9.917710196779964],[10397,"793379ba88b7334d587a0f8a442f12d06ed734cda9bcb032f46df09993f4cfbb",9.917710196779964],[4174,"2b025c2e8ff3e56b8b4523a280ac27f95a5cc3466a2f842598c32ca037c49de4",9.917710196779964],[14777,"bb3e9318fbbb372aa7c59664d236eacb8dbc596e130249fe4f8742f696cd6083",10.013605442176871],[16529,"a8ee1c8d994f0085d7c47f4a531ae458e426df65b38a62b7df13248ac5d1845c",9.317957166392093],[10025,"bcb4de8940c8eea594d6c01abcc2b0337e9ec718b5b7579b43d3374258372cbe",9.917710196779964],[15446,"7cea50fc7da1d4cc4e4d0c2d6574aab880e95831c5f0a6e248ed05ae5fe53275",9.317957166392093],[18896,"0c5c7187e492501a6e63bb5946bc164c5f6f53b52f99a15293bae51aa64b9b23",19.212653778558874],[317,"b0b72b7ac46639818fc909694ccd43a02357affb230694a8d4fbb788f235e7fd",9.317957166392093],[16814,"741ad339d078633aecf4de1ceb59bafca3a499f279940578c0531191415af355",9.317957166392093],[13878,"b34eb5b74e7a7be0fbab12ab01143a533cdef0dab687575a4258672d9b31b697",9.317957166392093],[2125,"b7f6b5c2a534926faafd97528ece441f8630f14ba569996c6e88b550442818f2",9.317957166392093],[8767,"b0fa99f9b5dc425b2c652f9dbd8c21fd653e3e1f401f60a8997eae21183f40c6",9.317957166392093],[18003,"7483976e4a5416ae1f13283f298d313f6eb6ffbe3fedce2aebfece26658d393d",9.317957166392093],[3228,"9b16c6b0e6c39358746acd5fff9a83d26050bae2497994f26f1e65b554ccdfea",9.317957166392093],[17724,"e2f717d3638fc10314a4f255097484f70f85585012e43d1fc9f371897a54b942",9.317957166392093],[16901,"3789d46fedd05c7a8b561177d04a62d6f18d9e5fb83c630695222e61cab82354",10.052724077328646],[17701,"b5f44ca2abae7c77f19a0b459221812e6c92c6a971bd70ec5055804dab502743",9.317957166392093],[15324,"86af02966b7ce31f497122e944f4e66a17686e917ad5066077ceb9ead1dadc77",9.317957166392093],[18661,"26788924fc04cf93b9ab24c79f70face6f249ff48d84a89c3e9c63b8e1be402c",9.317957166392093],[8063,"a48fc783b095e763be1e26ce90bec79819ec889e358e98067ced7604895705cb",9.917710196779964],[273,"2cc4e918f4ee652f5ea22aeae34faf79584503a4d6152ea7088ce24f13cf20fe",19.23112128146453],[11359,"3ae4cf94723d53f6ec4b7cf70fe8a896579e32c69398adc0c3db176ef76d9db5",9.917710196779964],[14345,"10eb657f2888bad88c42a3a2af6b6f81528a22ef8900de1937e06fb1ec75748c",9.317957166392093],[19129,"9ad9c99447af590abfceaa156fb711e52db93d70fe037adab790e1951ea72c1b",9.317957166392093],[8812,"674497ba763a3e7ad81a2033ec54abe011e5d14061a0d0ecc03926ccea9105c6",9.917710196779964],[11808,"f8743ee9ba473ad6f205a0d8dde3fa5cc95d43a7beab483621cb6ee87474aab2",9.917710196779964],[8769,"a6cde919b2f74e174afe1e7c6e6a60572fa080888394e4fb3d5ab547f5c93dc6",10.052724077328646],[6154,"ada3d27fb8d51b4c97dea08bfee5e09f570d711341fe04816de657fb844320d8",9.917710196779964],[2985,"df3e09dad0e1385fd1bfa54dbc046818b04a1b4928e1111d451a91394c0b62ec",9.317957166392093],[15699,"0b18f5b0f4291bd05e299ff23c422b9880929881fac0f40a3b0443a19ed6826f",9.317957166392093],[9840,"75db75358e8f21f329d85eb324ecb53f0ff8699f5c7f19eafe236d17a4905bbf",9.917710196779964],[10210,"fa95152a6985ee4f742fc698dc2cd44f263ebe995719eecddf34a0616070ebbc",9.917710196779964],[3114,"4006f67988f39ba6af60066f0d7c59aace9d58a8068a6257a6d3b35b10f08deb",9.917710196779964],[6817,"1e1b3e90e8fd5e973cf687a30b66d6b5a95f18b7ef7e1d219e026fcbbda52ed3",9.917710196779964],[2146,"e7ff1badf11038b73bc815474f271da28c3ed6eef9e17cc5ecd7f64982c7edf1",9.317957166392093],[14698,"4e597fdfede0b592414a5b8ebf975cca57143e32846bc61bc9d061dbc609e684",9.317957166392093],[13110,"0cda2f3a51c7078a3613319278043da4773e25ef9b731fb8d2c913d18685cfa8",9.317957166392093],[9697,"587953254527b5cce36a81559f8aa32b2369e0663470f8d534dd40352b286ac0",9.917710196779964],[14044,"554f857588124a78231a0f48d8b6e5b997a7a2bbe901df23bca24d6a1bedd293",9.397642257991386],[12701,"d87567f553b130b3951f07ee8b8027e0cf7d003de68bd1469d0967d5adcc98ac",9.917710196779964],[10563,"728a43f0c377de9d7ea7d3ba4563fd3339bd9504756b988409643c835526d3ba",9.917710196779964],[2078,"0794049d1808b03c85260436f4c41608ae2bb4c1e32ac49fea00bbc23df562f2",9.917710196779964],[4901,"ddb063ed5a71f0aaacc031e5616d17916fcf87a0083a78c0c28602036e13dedf",9.317957166392093],[3150,"d009434dad58f1708ade2a3c7bd7796f6a3685ec4a33d10ee16647d58a6e5aeb",9.917710196779964],[8381,"ea6e5b624b2b7413613999c6fd36cf383bba45fec7084fd46b738826e219c0c8",9.917710196779964],[16444,"119bd0d5a817dd1ce8405e8dcc02044acf196b55717b21bf0168216354ea4e5e",9.647446457990116],[1241,"d9f8600d5adb6876bcdb1f97f7315374370f7a811184b0f004ef0506f907c1f7",9.917710196779964],[12521,"720ff7531db30a2b4a6cce09d83665954750385df455069650016c9faaa2d5ad",9.917710196779964],[9192,"ab8e9175b4b2343303e74d3290465a4850fa8290450a3d5ad633778c7fa687c3",9.917710196779964],[13890,"4538783db946360a0af7782c8f8ba67349218c54798dff5c79deaa16a8894097",9.317957166392093],[11954,"15315f92bf7fcfc5ec8522536cb60d32bd5d20e4c2e69c73f13a8edb4df9a2b1",9.317957166392093],[2469,"d2712395e5c00593e0de846c8babca8983cf68d8cae84e2ec52403444b3811f0",9.317957166392093],[14639,"296962e633e714916d33ac354820719f1a54b856b6eaaf65815b6daeb0eb2d86",9.317957166392093],[9382,"4c3816d3af3da1730ea27fcdf5d7eca6d09c2bc316852e3e8574f477c7855dc2",9.317957166392093],[4130,"a53eb0c6bc1cc99caec90de4280ee113b88793d3c9847b176c58ebfbe5f1dce4",9.917710196779964],[17639,"1cfe8c93c7773a982e92ae2bef5e3f9487538a60d59edb516c465c0a3f626344",9.317957166392093],[9816,"04e0979d0188b7ab9fb09d4653b4c40a1500f1d440e7e3401743fbc53bdc89bf",9.917710196779964],[15573,"35e7eb8326683ab2d84098a1d20a304e39332c95ee6fd2a2da222b2e833e2772",9.317957166392093],[9767,"00877b9a412bc8b7e9c5f675e701b68b7b59782a7238074c6a62597a02badebf",9.917710196779964],[14254,"b4f276f7dfa3fb1ae3c2971ac1fd240129d9fc3a3904bff3ef5942fcc938e08e",10.052724077328646],[3536,"f040d31bdee1dc6e8049787a63f1fc394ac0b62e85303162bf9f594c9e9fbae8",9.917710196779964],[1649,"04030367c10d19015fff13ef6bb33ee0c1baa06df6884809a85dd969036d47f5",9.917710196779964],[9580,"d2ceb4508aa52ea69983a5bd0b42449e7a5ceb2a89ab7e60924ec58c95db20c1",9.917710196779964],[4696,"5658d63fb947060665a64ca83c45545113afe1040ecb8fb532fe337b901f06e1",9.917710196779964],[18243,"f3ae920fc2984ae749a96e6ab335cb53e6b5dd853c7b8188aee41473e0fc1d37",9.317957166392093],[15099,"447a423462fb1232bd878041a8cc854e36c5bb24489b2901bc488564e6509c7c",9.472566371681417],[17150,"92006be8d5eb7c7d91d30ec763913fe12c4a3146881e58954368331595a51d4f",9.317957166392093],[3161,"0d2e79ba178d3831998af5666db2ba04df348b08767d07f560682e1e48eb4eeb",9.917710196779964],[10885,"d09dfee8a85a89b0c0ea1af65ff8b4452d7b04e54c1a1d9f20283d167631bdb8",9.917710196779964],[18828,"1651f81ab317c2fa0bbcc70f44736dd87c73af4a9c9fe4d3697ba86aa064b925",9.317957166392093],[8663,"b23976249ee0d9abd7ad414ea6c8974cbbda044993346f408b996bf71a1eedc6",9.917710196779964],[632,"483cc2ef26f54f2c54269e4748b8ed825cf7a5725d629e886501b89f6967b2fb",9.317957166392093],[18652,"42e4cfdd55dbbfda0f7df176a7ab6be8bda1e23fc2b199bac90d33ee0dec9c2c",10.052724077328646],[3716,"76a33fed95ccde00e7054f6d2931680cebdb91769d463c9f2b67faa7e62a80e7",10.052724077328646],[3400,"4d7e1ff6597905463d138cf4857bffeb3eb541c774e5579bdda8b96f67ceaee9",25.94856278366112],[1215,"50363601d28ebf608ee1f71918f3af33134c2f68ef44d4644d5bb03d7ad4e8f7",9.45790934320074],[12628,"dc80c78d4363b3654389025a8740196a1b1a6a56b8fe603a085289fff75119ad",9.917710196779964],[5728,"64ec635ec5b697cfb5cf677d8496023a3c716590ba1fe402e7d0f6d09e26e4da",9.917710196779964],[1774,"a661da916f1ef0d6a2e56ca67e2f07ba6601d7e7f353a4441be06b1cd5306af4",9.917710196779964],[14048,"6a7a75dbf13cd0606c2119d59a2ada04834342f927853ca497a66c4b3d10b793",9.317957166392093],[7719,"1037a2b929696bcbe5c8b294451518985500b4a57caf2b2ad72e03d0c17667cd",9.317957166392093],[15217,"0de7dc39943e9c9b2c78d3d8cdb1707958bb58a28e6e0e7ebeda65f9f7d1287a",25.950738916256157],[13706,"5b1bdea53f38e524d2f225b7576b943c0943be54116cdaa20aaba4e32ec7369b",9.317957166392093],[3035,"1d7f53e5a1ed581fc6a218ff6637b3bf740b846e45007843a74f3c4a703713ec",9.917710196779964],[17274,"0de5881c2ca9f42359d707cc4b687bc135770da69f71db584115bec00635b44c",9.317957166392093],[6502,"23fb2f1dc7cb0e17180fbe7d0fc979ab95bec9f26680c2657e41704cadcc6dd5",9.917710196779964],[18806,"9fd9d7c6e5983854ae678de87b9d5ba360ee4c49d5fdf413731d637479018426",9.317957166392093],[5605,"4711c466a64789d12379687451417b6aeb16c13d4e33834d6941101080b99ddb",9.917710196779964],[347,"1c0ec17165dbfa981652bf19683d92d883339fb5c9235ffccef1a74e6ccfbafd",9.317957166392093],[14384,"f9981e2ad2952ec64a13f344f0f8e6cc5c0ca88606fb46966c832cd49b7aad8b",9.317957166392093],[4392,"44efe1826193a51864f6636e8e0b6ded3ff8b93acc43217beaa78e296cbb20e3",9.647446457990116],[2061,"be8a60745175f2eae2773458940c3f5b31fa079d9d4dc1a5859ec3c9daa87ff2",9.917710196779964],[13151,"85e674d9501340a0cfebbeb67c698d099cdf30af231559470d5762d39d20ffa7",9.317957166392093],[13656,"fd8545ff98c6ef101d73890380f3c90fd3384e874137f509b1e254072a351c9c",9.317957166392093],[3830,"1e39a86435e9d39b6eff26bb7c40e670ac81d9171821af6f3a437e25669cd0e6",9.917710196779964],[112,"c5b9dbbca672c179dc26d6285cf860008f75998a9b503ec5ed5e7cd8056050ff",9.317957166392093],[3898,"ba1942a490b5f7c654810c31f81358b0853e5a23582330b4f5271961160d5fe6",9.917710196779964],[9237,"c418877f227dae7b882281c1af68bbb55f782484cc7d652ac0a1a2af722733c3",9.986882620162103],[11483,"026a5d5753661506148ec202ad657f2dc2db398006d8d09d23554d0504b59eb4",9.917710196779964],[1889,"0b10d3ad6c007e82cb1b88f8b411536b0b441a73a423dc938c1c317fcff7a9f3",9.917710196779964],[12864,"fc8684b7e8a0a52bc1ce2bfb2e434a84d36d6b8a3f6a6f25ec5b7234e9f67aab",9.317957166392093],[12635,"84793212efea9ecdec53bacf8690588f0868756081b6bce699ba4312cbf40aad",9.317957166392093],[15673,"031c444b1c66e99a47fb7a000d037417fa98ce5ca91699c2afc64e19ca95f16f",9.317957166392093],[4354,"9fb0cfb194757e686b1d9970ed1685b59a2cce33317dcb29bf7c4c0d54385de3",9.917710196779964],[13236,"257f974034a6bf082fd3d7a8ec80c19c4f495e8c94b6b65cec96df45883328a6",9.317957166392093],[6650,"32c9bb50de67065dd4082199439525e786c3af5a7f5e451eaa62e6cdba7952d4",9.917710196779964],[5486,"1054d8747879b80744b981e3ae1a8dd580c058387687b93b49a7a071e1904ddc",9.647446457990116],[9174,"f72b41f6bc917aaea3ab1d7ac723ac3d1595535b0e06e779ec676e7dd5a1abc3",9.917710196779964],[16220,"3e95457a7b373b1eaa7447eb332f759fbae73bc04028652424f7d4d4de516163",25.897302001740645],[18260,"380eacf303a94e4bab66e92418d62e156e20b3eea8d5ad406c6b7c50a584cc36",9.317957166392093],[3538,"b2d7497f8fdcddcb55ffce1e531582bda12fa0f33efea752e408675a11cbb5e8",9.917710196779964],[13598,"d2059a1ffb494a098463d9b4be8bb23f050305ad79b8ea06e1c22973ca49799d",18.309927360774818],[16036,"54011d7a136e1236a972a7ba138c44d2bd72951b56e7d9962c339a8a46a2a967",9.647446457990116],[13944,"b0f8efe84cbed7f54c86c00a080ae515862f1110454b658744ea9c1c6a4e2596",10.052724077328646],[6950,"973d75122e237301aee66f94fb54d52ddc2ba8a0e7e7518eb6ead439919443d2",9.917710196779964],[16300,"abd1031c020e661e1eed44a85a5db3c6b213a085d02d7af2e3a483d7834d1a61",9.317957166392093],[3880,"021a4451b34091b1f43f456c12be51553b8729a9937e2cf20c975f9444ae7ee6",9.917710196779964],[7849,"5ac1883b303731d8af51d34ac7410dc31db2126f586bca07814cc3a105b181cc",9.317957166392093],[8530,"7c56c5f6970b0aaca9d154f98d2025aef8ecf67a7dc5397c35b7f077d58dd2c7",9.917710196779964],[9318,"12264f76d22a927af282fa5560d1fb10f6d11797336f9a6299f45316a1e0c1c2",9.317957166392093],[17318,"e8933e520879c2020918a0c9e6d4bec56ea93ab18624dce2d79a37398164894b",9.317957166392093],[15135,"489008a597f751df6c9b7a0ccb4b6cc35c64922007e533609fbffe9a215cf67b",9.317957166392093],[1467,"06d50fa9e62c3a59cbf3ac46c6adae3efc732de93c8f1c1f7640385b380a5cf6",9.917710196779964],[3775,"ef11040e595ed5d845c03b1501b9b5e69c4d22db9d573803da123682b4c521e7",9.317957166392093],[2664,"fb7de38df7986321cb88421120119023411aefc495aba373556482253bd7c7ee",9.317957166392093],[5154,"624267c80ccda809474efd686a143a23a3f4b2347219168567333f7cb13a45de",9.317957166392093],[13502,"7631bf0f5800ce59bf4fe0e017b2edfe4107e8b4bf75b771adfd42cb60dabf9f",33.97168679516916],[14018,"59e0a09baeadba744020b7f4f51384a9c3eef326716fdcdcab68124fbd317c94",9.317957166392093],[18712,"518a36e3684c2e2b1d6da1f5b2ca361ed181bbf90a510b4c767952af3e3dd429",9.317957166392093],[12557,"12d36c7b6783eb2b6ddc8877ee2c15226b12491480f062c1de8dfac885ac98ad",9.917710196779964],[6578,"90c1c02097bdec74737e1db826b64625bcf373506daaad7c6c30d34fefcbcdd4",9.917710196779964],[8213,"13e3a0e9188ef9f94199dd3c922d1b6a17116848b6bfbbe43c6e243d8691e0c9",27.87443946188341],[16991,"888ca107b60f421b179d2d310a87a92936c2458ad760114cc9eafff17cc33f52",9.317957166392093],[14891,"6623aac3a04a3d0b6d87559621a92a9aa8ecaa02eb8fa9266a99e7463e810181",9.647446457990116],[18196,"5ca065324b338073462acd2ee93caae9c3edfea48fb5056e86d6e61595404938",9.317957166392093],[17822,"6bac4360e26c3a36bda0d6f853450838bafbebf872f582305c7f2c349b4cd940",9.317957166392093],[1246,"84b8f5414dfacc85b6b4dfdb0c5671ad41c6143af0b5f0aa8f05b6e6860cb5f7",9.317957166392093],[12909,"a6b581f7ee3e58827d7373f1e350a66ef430cf2ee435abd85a23c940243e40ab",9.917710196779964],[18269,"0de63011576fe5d3ca1b70c190f8d4850e60b078199dee6655e059518dab7a36",9.317957166392093],[1454,"60beee644be85e14bf55f001edebc556b8a10ac212bef98cc09f55afc80a7af6",9.917710196779964],[16343,"f8a83ec7e82498692566a2e9c4be649fee46383f3660160d5ea35ccfaf1e2f60",9.317957166392093],[11992,"aa9ae3a72323ac79b76216b48a75cf6e020dfa60b5b6b4da8a138e73caae60b1",9.917710196779964],[7544,"5b0f109c6b527d716164297d062937c83c94a0ce219524aca652e48284e68dce",9.917710196779964],[12157,"db0f336ae2d9911cca33be6386954981ffa19d313afe7f59b8aa1df289e64cb0",9.917710196779964],[17282,"84e66bb48b53804ef8ea31b0f91c31b9cb32a5e7133ec9a023354a11ba388d4c",9.317957166392093],[295,"a9222a10b2e18685417ee4fbcafd64927232f2f9e94f5901756e54b6877efffd",9.917710196779964],[16706,"33ca8500677b3a86bcbdbe36caf67371af3580978abb8800f6c6c75bcb7d6d58",9.317957166392093],[411,"ae0aa379d753ca2c728faddd0129fed39c7912e3628273fe7c790438540e49fd",9.317957166392093],[8809,"cc7357ac420429b71c81cc05f035a8c39b09e4845b17bd0ddbf841a4582a08c6",9.317957166392093],[7859,"77bd2bb6033a37e8afd42e22eafd1fb4e1210ad535875a1d6909167681c17acc",9.917710196779964],[7578,"e56923add1d4a1d3cbbf7e7e6622f68f5f306e712a11f4a488949175a23c53ce",9.917710196779964],[10264,"e4d1c8957f3272c5b3d573e20dfede16679f81d8ced437e28b9439f7a66b9fbc",9.917710196779964],[16818,"332dffd680e7c01265d4b7768d0f7339f1a5449cd5ffefe743d6bc01a1f9dd55",9.317957166392093],[9470,"df95269845665efe83e648c2403d526f92e54e61306a63b5df8f8b43f1ede7c1",9.917710196779964],[16082,"a85751e41bc96521c1db23aed2a5d671912c42d77bd7d384b5dd7a755ddda666",9.317957166392093],[4000,"de035fc326325e39909c126b343fd9d4d4d1a4badc6d028999dadf7f98f0bae5",15],[16395,"a8c9d1254cdbf2abdeec8be6b59d048eb965f3ae470168e7be16ccbeb8b4295f",9.317957166392093],[11107,"0dc65495ed0b900c46600d1a1acf5f7bdad11464b065faa76c191420fa4435b7",9.917710196779964],[17424,"164417836fd149150d3e341c00577ff197de6fede05fdbb0588fce246afc5349",9.317957166392093],[17500,"f6eed99f25e4fb1cb649a6c5d763c317f1801287433cf3c3468233ad27c59147",16.056140350877193],[19640,"258f0421dc87ea68551528faffde008ee5f690093f200df15943683163893108",9.647446457990116],[5363,"803bddc70cf12c4d5ff9f048ba97441282d9bd538e279ee5e75eaf4a69ba0edd",9.917710196779964],[8589,"0d2fb95aa3b9e2f8e4c3213ec047570ce1c026ff131acc572ec52b6bc4687fc7",9.917710196779964],[18963,"ec1912f4ad351ba036bcee0f749079f09320190b24c75bed60e5d23f77e2b921",9.317957166392093],[2163,"d88ef1f970179fed8fce6732acc67a3d34f970210dfccb52f09202f51da0d5f1",9.917710196779964],[10751,"fcecf8060f94aa8406b4d716247ed88f534e26fdfa4d28acff068256a284abb9",9.917710196779964],[975,"9cb9632ca1ffcf1f9fd20b68886a81e07608fa620490e89da33eecac3bb459f9",9.917710196779964],[3797,"74ce1c6dc24b1ab44c9aa8ac5a508940bbd80b70ec592ed27f391cc8f880f8e6",9.917710196779964],[5492,"ef962a6cb3c95cd7ce040da9c7b667091f97e37dd5e4f7d443a51571ff9444dc",9.317957166392093],[11466,"cafb74fdedb7720a6a6aaae57623e83c1b8852d4afc0376bb1f9d1b13fd5c4b4",9.917710196779964],[47,"48e54fab47cdd55f9f3a49648d182ac879349e3e9cc36f1450e036a4ccfdaeff",9.317957166392093],[1037,"44fd1df569590d7570b2eb5850c8c031f2cd73fda85b5fd9a5d59ca188af0cf9",9.917710196779964],[10102,"97bdfe37266e053ce3991dcd31d6853010a13d8690bc58337efb243ff1c3adbd",9.317957166392093],[5590,"37373cd1102ee884c689aec3916136dd0530826f588d419247a858165edbacdb",9.917710196779964],[13794,"55a98347ce7bff4310a4227a3af2006517749812a8de98332661d38c55348299",9.317957166392093],[16424,"d081b0c08ee591b31a7895c067105831d57e1af8274947440d4d912f1e6aa35e",30.604982206405694],[2165,"d9f2db2ed4c395a20771b518c02acc88d480b770357224603a2d05f6d980cff1",9.917710196779964],[18075,"3018e385b2a2b37298dd15f754e490b3a34faa8b504c77d87647ea986557a23b",9.317957166392093],[637,"27ccc5f6ed938013253a856237ee7dce346fc815d69082b5d7d00c612321a9fb",9.917710196779964],[4850,"e6854e893fe879f2d5707dd5a8329f4d94456dc2c0d34412043eaeb276c124e0",9.917710196779964],[1268,"73e88acfd3bc5543d24238961b6fcc3efd36f57899f3803aa354582a75ea8df7",9.917710196779964],[13920,"644c819b4024c4b4fe98e57eacb942022026934571eb26373dc3a6ff30f08196",10.052724077328646],[12612,"87f89ec8e92d8c1a42e49c79e1a266ac0efc8028a31dd51aa3318febafc22bad",9.917710196779964],[17493,"70ed4d0baf0068d9adb93d9b03f5f525c4fa264bbbfc3f9b0d1f4e321fd1b847",9.317957166392093],[2677,"b04895118c2b9300f4208278aee900577037604a163e291a0c9127012b1da9ee",9.917710196779964],[3979,"1d82b5d9cbf4f26a9fa11c6c500658d1fbd19fc3472ddf64bac701831ea8dfe5",9.317957166392093],[10433,"e890d16aebbc93ed769f7a725829d18adae41161cbed785e1cc77ccc890496bb",9.317957166392093],[18497,"8085da766cbacf812813977d652dd6ab29704a0dbca90f4fb8d91ac133ef7931",9.38219895287958],[4284,"5e4fd6b99af4ef0878b78307c93005aff555098a7129fc542fba4ccb94cfe1e3",9.917710196779964],[15957,"d22bab686d08cd722eac5d103eeefb5d77c905bce9c9a12c2b92600d65f6d169",9.317957166392093],[19797,"b461dcc8cf8e54a998244fdd26d54925a6960247c3e2009d0b625906ca66a702",9.317957166392093],[9479,"819bf88d54a0a495bbe7105a6288552806138362ed985d5ab8f228efdd7ad2c1",9.317957166392093],[10847,"3d50b74db746d3167385132e8df2c078e9e20f14d0772d1b0d229f158eaa05b9",9.917710196779964],[8344,"6b8ece7b05bc280fddbe3b6c12e07884f50b61c9dc647ab5b7896a68fa7608c9",9.917710196779964],[366,"93fef5e269bee76a32f38cccabcd74bb56f16b320cda1133f8caf4bc0da3a4fd",9.917710196779964],[14180,"297c8e85ddba7cd22d1d28cc0c5d7890d588d97478a88c2890984508b27bd690",9.317957166392093],[6056,"94387e493c2653fce1550d16fbf46febd27789011e5f4d337ae29429173bbdd8",9.917710196779964],[2372,"a7fd31935eeab1ce0383137505324efd6a9e898ea4be225028436531a3cca1f0",9.917710196779964],[13126,"26c4a0dbcce00887604f2c8f20395ec783f5c45cb877069a54a7133be2cb78a8",10.052724077328646],[1184,"372daf1eaf14ae5ccd77d29c5ea6d163a7f6c77c00690f9c56cb3760839d1cf8",9.917710196779964],[7448,"5a14b346ff1bc4a39dceca87d87091d41e6d8d3f6cebcf0d0699c70177bc18cf",9.917710196779964],[5390,"1dcbc59d077f23a56b3f3e346d82b7c0bbbcdf3e161ef267c25d6d8f8f93e2dc",9.917710196779964],[19502,"748ca6ce7ed958f3e4c5277abecd5cb5f4989b93c594c48f45c79a1a5289460e",11.550802139037433],[8261,"2fed08ac973aa4f42667a6e0fcad4b853f0c082679c50ff7f1eee185655d98c9",9.917710196779964],[65,"cff3327af467af2226ef6f525c41a51183ec6dae795d4278921eef91755f8eff",9.647446457990116],[12192,"d79b1c796ae9e0282eeac23d598f42961b46f996ac2207843556f5e272d51db0",9.917710196779964],[2887,"9ccc441f3d045bc871047356c5d15f2d1cabb95ce0590a60b9f3c45c187b34ed",9.917710196779964],[18964,"1d8633729f24a64aa98b3ee013cd5044f35d6a223dc84d0b4ca4b75027a7af21",19.80295566502463],[14726,"ef740d7f6b1a293c99c91945096b6e1060c19c2fb720015d8a541f724a076a84",9.317957166392093],[10127,"933d8f0deebe8a4c189c185ecc5a937731f3a1a92fe591f311924f19e47482bd",9.917710196779964],[10176,"8dd8f69ab902302bd3ff1787f06c7521e39ad6c4fc10cb316b2658908d8731bd",9.917710196779964],[15359,"138b1ad01301731b759ad3f8f8895c8e63797af0d116c9cb6de1bb8a00884077",9.317957166392093],[18246,"1f316f1f29957181e456e11dfdb673955911edbe2091729f44100c46b1b90c37",9.317957166392093],[8799,"adfd11f40db9a550dfd52e3c400e03d2283d6bdf29b170a7bd763d31185d14c6",9.917710196779964],[15887,"8edd89de5a5c1eb8ba3e0f9cb66b18c22e7c69feeed584e9d5a35c09096d3d6b",9.317957166392093],[17336,"43321b457f76c3c80d8d4d06205a23b9fa33f918852b793487eab4481a3e314b",9.317957166392093],[16752,"c333d21319eec44cc3d2b0369c314dcbadd1b6d2ad38fe14223780faf4416357",9.317957166392093],[504,"949f6fbdce02774fe19e31d2cfe6b33cb69481906bd5e12665b62ee82fd8a7fc",9.917710196779964],[9683,"010fafd68c4c71b9e1120466c6dd964b07ab767fb918e1d953d24229a50481c0",9.917710196779964],[3927,"9296c28feca4876d1699f2e5ea8ae6afd3b8d96946ddbffa540ee9321dc02de6",9.917710196779964],[18754,"3a258de859d712af5bcb45beeabf912352018179d4d74d2d192f3d3d08086128",10.052724077328646],[12347,"f9afae9d058be59117f58b555be88d4053e0e94ce43543f3ae0e077840b5eaae",9.917710196779964],[15689,"064622fd540930b2a940a4e84812e8ebb502fd7b9d4c9fbad1dc08b0589ea96f",9.317957166392093],[10679,"cf1c4e934aac6e47dcbab1c2d4acceab595aa06ab1de80f499721dee50b12eba",9.917710196779964],[17152,"df9a7d05fa9aede6c85c594eac4ad5d69e9964acf80465bcf5e0b631e0b20b4f",10.052724077328646],[7280,"3de1db3d3ddbe4db76c91520878910e22c6799572794d135c0428ce9133d2bd0",9.917710196779964],[9276,"0736b0e79b12467eaadc470fa66469752df7fd305adb8f1369d76e43c5cdf6c2",9.317957166392093],[11894,"be4544b32b438fbccb4819d81922826e6606fe4e1c3f1081dcc5881a78eb10b2",9.317957166392093],[16746,"0ee2880ba7c14ba6905489b925348ac25807c8c3bbd86254c1f728181da58857",9.317957166392093],[3844,"806909c33f2f00b71c53fe35f184170ae98f9404dc0520782bcbf9d3decec4e6",9.917710196779964],[19136,"c6f41b9f29d99e9dda5e183a6c8e3da84c540f5861357a7ff55ae8d670e8ef1a",10.052724077328646],[4626,"41f0be227f2ed9efc47f2a747e8959422716e59cdf78f2a3532f708e505974e1",30.134529147982065],[6868,"d9d2e83d3c9d775d5cef4436596608ba206fa43c980bf6a7cfa59cb5d2a9d3d2",9.917710196779964],[16345,"8b1947820dd007c16020b6d5453aead483049d08af97290be0e40010faab2760",23.94295900178253],[861,"a94bfd83093284f71f4059610ddae3269b33828393ded648067ceddb67b328fa",9.317957166392093],[18015,"595c4ae4abfde1cf03a780996a7e5b404048e1294d376c7f5431eb8dacf9ed3c",9.317957166392093],[3831,"875f03b4e1ab02b9128b2199e9a2dc9110c4d498a2a464649c28971fa165d0e6",9.917710196779964],[13132,"1f63031164c318f652a0e735bd79b4ba0260ab3c72a5d28380f6d381f3f250a8",9.317957166392093],[6875,"498c5a5b5f51c4961ee0290f3ab0070b9b88f1c82e6935359d2860555635c6d2",9.647446457990116],[13720,"c870503fa0dbab8ee11917bd33397948fe2a6cc31e4574917c65e4b759b6f49a",9.317957166392093],[2582,"632cf0c49ec93ed3a9ad3aa6f1490e5062bc60031436e6670535d0cf38c244ef",9.317957166392093],[14834,"7ffcd01a2f71df38fa4a1c2212870ba4042ff0b1b55133a0094d310d470d3d82",9.317957166392093],[8864,"ef8ae5e60d03c1f591403e2a4e017602b116dbbe60d367116717c50c29caa9c5",9.317957166392093],[16906,"0728d8e5e7520968ae4b518f637e659146f5c3f18e16e2c8b3f9f19fe6230854",9.317957166392093],[2510,"313b6eb49a04c6c327764a8b681c49965df954d02afbfcba12e897f850b7c4ef",9.917710196779964],[19194,"b370376f7a8c27d1e1c520bca9cbe3b316ef856744e497e2a44da5b0d429cb18",9.317957166392093],[18272,"4dc570dfde140f2c6a90345043dd85cc2115667837663113e9801f8ffac86736",9.317957166392093],[14823,"7c4679574660eb7c57b21b5c036e1d247e21aac5a24ce47353aa9dc5a75f6082",9.317957166392093],[9746,"2b8fdf68dfbbfb531028609de1af79822be6d19d02bdc681554713871e2407c0",9.317957166392093],[7454,"1d230ece3855e8b91a56364e062424028b82d2aefaf2cb56cc71f89641b50ecf",9.647446457990116],[8500,"14a690b07280dcdc9903cef8ab1397bab8478b2c1d4ca06877b319f3636406c8",10.034527113939475],[202,"674499b0afc657b665538ecc99d8c6f7a328ac80aeed41e1ef4a0f756e92a4fe",9.317957166392093],[14149,"90b865f0c74c241bc020ceb8522afd4bbe84616d6aba6f930c00b7da483f8491",9.317957166392093],[13838,"07c22e5570824f6b77ef7c10b499cb3a48ca0739309fa2ff06ffc1f157ee8c98",9.317957166392093],[12343,"dece7b38bcc639915ac368681b13068796971d1ccf358cd6178e4b1017c5efae",9.917710196779964],[18410,"d07446a4e15c57bd4d0d98a1db572ae77eb5c55f8324279704505f5fd8664133",9.317957166392093],[3222,"fcadc9abb7f3ce735bac677e3371c2c58fd47e1341cd34e244534ef7f1a3eeea",9.917710196779964],[18104,"d1a735d34adc1c6e70b40ed72737fb4352581ac4c4e7071e9716462e439dcf3a",24.64625850340136],[936,"667bcf068063414862a37b86dc68d1d56dbfac3a771421c6ebfc1919469097f9",9.917710196779964],[11427,"68c50fd0eaaa9f797c98acc481ecc8d4278e51c857237dbdc4309a9b391f24b5",9.917710196779964],[8945,"68c6d8c5e9e920d8bbbb0cc22725a70593217211475bf00489a86322f8eb21c5",10.052724077328646],[15406,"4fdcd5eaba8576c870da35c0c25f27dc43e8fe3c3ad015f6a88873c505012776",9.317957166392093],[7486,"b92c5e41c9fb1f0409c68f435f6162ed803864789829e0bf92bc3e3ac604cdce",9.917710196779964],[180,"9b9a1acfd55c4e58c3bdbe0d8851de5257b0a9a626efb63ab503905510dfcafe",9.917710196779964],[1618,"d9818fb32e5f1d1690efe2d5e3acd60f3f5284c7858643294b6e44e9178a75f5",9.917710196779964],[4988,"c18bed5826e99689385644d9f480382e1d1bf1afd8338db1691e22e9f87143df",9.917710196779964],[3604,"32445ffb5fe7d6f08589cd549f612d5f985d711430af43a884d004f2e93430e8",9.917710196779964],[12331,"20ab10fcd700b666a2017017b466c8e9d87dc311d74eb580a1935518506106af",9.317957166392093],[14285,"5ca4914537257840384d8473ab53c7bdaffd7bcbfc3c690c73c39d9376dcfd8d",9.647446457990116],[15533,"117198afdba81fe8a34f72fe2781946d66ff33d683de90eea4bcb43d4e834a73",9.317957166392093],[13501,"d4a7123df6059f51cda6c1b7721de3bb572fa8b97de8e0cfada308b936a2c29f",9.317957166392093],[19145,"e957c8ce55d8cd99c5b97f593cc53700a7702f64601cecf6ab713dd091c09c1a",35.82958579881657],[10766,"0c3aa570817ca5bdaa244a71f685322f7c64c9ceab0bd65765c71b4131298cb9",9.317957166392093],[16789,"eea6542440a3eb1239c5b197dd560cd81c343d71275c162e46eefc9d25649456",9.317957166392093],[11374,"d86981e5dbdd4b02e34012ee3dec11e45b42fc7e66b35e1b8ba1c470092d8fb5",9.917710196779964],[3601,"2ac186644b7b2da29930a03f100c368f481b494357e7499f83958c01557534e8",9.317957166392093],[2659,"7976de56fe25e8ee237af14184f1dd6b63b3aed8dd7ac16982561002c97bcdee",9.917710196779964],[5485,"16fb0b370db5b68eadf4eff154fafc21801bd3ad74561be9c72ee7f34e2e4edc",9.917710196779964],[6303,"62e6d223004ddab40fb5979c0833057c0f45ef6d1a608086a424b1a56c1302d7",9.917710196779964],[8079,"92a7da2233fe1f244c81ceda30c6d2605753a44ab3a2ee64d2f9c413825fe7ca",9.917710196779964],[3549,"4fe0bbb531028ccfc57066b6cb0b31dc2aaca56ad39d1b8de09908081c439ee8",9.317957166392093],[2184,"ef3f96016fdfc670b7f99df0669a3e9c298d911e18eda8ee755aad7f3a48a8f1",9.917710196779964],[3635,"b4c701b9457d3b467d2c7c17cd69815077a08936c968092176b7d33abf5406e8",9.917710196779964],[2569,"a2eb1f58967d3f4238beacfcbc0c44eb98c9836b5b2f2efc167c71e210766aef",9.917710196779964],[15942,"c7a9af56a1ee31fb13018e84ce6d60c1b1f6be87121e187c526d8bb3954e1a6a",9.317957166392093],[12978,"17e581f240fb225b73d785a70bcf24ba06bead68ce8a756e0bd3b987a563bdaa",9.317957166392093],[11951,"ad9d5a4950842e523f1207a81866372ab2863d8fb64822dd253c7436939aa4b1",9.917710196779964],[14601,"fc4db742918168f547d0e62478be8eed395a4bd0df4c03656d882aac9dcd1887",9.317957166392093],[1707,"cb4526c2980d28282743fcbd97037c17184165866c13f0c7ab0fd8c1a2e4e0f4",9.917710196779964],[10695,"bfb98030d7479f82c1c175083a55863dab74837d98ec88922ed652f2eae309ba",9.917710196779964],[8435,"f75896f1408acd5a521ef3c0dd1a45ac2fae922ab073a97a9f5a1b998fbe6ac8",9.917710196779964],[4904,"b11d816982f31aff573fd552d1fa1cf91a7e890697873ce6fa4be5dd7c30dbdf",9.917710196779964],[1400,"b55a47d0fd840b5470afac02bb8b472ad9b1da51f44f5fae884a0aba6e41cef6",9.317957166392093],[6611,"c4fc8a045ea2f3d35136c7124a48b968529e69e13db8796216440f97506c92d4",28.933638443935926],[12111,"cf7c2631d71a685ae5d1d72ff7d5024042acfeef635562e9c8c634ae31ada9b0",9.917710196779964],[3931,"3d34b5dfa385d928deb9bb0ddc2cd848252773348bc1ea44f639d4098cb428e6",9.917710196779964],[4691,"e7b5767a8f03bb544c24eab280a502515d11e916306e800067272715f19d0de1",9.917710196779964],[15908,"dede6832fcea7f2dd36832e7bbc0e91b52499524ce6c83df527e4eea7851d96a",9.317957166392093],[7924,"2a12fdd357cbbdec1d349a56453b8b1660eb0a1f3bfee856c2e40f4ce85f12cc",9.917710196779964],[8977,"d991d4c14a6974a4e0e6d314d2575f99474f291148e5f516b7c8a48ff748f8c4",9.917710196779964],[16798,"edb98eb6634043041bcaedbc69ae681638dee29c6bf9804c515e0929f6085756",20.02998500749625],[13405,"2910018f0db6fd529df9ef94ee347426815cc672dc20e618fc1d0d74d7e02da2",28.863961813842483],[3545,"2822b6bce653157734c57d16e9d935a981725dace1855e75de9708276f8ba1e8",9.917710196779964],[11033,"6962bd60905c84cb62305b82856b85fdfd70b7f8f770114e5a7bc59087c4d2b7",16.849557522123895],[16489,"4f3abaf2c8e51977ad10f3943c0e9b07cfe73c0da0ad557a17898ea725857c5d",10.052724077328646],[12005,"836dc10cb86eb4eaff7f4005ad596281364e27b2989802ed1103285159d648b1",9.317957166392093],[10558,"60a787ca6996cf9b98fea0955f842d7d15bbe6977dcfc98cbcda75e84508e1ba",9.917710196779964],[2301,"8ba8a3132a34af52f2499c5a3891d0ef2110effc917e029fa54295ba72fc02f1",9.917710196779964],[5836,"299cde8a50a3c7735d7715fa9cabdb5ee09609346be7801190fb438184ce1eda",19.218142548596113],[7676,"43f80e977586e63dfbdd87c31903da794577ebde59c08fef109216df1572bfcd",9.917710196779964],[5790,"7d2dbe41afce15b0515e9d9519d1f8a6df014001a3c824cc777f08ec6d767bda",14.864253393665159],[6482,"ac35dd15044faa115cabbc811a18da4bdec2b330e642a56f7f4c9993178098d5",9.917710196779964],[8413,"ebc82b214b450b76d671ab37dd4020941273c93771082802410f96a9013a89c8",9.917710196779964],[1177,"e5d5926d8ebc75d84cc72e845b4d0f209f9de0ae59284967e3fc901541c523f8",9.917710196779964],[423,"6686ccf8da37b7b1385df6263cee9ab332d900ee3c632fb01a6b40c2a0273afd",9.647446457990116],[10717,"7d78f04b6b95b88946a47862bc79d3ca9cb906fd73b570a75ed588abc71ce5b9",9.317957166392093],[14522,"8a3b5eec0253e64641e64fefd94a85238ab16264876448f5feef5c9f490dc488",20.106951871657753],[18959,"47e282817e85805533e75b1b63a8b2645ad351b2d687d50ad873346901d5c021",10.052724077328646],[3575,"23f8465ea1b38ed07c6f3e8f4ae0d01a5e0442e0ed250a8b197aff5dce4577e8",9.917710196779964],[4801,"5228b1088ee5f109e00ff8b492cfedf90b10effe6b6aa168643460c104ad60e0",9.917710196779964],[17167,"b1d8f99ffcb1baca4aea0b80ab958c50cd2e008635ad6a32695c4bcacfa3944e",9.317957166392093],[888,"58094b01036e3af7f5c355a2c77b37caa613de872517638236397a923656fdf9",9.647446457990116],[14688,"7b0c34c5940d4af0c4c5bb64382e2b363db0b76c3ab652f630de81a913041285",9.317957166392093],[4662,"4520d8ae9f01680724d2755e2f20c6caa00ef014fe39a566f21b30d549233ae1",9.317957166392093],[11718,"6928481b71a60a50cca626037df7ccea8194cdcd5e383cb5b8622a709b4b32b3",9.317957166392093],[50,"cb5ba6f3b15ac992b67e2a71d20fb8f69cf611d465c23ff530e24f0361d0a7ff",9.647446457990116],[7754,"9b11c60927a36a5165950acd0c644addb23b9a0dff87a5f184b5fb55a4a41ecd",9.917710196779964],[2276,"0f93fcc6680956698c9c30b27e1ef19e47212d79b8c42ae1acdd50d89b3620f1",9.917710196779964],[16610,"496c78ed7a5d19056495e1eed259582b38004f74f50f3fba2df6735310869f5a",9.317957166392093],[7035,"4e34e6731cf551c176440295ba42d8c4f7324d51d61867533ffe01f01662c5d1",9.317957166392093],[6598,"3f01ab4ab61fc3c4c7494208c82f8d1e12c41cd032b847906fdfe3d37aa6abd4",9.317957166392093],[13173,"e01a5d562280b03ea63587a37192b9c7bbc08d4b8b9cc3ab9c06cb088ec888a7",10.052724077328646],[7025,"8e721b927833e65bbf97c964629eddb4f76c3b270d44f956924fc951e625dad1",9.917710196779964],[6196,"87f4d31a5c51c2a18238fd6b36903909908355d4797ec258ede8a1b30542cbd7",9.321196358907672],[8568,"b7c6af70fa5b8eda5aeb8f0651e22fb4d5116b1505abfc2f477f47f47f3b9fc7",10.052724077328646],[4198,"39c242548619d4f1a1e7dc4c90ed8795a0ec3936d46b589342fd3b90976c6ee4",9.917710196779964],[3126,"23d9e10f141bebb354fb633ed80b1da3d915184e7a8f64b4a236e157327282eb",9.917710196779964],[4389,"118352aa46cc69466b1cfe2534df1e125069b93b96bdbc690b67c17396d124e3",9.917710196779964],[10355,"b1200fa7820081d942e8fc2a1e8170d57211dae3dfc585f03419d9c1946b05bc",9.917710196779964],[7168,"14a1c0284406cf47a8d60f01948db7dbbd7607b37477807c77a737b06b19e9d0",9.917710196779964],[16707,"2f63152a6edc03f29f75e73428a3dfc748e8e51525296bb331d07e20196e6958",9.317957166392093],[10265,"0a6a40d95e03933bd9d9b8e3bdf4573501cdaff6cff9baa1fb274a5569a59ebc",9.317957166392093],[5814,"b85e43687414cd5957032fc3fd865fb7dd401703f52ce99377b148281e5c4fda",9.917710196779964],[18852,"117e063412203e883821ba5d4aaacd674eee11c505d058231148a60f10ef0425",38.336898395721924],[11770,"0607e09da6d071c75749d95fbaedbcc0abc526a2d91586ccfadd494feea6dfb2",9.917710196779964],[1651,"c6d79ccff95a17a2a7b48ea60a13ea7f30ae8617808a83063d3ca4952ae944f5",9.917710196779964],[10456,"7095958455f1d3f63a4bcdc51589fb9d62ce7398d7789a365097a30029f663bb",9.917710196779964],[15882,"e492eab50a7ecc0d45800a79394a5661203f7f25794fd8c661903b767e92506b",9.317957166392093],[6949,"67c107201e7b2dad2deb31a8a8ccd5d2cc47789e980d7e1cd8e3367d9f2444d2",9.917710196779964],[5458,"849c79035605f11d041e98cc2305d131e25ff676e9e7ac77477737feb82c72dc",39.13879003558719],[19339,"26e5902c18e977f0cbee7f6cd1299bacbc52b6ee3c61c55aad18f22b7fedd613",59.355932203389834],[1410,"9c31949a4871052f078401d4c3ecf27179ded03a9abf8040f4d768287abbbff6",9.317957166392093],[5629,"8e204f752aba4b0df54010b2da1819f17dde4e9029586850fc51571aea9777db",9.317957166392093],[19102,"881e95cba709055cbedddb04477a7079969c78aa5db91afbc1630e38df28a81c",38.00353982300885],[5715,"e0c08cf599711fbd6ce2c15120251833b6e41f9b1b2b2dd894bfed92bbe8f8da",9.917710196779964],[8278,"61a23f89bea3f3105f7207cb1d168e2d837d411576285d7f95a39035f4c57cc9",9.917710196779964],[1981,"9c017c1d0f0896ff06c0d55dba3850413d7ed9551ff350d44438f504dfc721f3",10.053475935828876],[8493,"b84f08b76fef4f8183afb049a78c89ee3a7abd05deee5d6597224450647c10c8",9.917710196779964],[2633,"6104a2856c93b38b77a61661364c98a1878ad0f64521f4c0f84e94a19d3bf4ee",9.317957166392093],[3490,"dce69fa1382a62f6b4bf8e37e9ba53b82f67d5150e417061412f422839c917e9",9.917710196779964],[16250,"416697b2de1f81a0a45ad5f90bab0f055d217ee3b267f54c71fb47d2fe904d62",9.317957166392093],[609,"c70480e832f14a5d1314ae82c7a7261c911c57618fe3319698e734180af2dffb",9.317957166392093],[12606,"9f36d598180c830d12fd25409dd8e9da5623c6e98c7d112fa498fde88ba639ad",9.917710196779964],[18791,"9e553769f100dc9ad41560ac3308df74af1b174d23fc03256a35f6b9c3a84027",9.317957166392093],[12345,"40c006b2fc9a04d1448053f341ce974b3a949478983cef0cd9211503f511ecae",9.917710196779964],[18735,"dad4023654804c74793142e8a9ba71e69713e25eb0c4af587ea243217e273029",9.317957166392093],[5358,"4194cd868b192be982fa7cef729ff1d297ea6619e2810077acb929d0755418dd",28.063492063492063],[19436,"2a6201127b2e608ce1ef18ad06aec1c3c7077e42155ef9a6814fce32ceac3d10",9.317957166392093],[11584,"0d22d2d08e40b19a0e3093a2d553a1668e7fceefe9d9322c19246a96596df9b3",9.917710196779964],[11011,"75c60d77785458fdc271f1dd25ae8fcb2e80c779681f857dea8cfc8c8fc6ecb7",9.317957166392093],[1912,"288f64f97883dc6aa811dd231b484a9fc03376e09d3c17bf313767fda83793f3",9.917710196779964],[11663,"bb93d3c9e6b589b194fb2c903d442eb0d4c20bacee57ffff46ea22cb63c97fb3",9.917710196779964],[15140,"5914823b8fe5ac9355c3faf4304eb93cf0a8ffceaf7c4d40c3ffa2993100b77b",71.301247771836],[285,"eaa5d5705874956ac59f45ad30bc53f7fc40ed4a5c113e2339c60d3bf3b70cfe",9.317957166392093],[4240,"c569bd108010caef371eebcb511243ebe3cef42f66b3d71524562589d4662fe4",9.317957166392093],[14666,"702e848cc4b1a90cc92b14e0c63f06022c7246f823d0d82303b3813641419985",9.317957166392093],[6992,"51a301826829c457eb5dfacbb27876a25ef3b36b9fe49c67a64ea042a3c80bd2",9.917710196779964],[14290,"3068de8c802011639c9b864302c5268cdf626cfee40a1992d3a2f6b9bf18e88d",12.750442477876106],[2456,"54cb594d1968e4f53e1626b0b36d8735ede84a4b9e77f94fb36db451a39b28f0",9.917710196779964],[18827,"37fd1509cabffbc5cdff4c04bbae3c7847d006693885d5a478d7cdd1e958d125",36.16143497757847],[17623,"b025d1f3b126ca12e2ed9d97e507bb4495d213eca87ffdbb68552b340868d344",9.647446457990116],[12734,"81a2dcaf4177540202fa3c38eb22f153879748fd133dba04d4bd2abfb3705bac",40.71301247771836],[12458,"bd9f5c4c483764fedabe4d498399a895a57a57f61ddeddbf3945109f583d3dae",9.917710196779964],[9977,"6a3435555d215e89ec79941c93074c3ea4ad85bc3f7f4aad4cb93e8476de75be",9.917710196779964],[1473,"7bce0e3b796ca6c4933d0e042408051b3ba51c5e86643cb3ae24961d686b52f6",9.917710196779964],[4021,"f256690a52d66a85606da2320799fbe2458aff41983843a0207947fc8d0a9fe5",10.052724077328646],[19294,"3cda4019e27f29ae4f1d03190c44fbd0ac2ba119af27292d793bc39e6ec20515",9.317957166392093],[9646,"f1f98d22ee5089eef1552dd3ee4a8700dd60a904da72da5a46aa0a2a92b5bbc0",9.317957166392093],[7786,"fbd3318eb6642e76ea2d2a0846b22ebf95bd062a84b1cb2c63e229122316e8cc",9.917710196779964],[891,"486611199dfa7774bc4e0764017ea6312a2e54406bc29a7b6760a450f185faf9",9.917710196779964],[2706,"8641d98d1c0dadc2f2237ff6d4edd3f516682d2468837904732309b96dab6aee",9.917710196779964],[16324,"826a8ab18bf15c33ae5110e8ac8a43b596f0d4d07f9aec312dd1840d7f0e9960",9.317957166392093],[3159,"6a8011adc8bdb2ac7a1bc6e7ccc99c96c2ca69d796748104edddd80be67450eb",9.917710196779964],[13579,"aeeda1fee276a78dd26781def9e1a97fb8d839210ef800044710efc8cb82eb9d",9.317957166392093],[8465,"5342f713eb454934e1cb364cf914dd56bb7b0f2c923b3eb19f0c35200b973dc8",9.317957166392093],[6627,"059e27ce830417b7449609954f2ea38fe4f24b36476c103cc10aa1abeb5978d4",9.917710196779964],[7665,"34c7ddc6fd073da63ffe85d88b9bf49d35ba62892972acc88474a34e75c1d2cd",9.917710196779964],[8385,"1117f5733184a1ddfb2ff2b7a3f0f34937d83294ce6fee5db6b371d3c883bac8",9.917710196779964],[12972,"1e2079d6e7a20d8a24af8fc14770a38b1091a7387d0f92f8c2cd457ffcb3bfaa",9.917710196779964],[1432,"383dde3b639b61b813577164a04af9b909596cd3cae9318589aa288e022a9ff6",9.917710196779964],[12809,"4c71c9352b0b5f9815a73545e0375dc64ae7a95285d1efffcaa7bc17f30fe1ab",9.317957166392093],[3813,"c17ec170d6b30c140e5087e331ceb5b2b8715b54d876ff2c2bdbef392dbde4e6",9.917710196779964],[14652,"ef0d81b3723da9ca35e75571a680a4230eea3d71a76fa3ab39b1cb0a29d0d485",9.317957166392093],[1753,"5b857dc9051b6b3a6709897ba90fafae481d815901f52186984efbfa9a9b98f4",9.917710196779964],[18718,"a7fe17abe399d109a26ff045209a9d03cc83a815ae74210874025e1e0672b029",9.317957166392093],[12566,"2d24df8f54b87dc5105bbd7f15d90e2264a3c1d0c23c08b896bf50835c2783ad",10.052724077328646],[7212,"2feda3d656e9b027d504b20d0a5eecd9a4f65998e38db5dce7369af41fb09fd0",9.317957166392093],[14014,"806ee16f522ab91d076890fa111fededd0b72eb3e09fa7bbb43be8ea3d4e8694",25.87108591365024],[11336,"1f76026cf6f7b531a40110d6f12da887e3b06c98fba379dc537017d689a0b8b5",9.917710196779964],[14940,"dcefd3465ea3f92c389e00a03878a742c37adc9e18168fad00025d1196690880",9.317957166392093],[11593,"b5d9193034ec7bb7273d5993634380a40000ec8756fdc4c8f2db9955b4f9f0b3",9.917710196779964],[1867,"7cc136d1f1685ded5bc20bc83614dab722aa9ace008a170a918dba73be6ad3f3",9.917710196779964],[5067,"957ee79da9c9c489d4092b098fb24bf703451462a26906ea90fa97acb7cdb9de",9.764180264180265],[7827,"e5b308cf17c90f1ab0d6e86e85eaf0e533ad9f75ceaf761c1bf25710f7b098cc",9.917710196779964],[15182,"d2ef5e8bedefaaffd42835a844d08e36d348a56689838dc8c9fd217ecba9ea7a",9.317957166392093],[15323,"0908c0265ecf028b9f52c3f4242902dbb9a0d72d4acaff3df7b29813cf2fe177",9.317957166392093],[7673,"023368dfcda82cba7034a9d688cb8d46c74108ac61891f18c8b37f32829ac3cd",9.917710196779964],[4230,"4a49837cdb4a1a3fb0c554254b1daf14e81cd518df87b428c363f93631dd33e4",9.917710196779964],[7079,"322b9a03f968dd2aaaccbdf1b35f15e09014a7ef94003f6c7305e775a1c276d1",9.917710196779964],[19233,"b867827e969957be9cc32c4937782385edcb528f0e70ba01ee809262d2068917",10.052724077328646],[8731,"24907c61165f1bf029f39f09325329dafa93965c8008058b4a7b3a27339f83c6",10.045662100456621],[5877,"ab3a2ae1fd398a07af4c84d89ac3133f8bf46be46e69fd1121ffb24e06dccfd9",9.917710196779964],[10676,"761dccff51cc916e2f1f2ea94be81cc2e18e2a2314baedc331b8a2dc166f32ba",9.317957166392093],[15055,"02a857cde6d18652386a7319a421587a82f1b754f9a3224bd3dbb50aa33f717d",10.052724077328646],[6266,"357679078234bff92b016d94f590dfeae196a0832ba1392e5423e0dc8c644bd7",9.917710196779964],[8820,"4c4d737d4c301d274a5a0673af7a079b506cb1ee0540e61ed4ab2d6a3b6df8c5",9.317957166392093],[141,"2ba0459a68cfa0582cc96caaaa2452678138ce3d9b381f106e6026c4b5050dff",28.097560975609756],[2321,"74d33369db406a0590bdf2352d8aeca5d0c84d569664a13c7d3039d84724ebf0",9.317957166392093],[12512,"aaf942088792bb83325e0c5771d0b922c8313779f8cec9551cc4c4b2e6b4dfad",9.317957166392093],[8055,"9eef7ade4af10e45f37fb2974d3725742e3fb60c5dc5c614abaa29b33d5922cb",10.052724077328646],[19871,"3e889d8c44ea5a60af0b5254940012f369c41ceed333b58b3c9f124137ab2100",9.317957166392093],[3086,"af895abd969b142be956a6019a4648ee3acd77f1f6040dc93aaa912f4ee9bceb",9.917710196779964],[4249,"1921f9fd5f52147521f58f88ee082864d5eb4661fc83a3242e9f6d4274df22e4",9.917710196779964],[8080,"48e154a73348e8c9618742a1050565e5ab896c1260dfa54a8e136ac3f968e6ca",9.317957166392093],[18756,"b3525d0fc4e19f6bf9a2108e135bac20b634aa42e1b2b115f6cc1a8aa8625828",9.317957166392093],[14349,"e7cadc1ec10ff12c50f8a8f392c0c3ee3330fc10049b9fa4bade9bab497a5b8c",9.317957166392093],[7642,"e6116a9b4255d87d0f11e17bc4bc62e4562fba3ed12a2784a6db6dfc8001f0cd",9.917710196779964],[19203,"4a1810e5bf02675e2e2173503fa87485803840787cd16409ab794918646b8418",9.317957166392093],[6317,"46efb4ea265cdc5fed097847f4af68e29418caffc73b649a008baf04c16de4d6",9.917710196779964],[10337,"8b801550446438a80c78144e48aee8e8cad3c3bc4b2cf956b53f49cc22e61bbc",9.917710196779964],[19077,"7b25ba136efd0c9f080cba168ea0ec30fed1f856c0aca095c00849be3be0bd1d",9.317957166392093],[5279,"a8252c75b8e8afa40a3cd1172b2b69e6fd7113c1123b7b42d60fc7e925f487dd",9.917710196779964],[13256,"77d3f1438dd5ac26d23a694e023f1093efebb2d45ba2c93cfd10b67f7a2e8ba5",9.317957166392093],[4915,"2e083de8764d042c5733ce418519cf60106bb6a39f59edf8ac66ef051225c8df",9.917710196779964],[522,"694a8fed3e4179de478c31a30cd555dc46e7b90aec0ff88afb30ac3f9e5b81fc",9.917710196779964],[3182,"f263498586be6d9c65283151bb138961374f018b4061d2a76517f9ba7f8123eb",9.917710196779964],[9885,"7f3ffc310642c31c56ea5bbd670d6fe1e0fbb03f5cabaadc88723f1294f908bf",9.917710196779964],[12798,"0fc83e2ea223f96040da50bb296ca0bb7043189d661453c4803ad772605eeeab",19.066666666666666],[12839,"d8b53a4c0a0d809b05cd3665bcfd3cf7802105ccdae07aeab1a6d8225da6b0ab",9.917710196779964],[2945,"d3a5058840b7fe770d95d18094973930732a7c4ed621a840719dbf5147ebb7ec",9.917710196779964],[2638,"7d7ddb972052e1247c2f20b323f49818e11a5f97e41e28e76f830b4a310fefee",9.917710196779964],[2287,"efa64d646da256ffef95e544d96767ee51d2dc10f4ff6a14dc9bbdfd42dc0ff1",9.917710196779964],[9576,"c9654519e2bc4140c78379c1d061c3871888af1f6fc19082f6f74abfba9e27c1",9.917710196779964],[15508,"990ff9d743e14d4f9ed6dc196620cb899e9b1bb9e9b68685a6c52868394ef373",9.317957166392093],[6000,"e2ad20fdfbe33f0091210833e979ef592a2eacd0a85798cbce9959a35fbd10d9",9.917710196779964],[5397,"2891bc1c5b18ed775ce034257f7c714c3ec7e7328beeb7ceb139bed9932fd4dc",9.317957166392093],[13653,"76f6fd019d83326fca8eef7eecc089b48d297d18fbcb3979d162c19aaef1209c",9.317957166392093],[19409,"ca08c3544f49fc200e799b0e549b5d3ac52dcfe8b5ed9703b53741bd65cf2d11",9.647446457990116],[18599,"95ee552020808eaa9937c4fe686ab6120994576e5a7bd1c0d60c7426c20eb22e",9.317957166392093],[5817,"0cc184d8db7d94b936918fa37597a8ea1ca75d52266ea5393689b44737c847da",9.917710196779964],[10074,"1f340fdce35cf0921aac6f4390a9d29377e5c3d8ca833dd4858735f5e7b3dfbd",9.317957166392093],[14677,"083cd13b73e93b93e850167e82412aed83ad8fd0a89d306189b64f21ad165185",9.317957166392093],[11849,"c5aca007a6996cfacb1cdbcac1160c6a1179123d29462e347c713408886760b2",9.917710196779964],[8469,"5aec5a14be9ddecf2993dd44d0d6eb96acec4dcbcf22d22115a9af50fd0b37c8",9.917710196779964],[18839,"ac188d4d10892f5ec5cd22d3318a26c5fc12dc62a1b33028628a73cf610c7025",9.317957166392093],[4488,"15d10eff3dfac8ba49ea2523bc5deac21d358c9856b1a926c93684a3099b7ce2",9.917710196779964],[10409,"6d3fad227a8b18d66f9ad0f9648001fe71d096c0f26caa5523e4cbd201e0bbbb",9.917710196779964],[5905,"ca2e5d2687fadd564b77b5bef000fd9441b360db0331c91341f3ce316e95a7d9",14.112994350282486],[10497,"c69c2e34dfac4d699ebf2b1f8afecf7753a6976939415b38262c421985ec2dbb",9.317957166392093],[10945,"eb66e27a40625e45452f7cf43ebfce7d6b0c3805d32a82e3defbd636e4fe69b8",9.917710196779964],[17437,"594368265f1788c767560d7b7d1c3616911d78d65cedef7317ecf128d8d4e948",9.317957166392093],[7697,"e0e4fdf6f87e3479b0057d3e87cf581d122fd1a2df4d89e5ef73510f7b2790cd",9.917710196779964],[10470,"2ab9d894559afd292bef6fdf76758d094d726eee7cfccc47d968c5eb46934fbb",9.917710196779964],[13824,"f4b95fb19bdfca226bd30ca824c48bf58dbd91229cee25eb41ad71b80c6fee98",25.748086290883787],[6719,"692f39540ad7ac4710910e3afabcba07be855771c6176d559572dc7c6e04d3d3",9.917710196779964],[6575,"2a0bb4e62640a7b0c80b8246300667f66b7ea00078bb9b61db37583d835ad9d4",9.647446457990116],[8546,"2f1a62465d800b765efd742e30ea749ecb106ac7316d331e996c889d1ebbc2c7",9.917710196779964],[9998,"8344216026e85c22019b718eb07d69759de77c328d124e4d33490bd393f859be",9.917710196779964],[2367,"0e8788f1c656a4c3615e03ff3d43157d8d5ab15ad13a75db8202b53ba57ba8f0",9.917710196779964],[5254,"2c0ea91c635a98c41ba61246087a06a43fea105eaf36df0ef40e98ed4f21afdd",9.917710196779964],[7565,"5beebe67bd8cc777708b97a4357c6a6e94264a3444d7e8b6b34b0d358d6567ce",9.917710196779964],[4978,"ba533f7472a4b47566eff2c86a4eac2262024aaa5fd5696854c2812c435454df",9.317957166392093],[12906,"6227a4242bd28dcd0cb04c2da65a8d193305ab390ab0ed42fe1d534c40f846ab",9.917710196779964],[15813,"f9dcb6a3e060055f48a352004b148d0d87d2896d74b3a1c2f57d8d769955296d",9.317957166392093],[16363,"f8c3bf8e8c83e342f7ad5b18fd946cf99b05057f752a01076489dc3ed230ce5f",380.95238095238096],[10469,"a19236ff4cdc26c7fc1c9f2842b1f1d5a08f226d45dd0e42570b5f8bc7ea50bb",9.317957166392093],[6122,"ac0a41e3bc7770452f14038ad0f9125c913478f2fced9b30c995e1a8df384cd8",9.317957166392093],[10064,"4a02a049281d4769e578ab21d19317d079aeab28bf09d072ce1155b735e2f8bd",9.917710196779964],[14799,"fa5afe2a78540213ef40dfeea47484ec406824d44f2b90fb693eac5004d9e882",9.317957166392093],[9173,"3534a3ed650875e6b678aea1ea510edae6bbcb4ef8835414bcca13e5abd0afc3",9.647446457990116],[7125,"95e82050c357643dafe2f4e12afffd64c842f278a57cbc664e596515e4f12ad1",9.917710196779964],[8908,"13fb61231530043c30bf482b2a411031a3486f87d8855e0e795a1a9192ee65c5",9.917710196779964],[2514,"6cdb45cb17682338920469f610a881831f31cec7021a08a06069946f5516bbef",9.917710196779964],[6632,"d67eb1d44fe7894760900a81e0987a0a2f0a56b0ed4accd44a14bb11e08173d4",9.917710196779964],[12623,"9afc61778408be8b46774c06944f29b86a582a3b7481fc80421fef8547de1ead",9.917710196779964],[8761,"9b93837953305bdf93b40a5f76ea3061abff2cfefc627a8086927049ca8745c6",9.917710196779964],[6828,"f314a30225e4802433841fdcdacf8e71cbc8053e05cd8089ebfaa34f176b12d3",9.917710196779964],[18284,"810f2bd9bfb4ba23e2de17112638b6adc3ef3f88981036ff4f6a62f8bf892336",23.05764411027569],[12853,"708748c111b40daba63a8533575d2a9b9ab4d4377c85141e8635cf7b5ccc8eab",16.975265017667844],[14532,"378a20957cd01ef868b008f7cc04db2a213f2c82b2a2cf28d700299493359288",9.317957166392093],[17319,"488c5276fd8ee6016c247e5974b49f78e662394e961c7d4bcbc34c862a6a854b",9.317957166392093],[9678,"ddbd70399fe173271ac0366265662278bb22d009a4fd9db32446b66ebf4786c0",9.917710196779964],[8130,"88ca52fe142562d7897f35a74c29a542ec487e0049713a519f777194909e87ca",9.917710196779964],[19623,"dc9fb65a5a24a5e70b1bb82d9ab884ef56699abb3d467707c2c6111347d5da08",18.09557522123894],[17471,"017d8ce28aa196fd2df1a991e64f0d669f6f4a3c8e2927ba51d5ee99ab294648",9.317957166392093],[19506,"ade23d93c91d39d007a851d1ebac963c9b16f22aebb4cca30f69a8a437b4100e",10.052724077328646],[11021,"d4f6ebf8d28900e629b7e4839b3999eba80082b261df3e0a9b644aa4cad3ddb7",9.317957166392093],[566,"8d0873f3b565960b133ab04d673b83535273360b13c64fbec89bb06de8d228fc",9.917710196779964],[10969,"6f76efd19cd6b461caeb6e367e65b7f829a4511e4c0f4d46eaca35ae036738b8",9.917710196779964],[490,"de02c950b39cd893bdb6679e94a58544434e0a27c4b67a1b5f5d22aeb9d2b9fc",9.917710196779964],[15460,"288c05e5035129003f006d6e1cd505d1ec27ee763181bfcb158fe3726cdbfd74",9.317957166392093],[18340,"af0e117ae4bc442d67c4f98f482833c829756b4989f41e4a908284258b680d35",9.317957166392093],[19564,"12d7efb712576fbaa4018c74755ffd2114a7b318d9c9ea937ccff361efc92a0c",38.70022883295194],[16576,"6f3b270e144f45d6e0b5787938b72a17d023633a467790568aa258456578935b",19.066666666666666],[5951,"db0d49189b8cf5b75f77ced9afc2224c50bb00fa3db51bfae936315c22f868d9",9.917710196779964],[7478,"15ff01b2cb55bf43a6a0a1a764eeb38073d2300831e3965228e9d07d32e3dace",9.917710196779964],[4185,"3ff9cfdefac34bc96b7baa476066a14b1fc0b702715c1825bc8b682832fd83e4",9.917710196779964],[12750,"ed94fb464bcdd9adab96a59fe9923ec2009e46d249e42fe0c0afaa36e6a93cac",9.917710196779964],[11604,"9b79041336baf8e01192273efe437ac24a18b935f08ee58d0bdd1af859e8e4b3",9.917710196779964],[5442,"b1be0a43638cb87aa1f5ad7d9d19d53ae5dcaac5937f05858b1eac3ad63e86dc",25.358885017421603],[11688,"22e72a729cc336576d3820d67a15ce2789196b0cb2aecc14bea1e3e8e5c260b3",9.917710196779964],[3236,"d6853b5f0130dc0b567ad815ae4eb9ddc1f0500bfc21a2eacc64547ee570c5ea",9.917710196779964],[13188,"c64c90422a3bf3d9e3eb7c05abcf67b872abf9c8bca4eb5ee9b4eda9f8a736a7",208.46715328467153],[10580,"d60c9b3effe839cda5e925328436b4c77f15235135c6b8f53f25ad7b9e3ebeba",9.317957166392093],[13437,"b759054f70fa2bc913d82b4a7ea65252953c38e8cab4898ca1b7ac74312e90a1",9.317957166392093],[13455,"62dfa6aebbbff69bfe3e10e55cdc4e53dc1b372f028d72d4e33fe20df312f3a0",9.317957166392093],[1876,"cafe1beeb900bc91013f7724f916bf456dedf3c8810948d05630721f0d6bc8f3",9.317957166392093],[11684,"87043039cfaed4e25c34bc8d6cf2c0f3dfffd16cfc9a8bae75ef62846ed467b3",9.917710196779964],[16744,"51a5b2b6ef08ab97d20e04fcb903221da0f87add84d623ccde3159af34799257",9.317957166392093],[12161,"9b8373ed362d286762ecdf501250900811f25028cfd04a2f7dd4a0f3fda049b0",9.917710196779964],[10974,"70bfb6eaac3f3a196c4e593145bbba5f6e5b7e7e31d2400b51c605e917c532b8",9.917710196779964],[19270,"a0c5eb57c61ba8f711c2e459f102554bb1bf7322883774b4a6938c46b555e815",9.647446457990116],[5192,"436907b5e36f95a36e6834a626fc03b2d346ef4154fb239a7c73c7ddd50607de",9.917710196779964],[6345,"2971a58502f5d49dea05853384fc95556ec076d1d698cba37efb2189ed4bb0d6",9.917710196779964],[19589,"542a15390566688571c37e243fb9947a7672b2b5fbd74f79f35df0c56fda9e0a",9.317957166392093],[11105,"20830591fb3b1a08e4a169186846a0e45053f8ad7f94f05b118ccbf93a6c37b7",9.917710196779964],[12723,"8aedeea9f7ad2a6802e41c1b04c9cfec2c17733771b8a77dd63b514d4b0a6eac",9.317957166392093],[7923,"945909fdd7862d5de44c9922b608ccbe48dc27f174be3f1c0eeb8b9cdc3913cc",9.917710196779964],[15361,"fb032c363cdc9b97e6369609aa2403d368934cef0c8994ae11deec019bc32f77",9.317957166392093],[533,"01adecf58eff0cb0e46bd0b611c4708e7fdd3ab14352e37b10b9aedcd50171fc",9.917710196779964],[17531,"774bf4801df444d40a3755c3a0ba0462c356dffff32b806128207e05e632e546",9.317957166392093],[388,"1bdb602b857991ae2227ec0e75cc59ed0cc3c1072511563b06c1da18e59f70fd",9.917710196779964],[5896,"d0603fbb997140348b12bbb9f351b63a32cded56322f58b70689ecabbb24bad9",9.917710196779964],[10770,"a5b99b1b1bc0abf5bfd979a7232d12405863ae936d4742c9f7d05f7d726782b9",9.317957166392093],[15151,"3c57ecd84d0f1e90792cf8bc4dd073de1c3a4b140dc1f5f1f8c0d3bb6083837b",9.317957166392093],[3412,"018d44eb39bc64764d5828e349ac5fb8b820f0755287d002997e01201b3d97e9",9.317957166392093],[17877,"878e2579a0e633d68a80ec3d7db3ed435e86b0e3fda946c1aeeacd09dad7b43f",9.317957166392093],[8822,"ee029b781c414e96767a8645147b3016e0e63fbe502511d05c23638b3921f4c5",9.917710196779964],[10245,"52ab7e581582e582bafa83a0a8d416856505181d8206f1c3a25ae83d91ceb9bc",25.84237680128091],[7149,"b30eb5e3cf0ae25bb7722519b358e472b6eeacf4da24949ef768a953eb1306d1",9.917710196779964],[14638,"e9eaf79e0795c421d923ebce36055b7450c7fef47dea24f2fe664d93b2413086",9.317957166392093],[4882,"8902bcd64916919bd61aac816cd019c87a08695bfeb4add29946bfe21c05efdf",9.917710196779964],[6425,"1c57e6f118c8214e29503e01a0ecbc12b08b6d53437d58f6c8668e5c85791cd6",9.917710196779964],[2570,"d04edc01514331a93c229cb10fcffe5d24c3692a916f40c0d2f55a11d1ac67ef",9.317957166392093],[15407,"685d8a893a378174d1ca912af275d08659c7cb886bbb257cbcf12330519d1776",9.317957166392093],[918,"2f3279d11e0ac19d042888afcedbfa39d1b7d28199a14778ff7ea5ef3631b2f9",9.917710196779964],[12852,"24b2f8293d9ba7a4d61c3faffde30dc89d0f2d74dad8cba4e59ab167de3f90ab",9.317957166392093],[7712,"aec776f51d1cb08c7cb034b5dc409ed5addefd818bef9807953dc508392777cd",9.317957166392093],[3807,"d7b7d4a829fc26d1a5af07f246e777946677eee2be49154f0abc0895a02ee8e6",9.917710196779964],[11220,"5cf588b06634c7a0c5f074044406a4e8f4a4e6eba1c91f754c45fc68bf6695b6",9.917710196779964],[19611,"c1f3c8734f5842ae54bca657700f56a6695f33bd38a6acc9ae5673bf669e7309",9.647446457990116],[8153,"c4a7ff8b30ea9984f7f11dce3ab1d299e4db498f69027f7901a7b937c94154ca",9.317957166392093],[10480,"e9fa41d0042d82294f8291b506290125a5d8a40d7f48af17dfea16499eae44bb",9.917710196779964],[13747,"f5bea686e98c3f76c9f18d4446895039b403ceb1a6ce4cfee249dc6a4318859a",43.79342723004695],[6716,"976bb27db73349f31139dcad06a0fb88b932c4b90722398a95fc508c8e58d5d3",9.917710196779964],[7338,"761253bc6715c0a6264f8618481bc8e774a5dedaf7914e60eb4049255fb6cccf",9.317957166392093],[14178,"eab058659de5e1e12082fd6e60e4ce46a6926b6545931d0edca2570ce90cdb90",10.030959752321982],[7391,"b4748e43c0fbcfb6001a46ce8203b0ce397c3ca9e5360f762708ff91fe5a7bcf",9.506082725060827],[9886,"fc187bbca5b57c7f46a76c216ec1904ca2b1d14f27c403913c6e8fd92c5008bf",9.401360544217686],[6313,"23cc8230e85c8b73aeb68a287856e1b5ed4c0f222a94de4778254a0f7ea1e9d6",9.317957166392093],[13351,"f85bec44df1600a9de0968e0371d6a13c8ecd935be3d0bf768b2bd1c013874a3",9.647446457990116],[19686,"c57eddaf25c86a555d49747bd4cb0792cc3bce3d1395adbed146ee2da14a2507",27.014778325123153],[12034,"29196b41e9a4a439e79f60cdc58b03d93d9f48315750c088e12daa1e314b15b1",9.917710196779964],[16734,"bc11d9b920fe9b13f9caec856efac0c392f9d9cd4b9207ebfb27ed08bb1db257",9.317957166392093],[16758,"e11dd0813814e4c70469a46f5f414a5003d01fc771fe2cb0f67eff5bbdb64757",9.317957166392093],[15128,"ff463680a92da73af769724c44b720becd0efe021d913b533c0f152bfc7e247c",9.317957166392093],[16287,"f2b140b3c62ee86ce2097199ba6c7db6b6ee04b435ee3a0c75a6596566458861",9.317957166392093],[10528,"d4b3c5beec985978b56ff2a1f9cffade505ca34196e39ed7091bbba8cee700bb",9.917710196779964],[5096,"6c290af9d5e898a7555da5a90ef63ae5bfa82381ae69ac5fc8db43ac9f209dde",9.917710196779964],[13262,"6d788692b3cf9435788f2c9529ffd4484de422fff8dab8f46acc2969038675a5",14.181818181818182],[10871,"cfc481ccf3a16639d20a4221fb899931e74794ad4c81b1a8d50cc61984b4d0b8",9.317957166392093],[18681,"c931997dfad9abd8c2178223343232f08436cd783c6b43eef89f5d11475e2b2b",9.317957166392093],[39,"5a53f67423bfcea269e19fe7b6961e4a0c5027402463cd809a97d83b9145c2ff",9.917710196779964],[13927,"3fb6d828589174e2dc1fc7372fe410786be496423f28771ebebc3b93a0336296",9.317957166392093],[12489,"294f6df574f68a8957a6b56d0421a4b9a4eb482936a8b356de8c485e12e103ae",9.317957166392093],[5082,"63e4aa1ba77717082f119d4c1b643f759ee16b39975f5cde17729d151254aade",9.317957166392093],[11877,"dba855ad422ab68234d493b979f5d4ba947b27d7281d4b84e86dcaeb4ee034b2",14],[18926,"43558393c610dd8f65c6f51bcfd6c4f2862b7c4c6ffd05c6b3c0a4c8de43a722",36.07017543859649],[17871,"3b82a20d5f38704626113a7628167b03b26c4c62d3970ca31fbd5151228ac03f",9.317957166392093],[10878,"d556378276d17d3d6a39ab739bd66077e254b1d3008814ca983e424ace15c6b8",9.917710196779964],[11600,"67a3ab9bd6027934471a560e330b306f3a1b72206e0fe53da496e49e18b6e5b3",9.917710196779964],[18709,"081c7b6ef8c5e62138d0e4d0640fa81bb3420e753f0aab9ac763be111403f429",19.075734927752865],[13595,"7ee3ed53f7c95c67aa681a29ab0f95c484e6a331337176cebffe37e62e0d9b9d",9.317957166392093],[6959,"41a51429e2d1e2e05cf08680ac0ca1a187cf3266dad20b0d2c82df11dea536d2",9.917710196779964],[19119,"e0864bfea9e6fa40b1d0162df318a74eb2533326c95a44e2ff9883624726aa1b",9.647446457990116],[17214,"b66b20e75fc29fc9184991dee0ca5c918623f1f965f853d2fc2655abdc1a924d",9.317957166392093],[12131,"f42f0b6c844560bd0d314c5c4bf1aef81bc4ce412481361b3fafe38108f27cb0",9.917710196779964],[12998,"9c271b20a23def681f93e529bf07dc96ceff911e754efbca569c0a1fdb4999aa",9.917710196779964],[11002,"083e78704566290f6da216a940a8c8c66e481842ecfeffe68f5fe3cac5f9f4b7",9.917710196779964],[10674,"afef39092735b895a03221bf66c98fe0b77b3a8e4767a980491011f4ce4a34ba",9.917710196779964],[19819,"7fda85746df4b3c3049b16e646c79797b64f2a6b189e13d02e48e6548c35ef01",15.026455026455027],[6931,"2b1254c0e4de105cf6b07937e829432afa6d19d3631dfb027f55687a44836dd2",9.917710196779964],[17698,"40e5ea470922d1dc26417258b621e5ecbb53f43298d971b45e82c1c363523b43",9.317957166392093],[14649,"801b4c227a5a81d2e5f51eab89d859499712c96c9480213f23543d271d2be485",9.317957166392093],[9952,"64d8491a28ea9e823253bd4bc455b96f47aab19a0de5dbefbaf9cf341b6e9cbe",9.317957166392093],[18432,"6ed824c1752fbff0aec991180c440eeb4722739f87fa2a82ddd94fc89328f932",28.955436720142604],[8266,"565479e261f406724f8bf975f0f56bc849ee8896e8054770c7694f07b81e87c9",9.917710196779964],[18091,"03382780703b956d6ebb5650f10fba536c715c1d610d4292ff69f09f6c4c223b",9.317957166392093],[17769,"bf8ea042e91e668eb225dbc7e551549e1581449fbc226f4a279df6296247e441",17.008521303258146],[7652,"fc50bc37a2bc4aadc9da34492137f6af9ed3a39f74ce9b7d32e905cdc8a7e0cd",9.317957166392093],[738,"43963403636e0247b0e9bb20986cdbb75afb7fcb6758dcfbb6d1908f92d7fffa",9.317957166392093],[18095,"8f56229af4c4ba035a1d71809239280c1f7b98e8ee560b3034b4f59580460d3b",15.915194346289752],[7763,"4ab92ba172d14c0c3c122659cf29ac2efa247729933fb3d98b1d9cd5f37e0ecd",9.317957166392093],[931,"ba1b016ca8fea33264284a93568de7485aa80831ed3ab3f839abf12a42e7a0f9",9.317957166392093],[14484,"e6ce5c577f1bfa2d0ef16d58ec538e5486cf309ed0e20cc6cee8ca8e6d318889",9.500303951367782],[10919,"f932da3f12895b092fa9de6960b748cc063862311e37f483438dea6d4d9e91b8",9.917710196779964],[11704,"ece7e293254911f7953170ea4033d9d4c76433db8f2e57e6ca2a77f95b7946b3",9.917710196779964],[1388,"46ec569b4d29c33b9858d48b96ceb04f5f2ec1234766b6e996bfa8d02453d7f6",9.917710196779964],[3071,"bb24ce8337dc5c44c3d39b426cd8832ba6928a4bdcfcdc19fb6a04d4d23cd5eb",9.917710196779964],[19391,"5d22c3f2af6a2e1351c86f800a731441d5baa08131a06daf4fbacaf3e2c62a12",9.317957166392093],[13258,"7a67b17a9f004daefb4656d19737191f528ee51d7ec9dcfd0deb6ebc6c637fa5",9.317957166392093],[14007,"874a8adfa76ff281c9adbefc176aae76bb0e66e04d62beeb516d3c2c86bb9f94",9.647446457990116],[9101,"0e866dc3c3c2525f8cbb25ff4f62ccf6cdfd953ff3e9a53b6ccbe7f8d6812ac4",9.317957166392093],[15694,"643ab7ffc9addcd85cb7257065bc38ed6fb58ba3f0aaf3d23d45d4dfa3719d6f",9.317957166392093],[11590,"792de8a432572fe2922ed1616494e150b08e36f8c2d21b205eaa15d70501f6b3",9.917710196779964],[4768,"f7eeefcaa37fce0ab5cae2e5c5be8ef38c889cc76fa11883afa915a1dcd98ce0",9.917710196779964],[9152,"ac4064dbe4662c6f0a0b9da953f07a477d2621d98755950f41fc25c56172cec3",9.917710196779964],[13959,"9cbba459ae3fc7af7fcb3b562dfcf68e22b3b4403c3832429d79dc0dad9fd395",9.317957166392093],[15973,"d695c723aa66a7f802e8528648b9b20ab146669d0e29c2354dda38c078f04769",9.317957166392093],[6628,"2955dbb8240aee98a263282fcf119e884cdc6a534fafc668110da590fb6576d4",9.317957166392093],[2518,"58d2f93e24db29da303789cc5f5b419c5f22714e9d487de190caeae47f80afef",9.917710196779964],[10421,"40d9b11187e72b356ae0c42bec78ab78e99258547969e6babfa307f3f272acbb",9.917710196779964],[15539,"0f2bd676e3c7e28be3bec817a00218d006c0d34d5bb342551f2bf94f3acf2e73",9.317957166392093],[12554,"877f327900b3ff7060d49cc9ced29e18ddc86cb8ce5c693e86d4dd63f6739cad",9.917710196779964],[17217,"14b03824e915fe3de13f058a56f5bc386b6b4b900c8a6f97b4a737ac76458f4d",9.317957166392093],[2043,"b6b42a9f605273f23a634f10ef444079c307c91f8fdb78a001ee5b3daa48aff2",9.917710196779964],[16412,"b9141cbdb71527cc69b9fc4aa39ea750caa061c55cf60b07a9ef853c7941e85e",9.317957166392093],[1847,"f811b348f98e9b4274789dcdded90f710fae4d8ecab6e415f3e7e9f807a2f0f3",9.917710196779964],[6767,"5847f16bc1f80ceb936374ff726888d1e21631ff40fd4d1bd1078cf2179e7fd3",9.917710196779964],[13973,"f10c7139ebfa1a33b9f3ec1bd83bbca9143081a223e1a806652dbfb995599395",9.317957166392093],[17090,"5faa4b5c0ec009cc39393defcce0e5ceb8d646a39b6ade941f40dcb966601550",9.317957166392093],[19450,"96d7f3667840699f742bd64ec57df116192115a6ee0bbb7a27ee22599c13e50f",9.647446457990116],[9493,"c1ed7435ae44393aa6648dc847e7d4fc888b5cdd8b9f5444a980186bae60b7c1",9.317957166392093],[8040,"69964ead9a68ce378d0a142b0a5d40d56aa67c6a67f3fac970c289eb038d4ecb",9.917710196779964],[1146,"d2e848842d2f7196c35887c2fa1e6e62e28b09c2e92eb2a572340e7b4e6354f8",9.917710196779964],[15291,"f1f622f328670ef66e7bd5ad090d11ed5711a5c38b10887a4220d85a5e2e9b78",9.647446457990116],[17924,"2b4123aef316d052039df7973841857ea6458079e1b13952d0e604afee94bf3e",10.020293122886134],[2889,"31a4bc2eb2098e95620ed814710a5cf16bc4fa932e0575f7148e87cbcb6333ed",9.917710196779964],[6987,"8d3c76d5d1055876cc38e4424821cd5af4ace6aa1adf8be22e5b86729bb116d2",9.917710196779964],[13386,"f46d4c8b9573dd69342398647520df3a58b1a3c307b96e25aa0aaeabb54ab3a2",9.317957166392093],[11558,"70400c577572d7015c088f66276765030a32389529551cb205b1a7b2d2e431b4",10.068649885583524],[5682,"4219eccb1d29a5a4769c568bcb6a7dd333d9ac6d16d97ed472ea5275ef6227db",9.917710196779964],[13492,"b6463e9f6cbbe622e7e165f6335a72a796b37b1898f6738b469526a372f5f49f",9.647446457990116],[10943,"5c5533c5a5f3f16dfa314d9726f241b943acdb98f24a08c380ae995864ad6bb8",9.917710196779964],[8058,"4233b39023cd631bbaea0f9c56dae3e7d13bfa20bcc24ae13a9f093acb7f13cb",9.917710196779964],[3477,"e5150b4b8020e8a57f5af5a487a604061d4dedc6718e93f7938bc5ab24e930e9",9.917710196779964],[11423,"f73510aad1e88680cffb8358ec046fb37d06ba7a5a834b19b2a4ea1c4f122cb5",18.190045248868778],[17617,"bedd4ed4d8e936b893d08a7f331f951a1ddcd0e7f26b35bf1878f21c258ae344",9.317957166392093],[6990,"ab6db36c0b0ba9b5cd7f268574fe8c78b86edb6e864e2a73403a677a562e0cd2",9.917710196779964],[4048,"56a6e433bd675010e253b765ede65cd5dd7d454febed34a42fedb816266773e5",9.917710196779964],[8579,"d960ffdb08e85cc0e9a81ac5494e90be6e66f1fc66339531647385b6f99992c7",9.317957166392093],[1167,"5132fbeaee2ef6511a0a75c52f8849b66af8df571c2f568ca9e332c849652cf8",9.361256544502618],[14292,"37b7217f4b2292681c92200a567715981ad28e1b7514c117cbbd68de21e9df8d",9.317957166392093],[2261,"9f9d452f3f03c837438e7d64cb87412893ec1bcf6b2e53652a656674057631f1",9.917710196779964],[2789,"b6721dbd74ab5da829e3698f3b385eca7e2f1c5133176c7b482e3ffd9486ceed",9.317957166392093],[11381,"7405b5817a2d2631bbff6b629465dd7e90109ea69aeea68fefb3f706866c82b5",9.917710196779964],[14308,"10a026ae0b441aeff0b4c8a3e7dbeef2b5d7265a15b6fc30bf85174c7a05698d",9.33803810868031],[15937,"afcd4212e93d3ac0f6eb7dcf3b82802841303f58377c2ddd2f1c3af1d4004a6a",9.317957166392093],[14034,"f948d36b0a86ff0200fbef0955ee9fddc24c9e176600a82f53ecf825e7ce0094",9.317957166392093],[3184,"3953d1a72fb2da729be1a9dc9485594dfd26cf30e8ffb25c2518f05ee06520eb",9.317957166392093],[8100,"b65e96d933fca1821be07aa805f65bf199124762461ddfc0d4d266eb12a1c5ca",9.917710196779964],[14125,"629a146e4634ac99884f1a16f3da616c93f6b026155a8ae7967c8bcf2df2fe91",9.317957166392093],[14843,"53a155c6df51987c1153594f21f9b51741e7aab6e169c99bfb9b774847f21282",15.9236276849642],[3646,"d57720dd9336aad2a9b82c9a291cbcaca6b70ff5db5d25b0637dd8e786c7f9e7",9.917710196779964],[1743,"fb507e0ac2b4aa09f7d4d81184ade27aac1adf6eb11ea670787318d4f5d8a6f4",9.917710196779964],[15169,"12072c8ebe7b55b78c18f05e3ea9cc23ee4939f3c25786787b60896b644f1f7b",9.317957166392093],[2522,"198ce288e544ed9bbc2a9f65197f927930fbf08ec12b13c24819772fe21caaef",9.917710196779964],[10236,"4a54473fbad8b1a7d8609a0533b407aea7d8eeb2dc80362bb427d71642efc3bc",9.917710196779964],[6797,"62d4721022a31c59c0da9cea7fffed827ef3d3d30ab7c4ec9b64d52daaa649d3",36.1531914893617],[14507,"31fdeccfdbf97b4d90175fecfd7d372cdbb368c6a8d65b6e3c606a483a6df788",15.080789946140037],[15785,"936f53941b3f14ae9adf42a0c00d0c0c760dd5fb1ea7e1d6ea962f432e4b9a6d",9.317957166392093],[13970,"70bf516d375dfb79fa1d75a597c534a964d6f42ef3e28ff9c87560b3e13ca395",9.317957166392093],[2134,"c05c31586834e543a5f62e708d1a3a3ffd610a05071214ffb5dd34918dbb05f2",9.917710196779964],[335,"a131e529412b955d5a7ce2a39e5aa092e97c0b453b939b23bf4ee0666152cbfd",9.317957166392093],[7002,"1545bd319f5971af14f6a051115257302fde70dc043496517eeab3eb7faefad1",9.917710196779964],[4360,"82cc214c1205d9189a356e10a7426c31366a2db6714d3e46150ab5286cad59e3",9.917710196779964],[14884,"d5668aba72480708fe55d5e60382f1b1571906018c619e212c54bd83e9af0d81",9.317957166392093],[13145,"7027e3e00a79a4fef5402fb7bc1d0dccd9a02b9c1c9e5f3ee2d5ed06ae8110a8",9.317957166392093],[1302,"809bacc0fdc911e3ebb5fd5e08ce03886a73957adea90ac967da5d249eed5ff7",9.317957166392093],[3416,"143750417d9da42c3eec7f94abdf9182a5ffd3f3aed75ee9e2a844754f1f8de9",9.317957166392093],[16390,"90ccbbd94234496bbbb08d869f6436ddb6dd1ebfbdf1fc9721e10f465792405f",9.317957166392093],[5562,"701a7dc91617a22e2b27609fba3d4a259bea9d5e4aaea28613fd82c95212d9db",9.317957166392093],[4846,"d243b4f282ac6fdc5577eeb76725678852e6b57f1b4d21179b27fbd8729a29e0",9.917710196779964],[6207,"1899fb5751cf67c53e69381ba08719a0381b23237350889795ed91690711b3d7",9.917710196779964],[17579,"1ead71587a0b4103b27f5e622c771335f066a47d03b513567baccb70e90db545",9.317957166392093],[18060,"f0149d9bd80f0e61d3baae1a8fb4f798a8dd9b324f779c598eadd307eaacfe3b",9.317957166392093],[1901,"b0ba291c83bc3b2b6035b9338bbe35bd89431850c18d10e44ce15e4a30629ef3",9.917710196779964],[18467,"e57d2e95f353a75915172646b2ae5ba7bffc8b551b8984106b0787f343d23f32",10.02710027100271],[1247,"15103f23452014341fb62406208abfb8035c243fa6b28a7918337bf6dd22b4f7",9.917710196779964],[16575,"135ad80029bc31f5d484bda7f0fe9b89194f99665400b1999fdcc52313a8955b",9.317957166392093],[12573,"809b79268e7e7a820031a64709e79107cd38a70b11f9da9aa4b7ea1d8fd96dad",19],[17567,"989405f7fe04ac614ad799c8e9635d49bb8bb1e07a2b4f165ef4d317143ff445",9.317957166392093],[16671,"b7738e80e5b7037bea129a92609d1d7d6986c2d98f0dd4502c190038fe8f4659",9.317957166392093],[4987,"a005f150e19731c3472f97778244d562c761bdb2de41f647c4478bde139643df",9.917710196779964],[3914,"bbc6e4186464ac27f93cb89395e2134d07d133fc3bfb4f674fd5b843384140e6",9.917710196779964],[8728,"a031541ce39510734eb5f813b38d6b986a3a32742e3edae346968b42b81387c6",9.917710196779964],[8620,"121ca4ab422d24f56d6f382dfe6a91745ea59c40ff21d9e24590c0470a974bc7",9.917710196779964],[9210,"a800e6b2ae4d45d50207e1a816ddd846fb4a558da2a430bb031f6ac6b2cc62c3",9.917710196779964],[14985,"e4ab2bba3cd2751f4e2b63d761b8e151a891eff448a98fa3ad145ff2d934d57e",9.91150442477876],[14368,"1188c8bd38f5b95e8016f6744e421f2331b6045e5e294f79684cf5e54153fc8b",10.052724077328646],[5563,"e72e0db623fd9550607d25fa82a444d7638b3e1a3cd349cb942f7d387f7ad8db",9.917710196779964],[8710,"c20f4cf06a7ecd834cb8f7e696c46fcea4e61b8705e151c0a8e5c3c37e31a0c6",9.917710196779964],[14089,"6060a86396e0cd907b8ddf62ac63ffd6fd49c8ce3736289a943b1525e3bed692",9.317957166392093],[16023,"e2be897bd7d30fd8fd6101b15be451ef12e4a0d9946b3d5bf3346fc3a192ff67",9.317957166392093],[11178,"b91152af380e51801505e93f8f0ba3aaf501e11d9096ad2bab7d3334c663d2b6",9.917710196779964],[2062,"12ce8d5e044ab4624a2f3ec1c4ea5f7195cd1cb7148bdb41a3e5616a89e37ef2",9.317957166392093],[5252,"2073867949597435a03f94b18d07d2f10ad14e1894de3c07ef8f6db1b780b2dd",9.917710196779964],[4506,"5d56443efc7d048d51e2d68c7bbbf5ab3f4e5bcbb5c96cc99afd3390ad7b51e2",9.917710196779964],[3669,"a7edd3ad40926b76faa580c6916d2055fe71af18297f006d7688aca1909fd2e7",9.917710196779964],[11550,"2b38fc64d6b77ca53cc21ddd986fce0147f0cd80477bade4d5ec706631323eb4",9.917710196779964],[15288,"2cb885d1e095fb572ae74e57b029c6269f96ceb23fd2fb0906a596c27e52a178",9.317957166392093],[15546,"cfb5a8e36c6f303cb21cc796d49aeaa48f17f405ef81fa7f405bdb45322c1773",9.317957166392093],[3885,"f9d53160e3f169e2945c8a8c77ef3821e2fdc98325fa822321e7e5fc36c274e6",9.917710196779964],[11885,"23c19c6044286a5bac6020646f6a55f007318d9bc80d8ce8b8bc5e8849b61cb2",9.917710196779964],[14582,"eb3aeec180f26f9554e6f23bf7040adf8ddd879b3995a38dc371941fea0a7887",9.668934240362812],[6596,"3be4fa31849307a83f9032171558b533abc4f39292de1dc1f1bcfb6b812fafd4",9.917710196779964],[4371,"7140a273fcb8f3f5314e56e97399bb6e43ad552c533b24b11ebba9e7de7845e3",9.917710196779964],[19466,"a912a2fc160e43e54665bd73ff677c3bb72db4b563c45b962d67a34a716a810f",28.126696832579185],[7822,"a97bf1fe6dd72c3dd05a77a52f4864edf625baef3c64ccb3892c24ed3123a0cc",9.917710196779964],[9499,"7822d80beb67d0d1d8e06afc82d0e0f800354ecebad69b08302d211a4976b1c1",9.317957166392093],[8786,"9287cafb40ce63e8a5d66d557fe947ae2cc1dc59d74b1e0be89663761d3626c6",9.917710196779964],[397,"800d0f6bdbb335ceb586e5399e4e3ea8b10a99d728b8ca9e839d34b00d1f5dfd",9.917710196779964],[9346,"80af52945de2897ddf05aa036dd55e1ab12af86b0a8d1748bbcad6806b739ac2",9.917710196779964],[16101,"44b91b7ce613bad864f239e24f212808dd4aad1761dbbd827aad28236b911f66",27.36322869955157],[12686,"637b0a5e299fd44e06ec4c926baef4295ce7bfb6a7f8d1d080ea6138b0a8a8ac",9.317957166392093],[12824,"410850800213b7bcd8e39266d6de004a74d84d90b46f41080b0105a31aaccdab",9.917710196779964],[14340,"097e3a34ead1539314141439bce3cc7b863721d4c9d5678f7eb9e9a8ccc1898c",9.317957166392093],[17977,"27b96431a17bd34075cd36c82a02b37fb9c5644b5063edb9579d6793efa2943d",9.550515463917526],[10326,"b69e2c3062eae3bac862c8836c04c152a7dfa324eba9655e9703514c72b62ebc",9.317957166392093],[18170,"3934db2dacaa451a62767dc8a28ef1cb107aed523f3ec4573bd45b8ad477f338",38.72],[17687,"1b296b106a5c0e18ee912c3166050f24ee007fedd918651b82710463da2d7243",9.317957166392093],[1664,"025748059ba5e2f95a324afa76d41eceb562d344ce8d58d8a3d7a4969e1e28f5",9.647446457990116],[3290,"185fff2abcf64231a6cb51a23c221024e035721956b7ff8ed1bad1a768517aea",9.317957166392093],[8005,"a5c867ff01801b4582c3054160d2acae63ea3fdf612700624e917d7c61457fcb",9.917710196779964],[193,"49fa7a7e894d4238492655a9aec578d5c593b79a9a919b5c78da6208feffbafe",9.917710196779964],[17852,"d24727c5268da19beba7ad46a75420c762fddb36e0134c140de8a211f1f03140",9.317957166392093],[2170,"bf1fa18f06ebb44fe1e951950fcdd06ff6e8a4d67021a369bc7087bb97cbcbf1",9.917710196779964],[14857,"35b0921afc22b6a9db69b6d9801b93480f43ef39dbb7d526f6e686f4ada2a481",9.317957166392093],[7796,"b1d386e186396197acd57b8a1bca375e9eea2781a00ae01fd4e8da7f6e9bd5cc",9.604268563806135],[13207,"4f5efdaed6e2494fde56ff0cfd8a1e876c1cfef02a804433501d86eda80bc4a6",9.317957166392093],[16210,"f5bd6c4c96a2433d09ce75cddc655a616f7ae255f1a83863d2b15e68b888a363",9.317957166392093],[12164,"22e4dd5b8fbfdcca0ef98b8e568657e4ac5b16708c6e6d1579df3e6a889245b0",9.917710196779964],[5716,"6b379a5d55974f24cb0cee595e0eba6efb34a8517b698bf6946e2aecf894f5da",9.317957166392093],[13935,"49700fd27d43d27030014182fb35bdff6cd284d6161203603a9bb04e95354896",9.317957166392093],[7675,"42b6470a12bce649b3e5cc50bcf06bcfd743dabb5db430c690bd6191cb49c1cd",9.917710196779964],[10762,"d2fd3816ecd3784cb248ac4304406817b9a036330a86bb9baaf5384f8cae94b9",9.917710196779964],[8862,"b3bd199d1286e57fd1b7e6d83d917bc341459f693b8f57c5e872a9d050f3aec5",9.917710196779964],[18914,"bb18d2de9b82dd883708e081415909c00c4b75d8b5a701abe5029a776becfa22",9.317957166392093],[10920,"1a7ef9cc3819557a48a95005c1ee8ce553eaeed16dae364ba98a1c34454d8eb8",9.917710196779964],[4581,"47cfa5015fc3eb46dd2bae87900a2406a3e8b8c449fbb8303576095323e4bde1",9.917710196779964],[6594,"481f4316f12b1edbd45f9568011014c9886290c41a0ba659d520168d91f5b0d4",9.317957166392093],[9326,"d4bcd7468747ea472f9c2961c1a361af5aea4108075545cbe29040059f44bcc2",9.317957166392093],[10569,"8bf216a368193a47f277c7ed5641c0d462b2c3234ca9db5027eeb5436caac7ba",9.917710196779964],[1134,"1d1d455a17180ff7f2319714e3dc3b4c3eef25ef43f89442e8d16b32f01c63f8",9.317957166392093],[18016,"3c8476a12c706ffb218ab11a8c8e6a03153e99325ed48515944a982389dfed3c",49.13349397590361],[10044,"d1fb9e2b77fb6cf46ae382178c040af70ceadad9ba810313dc203077790614be",9.917710196779964],[16655,"80055b225e78b15d462178cd04e5065eb07fc2fe567836d169a1ec7da6e39259",326.0695102685624],[2959,"4858d24f7c9f7401c6c81c83b4686ad516b8afa28e7b9a26c23ad777349a95ec",9.917710196779964],[5583,"840258a25bd052e2b615b4163d5b37084d2c3eae2987c2f88401b7325418b7db",9.917710196779964],[1728,"384490b66f6741126a3b41550b99d67053ebd90f4722415eb32d6b2fb185bff4",9.917710196779964],[14603,"4bb28baf714b93fb782e10442ae22c1112249def284f1c7f6419fa09a9371487",9.317957166392093],[5200,"99cd3df5c5c86c4473ec41c605123fa11ee974458c93691405a3f96cce4afddd",9.917710196779964],[17210,"47d29676efbf9d5e62b7fd9e7f4b57fd4ebdd812273510221362ca1efd489b4d",9.317957166392093],[3909,"59873ee22a7182619e6e0714e8f12a8607daea1afac18a85585c36e6b7dd4ee6",9.917710196779964],[17738,"364e0ba4d0ae8af423496db75d51551722dfd3bae60d218d545571caeb647642",25.356890459363957],[15565,"a1506ed884f24022e00042d021f99c287c1aff297ecfe22bb672ae2520085f72",9.317957166392093],[9607,"a9038c89091e5d121cb7e6742f9b0ec8e7e2dee57da454047dfac2d7a4c101c1",25.68879216539717],[12307,"087c4c12613f7dac25264ac4d1a95cb0006038549d6095a4d80921866c6c2faf",9.917710196779964],[1984,"07484ffec4dd86259147c0d8d1c439b9dd19952275712a4550bb41bf8dec1ff3",9.917710196779964],[5576,"62fc9e7b0965ce3926f5bc2e53264cf2dd645c1f1c2aba68059058b41542c5db",9.917710196779964],[17302,"e3a9148490c9aa8dba15eeb649478770a41e59e628636fa25027a848fddff34b",9.317957166392093],[5533,"0c0275b6e8c6ffbf55aec54efe69732fc1c5bda3942a6ef4d31b85da4e3d05dc",9.917710196779964],[18949,"3a30c87dc1abb48a10ecbf5b3b9db68206250726a245542180bf4b7d2e383022",9.317957166392093],[13161,"84e1b4ccfe64734a7a7190d6a9e2d3816f299e59c72f5fcdf7d74023fd86c8a7",9.317957166392093],[7690,"d95462a21a2a48dda35f0a5ada715995bacd2175c54b167bafbd188663659bcd",9.917710196779964],[6323,"4294f6f59b68fee36903a94ee06805b167a36e7fbdb001aeff18708b8d45d5d6",9.917710196779964],[14266,"91e3959d670e18235196c9b56c8fa08ba817f226381ceaba431f488f9b979b8e",9.533923303834808],[5214,"6a35cc9972b333e6c0a606dcf92730298522eeef4aca5ad8f1646c7d4c51e1dd",9.917710196779964],[3532,"6d26a36451aab5cdba1ab4a60da8b4b5efc677a8873854e7001644d884cbc1e8",9.317957166392093],[16323,"e2e1c838f59f52928fd55a891568f1a636928505f0dea375d040292401379b60",9.71857410881801],[7709,"ca0d5b8a62fe63ad38ed5a3be24164f57cd2a22eecd1bc8bdb9791af13a07ccd",9.917710196779964],[11967,"e18cbf4b309780099122ca7cb21b3828df7a17ce0d1adc0f8ea2d722a53f87b1",9.917710196779964],[11481,"ee35c5cece3c0ad1fb73664fcf2898421ea79c9d3e848ce354d834a03483a4b4",9.917710196779964],[7717,"fe7456dd3970fab97a3e4d8c1f7a4aa7819c9db3eee4352948fde560d97f6acd",9.317957166392093],[18552,"03bd6fc1e38fa715cac0b72b7fd62a4b19372a50368162b7b0d9665e57196b30",9.317957166392093],[13688,"dfbaf5927964b8a09a009cdb751d758b69ff1d232cba2120b307f718d3ca689b",9.317957166392093],[14486,"a24433b1298d1e99a8634b94ce1fccd1320ce4d73dff4318d48f42c14a5e8189",9.353846153846154],[11990,"ac03a7995822727feaeaca5d2eecf3283c2c0af9f92ebdbb3bd7a75dd8ab62b1",9.317957166392093],[15833,"c6c3b99997da3d67597a498e9f691e86e383853c54cb0c1995f201dfd368b06c",26.173719376391983],[16086,"195c78e3d4846b030d9d8db6e514e51efeeddc3df73ead4279186e3444789766",9.905146316851665],[14496,"31667138e046ce82a203d965380172060dd70c63b3a22d3e03c5076717ce5789",9.317957166392093],[9216,"951694213105149652d63ec4ee4e450e18952eb483ef51ce2d2a7f240bcd5dc3",9.917710196779964],[8194,"9fb5b3b302bc4761e5ccd4a7f0e7bb587f6b61754a3698a40bfd522097a102ca",9.917710196779964],[19097,"f1f57e7f741dab7239a77368f53032edf2aa388ce1f842b38b482e36a979e01c",9.317957166392093],[18719,"4c400cf1a3f23c57e90b56afce9ce06f3ef3d7d270a3a4559677de0f51faae29",96.51336898395722],[19086,"70935b30ab729c53a52ec0007e1baceac2f22c31f5adaa034e52f922f068571d",9.317957166392093],[10280,"579dbeaf14c28b3fdd4567e1dd5b44c386448a67fcb35e9497831bfc06b785bc",9.917710196779964],[14104,"99dfa29b51f25c6bbaaeb9e927e284c0ecc570baa75b28e19b6d92f0ac3d8392",9.317957166392093],[18987,"e4a71ad411a69ee0159387b88fe376bb9c4e8a749ae53e39762f1db82bd5fa20",9.317957166392093],[818,"17758b46a23c7c2ae0e0521807e1068c00cb02938bf1669d2bcea33287a16efa",9.917710196779964],[7127,"371583269106ea94d35e2181d197f5ce2307e7ac2bdc5c5bda9e18a88c2223d1",9.917710196779964],[5105,"2e157a53b791f2ddbb55382b1a60815eca342136612bdb7bc62850bcc4558dde",9.917710196779964],[5220,"ee53bf9a0d2b294f688bfc944bf203d0f4d2458955f734b2b7754925dbf3d7dd",9.317957166392093],[7624,"385008d3b30b5ccceef6268472e3c025d1f9eaf80f08c7026adc397629c512ce",9.317957166392093],[11403,"f7c86a8a48db87905d8ea3a14ee2f8f6ec7198a081b4a301f81f27fd07a353b5",9.317957166392093],[4524,"c69c50ba506459005687712cdffe3c9984d3793bd7818719f842b64d6e2031e2",9.917710196779964],[14095,"d677ba1e7697ab9e9677ec934ecf43fda2dc51388fa7e50e3aa35e83cd39a392",9.317957166392093],[12148,"6d116ac78f2d8a31d7932dc36f215832a5d37e1ba8f920a86a8662d7e4d05cb0",9.917710196779964],[19069,"2463d66a15c382aea34618611638b538d43cf141fab828070c827bdf7266dd1d",9.317957166392093],[15412,"989083513b0df140934b07b9af5eeaae60bbef12f6a408aacecc1b29b4ce0376",9.647446457990116],[3095,"1d75a20e106ab89c457c45b4d347f0d2a239d97f2b4b790f785c9219dd6badeb",9.317957166392093],[12943,"e333713cab5d24b3689a3124f0f82681b07958e8ab713cd360a367a31365fbaa",9.917710196779964],[16058,"9df0430734c5d6cc8d818aa8ab1e4aef83455b6cbbc09f621e385f2b0dfe3c67",9.317957166392093],[376,"0f446704f9a40382f7be400208acdc45c2d4471eb829e6897cb8bc9180c584fd",9.917710196779964],[6316,"c6338def55ce90cc2e0d337f8067e1e9cc765516e2f446a66aa9f93170abe5d6",9.917710196779964],[12232,"37105f7f677adb4b13ac187aeea203f7e28690186de77ed7dfa6efb69cc9ccaf",9.917710196779964],[7640,"978a038d91472ad3e4a53def926f0a32cc582160ce97e7ccdacbd4278533f3cd",9.917710196779964],[5858,"fc32ec7aacce34d4bb6f6b51745d015e08e6fdd7196c3a96b9e418f74443ead9",9.917710196779964],[14378,"d9fc1d7c2dc0208d106262c3ac0f289dabce3d9c37a0128d80943a1664f1cb8b",14.061313868613139],[5546,"11ff089514f2c6d4d53d52a1ad4f77137c177188f0cddd095f83be80a74bf6db",9.317957166392093],[6307,"806f417a829e718a964261d27dfe40498c26925f0ead2c6c778f89cde41af9d6",9.917710196779964],[19261,"3596aaf95904314b51669ef35ad2f1a44e30624694ff370a2209bc20c3434316",9.317957166392093],[16965,"69085735a96d16215cdef7e3061d15f416e414d66471f4bf9c3473787557cb52",9.647446457990116],[182,"86ef451a385584fc51b7be0c717de15916b1f422970e726c053d37c494b0cafe",9.917710196779964],[17127,"034a4a110961be4c3f64b53edcab53665d47eb485df3e4a9002d12fbd16a734f",9.317957166392093],[16534,"4a7645c1e4e87ec818729200bd2c252ef0e884782b964ab2dddd3545bf7b695c",9.317957166392093],[19831,"23b073bf833af3c9400192e71b9dd3319bf6f39dfb33fb299ebb5f3e194c7d01",9.317957166392093],[5085,"991ab2a870df4a75dc2c716a445d9643d40d221d6eb17da782d01ee02927a9de",9.917710196779964],[13984,"4e03ca78ed507b576c60c521925f9923da7651b6fe32ef8900106209d99f4595",29.0453125],[4288,"9e77d3585722716c0d656e1edd2bbf071cd175aab3d1d452d28b18de7a89d7e3",9.317957166392093],[10597,"382c8c58e057be7be9c0dcca7d8c75f32fb5f049e765b49f8839816de708a8ba",9.317957166392093],[18184,"26761e9fa9138d15277ff431b1512c2722299938c617f1920216eeb654629138",9.317957166392093],[10897,"71086c30c202606230270e879633ef7fa1bba03f603f972ae22010e4a75bb0b8",9.917710196779964],[16981,"4c5991a83703ab9a89d9b6083096e398ed53797b0345e0afa75ef260e5427c52",9.317957166392093],[12911,"c535d4da13b6ac2c39ba6be77df45532745b108c9152536a348542e56f4d3dab",9.917710196779964],[10078,"a8e8cb955647a15a714474a79cf63920b613ab8dfad485a803b068978ca1d5bd",9.917710196779964],[18891,"077a9b1c342dd54504a9bdba12ab636b463a464db626dbecb32ec1dd2c4fb423",15.772511848341232],[5725,"8e63e6307736b40344d9f38287e21ad52bcaae24393acac9a4d2f0762b73e5da",9.647446457990116],[19035,"2737d0ae48aca61e2e89ef0e9576472338487b28d6fd41ab8b99e9f1cadb671f",9.317957166392093],[10990,"c4fb3a765ec15d408378d9dbaa808206eaed97e0b534ab6ee2d92cce583510b8",18.06896551724138],[10653,"398058ca3f03e37763f94f4c981234a1fcb5ce9321f2b44a58a3272bef095bba",9.917710196779964],[13025,"aafe4c665b9ef6eac16b02b54e1d6f99fa0a0c121974019f131e0f6b186e6daa",9.317957166392093],[16373,"82c50998ebdab2b1ec0e3a0afe0f459cd9c11b354dcd6d77ad0e1492a12b9d5f",9.317957166392093],[15538,"5fbe1da06808ed831b5c4fceb2b98027b44faf4de5ee198efcb281a581762f73",9.317957166392093],[1932,"488b7461f61a786ad2a6a5681005904267c57946c7151db5b66c2b936d1279f3",9.917710196779964],[9328,"c85800413772af7be56169edccf37f7c1245d955e0e7ad7d7a768dabaceeb7c2",9.917710196779964],[4769,"88c397458e90a21e90de30d2cfdee1a4284b1972b5e95207d2a2a3564cbe8ce0",9.917710196779964],[9094,"cd7d594b056a61c85864b925b6fa76274a8c6084f1dcb5d3a64c082d649a32c4",9.917710196779964],[3961,"363f76a83395acdccc5233579683667e431e9070a4d14267d936ab629265f6e5",9.917710196779964],[3944,"97ee1625a092f4f8959b185eafcfa9e9538848ab50068469d1ed85951b5d05e6",9.917710196779964],[16296,"0473ebe87db864f7396388e01c2cec1574731cf2d59b4559aae2f9045fb32f61",9.317957166392093],[2073,"864f8c742f8055ffff7cd304a916cfce95899632256661ccf5e0723369496ef2",9.317957166392093],[13809,"f3a1d908d978822d50a65f6b41d208591938b32cc35236d6505f5a15990d3599",9.317957166392093],[5521,"d4942c8dda67ee6da78395232fa04989ab95f8072591abf68316305f94551fdc",9.917710196779964],[19645,"cdd9c9fe5ba0384fb9f3c8ace444e156cbdfe2f8bdc4db5851ec272f280e2508",14.188948306595366],[2927,"5a6e0052e3ff0810d3e842665d2d7e579a995630419bd8a3d1f4d7be493fddec",9.917710196779964],[12740,"6f3883aceec2e52d31b66bbf5e99bd9cb4574c4663d370a6f88badee706150ac",9.917710196779964],[7453,"e6016cfac1db1f985013b11d23fcf1656f34bbcb316849b2f290cfe1f2cc0ecf",9.917710196779964],[14172,"c29b4d8bc2822433f85fa3c87db0369e83f0ada5c12d6e6d97de1704dc04f390",9.317957166392093],[1103,"6032c9131332a0bad04c9f76d16708d96f88f5cd94a9ac68d1f7849afb1d8ff8",9.917710196779964],[9013,"5a7f2bbc75c2e6811134cea267ef4713175c6127733c894a702f5e9cd246b0c4",9.917710196779964],[8108,"1e3c5cf7e674da31106de275e7966aa0c9e682912f6d4a6dc9b251c11d1cb3ca",9.917710196779964],[2123,"85fee6d2f64b0d624192b10346f62b8ea1353fb99852b601e0db32077a8719f2",9.917710196779964],[12994,"63c4dcd81eab7ffd5e534df07e3b79e159677f503e289c9eee780d760760a3aa",9.917710196779964],[5375,"aa87f75322792e55888ffbe4f77d9d7454c8d4aa8a03a01ac08eb44cf4edfbdc",9.917710196779964],[11036,"24d45e1e7d5afaf354b31a1adde533e7c5371f3c3a0ded717d02267dcc3cd0b7",9.317957166392093],[6608,"8e9e76138d82ab7b15aa41d2da3d21a44e54a4195895b74962bfd724cc6898d4",9.917710196779964],[15173,"fcc19528006920017a43a58719f04e9534b74fc99555750eb5de7e665896077b",9.317957166392093],[9577,"3d4b20d0e044342c4039fe5866017d3a5a56d69e7095ff32bdee6c3b106e25c1",9.917710196779964],[15929,"977fc4fbe3623eeb23b24a9a5dd295b4a8aba63c206d659ae35e5911f7d7886a",9.317957166392093],[1633,"eb6ee413307fd1a2d3199dd74c4ea23d645a83d08be86e3f952727bfe1f767f5",9.317957166392093],[13696,"9d0953534ea612cdac44824568b9105868c2f5f968db620e5fc77ae3be6d539b",9.317957166392093],[15418,"29dd33613f5030472f13c93dbe556dfa4a37af67be1c3f8b427b70406021ee75",9.317957166392093],[3540,"fab354521def62c0ccad8a0bba2701c109bd2e9e85ab261f1530590459eeb1e8",9.917710196779964],[2211,"8ac073249d2dc6b4e848c22fe96055564be082e965c097e43b2a6328f64c72f1",9.917710196779964],[18073,"21d9e46338ae27e6c322a13067c5fac3c3ecf6a705482f08e073b03edbd8a43b",9.317957166392093],[13409,"a38f6c5800a0190cdec179a526c6aebadbfeb4a8d3e93e619cab6f4902ea18a2",10.052724077328646],[322,"c021f9ae4413312e3176e056bfc0fc1221fe1de448e76a11fbce0558839adefd",9.917710196779964],[14389,"f8feb34c9eea7794c1a77ffe0d550c32fd15d2087caac92702656eefb811668b",9.317957166392093],[17196,"740da005a4a0dee6e35843406e79bd81908f99e9d3e71b42eb05ad0e2909d64d",9.647446457990116],[13404,"c2ce926e80619fe3f090689cef0fb39dc02ba9f8347efaf239436d3a3a7d2ea2",10.052724077328646],[18645,"bceda2a0495aa805000c98265a9413ecbfbe726d1678eae235fd95f004c1ec2c",9.317957166392093],[8564,"a6d727ba06f65887f947167ff24b94631e7ff1db6c2790d1bfb936a2ab4aa4c7",9.647446457990116],[19675,"1f8ac752d7dadc8d5f9b7192c5e707e3667f506e2db7b7749e026b5843c87507",20],[11173,"715504bb4a622c1bd0089b91cf3fdcef0c63424d50a807974793e075ab70dbb6",9.317957166392093],[14463,"f99baeeb70c3384197666df44b9a13dc6dad9ce7c096e64609a026672866ff89",9.317957166392093],[17309,"ec4a27cfb5edf20e66917a4b8a065f0897bdb8ed4a47911060dda4eb2cc3c54b",9.317957166392093],[15143,"4fd9c5f62ae467f37d13eac566855ecb81759d7d058d39653d4d09fab97da97b",9.317957166392093],[10159,"e06170bd966d4548fba30d96ad42ba53766449cd16461524fea614cc38575abd",9.917710196779964],[14194,"a2750deb27e1aed65e1678f01cfe606f574429fad0a665fe7b9a7ba105586890",9.317957166392093],[2894,"9055fc4ba17fa773d421ecb95cf6a4b85371316bae928c754cb3c33a6b9a2ced",9.917710196779964],[15883,"db90015400fcd59482a9a7ba611a8536bcb94f8e2f545c59648af0446a01506b",9.317957166392093],[13205,"a720004f24d8984272bbf6ef6346d9f1c38bc43f06e013bc1de207f28196caa6",40.794701986754966],[18,"4e4f184fc044d15476772dceec768b9bce102209285ec941f4fb93f44374e9ff",9.917710196779964],[16863,"beffcc41832301fa9500940abed6a9c56c7741922ce787fe0c882cb14833ff54",9.317957166392093],[4282,"98ff6a0a489f7e1d202034768b7a9713cc0e7bdcc4a495cca19ee05dbea8e5e3",9.317957166392093],[18402,"9b35f35b18ab794f50205b17a1f6648280fc7df23ef129670858701502fb5d33",9.317957166392093],[18767,"7b01e1a415ba7162a7a150304a3f0e26bd7847a8837b0c1e22f48f8b2e991428",26.092307692307692],[1597,"d43886d6e599c6c1805e3738005bdef905f8ba9125df7c85b22e324b310f92f5",9.317957166392093],[3510,"20cf6ce865e6bdf85b7d6ed29b3b2747fec63b63617a24f41dd2a4927cf5eae8",9.317957166392093],[2101,"60048279289226be49712168ead466724265f94d378802bb6cca2ee4d5f039f2",9.317957166392093],[4668,"56096065a42aff02397272495bdc26d5e05773fd43d7f2ef40dd319bba9e32e1",9.317957166392093],[805,"6ba3cf344021ef09ea1dc12388625fac5cdd848832c7f92568fb440e839983fa",9.917710196779964],[9477,"f9c03f29aaaa114209b107b969f31c834e6979750b0505d719a80b753c71d5c1",9.917710196779964],[4090,"8839ec6d5d0499aa24ae91afa2adb9f6623d549b3cb7ab7faf7496a99b5022e5",9.317957166392093],[6779,"18a2999f9d700b8cf847eb8ead0ac5b7de58c379ee4336b61565d7a8a0c167d3",9.917710196779964],[9414,"d1006bee1d7ad1d103866f0c2ff7190b13480be8646621489fe9a0e3e7ea33c2",9.917710196779964],[4352,"dfdae95dea7038cec2bb344adfff45a40ebb45c86d92761772ef3ce0e25f67e3",9.917710196779964],[10387,"e953425a6077036d0e51f474fd2f18150ac000686df7a5d2e306f3b35362e2bb",9.317957166392093],[19548,"6e3f998d3ef25da153d4461b1aad66d42cfa816df0193e8447d913f1d550be0c",37.98086124401914],[13482,"a7045de9101f360556f902fa31977ea2fe5dad0f9c45373545168861affe3fa0",9.317957166392093],[4574,"de35d30886c6740fd3538e63e542c3c4c7e467ad19c2a09c90ae8578b548c9e1",9.917710196779964],[1659,"4f60a7e580e6027ae5b323c1173b80383810cca0dda856440b45c3080cc735f5",9.917710196779964],[4936,"4cbaa858eb342065f239b23b7aad97d9d7a1e707f3bb9a4a41b7ceef51a99bdf",9.317957166392093],[4372,"5b607ff6ccc02104c30451be18803ea060022bef18277b58041293ace78b44e3",9.917710196779964],[14602,"8295db2227b76a8c76ec9e063da2aee32058a9e376ab392bf62edf8352b21587",9.317957166392093],[6890,"6304eb51f549c4e60e3f32771c9798f01c0d24195c679ecfff4558cbd2f5add2",9.917710196779964],[1223,"f0c1324118b20b14600fc5bef0883c0bf819819a1bf76497c696fb303d37dbf7",9.917710196779964],[3387,"b9ca65f37a8597703a1ec25adbdeca5b0b6422c436160471b6281dacd0f4c9e9",9.917710196779964],[8348,"3bb932b757959550c75de695fe70d0417fbaeedca821bd8af5d1746d8ab002c9",9.317957166392093],[5954,"f48b8dd629a683707f5c76cd679d52e2ce098d018979501c7d522590a36363d9",9.317957166392093],[16519,"7745bfc7d9e322728826fc6dc9860832eabbcc6157d1323a8aca8c825987af5c",9.317957166392093],[6522,"d1609de4239730e1d7bb030d12eee514a9424f212ee582b32c9fd54d604344d5",9.917710196779964],[13481,"b0eb1a1fa76edbce2872e0f4461e598ca8169b93f7f4ea079933ce6fdaba43a0",9.317957166392093],[8885,"c7f44067888f7222ac86fe028da3dc068c56f0b5a9598f5ee40f104369e18ac5",9.917710196779964],[15206,"b20f43d240489706e91e04424a8ab954aaf9197113fa8e467e04d022af9b687a",9.317957166392093],[132,"74c499acb8e7199e69ee7e274a2d98319cbd8f63109bb56034bd1373a7a51bff",9.917710196779964],[14031,"c4689ee74bb804a89f1d91541746a858b5dbce53c40528d2951e7f3529a70594",9.317957166392093],[10485,"93633de4ee64e34d0cd26fae0ab0d76e2c39bb17540560fc1805033961793fbb",9.917710196779964],[10605,"4a4195846a1e0e19c4c4b5d4a15f1db0b2c6c5d4ee19eab28c5b08c22bc09dba",31.23954372623574],[11417,"eef8683d3e8f27bf663be87897f00c6f412b319a8e9c19a9b78c8f5ea8833cb5",9.917710196779964],[3759,"e5030379005d731e0a410c95e66dc175a492621553b8d07ec808cf7f014d31e7",9.317957166392093],[9211,"ba9aa8cf41e9777b75fe3029ee2c0d58b87e70e0dcbbaf93804906ccc8a462c3",9.317957166392093],[1950,"689c035c2c508043570838d6ed47fe417c8bdb1d6bacb7306e506ce3383658f3",9.317957166392093],[465,"8b8e0f4ead3933dee87966c3eb2f643476ff741af138e98c05404d7225a3e1fc",9.917710196779964],[7629,"eb47ec5e1522042f238fc7c8a5bc2393d6f080a1fd504369be9427d4645009ce",9.917710196779964],[14610,"3934db6c3f8f1d5437a354e7179bb83c9c69821e2473957aa33c38eaa1e4ea86",9.317957166392093],[17900,"c282be4c7ca3f2aa2c022a1936f36c19841dcf046e9292634048197bd50c2f3f",9.647446457990116],[5980,"21ac036c44bb00bb9e07cededca1842d8f2f7828145548b2b1a8606c4dee34d9",9.317957166392093],[4315,"f9bd993a17344acb1668dda33ca243719d1c5187f8532912feeda66fa2f4a9e3",9.917710196779964],[18509,"4358e634a8175df204b62f9d7e0b56195987ec04f8acfe66e273963007144331",9.317957166392093],[12279,"66e09f0db7c37beca77910350a509b0a2c68d71d25517ed127c3b14622296aaf",9.917710196779964],[19472,"7248136ff45b714c67ac40d6c6169a0a4480c9cc968b579fe3e77d906ab65f0f",9.647446457990116],[14696,"c8d4f82a275427ca97655c77049da9a34e87adc25846a2c21e7500ca93a6ed84",18.05678233438486],[4764,"0466d1b45a20ff5793eea7d53f087d71e0665543db15a25ad1c2000838ac8ee0",9.917710196779964],[12720,"8413935040a1de84f9bd3e6dc1ca0070aa76cb3ee76c945fe1c41294d4b078ac",9.917710196779964],[7231,"fd7ab0ff94a4d37cb45d4f10a4a36034e584fef86a8b88ac7725041978f67cd0",9.917710196779964],[4560,"b645bdce2ab2afe19cd095b1b95095f7a8de4ec52dfb28a2331694956a96e8e1",9.917710196779964],[5341,"08bc0a44a9f60e763022bccc800e7701ef750e3c28b4e701fbc2535d65c030dd",9.917710196779964],[11611,"3c5003b5645fac55c0a54a98f644e1e4d2e064f9b856a407a46d7e86b2afd2b3",9.917710196779964],[17427,"40eb2628508ef7aa3dbb5c2f050e3434be38f50b177648dbe7f91e2395d53349",9.317957166392093],[6784,"beb57945b3c22e6680a5717ff2229825822ff1d52d8e336fda4193e455d863d3",9.917710196779964],[17753,"51446993e781f003063492d6c03dbffeb9a6527b797eb8826e4157d364f32842",9.317957166392093],[5155,"ef14a727e5a97368d880526fea91163379bd1a42d9f9dd08d291874f51f042de",9.917710196779964],[3419,"e0c071446410d7a539617e1175db91f21fcf95a8debcd6e0d0c1ac53aba486e9",9.917710196779964],[16643,"7e7514b4ca86001df477981d7debe505f1b08fa99eedbddcc73ca8715ffeea59",9.317957166392093],[14258,"d3b868225ce0b040a8f9dca833a45c7b7ef291ff148ad10296b931a9f8cdb08e",9.715399610136453],[7230,"b333fd7952662da7e186ed818bd838b90f5f39b609d2f223e0abc7670e197dd0",9.917710196779964],[6461,"80eb4b281292439c1328545e8a514e82a8ae34b2ebf8495e4a64dfb3580ac5d5",9.917710196779964],[3964,"ac9b57ef8a9e53a35e89f52694b3cf2e9da7b486ddbcd11acfbf9b95711af5e5",9.917710196779964],[7883,"ff0827837a94b50b4bb9fe994d1873fbec19992aab442a3e2ef4184d52d962cc",9.917710196779964],[4143,"0135df55a0c1c6ab3ff2dfd7aca76128d7832ec09631fab07b569b599b88c6e4",9.317957166392093],[10415,"f2fe308ce0a8a5d96900253b62241ac824e485b410bdaac22d1891792657b3bb",9.917710196779964],[3248,"1da55559a8b23e95a703c2e88c26f781864c54bb27d2688520113ad34ac4acea",9.917710196779964],[5373,"8107080b41bd0425e94268c1511c81332efe41e568548598a357f743ed4700dd",9.917710196779964],[10518,"a25c5760490a21806ef11395777164df17b777b1b4c5564cf9a8c014897e15bb",9.917710196779964],[10632,"1e893d7142a2b60830c7da8d5e3a20327b3449ce719e338071d4629fe87a7dba",9.317957166392093],[16040,"d08785aa0e42266c8a90c67d2bf52766c334e8d48e12d17e1e57bddf4b019d67",9.647446457990116],[2756,"23fb2b3c88867e9ded5ceb5fcbe0af37b8f960f8366ecf077c1d8d6538900fee",9.917710196779964],[8114,"49f5f0c465bcbe336e3b4fced643c388e5ec86464831c244aad8c2d44d45aaca",9.917710196779964],[16851,"25b80c371fb6027c1c67bd40f5cb8fccd78d1367edc76a587c7e7bfeb9d53f55",9.317957166392093],[9791,"e69cc5c687cee9b9193fdd98ef3dae788cba59ad2bb8d5aa2c3436bb5bc7bdbf",9.917710196779964],[15958,"ee5bdb3a0d0f0e7cf0b007c1623be7e12dafc609c086c3d3c43021255d72c769",9.647446457990116],[17713,"f7c42f03300cf69a815d2bf6da8eab67fa71c0390fc5b98b126a6a1569b7f442",14.89811320754717],[7648,"8103fec84490c71eeaccaa8b971b5ee1782aa2d7b836285318e5950d81fbe8cd",9.917710196779964],[9718,"927da0d2c6237ea63ed08925f75c96779657c9ce986d47858c39ba2036703ac0",9.917710196779964],[6265,"1813805c294ca4acefa3448e2fdbd4325ddfdeaf756d3a7ed9da0b6261084cd7",9.917710196779964],[5297,"dd251cbb7a5607ec62cadb852ccd4972462aa5ca99cf1a0f9991dddbae366edd",10.052724077328646],[17629,"1920fd8d617ce9a7867f1d0d2c47622517607e17f1e2fa2d8c664a2df917a344",9.317957166392093],[13296,"e5dfb5c4be7dd6b89fac82992e96cf0729296679fe3a16a955831e5bc99e98a4",9.317957166392093],[6807,"ec34bc944fb964b46c5064638f4109989e43a615a61125806637447bdf8d39d3",9.917710196779964],[8062,"28cf133ead828e3ef6675932f81cbadba18b0abb04b3854267ef28a6935207cb",9.917710196779964],[11349,"a9ea4b25d47b9519fb8477b100578df445d5ecea290769d320fb964c449cadb5",9.317957166392093],[11934,"5793aba2435b84a0eb16dc7e9decc88de9abc85c013f608282b6b5e4c12bc7b1",9.917710196779964],[19432,"a6542b4c79de6990265f2961d2db4a5135f67927bc13183e1f990c9856e66410",28.124444444444446],[9919,"30f117ede1e8c3686165f5770ae47de38f7529fd25c086f7f0df4ba438e9d9be",9.317957166392093],[8888,"aec38ee3d40545fdf3d894930ce576c5a69087a8d9cbe3cddad25a470c897ec5",9.917710196779964],[9446,"aeefb731ffb1043ab11ef1f60d91cf7286805e0e1837760bb0c3c708d83408c2",9.917710196779964],[15245,"d2c6fb5c2928e4303eea6f52f731ed433c9126e4ecd737c9897911b201c48679",10.052724077328646],[16583,"c25551fcfd2bc7cd88f28337048f6ff5faee7d706712bf840d1709da0f526a5b",19.80952380952381],[7292,"7665bc71585dbac4e8b72d80b573e3daf32ac1285ea3e82e23725fd1634f21d0",9.917710196779964],[1802,"84186f2eff4c305100161e69cd0076249566949e29eb943866532c4e81e03bf4",9.917710196779964],[203,"40eddd3313766251cacad2790413a22c80040fc58c0d2368e04777d485829bfe",9.917710196779964],[4202,"6e19c0b4fdc88558746c916cee013227837059bf77cb69730ce5aee452f766e4",9.317957166392093],[17707,"301c6f2742d0c352b5c7761ef3cb8a46a77c6b6e304ed655b9df398f21d11643",9.317957166392093],[7274,"ed0af613c3af90816b9cf9cee9b598280b5070635568739a20e8c0df257a2ed0",9.917710196779964],[18770,"d9ad9dbccf14381d65a3e1f7951a32494e5e91cc9b988ddded25143e448e0b28",30.557491289198605],[11764,"efddf68124677d5f9f712c65f74e54dfb0b6a5274fdd47ecc23e4cd4f793e8b2",9.917710196779964],[10325,"1de1299e9a5b5091241dfcc9282699a3100cf7caf97c84c73d8ab17608212fbc",9.317957166392093],[14261,"88802ac2a6828c824db94e5c3d5242fdc8fdd7821e232cb6c13ccdc79438ac8e",9.317957166392093],[10320,"8e9c2f9ffe958384efbe5b69592e2e0d7c7e48fd6243c750a4c414a9b50736bc",9.917710196779964],[15692,"bbedd9da4238bb80a56565562aa53b6aff87f0b87ac297c8f8f5491a333aa36f",9.317957166392093],[16558,"bdd5136683cbb97608c45e0a8c668eb829c30ad927ddabdcdd4630dc5662f05b",9.317957166392093],[14734,"4f571224951685550dd6bd4829341f86c1a49a4e8defeada981f3805ee523484",9.317957166392093],[719,"65b676ef22372d9ad96cdf90e3538e76f0840474f97b64b29679a158bfcd14fb",9.917710196779964],[17922,"c69a0423b1db7f6ad33c74b0cf54e0fafa45dcccef537186ff32b41845fbc63e",9.317957166392093],[8779,"f06e1e348a1bd4214753ded1d70189cdc2514422606635ea4336dd12259f30c6",10.052724077328646],[895,"af22cab97c9686f20d2a9d1c8bb0f5d99a3e5e5fc7230695a3e2f29035f7f3f9",9.917710196779964],[17364,"fbf36a2baa839720321e9d830f0dadcbeec84b3478a3a30d6a405b8db1f88b4a",9.647446457990116],[420,"17442fec681ac1d41a993958085535be567440b515d8d17435a3c0e9c43d40fd",9.317957166392093],[8113,"fbea2dac8a59793fc8a4d3818d08c033322bacd67d884013c6bad1bae2a7afca",9.917710196779964],[1191,"c588b42d8768fccaa19a72428f134166a8dda967d4d4f3898e1383d4517f12f8",15.072463768115941],[5660,"1f632242cba7eb4fceed1169a28a8d4573e112f8bf6eb36f6ba3dc9808f743db",9.917710196779964],[5233,"b2a33b75c1093697233fb46ab25d30f7a23b4e6f32507feb53faf7752fbdc7dd",9.917710196779964],[17943,"efbc9a2b80c0675f1f50b69b61e1cfbaf96d786509ad7ccdcfa68e57611d573e",9.317957166392093],[2527,"c5dbc1724973d5594a8b122f66d036783d45e3b2f475060c474b5fa68fa6a2ef",9.917710196779964],[11478,"87ed51a7d3f9f0f0e75224797b5189b755045a558db313757018b069ec40aab4",9.917710196779964],[3393,"179e2be8d65fad4841846a43a4cebbe315aaefb21fcea38b9d62c7f14a86bee9",9.917710196779964],[7463,"541d8c6284ba811fad403dbd2f13af737b846d22edacfbb4fdd273e43250ffce",9.917710196779964],[2766,"56e23ee274d83cd1db0b4ed372d15ea7324c099a72d3979db9bcea075c6cfaed",9.317957166392093],[2126,"84b6e532cb81ee6f606185b609d9f22b049660c360a3b3f2a8bc522330e415f2",9.917710196779964],[14570,"9f1f9970bf9246d9496da2c75e21267843bf677c6213876916cdce7443c9b887",9.317957166392093],[1788,"b7d16ae070953fee8a4a16b214284eaf2f714433e527e908fd13f06a6a6952f4",9.317957166392093],[9039,"73d7feeb010f3b9f92db606d7fadce4538ed482dd0db3d9e0c69c23ad27486c4",9.317957166392093],[14991,"edeab627867af9c1c93b04ab32cbb4cd9273ac702f0bd8d7c643102d9d5eac7e",27.900178253119428],[3271,"3a90bd8cf81dce653675e6e11e1f4432abdef8db98bee9573624c556ff5191ea",9.317957166392093],[17359,"6d2056129de3c96e78be9cb2ddbe1fb509bd206c22c2354a1a307c0b5cb5af4a",10.028818443804035],[11274,"d6f47fa7b73803283a4b853a6b1cdadff2b9ba3776468efd4e4f8d0175b436b6",9.647446457990116],[5613,"6b03c057e3cb1ebcbfa5a2504783e45cf1769e115043eefa1f83530a996c94db",9.317957166392093],[7091,"de48b4f36d0477268dc85251a094826fd765abb75a0aab1ef7fc73beaf7867d1",9.917710196779964],[14191,"2153387dff8e3b804fa2fde08831d8b1f0afaef6ecc698ce79c7320344087890",9.317957166392093],[6503,"33b55878b34bdee063800c6f7faf2c99911f30387ed8399d1608a1c9d8486dd5",9.917710196779964],[4908,"07656c1fc84ead0b5b619c1d12713d3aabac7026b938ecfb2cfd61418b87d0df",9.317957166392093],[7880,"1c5efc4bb09686e99d43e5ad7663e6cff44fc29482cef3c6f22705aa553065cc",9.917710196779964],[13947,"bef187abe2040e61031e243eff108ca1d7a16f71f5ffcb4dc638103dfc850b96",9.317957166392093],[16026,"34982200237da809c158a3d5889cddc156d508117fc331a9f1dd1a7d79c2f667",9.338112305854242],[17761,"3a747dda6b322ded1cd6091aec102af0a001cb667200e99db26ec59f8d5efe41",28],[837,"07cbf1edb5cc483088c658ec706bd07e94f4d37e62197af88fa42e8420284efa",9.917710196779964],[8517,"228fd2232a22d1482c557861ee1f2dee50a192b0fb786d3a8c23d2f53d7cf3c7",9.917710196779964],[15746,"596ae5838b6f0cb644eb6fbc9f39d4a228631cffe2b23e7987da6d4f2181796e",9.317957166392093],[1109,"eeb987199d85c0c2c84657315ab2c060e6dd24ab6ecf1818a1291126ea2584f8",9.917710196779964],[10786,"bbd96416f979d3b9849da8922cda88c6006572ca15dae397c10309d81ca962b9",9.317957166392093],[17172,"36b500299013d74ffb6d9c713283a7cada19560a319160d0e17bbbf2f00b5e4e",9.317957166392093],[19663,"51e935d87d272a46214b67c2288cedd50475679966e3bc57131e6fe86ddab207",9.647446457990116],[19407,"6977a8ae3d9315f86d726eda9aa289bd652295ad7bb7347fd837e34a7c583a11",9.317957166392093],[1455,"8141755f7db89f1f0afd2bfebc36a5ec4fb8edcc7620d22f166796ee08a579f6",9.917710196779964],[1590,"f96aceb659ea8b78674dc8589bba2072f375d09a8fd22bdcd5e77fbf24f798f5",301.3333333333333],[5862,"6df202fe30dff5b91aaea91be0c276d168073741fd634091aa95019a183ce2d9",10.052724077328646],[16340,"832de188d51c53b11a636edbf1dab4319006b11c50d29503ca90bffc388e3d60",9.317957166392093],[4569,"90e928badb4fe47b916e982a2a35ba00c521d6feff6840042ed7fe0f8fb0dce1",9.917710196779964],[4804,"c6f889ff403b79f3775f7284fe394a8a71f2e342d52c397fec5320d2b1d45ce0",9.917710196779964],[9504,"a1f941e4742b87bcefab26cf7a9ca95ef30486cb2c7ba0c9546d8651f430aec1",9.917710196779964],[9350,"31e4f67d45292e38b538ac5a36acee315e30dc016c6a57e56e8c370663e994c2",9.917710196779964],[16925,"a8f9e13d635e20ed42e612d03613d91dab923038897392040dd5dc0f1a2dad53",9.317957166392093],[11019,"d848df098533a3e8d3990793eed1d99b4c835c33b7550b255feb36ec0868e1b7",9.917710196779964],[2402,"8cf346de5661802bd8be4939be835b828191c5eb59a588bd46db8d7fc5fb77f0",9.917710196779964],[16360,"7bdc9ff0e7d98144e9665cc90845c7e18cc57e75d45a24059702c9c3edbfd25f",9.317957166392093],[7800,"a3c17e4f7ac646dd7b3c8ad42f4c5a0628b9a4ce4225ade3a0bebb3ad730cbcc",9.917710196779964],[3942,"2f1256ce5946c78b9da5c6e3a8640026ca0687e7bf4b45706cc0982c64bd07e6",9.317957166392093],[3682,"4cefd3ed7af26105144d999eb910393956462fc699bad1eeaed49b909451b8e7",9.917710196779964],[9713,"7ebce6cc1b012e6469d03da694f6cba8f1fb75a8a4bcbcd997963a5e491d45c0",9.917710196779964],[2820,"365e0882432b45172eb6bf0b60162dea54416abb526645bf466254101b0f8bed",9.917710196779964],[14079,"957bdc44f284f739219ba1b8420a767f607672d1ec59285afb6d070aede60893",9.647446457990116],[49,"912330736b046ccaec1e92d5fdc4716e66c480265533c4e27949cb8e718da9ff",9.997888067581837],[9855,"b99a34a18cd1713242c9fc7106e98a8bae29db7d5bf3fd24b1a86343dfd143bf",9.48061448427213],[7503,"cd531d1275e24b940773537d53f909460e5a8b329da6b4cc704c2005e32fbcce",9.917710196779964],[8471,"2a5f129fe2ab63d2c020abfbf8c339ff19a2c1fac902fd8f1332ba0d36c632c8",9.317957166392093],[17930,"37787b255e0ee6f5f1f86c8c555ca1ab9128377ec89934a85d379192e20aac3e",37.93997599039616],[14671,"e9081faa6a00758b7359ef3a2021e7f62a1421245dce7a3fcc1a4f82cbd36885",9.317957166392093],[14455,"23993c104c105ac63c8e944b006d8dc2c1781eb502d16f5a879faae610ed1d8a",9.497326203208557],[11857,"c1d928d1a2fc66286465e2d578eebeccae15f1f3294aa37027633a61b22754b2",9.917710196779964],[18775,"5c6a222c418cb548d9581f9329b781788959e7326ea0814b76409376a513da27",9.317957166392093],[14774,"63625bda1d980729a30eaba625b8318b4ef76ec3aabc93d04170aba09c8d6a83",9.317957166392093],[8597,"9ce85922380354c0a4ffd34df240783f580bd4ecd1267529abfdc16c6cc375c7",9.917710196779964],[15463,"bbbc52df1338a3a095dfdad1f4da8f9af0fb375294bb085a45e1e06a25e3e774",9.317957166392093],[19485,"9356ce206018cc302787ff7721a205b5ab7fb881737d497ede2993f5a728eb0e",9.317957166392093],[14330,"9dc0a0edbe1fd434c6f6884c13e0961fc9e2ccb139fd87d9394ae043c5dcb88c",19.22994652406417],[15703,"1870785cc3d05a41a2c767f8aaa3184bc46da62437ffc7247c05765a0dab726f",9.647446457990116],[3135,"0d5ac8b19b07a4949b4416d2a4845e154bbeafb3227edb6c252e3bfa6fd373eb",9.917710196779964],[15038,"98a9c60fabf875da0263f9a5c68c29933236f33d17d4ec4ba6839518bb4cb87d",9.317957166392093],[5781,"f17c6e45a512c2317f976fe08521f8618b48efcf7b3e800360d37f77cd8b8eda",9.917710196779964],[4415,"3347071e71cacd472c7fcabdf7a36e365cf9f0f6262699f7e9160546d189f8e2",9.917710196779964],[6722,"b4a37708a4b1fa6a401fae5b068c50f86e2a37d5a6261ee1e015b7ca9c87cdd3",9.317957166392093],[11691,"4cfe75a3f945df38d51fb9c53b094d5317275a1b2a9330da7704a0b0b4f254b3",9.917710196779964],[18324,"32981b43f97814fd30ee35351e641fda394eb1ca8c3271cfb43d06a8e56c6135",9.317957166392093],[2898,"fd91301ef847370b875f501c53c980d851c892d1083e48cdb8211e7f803f24ed",27.933014354066987],[9771,"08e7f8a95c24669965fda365dec0705371833b60618a3fea349078957dd2d6bf",9.917710196779964],[17392,"c36fbca10b6669b48bc97f0e0cd22f701f33d59935bad29b735e5622a6a8ea49",9.317957166392093],[5910,"c784b515cef9d5bce7574c08f258693bf8b0bdf8d8e28438b64eaa0ed9a29cd9",9.917710196779964],[3726,"4947607ba138653fe429177a140591dbddefa66d2845e8b88b6d41efbb1c6be7",9.317957166392093],[18048,"c0f4a791221ba2d5dda26c8d8afc3d53b46dc8398473dcde217190c4070f593c",9.647446457990116],[4289,"7ab0d3a4dad2a1ae0aa91ff4d607cabfa25abcca9129c0bec79ef55e0f87d7e3",9.917710196779964],[18995,"1a7a30be227e08aeb0bb61f2f4e3c8516f68e133fc32b7add8e7fa9053deb320",10.052724077328646],[15168,"78bffac330ebc4c6deff6e8c9caed3925fda77f0680c0510e10e98761b24207b",9.317957166392093],[16835,"24679ce5b1d669161e5721f0712fa8ec2a68deff21febf64935a8ab32c539d55",9.317957166392093],[18992,"e65ed2b2949f8bd1fef89a43bd7ffb26c2fee552d9ea325d603d8a59f458ed20",9.317957166392093],[3666,"aa5d771b4c3c18ae4e1a8b874193f28530a29fb1189635b45e092d9ffad3d5e7",9.917710196779964],[324,"680de37d71779698a6efa81ca96db1c46801f093e25dfe45093adb9a00d9dafd",9.917710196779964],[7264,"13f938761e8c25b2308a07fe858836fead8a31b385a6fe78b0930751b3db3cd0",9.917710196779964],[15175,"c7c587f2c90b49b052a2e58fca0201625bb1a6bc713fc9c435abdd87df71027b",9.317957166392093],[16024,"3558cacbee8a325c75f1d53becc443986be78b265519b9bfdaf96f815c55fb67",9.647446457990116],[14152,"da36406c2435036cb81391032aa10a3114c1b707035b3de370cbf7d56ebf6891",9.647446457990116],[14530,"c2ee56e35c76f7f26b9e53459994f59868cbc05e5e6110a6f62cb59fd2299e88",9.317957166392093],[8367,"eb7c029b4db33baf684c8e9294c40b3e6da9476dedbf8a9f9f9ad311678ddbc8",9.917710196779964],[6879,"84cafceba5e099bc55d229bdc7194a51a8d34de19326cde4ae4b09aff08dbbd2",9.317957166392093],[18758,"c627514a628a4732184bcb8779610cb6913fe0f237df8d9175ae2e5b4e734128",10.042313117066291],[17980,"7696f6d2f115bd299e1080e3cb2ac87e4b42bd509254628acc0179c714a88a3d",26.13612565445026],[11514,"c479887aa365004178d96565d1cbaf1f2fa6c5a94debc4a769a37e68778f6cb4",9.917710196779964],[10278,"02849f5b93388264a27d9214a64b2c487949d03d2b7c370e4206e31d314988bc",9.917710196779964],[16984,"8cebf0df72646f6d3aa3baee15c971f162648b4c322ed7ee4c0ef87df7bd6552",9.317957166392093],[18149,"de55fe892ef44ab3ec4e80d3613185924d2808acd28bbede1d4e9924a7b17439",9.317957166392093],[12490,"5c0e7336dc2ada55b79dcf3d504aa5309644af352bf433a8e8ffc26b81d103ae",9.917710196779964],[5471,"81ceea9b76d45696e2c546773cba2ec7852e1c80d161bbfa24cc30f7ed1462dc",9.647446457990116],[18733,"3047c9af01ae00c964a7bb0bd96959a69198eec191122f6d00735878be944a29",9.317957166392093],[4550,"cc12465fead92976b5f5923fe87c0eefd666cbafcd698fbc6c428de290a7ffe1",9.917710196779964],[5926,"39586dcd3291e41a78d7e0de780ff573c2f72def141a75d4da646e6de78387d9",9.917710196779964],[12193,"b4f071a5aabb2726b83e71074fb3dd22b0d4367b12fc10d407f9eba9895f17b0",9.917710196779964],[5807,"15c61b86e8bcf2e517120bfceff475b82c990b1069bd8eabcc156087bf2258da",9.917710196779964],[6470,"098c60838988d40fe80473291bbc33718ca4c32524c5449803f934f55b04abd5",9.917710196779964],[3845,"390e12d99f1f4282037442a98fec92a764359228a061883aa0fe0d8201b2c4e6",9.917710196779964],[17178,"4db8c81f515ea0f9882dea199cb640510b3ec0979a6ee7c509aafb2caf774b4e",9.317957166392093],[12567,"997148e771a566666d367eb070278b1d2bc291d5774935cea57980b9857582ad",9.317957166392093],[11296,"fb5369a4198f5670e28a3cc5839e58000833be61dde596bc2a39e206100112b6",9.917710196779964],[1411,"c14966ea76429fe75f1a9c8b2d62a80147fd34cb0e4698fc75f9120d9148bff6",27.900591715976333],[9712,"26c99163fe5bd97d850773471f6b593fda5c4e2ce70070f3988775bda15148c0",9.917710196779964],[8679,"319a113252db00ffeab5e0aa0d478a8db283681fa95b491b397484a087a8d4c6",9.917710196779964],[72,"02e0a82fa82be6511790d61995d47c3b37ac154aa016c125a4fdbaffeb0d86ff",9.917710196779964],[5191,"6cc120824ead0e58972cc2a9ac99b7b0113bf9c201015410a19a49492caa09de",9.917710196779964],[9765,"7b4bf3fb66ab2876e7d052b924c4a461f382061d9d9229f79760b1ce91f9e7bf",9.917710196779964],[17823,"2dc063326e38a34904f23815a2937b386ebc8d7dbc23d831a86792ccfb6ecf40",9.317957166392093],[8768,"b0a43cfa39e068b90d3a3b070c2bf8149c0796adb7637b99695b1a134d2d3ec6",9.917710196779964],[18474,"96408bdd88ae70942ba99a46602b117bfe3fd98207ecaf26eb80b6e327aa0832",25.359430604982208],[2236,"7c28745bba384ee04019be7a6ec337ced73c858120d1b3890c0aa30047a150f1",9.917710196779964],[2808,"3eaa8fd294036dc104e559dd4e633dc99e4773e0f30d38e9e5c432b7cce99ded",9.917710196779964],[16759,"062328d825d9a12e1762fd600cbd1f02477eacf97ce57f219972ccc3c0784357",9.628504672897197],[9392,"c648fa8ae855b373540efbd4defadb16eade185784ca47d36ebc8c65bab851c2",9.317957166392093],[2404,"df80c90535c6593471785a7cd1c8e07a1c59207df381343159a43f2ce1cb73f0",9.917710196779964],[15278,"1419aa7cfc4a056a98e8fbd4e54c768830d9ff713f029cc98655451ded6ecb78",9.317957166392093],[11577,"28a8067f2717d2509ee57195a5e92a1392f643ca3fac7828d83414cbb12a05b4",9.917710196779964],[2484,"1e3b06b141570dacc6bebe51cdb24239d5cab48c1996f313a1562f2e48c4f3ef",9.917710196779964],[17004,"f88bffa85f18fcf9b268ff0fca4ca9d3045c8ca1ad99ed37317d45c307b3f151",9.317957166392093],[4450,"7e21db09886b7098677ea4f3322b46b518f047500993d16bae5f1170dde3bce2",9.317957166392093],[18265,"d289d4ae4cb252229d4377dd7160c23ed86c8fbc75c168fdc52deb019d30a336",9.317957166392093],[15940,"3a7cecac0577cba8d88a4eb51b99a2cdfe7f3461d37d3ec370d8f1e606c7296a",9.317957166392093],[11086,"cfe8f661ff4ce6d09a97f8dd876715aed3a3596d3b064a0d256a6bbe395356b7",9.647446457990116],[14607,"d820c1f3eef0e144615c8f2df152c669caa6884b2e3f797ca05d22592e83f586",9.317957166392093],[8353,"73c8a8778a6029472f07a415f483722c5af1d55609e729ac01ac5d2c176ff7c8",9.917710196779964],[18225,"880615396a746e01e9e5692f954f92a8fc33bc390edb883bf97f206208e37437",9.317957166392093],[13946,"69198c79db0972f046e3c9073f5114ef3f6b5905e90e0fcdf55a4b32653e2196",10.052724077328646],[5592,"a2fd35885e5b8b8fede92c3842ba588ff525cd27cc086735dff35f66ff98abdb",9.917710196779964],[13295,"5ec0e96e0eb7dff8ef41b39554d00f98c695eeddc96aed86b6914d9f53c39aa4",9.647446457990116],[10826,"e08f8369e0f0b80aefecf9164de92e4b89eedf737ec1353ee75a56af84a122b9",9.317957166392093],[15834,"1a166cd428a12f690904449af09c72d2c9a8090d30ba0149df4033f3b018aa6c",9.317957166392093],[15904,"c878d2afef59ed89e1041b445ae88692a8676faac1d4bae71ef8e613a38bf96a",9.317957166392093],[9939,"65106c3fd506753cca252ed49b967efb8e546d7b5113846a2b1ddc66831ab5be",9.917710196779964],[10129,"84edb5aa34d11e83a2bdd8344c163744f15d395ad51dbe54db6befae4dd87fbd",9.647446457990116],[17405,"511d111c9cbce346427312c7a2d8f8376012d8708573f7dc469638faa3d3b149",9.317957166392093],[13370,"5df197b2540df4d17ee3411fe824ec8d9e2d1aac3fa4b92ac624266c34c515a3",9.317957166392093],[7034,"27e0d9a7993f18ab249cfed6b253d16276d8b5411bfe3f92e8d697ad7bc8c8d1",9.917710196779964],[380,"2abb5067b0adef3ec3e83b47d3988908e1be76c60302e55651a64c0839a77cfd",9.917710196779964],[15071,"f529f7df828dde8d7021a78f7e0e660dc864ed46b5f449b3267e23fb67c82d7d",9.317957166392093],[5459,"6f7921122aa8d8fb1dc454a86b52f47775f02065906dd7116c6969bc384470dc",9.317957166392093],[10718,"868d2683b8c88c853a09e608a3eb8358c358ef19bd11fa16145f0ff526cce4b9",9.917710196779964],[8316,"4149fc8702f14d666898989805e93abbb702e16726b0aab972690b3ef02939c9",9.917710196779964],[9564,"7f28e100e3bcac216177a082e1e1ed81a1d6895fc81c18b5ec3294dac4dd35c1",9.317957166392093],[910,"f4943364c0db8345a33c6be8b6e7ab8c94be43ce2325a000f6c271b7abd6bff9",9.917710196779964],[11420,"5bfe79b87f0f1b069f7410a84cb2d38e3d0782b395f1be033fdd9d2bf64439b5",9.917710196779964],[5256,"16744edba190ee8d082f1cd4370bb0a59b1aadc53073adb06e48ae6c2d8da9dd",9.917710196779964],[13261,"1421467821272c28e4075729a11efd97a6bf27aed7b58d1abb3b1425d51b7aa5",9.317957166392093],[13073,"06eadc99216e72b5a23f9ed2a57d38f08b36af13e5e0bb7833c5d7e4c03b23aa",9.917710196779964],[4911,"5bb41868fdc4e9f20db705c602db2c74729eb90fe2ece08bd028b46280f7cadf",9.317957166392093],[13542,"3e39be3f93bf18ccd65602b621c3059d97da8a9c8d5c4dfb74d4c307ef69e99e",9.7265625],[228,"291ba81f8866ab564069c5643d9f14dcd4e9d56e65c839d6d77e4cc86cd473fe",9.317957166392093],[207,"28a0827052eb2fea6ddc1ceda15295c2026659456a66d18462d94c8c463291fe",9.917710196779964],[15131,"c8239f98438db321e7e2abdea82547586afec44d1e7d18ed4637209d30da157c",9.317957166392093],[13169,"1383d93f871710ce1abd14b7ae8849c282c2b0216b56dd94f6f74fedf6b4a1a7",9.685534591194969],[13929,"467dafd755addd29a8e35a4eb51b6845f7d8e519e867d41dec9fc5c588b75c96",10.052724077328646],[707,"b1c365a3436a789070acac5c98b52f8f31c98a7501cd42223ab195c178e12dfb",9.917710196779964],[7772,"1bb7114ece5dcdc3e4c632bb6a080e3fc961bc791845d6a0368776f7fc51fecc",9.917710196779964],[13863,"27f7ffd770f25f941c6cc3a2f5a7c388eafc8994e49de33549a0cdbf9a7e1a98",9.317957166392093],[5978,"9e687ca0e9a6ec076fcdb49845b9e06c07bdb503cea84df33c232f06008939d9",9.917710196779964],[8084,"1ac0fb66c9fb0ca76ee96066765ff7c43940c07e97c4e60bfc84b57744a5e3ca",9.917710196779964],[9824,"3b5809479c9df23f46c2f509e88a14c4c02c0324e0b2942b3fb88309a4167ebf",9.917710196779964],[1352,"91b1c1f33dfb54a730d4cbb768044006aed6fa96b26f88f039d31736df1e0af7",17.969811320754715],[17388,"21be26b569553a42c1e4852a4b6194d300d057d47c5399a679ff0fc8f3fefd49",9.317957166392093],[11813,"c58db4d54c5c56c1127c3899d516a66d91b6f052dd92531d476ccdc6ddc7a0b2",9.317957166392093],[3959,"6d764dde7c37acaf7c702ad2b2ebf2106023e1303d51e9315f14ad690359f7e5",9.917710196779964],[7420,"943da923915a2f6931347d6bffe205542818de5c108b2818ea1d94c38f7044cf",9.317957166392093],[10033,"49d5945570e30fc172ac94b7a65363b6c672772e095fdf65dcf31466c4921ebe",9.917710196779964],[12565,"5e721421c749a6051adff79b0026ab488bfc9463a706d19896cb286b3fea84ad",9.917710196779964],[18371,"1aa0348934c2311d4f9c058a526e7dfbf19fd565d719c282e4d59fe8b0204534",9.317957166392093],[3022,"8a3701ce51c053ef252f5febe1d697035a0f46088a9b5e21a6fb1a19857320ec",9.917710196779964],[14550,"cbd434bf233c7654bbef077a8ebcbdd8cec82385389d1090f1318dd349191f88",9.317957166392093],[6621,"d6e52595ca5ae2748f336e22c1919d52dd5a2c56b316da7b045f09e722dc81d4",9.317957166392093],[6778,"7ba869e5de6ca894bf8eb09b70fc3bac14540c32e053adc8e23656d0702f69d3",9.917710196779964],[5181,"df5abcf63577ec0fe27f1d7d2b5ce40d079239731adf9663086885b5977a15de",9.917710196779964],[19568,"5f6bead29c1e618057d6d521a369fc8ae6ede73c8b6a013536f653475e6de80b",28.066825775656323],[2837,"e9d82836eb40272d8cd61e1f163464b268a94e19dbc9958922bb58718e4b6ded",9.317957166392093],[2376,"4d271f4edb13c497ba12370e55454ec2d55fd980f9dbf9e8262fdbabae9f9ef0",10.052724077328646],[8383,"145dbd6efc7e360d8e74d7c8a310a3e9702b310e44ac20a76b6921f47655bbc8",9.917710196779964],[16056,"ad04e6c93234b78ccff2a5df9c2c38e8b4213ddc438fcf9a5d21476917194767",9.317957166392093],[17762,"093d96bcbea7c7a0dd4ff433a14f8f675f4bfa6a60fb65d1b247b4d56f7ef741",9.317957166392093],[6156,"12d9900109ba15d14f8844229364c5716beddc626bde13926bfeee7b0f9919d8",9.917710196779964],[653,"2cabd98fc603ca955242294cce8d7d265d74b2e2753abc2410dacc5bfaee8dfb",9.647446457990116],[9650,"f48c948cf1f6d174b0389c7b694b6ee7ea2bc80670c5926a85543c7d6dccb4c0",9.917710196779964],[10780,"77dbe6dad6896fdf5467b0356d331eb2735fa8b550b35a9e4c0d1ceae0d86cb9",9.917710196779964],[11001,"6b28b9a232940d6b09cbc8294e3557f98b15ab7ce11d256eb3132eab2784f8b7",9.317957166392093],[6107,"c5893065c0afcb256d6a48fff2ca585d6e4f0ee2dcf66705a1bacf8555f364d8",9.917710196779964],[18489,"6441fd83f19137361f49125d765aa18af5c28d1970b2e7ea8f874cff73589b31",9.317957166392093],[8457,"8711f67817e465a6a3c5fab9dc8fc06cf7e0201ee197b3188f5a93107e194ac8",9.917710196779964],[3785,"779c6b1d795d3cfabad223d04660b3860bfea93fe94e1d4362ccdc379b450ae7",9.917710196779964],[8019,"f8cb8e9ea179e7d0a381b8b84cd06f9935b043839a70201702a028229aa66ecb",9.917710196779964],[7222,"823a57c61ecbf183b4c932a0b1634126bb08d3432c6e76add1a724a745b982d0",9.917710196779964],[1694,"83f3dd4aee156fb0f70f7a8c0dbf3f6d0d367bb9c53b1a6cf52bc0fca3f2f6f4",9.917710196779964],[13936,"6a0b89dbe4c14fb9e813c19087944981d43f5406e89490338b35b80a28da3996",9.317957166392093],[18408,"4bfc302498a479238e0b721615ba3866cd85f510b601a17a43be3a9f585b4733",9.317957166392093],[14903,"1a3a18cce70484f84060544ec1f5b94a7268eeed63bb1d7b151154320cbed580",9.317957166392093],[6709,"e4855c521419ebda143cba2ce0a1c549ba53d96b05b068fd80aa1aca8b4ae2d3",9.917710196779964],[15593,"056de12d12bf0929e3c598457804fa4c5c1ed0b3ec9a116aafcf3e72f2c87c71",9.317957166392093],[3643,"9eff4cd7e55d4c383d3ee66ea64a2c9068087306bd25536d72c82c6e3da8fee7",9.917710196779964],[3211,"7d62c7e2ac9da6a5b1cf255f3c20540e5ca29bd82f2de39fe0638335cfa9f8ea",9.917710196779964],[12288,"48d3510969500002a4c79815b3873acaf82be4f82dd3dd7fe0b0da31fab356af",9.917710196779964],[367,"26ad5b0ab49a7cd80778a10d2162ac7693e20c4225e0c5419192346ed3f0a1fd",9.917710196779964],[1655,"644bc316bfb5b28563ac1fc30eb290d28992c6361f52eee288c84c5223203af5",9.917710196779964],[13014,"615a06340792f62f797c56a6f1efc722326d52e8e534c45834a0a16e43fc7caa",9.317957166392093],[8660,"4fb491de42f68f87971d181a152c190c668537ba3658119e304c905ef621f5c6",9.917710196779964],[8634,"2fb0be327e75cf190eab97ce98e029b4a2c9f604d6f2c93fcef9e3e4c4dd33c7",9.917710196779964],[12071,"1636ae52846b9e31aad975ac34426f6980007316d4ce9b6cbd00682b07d7e1b0",9.917710196779964],[11406,"0edb17297fce3fc6c7e1ced0e40b4e32b432eac33c0821ef8067d5078e404fb5",9.317957166392093],[19327,"2e2cb39d6688b28c0c71280c26d37b018e92433fd5cee4c27eca7e2d28532b14",9.397642257991386],[4221,"ddb28c818f60641c5482e2261b7bc264971c109ea51266dce50f78f1f0af54e4",9.917710196779964],[14716,"2766a36c47c58220bcc44ecd864603ba84c7af50225b29edcdc6264203469584",9.317957166392093],[8047,"07ef59ee00e3fd43987b93e542e7f884d63a161e9c0ef7a27b256c3d8d4038cb",9.917710196779964],[836,"150a011d116fd2876c593038df6d542e9c2879bf828ea76a5a15b6675c724efa",47.673185571490656],[7960,"7ae280fccb791e0fddef150262d38e7d3b35a99d3fceb5b0020331f6506dd9cb",9.917710196779964],[17936,"c8db7544260436d439d327f431170a2c7657682ec82bdccfe319e124e706913e",9.317957166392093],[18971,"d63cfa51eb7afb372c780c78be4d30178d38cbf2b7432e882b4111875b0e8521",15.915194346289752],[13363,"29a10d6c7ecb169599d96d9b74f1727f8aeb9d8b52fb2d2a685fe0b1509d40a3",9.317957166392093],[5537,"de54f9a1895e45e2ad467b1c565f39d8f336f645b7441a78f9ed67bcbdd3fddb",9.917710196779964],[2775,"4bae2eaebde2cd744c8e96681f1bc6c768c232e4043806dd11ff05a00272f3ed",9.917710196779964],[1588,"ff6b28aed4097d849f23a89c62902578c837c84e05c7ff7e5afc80cf71759af5",9.917710196779964],[12656,"e7cbcbeb270beb4e0b69af4ffba98ca88999cfe6bdce64e413511eb75775e9ac",9.917710196779964],[8899,"e14380048036ea14691c259d9ccf99bf0080643b58c2e239da72f4426fa474c5",9.917710196779964],[7688,"2b27e3414488c6f86a6a2250c8f7d7e90f4ed7c92cb646fa45c2b66368dea0cd",9.917710196779964],[774,"d5127a25a84993016defa2de921d55904d51886fdb8ed4ef0ef03dbbcad8b7fa",9.917710196779964],[4219,"d31507e643304a9a4be7b592626bcd4ba12dc8dbf104cc5fb10a9791bdae56e4",9.917710196779964],[14316,"f15ef2723d1e4e474c94e0ae8778633e1775ca0da24f8efca404552f351a3f8d",9.317957166392093],[12531,"001df066ca02df3829e51303c6ca720bba5e826a94c80271212f5a05b90cb8ad",9.917710196779964],[13388,"73765ba242a0e7f6f3bde4dbd580b26b680f31d5069a712608120febc6e3a4a2",9.317957166392093],[9474,"5b8c0aa22dd9ab19f06f45d9cc5eb9128cdfd01f971925c0730fb99dea97ddc1",9.917710196779964],[16980,"d0dbd5622a6f793fa16ca893547e7f7c29dc0b2ad37314b65a2d014d93987e52",9.997888067581837],[14619,"a9594208807526860bbe1dada0f9f1f54144c473121d6fde3155a08cf833a686",9.317957166392093],[7874,"fce0ab3c095b8ef753b7d36f2190adaae73ea66acd85c86e4d31fd58dd856dcc",9.917710196779964],[15275,"e07574f025d0f16bcceeeb1772c2dd81d21aaa38ccdbfec8ee43f47fa5e1d878",9.317957166392093],[8244,"485730b181ffb1878ed03a485459ee495308799d16f502862f72f07c4ea7abc9",9.917710196779964],[9037,"d68d45484e6f21f48d3ceaf921e64b6d9ad416a9a48f741b4a65463170a48dc4",9.917710196779964],[12223,"e6b01e67442fabcef049f909de40d10da3cfbcf06f1d50f0a2990db01d19e9af",9.917710196779964],[8033,"96c68cd9692884eb91953f775ae868a89b8c5fa836638c06904292d61d3f5bcb",10.014251781472684],[7366,"bbff12cc61aa01c09759bce1d9821b01be7e23d601f82d87cf111c476e749dcf",9.317957166392093],[13945,"d77b9ac564a664fa53d4bcf951d822b6c342b77531230e46e3d3da8001ef2296",27.148342059336823],[17125,"cffca9fecef288d5d6de29603f4cd00ed76976c5e02290ca46f55a22c6d3754f",9.317957166392093],[16034,"6da8998d6be3a56e5decdfcff7f56a4adc4bacd45f3bbae4872d9454dba2b767",9.317957166392093],[10116,"13438a466785bf6be99a15295b013c4ce16068be505773f2794eb37ca0fd96bd",9.917710196779964],[13465,"8ea6ad97776f21a177cbbb9d8c97b984294fd5dd3f2ff389458a8b48cc7dc4a0",9.317957166392093],[14278,"888c33f810c5aa4b50252142f8208e64cc61f99bd978d1699bc0ea207d614a8e",9.317957166392093],[18480,"6c2ff53c293818db5b5c03edf3b97c5f681e0f5e7cc1e2cf62f8196a7d2cf231",9.317957166392093],[8677,"a2a78d6c2410f43520c051ca29c40665017ccd7897bb3caa8a077310b120d5c6",9.917710196779964],[2657,"a3e05cb08cca17bc190d0f03c51c1b3b7d817d08085f5fed00417559e2d2d0ee",9.917710196779964],[2960,"e8e19e5b81615881e8025ae66782416a8aa996a8a3103509c51551f40d1494ec",9.317957166392093],[3882,"a94b6800788ce7378b45a36746c87baac40151a5467976b6c0d77d02c6987de6",9.917710196779964],[7314,"50f79f9debc131081db847ff3ac2ab53b5544b40e0b192d37f3ef21afca0fbcf",9.917710196779964],[2431,"e3f53e0d7fe6568171ce333b4a748fcdedf9ce27f625a73611aa98b1f3c241f0",9.647446457990116],[13675,"309d19fd0426fa1ef31aa8e54d65d7bc86e3601ec7a96d37a95efadafa65c59b",9.317957166392093],[17065,"2e339a68df3e85153bd435c7b054353aa2326cbb799e0fdc269891ecaa28ca50",9.317957166392093],[15483,"f92c18bdedabe2c0db6f555665ca86651bc030d52b03954d88e13af6c9e97f74",55.24444444444445],[19057,"dad4145cd7ed65a8c95ae5c091f9a977519c2c8c2b23c76084e5197113388b1e",9.317957166392093],[1374,"f54f885392815c5736f96a70a4b0e883480b4370c0cb24ee5ec52b0f1164e9f6",9.917710196779964],[365,"3f3c110a0d114dfe9d69928bcf7005fb158653c53f738ea28fec9c8aa934a5fd",14],[4821,"e190f29de21a0af0988549f12e0e5b58d48802c69138f1faf3b74fbb2c744de0",9.917710196779964],[15721,"4834d728fa7ed5e6b2ac0248a76a1ebe1f0d09e18603b55b488de8b59c140b6f",9.317957166392093],[16716,"b78e35ba1fba1d561831ef8a77246fef23474a88c6d4b33801d8038f56a03658",9.317957166392093],[15637,"cee466e8f13f11053a8cc60d57d2ba9b8e8bdf0ef988a73f259b177a4af4a870",39.13879003558719],[5079,"a55b58032ddd4e69eab6824ddec7dd551c2fc7802f97a5c2c6a124712a27afde",9.917710196779964],[7964,"c07688bafccc39c75b78ad74aabfcb31df158024aa77de2127db6ddb1947d1cb",9.317957166392093],[16044,"84e3e3c63028bcb16f1eccf63c70cde134c709a40a07993290df67e8e6d58167",9.317957166392093],[11672,"d7d72b4838278443d694eb48d57936a8e0b4356bc8e89013b5b18628386e76b3",28.766146993318486],[33,"469e375685b2c7e1811b17e5e1ea978db8cf975cfb2843260bffe67147bad4ff",9.917710196779964],[57,"5332d619224984d7aa9a88bd182b0d2e682668430662c10ea97462a9db3197ff",9.917710196779964],[148,"2d6ebafcb9eb376cad663ef4bd6b0efa33d69387a08bc475c63e0cf4ac36fcfe",9.317957166392093],[13000,"091ce1d4e2312cbc8cbf1853584c237d73a012cf058604e021008ca1d79c97aa",35.92760180995475],[10068,"92468174e11db5a997684dfcbc91130c5e6d3d626b970e8e5704eda15d60f4bd",9.917710196779964],[17812,"0cd89d2659d2d6ca842b4000900c59a08d0d4b2f89fe1aefea604736e7c40941",18.130434782608695],[9024,"d2a50d8369cc94933202d4109e9158656fa7b267c0d99e0e285d9a149a42a0c4",9.317957166392093],[3803,"6772710378a9210ae6fbcd255201bff094e193c963b70a1b5e671b2f5a2af2e6",9.917710196779964],[10835,"ab794e6c0b0aedf0ba13eecd181ade5da4e728f741923eb0ff2479cd27dd15b9",24.285204991087344],[6022,"08364c5edb2300a71f9bc5d1129a88ecab9f666f1bbfc1aec5839cffb56ff0d8",9.917710196779964],[3162,"60b93b940de8008200da1ba0b7eb51a491d01e4f5deea24ab94d70b437c64eeb",9.317957166392093],[3834,"22c12a954323340546dd299b0f48d41f093f2c511102ac72977a6949c28acee6",9.917710196779964],[17555,"4045120d0ab1e66bd2804cc2ca4a0c6200855f5896ecc226a8b5c9f3ccec6146",9.317957166392093],[8741,"9d2c1b4f365dbfaffdf4629227e6546e27e1d3b2efb9cda63962881e221c73c6",9.917710196779964],[19360,"67761e10edaf4e8871dbab0853d0deeca82064489a28cf1524c24582fca54f13",9.317957166392093],[12190,"399bad50402d9ed9e3b4c2c2374e9e851a0821b7d5b6740ed80b1c00be8522b0",9.917710196779964],[725,"5a10ec5b90d283e50c01b9cb9ef0557de61b2115a9b0571b5f130603df820afb",9.917710196779964],[10719,"2dedce75bf3b240d2e9799d5110efe72a87826bdc6810a51aab62106453ee0b9",9.917710196779964],[8492,"3edd528fcb1aa049985e2b7ca2dd07bf837509e9563a8a51bd2dedd1b29110c8",9.917710196779964],[10646,"666f2b67350965862b2180564b67910ff5879362214ae4efd2b58589436e65ba",9.411764705882353],[19648,"08d8bae69624aac9bc5312cbaa65100626b3fd77fdd61925fbd78f4dda111e08",9.317957166392093],[4030,"707498e56f5a58e116561d9bcd171aa905d596ec17b6e72ce0dfaaac4cc28de5",9.917710196779964],[11809,"03901edeacd101435b6983c1be37ea0e744b28755a89cc51ff8fb19c5e27a9b2",9.917710196779964],[8107,"bb1767229fe5d587b95c7a1d7d57b119f701e639ec91d6285b8997f0b4cfb7ca",14.92526690391459],[19130,"894c302fefc169ef8d3642b6cd63f5ae154a81fe4ca1a09c271e93a72792261b",10.052724077328646],[16144,"3c3a53300aaef4906d75754dd9996b56c7b2f78e484f1e6212b20f5239b61e65",9.317957166392093],[19738,"7fe450bf83214fed66608f23b5aa875c9a7ff796c8b3d453f442416d5ccc6d05",9.317957166392093],[3788,"16fa30245c77fe8006de7f8ccf6b396d384e8aa7f1614ab22471c8cadfaf06e7",9.917710196779964],[17790,"ed9840ea6901a71f38a940a13525133ca2a9b9540f739ca76369ff54453b8841",9.317957166392093],[12736,"e8ad0a58a307d1cd29d021c16d3893f7f5c77bcad39db69e8cd64b4daa4458ac",10.052724077328646],[12761,"313cc8c885e878f68c37b95f15cbb302ffa87d6a1db20736b53a679aae1828ac",9.333333333333334],[7066,"9160001e31646962c22068f035a674a29f174425480798a5644ea58445bf8dd1",9.917710196779964],[4539,"dea8865b52e0b4f65c077dbc93c746a43df9b7d5e72d10e929b80e33edb319e2",9.917710196779964],[18185,"9853986f3c3d1af7404249fa0af14d5dff5d242b01faafcfe102b40e99429138",9.317957166392093],[5173,"6520bdd59e2e60b3a874a0449883c6c2c20595b703231992a0582e6356f823de",14.15929203539823],[13399,"b7898ebce3d9cf34deb1859aeb6b8202bb488d8a40e308489eb191e4d3674da2",15.160839160839162],[12607,"b6e812fb734298a0f75583805395ce9081d510a72c65c41cd6c7705757a737ad",9.917710196779964],[18178,"b6fa9f36b1fe4e94795eb35e9b19497700beeca757741976b6ea1e07003ac338",9.317957166392093],[14955,"6d93f5339d3f793f03cc557992a4b0e94884371d9e20e2feef29f5f2b9f09b7f",10.052724077328646],[5776,"afa68eacbbae474d9538fbfddc0ba7339a3c3330c212a3c14e963f7cfe7097da",9.917710196779964],[6272,"1419c62d85e2be76d0ccfd1a27f27e8071528169b07d2097a93debfd686b45d7",9.917710196779964],[14479,"b56cec42c82bbe0b3fd4842859517dbc31abb3d36efebec7db3902589374a689",9.317957166392093],[3639,"2c272abbd80a37d5b1834f6b40c43e6d98d5b99de90a47fbea9d6f153cd202e8",9.317957166392093],[16246,"9e63274fb2cd9f672dc2cda47163d3c8a3c3c5a6f5a23f1e92f06bddc5608962",9.317957166392093],[217,"b63251fd4a5e8a69c900545149ec5004eb53c3b38b199ae78fb91ce41bf084fe",9.917710196779964],[7427,"655079f2ef243a9fa8e6fb31f7aa34ec85c2435eb0c74ded9a84f508e81036cf",9.917710196779964],[787,"39b113981a88fa7bc0b7adfdba429054520f63c3e66559235665a222e83c98fa",9.917710196779964],[10439,"1c8f7523241f3562bf576d951a39612ba3b9e9f7170ad9a70a4d2f9180eb82bb",9.917710196779964],[13055,"48b0f0e61de3c496433c42f35dcc811164b7a4f99ab7121fbcd4e8c6b31c40aa",9.917710196779964],[4199,"14238a272098c18c83dff610b1becb98096ba55c6f326a6b49da920429846ce4",9.917710196779964],[18978,"8fe93c41c81ab63a15f550e54f377059617fa702b7e56e19fc105f2895ba4d21",9.317957166392093],[4256,"1ddd236188312e1f680bd133ff9c22251cd12c315dca3fb36cee0eca591918e4",9.917710196779964],[17440,"2c317558c48d0bf3b1d5d866e93260229eb1c9c74f3517c7dacdf3378a94e648",9.317957166392093],[2950,"217077f1942a9e5fd4921eedb81e5eacb8576dd11648fc4266331555a0a2a9ec",9.917710196779964],[12048,"9d580aa4e35138ad2b1da945689ae15bc111f155a3af0210afb1354c032fffb0",9.917710196779964],[14593,"3ec62e15da7f17a33981e3ca5af07349f743a0be0d3a3a396fa49810eeef3e87",26.138053097345132],[15550,"7e066ad62a1c1c548606b322959522a586e11e9a47afe659102d230066eace72",9.317957166392093],[7269,"24b3e00d57edca510c5f2f6c98b25a9aaa1c425b7a5714a3dfc41b85839837d0",9.917710196779964],[822,"b6275e81a5c5e6dcff0a3c7c637ae3b02cdadc35b0b4efb26fde8892895561fa",9.917710196779964],[15504,"7c1ab777e3792835a361688651c897cbdaf4e5d42fdcc95d547eda3535810774",10.014641288433381],[17244,"d0e4fa8bac4847c0d882b8a31fe2d004b56cda39a16083f96bdee04fae7b0e4d",9.317957166392093],[1060,"4203ceeedef3ca104e90a6e6af93bab737ad392219b6dcf5502c784d1966dcf8",9.917710196779964],[19531,"6b22844e57fd20be08d0efe0d848fa12523af5ed6c028ff2490c46f8e53c630d",9.317957166392093],[8,"4e99399c49579134575b2f359a2e03a445d63a53a06244c686b9ac617ec6f7ff",9.317957166392093],[19608,"e0044796c6c5e7e448ec32f14db50ca8c7c4fa964c410c88db54fca4bafa9209",9.317957166392093],[16792,"4a23d1ea16f737e7df9fb3f66f586f37ceac833b7b0140efd96b455876c47656",10.052724077328646],[12411,"d27529057462201348f5d29a156b5c992508ff77134eab95f222a78966ff8bae",9.917710196779964],[7911,"a3028a5c608e6ea93da717dddc41a3ccf9511e22cc5993d9095e530ae7d22acc",9.917710196779964],[7322,"b64cee660894fd5f40398c0ac4db19b86c806e3798358602d1917d5e6275edcf",9.917710196779964],[6281,"90826cdca0d5804ba596c7e468bd518125c6b7e098efd5b45ba13e4f747c32d7",9.917710196779964],[9893,"34052d841257c3ddb59f59af041ad205eb46c2d5ed517166f9eaf4976f32fabe",9.917710196779964],[18186,"cde95cfd93fa13e45f686f51200825b6e2e798d216d280dca9fc6c04a7008e38",9.317957166392093],[18256,"ab9a19f8dd985222fde696c2a498c0f4890777eaa2049bdd4b8f4e4c6ad1e636",9.317957166392093],[15091,"39cd19f6c16fe1037d8942fa627c6c5d50807a24ee25313681d78c120b58e27c",9.317957166392093],[48,"c3eb56ec08bb5d7e7497c6e560252eefd6b124b44ec2390a07f11805dc8aaaff",9.917710196779964],[9027,"ec8874a60d7f385b718841518c10beac55d7cc0d66704d234305ff2f30ae9dc4",9.917710196779964],[5326,"69d933bc0b5aedd1e829e71128b928c88cfecde25d655278e2b76e41a51745dd",9.917710196779964],[9614,"f12faa1ba7ecd4c1cdceaf9bffbe0c089533f030b25bfaeffdbfa06080dfefc0",9.917710196779964],[3946,"b8cd268ad367bb02d546514e5922527962aa7011a9b739a32245eec32bee04e6",9.917710196779964],[5842,"4c781cf326a8c49ceefefe631d123a875fb656506e65c4385776fbf6364f0dda",9.917710196779964],[15207,"9a5255f7272c6b2aac92a9a06d8f5725dac0002036745d717b277284bbc25e7a",9.317957166392093],[799,"84a1c5978403b148f472393e02c5cd73203492d3b5b90e649b84423d846e8afa",9.317957166392093],[9747,"97079818230c0358db06969e1240a3b5f2bdaa8b25cfd02f8cb8e12fe0fe04c0",9.917710196779964],[4246,"67e3fa695c1b1f64ca1c82f6927b957832e42cdf3d4a4cb93182be7d6f3f24e4",9.644381223328592],[14118,"7669a50d7c079ebfa1a545cb99ee6e38bf5504903d328723739c24aa1e142c92",9.317957166392093],[19849,"15721b2ce3cd5139696fccfd907be1dbcc90747c0e1e8147d2e1ed5bb800dc00",9.317957166392093],[407,"02afe3454fd7ff2858b45b23930d44e33d00dc5a33d594da76fcd108582b4cfd",9.917710196779964],[18512,"d8e424f1e02b1cebdb889b7d0c0409436b6c4331acb2e70da780638d468c3331",9.317957166392093],[2603,"52a98e024225d7c47e8314857e5c5517ab45327b3b6524282ad95083ce3121ef",9.317957166392093],[5540,"03600c53fdebecddd52ca93073f3583e2c87b2a658a39774108e06e6ecf5fadb",9.917710196779964],[10151,"5c046270e717ec0b4308f145f8c3e6d362a09ac0c96f9ab9303dc465cde462bd",9.317957166392093],[19061,"4c3307ae46bff5d45bf92ad3369624436d2cafd1a63deec3133c34fc3dd23e1e",9.317957166392093],[5772,"4dbc4cb4310171eb9a657287222bfac458f4239213602267db9b88c0ab839fda",9.917710196779964],[6244,"5e2568932bcd1c5f2c26731eb90d7b9ba77797e3d25e4ce5f5a5b67bc3c86fd7",9.917710196779964],[12930,"856a77da0a7a794ec5346b34f711e2b1a04a25d0b330c02336ac4d04d7db08ab",9.917710196779964],[11135,"986d8b4101613410c2fb6437e4f079b8793623690f7d4c3326e4dd761b510fb7",9.917710196779964],[16240,"a3c9f20784c8583ab5e6550352f50f79c2607ba5f41c97a76909be608c51ba62",9.317957166392093],[7638,"e504f13fed84633e27ce318b785c422b55331b8ce8630ed32eba3972a2b0f5cd",9.917710196779964],[15574,"538c53258c07c1fd8ad8499000fd51fa53f80b9412f61bd2e0a5f52778761a72",9.317957166392093],[5975,"89e21b2b8af97a7b0e47718adeaf6aa086deb502cc8e7369f91f3229476d3fd9",9.917710196779964],[2597,"42e02c91467688ac6009739fae24a4dac47d566c52dc1bdeb3a9724bfeac2def",9.317957166392093],[3151,"a94be5e06ca36a59b0586ca5b60e4c1493ec9cb0787a04f3e35cb5a8575757eb",17.083197389885807],[10599,"43092d449795de292a6f77362f14dfef91bf5f48baa8cc12065c93cef096a6ba",9.317957166392093],[1830,"de33ae51d7ce80e75162031957c87ef0eed78a5cca07e8070248b85799c00df4",9.317957166392093],[16382,"a54ef41cb619c86f73803fcdeadb6e510f42becb8a42cc31b6e364faf270725f",9.317957166392093],[5241,"a1306a66c57bd444155815b8021da91ccdb972932e12eb0ab0fb619daafbbadd",9.317957166392093],[16434,"10630858b02dfa0408d4772680c07b70683a03be605aa768a95278338000715e",10.052724077328646],[16245,"f2ad784afa9ace957e504724bd5b6c6261f2bff3c3dd6f04bfa7e543d7ff8e62",9.317957166392093],[603,"3dd2f91770a44321d3e89f8fe2ce8aa3397618f829b4aa253dbffd3ed81ee8fb",9.317957166392093],[2390,"a5ff20bbdf34988022a5519d0f2601ce1f8c9560f7f051cdba596d8798d386f0",9.917710196779964],[5766,"3f25c1e7eef5dba9f5e78b8867ef5dee88dbfe400a0cbeb7d9fd9401577faeda",9.917710196779964],[1297,"f3b09ab9b480b175e527dc783990be07b8d155d9281a1129d1268a2e67e066f7",9.317957166392093],[15696,"29462896fc51140146b390f1ff68e7562544a6749f1431996db366f96dc4976f",9.317957166392093],[8324,"0177376812dd4a0c59fc8072c097e2a732f2c93f13e4b6a175c9699639a527c9",9.917710196779964],[2440,"1999e4c4ca6850be0099c95d91afa1291ac4c4c024af6604f2276f0be86a39f0",9.317957166392093],[4797,"d0ca02d6592759381168249675f6e537e529ab8135120619155fa286717962e0",9.917710196779964],[9234,"3ea3ba63506b97dc95586f25948fd666090e1765e26af41ccec95532a27d34c3",9.317957166392093],[9776,"5437377fe325c807f00bc3f710adf185b5adc33532f31e1973537c8f7ff7d2bf",9.317957166392093],[10972,"c19d4c00aa88157186135988cb50347a560430841f9394095c74e7ef3ed833b8",9.917710196779964],[17037,"def23152923870f9f4723f4a803dbad89a57bc9b6f3c1fc974f9195d3a383551",9.317957166392093],[5227,"6f9c613ee661a03ca45e9768b4fa6e23103584a005dc807f8de8fdddb8e4cfdd",9.917710196779964],[14476,"6fa795feaa7e3eddb66b620cf07767b4b0347e4a0fdec44af2a701c2effdb589",9.317957166392093],[11863,"505d4516b364317e0968a09b7e2bba721e9be538bd7c62910996050ec1f349b2",9.917710196779964],[5398,"24ff428a71081c570ec0d3eaa9715e7a79532dc6710604e8d86234212554d0dc",9.917710196779964],[13750,"752de2ff3776225e521f41837242766e6f4962878235c2dc5bf24f52e9c0719a",9.647446457990116],[8120,"dff4bf0451dfe585686f07a7a8af9415fac7fc369eefcc5ae5fa9ae874909eca",9.317957166392093],[7020,"825367e80e3a8378b426c657a14047a7f2da37cfa9bdc3948082c74b7480ded1",9.917710196779964],[17746,"3f261cd45e6d7bf2f017f3f32bf3fda8f38f9706df766c3aab5a21797da23942",9.317957166392093],[16737,"72f2b044fe30910edfd45bd99102cdb5168b15335846d38a7be4e307a8d89d57",28.12785388127854],[4069,"ff08b7d1ca9f65c80e898908674caa87c8c375b94b2351fa7b4f849f53ac4ae5",9.317957166392093],[11162,"72f34083ec851b0bbf21aca6fe5a706d21258c3943d8166cca8d0c5a4542ebb6",9.917710196779964],[10465,"6948e5f6665f3ba6a8d8f1db994c324534cc51bdcd70346b55af28f1236e54bb",9.917710196779964],[18600,"4fd8933ebded308d62a0d107d81da91e7a5e09d478c1730fbfcba8a11a0cac2e",9.317957166392093],[4651,"8dbd0b76a4419f4e7f5215800e07511b380661f01c7be77f42a9019427ba49e1",9.917710196779964],[18514,"1e5fb40c505b3454b7729843d023b386ebeb043d7841642c97455d6ea9932b31",9.317957166392093],[15046,"7e8fd4f4e294242820de429e128e00691e0b68a698ac4393e8777bcf6ee9a67d",9.317957166392093],[5317,"942a291850570238671fb8ab30f68078b839c5392c5456508b05fba415bf4ddd",29.418848167539267],[15679,"3c4c73c75b4c9b67050e8534ef6ed0482048f9ac5955e43cda6cf6e85a9ece6f",9.317957166392093],[15642,"0a2d31f780d9549c0598ae76dbd182b784967a7e82b500c5acae0575c74c7f70",9.317957166392093],[2678,"83ffffbc079ab28a36e8f48bff50f60fede37afb9967cd8dbe9614f9dde1a7ee",9.317957166392093],[16843,"03ebd5fb4f442037ff6294ba5c1e47b5dceeaff6393c737a93d889697b076755",9.317957166392093],[15152,"e1b15b14546daecf4838667e84d09f81e78e243b3c33caff58ff6f44ae92827b",9.778611632270168],[18257,"20428e516301ae5df49f918eebbe0b9a1be78d4fae72dc99ad74f6650906e336",9.647446457990116],[13819,"060a6b9db9c7a5f568259a3f76e8ad8a369e210fe3a405bb096225b4571d1f99",10.052724077328646],[11411,"087db838795d8e6faa4cc3808e40d98be44cb22683e0e95116f7a2a64ca44cb5",9.917710196779964],[8975,"3d5e0c5e659d1f8a5eccbca7e9ef64bb94ebd112a5c518bb2358f2ad4d8efac4",9.647446457990116],[1252,"34265106827c67ddd8d26a6d7c1dacba7cd184617d541c83f2246d2c0196a6f7",9.917710196779964],[97,"a5c7aebba9003774bebaca12d602d6893ba6eb23b3061bb355ee7137a4c264ff",9.317957166392093],[14594,"2745a2c6a6d2ad12266f860fe8c02d0e0c381a47a69b1582a9feb35567de3d87",9.317957166392093],[17716,"0fef4342e1d7f527a2c442724bf3690f13c30b9875e16b400cd0b09945b2e842",9.317957166392093],[16353,"d5a622c77fe969b4b41b9198abbff88810c33b3504be1d8d4ef394911fac0460",9.647446457990116],[1916,"908577a501c026c1ea7bce3360665066e9e72bc1bdae08138f293141f42792f3",9.917710196779964],[19752,"f7c189931b1c64d99c4160a4489a8168e0ab7dc6b69a7854220fd72444d1ab04",9.317957166392093],[2336,"8fea2c92b1897ccd94ceae7714334692a63fe94c9db91eb463d0498cf191d2f0",9.317957166392093],[16729,"5d62e7629c05a79c3244f495245b9fb2a8140c214ca38d6c93d51e46ad3dce57",9.317957166392093],[253,"cfea838c58f9d6bece8336cdce6e20dceb41a489631871ae8a731f56fe4e4afe",12.01332839689004],[17580,"0d407a2dc07744d25d3c1c1190fdc5716056c274d3d3a05d992ea9966489b345",9.317957166392093],[1243,"8b421790f864cc2b0d3ebf29f0399602a5187a4b2ae98d4752ec544f4a27bbf7",9.917710196779964],[17887,"7c2bfbad000e21dee39f19c0e72db0825c690ccc54d71328e002599d68d1803f",15.91459074733096],[18798,"1a1b5614fa6b7a55568354f67bb781a10aab02be4124addaa25c61fc73adef26",9.424083769633508],[13478,"6531b7298884f5f6bc9f6f8ed352d41f2d6345ebc1e23adc5458297961845ba0",45.2017937219731],[5937,"13dad142a11ca5a9bc25acb3f7af5d8820efde9bd68cb371bafed79d75ba75d9",9.917710196779964],[2860,"4d320e5deb9e80e9e0612d2b00aed8083d55befeb2847001568514efc10d57ed",9.917710196779964],[8337,"78d8a1f4a8bdfe541e56bd4990773276908e1d13405c97585eb15e628ce516c9",15],[15120,"b31456e6d1f5d272d7161a1dfd203317b7b88db9719e3fa41e0b271096ec4a7c",15.073170731707316],[17662,"548e934fbeee4a66690deb2022039acd1eed147e60e38d3408d88fc944c1e543",26.105882352941176],[13162,"82c05d774c0da7b3fda77cd916fe7c807fc990cc166845d9f18becdc35c6c6a7",9.317957166392093],[17275,"7d87c70dc1d5d77cc0157ed2a4b80b90596344fb4451aff2540f8991c509b44c",10.014641288433381],[17919,"63683df0a9b15b4f76a411f3c88b39eb43be8ba0e0ddf5fc7c15d2e30278ee3e",9.317957166392093],[9807,"e78a9d220129fb64c4ffc7b65262a3b60190150bdd368e2a2c57d3b3ac3397bf",9.917710196779964],[16260,"22ffc352053564d679a749a1cacbcea099792b1bbed73f847bfbed4cffd62762",9.317957166392093],[3513,"55aa7c87f3f86b88ed31d64aff95fff8fc2b538acdc925b3b202781d7895e8e8",9.917710196779964],[8170,"7b52197394486cc1da35ba0985c9d9d987df2bd6f187c7a0527c6b2b34392dca",9.917710196779964],[15159,"b992dee1055f7c3d1527301c5163247a02b23a7445ec55e86c6b11f62e86507b",9.317957166392093],[17967,"75a3b115707833ff18c7386335fa445e3c3f5b9f3457669f463b2bb63b3dca3d",9.317957166392093],[12810,"2363e6daa3808f593b8423f8affa7aedeedb54b0de882418374859f2fb22dfab",9.917710196779964],[4765,"3857cb5ef0ee5c629aae9b57b7165cc7c9e98cc29bf98a658556d8ebfa9d8ee0",9.317957166392093],[10506,"1e82fbb6a372786070c4bb19463be09a746c27b100be3e22f9d22057aea927bb",9.917710196779964],[4611,"5a6a696f6ee93cc2078c0d35f4380f0f1ffdf14d666b5c82f299d24428b08ce1",9.917710196779964],[19480,"2159034f5df0179706b228dee1c8aea5f67004d094d143f6468ad26fbadb220f",10.052724077328646],[19370,"1bc40f14f6edcc19e6e56d0474519c03ee034b64002db99cee518c911cb12313",9.317957166392093],[8673,"80faea79656d3d2a4269180cab9a8683392cd7b749f89f8f304aa5a32b21d9c6",9.917710196779964],[15499,"92fb5bee1b4b3ac7125783756b01c9280aa4f98a65c353351ebfd11ac9f91f74",24.738730365275583],[18936,"905378fe932b359b46744788b16bb44c286ddfa4d3e722ad0fd3cdd812e47722",9.647446457990116],[1610,"41ba0ab263e3f79c1489d63a8517d19ed7de734a0907dc04669814b84cb082f5",9.917710196779964],[4681,"941a8cf576b81576d1cff9bb93516bcd7b455a273a307b3cbe4c6d6ca6ba1ae1",9.917710196779964],[9084,"a70d69b64b3ad058f3402535d6720550d0d5a4c1de376e014b34b73ffbd840c4",9.917710196779964],[10940,"aeeed99e6e5fb0608de77e2464fd85ae3700ee6c86ac1f7d781f031531dc71b8",9.917710196779964],[4052,"65ccd3af4d9350ec089317ee35403c69e640890d7158e36fc01cfe29e7026be5",9.917710196779964],[4459,"c2b64714b1fd4b4858fbadf8fd494a346d54f4ad3be8cb5566def4b854dda9e2",9.917710196779964],[19503,"ee71d79af30fb006bf649f203366f2b18e1b7d5e9ce241c18a8845db6450450e",37.65675057208238],[6845,"b6b7d33e11185d8fb7397c02550f90a222b21cd84003d3b70afe452b7a11ffd2",41.333333333333336],[13855,"f86929b9f0577864147b847c4d66e01ac8e04f04c7d5aa6287861eda5ee74c98",9.317957166392093],[13619,"e0292aca958b0d41ae695db8eee17cf8b6245de6e10fee32723662f88d3ef39c",10.052724077328646],[10551,"c53fee3880233b1aa4952fbb99b7a6f5564d0b39c202c488847dddf371c2edba",9.317957166392093],[13948,"422152c8222046a6e5beedeeae1fa61102c452fdaa2d4d36de0aabb37532f995",10.052724077328646],[13644,"53012cf34dea884f8a7035de9ffee52d5fc59a1072c7c58bca2bbf0b90cc569c",9.317957166392093],[17764,"a0da3397aded8c62f74af54d6e67d82e3c96ea7b219e0d919115d06b17c5f441",9.317957166392093],[11573,"97237c8c02edc1af9b9e10b2f8001d711512ad525140908b2d4b1a686ccd19b4",9.917710196779964],[12142,"26a18e8b3295f2dd8db3cb32fb78e738d51b0531296b27462c4d5f009f6464b0",9.917710196779964],[2540,"351a971a87126dee740fc0c41a6dc4149272f699e541fe50a9451d995a8592ef",9.917710196779964],[16779,"784defdbae33e74b67791067ddd4ff97b54bb7173c323e55349011428513e356",9.317957166392093],[2330,"953aafa14e41a0f8abeeb8ffdf8933f1df3cf22564f9ad827d4900fc0fa9d9f0",9.317957166392093],[4377,"c07f30bfdf8f1db0368ff3da993b4a5fbe2eb6d3427036ad7e7dc777802739e3",9.917710196779964],[5841,"7914e86a43351ab33a901c92dc08d2fafc94c32be4fc75e8d181bf3ecacd0eda",9.917710196779964],[14967,"78993ba38b78c585dfe230a41aa25256faf374b695be887540c3a216e56a397f",9.647446457990116],[9845,"3317c829bc766b5fb6b52d62a8021cd23dba9d6e243f8c59434c590644f950bf",9.917710196779964],[10691,"e48bc0105f0961c7a56ea46f3e04243998107c6c9390babda8b265f7ecfe11ba",9.317957166392093],[5664,"c29658b70149af0e28b2cdadff760f710bb9fdb1e1eb0baa397c0df988da3bdb",9.917710196779964],[4766,"0fde5660b5399cc4df027ab774a0f71494a6c3303bdede2acfd8882e8c2c8de0",9.917710196779964],[16559,"a7b31606dd20d247df275db7f84ba5b8e9072ff7099342bebe11efd4ebabed5b",9.317957166392093],[15307,"98fcb0b650c22c9e04df5fc397201945728383477271e760f01386a033423c78",9.317957166392093],[9741,"3f117a1819b939fcdee1beda822400b6d93dd27a764bcde4a66d5dd411e70ac0",9.917710196779964],[5788,"531ecc5dc1664300d94968d079d01ac2d3e33980f71cac42b1dafb66d42a7dda",9.317957166392093],[12186,"97ee488afb3724569e9d80d5aff864638d69f7caa2d6517f39f1d8fb900927b0",10.052724077328646],[7616,"0255c2d04530993864ff525d39ed32dc4a619db87c4ded85095f94ee88ee1cce",9.317957166392093],[19710,"101e53f19d4f13d04021f95e49423c15900b4fd440b3812d2068826ed1746906",9.317957166392093],[5503,"09ec4330ac25a77541b74e17270e4860a0945fed6d20ac402116156ed35235dc",9.917710196779964],[13549,"8d52032fbc5a8f2bdecba205a00a04bf60f2bdb41d56b8e288e7c8188b04c79e",9.317957166392093],[17446,"f9ac2ec1948afc0aaa9e523ac477b10b4cfb9292bb192e655b4c1fcd6dabba48",9.317957166392093],[17472,"e232277d44bc2dc4f54ad05a374dabf11960e75067b839624ccc1c796a604448",9.317957166392093],[17012,"f6ca157137330899b0d77c131257fcd71475eb5fda5135a48f5cddaae2a1c551",31.800453514739228],[19458,"2b0c064d3486de300213be75aabd63d3211825c9892d577e2ee44181c5e4a70f",9.317957166392093],[6454,"a562b20e16627af596995f9e52fcbe3b2294100ae726cad654006b2fff5cdfd5",9.917710196779964],[16477,"137484810da163fb46cdcc325d09667a93f8f035d31da52c21e321dfea7cc15d",9.317957166392093],[11846,"5420f0bdc5d31476283d08a9ce1739a5df0480313bc20c40abdef10a60d46cb2",9.917710196779964],[17055,"8aace0e984d8d3cf70827ef1b845e940d45fd77f0986c024ef00151b64aff750",9.647446457990116],[13184,"8a68d5ea3b679039d9311a6eeaf446bbbcda4606d731287d42e1a4f41a7854a7",10.052724077328646],[14483,"bf18b4b067e6787f9e90d33fab012d542f7698d581f1214a0dfb81a058a89889",15.953890489913544],[6731,"ae52fcab817e64127ba5b4375a2f4a1bfd7c2e90d0319207bcccb1214751bbd3",9.317957166392093],[9834,"3a73d200682beed22833e0356174ee4bae98590e1ef9df384b83e4609f3a65bf",9.917710196779964],[18445,"2cbcd252b9187a7e28e0bf30adaf755824b3ae8127c358a2ab9c879dd1d2c632",9.317957166392093],[10079,"59d3cf924c635309af6568dc9dceb4dfa3df6edbb5b49204177465687946d5bd",9.917710196779964],[8390,"6cc945db2a8154053a22d2e82e111089cfb79331660b5d6e5453b8eb2e49afc8",9.917710196779964],[2544,"4e49ad1a61a84ea3158ad7daf49a9f8594b7a2ebd94e8adbdd06905c2a678fef",9.917710196779964],[16848,"551f338bba3f8b6674128de318d41c82b39fddbe785dae7971afe7ca96b84c55",15.105633802816902],[9204,"3be1558080c038baf457be3ad6783b61c5f267b505285ad42cf07ac1acef66c3",9.917710196779964],[6388,"ede448456e58b94f4ac40affd859226612e6a37ae030ce221aa9e9445ed266d6",9.917710196779964],[17561,"24b0493a74df0c286f3c4eeca6d24629d2e4cc678977f80e9ea4268fcaf55546",9.317957166392093],[9360,"1cf3dcaaea7ea4bc45a6ec5cf25df5ae5aabe399317c9d7b8b028e3a41c381c2",9.917710196779964],[6191,"4727db8684ff19bfeb4abe3288466cdb0b3ac202875c5992da0f3c4b5898d5d7",9.317957166392093],[17067,"75780b0bc1a20e78749c1b05d7eed4aa3c3432e54c80995b2688af381a85c750",9.317957166392093],[16407,"6a234f13aed9fa863e8b54be770abe78e487e0f0fae32e7171974b1c2267fe5e",9.317957166392093],[14204,"9f881656868771b96ab25cb1d29699e6069157a6bb43a21189e1dc7ba8be1e90",9.317957166392093],[6841,"841b5f1ec9f315f9f9b17a310e1d7f5c5ebbbb0f59b14d870ce70b3a71b401d3",9.917710196779964],[537,"7d2abee7616027ca8643ff010246c9c335596e56b38507c3bcabfacdd0f45cfc",9.917710196779964],[15322,"cd6886fb6224d6c6a19bad194d1861e50ab59ad4912069004d96555b246be577",9.317957166392093],[13780,"c34564ec6a9e5d1c4bdca70c81c6aeb6acea657695d7195a6a247e12336aba99",9.317957166392093],[2232,"e097d6e8a350fdb4e520819644ba6f778585b64ba609f69d926dc9b35df552f1",9.317957166392093],[8245,"46fcb79732f1989d63478a36e2b1281a83241d16967ba4d73770c092d570abc9",9.917710196779964],[2532,"335503c97efa736199dc093ccc10cd4148190688d3eb7594d0e54d4749c99bef",9.917710196779964],[7706,"13fd1b13524c0adaf57c03d978da1492a9991d59dead601af71d76f43da280cd",9.917710196779964],[17258,"f74f36ccd8f5930cd60beceec52e7d60d2f680c7b0e85afe32f55d14f646ed4c",9.317957166392093],[16761,"66b1d5d4502d77f42cb0e8034c3c021f31a13241a3ee7e095265d6db21212f57",9.317957166392093],[11627,"86df77f8b35d3117dbdaa624b508a099fe527d7a0c2a675f36170d18b02bbab3",9.317957166392093],[12770,"6b0b54652672b595a8e09aff5cffff1a8fbed87647219548c8eb711e01c31dac",9.917710196779964],[8574,"b8a41cfc2e75c70f7b565bebe4cae6b5a3c9356134be82c87de075dd1ba297c7",9.917710196779964],[7687,"a7a1e522978a9c55dc5c3cb5fd6bae4b99a90aa97d441600ccadd7d16603a4cd",9.917710196779964],[3238,"479f728e83fcd088c6a9e646201add5b44bfc2dbbcb799b1d88c857099d8c0ea",9.317957166392093],[15487,"d8abdebffc668225f3e32eb4999414d469e97f91cce726467d04a4fbeb9b6474",9.317957166392093],[15936,"9bbe832e766ba11bbf2611b63572d57bc359069dce5e5fb06b203a2e76fb4b6a",9.317957166392093],[1647,"36896432e68f93f11ff7efbda543cbdd5b30c41e980924fa679631c2004149f5",9.917710196779964],[9837,"3e9af804dae0375f456169c588a9f3276e2439a5801f1ca4a8fbb32d1d7b5fbf",9.317957166392093],[7104,"20eb140eb7a3deeb374dbc09276c3d1510489b94a97f41cf1958529adf2c4cd1",9.917710196779964],[17932,"b9e1518a90d072ee512f365b089520f0f5ab7929285888b20c9692c48123a63e",9.317957166392093],[4388,"82ed75831e22fbf0fa210773308f079a9cdf506d0e1841e3642cc18e7df024e3",9.917710196779964],[11779,"27f772e408519f648aaf03886f70c53211f88fe64e404b29b5a60b2b6ff3d8b2",9.917710196779964],[15588,"d47e3d625eed351b07b37751f1dd8aae3f7d0e1da152d2db1bed2a1c12578f71",9.317957166392093],[18239,"749c7476ec13294278fe194e46ce0ef06f8f0e57493655709910352687302b37",9.511868533171029],[16500,"c3259b5a5fc51c77dcb7335a2e82772a138a52070c1fcd8cf701e4afb6eb355d",9.317957166392093],[6011,"1487a6b51501e81afff46879a4b158eea2a5580931d4ce1949e88fd9287301d9",9.317957166392093],[12218,"a47c10f7c1896ccc4e7c3cb6e5a39a9810e5d0b0b11e5c631423d7783844f4af",9.917710196779964],[1832,"9c4a1f5ed9ea2f59ede05f8760dd83f123acb8dfc2b3bbde736b6ed62d3c0bf4",9.917710196779964],[10227,"4b35438421dddf20743b92ccb52b3f6e5ea03619f0610f771d87209d041ccdbc",9.317957166392093],[2819,"74a971ae8e4e1c9c2085adc117bb01a8d55ed89c74e1cba318748b6a515e8bed",9.917710196779964],[1869,"5a0977cf2a6e313e69b82f38c631369d2693a68068c4fda1adee66e43a30cff3",100.53475935828877],[6869,"d1730084d62360062b96345b8f9c2b0a252666dd6c3bc8daf176452a54e4d0d2",9.317957166392093],[9092,"5b5b6b4d7bbcb899cb350d3a02dcebad05ae29ec0549fc242618bd28d36e37c4",9.917710196779964],[12912,"a241fa3ddfb71f9e42441fc67c7600e4e01b72cc6701d736c369dbf5aecf3bab",9.917710196779964],[714,"39a7a38ada799380776f9fd564048561698b49cdb71e68c8393a3494c6e219fb",9.317957166392093],[3983,"8d47cc8acbf8359f2fb9c531fa2275a9845b644eea28ca6a22d6b33b134fd2e5",9.917710196779964],[8539,"0478bb7c280b559358ca5aac2aa63c736af817bb3676ba326f2699d01d90c9c7",9.917710196779964],[419,"0451d9977bf0807b886657f43c69b3b025f623941b5b15dcc72ef607daab41fd",9.917710196779964],[7417,"1391e7442e172fe81c2d886e54078def4c9c261679815a8d447df314fe7348cf",9.917710196779964],[6330,"0412a24523327aaee4946af8296d668f7902a27eba89c6501458a1b21e27c8d6",9.917710196779964],[1028,"f80a5e4aba4c1a25f97a79824776c261d05b4d06bf29ade7037acb75afb514f9",9.917710196779964],[1116,"98ddfbba9629d24b7f1e3a54961155af68380a734a5afc7256b3b7b3ce3b7cf8",9.917710196779964],[12292,"d6093a6e92f6e8e9f06c324c6cda25d1f2348ccc4577b912321454cd32a14baf",9.317957166392093],[8152,"eb6564422de6880e2dc772f225361e0b9084643058b97442eb2c71b8651c55ca",9.317957166392093],[363,"f7cd2f31a1c5e39603f58472088dc449c631f9b6345b42091da0aaea6d19aafd",9.917710196779964],[18167,"79da6577fd58e113bc99a83f4868c5f3f5846832ad873aec84eee14662510039",9.773123909249565],[4716,"bf420f3b531d8d85af923bfc2faa3bd6faa34f62255576c2e7c209fa9f28f1e0",9.317957166392093],[13563,"286cffece22c137fb2cca1e0ff3b0b5aa62466ec010af77095073fc86e506e9e",40.609756097560975],[7905,"610847c6e7a12d728b742a77099fafb6f5110ddd630593d4756a09fb587433cc",9.317957166392093],[12849,"4600184510cd9954b61b99d67d7418e4e04211e1c488c6b38ee794ad083596ab",9.917710196779964],[18636,"fd95a851a6572271ecb578edd00170983e4d9ce51a7af416be65603dab31522d",9.317957166392093],[3088,"9e109d1f9ec643cf0954a6c5969903d310646726eff1c32b9782c041da91bbeb",9.917710196779964],[17485,"39d4d88b445ae26b532fe1581ac9bd68c514ed5d879ad33a392b166817cde747",9.497392881432782],[129,"1f9f42e780848e65b81d5f9c70bd0b11f18f09f476168f0735a50f81641220ff",9.917710196779964],[11324,"054734c4ed5252148c15af4c6f306b0415025bf46b1a6d1851c345ccd4fdd7b5",9.917710196779964],[10531,"1f4adc18b9c0193fe9ee1bb52b8e8ec3adbdebc35f70f72ab0801f6b2df0feba",9.317957166392093],[9388,"9f9a1c5e3da2401979d65bee695cc81f8ebbf6956b00bb5198fecd77436c59c2",9.917710196779964],[12501,"16c03a20a6b4f1e9b09df47eeb23d5802f18913c3ea500216853ce427b8ef3ad",9.917710196779964],[12231,"de32dc0b3fa860e69165496a9c55ffaadd3b1e5e40f620118b8ec55ea5bdceaf",9.317957166392093],[3780,"ecdff2951bf53f4f08e289a323ae7e0cdaff786ace48056fc52ec819799315e7",9.917710196779964],[3113,"dea111b8d2c9fe1eb66ba80db5e71a8591a4044f3a318f411dbd6cbb79c691eb",37.93594306049822],[18685,"769cc76f70a3ddd8f6a90889e3d5bafe055ad73b1beb2b1226c9a5435327f02a",9.317957166392093],[12894,"82145767933220718cd8d9d9094f3f28b59adc438f80b9815da8ba45ecdd54ab",9.917710196779964],[5120,"072c452600e7ff3877d7128219ccb497ac53f67f2dd37dfd836899a6662479de",9.317957166392093],[7408,"64d7f6a522cb7b78f92b38f61f031b5194ec16ce495de6bd4964af0d0f6e5dcf",9.917710196779964],[1174,"63556aac61ef4f972d4631f43d678621165e15cfeba850043e11cf1a059128f8",9.917710196779964],[7928,"053a15681c24dc1bab31682b0b0df831d79d9606a708817e7382184fe97d0bcc",9.917710196779964],[19400,"54b516fac54b1c05ae791ad7fa9b7afb2eeaeda623d0b77f4fdfb49bb8188511",9.647446457990116],[1447,"81173206f68f7fe62eeddb39627f197b20284505a218e6ca687294d134af87f6",9.917710196779964],[17616,"c318f60684aca08723c102ae497958b4f0577e0a139f03346086e0a6bb2de544",9.317957166392093],[10629,"a3671cd325cfe8125784b49862483b193f9983160bd0ea4991fd6d20105582ba",9.917710196779964],[15148,"392ff073b454dde1aa1856c2d097957e1698c8ae00fabe32afd121995b14907b",9.317957166392093],[14869,"74489dc09c796dd400cc14a896d7a70e4021c3d52b3e8c33594b4469de966181",9.317957166392093],[13618,"48708a9109cc395d8d5a7bc75c4ff498346f58c67617d4eb8d47141db743ff9c",9.317957166392093],[7848,"f42edb24d02c73d4e813f5a5f67953f4ba69d3f2b57190dd906b36f7b33d83cc",9.917710196779964],[16795,"49b05afd94cf6c4d657b05a68862d4269d540cdf4d475a9443079a60fad76956",9.317957166392093],[14712,"37ab75e882bf99e6ba46fdd9fb8048ccbf93e2f01c4a18cadbf6f669404ca184",9.317957166392093],[2507,"d3bd5be8dcb5c093d8b67d8842250112784f56d32865d59e69ae8aa4145bccef",9.647058823529411],[9660,"89a0940356036894a5ba9874b74cf14ea2f621308bb9373609fbc8b5bc5fa5c0",9.917710196779964],[9953,"715c3737245075224a5722ee051be6c3765381ab55ab83f8f2a36c95d41f9cbe",9.917710196779964],[3742,"c1212488e67e8edbc67ffa9c93743d44ded65cb4fffe62c21de9b22fd6f84be7",9.917710196779964],[13528,"abe4850b8bbb4d83b7619c05c904270384700a4f2de0198ee2176cfd7516399f",10.052724077328646],[15266,"d9aa38a9b5a9c776b9de4ec74a1004f6b3656f318baa2b0d92a536a8b4db0e79",9.317957166392093],[1171,"7b952a2538fb1ed97b1512ec2736a82a85704575621330f776d0a00fd96b29f8",9.917710196779964],[13019,"46eb6a9455346064a8c766153243c7f0e762c62c8f4a7fa76036b30e118374aa",9.917710196779964],[2379,"70b86ef7c577a74c5a32878c200fabd86ca335b115e3cc8c2db296e0936593f0",9.917710196779964],[4646,"0e6e3d87be4539b88522db5e0f5f0201e5e7e0938dc50566d4d1c382751f58e1",9.917710196779964],[1604,"f65d58b0eb54d7b30ee9bc262992c25b5b50395be2ea98ef0ff1353b3bba87f5",9.917710196779964],[12236,"39145495ca3321692e608253dfd7fc379bffea5e764c24bca4118eae8e13c2af",9.917710196779964],[3553,"fc185605480e9e50331cb9c899e7efbda30f20438f0d0ef6a15338a21ed490e8",9.917710196779964],[9865,"f4f2fb881093e9e1e91a528951e15ab1c464d8ea13641056b25008048bf623bf",9.917710196779964],[4232,"bc952624cf1e6085c5a6afc6a7dae57e0bf1088aa1a994b48024e566e15332e4",9.317957166392093],[18134,"d5caef96b51d9fafd2f9ca4f1720f3bb2155e59200f3a04d1e5224e760be163a",10.028818443804035],[17624,"88ebc44fb79b77fe43d4f3ca1958866ca54d9509c940ef40ec2acfa3c675bc44",9.317957166392093],[18635,"08fb9e758360c1531282a753d07ab91b9b70b39e5a265e7de4c866115d2f612d",9.317957166392093],[17346,"ed11f2626bee01baa6e1146690542f1c9292cdc2ea72668328fb50f83144f34a",9.317957166392093],[7077,"2eeee2bff483821a858cbdd2696c963dc3bc81dd7420efbd2981164c82cf7cd1",9.917710196779964],[6438,"7d4f47860588ca4bb1568d8d8a35dca968e7aff12035dd3e2016639ed7abfed5",9.317957166392093],[138,"9f68f3e78ffd42d1b904dbcb214c18d59fb8593f7c7d2f46ef14eb23f68313ff",9.917710196779964],[14694,"0cc028b63862f51b786d1e701baff8383797b116c40800afac6855e17a2ff284",9.317957166392093],[14969,"bdebd3c7adb592c39866940bdc2472bde70caec99f227bf78143280c824c357f",39.13879003558719],[11525,"8527c1bcd9a99ce009142a86d600d99cb1f56963f7c636d900a6f73920785cb4",9.917710196779964],[18397,"372601da88157ae5896176a3a2c5fab352f97c7dc42a0d179a93bd6c02867833",9.317957166392093],[16278,"0733cbe37aa301c9b337fe058622cd531f0ae3a9ec2985e0872988f86d47a161",9.317957166392093],[8781,"e96c4c9f32803df6b6e5e142bb8f171a6ef95effc37368c0c8c3421c0d192ec6",9.917710196779964],[8135,"5b34ab16db7ffdf44455c590d794724fc77eaa7a0d74354f081be444e2ea7aca",9.917710196779964],[12348,"396f092f8b13ed72629be64bd4d42b2c7cdcae48fd846c4606c9efe05a9be7ae",9.917710196779964],[2690,"a0a00d294679ff12a0807cc99995708b54233308380c5f9d9dca476bf17c87ee",9.917710196779964],[11307,"e807a8873b7be64b5069b257e181886220417ba358b275b5336cc84779cef7b5",9.317957166392093],[6741,"efb44a726d7e5a4d9a6d1aec13e957cbf5c0e23c916c01d4208a5d789f0ba6d3",9.917710196779964],[13308,"621e6787d84217c847534d9012f7ff390d1d92d6141ce1afaf76841e00a071a4",9.317957166392093],[73,"aaa52ef16f836262b5eca14d21b2980bc0cfb3e2d9ccbc943dac5128d1e883ff",9.317957166392093],[2864,"d10c6849e9e809299d562f89864fc5fc4cd9a5f312223774eab3aaa3df4454ed",9.917710196779964],[3458,"ee17c3b697d1756f1ab0c1e636ea97e7d117d15a5b43f3edb423a2be278d53e9",180.42959427207637],[17572,"63b0317137e92d26f3e4aedc3527ac94f5cd241ded0a1c9af3af85184eecd945",9.317957166392093],[11599,"3579e99a5f315479c8201616295862a3be334405e87893114f04c2229636e6b3",9.317957166392093],[131,"789fa42e118e528f6a2811a81d32289500fc21f247e670532c412f1bd91a1fff",9.917710196779964],[4674,"eecaedcde9a065c1b453286b079e3ae8e344f2dd9c1e9d860c6b956a192b28e1",9.917710196779964],[6249,"0dc55bdb058c94a1e22d277561b1c156b109c2a125e38e0d7aa528d2720065d7",9.317957166392093],[13206,"6e32cb4e0e6f13f618a54d30e911affc74aec6daeea76d78915205a85374caa6",9.317957166392093],[16047,"96b441d3df366bbb497fa816ea4ed0c4e6c08e992990036f52370ac96f5a7f67",9.317957166392093],[17119,"e22b14497a06551e1ccf211ced1f59d8a4dffbbb1097d4d051f98fcf914a954f",9.317957166392093],[99,"1ef3e759ba8c888a4b2b531aa5fd99b65003922d1f5fb09671b2211e631f63ff",9.917710196779964],[16816,"b03b0e5ea0e585bd8b105d03bab982ce5cf12097754cadbed7cd7386347bea55",9.317957166392093],[1403,"d7bc13355f0c21f690511afec5f9fa799d2d7dd790e137712131271521b2ccf6",9.317957166392093],[11942,"d953f3888494b9accd208e35ef6da00da0d57c71aac7bbbe2598b755b3bfb4b1",9.317957166392093],[8334,"6009285556727755ef993b7658ebaf5e989bdc56d07b8c7e417e7815a0dd19c9",9.917710196779964],[8242,"e4c29e1047c6b0b91c2efa3eaf82da57b584a15e71c3d79c8ef947166dd4aec9",9.461024498886415],[19172,"72cb5eac99d1589dbbdd1782cad2d61539f10f595330175b213ad809891eae19",9.317957166392093],[9141,"a28c3df92f7b67a78d87e8f34516f8e2912cdbe007ea6db0b9977cba6dffdbc3",9.317957166392093],[10376,"06dce2e1cfc89257e3a83f31b18c4223fab828cb1729b73a14b41a63448cf1bb",9.917710196779964],[6653,"5f2f703f3c25df41b6fd8110c014ba84293fe76d98fdcc962f92f214799649d4",9.317957166392093],[19698,"25d64245394da7fbff7b11256b0c1ad52611d7c880c23db11a3007616ad4df06",10.052724077328646],[2801,"9dc9bc4230a8de4ba1bbcb95f9a922c669dc060e757e5eafff98626c80f4b2ed",9.917710196779964],[5237,"c20709d1abdd9a5fbe0aa8edf2ccefab074267ab4797777a94dd5386cb33c4dd",9.317957166392093],[2632,"b090f6b749de7d8df54bae0245fa99cd196f6c188d3d59b58ef5c9ce3f2ef9ee",9.917710196779964],[3640,"a33500a94bfcd977716716897b0bf1b205109b2796d8c2317c13edc3102201e8",9.917710196779964],[12944,"a0bf78abb441595227f53cf280c9b718d4086df8ba07362993394877054bf9aa",9.917710196779964],[3121,"4664c5fd37e19780a2a6145bd36a40967034bd8a2a6419532ab12dfb959587eb",9.317957166392093],[8571,"c0ed81b85c47d1eb5abd97ba61be19d1f0f7f81da7d3be27f40057560f689cc7",9.917710196779964],[5246,"fc4e10a97b988e514c6c286494b3d7a9cb2b5da137ee3e07a267623d89ccb5dd",9.917710196779964],[2283,"32602e2702fb7b930ed6cbd96cdf84e468a1bd3cae907c538f07ccdc73eb19f1",9.917710196779964],[11786,"8012aa777ada2f3d0c0368bf75ee54fc918509a3cfac303feaeae767e0becbb2",9.917710196779964],[19205,"275409eaa7f9fa0852ac0211260aed5f54e31e3c91e93b6e4d388d08084c7c18",10.052724077328646],[16611,"e0474821e4673f9661f591004023648185ebd6154cb8f8c1f800fbf860d59e5a",9.317957166392093],[16717,"4b6e2450673fe9548800edc7222ac42216a19b3a4bf030723130879c875a3058",9.317957166392093],[9745,"89fc91d21be2f1af820d161a6f7d6bac20cc5f5b4cecb9722ccf625d078407c0",9.317957166392093],[8714,"d43e021639c65628001b2c86709daa7acca2069d4b5b2598d10187492e4599c6",9.317957166392093],[14377,"ded788b4571b40a4495b1f595da2cbb5dbee10990c31379639e30204fd4fcd8b",9.317957166392093],[10228,"ce4538ea4dc4dac5252d4a07196328efd1ab01f7e0967ece6ca27d73b011cdbc",9.917710196779964],[14460,"f7ac55b6fabf04d6b5009c25667bfde98f75aa14fdf89bcf214e3ed52e4c0f8a",9.317957166392093],[2994,"7e1e9c1e03c4a7a86598feb6e632eadbb74d57bb422a3a43925cfa8866ff53ec",9.917710196779964],[12203,"4c12ab25783520269db7dc085854936e83201d6930838087759ce2c7522010b0",9.917710196779964],[5198,"ba6f9ba7d50c6cf6844b076b0c43edc9d30f196182231cdeb143cffb6817fedd",9.917710196779964],[1175,"2d8a287596f15eb2152b8bfc9fefa805475131951e4670cb012d8bf7ba8f26f8",9.917710196779964],[10248,"1eaf890c28d05ec46e92fbcc8ec872a80e87fde0f0cfe06458fbe0d5edf8b7bc",9.917710196779964],[7021,"f68a8028e6e3c5eedc8a41d5fb545fb442fd64116a673c69545fa0e7d45bded1",9.917710196779964],[17826,"a66b775fe3f6297276339984963cc8ac9e685edef57bb2b26cd05e8aad86c740",9.317957166392093],[2120,"409917ee47f529232f8a3eb63999ce9174a849e506b58f5e2ebd698cab831df2",9.917710196779964],[1546,"f2f0d4d15292ec56c8a69566e1202951ac862be3ecd5bb8a7b0ce4cac178dbf5",9.917710196779964],[17103,"303f457435cdf7a3b77305df0f25d08e4e3b64452b009655927e02e7243ce04f",9.317957166392093],[18644,"4eb5c4ddfd9af8beaffe5b1ff02d4ad869f7eb349f61aff624f8068a40b5082d",9.647446457990116],[17937,"627ea6f21486383f7a6fc9272210278ad51d543b7394e2fa1a52b68bad9f833e",9.317957166392093],[19013,"b5d74a48f2370f5dcee6ab19942b31501a17bbb002bda857a9e2341f4b330820",9.317957166392093],[4091,"dee4b280bb1955b6390b7c0c4f91d3cefd2fe95a6aa2634e400cdfe049fc21e5",9.917710196779964],[17597,"874d25a167eff0428dc6cb5aafb36ec893da385682c8a61aa04a7080efe53b45",9.317957166392093],[12035,"ffd0155c90b81bdb8fc24c81ece2522eee88dffca754424d8e343f933c3d0fb1",9.917710196779964],[4710,"116ae33881be8e5b68a181c6ea5dca30036b2fd71d37049207d024a824b2f4e0",9.317957166392093],[2859,"d53d71f81162c24f4125130178b77002965f72f7ff1d0ee6d738018bdc7a57ed",9.317957166392093],[18996,"429d04dfe563e1e29a953b492f81a956f0d25a25a1df6945f83ca7ad3184af20",9.317957166392093],[6484,"c7bda718248041c28bb49dc57e4873466a05ac5d01b82a60b423ba89e4ca94d5",9.917710196779964],[15733,"09daf3727da642c7f6131d2f0330b74d53b4f4c4224c16e2dbb3db3168a9d86e",9.317957166392093],[13298,"68628f8a07d3aef0a395f883b2459e504f4bec735e1f953b804ebdbfd95e8fa4",30.12912482065997],[17689,"145d62d612517aff21e8977ce0b0b1d41c566eff0c43d934dfd911ff25f46743",28.146596858638745],[18044,"f3709b52f7b3681b658d31cb5910ffa002ccbe09d223d15b68c25b59ae46643c",9.317957166392093],[13953,"8e27b1b922b273711a0a889ad683e0de3605c37cb8fc138e30f952c48d8de995",10],[15348,"46ad6b48c009448a533f31884b24ff76b2e012354e19de1c16a3a160881e6477",9.647446457990116],[8430,"77da40a049ce6a443b224bc8e71afd2c84ca7f46728d0ea77a596c3d2f9371c8",9.317957166392093],[6396,"a96d0e660c5a7d27d7b3e827e2c32a013a643137348305aeb4e1c66d2c335ed6",9.917710196779964],[7151,"169b3969153e4d251cd1e32ca17700b2b90218a492dc47f7e68da919d6b804d1",9.917710196779964],[14274,"c9317b077517c1cc9abacf8a4b77c353a5ebcec61f78065608d89e6c90ce788e",9.317957166392093],[14956,"c613f4fee64830e8c62612d299ca67cf65da43be2a7517b1fa3c287255e3947f",9.317957166392093],[10631,"9b96f07d74141cbbc6f596fde9665d4b1b2602973e859b53f7aa22e853077fba",9.917710196779964],[15831,"cfd8140eee071498dd71b3a96b3fb5696ebc3ff301bb3ee6423152a92892b36c",9.317957166392093],[10231,"72431268ff1d94c7e01e8d46c6a7e4dd052f8dc69f34843154b2a9516e0fc8bc",9.917710196779964],[14918,"d737d7a71adbd423526cee672ba40b368fc09b8afa9f104a00b690b457569480",9.317957166392093],[17482,"82b0d6447d85731ead9f9c48e6e76fbbca88ed314dffbd9fd9c280d6d7b90a48",9.317957166392093],[219,"e6190a5bf8b102a12e44d83d1260064f6c2dd2d1e502a0568f25fefb162f84fe",9.317957166392093],[740,"4b32269f24ab903be013e304b19aee34d6a32a3bf1de97f02d7425938bb5f7fa",9.317957166392093],[8434,"26fdb3058453a1f05b743142b2e0635a73d2f7ad848bb6538540b3da07e16dc8",9.497630331753555],[5156,"cebebec16ef1ea958d3e2c0f8c27a192116bf6eb629ef7ab25c7f5752c043fde",9.317957166392093],[4654,"b989bc84868d309c4bc74c695bdc2af455859bdd0fd304280a4cc011758c46e1",9.917710196779964],[18851,"9ae5f384f0376b2865b4f5b48a2e39a663d681676764449f6b4c5c3b93c50a25",9.317957166392093],[1632,"b0c4173e1e4fe06442328916fdf9295e2e7641e2d595f6db6ce24d00f68d68f5",9.917710196779964],[18854,"62e9e29658004658069d4fcb81ac7ddb9321ca273268078a78419252b382f724",10.052724077328646],[8303,"bab95f4adc52ba485d499e13077103013c3369fadf88667577f36157b4c64dc9",9.917710196779964],[4172,"6c05ae6c6da64c3a8011ef21f6fa9e68baea53e18beb5c066ad99c0efb509fe4",9.917710196779964],[10553,"d9370b5a2440785777fdf68c1c732b2e0a1b96cdfee811e722245f9e9e14eaba",9.917710196779964],[17188,"85f5687270de9681fcccf00812515524c1733935dfa25bc50c0b7b4ae1b8004e",9.317957166392093],[15076,"648934534c3aa38703dd59f790c8e96ff28b5f68d5468e1f213ffc6490851f7d",9.317957166392093],[1309,"c09310cb58ac445c0c05fd7ce1ea12a1ed6a65e6cf897bf2da28caae4d5d56f7",9.917710196779964],[8807,"a1dcf90b60c2b3c1bd2eaa7a4979b5235abaad94c76718e26deebca06f3d09c6",9.917710196779964],[10559,"baf99733c0a75405671e1e0e4bf6e2579166373efa90532018615444218edeba",9.317957166392093],[9727,"9d120f2734a397d9ef028a0b3a6876b2d1bdf0548e158a53dc47b880991b24c0",9.317957166392093],[6466,"27463a4e7fbbf7c86c1432889fbcf0a7244d35794de9663eec4a0ab512cbb2d5",39.267563527653216],[5312,"d87618955c0e0de043d0ad92fac58f1e0dc71c6f25695ea89473f82e16bf50dd",9.917710196779964],[6311,"df35478bf23744852e075e5e32959da402a76433c7cf5b062d806c087b00eed6",9.917710196779964],[15352,"72aaae7cd1a189d68dcc3a62455472251c5149d23bbb3f7e40b4233a286b5877",9.317957166392093],[16138,"552cab56cf778c88aa205ade9bf1ea47db436db02c20d7a44d301074359a4165",9.317957166392093],[5657,"d7ba76637d397f7480794b6cf7834f604e6e3104fc429635055c1b9a3c4e48db",9.917710196779964],[5918,"c9e5d0cc631b9fa7afb671bf93832f4c5fca9dddad35bf513ca0932c478096d9",9.917710196779964],[872,"055386460beb97de3a704f505edfa6f265af84fe28977e148d4a85c419aa13fa",9.317957166392093],[14481,"3b6399f4e3c0219d986f454678cc7928d938947f1f33a74d655ea1587b819989",9.317957166392093],[16897,"ab6bc0261b12e02e0cfdcee0bf165d13466c95c070b52ee7195245f0f4bc3f54",9.317957166392093],[12958,"a4dea4a11b0ae65ad4b2094a95ae36daf15594a0a545e38064edf60443ddd8aa",9.917710196779964],[7182,"7a54d278aa2adff4a5a36813cee2180e7438eb0e327c2196d27024895280cfd0",9.917710196779964],[15726,"0d3c308e09666dfacff9664340a9e5efc559f71cff86d7c574badb1e6b0bf86e",9.317957166392093],[10549,"3689da6ca5ace959006d6662026e8bbe01ea8959b0b30ad900edfcb32f64eeba",9.917710196779964],[8480,"c92f9b9b3cc56bb38e48b2675e892c5bb58d082eaf79ea97e9dd1204b5b524c8",9.917710196779964],[14544,"1ab78b1cbeb79f2309176cb5795452ebab103ae3061bd37a4284b0b490004288",10],[5850,"1e92998d5ba53e17670df40c48390c0447234e09ceee8cfe966e3c641b87fbd9",9.917710196779964],[14736,"e5c8548146e72f060c664a193c53c2a2fd935f37d1f22f04fc21ba476b432884",9.317957166392093],[17070,"98c9ed9b11ed89baa43307e66f7f90c2efc836e60fa453a0cc57fe26733ca150",9.317957166392093],[2270,"5554a99e45424b8770c8a9e31e5b390402b71b42cb44d205265ed7e117fa25f1",9.917710196779964],[16885,"9eda1ee49be9ae56e18ec0032271655d9a08bcf99fe914fd75653b804dfc8654",9.317957166392093],[4331,"e59fbe0cbf12c7922107f7cdf2d97e0da0c33713dd695343e711b6a3c3698ee3",9.917710196779964],[17635,"ef431272ebf3d960d508006690a11e986972fa3b113922bc673a4d4f740a9044",9.317957166392093],[4607,"7a87f630181cdc966d57f50882f14b474adf2073ddcdd265ad219a31b7b496e1",9.917710196779964],[9429,"884afe5b48dc2008cba684763e83376d5766d05978299f315b593d8947a428c2",9.317957166392093],[9375,"062c53b1dd8e25613cf66bb4de30afc4bdd0d5d73701ea5bb52d61917baa65c2",9.917710196779964],[9194,"7ce1ec98f32e918c875f2a1ac88f24e97fa175895073bc6429b022304c457fc3",9.361256544502618],[7621,"4e4b6510147b45a67cb33402e2cf420e09f08890f17000738ed2e656c35d17ce",9.317957166392093],[19135,"f719d75fd9246d964b11adc447ef2e0d8e74fee5c45c3f4604f4e3a7a9ebfc1a",25.970625262274442],[15544,"1e0251e17cbe477793c28e89f52e96c30e15eff752a2615ddf354373f7ae1c73",9.317957166392093],[7181,"a8d4a2389e4e0520c76feb3e4fa66e966ecb74abca973aa700a6bf32a45fd0d0",9.917710196779964],[15761,"a3364986b8c15adc0b5b889dacb5e0deba08fcf9a90910656ce8969aa7f6306e",9.317957166392093],[3993,"3f0ff6ea9c18cf42fa4122f7e366d24e6edde9242ee8d02feec8c3ea9becc3e5",9.917710196779964],[14773,"d9c390ec8c3e962a51f9feb5e84e6b04a7f02b3356ff5167b1cfffcb21a76b83",9.317957166392093],[7901,"1352be193b013b7f8bb00012830a1ea93010f938d1369e921cad9c2b18ae39cc",9.917710196779964],[1007,"3f97eccbcbc5eb1469436145b0f8c8c67af9bf99977bac86864ac8d3b15227f9",9.917710196779964],[10125,"d84cdad7c2e5b4e19e6b7e2eb56a81f482e3800173f5fa4df47ce1e635da87bd",9.317957166392093],[11932,"1eba03746f472c471741552fd2aca9e5c52f3e1cc7c0bdd636b518ddfa48ccb1",9.317957166392093],[15014,"cb341b5d459fd28a55c6f7b73a3bcae41b39a3c7134f8d65506de3e7fb90137e",9.317957166392093],[3093,"d5df1b08db3491337d2e8ae6cad47dccc06349fe492c314eaa7d25292b70afeb",9.317957166392093],[9397,"db9a8e6a33fa29c5acbf160130129420691f280754d9edfc8588313b7bc449c2",9.917710196779964],[46,"8185615cf27f81fa7a84785723b9c2239bb917643342ca22a3fd572825f9b5ff",9.917710196779964],[9806,"59924a298eb5b7fe1376e5a5978b20026b4941871ae4f20cd84c664aeba097bf",9.317957166392093],[15535,"bedd723cc95b13b14471ef11ec34fcb5474be439059349306d7e7b37be414073",9.317957166392093],[15672,"2b4ce0d90c5a032436be4aabb4063c4b39ed0bf6219a8a16c394d9dc8642f46f",9.317957166392093],[3101,"3d34ce590158543cdc113640dcc54d898ccc7c4fc4770e5f978a944f5e40a3eb",9.917710196779964],[1791,"d4ac81858b1d377120f07588c8b837d6c3ba62517c22c73799d4a58fc2734bf4",9.917710196779964],[4640,"cb79182871a0c30c8782d2ae7359958a4d73d3a096b2161767857e4616ff5ee1",9.917710196779964],[18174,"1dec715f31c90d737b7b00d4849b382886b30f9b47a9aad0def8c32007f6cf38",9.317957166392093],[4809,"bbd45a694a40ca5d9bd645f8926f4c359ecf0c968809ac2c3bc1caa11e3d59e0",9.917710196779964],[3748,"67e17a462953fc6d30c8a93a146068663f8ed2625937eaac25c706bdba3645e7",9.317957166392093],[14475,"2040d8ea3dabb6785b991ccd46efc9a8d66f00413e0842e4155b17337ea2c089",9.317957166392093],[8496,"8ad4bcf8390b0cc711282614773c34afce4b777a0d33f67e7381ac24f92509c8",9.917710196779964],[15259,"aef55c3bfe1214d6fe14970c81e5e198f8e11b4ef40fc2699ba04b84c5223f79",9.647446457990116],[13463,"9f31af719beae11041ae012de56abe6b1a2f556b585e5df795f95bbd79fac8a0",9.317957166392093],[19229,"afcf09acdb7e7d96087c00f40c61b1756ca364df60e9101ddb45321b5067b417",31.05169340463458],[10023,"e384b97c84d9950cc835a3084cb7c87124c238b1e6e33dd286b63f71149f32be",9.917710196779964],[10276,"c715a4056930e0b29548c6355af7294062dff91f18079e75fc775d72a4dd8cbc",9.917710196779964],[10093,"1676463fb6c3dbfcddfba1a088f7dd1725e4982ec04e563f7c2e7764a1c3c3bd",9.917710196779964],[9396,"810d799b32ae71d9ff484a6369cc8038ac01be16a55f37eb96217df9507a4ac2",9.917710196779964],[14416,"2bb53aa600055cefa62d8a3e375acdd1496d5546ddad7ede07bd69ebda511c8b",9.317957166392093],[2537,"1d3b0ed510c8b77006da72494d0c78b2d5a243834c03c5b5d66ee0391b4f95ef",9.917710196779964],[7852,"3ea7753b1c44bfcdad2494cfdfe3b60b7fda1d7d95a394473dca22fc04d27fcc",9.317957166392093],[2124,"9bd062c65c4ebb2c91b0a7874710465c3595dfebbb4780c1dd6edbe78a5218f2",9.647446457990116],[9594,"bca56d96951ea374ff98368aa7515a7dc028c6a1d0a3b632d222b29403e109c1",9.917710196779964],[840,"ab3b116a04262091a2e7d9fc894576756e60d5f73f22a1a97e0e2adcdd3b4bfa",9.317957166392093],[2989,"7b516c051f31e48426e8ce45ba8210a2148f53c5d35d14f57b4459a16b1e5bec",9.497326203208557],[10423,"2baf1d6ba7729728102b1e37b2a0ce240e3d4216ff842b3878c70a5b9fffa9bb",15.003322259136212],[2862,"c09381361c2f168ec7537781c0c0d93b84ce9cfb963a7d3ed3ed8790b70556ed",9.917710196779964],[13864,"83e20a4217faa0ea56c10ae76e9bf0376f800d291a593adf8da2433b30e21198",9.317957166392093],[15108,"e5b62ce87077dd9b9adcf36161892692a61af132a1b7317c788f804e9896657c",9.317957166392093],[6003,"8d1c7628613f58da5972e427fe7e40463286e5dd495f562afb8d587626d20cd9",9.647446457990116],[14082,"6aa8adce108a6fa94ed1115efb4afb50ac0df6204e818125a16887c257d50193",9.317957166392093],[17974,"8341fb3992532effc12b0f66522291be5dab6889f3c844c8350013f6d387b73d",9.317957166392093],[4044,"f3dba52407b15d454d9b7f4b71cde4114267a149780b097615c0532c5d7176e5",9.317957166392093],[17750,"4e2a03e94bc3ba5ce79894655bca0a6be11c56b8eee3d1dbedfe6d4c2a123242",9.317957166392093],[10764,"f44dcf740e1c5e54de530fa8789c7e11eb9125adb591ae6dd79aca68d1ad92b9",9.917710196779964],[16741,"290851b214bdd55c256e5b64cdc8e893b5f810ef936460293490af3e31929657",9.317957166392093],[14439,"572bcdd13b5e4628926f6a50359fd4995accff31d2c090487f0d7ebe09637c8a",9.647446457990116],[18498,"9fea8cf6eeefd9e1be9c2874a52d92471f838b46e708cab4eda67f88284c7831",16.187895212285458],[18290,"b93517317cc24c52f7227393dd4a25ad7b3df24d2efdf83248421b64f8080036",9.317957166392093],[13264,"3413ddf56769403ddc7b1c6a6235d97d125625ea276daa663a0c31a395fd5ba5",9.317957166392093],[17407,"ce24715e898283d08772b82a3eb920ad8efb67eadbd340b36f54b7c95ac3ab49",10.052724077328646],[8229,"f514b01038fc6e15f46cb06367904d31cf63c5091b701a13b358584b5fe2bec9",9.917710196779964],[2611,"61701ed13b0eb4dbf33a603fabd6c1fb3057972b3bad4fdb98f8933e462d19ef",10.052724077328646],[7776,"542c88bf496cc9acc51af7f26a8d627b4cc5225cbd7cb740031102e656a4f6cc",9.917710196779964],[7172,"36ddc0adc3ab1d31cabaee49a10f0040a4e760517647d6e25a449ea876cbe1d0",9.317957166392093],[16973,"a7073e94a6740c989e4e996592700100e686bc5d892eb3285a167a32516c9952",9.317957166392093],[2053,"f84bcd7d11d36af32a135faa880cfeaa361a6d8ef9f2f905ffcef3d6760b97f2",9.917710196779964],[14574,"8a4029f57bc5286fdf41850236b36fd6bcbacf6f49bdf2cb42d6b65f50479987",19.58108108108108],[11229,"0e2080e5b2d4aae7264a5a7894a1354d9cc283c56be6a12882da7850e74e82b6",9.917710196779964],[13729,"fb1490bea14a7b88e1f9592371a7ad9a0777b0f17812c1ed0d024f3b4fdfd89a",9.317957166392093],[15035,"a70714acc07a832b5d1f50f0da1a5de4cc8d25471b861fa35dc9e3181bc9c27d",10.02710027100271],[8711,"79c389bc110b2eee26dd8306f3cd6af568466345be6a670e756a63a445d39ec6",9.917710196779964],[4812,"692bf0570056af1e7c80c0c117baef6e616b18f6a42a20389faf0ac841e556e0",9.917710196779964],[3081,"3449b7e5765aac249cb6ee69f7568cf0ff2eb37924712dcc4b5b8c287016c3eb",9.917710196779964],[17496,"8e7094ec5ab37ae628f2da71a5c5066704917a504fb543faf91e3751d557a947",9.317957166392093],[9442,"572585867ad598a1e08f2edee3ddad5ba7f04087db06029356d7b89e3c5d13c2",9.917710196779964],[14565,"b38d75de94701ae799c2135470818fe60c56721017ed11a4ebacdaf3feb0ce87",9.317957166392093],[1329,"299af93bec9a258773363fba433558c0dce490074332103cafed2dda7c6b3cf7",9.317957166392093],[7029,"69ab0807e164027c2b7bb5a6bcede3393d76ac058f8a31479af0ea296869d5d1",9.317957166392093],[17074,"34d1570412f55890964647f243f8674708fe70ecc6093352ac4f2274b21b7550",9.317957166392093],[3939,"56ad7fd64498a6734117b80326a5129713a3a4bcb29de88d4732900f16eb13e6",9.917710196779964],[12402,"7c88d08fac5d1282d64cef96deb8a31fe8f003c8f837b50fb41331049baa97ae",9.317957166392093],[3129,"2b9a4a7e5641fbeb1b724c73b9938d10fb13c74f7c60af6c4901b976b37e78eb",9.317957166392093],[19191,"e062cf81d5106d07a8481842c25d459f769987b11acf8f3cb90defb43cc8ef18",25],[5339,"4d64a546498bc9c3be430410c7cbfa9d1b5824434b90825837802a9c930e32dd",9.917710196779964],[13152,"c446f0eef13cb95358205ab5e75307638032963ff3eebe6918d64b6fb1b5eea7",9.317957166392093],[9877,"dc8e9b83e51c63a2575b752a9083d38f49bd38cb8b00a95aeea13f2c90f517bf",9.917710196779964],[6131,"f71f0842f03ac36e27960171d5ae2ed520b2ed7c89c3d9fc5d7fd34f89ff40d8",9.917710196779964],[8461,"c964a10661b0fa15f4ab4188f628d6e52035998cbfb3b98bbe988fdd44d140c8",9.917710196779964],[4347,"d9923050fcfd21ce8ad6b553e825eccb409200ea6d0f308ef12a59d0cda16ee3",9.917710196779964],[15783,"c58d9298da87b99a2acba180b17257791d986338268413a1d4216d006b58a16d",9.317957166392093],[16640,"addb083e7466e4aa24dc17a87094c56370dcd3bce2633c6d8eb9cba4fed8055a",9.317957166392093],[13149,"1399416e23a2b9eabe392311a8ac0b02431d0470ba823e0b83173791c93608a8",9.317957166392093],[3395,"215b7d765273750f2ad042570acc6df2f1d753d57a24e940d11eb02a16f7b2e9",9.917710196779964],[1475,"a4df7ade694d6adade2b1902a8c8979534988acc41ac6543ccc722de100e4ef6",9.317957166392093],[14139,"5ed26308fa27b48ad4202b451b6a5d54df0a33b72f6a2a1c32051afa2122c091",9.317957166392093],[16365,"140795d2e9bb78a6db87e62b31d6a607879d354f735401e43a71cd49d0acbe5f",35.4976],[16380,"d727ce4b747e723b37fcd9509e2685cf607ad4dde6d63c81e3282ddcfc9c7d5f",10.028818443804035],[3455,"b6faced2b5726f6906dcd82f2411d48eb76f45f5a46ba44f60789a50c40057e9",9.917710196779964],[16910,"4340155f0b3f9c51af31203bc94137cfd7dc2da8ec6108e50f621a57a430db53",9.317957166392093],[17375,"d366a926d3b74bb901418781106cace03ca686e0bd2485d748496bfff69d574a",9.317957166392093],[114,"a399552954edd888d92158a6bb245eb7c1b4afc5f16002907ce3c0581a484cff",9.317957166392093],[1510,"d428236d39a8f1ae61bb9142b9037c018eff66d9a8e9e71931baa220ff6e0df6",9.917710196779964],[14068,"1c8614fd377942a2ef10a0fa2a51c571ac4ad7cef05bdf69f9f7187562f44c93",18.08372093023256],[17148,"745662d9c32a853cefe0a7ae9baf39b38b46984837090ac608ae291d13cc214f",9.317957166392093],[3996,"a2e12ba330c414e2a2b721b6070ce20e270b3dc95909a9835d534f9338b4c2e5",15.072463768115941],[18429,"177462cfb2baab35c6afc55079de79a12ec3b6d4ffda56c5b55ce9888f320833",10.016260162601625],[1005,"e4641d03b68d1c8cf80193cc94daa3ca9314e3dfe63d99d968a0902eee6930f9",9.917710196779964],[4054,"2fc9b998b25d5b7255ab252f6f634c0c0bad7f4efa45252f65d5789b490767e5",9.917710196779964],[10146,"7d193095bb85a4ee916558b6926cb6815805f5cafb798aac632230101f4b69bd",9.917710196779964],[18276,"917ef266bf732b0950f3042d3e9e137d8e96d1bc513a65db584a7ae2430e4f36",9.317957166392093],[4102,"27df2e2c2c7ab44ba5182d18fd7dc8911cc5a78b4beb42c4650b7f87492e0fe5",9.917710196779964],[2327,"bea80db34d27a38ca3583be75886ffa477128998ffe627067534a256b20ae1f0",9.917710196779964],[18479,"3eeefb5f097eb99faf934d97456295bddd97a771f1a2cb9733733dc53f5af431",9.317957166392093],[12064,"17788d3f77e38292e94a67b17d5ad43093588acc49c3c9db8cfed712a887e5b0",9.917710196779964],[18984,"3644b34230f5715d89021b4a9694715207cdc1ca3afae826646a75d3d72d0f21",20.056338028169016],[2577,"82fad86c5895409dcb73260ace9c32769c2dd6e0eac92492e0af25bfd8cc56ef",10.081996434937611],[1277,"ce5cb718b0ecac7940835bdabd81bc5f322a46e0e1103941286428ab3a8a84f7",9.666266506602641],[6402,"c8bb066d0ad766ebfa08b4e450441e2a2bf83404c2768020373b6b7a76e456d6",9.917710196779964],[5845,"6663721711936c9dcde56f80020c74071d90f89f3e510ccb4f16d694f5d807da",9.917710196779964],[2680,"67fc49c656a168f1118ee7a009c022046542a8266b23ce83e432faee22e5a1ee",9.917710196779964],[5450,"48c273ddbb5df0efec3f521471b366de93409d25f0f29fd223217191b77d7adc",9.917710196779964],[17047,"2151a2972c019757636e82091bae88a8b65d7497c384a8f4b19f4ca886822051",9.317957166392093],[4624,"89f7c346981be4b1433863885b797a9825e7e134e9ebeac5008fb5a2672e77e1",37.28146453089245],[2193,"afbaa20127f9e636b317e2f3fe974605af913fddb041b541620a3cc6708a9af1",9.917710196779964],[9086,"b359963c24bb025e9b184c203c7fae809f4af459981e484de1bea3e0b8043ec4",9.917710196779964],[13536,"d3f43c672e73074510f51230378c9d0d9bbccaad3dd855e2e54e788d236c0e9f",9.317957166392093],[1233,"9e94a0560887b834f8f40a506b0e2728961aad3ff28b2898dbeb7f0d0341ccf7",9.317957166392093],[1115,"045e2a3590fb407b143d359b4daf5e7f67e42d74b1953fa7b6334f2ca8217df8",9.917710196779964],[15970,"6f96657e2e9ea3e4087fe67ab0242370e77d783147bcda2caa33d47e61e96269",15.94306049822064],[19394,"a957b0b7bed8d858c66f39affa7750cb369c951604546b47e5ffd243bd930412",9.317957166392093],[6838,"588e3627f17840076088133d999aa4d66a8b24a3bb48ef7fcdf47c53231204d3",9.917710196779964],[18744,"9f85ee19a86ea205b5d568f8c586dd8e6ea3a6bca411e968a0677006868ee028",22.115183246073297],[14542,"0c6397d02af1b86c0c41b7a28dcc0636118521d7665d79a96338cddd81934c88",9.317957166392093],[18078,"b58310e7c78faa96fc6c32798dbcaffa07aa707f20bb0ba9a3f6894437f7923b",9.317957166392093],[13527,"a069f0727dcfdf97891d6b94a5ab608317cdd88f005faad84068f4fa59b03a9f",10.052724077328646],[18077,"3a853042af3ad17e93df2a23eedc716fdfe18f2ed69fb031a84db94a80c0953b",9.317957166392093],[10926,"d74d44fd1d3f7b72b5acdb5308da6465a21bf583ea0db2f7ce4a42431f0286b8",9.917710196779964],[13358,"1fb181d8d3f6c1c086e58f60134a09778adc9e26fd8a72ee52a628e487a54ca3",9.317957166392093],[2424,"fc9fb727a3d908e2f04f20aef23dc96d4f0add1e1481d1920709c590ace953f0",39.407407407407405],[10596,"fe08e3807436525e5f6734a1ef507907d23943e8d8b3b3212800edbcf012a8ba",9.917710196779964],[3918,"06e856d5767445681d87d87d260d9f1ca9233d69153aa4748cc962ee6ab83ae6",9.917710196779964],[3206,"1801a1c804c57c7248c5382127ada609ea7a067186858ef556486166c8eaffea",9.917710196779964],[260,"c15e2e673ab222145b53a7a6f4f8df19c37e3cb7c7ea5c0bb8e143dcf4f634fe",9.917710196779964],[8237,"944836f7b8aa34cdeb746d505b8ad5a58d699fa1e298e9a8f5ca09f63dcbb6c9",9.317957166392093],[18234,"669f7e84cc999f812e9555a088d2c52a24029c171d1d0edb2e2ec925fbb54937",9.317957166392093],[11044,"45816969d52e4a0a13e469e2bd883b0f66b83aa6e03c0ef920578fd259b3bdb7",9.317957166392093],[14467,"dce3b889edb0c9c3617e722433aad432869448503d787af4a941caa4ece5f389",9.317957166392093],[5621,"752c948352ed6898edf5db1bc0daade2cef842371f19e6acb3a8693d286a89db",9.317957166392093],[9581,"b1b28bc98d1f9ad6449ad2d2272c1b0f32c93f0d27ace5191e4da4a1bd9920c1",9.917710196779964],[15416,"fb1036514644598c9c6c5d4d002387e4789a7432296ca699c3594bee65b5fc75",9.317957166392093],[4127,"f907cd0fbcb70c2c48b395cdb6e91713f1cc501b1d205b703df978b95a9adee4",9.917710196779964],[10683,"a72aab15c2cb6a9570cb7facfc219cede8fa3c1d2f2c2e7fea88b4844eab26ba",9.917710196779964],[17369,"9b9738a7d630ed0eac152c0a4e4954913d4436ae6aa429f0edc526494888844a",9.317957166392093],[4857,"d24ea8e3b20cf3f459f1f8ae96136cf488c78cab27518351dd8f0d19ca3916e0",9.917710196779964],[18068,"4a9ac44dc970c5002dfd03dd31e4460d611f9b26b08a8e7ee6da201d266cc63b",9.317957166392093],[10252,"3bfb0e2b3ef14ed02baaa85f9f56fd11d422706611c0acd9f0b87ea0dc62b3bc",9.917710196779964],[4672,"61ee3214bc347af543062f1288f9c6e0df4037596d7564ff333798902fb929e1",10.014641288433381],[11018,"cdad750c55c95ee1543c5c698364df43bf5fe16cd403ef51f94a0dc4a5b0e4b7",9.317957166392093],[18639,"58763f7a6fa8e330b253c4536bb0ac14b27c4af0acacaa773f1efc8df95b422d",9.317957166392093],[1139,"9960713adabc882860fa9cae722e6cecdb687247ad7f264b6c3c444395ca5ef8",10],[14200,"9832311537a4ad0425f2f06ae0b820539edd906726c21e9e7013f407a5753d90",9.317957166392093],[11607,"84a0662e0d3cca7e21b7965d836cb965357b10d8cd1f5a36f94c86ca30dfe0b3",9.317957166392093],[2185,"6fb072e8539af8700005a8f03131a478155efd5c1d6bf608d49f252759eea7f1",9.917710196779964],[4442,"2b2fbec05f0c7bf9e07212b2b8b7ce41355936ef7dd81f7fdcda46f4daf0cbe2",9.917710196779964],[16487,"73defa731ac4f4b7700ae9853dd9b7d1673a4ab284ad87a18335ba130d4e845d",9.317957166392093],[10547,"207a3de1a17416279d7cba2079fb338ca5701659d710d06ce5e7c09f1709efba",9.917710196779964],[2975,"ab5f236aa78cb8626e727322c66be73dffde92cdf51f6d46f0d21646f2d975ec",9.917710196779964],[445,"e547d3a211e5f0e2458b029494bb219ee7ae405bb2064e57db1d9379304116fd",9.917710196779964],[9978,"a8229926ac47484fa45f6e7448849e0de06469b3e9c9d19cbed8a934cb5774be",9.317957166392093],[7655,"2d4e94db305ce434fe19f8b6b555eef594eeef29f36ef07e5e493a7c3deddacd",26.647686832740213],[13325,"a99446296c32f018ea727b64b45aad1099c65d14ffae4680ece93be6698123a4",9.647446457990116],[8388,"0bc31de8de9fec5365c3067fbf1d07fdea90ddf112903b4b181443301055b2c8",9.917710196779964],[10678,"1cb1f7fa1c0bcc2ac56c24376372b0f711654f55b26aa59231aa9072d4782fba",9.317957166392093],[13999,"168d41c7c490021722dd13fbf11bb0ee0df5a54f33788b81e2d56df79750f094",27.110012360939432],[7252,"2f0b803cf240a9d2a39b835f1aef03b26b6841a09c562406f22e413098625dd0",9.917710196779964],[13603,"08b6e94d13c85ade0299c5c0aadf9bc8346e9647cdc4216248a8eeb6c190569d",10.052724077328646],[4746,"9740f318c36f5f514dcade4c556d736c9292df248f2e5f1b92292373a5a0a9e0",19.771836007130126],[6211,"663b4c7d815abf5457ee9e31b92367299e149d0dadb1dc9f2c1c1a71819aacd7",9.917710196779964],[4562,"019b10e31d0c68481b7626771f1ed9b8338a44dbf29dfc210d3cc44bc048e7e1",9.317957166392093],[16625,"59bbee8a1df3add4e0501ca1fdb59d5761855a2662dc66f3e33335b7d65b4e5a",19.22902494331066],[3231,"88eca3f37df3edad49034c9738e13cc8a7784d32c6c3b74023396541ede2d2ea",9.917710196779964],[19519,"dc4cae556a68de69af00669ce5c5982bae768dfed6be756f0713746e65c8c90d",25.401769911504424],[191,"05188361e9fa94dd6581f71ef5bddf235ff288885cba31b6b9c5f4171d40bcfe",9.917710196779964],[13895,"913d102d419a04acf821fd8cabd4bef2568eba31677d55b8fdcef897fcd12497",25.848594087959626],[18418,"7a55df3df86d4c2212fc4993ed34d7239a79bcb994c9d63128d35227597a2d33",9.317957166392093],[13875,"bc3d709961fbcc06c43a4d2f5fd136f7b3a163e0382172b7e5ccda1adf5abe97",9.317957166392093],[5180,"d9dbbd602fc659e73b1fcad8d859b0865905d1b07b002c141d90ec3279ea15de",9.317957166392093],[17390,"6a4a1f9a22bad14838e30b120fd37693b18367812baed3e8216ab9fe75dff549",9.317957166392093],[6055,"05f6fd30bdd0854212fc5ac95405bf9b250494746b1960e993b0ec123a42bdd8",89.28571428571429],[548,"cd44b095fefe554694773c882618cbf65fee75505f19a3de8ee9b5ab4a0d4cfc",9.917710196779964],[16229,"41599e86778aea91396831a0aa37ad75186118c9b0c410ea457d9b5405ef1363",9.317957166392093],[3004,"34cb8bb49ba1bcee08481cf7f8de7f323cac06afc953c8cb777f55fb88e940ec",9.917710196779964],[16963,"9e2dcbba89dcddc81fae4f4cbe6e4823f62e50290ce7c1d73cfdcaae20efdc52",9.317957166392093],[11609,"cc7816d16c0529594964ece4ff55d8fc1f39af93f9bad7c4696d633a7ecfd8b3",9.917710196779964],[201,"34937abc3824df71fd392fb990ed2bbacb23281f975d3fdcbff3de9d5413a5fe",9.917710196779964],[4593,"06a9e4f5fcd76fdb0469a60f8476346ea44be003c0f7c592ed00c1928dcfa4e1",9.917710196779964],[16685,"fbf244515fa8ed1faa534bdd7716886fff2306341ef88428bcd72d51646cea58",9.317957166392093],[5014,"f5b9271067ed1724d6acaeee6e01d8e762188db79f97a28f154db53e03d712df",9.917710196779964],[1772,"d07b58f15302ba329fbcc7bc75b76bb3a03c2e9316d5d0d363e5e00dad5672f4",9.317957166392093],[8723,"56ab04b460531e264bcb47d8324bf28653269fc0ec5c7d74b552004ac6ea8cc6",9.917710196779964],[4732,"6014446934e84ba5c4861ecb4aa7c5d25f4f11183e268cf128584b0cba57cbe0",9.317957166392093],[6681,"b70545ed3df2796d572c95d3ef52df09c191ae4ed30a33bfbd229e6a3c4117d4",9.317957166392093],[6282,"45156529a3c80c1b11411121089c8b8a9fb635e6691f290cf1a93767dc1430d7",9.917710196779964],[10512,"ab4d8639326ba449fd757ea1827c74b46e9124f5a8144fb870755d5c368f19bb",9.917710196779964],[1793,"bdb44b121d5ad5c3f6d8cf7455a2446e8d3a66202737ee9bd57380f8177b47f4",9.917710196779964],[2351,"e5da18d40af1d01ba15d0876376deea865714219d8c684ee53b5afba5deabbf0",9.917710196779964],[14417,"8fe2a6d4c8edf4475eb94ee5c5633c0cc7dc1c9322bc3d7e6b625c9834e5108b",23.243856332703213],[9905,"ad5ca940fac8f034cb6130bb81d6c882a601aa3fd0e97a657d24b070f84aeabe",9.917710196779964],[13768,"ad12a527c331b259105e902c0d8846d4c01c0767abca18054bfdb66f60f4049a",10.053097345132743],[6052,"1f6a937c58ef9cc87f16ccd4d4cbbaf8aed420d63904b8bbab207a22ad07bfd8",9.917710196779964],[19493,"5236ca665425fc82368134ed445f9cfb48d02f63f1af5210d8d3272d6b4f890e",9.317957166392093],[1332,"2267ee29272f68359fa8848220e6de3879042680037525cbdceb5491089832f7",9.917710196779964],[10936,"b33c7a648dbdc87e237acae32bb537d4b1d684d43eb5d951ed48bac70c4d78b8",9.647446457990116],[14198,"0674f2e58ff346c7ce8c2ee3b2ea7b25febf159457e602162a555935cced4790",9.317957166392093],[3613,"3b5f4cf6410f52207fca976e9010f4140f557046ea92f8528323faa7cb6626e8",9.917710196779964],[13368,"f230d4821cbfab70629a32d253f12347c30d31fa353bd4f68996cd1f8ecd1ea3",9.317957166392093],[12661,"a10b393f3e43968103b94f70f0854799cf25b6527be89a902ef837b26816dbac",9.317957166392093],[15403,"ca4b6e3ae6c838c0f444d321febd06c597b70d08dc10f34c3c8930ffd4ab4276",14.958448753462603],[19378,"7f8ea2c819e2a3ac437dfd46886c1f05e383629a45286b509ebac4cb009ba912",40.649180327868855],[4278,"222f73474a65299865cc2771a1918b4625182077bcf7040c8bb8ba650ae0e9e3",9.917710196779964],[4606,"d258b3db10660d639ae4e9350d6467ff62ffc7f4177f09c01c800381b1b896e1",9.917710196779964],[13128,"013ab9f2be0d5808148e00ee3fba0c7b29a791e7e255b6a7fe5cdb684cbe6ea8",9.317957166392093],[10410,"2d3ab1739969de82d9db711ffae793401139cbe86a7ac2802991700e089dbbbb",9.917710196779964],[18906,"13be81db9519b30fd7a5b0b6e4eb00b59bdb06418cb24a8d2f459965e8cc2223",9.317957166392093],[2790,"f2dc4bdc403665167be5a6d5ba440f62b263833d0960e51f16e8643d48d9cbed",9.917710196779964],[4584,"a68e313b0ed5cb9960c15d90aab0901ec7a44eb8a8656d5ccb30b021f36fb5e1",9.917710196779964],[2982,"4b1fb4f0e1869e5c44b663760c1695d8bd8007b8496abf6e14383baf489164ec",9.917710196779964],[3451,"1c114dd82c533105302d033aaace89fff76291ff4dc1d738ac0de0ed55fd5be9",9.917710196779964],[2012,"aa3199dd5a6c7ee496d493efc4002c8364da18e015f54d7d45d8f2835264f1f2",9.317957166392093],[18188,"4f91293ffdff1f31145e6c2e304e3024442e0081b2801171baa7127589297f38",25.88235294117647],[9932,"17b0ec69d37d1b16c5d8a60f7a127d65d6a0c45e529e38c7a9c013f4e6cdc3be",9.917710196779964],[852,"e7cd60c25a365622a4d864dc26e742384bfcfd60f817f89623d37c3557ee3afa",9.917710196779964],[4303,"0503f7138627fbd540563e34c732c4430f5c8ec81f6ded11bbf267f48891b7e3",9.917710196779964],[2447,"8fec21801a18d49b15a1d418baf4491bb624c58278e26fcdd8326c5081b634f0",9.917710196779964],[873,"5ed9dff1950cf3abfc1fedd1ad20fd1c01bce4a70fd4db3bebc62515382712fa",9.317957166392093],[188,"bea5901e909391978c16fb83af1ad8349140bb96ca9b59da89bf8c0bb607c2fe",9.917710196779964],[13538,"68499523552fdfa8d156cf755412a4d130c57ab7cdd8ea70ed346dd5fdba049f",9.317957166392093],[14490,"2f0f67c8d1f5ff5e13cc9504f41c6c331d04b6dec88ec078ea55de9370e36d89",9.317957166392093],[18700,"32818d22cfd638a1f72ce9ebf15426080220981b30b1f4c3e875a326c57a552a",9.317957166392093],[16155,"99ad172933f8b998cf4c1217d2ae88510cdc8ba692e113eb16a3ce3879a5f364",9.317957166392093],[5876,"c1c87e528d108273ae66e7dc2d908b1c98d5f78e27d219ed9675310d1566d3d9",9.917710196779964],[7718,"b97e2fc47cb09aa6569e4016c80ae8f5c9f604a0d9843a4ad3275b8931ad67cd",9.917710196779964],[13403,"05d2579a023d8eb0ae4bf16b08dc9ca5c3e0bb3bb73ba7ead8bf53a84bd930a2",31.20366132723112],[12575,"8a0791fa4b08588c8548c48210b9fcfb2e9180e41397c7b58b2cbb1a5a456aad",9.917710196779964],[3527,"58410d5da22b2223a200f2ea4451fc8e390de43c3b54c0abad6abb8302abc5e8",9.917710196779964],[9169,"9ec853efdbd09721f5246abd9051b33f279cabbd8a9693d5977f378fe54db7c3",9.917710196779964],[11322,"ea9c50dc8b7e03a3b6e8b1fbd48210a02b479929a6b6fd3360684de2ddb0d9b5",9.917710196779964],[10222,"ef370063e863529b334dad20ce368970568d70aab7d1747a6abfa20d8da0d1bc",9.917710196779964],[11851,"47f2f7f86152aeed1cfa1580fae103bdecbb31548cd28d2c7609a7aa09475cb2",9.647446457990116],[7331,"8c027e75ea75f6b50b64365657279570e73f69bed5ed8ef857c3d0161489d8cf",9.917710196779964],[4854,"9541f190bebdd6f36b3e454a90d3459dcb1bd788c0a4128eca220086a0f41ee0",9.917710196779964],[1212,"6c81f7767bb1c6a5467e9d188e3a8562f1b3b3b907e81be636500c0575cff0f7",9.917710196779964],[13843,"18e01078cd0aa55feef22ca7cd5ac0f8790d3bc56dd8a8e9e87dd26f258e7998",9.317957166392093],[10736,"34b20bb063d3d4ea2486c1ab1f90016f1d155e9cf8bc1b5cb953ac513fc0c3b9",9.917710196779964],[116,"b8297ac9cc7e8a5418af8d0f39b2d010294afcbff2d3d664bde2afb442e647ff",9.917710196779964],[1722,"08cb2c2f470fae4bd7aa5e3a573159d5bedd79d1828fcb80851801cc15d3c7f4",9.917710196779964],[6458,"34bcbce99c93370cf7c98477c2dbd0285eb237587e437aba66b784f01c5ad4d5",10.052724077328646],[18254,"058bc6cc5f81ce2fcd25b7f47e17e09a042a499542c05967acd992126b04fa36",17.101659751037346],[2292,"010e98975c560c9e941cbd6af9fce82c18b9985f46e150064d8004a328fc0cf1",9.917710196779964],[8641,"23ef4044431e75dfabcfe96d07f1952754e27b85866a0f2e2b6b170c12ce26c7",9.317957166392093],[1552,"1f2a1943902d99bf2db0946b04200d14b7b62f4d745e1ae90748037112cdd2f5",9.917710196779964],[18343,"0d01cfe471c2686e081c2a20195f8d33d2f110314cb681314d6021f3ff65ec34",9.317957166392093],[11568,"0f7da2506316bdbf9a70855cc38ce72a09211e9423db49ed22e009796a0423b4",9.917710196779964],[6973,"6fc29d8da95f20a44b24bc7af785741514a26fb77bce845c6b95ae8bd65c26d2",9.917710196779964],[3544,"eac8a54bf136fd09a2268bf480014d01802e76ca218bfc7d95108309c2cea2e8",9.917710196779964],[3518,"a8197a8a66a7600e01a0979a2fccc8e5c7baa0cdc9f7b62db3eb8c9baa1adfe8",9.917710196779964],[13054,"3daa1d06586f46c7e364e2d60c882a6a03077025881240a119f41c0ccd8e40aa",9.917710196779964],[4966,"c33440d77ad7639f802e4a266540db6e1480cdcbdd33e17f3fce3598aa6369df",10.052724077328646],[13609,"1e0bb3f8db6f80363bb2c616c22685201b9be6ac85ae573deb4c9c360792429d",9.647446457990116],[9383,"3118b5903ecbfbfb90216a80462ba2e5b2b46574462c83abf8b46a948c5a5dc2",9.917710196779964],[13531,"eda02cebfb10f5e258ed55438b6f6ad5d909b2d874be9ab89e987ba37421309f",10.040705563093622],[1873,"1294710ed8408400d227535cd2b3faa3824647ba8c4e7a717be274ac0ae0cbf3",9.917710196779964],[14935,"bc6f1d2121e078f93f263c06f565e4f3addf4ed0cde448caf5f5ea569ae01a80",9.317957166392093],[11651,"3bf9d5c1bbb72c3ec682b8106890ab101ee4439701a2860285718382d4369ab3",9.317957166392093],[15468,"c8c20aa1d1e5bb255fdf9bd8005afa9d5bbd38598e06d38436ca8a528c18d274",9.317957166392093],[18030,"277b54fbe3e69e39354d39f8c2fa123654cd8f081fc156f561cfda60aec7b93c",9.317957166392093],[11641,"700eedf92a567f58460b8832496e8c15b78789659724740aff5da1992fe0a9b3",9.917710196779964],[4533,"3da3226e0d4db487286e8913bf1e9735daa76ca238b679aa58efa162d30f25e2",9.317957166392093],[12706,"a92fab7f33cb9e8eb0b6d31e47e6622b7bc91724534141aeae3df79db8d990ac",10.052724077328646],[13497,"d84a2d65b5ae66bbe19b7684dd947f1f3d2c0fd2467fa45557a5af4aebdcda9f",9.317957166392093],[10174,"5eafd0da3d554cce80f5bbc5c476eb78f98ce2126a374f85b90481a934be37bd",9.917710196779964],[19693,"3a6f7ba806d28038c448494a98266cdff77b1644f96509b875b8177affe00c07",9.317957166392093],[15934,"69ba569e1fc62a889ecf256f28fae5d762b91c7e02906f08db893d325f46536a",9.317957166392093],[13751,"e84845592cbd07a357aafba30f819cd18d300088fc12924df87562673fa76d9a",9.317957166392093],[13504,"58f7ceddc53fcaab1d713ef2d27e37565b36d0676b69a1bae8872a8df608ba9f",9.647446457990116],[2725,"5a7f3d59c9f5ab66fce060c4daec0eedc22e133e81ea7ffe165371b7bf8a3fee",9.917710196779964],[8917,"51379a33f756353ebf14e9fe50b1719637feb9b3e2dcbd0dea84d0736ff35cc5",9.917710196779964],[381,"df441ddcd0738b2d16a42c0c01f4af9293b498b168fc8751bbb52dbb83987bfd",9.917710196779964],[10607,"8760e7577350f28cb9926be02ec346bedbaba5a196ed6896da93ffe034ca9cba",9.917710196779964],[11899,"db0dc8bbf1adf2b07c93244e96934475ef12b3511a326f9be8580c8565290ab2",9.317957166392093],[3185,"ac873a0c72152ba357e5488d26704b5d9b78d4d3aa6bcd1117ec8c73c39e1deb",9.917710196779964],[18209,"d4f2b080c9d5f2973b10ed1137b081fbcd9995a2d8b03cbb9412e00b0f0dda37",9.317957166392093],[1464,"707bcce287e9614fc84e9c25f8bf84cc6c7a2d60a2674b172929946fcbf266f6",9.917710196779964],[5417,"f170844e838f00f86f1bd1d251f9bf626d61159e480f20d457f30dac7acbb2dc",9.917710196779964],[7974,"fa80e943fd72e3fe0734e40b480e4e9f4ec24f5bb8cfa5f61d5ac51d9c22b3cb",9.917710196779964],[14133,"8769a5aada17b59f1b9541a5759973988e08317f03b1d5319664b32538d4dc91",9.317957166392093],[7838,"88c15d7248b3a3bf5f6f18dcd6a5be70db05edb87d5aa13d770539e0a6f38fcc",9.917710196779964],[1815,"8a4abf4fe13aae0f899c451b59e0e333b0d1473f6ff10daf2e82f598106e23f4",9.917710196779964],[10294,"4b19444aa6435705f18f24ceffb8338b2b9461f8de29527c43acfab270a267bc",28.14867256637168],[13681,"65d38dd3fb8469001d030a9cd732f0284e00ccaca4ed9f2ee25eab92ad279a9b",9.647446457990116],[2648,"e5f67924ce9cf506f685fd8210e2ebdc5ffd91c0cecb98d32f4d45db57cddaee",9.917710196779964],[11946,"a939979088d5a614973977a3545f5e5465e618d5261c163e081c944d1195adb1",9.917710196779964],[7203,"f00bdae4de115fee637993a8fe24703f4fc591e39b16776d9004104ddf8fb2d0",9.917710196779964],[18227,"00ba7dfc59be97fa30c92d7e18f9519ba9bd62545267a4e49903be8398ee6f37",9.317957166392093],[1942,"a61bbc4400ad666cd2093bdf77412b858bf3d258754fc7f35886488792e16cf3",9.317957166392093],[15004,"5aa7bc9b4d01d0d1798218a20701608cf307667f6db2f9b6fa94e64284304a7e",26.138053097345132],[5413,"78c6537e3d33cadcebd99a37145ed5ed6bf0751ee04a191145a5fb08df39bddc",26.09252669039146],[19112,"2271e21e72edd60707ecd33f320645b131aa26506e62304b05cae8e2839ad51b",9.647446457990116],[10097,"dd329076738d7f8f3eaa877ed5d2d2161189abd3dbc488bcbafa955e2806bbbd",9.917710196779964],[5906,"3ba2ad5454357e8265ffb860e3e1a3a6942c8e4f8fdd461e76e6471585a5a6d9",9.917710196779964],[12698,"a2aab79971e1d741c6e5b83e217ee88321e4b3ee83d18f633ac1a542581c99ac",9.917710196779964],[18699,"55d8b166f763e6e559dee29b546d3ca30e8c469afadede2966eaa8da6e09592a",9.317957166392093],[15551,"c1728a3ae91d07185aa97df81051a0a1d13e17745158f4f43323fce369d2cc72",9.317957166392093],[14110,"c6ad70374976106bdb3979c39fa505e3e3c9a90bc097f729f82d3430752d5692",9.317957166392093],[11391,"440bac90f8a1d3fcb008226feb2edd54217b528543e5a0f6c8030d855d3f68b5",9.917710196779964],[12008,"f0ab353da635060e6cfd2991745cc1aacd9a64074dadba62f4590bee643145b1",9.917710196779964],[8450,"edb5fdbd342a6ed739df1633c20feb782b1ba1281d8af091142ad6a8984f52c8",9.317957166392093],[7386,"78253f57df9b453fea3a828e22a90912e4f386388f4b2e4a932ae5d54d9a80cf",9.317957166392093],[5230,"1e0e631e205d4fcdf3ea3a9aa523f1e670e94ed3726d058269789c9cf6bbcddd",9.917710196779964],[18867,"a21a758f6c5b87abcdf1ee51f91c88779f6d513b1538fe3cbf976d7ea90a7b24",10.052724077328646],[18619,"839f83940796565c0fef8c484a7c38178b43b047d35414f6f75c8aa69b2e302e",10.052724077328646],[17600,"f7680d053aa0f85ef4e47c20f54c2c08689b9c7981e85b53c7b404ec52db0d45",9.317957166392093],[14136,"53976f6906b8d9df7d24a7582720bdb1c30f37c454b7fb27c55935600fb1c491",9.317957166392093],[13431,"fe21dc233a6c9c52642beb51e3364fcfc4168a76bb312be5154149006836cda1",9.317957166392093],[341,"e060cd25a48ef8a59ce553b3bb1edf1ef80d6e29f71445163276152ab938c2fd",9.317957166392093],[17408,"500f51d255ff26309745a1ad633bea3a5f01b6ffae7321d84bac94a7f1baa349",9.711670480549198],[12264,"4bbebe2bcf1dfd4b86e71fbe93eb5d2ef510ad8990434ff9fe3e8135d8fd96af",9.647446457990116],[15986,"4d6a19f60b01647d883ce0a485bdc21e7b24ad0b313228b6c759c0105e28b968",9.317957166392093],[13979,"a3b96ec2f5acba4e56056c06da773c36e0bf4bf9500b70c2196775f08ab86f95",9.317957166392093],[6426,"df301c6c66718eeb4e0a689b42f0374eeea6eb27e0c9eeef0adc565a38ab18d6",9.317957166392093],[18001,"760f63e648547d04c26faa84576524eafca6f0c5a973cf1f7319aa4fe706403d",28.90391459074733],[17650,"72c5770c6d46ee91b97d6a2c2023445fae81e36d27e6177b476a583c29bb3c44",9.647446457990116],[10910,"958164799a6d80ed1420f79e63955ccaaa6f93071a86dfa7b05ec3cdbed69cb8",9.917710196779964],[7082,"37588e76407448ad2503d0df10f47d2ccb1f19fe441e945ef41042badf6472d1",9.317957166392093],[2568,"33118e7f496d4b4f06499fc01422babb000f3663c8c8d00a7825f0ff7f2971ef",9.917710196779964],[1341,"d49ed5dcf18c0dd863fe9b3b115290afd2ce29afe6c1963ddf7b5c5f1c0a23f7",9.317957166392093],[9327,"a8ce4ded15c72d5e08cb6309991fe3f71f761190acee6dff94a32947772fb9c2",9.917710196779964],[5805,"ad3acdaaa788c42ee26239f213950fd57f0bbb802673f15a1d181ceb0d1860da",9.917710196779964],[5372,"de62d03159c229dadd900d93244e8c51e5c41596ee31b612207b6d77e86907dd",9.917710196779964],[9894,"feb8654bc32164399465b89377d3b7c84513cad37eea23f6657c585465d8f6be",9.917710196779964],[7299,"7ee6ba41fbe64299709bc28e48a091a69da0d77a17d5c1fd4702ce8b384215d0",9.917710196779964],[3278,"459213ea5e6758d23d8ea87c1721e195dea05c3f2202536187604876b8b88aea",9.917710196779964],[8464,"d34b032d76dcf8f29b5a7ad1baf9a36ac174add700bab0fbd11a31d948a43dc8",9.917710196779964],[4203,"07b9b87af585acead0013c0b0ab71f8a665a71ab5e9047a5065e3a8e8fbe66e4",9.917710196779964],[4064,"62c4e1e977bca274b9e3dcfab98e428037512b3a6eaa7aaa2347d18d805757e5",9.917710196779964],[4241,"8fa0b973d508c79187c30dba2bbcf981eb1aff7ecb70a85d177c38097df72be4",9.917710196779964],[18468,"60c93972eba0e3c49f90faf90570712e08fb4da0c6948e5d65260a7c9ec43f32",9.647446457990116],[18785,"eddab60421cb60ed285bd60ed8bca761cb6075c8252259aa3dab17dcc3ee9127",9.317957166392093],[10163,"1fba6ace2c561660fa73c6189db36486c08139c5666e50a74bdf164d834c51bd",9.917710196779964],[5531,"ef896a057df4fbb899e711959bfbff4c0cee468c29ffbcdf7298a50b8e6307dc",9.917710196779964],[4967,"f36fe351d56e0aa6702ad9b13db13005877e41adadc75e1e5910850f0a9f68df",9.917710196779964],[15337,"d2d381da792616c0d6fbb080e551fb2bb656a3c61fa56211ffcf0bc71e87a377",9.317957166392093],[12590,"1e42c55cde41f5db19dce1a904a8d722e51c0975de11053384f051f6552450ad",9.317957166392093],[240,"df721ed8033bdbc393829f2313efb2f0f36d9aec3142b3e4f9c9239cee3c5efe",9.917710196779964],[11565,"48a6e1292b16f6032c6085f6d8bbcc9486e17aea825547e2d1209c8735e925b4",9.317957166392093],[3479,"6d12804f40236d9fb61de9f58d86bafd7d623cf126499ef88fe9dcd36d2930e9",9.917710196779964],[4946,"a63eb7ddbc57a72b94c5d6f7cb95e8d4985e8ce1f22d704ae48553e67f5b8edf",9.917710196779964],[19275,"bb821a837a17e44de9462eea6e35275949fd0d9ccc4b1a27710b5d5d559ecb15",9.317957166392093],[12108,"2caf7067333f6f08f8462c538cc61bf10781fa8c32c09ee65cab78fca08babb0",9.917710196779964],[14291,"3c8a5e22582bb3f63617cfdf52bdab90ca5990d7b54424033904e2ca218de68d",9.647446457990116],[3560,"22300449a27841a80f24e9c7a91158e32109b8972166f92986cbe1de120b88e8",9.317957166392093],[14205,"e2a4f17269a3775c4e6da275611717ed983bec73952f9c10648ac0cea1c21a90",9.317957166392093],[1878,"80290a1657061fd9be3e8b72d8d11844b22e1f0a5e515d267bac9133d2fdc6f3",9.917710196779964],[2171,"6be34dcc7e56e4738324e797259b7dd292f96a42a92f1dea2ea5aa25a765c9f1",9.917710196779964],[17054,"1794a7ed7ec8218ae132ec677bfbc1b8147f3d8a2181b8000ac1d5cfeb990651",28.19047619047619],[5247,"53b99ac07bcd995c8afa7e3207a0a77ee65d183ee4c3b6359093a9750393b5dd",9.917710196779964],[7418,"ae895aaf9c52b6b36a3b4b8f1746b7025a8acbeb5ceacd86633fb9f5dc9546cf",9.917710196779964],[2983,"0ed5a9ea72e04e4081aa3dcca2546e3cbde250bd45ca506d483705253b4d64ec",9.917710196779964],[3068,"3ecfa634830eaaa78178631b73e01e71b7e9587d8fbbe10557ece8020f18e0eb",9.917710196779964],[11148,"b2d7c0c7d5a2cf332ae3c3895334bf42476134d0c16b6e706cb8153c8209f8b6",9.917710196779964],[6561,"600251967ed9c376e1977dcae757d1d9ce8af7ead564cc33fdbee3700f78f1d4",9.917710196779964],[59,"211855bb4cf3a238901a3656e2d98546bafe1fa1f6a3676f892e24837cb495ff",9.647446457990116],[6139,"43ea698d8edb2fdf214657b00cea3c39352f70e13f2a7637f095b401e8f937d8",9.917710196779964],[6106,"65fbd3e6a8b8e8d2e6abf48518e2d639682c56274312d36f1596e70d40fd64d8",9.317957166392093],[16941,"bb9549382977dd2ee9a2a46e1431edbd3a7b3c58d3028b3c985f872be0874e53",10.052724077328646],[1532,"f538c529eeafae2265b86cd8811bdd4452214294ee0fb76d67c7723a30c0ecf5",9.917710196779964],[18539,"fd85cb6ade62fad91b971138b0af016eb84e197d2416f0ecf8e2e7600a17bb30",9.317957166392093],[13459,"1b52581bcc85635dd53666af9e81f30ca785f256c6306e5adfa298f06c21daa0",9.497326203208557],[18047,"6f2bb26a4ebb0c3a912d7533cd37672df0d8b6ddb02aa7efaa444a290a1a613c",94.5903890160183],[15805,"c9cb79232ddd16c3739da9738c3d62bdcae42f77bd4f2c020b64b82524b5456d",9.317957166392093],[10587,"855436dc1f6cd5e36541a0f4dab0e4b2f6cef84032bbd68db6f66e60a83eb5ba",9.317957166392093],[9453,"73b3b3c621fb9845d9f48eae17b45d753d84b6687c30948ba2f0469e3d60ffc1",9.917710196779964],[13002,"159c77a7d08165f51186b73118f318f162c82887c5cd333514158d4461fb96aa",9.917710196779964],[6148,"72f48e53b6146a88ae2c015086b1005e736dea301b4ef4f428ad7483b92726d8",23.12041884816754],[12795,"3e13c7e94c2a7b90ed2fa526352883048e210b938ecbc02ba4ab9d088288f1ab",9.917710196779964],[1055,"827d2db41c50bd8402942da7a8177c268804d2050eb6a28fce52c8b4593ce5f8",9.317957166392093],[13330,"76e9ca671cbcdc552d33223cb6ad21db6dd162283959027d45788246416c0ea4",9.317957166392093],[8458,"d8db85c57b1207d9c3435f1eee717239eb778ef2b10e7ae202d008a34f5344c8",9.917710196779964],[7491,"e3efa43b8595b4838411ec95bdc50bba010f47bb972468080c13a576ba4ec8ce",9.917710196779964],[11777,"dcf5599795fb4a53e733e4c237d32dd55ff32134c69807639536856e5994dab2",9.317957166392093],[1391,"a7cec88ba1631607e410d2201a4755df884b63744913fccb54e6dc985076d5f6",9.917710196779964],[13588,"d503df3bfdaad499cd8258832f088e31df7ac1069199effbcbe1aadcf0e9c29d",9.317957166392093],[6081,"b35156c623387720270f95f1c591bae6d9e392c33c7ca3dae8fd18799e1b80d8",10.052724077328646],[11407,"0afbf0cda799f6e541f0816a37e426024bf7541025554b1f4590bc5d3c084fb5",9.317957166392093],[17198,"741df8055f7185d1064b469cc7e4339c6d5efdb3be5a8fe1dccba52192d6c84d",9.317957166392093],[4529,"ec15cd4a0e989af030f08b009a901af190c9b89a51bbbda8bcdc632fb3ef29e2",10.045662100456621],[18666,"22ff301152e319c7f8f6e6cd47c092531e31073c8801932d7fc3e7caf36c032c",9.741496598639456],[281,"6924380c929e0dbc53dcb5746748c5805b3f16fe3e8694dbb13cdf98ed1211fe",9.317957166392093],[17640,"15e6371087e5684c14a65f80f516e2b0351de3013cf4e860b19bdf41b5f66144",27.159763313609467],[13719,"260a5d6852d32f6054d22e2502a3b3037a26ab6bf925259cffb2ac12a8d0f79a",9.317957166392093],[3965,"ba5e5b948b0d1fafed474c6171f00ed5609a95485d2cfb37256a83026b61f4e5",9.917710196779964],[10296,"19ce5b335684e7efe1ccf2d390d231d06e2ac9841b89b7a4da26c527734f65bc",9.917710196779964],[8545,"8dcc133750eef368064f303087ec6b77801675957727207f9b1b9d59767ac3c7",28.098939929328623],[15877,"6561edd6c4554a8faee430862febfd53ae50e732dac04222ad47c0dfe199786b",9.317957166392093],[19766,"459caec44c2742219dae70a481a0c104d5f1afebb64ac3c7e2351bb2c3c5dd03",9.317957166392093],[15789,"5d53bc41c0e2e2920051f19205f95a6cd879c565b4bf4eefae4033a29d1c8c6d",9.317957166392093],[6463,"27f7366192f59bf9014fc2748377a831bcbecfc4e455daafc02edb9989abbbd5",9.917710196779964],[1564,"c8e50f9be1c6da5f8da32ac447ff7cea14c1f6ebe38e6122992b35b08c52baf5",9.317957166392093],[939,"53270d6be8a7e8e0d516f8e5c2dfa715eef4678372ef2b806c1dc92f7e6891f9",9.917710196779964],[16031,"9d401655eff3d7e883c5add5c78931fed58d7cdc5582fa8688f110e8949ee467",9.317957166392093],[1029,"99e09dee667867d7d7fdb7f2076cc0ffb7a1ad05d1258a48118455a008aa12f9",9.917710196779964],[14257,"494b7a0daaca5ebc77c5fcb7650bd643646d2166ff1054bde80becd04830b18e",9.317957166392093],[19673,"ab878dcdce1ad5b7d10b48a2a96ab68210597b7137e29d1b7984a2cf0d457607",9.317957166392093],[8645,"3e91a7c5f520394d33911455f7b9d46d2d1ee88afa6c608499756840954117c7",9.917710196779964],[2475,"ba44cc12e7cc55e7a3acaf8d5c2a5a8d73dab0d52b8a47d69f76ab69e57a08f0",9.917710196779964],[1860,"14ad8ed51b363a2aa289b1dc5a5ec0c2ebcef3f3acde6254d1b55b30c2f5def3",9.317957166392093],[17636,"20e01545e0ccc3670f076848d12cf6317acad53a572f1123152dfa29971c7f44",9.317957166392093],[5055,"023d0e5000b6e78790ce8e59dbd6f7651ddc15c090256b83b7b55e78887ccede",9.917710196779964],[12741,"53e4d9c6801858c0c9c40ea1abf67d8eeebfbb1158b96f00ea36a50b3bb14eac",9.917710196779964],[7459,"9ed734ea24f5160cbff68ae3b858f80cd8ad0ee3a05a34bd62585813c20806cf",9.917710196779964],[17730,"75996a0c327bf9733b369f0d7e6c25028d7c34b4083c10109b07afe06e3da142",9.317957166392093],[10128,"c523dc14dddc959adbadd089d3f7f409eb0926368c909d90c86c0435141f81bd",9.317957166392093],[10041,"558ae41e11486eb7697ad1ff358eabd2ad6afdc424adfda553844dd9672a16be",9.917710196779964],[4422,"bb07241e5a56e40dca71f68a9d9bc674b29729b5ced057410d3e5536ef3cf2e2",9.917710196779964],[12789,"dcacdea5e6a02572caf749582543da6f4f3fe82169268082ee62ca9c7acef8ab",9.917710196779964],[9221,"9e41cf5af6b876ecb89cd136f3758586603882c293072afeb18d8701e55156c3",9.317957166392093],[13942,"26226b7252a0d7b05e185e649be11d390d83b10d6a3fa3245b5fc5962d722996",9.317957166392093],[703,"71f1f66afd8441dcc9b9b9acf3a58ce24010ed063dcdcee674f3e83ea7f639fb",9.647446457990116],[12144,"06381f0809a09538838f2a76776d89d84803d86945f23da5339da76605e063b0",9.317957166392093],[4346,"5c41dd2d685fa943fe2491ef4319e217d574cdc92fba98f5367beb58c9436fe3",9.917710196779964],[17053,"7d81f929e9897b2e5348b24597bb733c1efe189971f23510e983120d15760a51",46.3458110516934],[16195,"0d7a7f86c7e0c9a7896b2bec0a74c5a4ed9fe506cf2ac0954e973ec171c81a64",9.317957166392093],[15888,"db2430484956c8da0a911b666517dc4693fb23a944ad5b926d9a0ae8acc13b6b",28.066193853427897],[10903,"2d3d5735d04d39827e5b3c987a5b48e0dfa5dc2d6a421c22423809043f7aaab8",9.317957166392093],[1205,"dfc44c1bf45997e8252fede19caeaa3905619eda46b9ce0388963e0fc3dafbf7",9.917710196779964],[14329,"41f29489e3d3e835e7aadf5fd49fecbcbce612094f142cf790e72c74b7d5bc8c",9.317957166392093],[14793,"7c0f36ec2037ff6247485afc8fb5f933c85f9f9637090f54d6742cbcacaf1783",9.317957166392093],[733,"9481fbe1d1325f939eec7513f282c9a6dda982d6026b71df90a00b7d378502fb",9.917710196779964],[17886,"1fa6dd243cf2383279ff1d8b8fa22217231848c40bfe03768273dd09677b873f",9.647446457990116],[5408,"302254fd077a25cc1ae15e1d634e94816134110cb5b409045ae94d7d473fc0dc",9.317957166392093],[8832,"8e86066e6aeb3f8dd73eac45c2ad7d7dfe7a9d971f2299583c3f08d9d1f0e7c5",9.647446457990116],[11228,"ccb5a5f769de81490baff7ccb8f65cfd4df0a39f56e6d97670f78164e91285b6",9.917710196779964],[15137,"5499a8a738d01438a1e058701da936f1b6390350f548b967fcd5d414c66de87b",34.44839857651245],[13555,"4bda618d6b6e881d746f8d8868729a98a0a257da14aec4a8d628d70e94c7a59e",9.317957166392093],[19252,"e5972aa14c0966b9f1ce67c5f4e811d9b2de7687cb7271366f5f444e536e7a16",9.317957166392093],[2631,"2835ca8d3b98de2a0ba8f71eac0832a7af16b5e4ba1441b7de7c4ded0534fbee",9.917710196779964],[10358,"8564d964f091786a4662232be046d3bfbd4bc34fd4800877dde14a56bc4803bc",9.917710196779964],[4644,"2c5d2038a2f03d3b0fdd90dea28d630dd085f68084b1c65cb21d96deb52559e1",9.917710196779964],[3562,"ac18f8fb6fa53e94a3d84dd8faca1d214bda4a0d058782b4eae85251299885e8",9.917710196779964],[19653,"6ef769bed1da4637e6f74a5ae1b04d864cec0274ef519cfd1839cabbdd8f0d08",9.317957166392093],[6967,"3d2d3d4fd103c06720f6e80df5e424c59300f268954280ac1fb00172bb082fd2",9.917710196779964],[15051,"3476cf95cbc4d4b7baabd1c711c3ca5312d7c6640001a204e81f2bb75bf07f7d",9.317957166392093],[19538,"64c6947011f46622d169f492563de90094f07c314aa324604b961ae311342f0d",20.060913705583758],[6214,"d6d4e9d55ea66660022a73d36b4d57eb4ef765bc96a8c022e6be16999c8ba9d7",10.044213263979193],[15034,"e52fdb9abf66d31621af65d7c8618d7d2cd0cf6f5424b5b1b1f0060c0d67c37d",9.317957166392093],[2589,"261feefbce573f22170ba92ec1604b50a499dda7bc758c71a33cb80be0e238ef",9.317957166392093],[10881,"3220ef96b53192796dea2b7b6909fd963d3083208a695aa2fc52652f9c46c3b8",9.917710196779964],[1421,"2de9927e195cc7c463d20d4ef8d3f9ab2622db2d9cde514bc39c1cd487f5b4f6",9.317957166392093],[11848,"d6eee8b8ae3e7fbd576c89691fa45a1feee8ffa46570c3fea1b814325f4f61b2",9.917710196779964],[9428,"e043dfe10f1b859feecead5913e2b0a329019f8bbf51a60b06552b7f79152ac2",9.917710196779964],[6138,"a9bebe5b2a164768fa7c3e0849f7bb7b18773f9f4af826bdb2593ae6bd0f3bd8",9.917710196779964],[5597,"b568c8353dc5448846e702c19d3e8b2a0d1d4c6890a729ad1fe7bc226e55a5db",9.917710196779964],[7775,"6484bf236daf89d38b999a07756a655384776459a2b001a2f04e63c29b31f8cc",9.917710196779964],[8611,"88650a589f057cc544a4b1a9d0b1bd048c26f0d19fe36d318020793217755ac7",9.317957166392093],[12132,"d7955ef0ea6627950dfcd3bb43e2ea5a7170c03bc2b69b74873f27378c9b7bb0",9.917710196779964],[2986,"12e144dcc913457505f1394dda09c0feb377bf25356a6c7f1e94af9c08075dec",9.317957166392093],[2148,"0d922fa25d680a3fb1f498797de5304e522aa24b52f8b7b0781d52f8ea6aebf1",9.917710196779964],[3622,"3a21351368676ef95b0078b94599da4ac59519b7671f07109ebbc217361c19e8",9.917710196779964],[13985,"1145edf3929bf9d45df8d7926459c5673bc93e402ac9732b07d417bbb1694595",9.317957166392093],[3007,"21fd65dacca0321b9161979164b4d991c65d0d98cd44a97bc9f54f8cb3673fec",9.917710196779964],[1721,"318756293c16378a62586374795061927f2ba0dfac8f425caf688d884047c9f4",9.317957166392093],[19691,"ff0bb751a4cb23e15344f6dbf6cd5650cc24209a7a0140c738244f6ac8831307",9.647446457990116],[18753,"d55d4a2e92e3c870e4a9999ba32ef6e4434238417e39bd52bc4bf09cb84d7328",26.15481832543444],[6015,"60f7222ddba443cb9f5d2de012f2296071a8ae06392347f2c04214bc27faf6d8",9.917710196779964],[6114,"989faa0bcfdd83eba03902117ff908dd96c3c17d10e0e853b3d2fee51fb753d8",9.917710196779964],[13331,"5096f946964ccf8c286f0fb0f900a9ec04c224c141456706e5491f356dba06a4",9.317957166392093],[14114,"be36b9810f98d86ec07985c4b780c9a687f8849c5487f926c2847fb1fbaa3d92",10.052724077328646],[5229,"b8b988d1f06eb1c89e136e3aee74865c46d582a44d48076a450b2fecfeb5cedd",9.917710196779964],[11945,"f8f81d67afa4646f4d490ecb09b46658b28f84f6261fa47806957d7af1feaeb1",9.917710196779964],[3611,"e57880e9749ac6f82f80d8baa739e3dca3d80fb251ad6c2217d14845b42a27e8",9.917710196779964],[16051,"4770866b8bd8fd3ea1f11d6e6c955843fcd037746ec694d44670b33c822f6167",9.317957166392093],[8524,"18dde83c55af7b1416d7b1b4e9c2afd6a7ebb7dd8214669b235864e2021addc7",9.917710196779964],[13124,"9477265d651f4df944c29f0135ca32473c774b221fe54bed1444a42ca9957ca8",9.317957166392093],[15064,"21513f5f4609fee77fa36af1dc4fb5f4320c5b503db423756f26d450f542527d",9.317957166392093],[6294,"3b16e434e9acd99846ed898cb85f428e154ccc369ab2678a8e5fb3f072a714d7",9.917710196779964],[4292,"9f5de699c19f0c8c83ed861e7c975c095f3b71280843853a398216582346d2e3",9.917710196779964],[2082,"38a2e4bea00d3776d5c9dfb7bf85ff64a51b7e9c01f996424f597c6fec0c5bf2",9.317957166392093],[11384,"465d8873621897d0771c3ff0e2fe9f424d28fee07dced5c89d0781e3cc787cb5",9.317957166392093],[9051,"f91882430900493a7ecaaf6933f65c2da12716565258b9bb14a2920dbe0473c4",9.917710196779964],[11176,"f4e195dc2d0a295443a6e8e23bd89003cfba62763b7c0b8446cd0e7adc44d3b6",9.317957166392093],[9306,"81b9ed61d243968b234c9e1356338327bd4361fc0db14a71d37aceb51608cec2",9.917710196779964],[16501,"6e58ecdea3431b39930ee8fff8859f27718dd90547c492123330e94fd1d1335d",9.317957166392093],[10269,"098a41e6a200bc2415d7fdb05eeeaab711048665e2e4f9299076aa67e92a9bbc",77.00444444444445],[5015,"870924cc5bd9b536540f069ccf10f2a9bc0949156bd6d082da06c499e6fe10df",9.917710196779964],[18934,"351f49c115013dabfaddf099876eb9066102fd37bf311c02837912c745bc7a22",9.647446457990116],[9464,"c110f85ce1a8548edfaca6886522bf3b8974076fa32ae426a0543df27321f2c1",9.917710196779964],[15280,"d9d1e5a2a39b7e315d212e4cfe8265bd92c139dd857f32e64ea391aad5fec878",9.317957166392093],[19311,"490cbec90dedf9cdb34648acc8a04d41658ba56e170a21253c633f0afbe79714",9.326968973747016],[18058,"1f478ee0804a69ec434c6a4cbd52d06edd71f60467c70064ac10afc5103f093c",9.317957166392093],[12477,"2a3b87b8aa7fe6f0d7a185deabacdab1f14306a751bf4ce3721ffecf28f512ae",9.317957166392093],[12745,"20b5f0dc8cb8e64b580b4d18b6aec5a0b91f7122edd82e33c6c1a1e903b345ac",9.917710196779964],[5514,"47364a9dcceac9f12056433a964080514aa12912015b846225b30b564f5726dc",9.317957166392093],[16199,"c7ef6dd4b6f4b22795ef8ca87f61af997fca145764f69d986d4fa181e1870664",9.317957166392093],[12536,"aaac08afecb59cbce554cc7473bdefa8cf641fec78be1e809f508320b36eb1ad",9.917710196779964],[15980,"17291ccfb4cd8d4da1259f3de269cbfa207cbd241d1e9a137a2137ba4a13f368",10.052724077328646],[9612,"56269a16b69bbc82047148609ce092e16c07f683f73763a56fe44ba41ffcf9c0",9.917710196779964],[8182,"881104aa0b886be4e96fceb9e4f6733a248458b4e8f82b57ba8924a9aae119ca",9.917710196779964],[8176,"5b92684cd31713603e3b3c28fcc4e70c854bc42f67c9aac96f1772c7fc7322ca",9.79605826906598],[4683,"65e688b3a4b476c52ab49dc80aa136ca92c8b533572aed62d26fefd3be8c1ae1",35.87081339712919],[4293,"3f800b63b50876bd191ab13bfee55ba6aabb55c6f851d73a8a55bea26a69d0e3",9.917710196779964],[11715,"4ebff8bd62987495a97939cbe23f2a7ed19c575437a51cfe33da11ddfd0537b3",9.917710196779964],[10292,"3adbb6a278d94dd1f259cb60f489e8383708dcb51abbdfbce903c28218806abc",9.917710196779964],[8904,"8b19c2a069513dc377d29b4b7901b99edee666d8ea82cc61a34e917527496ec5",9.917710196779964],[8774,"ecfa03e8b18eb9a4005a46f9c871d60bef9072be23f9496167b78fbb00af38c6",9.317957166392093],[13967,"a0019c6d9d6ba97af564e8eec77b93a82c6f12afd070cdc810aa0cd59b0aa595",9.317957166392093],[17045,"726b0554e8948cde80016dc84965d53a84106fc3162c049f7118481287e72351",9.317957166392093],[3245,"5df191684c1118c11c0b108e43d4e416d84c5de7e1d87eab944fe5950c70b3ea",9.317957166392093],[15770,"43bf73aba2d0bb56708d02781a729eaff2aec95583202329ddd77c388e8cf26d",9.317957166392093],[7611,"7f364ed8a45789e0fec285952bc9c6a442fa7a2a96b3a9c9cc0c85a5d6f224ce",9.317957166392093],[16112,"ea3adb24a64cc6fadc85064f56948d2bbeaf7d769ee31b6140d84f0754a6bc65",9.317957166392093],[8354,"5f142497f5d33b091c27496e447b7077cf154038732d33e351a5aed14b63f5c8",9.917710196779964],[5377,"6f5f79c5d162f1155d62a50766cd7bf225cf7533721ffbf66e6ee2b685d1f7dc",9.917710196779964],[18788,"98813b4ee05c5d89dcf52542b14485e34f3855b6e3133515ff2b077b341e6227",46.35240274599543],[11694,"a3e75d018236edcdfdba9a63c0a8851263f5825564aa446873de60882ec853b3",9.917710196779964],[16426,"739268371c11db363d651b8e1561dcd0f448aec70292fe790ea335efce84985e",10.052724077328646],[13065,"c672b5fb8c8ca1fe77136c303772d5331642d886b189b8251ad86ab3b3b733aa",9.917710196779964],[15926,"66e2d790a96e3a3c83fa9c04cd4d9974c83afda67d238ecd74c471b3af7c946a",39.87185354691076],[12651,"09684e667a0ecbd578a9175fe0a41683ecb9ef3feffd2ee537ff47dad838ecac",9.647446457990116],[2651,"b196ec3ca65c0dc4873e539e009d9191061d2570ff1dfd4ff3544d7983bcd8ee",9.917710196779964],[12165,"de3fc865b579e331bdcd762e43729cb5d736b945798f32a420b49b19751144b0",9.917710196779964],[6422,"cbca671a74460dc97c0f790a84deb0792f2d20c719b65774cf76416a99a926d6",9.917710196779964],[1179,"7d3ad4f6230035a33664c638f7cc0ba96599245412c5688c329f5e1c0a3d22f8",9.917710196779964],[6735,"d590fbdc0aef8329253bec6ffaf8d9913f3fb15d9a4845a4db8ee10dceeab6d3",9.917710196779964],[15129,"a2d442f4eeaceec6dd570336d8d186674885086b8bb2016dc234866a5347217c",9.317957166392093],[10190,"b480f2830483943a17a068c5ccc91f924e03bae62fa71b260acd0399815e13bd",9.917710196779964],[4081,"984bcfd7a289116933ddbbd891bc6c2390a5b2cc7c168f2216058c0d2d382ee5",9.317957166392093],[17484,"f07993f4f7c10a72bf51c7b13963b44090580d37a978f6801ef4d5b169abea47",9.317957166392093],[15655,"fb5ed024fd61d3f5382041764a7e2abecd92e83cb4b58ca58f73c55d48dc3b70",9.317957166392093],[15358,"7ec032748cf1fbc850bb0bcb98f1179a4fb7e8bee10018290f1e1c7c0ea14077",10],[7873,"bbfb6ba48e219c817a4efd352adf1a06cdb34c2392e94fa4cc59a05e04886dcc",9.917710196779964],[1822,"6a885fa1f0ad5db222138b61f8f732d30b1159039789710e8c1fea9f326c1af4",9.917710196779964],[2562,"b4281e00c3da35330dd9d31f774da355db6af68d49f286c6409fbbe7d33a7eef",9.317957166392093],[14236,"1a2ac5018d3c19f6556fb5aab7ac914cccfb973a19ce4287b781cf90157e4f8f",89.3869625520111],[16241,"be1e4e48717741c8b3ae8429d38a311400b5f4e7dc7242ab6419995cba8ab862",208.46715328467153],[12502,"7a3e6b72a0114c6a907edc2ed7844da73cac935e1431f391b6f7901ac189efad",9.917710196779964],[11761,"ae3fd53ef3d05647904977ad4a889aa2939f4336aa3ba55f32d4e334a472eab2",9.317957166392093],[18918,"b03857979fe2df53f6cacbb1d3723f87a68b89e2480b405525253ed4432ad722",16.948421862971518],[7028,"9b920927bf7b0aa0cc0104da712c24e7bb7e971c17c52e79fb6acce4a54dd6d1",9.917710196779964],[413,"79e461cfd2c3f69fc8ff6aca0b4a869d08f9cc971402af431463c491612348fd",9.917710196779964],[11697,"66ddd1f7f680782462507c6be573f22a7f2e487bc5a3af60cc76b01bb89852b3",9.917710196779964],[17189,"76c45482d7e2f02a149693670698473d4f2e3121e13d67b204e6fa3cac33004e",9.317957166392093],[7929,"b2b0b56fc11516903326a1bfebfaa0fd09d89e4e7f85e7274e76b4edd7920acc",9.917710196779964],[10457,"7fd9924c4c47d1eeb66db2a6598dd154518ff795e5eb8061443d99124bee61bb",9.917710196779964],[13304,"7268e98b5d751bce043b8b905416da3e4a5f2bd7dd77f44ef3d64007770d7ca4",9.317957166392093],[12233,"5fbb41ba5074ae42080ac7bd6b7cca238b943e9aeda54506a78076339404ccaf",9.917710196779964],[7831,"74d972126d22c28f62ee199c6d091eaf4496127eb777c6116bcf9be39cc995cc",9.917710196779964],[10034,"40fee768caaba3a38913edf5909889e3df1d3f63b2037bc6c47574c2017b1abe",10.052724077328646],[19845,"db6c33be9e5195d4a7b8cbae5ccbec9f8ed6787059ce22f23259d75d5e9ff600",9.812893843916626],[7194,"5e229f25afee2b9ee62ddf9bba3c67e76ff279e6c4128acee4bca4ae7c75c1d0",9.917710196779964],[7290,"849e137bbb22fcf3bb98e32572fa729cfd38ae9db60496be00f3604b53ff23d0",9.917710196779964],[17914,"db026d70e6e4e2dfd54c4990ffaa34febcc0feecb716e16152870700f79a073f",9.317957166392093],[5008,"08b90e6120d7801cb42ea142051af29dd6790658bc32c30b4b5277328ffa1cdf",9.917710196779964],[18110,"7562a39fffcd050507321358b3e316c39b29aa01197fac5a6e82c52b8b37b23a",9.317957166392093],[8068,"08f5ce9eaa00d6459f74867ac02e17baf8b15896faac055e04b3c2d18445fbca",9.317957166392093],[16579,"928b6681ad099e1965548d7f2e4f7fabe768edbfb805bf5205ceb70ea2617a5b",9.317957166392093],[9926,"c8b0706f02fe10d090c5bec1118e5813ffa33562e1c5790c611a3546650cccbe",9.917710196779964],[15261,"d174d8cc14162d1399bf2221eefe72c4e092156fbb7e821b0ee2fcc9c4373a79",9.317957166392093],[18490,"2a9ae8c3da06039a2341e5253a45e8c1d3d1080ff952cef73992f3ab25d49531",9.317957166392093],[10899,"3f130c244468d866405c2ac7930345a1246cdf331f9d120479da7164be24afb8",9.917710196779964],[16622,"137c3995d6b78354f905882fa9b2801c472d3bdeaf60c7c40dd402779541675a",9.647446457990116],[2653,"ba7ed7365192a6b0fdc8a6bc75d61e6c90292bfdd945ed6a20185b1a70a3d6ee",9.917710196779964],[2216,"ca1bafeb300bcb92703feb5633ae05d6ae91f6f049a5d1d5be85a05d7adc66f1",37.11246200607903],[19027,"44e180f9aa64c4269befb155d64d2ae7c1090e91893919374479c2badb35ae1f",29.01511203751954],[9980,"8c8c4d77533c61546c4fe9715bc837f7de8bb8ad6268514048ff3b0f81cb73be",37.25170068027211],[5169,"656a51fd53376dd914c518fc79211a1b03c6df62f5adee9cd62c6eec3fa429de",9.917710196779964],[10615,"d359bdf8070700476a0381633939140df34ca4509671e762b20df018b1bd94ba",9.917710196779964],[15728,"8bd3789973af033751c36d3f5811ab197fad28b9462ccf560c26cbffc826f76e",9.647446457990116],[7191,"9de323bd76d79098a2bf7e3b6c15d3a2d466c11e5e3239ccda82b45e6731c2d0",9.917710196779964],[18880,"1148526d1408afdbf58cb425f89ff835461c864dd9eb753626850f7233952924",9.647446457990116],[13348,"67c30e2b7953e45990bf8a742175fea978eeeda4d49632bf657b527a3b548aa3",9.317957166392093],[14994,"4df399c64ba846ea25df87421755892dcae366002dcfe63a29c40d0201cfa97e",9.582887700534759],[12639,"fd09602db66513dd154e1f5dff1ad06c910cbce2ea1477bc6cb6bb850c2d00ad",9.317957166392093],[6100,"cae4b6c9d0a3a7e361ea1b424edb9b6596cc412f857df3be14af03ab4dcb6ad8",9.317957166392093],[4124,"b27a18d793923abfd2cf48c3a416c325cead0ff05204096b2df46f142a69e3e4",9.917710196779964],[8350,"e38d8855813c657a090542718321c62a8a48883a84db40c924c123d347cd01c9",9.317957166392093],[10703,"10ed7c9636f0fdb9664f07214649470934392a99c30022041a75f5e18fb6f9b9",9.317957166392093],[3014,"2c6c2b67e9db14506398d474d5e11b8417b8469008fbde9abc3d3e9f401433ec",9.917710196779964],[17105,"3d3351f1fba983113c243268457d00cdcb6b89b0924c89ea70c00f535e6bd74f",9.317957166392093],[9752,"0015abc667db9c515df832617a7a33867d45b37e02a53d7031059f128f9900c0",9.917710196779964],[11753,"ecbf7a6d5873f1caf24087d3eade4d51c70b68c282832505a7563771e973fab2",9.917710196779964],[11526,"c3a5fa4eebdb6621ae26d8dfcceac5aeebf6a240d627d127995c8be60d6c5cb4",9.917710196779964],[7095,"8b885f68b4d0ec56c39aa9ec6571c3912d7045abc57d97761a3347c4e74a5ed1",9.317957166392093],[11103,"5877bece0527e1b7e1dda54bdeb97cd888c13eaaef45206160e4adec3ce538b7",9.917710196779964],[1959,"004d9c5cd0942a81d1dd11c211829166e4a56e2a760e92a9b78af1fcb2204cf3",9.917710196779964],[10185,"c6c3bb0a4b17441ea973b4851bf035bb5fe6019f0db462872dcd64806a461fbd",9.917710196779964],[18980,"65016a50fe98c986603cbdbc990e8029387f9d4a20db6c7ec3b5eb8e3f7c2121",9.317957166392093],[16710,"4b8cbc1cc674c46d65fe5d5dff38d0302013f10a22809e72274fc9b76e8a5458",18.326315789473686],[9875,"8074baae3adac5e79d9333ff0e1210e67450a0c5455526cc64313c92b87018bf",9.317957166392093],[4004,"b9cf340a926fd9b2406f3cd548a8594b110da81e60f22bf82aa18b97cfc9b2e5",9.317957166392093],[19455,"065f7d36fa43edb9ac8f19400a4ebd123bb81d8ad315f544e2814825bfbfc40f",9.317957166392093],[13743,"eddb0e44b24c0bcb656cc7cbad1e6afa83141ded97c7e5c03cbac2d803aa929a",9.317957166392093],[947,"fabb7efef5239eafa6c4f72ee99e736e0950ec13168b20d92a905a51c08b84f9",9.917710196779964],[1709,"8e220ae4da687d375c7e25a3f647fa58d71adae92d55e8a24a0f6b6a1154dbf4",9.317957166392093],[8907,"22755d9f284dac28fe0b7de5a013f141bada997ac0948be0f731a6b95fbd68c5",9.317957166392093],[15619,"1f57ccbbdc5d96a0d7007946cb8eab5dde7e6822019efdd9dc43630cc9e4fb70",9.317957166392093],[4570,"3bddf1a848a35e010fb0f6b216cdea0ab2d58b00a061ab2ae99799245c44dbe1",9.647446457990116],[16774,"23502863e59a25c6be97e6e78838a88dadcbbcd86e87930e9200ce7ddc6cf656",9.317957166392093],[19041,"dec337fff18b7ecb449c776b6aff46a79abd6c4fced8f339eee1f3aed4272d1f",9.317957166392093],[1395,"2d4839dae940b63b88dc5e49423eb78ed2083db14a1845eb07890462f2e0d1f6",9.917710196779964],[6312,"0985173441e5ba6c10c64dcecad14e34f844bc8af3d29f12de4074a77558ecd6",9.917710196779964],[16314,"a41c7067e839aa2ef19be4e5bb0ce44665b9ec0ca652a986acaabd0a9514c160",9.317957166392093],[2836,"46171bfc928b8e783e8f346fd4b63961f464e2d114bab0773bf919d7c2226eed",9.317957166392093],[14399,"e8e5240a23f564d63d87022a66604cceae3b6f7e06a89d60c20a0efa4e2a4b8b",9.317957166392093],[9022,"de8ed349752d6082b79b31bfb1fdc5f78c1908ee71ba1865d5345d59ec7fa1c4",9.917710196779964],[17154,"6509e0fd8999989865a4345d919a70d3a2b44fdb7ff2cb2be9b5baed2c20fc4e",9.317957166392093],[17003,"e8e678b6a528169491435f5c1c3bd63d71232cc88ac36ead432e9dd24c95f351",15.94306049822064],[17742,"101c51a08d9ed0f89302bf0aa67c1cf937a97473926743c36ad807a202615b42",9.304433497536946],[7306,"14026b75d3f0414e6c8a0685091c3423922b71f7c183ff1f3876d16e75ec06d0",9.917710196779964],[13238,"8465a7d56661f4daca60b24cba25a85e63b761c0559f8c426a92b79697c723a6",9.317957166392093],[12263,"2232721cfbfd51040506b2b5873955ba1ffe10ed96c14f8aed4a83bb9a8d9aaf",9.917710196779964],[3852,"fa6e2e572734f745463e5b3dfc6145ca6e84d41a8346cd84cf263f667542b1e6",9.946524064171124],[8101,"15524e52a86a50b8675237bcefb6dd99e1defed95ac48e1927c2c00efe5dc2ca",9.917710196779964],[16401,"adc6d53c231d0a9ad1f823e062b5c01613d3c8f38b2a1cd46be66ab3234b185f",27.661631419939578],[9150,"d3f17e55307e24f9f02eab2589777178f2a97423ff4d08f3bc2c00cf5e60d0c3",9.917710196779964],[8226,"12069e7cd3128c16dc6e564f5d4d70aa21a4083758cd189fa4d2cf2942aec3c9",9.917710196779964],[11441,"c82a05c6d8d286f8a9b09ad6f519c16ffdb4a6eaea2f032c2a7c579f5cf700b5",9.917710196779964],[459,"21bd2cbf87e972b412892992df365f713cf197ace5981e16f292e13b789bf3fc",9.917710196779964],[18769,"786dce6cf90349c9d95e400489afad1d7709d5bc6468d0550c058cd0af380c28",9.317957166392093],[10994,"aa6cfa7adad3ff7a2899d73dbc9ecc7d35a5bbebed2734b7939f79ae1a5906b8",9.917710196779964],[13230,"339910b11bdd9e127b39dca9520aa418f1bd213ffe37d675ea4c9a702a3054a6",9.533923303834808],[15651,"cf3ef866c5303f683e250394ada57ab165c050cb1287de1e5d367ed104244d70",9.317957166392093],[15312,"1d00614b1b4120074b3fbf7f91dcd16025feb9cb142bcd75d38e84102b491978",9.317957166392093],[2113,"1648d438bb66a46a1d3879dbc7bef17ad07a9ba8369455c5ad7528ce857e24f2",9.917710196779964],[13886,"c9821335fbd52dce74ee3d11de073eb815306d1502ae669ede8e9e59c4314b97",10.052724077328646],[8861,"6b9d2c77fcd2737c1c0c0791cb525f6295b8333fc2bf07977fdb58fdac29b5c5",9.317957166392093],[13572,"597e1d85a7e0f60d3c470575d4d4a4a54caf88a2b0d70070eb3b473db4db2c9e",9.647446457990116],[5281,"ea382c83b548a9aad87385d055e80d0065e5a1a239468d4b181869cfc80286dd",9.917710196779964],[916,"e3aa99db8e2d3cb249ef90493f26ecde18fc27f19b44d944b500d7df7210b6f9",9.317957166392093],[8693,"e94554f3eca794c1465b62424650a32a30d365790744a1c5c6e308d1143bbbc6",9.317957166392093],[5286,"47a4f8687dfe5072d991c0084cd27c2c84c6b5a2c02d1b7cc05061aed0fd7add",9.917710196779964],[7761,"4e915720d980ed123081ed6443f30d871579e73dd162e23da4fa3316d75010cd",9.917710196779964],[952,"ae3894b7f704213fb36a97f33167b074fa1ebae9b9e7b1f5ee5e3fa2c0d87bf9",9.647446457990116],[11522,"a7f2adbbd9802e4e4505795fc8607b9fb3a9458bcaff56fae1949c477a8f61b4",9.917710196779964],[9763,"a6a167f6eda6a050bc187b0bb79e570df54b11cb2402399ed750f9e080c8e8bf",9.917710196779964],[4160,"a83f9f9b72fe9e0ee69addc490e426824f6d2da9d74165d6c430b29c7156aae4",9.917710196779964],[6558,"87b8d67d5c23fd5d1e0536fd5dc0aa1075393f937362ae379590dff05a58fad4",9.917710196779964],[11664,"ce70169f7cd42d24b919dc42cee6d2be80d32a56e5201f52b7b73ac23bbd7eb3",9.917710196779964],[14094,"be87559fbf0f9d98c8847e155b7a8bd80f9aa50510f7f917b142acbc9f5eb792",9.317957166392093],[11461,"c736b28fab93e4dd4cb74b98af5fc83d49ff1db93d10726d166e656de705dbb4",9.317957166392093],[14269,"8e0d3c2a5fe10c6043005feb63bf7308d19d28012996d572419613944a938c8e",9.317957166392093],[7216,"e05bc6336c9128c11c32fa82d098b3693ec2d5b4eefe52d8e7775742910393d0",9.917710196779964],[6932,"2f7bc9a0e1df40b3cd10e1dac4363eafaf8b4289c8f4d0c3ff775a20e14c6cd2",9.917710196779964],[7782,"b098f85e6b1bf343c9e0cbfbf76440267d80e4812eddc4d2296184d7597aedcc",9.917710196779964],[17470,"bdcaacb2ad131e4e9490c2aba6d2f5c08d959da352173cce12a38e5cc19f4c48",9.317957166392093],[14589,"8eeb43223affab0055e80b87d31de6573048b39bc3b7ca1204f67e63a56d5987",9.317957166392093],[4343,"b275a069d85c8aa3e6b676da4f4afd0bd9bc665fc26c9f6d0aeb1c6844fc74e3",9.917710196779964],[17469,"6d11ac86f60fb4633fc3aded1772e83bccc4c89e9e4cafe48ecc66f53f395048",9.647446457990116],[3588,"7f741375189e040a3c95f6a0fcb594196c6ec3e04ca91c9a30b0dd6c666162e8",9.917710196779964],[13032,"2bfa45bc65b6b6c02a6ad603d8d4fca15fc5a97943937b7a958ef52aadf163aa",9.917710196779964],[10029,"e46e3232586997556b5c87fb9dc5469929bada7066207b934e174eba472323be",9.917710196779964],[18927,"09c6f2e3f29ec1c5b8b7c240cf55b457283363d3fac3bae8ffa4a72567a09f22",10.052724077328646],[6008,"705e960630a5483cdd627fad397c5f56178496330dec890ad13a789b58ed07d9",9.917710196779964],[7240,"b0048b4d9938827b35ea6e273444f34118596352f96516a091d25b11222871d0",9.317957166392093],[3409,"ea93cb0a2d565dc35d96f16de59bc6345a81d689b86f4c4337a124153a339ce9",9.317957166392093],[7942,"a23361ada2f0380adf9f74d729a31e27f3f2a2acb1907ae139f0eb94bf9cefcb",9.917710196779964],[12697,"a71cda6f0851e5abfefcd6a02587434886d359fce3ea52dc9f074d8b125d99ac",9.917710196779964],[19195,"7fdd4f9d2c9438714e8666caa165105b562f82f2ae18be15cd6872201579c918",9.317957166392093],[4856,"ed4242adff0351c30e225b59e1355b59224b51f06441ba93b12822f5ca1b18e0",10.052724077328646],[19088,"7f00672b4a4ef67a8a14178c227ed70cbec93918e9b54a4012cbd67437e1101d",9.317957166392093],[5747,"61200217afb4674f535d894c2d1c61f79638971bf24025fab63d3ad60e4eccda",9.917710196779964],[18713,"c0285c836f4146362ac80f94af2033ef3373102a39431401adc8d89f2dc0cb29",9.317957166392093],[9992,"c4c5f55d1302e01b1450d62d253a92e5d40f58b5fde10b50007a509b0a0761be",9.917710196779964],[14283,"c65cbc9a0dd1bf53245b5cd9c3eaa53ef159134a3901d627d158b77924790c8e",9.317957166392093],[13324,"eb484640d16940ff6c395ab77eb9066ef6b4668a13c67f62c8eaf396923e26a4",9.317957166392093],[17202,"981152b1a119045950c64a5744d76aaf414a20ed555db7d83fa9c8a569fdbc4d",9.317957166392093],[4327,"986f276801ffc0e467ba0534d6a2fc14423088cee9bdbeaf0c8566ecc7b597e3",9.917710196779964],[10275,"211e5fe4b01c013899adf573bd0cdc350d36b259d74b9c7f35de512cdbe18dbc",9.317957166392093],[9395,"9a9d4fab8ce315f25257c31d0dd7882df4e88c2bac38c06f38d83fe6b0dd4ec2",9.917710196779964],[9158,"a0151b2327e9a2ffbc166608561be374280d310c3d1a7798260810e97a8ec6c3",9.917710196779964],[15073,"1ad00bb1683fffdb003eb8076d3ecbb6e0c7bbbcb9821298b12329305231297d",9.317957166392093],[7635,"0934f0ea300035b6fc18256bfa9968c38c0075ee02c409cdea6ce4c5727cfbcd",9.917710196779964],[5659,"b67742effe1373d5b123a70ef6ebde01b599574950c799d45d5f901ebb8144db",9.917710196779964],[16940,"602ba5e611edc8d9e146644f49635e30394b53914edaa4839d316d226e055153",10.052724077328646],[13922,"43fda0a977a5ca3d71e2ddfa6729142f48b4d982b7ab06c35a33643548847c96",9.647446457990116],[12251,"68eb5b66465445117a8b28d73486335f7c2c2b1e24971a825f08ce2e4715b1af",20.03647416413374],[15554,"6a908c23769b26bed7d616caf3743dbd0c8553164089261b816cae6fbc87c072",9.647446457990116],[929,"c4f3550beb3ecdbc22d3b9365943f0d3d121cfb2614514f8f4a98fd3e19da4f9",9.317957166392093],[15134,"2e76a5661878dc5bc72774836c216563a4d21ca57bda5baaece3d3c40943f97b",9.317957166392093],[11913,"368e90d28144500d64090db8b0f03bb0e9a18dfacad73e741e51d4ebdf29e9b1",9.917710196779964],[12589,"f92366c6943ffad7a1a31d2bb38ee778a14f3cc6ea7b45e782480abd3cc055ad",9.917710196779964],[3123,"a0010392bc3b534452410650251b604754ecba25fa7cdf9e0269d16eafc383eb",9.917710196779964],[8355,"ab836dfeb967fe68c5dc67a67708e71022ebf59d0e7469952495a0464738f0c8",9.317957166392093],[3273,"bc94290ec2ed444aa17b99dc5d34299d5f34db4179df0c612106240cc30490ea",15.944153577661432],[9040,"886609a20a53dc35d614d6a317ffabece53b4db73bffbb0125d7f2e6d9c884c4",9.917710196779964],[7971,"98a03bf91436d1d162fcddaeb2aa712e028ecdb0fe3187d4397db94bb7c5b9cb",9.917710196779964],[16200,"45da3d59a2b4c715760929d386ca65f4ac368358f239084c5ebc14e7dba5f963",9.317957166392093],[18288,"64821a2015fe71bbdce655c5665ce1711067a1fad76b4606b5b2da0c71060636",38.17040358744394],[13163,"5fa26e79796c39288f8e4bc896d9a73f09f78048031ca6efc979ee3c91b1c0a7",26.115555555555556],[13091,"34353a5915453275f5c87e367e391ce5a666d6be60fbfae5842932ed3d4dafa9",9.317957166392093],[18258,"700259341f157b319ba3422835a2d19e0d4bd4df2c7a0183a8e1b270c4b6dc36",9.647446457990116],[1133,"9f181198539c1980a63829b71e5ea69d94ac15dc7128c6f08f60c84fc91564f8",9.917710196779964],[11111,"d0729fb408b9223e16de15ca6501ec015a2b264483caee65be548a3d3ae432b7",9.917710196779964],[9254,"6a786257792eb9f1df22ff98badfeabf5b6a3a2d589cb14e2c09411cd1091ac3",36.273972602739725],[10534,"bd3c21b7beca90d5f36bde2902fa3c765317e1628123f17ca40e5ba9b3bdfaba",9.917710196779964],[18526,"a47b0b13df8a8687584ff69fcd8c2a4c7b387b4f3e386eb967992e3f0908f030",9.317957166392093],[12524,"f004cfd5b669a7cd78e427a206d9f69e6b8440a513cd20d5cb60e75f270dcaad",9.917710196779964],[2877,"24192a3550c2b3263d24b7a1f56ffd483da381d189fffa2c927e5ef6fb3342ed",9.917710196779964],[8778,"cf57449e1f983ee170f59729748a8fd842f6cbab196d8cd0f28c3b0d2d7931c6",9.917710196779964],[10373,"ae80d9ac9fe495181c9c201aa22015689ffd359741d1a84996cb7414f522f2bb",9.317957166392093],[18339,"7af186e20fba479917ed4dbee7cead30140cdf86b17f7ef7f9035cd3a20d1535",28.846975088967973],[14631,"4050dd70ad534add5200bb1d9ecefa5bdf6fe6fe9e25c4233deda67475c75a86",9.317957166392093],[3001,"9653fcbe8f719bb1a2c3d44a59f60a4f231270101a203e20338a245db6f544ec",9.917710196779964],[19018,"742af5094edcd20cd662aa2fd3bd04d2cf3baa6b851195a71ed654852b7ee51f",9.647446457990116],[4540,"a3e720aa2b5df9ffe59462ee552ce849db0124a8ac39b17618bd1aa8aaea18e2",9.917710196779964],[1228,"df18816390dc38317b7f7a72ce9abb560c56e33ad672bde67e0275eb66e8d7f7",9.917710196779964],[8218,"7761ed8881cc1edbbdf9bbc0402c4da74bfa835f341e1fd0ffbf459e82d8d9c9",9.917710196779964],[11551,"f86eca8babf67b5d38a2fe8f632769dbcf29fe284789b94920daeab040903db4",9.917710196779964],[18223,"aade368443c8864b1f512fe35371b867b8d9d5ed243cf9de60bca1009c4d8d37",9.317957166392093],[7805,"935236a570210d6c498036377b61f2b6232c16a9788aeb388b9955e23018c1cc",38.61187214611872],[10110,"9466cf9257652ca53a63243203a8337acefcc2eab805791b975a37b69c8a9fbd",9.917710196779964],[16972,"58195242d11b5a8842b83b0e3a6f0d4a828c87ea1d1a8a500972671bb926a852",9.317957166392093],[18365,"1e664d17e8f2b3cee3315a7d0859181b91497607aeaeb261c01be4a9de975734",9.317957166392093],[2029,"bdfb75e641acfbeeb71aab20a89c898a0f9272157ec9430e3bd0793e4ac0c2f2",9.917710196779964],[11805,"093c6c2206a061bd9d1cdaf72cee0fa7952885c924ec0482e7461a8e48a0acb2",9.917710196779964],[14965,"1ff6032c81fe0b360de13eb0b57f542ebfb4811c91861130a7e362fa26983e7f",10.052724077328646],[1685,"f78fc7e4a840b40da6872f73af9923ddd44fb9e6360483961b302bcaa02705f5",9.917710196779964],[19544,"16e266a3cfda86d3c4589e57f079c3d19b942254914580c4944cc92f2fdcf20c",11.301587301587302],[14294,"27c2f79a91c62f98da2d36191a89e57fe96b62174856c03a7ca37251a6c7c68d",9.317957166392093],[1398,"09918d00081888d5dbc27ef7dc027553dd12822f2932d57b18376acb1180d0f6",9.317957166392093],[2122,"8d95f46dd684d3075f14f365c7f0a529288e5f72ddc9c3a05dcbfd69472d1cf2",42.66202696824706],[13407,"9ca10c4b861544606205800824f770bc408f0263d9eb4fb9e5dfb72a2d122ca2",28.02659574468085],[9899,"0600d11ddb65f5b8d8b17399b3fe8e7961dd109b8531d4a7b5cb2966b982eebe",9.917710196779964],[4707,"762e394a9ebd6c8d49547e861a91172d2841700af6c3c14bc02e6af5f3cbf6e0",9.317957166392093],[15660,"39622d3a2d0b63eff550ac8baf81de0f8f73294b5990792ba80f316705e22770",9.317957166392093],[13888,"f92a10ae1bca8803ae9b321299a56181fb4057611c07d8239bbd645399484897",9.317957166392093],[4139,"5da71f89bdad35e5f4886c3f3c5f3096c623f82c9c9e06ad2b1e55769061cde4",9.917710196779964],[10450,"422397694858d1d6a19ae6fe8320c80be448f5f51773811f5bbfaabd78ba6abb",9.917710196779964],[16310,"ac882944eb4b2e1c29809371292d8bc5c9fd1929679ec4bf603c5431aa90cb60",9.317957166392093],[7593,"316d62a1ff0811758372acfe9545f7b771c1b0d039f01d0149e62e607f5a37ce",9.917710196779964],[2788,"22a8d9e669047100ec7204b1d253d59afdcc99c7bdc46e1a078d7da4153bd3ed",9.917710196779964],[16584,"7bbab92f2afc869cd7e62a24c21c4e25404d026e413431f28a0bcb101dfa685b",9.317957166392093],[17953,"73edc8116a92a8941a61188cf39031fd5f58581f4b6d8990709332ebd362303e",9.317957166392093],[2716,"9f69b33d47bc3a2a61bb23feba81c835a9f02e65ce4eaba50b42e8770d0855ee",9.917710196779964],[18055,"21cd27935f72c645022a27b7b072a86d6ec79eaa3dec67ea906e612d3fb8203c",9.647446457990116],[10062,"1766e9108589ae3d7dfaf008eabba3734a43948f0c265219f253a810e4dbfabd",9.917710196779964],[10103,"fdede337d80533b8b5f691531f5d94a841a4cc3b73879b7b9d1e05142269adbd",9.917710196779964],[2387,"3a90ddba4e934b800557911fa213453698cb18260f163a6ca03472d88d9188f0",9.317957166392093],[3002,"a7a981730f0d52f1133f6718f51c7feed3a98e502256bbd0c76f3595903243ec",9.917710196779964],[14984,"5bd96255dd5b7f5d1a5bf28e9e68f473209800c71757b2a3ec3d745fbf96db7e",19],[18664,"b1699b44c8eaf7be054b562b34db92e9af5ac2e73e7f4b6ec28ace6dbf9c232c",16.01426024955437],[10422,"b96602426424af07b187c7fceedc4744ece468d666c720784f4edc2f8f9cabbb",9.917710196779964],[18682,"dc78ea0f453bbc30c502f4fe8fd14c031987d5de4586580c620390b1c8231c2b",16.032654938484534],[17998,"423ffd53e7a655821ef46061f31c57be3e6b9a0c5534526ed233fdd028ee443d",9.317957166392093],[5259,"ae446e0edf7ec75e7f3ef5dae34dc21147a943063c0206e8d042143322a19edd",9.917710196779964],[16539,"06ece69c3491ee8c317158c6cee645314db7f5aa734b55faa13ccd5abe55575c",9.317957166392093],[19005,"5b062587c66dc7151c3ba2e35204985a07bb2a059b665b492f140a7a88b46b20",9.647446457990116],[5152,"d292855394ffa28896e2648ed4726a2a12ed12de15c863fc7ba26843343648de",9.317957166392093],[12585,"3d14a9c788b4e545b0a9b4d8d7bfa01988866e645caa29b46bc01fdabf1a5dad",9.317957166392093],[16852,"46bdafcdf95e982078e159ac679abadcdd3be674946c731dd15783da84c63a55",9.317957166392093],[391,"6c5b9c0df15aa3bf616fd65bf50766eed7587e637a229c1ebcd0ab0f7c736afd",9.917710196779964],[12328,"201ce839b2d60e69f8d1c3b14c58b638bd366f13b79728a8e2067f9748b10aaf",9.917710196779964],[7915,"54b871a0a61ee9cc1d95956cc1e127da0bff45c035343b40789ffd87dcc01fcc",9.917710196779964],[17514,"a513f70268ee9d58ae48313839ca5c1539d936bb55deb448083214ff07d93647",26.118721461187214],[17556,"2fc6afcac5c0e3780ddcbe0c7ebfe50c3d39d2c513bd0eaf9c1c5f3465d95e46",20.13605442176871],[16879,"53f9ced6c5bed2828e53e686d42868af9e53e4e662a456fc3a7c7caeaabfa654",9.317957166392093],[4036,"18cf8bdf3f69f8763518b387ba2d7929ecb675e199e1e70d8cc8b8f000a086e5",50.623885918003566],[14249,"01cbcc2718193dd6fb869c97571ee2e9b1566fe8e673a1f5d016230e4428f98e",23.105022831050228],[487,"7a34ea865444a8f44222cd35ae071a002b1f6748be2a0e51708d4db39940bcfc",9.317957166392093],[4634,"a964fe07f603df1f9a6f0b9d4006793564009aa65d427f8ac24037750af668e1",9.917710196779964],[11991,"a4870727f1885034505113497dc2019ba9ec7f3af8f2f61ad53d0f24147d61b1",9.917710196779964],[2460,"db73ed0a054a120cbc1762a04d65e3cbe0bd4342cdc0b11ba87c73e0a50f20f0",9.917710196779964],[17169,"173f9377ffe0439796566553337ab67ee4cfab4052b9901c47afd80250c37a4e",9.317957166392093],[9733,"c2937893f8f41635c18752b94c129e3922da15fa8769bb9654ec12e61e5215c0",9.317957166392093],[15999,"7d2ed0e2718f191c2aa5ac6e226fe1dfc2b6bf8a9a118771af68b31482e68868",9.317957166392093],[2452,"b2f9264b6bbac914c48a4cc712760b3ed9e46b330c8a54a1d2889c43f7b830f0",9.917710196779964],[2273,"6619b2bcde844cc8e4ebdf7c095d5bc56b8e0854e310f368277f28ad429b24f1",9.917710196779964],[19692,"a0c93d2e6b78fd8e4a8ffa5d7263683f691997161edb6d10b9d2b0af95e60f07",26.138053097345132],[18679,"c930273004d825c05cd83748017d28962561889af1c9ba02dab94744c55b402b",10.052724077328646],[17286,"ef9d8cd4e07f12c40b4c530a4fafcbd043e22620fa88c2d9849dda465964794c",9.317957166392093],[19742,"b8a71335f702f69cd3aa4df0ec4508e2434e6a9d26c6f64f3458bc464e984a05",34.049886621315196],[4298,"c8f19a4c2e9262857d0a855b327caec5ab6bc56a60302ebcf833b767523ec7e3",9.917710196779964],[6937,"ce2bf9ac5f56d46d504cfa0d163ed4e6ad119d9103e4694390109ed3672166d2",9.917710196779964],[850,"a73a5b2daeab302ca62a7942c0a3c838d2512f49d87a59ffc8a812b9d5a03cfa",9.917710196779964],[11916,"ef6d9e289e460ca3bc4ccddc8332ff9e1feaec6d932c9dc6f13dc005a137e7b1",9.917710196779964],[16411,"4b07a4abb713f051dc9d44bdb624720cbb386b13978fff703a542552a943e85e",9.317957166392093],[8225,"f5a1b4272f7d5342baad698d0ee3b9c85e0b7447940b82172351687ad65bc4c9",9.317957166392093],[10045,"bb79d543b9c18acd1d23f87dba1c8a8cb5918af24f267531576c819090e813be",9.317957166392093],[7309,"bd769f218fb26f2dbcd073cf00b5d1fe08e56b0741d47d171f30a9643ca902d0",9.917710196779964],[13278,"dc3418ca234cbd950a915e1cd341a139f005fd6b31dc0512bec2bf1f55cd0fa5",9.317957166392093],[10545,"0fea3faf20ecdd235041c8db4a25ab27d4772e3d3d47d99a45153ecaab40f1ba",9.917710196779964],[18108,"db9f038c16530a1347c7827fa7ae038c92845399d96a6b5c116d6232a626bd3a",10.052724077328646],[18355,"b88b875035a7fcb40534c603aa6809d328f95b114373996c10a0d693560ca534",9.317957166392093],[19127,"bbd37ad5c30a9247abdc94c170b898358a15819367533afac29b32e612083e1b",9.317957166392093],[8466,"83c89a710a003545f4d9c6f43e6a43d41eefac9136d8a00b861d642443763dc8",9.917710196779964],[2455,"0899d640a3760fe0c950aa2a069cb404537c83bed2a849cb28b205718d4d2af0",9.917710196779964],[2350,"3cd95899401a36a97edeb5e7998a6feb52314d9f4b4b4268f42be2312a40bcf0",9.317957166392093],[16035,"b8cfa32fcc1d425599fd6bd4dc0715d914bc539d1c8210b50133a519f983b267",26.84149855907781],[5201,"f325336c6651519c238e33470f2e8818b83ec93a2492e57391ed7faa6f81fbdd",26.225312934631432],[374,"51679a6236ea227e0d904313e8fcf990866c75da34833a8767b27de6381689fd",9.917710196779964],[326,"a4ccf3cee6358561a12849d9269ebe8e984e26c834e0a50c73861f0658e4d9fd",9.917710196779964],[18049,"ee5875b495cc860109d072219e1bad77c89fe278574cbe970dafa50742c2533c",27.77810097652192],[5269,"401ac6370783b550a89702cec8a8238b67b7fedb3985c5d8da06a4b6d2bf93dd",29.861946902654868],[15704,"3d9faa7f9a128b86c2cfccc1ddcad1ec5a648dc0e515b53649ab69ed46a76f6f",9.317957166392093],[1219,"39aff51a224a75374e6059cc31744ee021ed90ce6091421c55083523cb7ce3f7",40.121580547112465],[14464,"ee21f1b94282180923b9a1ddbca1b63bad082800f5ada6e56b1ee86e2f97fe89",9.317957166392093],[12799,"575300db3ee864911308d1820fcbc7f49aa623f3e4a06c7533aca6defee5edab",9.917710196779964],[7401,"6dd9a031dfc644f9e1d3504f15ab5b159ff7c18030ee10a74165948d951d6bcf",9.917710196779964],[11323,"ccc0eb716b7f4a6a2f13e9e71e5dbe6d8da09654ccc656846eadfe1b8503d8b5",9.917710196779964],[9505,"ddf4b2b4be0faab9691d3856e06b2955d78704bf6db7bbed7d3a09191c5eacc1",9.917710196779964],[8587,"11e74094b710b3528eb7ff7eef0fcb46ccd81d809a3088557a2a56cffb7683c7",9.917710196779964],[3044,"a7a11b2520561db94644f481d684ab274b9b35864931175b9f4da289705f06ec",9.917710196779964],[8624,"eae6c66d9cc92d2198703670c368b1b4d0754e30d95a3c9c0fee3e799e6d46c7",9.317957166392093],[2709,"a21e9f6ac657a38038b895610774fe07abb865774ade7f7310d3cea82d1066ee",9.317957166392093],[14830,"b398ac22cdad8ade1dae8a30d7c1f422f16020361ecb20dc1a92156491744682",9.317957166392093],[15643,"9d7c5a4eb38905e39012b77ed4a99beebb8455f04e5c2457234eee5591f07670",9.317957166392093],[15856,"823f11231f3befcc81b3070670dbd15ca172304aa685110f73cc5dae1a2e026c",9.317957166392093],[12170,"b6fdd785d1e10ea7819b7757d099ce2b8bdd43e493fccab82545ae112f643eb0",9.317957166392093],[3707,"270c251518419e8f99d0cf085c248ee07d0349a34d4afdf3d14dd9c5248c8be7",9.317957166392093],[3615,"0b8fb9da3d1636e41be321afece69cca7dcc79b96c87cd63e41642f699b922e8",9.317957166392093],[11104,"621b3f4890a0a1cdc3c0fc2982a43a860a0637ae45436b9f219ccb6713d137b7",9.917710196779964],[4802,"f9f2289c5cdc585062fd27deb00e0728c39a2ba6f91518e92d6ddf62d96460e0",9.917710196779964],[6678,"dfcdea732db44283ed74afbe00a920aebed082bf27e7239cf56782b4f72722d4",9.917710196779964],[18715,"76c1bb37bae1e9345253ca03f5ab8a55ca2b5d895fcd9468ebfcf5de0843c229",9.317957166392093],[1795,"eefe9b9cdf89cd62b009007bd8be3a080afe053e9c55812909e8e2ecebcd45f4",9.917710196779964],[17993,"d0bf4e841ac737f107b424fb533f2661419e9fcdb950bb6182f08da2b6265d3d",9.317957166392093],[19664,"04ed5894b576fdf2d31108787f095cfd02324d16248372ea40cc4aa50d2bb207",9.647446457990116],[6723,"9d8337252a0cc537ee08cf8b217a3d859154796d39cb8b6d4fe19f07cececbd3",9.917710196779964],[8622,"fe94f2d3b8075c3636b5716b127ceee50ee1252dea054b3489594aa5038e4ac7",9.917710196779964],[17758,"f2021e4481688fa22cab08e07d055373aa06e04b8fa4a59bdaa5911c20f70742",9.317957166392093],[19362,"78cf7dcb4555f1724e571acb25a31976a983f6301ba222d022491b984a314513",9.647446457990116],[4456,"e1e4461b95f05ebdbc77525e166c0929a600defc421ad8ae261871b08f8ab0e2",9.917710196779964],[5202,"17411de2f23e24b98e58f90b5cc9f3d74dfbc89355705fd3d2c809c89ea8fadd",9.317957166392093],[6863,"bba74b3c001951ba71f1a9ec2c64b18842d1d75680e1da2eb5acef451cade1d2",15.055079559363525],[14767,"bb1aa5f3c08d9d1d856aa7f44a5805f64f29a8a98fad269ac96656cca65b9483",9.317957166392093],[16062,"822ab528d28b4c7c3fbaaff3e35b861db4969baa7dbbf498b65d1cb482a12367",9.317957166392093],[10366,"1280ab95ba2e4a62c487a72910ed4f9a022e47f55b35619a0332155b8bf3f6bb",9.917710196779964],[1630,"9ff7e79736bc04008021ad7160cbbb87e3faa4ae7caf1c97f3a4f39cc12d6bf5",9.917710196779964],[18153,"0eaecd414de92bc1ba8b139b48fb4ef7aad491a3baf3b375b9eca2c216b54339",9.992962702322309],[8890,"6e96e496e1f5d62fd80c768168329d0c44600da0345899f621e4f2e380157bc5",9.917710196779964],[2757,"4654b009031cfe00c3ec1fc77e4ab1a35d2792e190a1fef820cf7d9da31e0fee",12.56637168141593],[18118,"31e5c23b73bb93e6ea3a97a8c8fd5126d1526f84cada13d7724d39ca4dc2803a",9.317957166392093],[8262,"8fc8b92b055fefc07d6c007841e59e137e5f9a5cfad5aa02fa11a59a48fa97c9",9.917710196779964],[12667,"30b330c8376918f8abd3d3f04e459498ab8cd68baf29edc1310c1bfc92f0d0ac",9.917710196779964],[5394,"937fb564b5af7d4696d433bef616d7db02ed51be56f01a2cba890b28a70bdbdc",9.917710196779964],[4839,"d70d3591ac9a987a7dd28456840faa0084fd26824509b3eaecefa147ccfa32e0",9.317957166392093],[8538,"008d57af25a3ff18330ee3b35585a1e2609ffac229fa3c0d2af368fb83cacac7",9.317957166392093],[10352,"88b11b30d96489b0fae5bdfe0658eb68374e24fe563e4bfc0c43986a603407bc",9.917710196779964],[9813,"9d430fae4bca1524258b305a66f3fbe0f63989171ba72c6717aa80f462918dbf",9.917710196779964],[12632,"71781cded1cb549021cdd826f220c5f81c381519a930644b6ad664de115110ad",9.917710196779964],[12329,"5a1bd521145b19ac586bed2cf2e67ec8db8761c5f7849ae52eaafa0b72700aaf",9.917710196779964],[3504,"39175c530fe509d4154b7b9312294862cfb26b155274424f8a28cf16a2e5f6e8",9.917710196779964],[2408,"32295e0e2d661770cbaf510498b31f7a4ebda0c2d8b4015a36eb11c95eb369f0",9.917710196779964],[14669,"bcfd4004ef9764915c8338c329b97da967169b8dc69bcb8321d16764645f7585",16.056140350877193],[1452,"54fc8dfb5b2939685c4fc033fb7281d76707e20db27351d3f2176969bf017ff6",9.317957166392093],[197,"5d14f52d6766c88d607f49a5c9653b159c741fcd940a7ab8b035520b539aabfe",9.917710196779964],[12699,"fe584ace14fb0883e82aeaee100ec9c17c2f89e6f1a01bec313816d2ab1899ac",9.917710196779964],[11693,"c29e7c6fc9246b1689f96bc1cc9edd1627fa1e1582f057360b17001a3bed53b3",9.917710196779964],[15563,"b54b49752dea1191351aa488a4a367d1b49cb7c0550b42cb795d0b6b878e7b72",9.317957166392093],[12786,"1acf86b3f4cfb51d5bbab8cdec668f1ae3486ed91a845158009f435da788ffab",9.917710196779964],[12515,"13c012a936dabee97a6d55046aa216ccb725639c80c1412c283a86eaa8bed9ad",9.917710196779964],[743,"cd323f25f43fc56d8be4f3a77e1acc8232754e52be1cbcec235207fdb3bbf3fa",9.917710196779964],[3154,"d45485ffc6eec5b7e724b4330afc20a7f40fff7a1c9267b84adcb6b299b855eb",9.917710196779964],[1537,"fb82db80566efcf385b4fd2eaba8185e7f352509ad451b028ce19d2b7f7ee8f5",10.052724077328646],[9098,"a4b9134c0cb7f9c418e1935808a03c136b5f985afae3a4e176a74faa639d2bc4",9.317957166392093],[17727,"242f0d7a7be9f7e7dcb13c1deddaac97d2df74eff2a261d2538d0ac48f38ab42",9.317957166392093],[7912,"04417d77acece6ef96af008349c7256cc8a0a768697976547c7a34e997a929cc",9.472566371681417],[13557,"8c4547077d3068d05d77b364f8e5eb06e45c092870439c3941898236d41d969e",9.317957166392093],[19461,"3c300c070ccb8bc64490c660df2f4213b18af6b0936fe8b17efe689d32199d0f",40.69230769230769],[11214,"496adc308a5eaddea8f8c3aab32bdc06714ed65493550003656b032de95a9bb6",9.917710196779964],[15598,"1f9892032e6ff9475dd444d142cc9d0a20f8b8eaec10c508cc60e8da74276871",9.317957166392093],[15630,"4599a4e0cdf1a9acddf97f1e384ce66c4293806bd56b874f10fa9ae28875b870",9.317957166392093],[10838,"e9512f5f78e31c45dedde66c50a16d2bf264f633ef62baeceb149fa3e3cd10b9",9.917710196779964],[15962,"67cd92c146837c101d5e374df6c49a0d8e2690190b851584d645a462d8e48d69",28.075743913435527],[13216,"91573f087ab0a75bf77baec218d8ac913a0900c7d795003d005030a085df89a6",9.647446457990116],[15314,"1355513f9cad3e96a4390fed74e61250e6baccb4fdd5e3818f3ab521815b0678",9.317957166392093],[12463,"b0394ef33216dcc18ea8f91c86d8e0cd5ca3be870d163c87b363a71f895639ae",9.370116971970868],[16435,"76a26748724a2c66369d0dc75f810f402fecf552264987e94b412becf6566b5e",9.317957166392093],[8109,"a550ee9bbd901f99b54ed57e3e22d35bd4af32dbb27b88a2eff779af327bb2ca",9.917710196779964],[1033,"576ebfe2fe2635ee6fd7fb0b48f5d7bd8a3693a5f88be74150e95117e04710f9",9.917710196779964],[1797,"21e8fd5884d88e30e6ee8e069b9c2d0781d8fe2bc82a9c3fa6c768308e2145f4",9.917710196779964],[15211,"0baffcadf0882a1d29301bfe933b73d7c732bdf746c02f3f7ceb0a53822a477a",9.317957166392093],[5245,"9e4f75d1bb7e214ad1b55b26e23bcbe7c93148091ae69c1f4d76264228f8b6dd",9.917710196779964],[15333,"cdc5369e64ef2e5671573d51a970fdbce5c24ceb4de657c6fe678e85b76db677",9.317957166392093],[3076,"cbef01b43fa902f43fb115d7ddb19c447ee5c70baf1800f20c4875eb85c8cdeb",9.917710196779964],[8301,"cc2f03ad17bfd97e5e49d3a112035a35946c7af8baf1fa9596c183464b1455c9",9.917710196779964],[15078,"a6797f902ac436d8c21b7456dfc0b88e4010de30c2bec7655684b698ff201a7d",9.317957166392093],[18843,"a1bf30e3ebb3e487ee4178400c22cdf9e5d67acc247547dab13ea7eedb8a4325",10.052724077328646],[7389,"f89512f1d944a43b24ddc70bfeedb46fc2c0840049af128406c2dc50f9d37ecf",9.647446457990116],[11726,"2a4a84fb2a728cbc1d74ccb8f1027a282414c3c74b17984afcf625ac2e9c1db3",9.917710196779964],[19794,"b9a95c6e8c0fb5dc367d44d36fb76f89cfdf0a314b55f9a2ee8cc2e837cdab02",16.035634743875278],[1624,"9be0be5940c774e9da0992dbcfc7bfa8109d1b889b96bd3e9f5316ba51c46ff5",9.317957166392093],[5063,"5b7f7233f5562ddf5c9d54b0fb44f6140cf5d99758ab7948a072a08ccc2ec6de",9.317957166392093],[17987,"e664f1019d103bd1e925b009e128d2c34284971a4afd3c16d2ec220ddc5a6f3d",9.317957166392093],[1019,"f1242b211ab7cc9636202a11a15d7790c71db90e2de1bdd0057803e7f2421bf9",28.097560975609756],[9475,"5440d94e0613e0b045b9e7f87313a63467e57f413d20f8d570451bfffe74ddc1",9.917710196779964],[1833,"df81c224899893eb0bd312ecca03c0ec97105e9d297542f836ce5b6afbd60af4",10],[12426,"4e9e560146899dd59a0f622a7f8fb95ad4bdb4e31153f312acff3186d30969ae",9.917710196779964],[6683,"8c3d9645d5c539bd61e581a8a214f595b3c68764c785fe35b83c9beaf62515d4",10.052724077328646],[237,"fdbe03da3cd41e3ad678aaf36522722dfce469049bf9ed5063962ac264e763fe",9.917710196779964],[15820,"e74f247a06381010fae7297036974f42df36a116da09467ac844b02e6516f96c",9.317957166392093],[14367,"311f44f7ecefe8dac5ac2dce4a7dd9fff1e0453c56883d1bc7f3240a90b6148c",9.317957166392093],[17946,"64e7e5126bc06d8850bc92ceff757a5c28c8637730867ce864cf80eaefbb503e",9.317957166392093],[5587,"c3e9097ee97fc4f4d2d84df6cc6f7893433ed70327fb46b3478e4f9219e1b2db",9.917710196779964],[10241,"235ae7cd2e9e59ad7396af4ced41d638b7cf66d3c73a2487a4d83aaf014ac0bc",9.917710196779964],[9841,"73aead6a685a8ae07b14b3fff106469ad4c07ec95973d96708868fe9e6095abf",9.647446457990116],[18665,"122ebbfe5ae06d0f7ebbb0b990f83dae08a115c7d1856e117d4ba68bbe051f2c",9.317957166392093],[11459,"f597f8855ed484e8a6605385adb12ac7cf770bc2a66f30619c56695edfa0ddb4",9.917710196779964],[1531,"5b79ab7ff6e62c19f8fb298c0d6d9c0ee6c9d0c0912657a63eaa7a85440eedf5",9.917710196779964],[12581,"78cfa954973d92d3039fa5bf8607ecbcea0aa52abc6c7857bdcecf01e67b63ad",30.567441860465117],[9642,"cb0cf74f9b1cf1b819fcea9f79d740a03d016eeb55028435a6f103a3f47fc0c0",9.317957166392093],[1353,"6b3f3b5e0abb4fbc06e137191dbb124ee72a17b9b69c821bc2f8a232406f09f7",9.317957166392093],[4794,"e611f7cf2e11430b57e110fa3676affeaa6aa4fd73b1566d7fddbf2d40036de0",9.317957166392093],[18168,"99bddb73ec365acfe822b5df70d6451ce58dee98dd478363d4729a307d35fd38",9.317957166392093],[14739,"85b5d913cfcd4895b92135bb9608cae3554178131b60af37b0f32abc5c5b1684",9.317957166392093],[5207,"820018a29472c942d92da3bda1b0d6068b1486a4fe84230a4b87b5b598e0f0dd",9.917710196779964],[7855,"5e6986461314425cff595fbdda2857ecbb0ebd1d942967bfdb738ab4a2657dcc",9.917710196779964],[11571,"88eef07ddf508104dfa8f54ffbb980305283c3c9b5e076fbe849363cc94d20b4",9.317957166392093],[14949,"a0c7f496e365e61f31ee92ab2ed74945804742ee1b8a0935540190696e53c77f",10.052724077328646],[8541,"05b0f4637d2b01e00921bb535779aaa9d5f798a23170ccc000b2070088d8c8c7",9.647446457990116],[4521,"832e0b790e90f9cef079a6d30977c087fa535ef26016a5c3e66e7515f74037e2",9.917710196779964],[2162,"844a5fe024a10ad14053e2a56f3ddd9837ff94ef2984641449cbd62bb74dd6f1",9.917710196779964],[6039,"e985dc650284a7bf52b12d852464291d96f7fc5532945768f28213494298d1d8",9.917710196779964],[905,"80c61fad99f821e3c32f1243c5194931a69b91d835e4d980318cf42e07edccf9",9.317957166392093],[1048,"fefc838b667dfaa725496b1e171719ccaf89a820d5f3dd8efce699f79e76f5f8",9.917710196779964],[17565,"1df144f619a5eb0ccdb04045081860c2cc86ae501181b147d7c3de6bef0a1046",19.226908150064684],[5223,"b39c7dd1783de439b3b7ac72d8d6c54350a95c77128d591ac1d586fe3b79d6dd",9.917710196779964],[12904,"a72390c4cf1fab2ffc6d8a64014d995222b2316bb146b14535876f9d37034aab",9.917710196779964],[19366,"77af857a9eaa60eadda903515fa34c3575ee467775bf6b014069189e4b093313",32.058931860036836],[1678,"1134117449baa0b59df01660e1786ecf17b8619a418ecd14a7abaee113a60cf5",9.917710196779964],[2948,"e97826fbaa3d8ab5f3848518a4a36ef22994c4f5096e0e1e0d4bf076b494b5ec",9.917710196779964],[12707,"d9470259224e4b32dd6e7d42c70eb534a88dabed23e84ee2fc943e1fd3a98fac",9.353846153846154],[3468,"7bc2ce5223c242fdd9a3e10e2ecbd908601cd1041c40ac22667fb0b0aa6f42e9",9.317957166392093],[2713,"577d84814b9084d65572a1913b09ae7f3330ce5aba71dfb2a9c658114a8d5aee",9.317957166392093],[14494,"d3bd48342a265e9c4af4a7a663e7a7e8851b0a9eccd856494c10953c02b36489",9.317957166392093],[17412,"811427aeea844a24fab8b5e53cd8ddaf7ebb86c108f154e883296cc626dd9049",9.317957166392093],[19289,"05167ddd8b6ebad16d64fbfd67a538833b5688e771979344bfffdcc4e3622615",9.317957166392093],[6009,"f99ed943d8b4d079a1b0bf794c7bccc5bcb67a3e7763e45300318e6b304c06d9",9.917710196779964],[5543,"5cda579bf2bb34bd8b39a095320ed618b4031ef8a5104fd7194d8f5d259ef7db",9.917710196779964],[5871,"04c337f2b07d44e8eb72bde9d80b4aee18e2b98a22e18a913e1b6a500ad3dbd9",9.917710196779964],[19020,"7eebf6f7bea56920e7c3350829e8027ba4a2d78088e33e9c9d3cda584262d71f",9.317957166392093],[329,"8b24369d214763f093c9a79f5473f2ca2472bbb3476391dc80e5a6e75afad4fd",9.917710196779964],[16064,"09af3ee30c0a3c1d7218a233aec44242a3d90a13604d025e17e0483078b71467",9.317957166392093],[18338,"265325355207731267b8c7b1cba0f59015e9d84519b799b2bc1511fac31e1f35",9.317957166392093],[2037,"8691a47348966b85fbb7d7fa3edd9a778701c3f5a08de9274ae6e0430392bcf2",9.317957166392093],[3470,"bd85e94ffd900b038baeb80dc877ca731d776fa4acaaab3d8b466627b2c53be9",9.317957166392093],[2793,"68d7ae6edafb43e6fd57cab71fd2b799dbb997731969d92c32e20d221350c5ed",9.383886255924171],[15710,"5bf06cf53e9ece4c8cf7fc5e168bc21986f90a411dfb372dd91480dc8c003f6f",10.052724077328646],[10797,"3ee7204ff14ccc85b5fc280f616fc0364bf0a419ef751458c885b4d3e56d4db9",9.917710196779964],[5565,"04ba01e2df0b68ae0702d42986381e4565e5149d028608211d8abef70ca9d7db",9.917710196779964],[345,"d96d068c1b3b8d4e8ef5439f0dae575e4548f63b9967ffc96ecfca8d8b22c1fd",9.917710196779964],[17868,"6b6f738a737fea449d029a04b1afb126e29290df01ec792bf6e1e6e89e0dcf3f",9.317957166392093],[10178,"448239c7f1a842bee43029a8184a7fcce1a1646f5b60a828b57a448bc8ba2bbd",9.917710196779964],[10836,"f525b78a002cc78433cbc8e72ccbb18d2b5f6c7de67762bd1d9ac491c60d15b9",9.917710196779964],[15978,"a136ea276cb17effa73849787a2399d359d14649948e541c263502b83850ff68",10.905335628227194],[2069,"b7c9c4e2722971cdd5c3668f8b4882f05de48ca43e19930e54fc29dddc6372f2",9.917710196779964],[8825,"2dcecdc241f4b3575feec169a005114c85564b3362f5c4f1f33b702ef755f0c5",9.647446457990116],[7571,"656eab778e43975118289cda580eb7a0e345d08960b5a9a7045ba51a286c5ece",9.917710196779964],[4466,"5206e8c4493f567365fe6d7b245bde2bd943bc517ad7c2289c58466dd97da3e2",9.917710196779964],[6355,"6817d0ceb7da651283099c70a8ffef95d0deb2cf436b59218feed14db2cfa7d6",9.317957166392093],[12408,"a87a02ba1a7ac48504a7f1f789147a16ae1e98453b9ce44d8ce63e3ab60e90ae",9.917710196779964],[12735,"e596dad56aae70ec86cd5ff8aba9d04190d3a7b48a9a70aea9e61117b2d858ac",9.917710196779964],[7301,"0bfc48cc1db1b13cadd39c6edd376724d4633178c9b092b158e2e0a3576611d0",9.917710196779964],[10483,"3a36fedb3cb2744d46c77e2935091c83b64420aa46504a443a7e2ed1e27a42bb",9.317957166392093],[17335,"d59b58b2f7e76259bdb3eaab95c3eb6f05d28fc71fc4a444f93d3ffe4bcc334b",9.317957166392093],[9514,"f9814a9e63849617dcf4b063208269ba7cf221bfffc45109c026cd8d02589cc1",9.917710196779964],[8444,"552149d43906d2ffaab0855e7bf426a3d2427cc29627dbd0498d5326b4b658c8",9.917710196779964],[10345,"da8ee2ad2892e3b780bf4c16a2679ad7f8f426af8e1451ece7883d19d0940fbc",9.917710196779964],[6796,"471bb91761d30d0ae93bcc19733bbac209b63e776e5473c3c5c1e6ea833f4ad3",9.317957166392093],[8420,"cd7de1139838ab1c4b4246a19f05c6d5601fb05c4fdb9edbdb8c7a8967327fc8",9.917710196779964],[7374,"41b3ed7be5929349d4d9ac6477bd818e0e12648a6d0c13f033bcce1e1add8fcf",9.317957166392093],[17802,"e1a56d21113ee81a199dbca7f31eacaa4e4355738a11be80f0ae8c801b393a41",10.052724077328646],[13844,"bf92f562673861bf71cbb31e59a3786d6afe8233e5bf0c1cbf7d852777937898",9.647446457990116],[14803,"a59a074dec936f813b226e817fffb6726fe9799436f091c28af42aa24017cd82",10.052724077328646],[15146,"8fa1d06ba5e2ecc3b4443768ff58e54474bc8767ac611dcaf55156f04ff1987b",9.317957166392093],[9685,"e777cc9f1c7e324d2d6c54498cde796731dfea77b9bd0914455ab436efd27bc0",9.917710196779964],[9029,"4c374a1a1af34b708a91a6e9a92c0278d005ee4aa2762a9e027c0fb761cb9cc4",9.917710196779964],[12592,"0e781e67a2630c13507e127e350e17c28520522c24d735c1147e8f5eba7c4fad",9.917710196779964],[8223,"f698a6f90bb3396e15270579d9bc6662d37c31e920c200a2ee66a358d5aec8c9",9.917710196779964],[9484,"525d2188421cd3aaacbe4adc16648ed5a62e4f4a05969c2ea211dbaecb33cac1",9.917710196779964],[15422,"fb61835c3a508b6c1a6d75116ffa72d2d4b2b20dbb66543d516abf02dddee175",9.317957166392093],[14247,"59e6b9b0b9e06d111ea48ec4b6abf361e3d2e312eec6854fc37524ef0b6c028f",9.317957166392093],[2338,"c020530ddb40623b47743cd123c30019afca0e0dfc589a75f5ec5a958a5bccf0",9.917710196779964],[18866,"0389aeb7a7b3b8846441f3d08cdba18aecc3ad67d8670244ea58f9e6be917b24",9.647446457990116],[2758,"cc57b14046e43d33e696df856acbcd98a34dd9f794de6a86e7af473d68e90dee",9.917710196779964],[4530,"15a0fb81525b1410d3ef9af3a1b38e2d4dc5e4f48feeee034b466427f27329e2",9.917710196779964],[18070,"8efae9a65fea3c62e4a38b4ba9c397bfbefcbdf63bcb621a134b4cd9f57ab13b",9.317957166392093],[15442,"7fc2ca88b4c049bbc104c64ad07c72c42ff4fab3eb2dad1fd81db6ad01ee5475",9.317957166392093],[4062,"0371ab0ea723e19f8f66649eb9c15efe79bf4b66ea53bdb7ae1e78129c3958e5",9.917710196779964],[3309,"5cd57b15a308151b22f66445a9a3b799ea5f74aa5f483afd69600fa1e17c53ea",9.917710196779964],[4526,"137139d1cd9f7f6ec36aea61568e6de4b0cf17fcd086f5f8c316f5cf07922fe2",9.317957166392093],[15184,"fd165e1967ded50fbddfb73d9ae343148b9d68fa2f3e9c728440074a01e8dd7a",9.317957166392093],[685,"f69abe5be723e7c3b9d8e52ff59dd8e58966c545b0a5d4ce0b78c2d0479057fb",9.317957166392093],[19522,"f31c2c38d39f694feec5bc68f884bbfb3ba543c532fe6dc409dde426e5b5b10d",27.132412672623882],[8139,"a00ca218e971cabd3d191f930aff50836d14f983fc2070885b9d2cc231b272ca",9.917710196779964],[10143,"619ce6d98f6af17e5981ea466caefe2d33ffa88559017c2d69553b40eba26abd",9.917710196779964],[9104,"ae08e67ce4e9b3c5603895d62613bcd1d5078ef8b881c6229fc80099cbb727c4",9.917710196779964],[41,"4b59e0e8e05d8b57aa1a727aa3d3d65e9b76b4bbc658fc859cd00b500c85bfff",9.917710196779964],[17084,"0372da510a944cc40de2c5b9a950b12412f796fb1ec4d00502705d2163d03d50",9.647446457990116],[15020,"4634d7e726cb2d499fe9e3c2597237a94857f7e392c07f27d9540f61413bf47d",9.317957166392093],[1032,"66304378385b69d2a4905ef932060bb9160d0d4fc77416d9b3ac0f8f9e2d11f9",9.917710196779964],[19331,"bdee7f00abcc98186792d520805e9c525cefa7fa5bc96a568d9d88189ea92714",10.052724077328646],[12041,"23ff15c57a40cfb17dfebfb22ff445d8039ab994feeac8cf5d95fd468e140cb1",9.917710196779964],[11824,"4e7dc85586f980db597d778d4c27aa0a9d705e621d477c2ccca22c03d47a8eb2",9.917710196779964],[331,"65a6fd00bccabf5aaee94de747a98a4e445d6f380c6b23668c1de5759586d1fd",18.755148741418765],[19404,"13f9206abb2b5d05cabfd614eaccf30e7ec9b73b337b65f5a53050cda11b5311",9.317957166392093],[715,"556efc32fb663a16c30f9ba6aad2683bc28505d74539e5e6e39f0beabbcf19fb",9.317957166392093],[6938,"3798b106fbd07b06900237c99d4d08036a57fae8e95af16f3d1182743d1066d2",9.917710196779964],[2797,"2361721b7790a961752f4bce8e95df614b3891c48ada86ab1259337b4321b6ed",9.317957166392093],[12999,"4c10083bc099e8459e8701932db349047b79f6fc449ad0e6c9bdfab3bf3a98aa",9.917710196779964],[19613,"6a4bfa43ee1ea9de3d234a047ba6c9d6357ad850ca3c2b17276a6392073b6509",9.317957166392093],[16115,"7cabc1c54afb7914b40b847d452f2f5bf3a26f3406b702285c31dca8b8d2ab65",9.317957166392093],[2308,"c9e5f9cd12384d889e58652b9b4d91f0b0aedbb8cc9d29fc2bd32235e782faf0",9.917710196779964],[19724,"8555e3284a46cc5e691ac66cef8071138f6d8b8c6a5f8a79bf1b2fcf077ce405",17.97583081570997],[17711,"e577c6f731355609c50a4a3786cf264656c35dd680419611338c76dcd4470543",9.317957166392093],[10834,"b444fcf95110e85f9b10afe69eaf283acf9b29ae5d23a6207ae320977f4219b9",9.917710196779964],[11142,"2b9d58c45cfb1398a99af0018ffb93f7aedc9116156ca15769e296ccb93002b7",10.052724077328646],[13983,"8952e3d80d3dd239b80773d08c4f61f51d706abca2199028f9f46bbdcf5a4c95",19.066666666666666],[18303,"e1c2af88c28972a34c8eb9ff11792e108eafe8d69648f1e5dce728c29bdcc535",9.317957166392093],[14620,"bd55324397324af8977d74d60a17310e7a5b98a63b835203a1ea2829b5d48f86",10.052724077328646],[18084,"ad3e61fc3828e9e1ef284d4a9ee85d0ef64da92306ffa447ee8919faab2c733b",27.24890829694323],[555,"41e1332076963d5429492f4b148d6633384df9b4829d0bd503664f17fc913dfc",22.279646017699115],[11462,"7cdbb2adf92ae190731325b429e11e6300b7cca2f5b0069b7ab0a8b013aad5b4",9.917710196779964],[5666,"ef1fa5f341e10dfc4af92f40c53f5400a48cb0ce066f51052efe0f94262939db",9.647446457990116],[9951,"a4dfb6c14b8e3498dc3616aac40a0a1858d781157d3238ee0eac8dbec1bb9cbe",9.917710196779964],[10014,"cad142604d95278b11abba979e645fb433e21bfffc3315329ec24422edf13cbe",9.917710196779964],[558,"b2d4bb2854d40f7e3994489d9b43fcf94415881bcd2d87e6988fac777ea73cfc",9.472566371681417],[12466,"13b5751e204e0f14c21c17c3f517426930581cf50ea80d8c2703f15b63a934ae",9.917710196779964],[18235,"5fb4b9c8c334cf6fa8bd1f088d40a5fb2b85a0543f7cace4bb035fc9fa7d4537",101.59267734553775],[14828,"82c0bdcc99b262ef1f2a194f9c481f3993717d051f5f20793161811f750e5082",9.765429648739829],[155,"f274aeab300857d022d86f6a930107c2635c886c3fa16d4df623695ede7df2fe",9.917710196779964],[5222,"9ae605cba56df16a386929de95257a1a16f784fb3c445e57cf679f5f5cd4d6dd",9.917710196779964],[9386,"5b561a7fe837eed2c9415f8f8829fc95946e40abc053557cbe6117ac27175ac2",9.917710196779964],[17808,"630f53078d60bcf6e388836850e67a34f2fa49a7c1728c3181263de78b7a1341",9.317957166392093],[9836,"8ceab2c842c9fa7a090db232a6ee2d11a269cb6693a30649f69ac5e046ce5fbf",9.917710196779964],[2702,"9dc6ed54a79838eec159e1080a1b5eadf7801bf0d42e0ee82b63f8e5c1d373ee",9.917710196779964],[8112,"ad737803d4e57f099e1ac26cab10a673631ad2c443e69b7d60d34308f05cb0ca",9.397642257991386],[16170,"2814a2134b1b4e4df89b417689898730b3bcf77487ba47b5eb48bcfd2a4c8f64",9.317957166392093],[14255,"4cdd3f0bcb6fa38b73042727099dcf7366e9315a4f8e67fdc06b504b92ded88e",9.317957166392093],[2478,"9c3d8723e768c3a12062c2f914ab5463d061d6c3c23fc7cc05d00f1497e802f0",9.917710196779964],[11760,"7e271c0a3557416db5a371c04ac1cb3875e04fd05b61dd1c60fcd6be9382ebb2",9.917710196779964],[10431,"c5508de72e1ee76dd1126a4c20ea13d8e0e857abb2faba34527be712d9aa9abb",9.917710196779964],[8989,"2c83d119b633484dd2f9cb3e8b7cb4e25388399ed251ac36e993e6a224f1d3c4",9.917710196779964],[8567,"03711e6cc58ed8f5f219b737e1c8e119cf538faa42b78c6dbe6eb3adfc19a2c7",9.917710196779964],[19743,"d4e797520e0f17657e9b67658b146f85f61ac86c31af85c08539e72b546c2005",10.053097345132743],[18846,"5c964faf0df27a9824d4317caadd128e82658c0e4c08e56371f4627581a92225",9.317957166392093],[2166,"293d7848e931052064a1d9b98c652af03111b6888e0019a7120d914483afcdf1",9.917710196779964],[19414,"0877b5e1c1625be1f5bd2ba5cc939b22a2585bb51e07346bab3bca272cce0411",27.87830687830688],[19749,"d2e891473fe3cd87290129a0c9bc47f6ea12e60a718d31817eb169583f37d104",9.317957166392093],[4868,"a220940d7cdd6445112314acce696001735ba3e4c541137fbc424ae04a5d05e0",9.917710196779964],[10572,"81efd8b77a369809650ba1e745700d2ab4fa2009cadab809b3b5fadb8040c5ba",9.917710196779964],[2183,"a8e9013645cff6d00ef785bf133f94ddef5d2a0367d410dc3a7d438d1352a9f1",9.917710196779964],[2618,"9fbdd81e5a092b66fa2bbb6b0c40ff46dbba19803b34e2ca390b39a56adb0fef",9.917710196779964],[15769,"30fa03c8cbf4a28b47d39938897d53ad0bfa6ccf9e42e5898d8c05e05706fb6d",9.317957166392093],[12380,"583f6c688e90bdb047d42c600038dbc531b63e10f29b2a87d7ca14b0ea5dc3ae",9.317957166392093],[1479,"5bf4149a6e6e0ddd1416b24aba425cb4e73c2d063b084d689d6a6bbe4fdb46f6",9.917710196779964],[18079,"e6b8a33e6c853ec8c49f5fcb919ad65a95a6a28da28337e0b35bfe38229d863b",9.317957166392093],[16933,"925c72a2a2b5283d9b66c80817e19821b269e6a6c902805021d619269e006e53",9.317957166392093],[16537,"77c66be4c95f7750c298bdccc2d4daa67d5d28bdc45f7e29a8d5008774d35b5c",9.317957166392093],[18743,"25d0f64fed800c3589872cbdf0118d8559777864725bccc74f446190b0a9e528",9.647446457990116],[11024,"a615a45d4d80c53df03cb2a27da1d9d5ebf7f817d8f394bf2ab1637daceddcb7",9.917710196779964],[1469,"dbefb80edda3b3a3e5f5390a9ecff40c709c40a7a886c1e7d1c075efd7d75bf6",12.384341637010676],[14069,"b56e4607c55fa7ac8c58cdce4e998fc771d9f11b816522802583d352da444793",18.507462686567163],[9589,"22856f84d8052e6c27d1b51f6db2c358d0a27717c0ea59f6c21fdcf256dc0fc1",9.317957166392093],[2,"b5d918327ac276a2fec83a20562bc36aec5fa7f83e00959d6018bd6b32acfcff",9.917710196779964],[5100,"e624275dffa9685b065bc32ab90d601b2e286820650b0530e8348e125a0193de",25.829596412556054],[8600,"aa4e892806e056cffc5e10f8aa607dd9870cec7eef7e0e76be1f40c566556ec7",9.917710196779964],[10166,"762caff1be3a025214c47d273527077035a6a13b2a12613c07c05d89f8034ebd",9.917710196779964],[1131,"20c38db12d73db226538aed9f628223311843a7c96a8e304301af072c2a566f8",9.917710196779964],[14995,"0281465eb7b3f2899f77d7e8f6f1c9e566fa1a642ba532e16b19b180c07b987e",9.647446457990116],[1629,"a8a5b16a2950dc0f04c0854f3ff00c18644841e3af9d8ebca5704ff26db16bf5",9.917710196779964],[4811,"76aeecf4986b9a757ba1d800b354fe7975d6641a424318dbf6911313b30057e0",9.317957166392093],[13908,"2bc103eddd21361719880a9a7b88ca2b1d4d249434987cd1c547cd1c6fcbdf96",9.317957166392093],[11891,"9088a201578d863b92571babbffc19e82395a974df3ecced5e435694ffca11b2",28.09964412811388],[3672,"0dbea09f94d13a08c0dc69041d240a4a545a194c776ab9bb8def6b53f45ec8e7",9.917710196779964],[4339,"be346fa4a24c72acb7c1b9bc390ca15efd28a936e46de88659c4b06745ca7fe3",9.317957166392093],[11840,"e142e889dffe3e57ec196004386c9080bbe6ed053853e77875a789eabc8b77b2",9.317957166392093],[17551,"cec116a2d34fd4fc224ef9974fc03f4aa7824f18389fc440ec02f4eb31fd6d46",9.317957166392093],[19393,"cd47b9976398bedfb413ecea2cc107e9037bab3fe36e380fa4cedf0234d70812",10.052724077328646],[5931,"ca8c574463ec33af3ee851f15ed6ebbde8c1b089b676565e1552468511f37ed9",9.917710196779964],[9543,"6747ff970762beccf2c51ef56cc74354193e5360e1b9c8f165f77ca23e3270c1",26.13903743315508],[1914,"986cfe02b18aae691c75f87a6829e9548eb1c1cd6d7cbb192566e7beea2393f3",9.317957166392093],[10565,"e9e5b3e2aaa295e3dfc985aa24d713117670eef54aed0a178050c3ef33a2caba",9.917710196779964],[4516,"d3467c433dcb071f98abef0a8016f6f6fe1eefa1ffe9ca29b2e158791b2140e2",9.917710196779964],[6591,"e57e100c4d5d995d37ecedf25110f38333cf03f3a444eec54766400b5e28b5d4",9.917710196779964],[11277,"ed657c98d142bc033274ca9fa49d0ed944ab0b28e4dd768193e9bf7a832c2fb6",9.917710196779964],[13083,"3d3ee49c7f95f1814dbc528b53b10d3cca8e244983d23dc8b175f5a4f35ed2a9",28.19221967963387],[5060,"26228200ff377dbcaefab29a812e95ff7b57e6b6eacd02a14ccbd8cc12d6c7de",9.917710196779964],[15657,"f1c8a2b416be3edf54fb2fdcd88d2267cf423c0a48353a1697a10940b7c83070",9.317957166392093],[10254,"444c8a6a99dd035c05a9499c62bbc8d62dc58025b709b51f0b041d73fe0dabbc",9.917710196779964],[16569,"7a6fd220236da9bf696001044c4b3fd4557371832e0be3cb8e5f56d3a42dc45b",9.317957166392093],[6199,"7ad797a5d34419fcd4f61f75ea72d99204be2e67a6fc4766bbfdd02c9c3dbed7",9.317957166392093],[9233,"a193f4a12a7b3006aee96f8c00b5ade77a2f653cae8a5838d5ea6477a31e37c3",9.917710196779964],[15197,"496e34001b5a49efe2b5f15b83793fed2423027d311296ac9415e1674a51907a",9.317957166392093],[6788,"43a52dfc6cb570491c6c9bc1d5b5515e7b13ebb91f18d35f265acdd41b445fd3",9.917710196779964],[8932,"6f242483efd382baccafd36fc31acc5ea21f768112a33194e4f6719f9a164dc5",9.917710196779964],[3097,"254fdb2bb9e25d87bec3b220e6a164260837e0c4226b15a9499d845af5a0a9eb",9.317957166392093],[14741,"2e5bada5a05a8a3fd30c3c892f7efa5b11ba37d5713e9f115a939b46a7991084",9.317957166392093],[14167,"77dbf4fc97bd283728c24b72315fce8485c86dc3f6850afed8f3639f42331b91",9.317957166392093],[11138,"800c5e7f83de0fa36e079922d14e43c6f58ac9cb41b6121281d7cbb3c6e807b7",9.317957166392093],[17015,"93edb65286c709324241c2247c388f5f62cac0317409be8a70f8ee78c33dba51",9.317957166392093],[17010,"0b30645287c1c5fc501ff5862a55b964ce8b428ffee686970560f348ae5bda51",9.317957166392093],[4404,"8f153031c8fc991cbce529a8ea74f091b70e5e304b2937930d19b60472e70be3",9.317957166392093],[15896,"6b5226d5d94a95b0443f9fb3d7de2121b5255f346870313c642260288da7176b",9.317957166392093],[13196,"813541b4d43beb95ac0507cb8350e669d4827cf666e9d1d1c0b67f0823fefba6",9.317957166392093],[3787,"d583f9c14572832abed2f714569b5f845b0868d2b39bced7f86385da583608e7",9.917710196779964],[4862,"9111706982945c20fbc5ff23996c141ed70f64e83038b9d48aabcb689ce310e0",9.917710196779964],[2962,"ffde93a56fc94b915b667e2e6f7692cd5a863ead94a29d8783af31d6cddb91ec",9.317957166392093],[12732,"61e123853d3c16d7ba136fe7b2df474775e9103849f5f5e3e8bd725385b462ac",24.233128834355828],[15170,"0a3543673537e3c617e5cfdf7d60a8649b162387b290b13049234e6b18bd1e7b",9.317957166392093],[1877,"8e6e9db1f64d60c109308e82d84e343d2579cade06ed70d593416b78dc1dc7f3",9.917710196779964],[9624,"19eb755642d2e2c1f7225405aeb855a2042e05aeaf141155f31b39fe6002e3c0",9.917710196779964],[5406,"f6c5511dd307a8d199fee36f84e5a4f97bd7b9ea539d2b1fa8383b240550c3dc",9.917710196779964],[532,"addc4fc529d65c1bf85ab8168fa8fd7928ddc8b5287d9fe1c1f0a93e030671fc",9.917710196779964],[10577,"9c4e09b15910e4df05e296ba8857be5ece1d79d86ae0c9ad910685f8331dc1ba",9.917710196779964],[12133,"8cc568e0e6ceafea9a7c7235443f91f3ec0ec7b4ec7007599d8408ec12797bb0",9.917710196779964],[13143,"0af6f5b3eaeb15fd4d557d434f16c2af2643ecdc5aa2bbff2d3ee585a3af18a8",10.052724077328646],[10374,"37d034cf9e6193a53c1dd769f86a906f65ca6a05012e160aac3cf9b533e5f1bb",9.647446457990116],[11747,"d7c43ebf453c8165d2419d1618058813e42d77b5e7b612d5e0de15692d0307b3",9.917710196779964],[4013,"d93c73f4c2b99708c1c03da9eef6768634868f6591c0dc75257e5ad28e82a9e5",9.917710196779964],[11636,"ec7132cd53607bc99b5e1d692381e2c54e7ef6b8d6f9c3c8eb4818663707acb3",9.917710196779964],[1614,"d2243272de6d91d5481706d28c8d95e32e213497f1e168f2c4527103f5157ef5",9.917710196779964],[1265,"b3cb02bc4ff629a974e2b4afed6dbbcb2207cbbc00565e56cc2d4d3179c392f7",9.917710196779964],[927,"b3265d23dbe8dac7432fc9d0ff8164421c9f72b9ff4e92d6e09c278fecf4a6f9",9.917710196779964],[18329,"4ce0db75fa1d2e95620b3b333505fd5f17bbf0c4df25ad0c9fc1964fa0f14b35",9.317957166392093],[14719,"1871e29576e98b57611bac44f8aa645e41c17e3a779e46e476be818325a88f84",9.668934240362812],[13375,"83840aa8fb024be05979350356f127b77f1d5543afc8ddebb925b844c02deaa2",9.317957166392093],[11408,"9168ac53c89d8c0752fa18bfb92a5b718ca76ea1674987eed8c9d3ca76f34eb5",9.317957166392093],[8013,"ae4f4621bcec2e66d5d86eb6765284e690fc4b5c03a6241b61817189746976cb",9.917710196779964],[3729,"604fa200a48a24d99f67b49b7befc5364ef239c54190033430d8ebb006006ae7",10.052724077328646],[1077,"a43f121b100ff61ab88e57c5e59b4d3992241e6aa33f7f8b120f78a51b2fbef8",9.917710196779964],[14302,"2e4e8753660b4e99c6995ddaee1ae4159998f9f71935e36cbcbf13395b16798d",16.9757700696125],[5165,"d680e6ada490dea494ef3e454a42dc1f8ffe408d38602a6bae6c8bca427d2ede",9.917710196779964],[2315,"50e446a45acdd1b2a820cc8ccaa1f7c58126b4a458bc8e1062d53e855253eff0",9.917710196779964],[14933,"cd22ba9cd615c72768fbd0f515c01b40db813ced704fecc2756e294ec96c2280",9.317957166392093],[10131,"9fe2f57fff7aba97570f8ec01d297f46624efcb99a79d7617746301b7d187fbd",34.64961530463714],[12640,"89d25fa8d46d4fffd49a908c4ea7a492bb96bb3eb76a0f37ec85cc30393dffac",9.917710196779964],[5270,"0fd9d969c7ae0ef748be6c38f5f9db7f7ef1da1f6dce7227f9cc63549b8993dd",9.917710196779964],[13299,"893c82a6e99cdb5e30339009ebe467feb437b9cfc55f47c826a53e98284a8fa4",9.317957166392093],[13885,"b0b9fac7af9cc3e81639ffed1225aa95d8b1baee57eef3c19a747aa7f4b24c97",9.317957166392093],[17153,"96a9175dc754994f4e20661ccf804986b0136cd522a1db3a918eb937ae6e0b4f",9.317957166392093],[8536,"7458684b86a22933f9033ba7fc9269ea7e13175ab520eee6a6db2e5ba7bacdc7",9.917710196779964],[16219,"8ff2be0cdcb971154735ee60c2c4e3287adbc8b54853f5ed5ba80296c6c36263",26.923076923076923],[349,"fa17ea6d5ff5bacce3bbea27d00567b16d25d89d7dee50f9907373e709b8b9fd",9.317957166392093],[8428,"3b55bc9fbcee324c414e3db57a3d25a971aa51abe0dbac9447d22f5e40a671c8",9.917710196779964],[4896,"8070caf6369f6d7df6ae6c2d0a650a2924ae8a502685715224bb3d3f4b18e0df",9.917710196779964],[14215,"4acc01f0a24a0a6ae6a468661c00192c4a0274ea7624e176ff3f1ad6d44bbe8f",9.317957166392093],[7644,"170cb44c57fb999982f5197a6a146b4a6d751c2f983e2ddee207d23dd394eccd",9.917710196779964],[12987,"cc2c16011467c77721349e120d4bf3c8d6de5ea80ce4362a36ad48e18795afaa",9.917710196779964],[8332,"f5a8b2e2404bb57f0d6396e4cc39097afb028df66fadf04c2dbb211219461dc9",9.917710196779964],[11921,"925ec6c962a8a427d0ef1f833259d56b4164c9e49e1b15b52dca95012dfcdfb1",9.917710196779964],[3769,"c25ce952dd2d4cf9e0dcbf1eb56a779c44afd6eeed31330790273858986826e7",9.917710196779964],[12847,"1825b90417ee8fcab7195d8277c11cb0d66493ff4338048aa1e9931af4719dab",9.917710196779964],[8490,"8d51fd06b6c057a39f8b3bceb4df4d1b014de57e6e32ce5d6d1a6c4add0e12c8",9.917710196779964],[17247,"984218169f2969756a6cf61c2062ced9ea6b59ba23160e296f0fd8dd723d074d",9.317957166392093],[418,"e496a067c17f0bcc77fb163c757f0828f235a1fc17e67f869a1f02b7819f42fd",9.917710196779964],[10193,"6f0569e2741c473b79f25b4f1f909e474cfe643b163f441ada5e7cc505e20abd",9.317957166392093],[4669,"738b4d4aed7b6867522327d858ddcbaf1b74a1533a50c1b7498841563cc22fe1",19],[7948,"b5d82a74d34303909bda5b2d4d9d212698b8433ef7dbdf6aca1fad4ec6eae0cb",9.317957166392093],[5123,"e1340144c0ab944b088dd4e6d39eafc2b801d27d981b4c0f1e6eb3e0350976de",9.917710196779964],[16554,"a213f05b2f82596536f0ce85c249ad66ce616832274fe912acdd2348f860f65b",9.317957166392093],[2026,"90f99c8dd6689a2b1f48132d294e22d7805bc908081530e482dd2e44fbe3c8f2",9.917710196779964],[6537,"f39b4463aabe935245f5a29b0c75573cd324b7fa82b9efb819678b4fb87924d5",9.317957166392093],[9197,"11313dcec0e166be5449706222b7197ca64fc4d8e24bee422c78fdd8708e73c3",9.917710196779964],[11567,"1c3a4b76fdd0c45c22290248de988737427e65de1bc3e6872bbf17fa5d9223b4",9.917710196779964],[6948,"ea6787d452251c4f9577584e30b27037da619d5f4b09be1c6d02899068e344d2",9.917710196779964],[14509,"f7aa3a7ddbd9276f81b59e33a2581d7d5b6ac43822fd037d10c46ded74dcf488",15.943362831858407],[11638,"988aac316546c283a2177e2797198817662c9a66b7b47bb09e165e8e3a25abb3",9.917710196779964],[12619,"e03f3e0f184baf120dbfa7b891baa9bfd89ac512498063e97583914a1a5d25ad",9.917710196779964],[11480,"2bad778533adf0c3dce9ee7df35033ad6a607944ffcbf7341c5294bb5510a7b4",9.917710196779964],[280,"c90f18eaad9a96cbf3e01254faebc19275bb5551dbcf6a21083ed1dda36712fe",9.317957166392093],[15029,"be19dc491fd1997b3d2913caa9aa412c5733ea212638c64206ddcd026548d67d",15.003322259136212],[1425,"61df7353eca9529b2030a0585d6a3bedecaa6cc8c78ebcff838b963ef20dadf6",9.917710196779964],[1073,"c986d00fca23056ce63a6643ce47ee98a5fd88b163820c943c03e9558689c1f8",9.317957166392093],[14514,"5d08feffbff32a03f17586411a5f977d0d98d49aba1efc180864d7564457d988",9.317957166392093],[1070,"498cb92988b75eaa8c219181e2fd03a896910883e664e51c8df18953b90ec5f8",9.917710196779964],[7265,"a2b9864680abf6b3a18b9a90ac925a3da6c6df048150727481e9228a95e63bd0",9.917710196779964],[13772,"3c9d1ab1670af24c8b6990b1446415204b88a7273944a8315e728285d611e699",9.317957166392093],[2255,"a917580624e38cb76fd1f1849b1f9e49516dadd3d96cc22336899fef39bc39f1",9.317957166392093],[8910,"8ddd18a1f319887a0dddcca622a738e4a46704e09acdfb1e7292285cd3a262c5",9.917710196779964],[10727,"f59b1f265bd343a3963492165a9ff5a244a877560f0369217a4ca2041ac1d1b9",9.917710196779964],[15081,"3a524275b9401eb508c7bdf3abe4c4dc0275faef8b819dfd14dbf7799641007d",9.317957166392093],[7156,"c465d9e6b41e8205160a15630bf08d95776957c41fee2eaaa12f04456c50f9d0",9.917710196779964],[17654,"56d5fd6d8d2e9d0c6ded1d06936077380d746fe34ebafda407b5be47d2272044",9.647446457990116],[11642,"309f9df46154a37ff4dd4d42ca216e096421a9aebd0343824aebc9993bbea8b3",9.917710196779964],[11560,"a272ee04fffb0e917dcbb597884087f40810515b245088aa241fcd5a64b42fb4",9.917710196779964],[5855,"27da6f4ef8194a8158743221ebd68b136cac8c4071f9fca75ff73bcb4745f8d9",9.917710196779964],[5095,"1509fbfaf17e6da8d8882df71ebbcf80d80f0b0c71024eb385a1ba457e789dde",9.317957166392093],[10100,"f7cf50567680025925330077db58972b1343cfe037efbd77154fcb9cae6fafbd",9.917710196779964],[3818,"b6cb35a898adf5e241fd357a460a656ace7373d21f8b5eab679c3cb943cedde6",9.917710196779964],[7399,"2779e7ef2d1256f7831a58143dc41a58a16650037af025e0220c476c01216ecf",9.917710196779964],[2604,"71526ae6747e519facdf8bc27d29b8c004a6493008b01b7e415dec37cdb120ef",9.917710196779964],[9161,"3b7caadac3b088e05030236d64e3db56b99c3b0330bcdd39b14137f18601c5c3",9.917710196779964],[4261,"5aa3a60da908dcb7035a22f74020532a923d4854f7b2af3e3c2064e748ef06e4",9.917710196779964],[12785,"dea2758dc60495b9dc4731a2fddf8e859316bef8f2fb8900b4c7249282cf00ac",9.917710196779964],[17557,"1c954a2909ba93949d26974596dd555cf2a5f00f64ae8cfab4d80db379d75c46",26.09252669039146],[17061,"aac218aea5672edeef7c8c66fb9f527be62b7eb6825b7cdc3206427047dcd350",9.317957166392093],[140,"061e59215e3964dc24c3e395c66059cc97fd8400adab62ebf2e11f49c42610ff",9.917710196779964],[6387,"470a1b6b4aecb2312cf7db38819f1df99e50c239eb366bbe26be7c2440dd66d6",9.317957166392093],[10300,"2d6fbccbf22f626852e283b5f40d4a08954fd9c8fb4f392b5045d5b0c71360bc",9.317957166392093],[16805,"a7653a5529e6a4a7076cf49c5fe020a0daa88268f770ea61b60fb7bdbdb92356",9.317957166392093],[15758,"d110315835b0974336e7f0d2a79e96a317bdf1b8574898f0bfd9af5e89463a6e",19.085972850678733],[12160,"fe9776c7fdb0c5bfb33aeab85f32542284fd5f3b51032be8cb5bfbdce4c749b0",9.917710196779964],[8656,"a623cbb27c0d191ebe50f59535ee8ec720d81a5597d9312a7ee9c2274428fec6",9.317957166392093],[14679,"e224d27699ae3205236f3a1874070ce3755d651452739f398b46ef9ac5824285",9.317957166392093],[12172,"7963549da0b124c6012bec71dc87dd5db7325510de95345d88a5eb2374183cb0",9.917710196779964],[2800,"aebf7fb3ef8be5ee92f410f7253983d54078ee247845901459ea45d30326b3ed",9.917710196779964],[13221,"b8126bdfdb0cb165063e6bffbec1bc725484ebba77617a70c3893c51f69e81a6",10.052724077328646],[14024,"e12912ed4b8bbb69583b1fa87df862440e7e2b9ac39c2b137a5f8d25b2953994",19],[3700,"ad3ddd61b5d538826f5c538e16f13c1fe8502e705ac593723117d958484497e7",9.917710196779964],[16043,"7c4c374e8759fe63e6d9f564143f4c1fedee690ff764cb6e6799f69a33d08867",9.317957166392093],[15634,"52bc7eafef05137bb0a24c80410f342269fbec913042c76454c14f55cbefaa70",9.317957166392093],[1820,"3b4800b64b1a46878bbe7756d53ebf236eec61badc99f89bb31feae8518b1cf4",9.917710196779964],[16457,"f6c525ecb495e380ec0e76906958f4c85c4c9bb97d8deb0bf72140d44e1f185e",9.820170109356015],[19269,"4b670afe437a79988e6a5cb135686fb1bfd00dff136ea4b891d59057c7f1e915",9.317957166392093],[4099,"c24a699518957a33767914d5800a4375081720bf432cae9cdc40d0b4b9d212e5",9.917710196779964],[3361,"a8d9a96318472b80e6cfa7df277b5b7cbd75f795c7115b9d7deb40343b94f5e9",9.317957166392093],[15022,"011f42c7b882b404d94a32a76e4c5dd7e3c999fed65ce6109a7e667ac8a3f17d",9.317957166392093],[2017,"81ce965c42f747830dd16d52a2ba37da4e328f6e09d26fabb4a5d60ca3eee6f2",9.917710196779964],[6005,"7c563c8e2bd3b138023cb5c86b9da7d75dd5e45e7f5dd368046f21fdc9270bd9",9.917710196779964],[16986,"8a810963985a4c99cc5d9467c65191b82129f5b480125ecf8f7e64ea339f5b52",9.317957166392093],[17447,"cc6f590c25132d205efffd6fa65cfcb40fd01425a73b3976cc2ba7d4ca9eb748",9.317957166392093],[14517,"bba9aff9bad50e785d912f1b1b3c296d66e6570d2d53384314df0b6698c6cd88",9.317957166392093],[6302,"c3b2f0e634a8055821b52a2d6ffc50d8bb4269067a020e2378137fe3951b02d7",9.917710196779964],[19273,"def506b254aa9f22b0d03dcaecc74b07f6aae8ddadec71487e59448d96e5de15",10.052724077328646],[5524,"00d70f354da99809b92aaa40afb4679786683f2233b1ad9eecb6c0bd820015dc",9.917710196779964],[11912,"4bd5f2bbd8ea1dc10a934aa42ed3cd5baffac83144ea4c7867c9b769dc8ee9b1",9.917710196779964],[121,"2f0a5c6c32d6bf0c760b13798fd4112a86fe18c2ac522c8289133fab7cf13dff",9.917710196779964],[3434,"873185d2d1ebb0db65d9f8bbc68a8d0609ab2f1367729037ebedf76c2c4b76e9",9.317957166392093],[4216,"2c4da5b811613011b6697df1a72a62cd802881975d554fe6cf73e610ade359e4",9.917710196779964],[10432,"a26d6ca4f8a7841f721b2c08ee9fb7963d92896de004b2d0f93227a3242c97bb",9.917710196779964],[16785,"e84fddc332e1904f0cf36b577456e7721de52500aa1b9aace552d45f3007b556",25.8908072795147],[17740,"090ed875af48b5c90cc03ab7336b81818143ab1a32c12ca2062369e2ff7b6742",9.317957166392093],[10502,"47ccfc0b0dc1c2ddbd44703ace87f115a5cb00544d33c01dfb3c08f49ca728bb",9.917710196779964],[16950,"aae2bd316408703e2b13f868b883165bf5d3bc6796abad99539d8e232a802953",9.317957166392093],[1062,"9089ee923a6329ff2b810dde7cf518e63c3775f613d6be385909a0e1b62dd9f8",9.917710196779964],[2496,"5fcf73269bf1677546ba87902c67fc0a3a1ac022b713fc4d7c839da2b2b6e0ef",9.317957166392093],[11042,"18b7b838262bdfd4b9304870a10d1f28d3e53fa9a76c0211554092cfef6cc7b7",19.216494845360824],[11811,"2a2f98c3f1b24dd395867312b8f4ccd8c038a3f884183921e032f2ff49eaa4b2",9.917710196779964],[9111,"f7907d51a0e42ca3ab77668988c000d157a90564b19c2e6b5790b1d7766211c4",9.917710196779964],[4543,"9a387e8583e8af9f740a71d190cd7a126718067c9f34f6900d76ef2f263914e2",9.917710196779964],[7328,"b1901d4c6117ad38600934dab2ee7f24416d59c722543692a5746aa61988e2cf",9.917710196779964],[2091,"bdd9f7d3f5edd77e70704bdf77f0d82ef7389115bfa3a217bff1e43f889c4af2",9.917710196779964],[5797,"ed2a14ca00747bf2eef9c035f0b6952289d68c188761a3fb90a2de232c1573da",9.917710196779964],[8102,"97612dbfa2608f4bba88a049f91e94cbc59b55554e224ec8985ff6f5edc2c0ca",9.917710196779964],[14853,"1465f9cdc92466310b0b35ac60f82d00b139b6165342f5fd2e4c72bc7b42c481",9.317957166392093],[1281,"088cd77dbc0d0e354cf5379b533cf9def9f1847a203793ec0f664a9371f47cf7",9.917710196779964],[1317,"de2028a7879813772a0962274d74df964ab95992c013e208b708069135024ff7",9.317957166392093],[1809,"8eff2c6f143069dc51bc11715eeaa7704c11aa769507ec8f574920a24c202cf4",9.317957166392093],[6420,"be1ba68e18a573d63b02c90e33278e7417afafe94a89e372bd131333da612bd6",9.317957166392093],[18045,"53e5589b2e147ebce98b5ba72b1510351ce0987c60e6032f9550976297e4633c",10.052724077328646],[8255,"d172bc2182a761b7a2c3e76b17f80d3607a70b9fa866c36a3d3717abfadaa1c9",10.052724077328646],[3623,"04d6f14b3b030681d247bafcba605d0d5f97cbca0bbe208e29215b9829ae15e8",9.917710196779964],[17278,"cee56887688b72eb11fa7faf75f7c9115a904e692814d94ee26fb707a295ac4c",15.055079559363525],[16492,"01774b80d403b2da44096dc24db7fe863065a021f3b7cd28cfa257e34293645d",9.317957166392093],[2826,"fa4d64fe33bff994ce5f84c91d3ffffa40a5b773ff2b486286cb6839d03186ed",9.317957166392093],[562,"5f6f345f667f6b47970b7cb900fed35405c17c16cb90ec3fa0cc7524461c32fc",9.317957166392093],[3508,"defa3a5a541974f632c90be47ce100eea5a63b4ece2e3c1d129c8aced5a6efe8",9.917710196779964],[3853,"10c2712cef40c959669fff15c4ef586682ae9124f4de8ecd3b95c03158b6b0e6",9.917710196779964],[3865,"92d8140d8b7565fcd4b02ca8c1fc6149b1cb28e45373adc45ff566779dd894e6",9.917710196779964],[10957,"0421aaae4dc580a73e224c298ed63dc35d057d0e8dabe50573e629c0fce94db8",9.917710196779964],[3410,"c888ce29e576455e68f19eaea56436f380eca52bf9ddd9c849985376ca0d9ce9",9.917710196779964],[5488,"32932f038f8f5fa3a741b864a3e9967500ccd2336e2357fbb25402524f574adc",9.917710196779964],[3693,"dff1703549aa3317aa136b2a9fcad7476537cffdd997a68339a992c47238a1e7",9.917710196779964],[8290,"1cb0d28ec3d63dcf7022dfd8664f89d4219435117d7b82f2d27be43ea17961c9",9.917710196779964],[13010,"a2a17529cd73d623e9f912f938d7e8f802e99a808b471998f28e1cb8655e87aa",9.917710196779964],[15232,"27ce6ab49b4a8fb9534f561b5ca5048138230cb01ea09cf0024faa9d66eccf79",9.317957166392093],[3678,"a55543f18ee37a2d32a342c5b834a6932ba9c673787b30f6d6734581cb11c0e7",9.647446457990116],[9956,"82e3bc4a460324443c65fbd08d93b5963902155e98e27ceda09eea315fcc94be",23.069486404833835],[12690,"2d60bd9931f69faefa2f6f295ae585880849031d3b431b9cef37715fce90a6ac",9.917710196779964],[3657,"899fd9003630a0a59ac79c217d55299ecfae298207f513cb1191928eb700e2e7",9.917710196779964],[9641,"0abff76e016c4354ea0dba8a2e8c252b7a52ec6e3c2cdccd377d7c539fcac4c0",9.917710196779964],[2816,"caccac0f53157b540b4bbd76915ac3cb6ff1ca9af0503c14758f30b9e2e692ed",9.917710196779964],[18275,"cdeb3082a52d646d485df8994683a6bd1b8549ab16b573ecafed0a85af1f5b36",10.052724077328646],[3462,"54e06cebc6e8484600fbc10325aabb89c1449ba385bb0ec87a23798c278249e9",9.917710196779964],[18649,"a637b50d29557a5314b02c21de6f6260616ea52de7d4a9f865ae2417cef8a82c",9.317957166392093],[16742,"1fa8b2c5a5c379750d4ff645581cd672dfd19f20353f3925c161827169fd9257",9.317957166392093],[3568,"82536316e8ac716a7c3d48e569161884bf911da3b143c74cd496465ce4937be8",9.917710196779964],[17310,"d3de979ca27be86ee4d2aa367bc2b6e8788cb06f3746a762ee082dab54cfbc4b",9.317957166392093],[5812,"cd6524e8dcf3d8fb1528354f60bd0595f3108291493ae1bd9dc3f402a99b50da",9.917710196779964],[18388,"fd08568b77bdecebb819c6a45f4221b54288a29e7193f86828e894ea7955a733",10.052724077328646],[2479,"faa8b0f692548f4fa74caea983974e009fde1a68a1c3cf0eefeffb5bc27302f0",9.917710196779964],[15161,"ad6b65723ede373005af4e51bff98a006d46289602fb31fdebc9042a94073d7b",10.014641288433381],[8561,"410725232b28ab820741f56a4406237d9c8f3496859dd12a2398d44d3944a8c7",9.317957166392093],[6662,"6102f462c2b4f51861142b3911a50a75bd91e225ff560db6e30cb983b3873ad4",9.917710196779964],[1253,"e9f760511ba4b8f2a5a028780fd931e97ce94c7f9a036f2e8b6fde44bf0da5f7",9.317957166392093],[15743,"ed7299349fdb15ad8dcc883a79ae282f007c0f1ee23de8652a038ca19f07836e",9.317957166392093],[8738,"e8706c8c7681dbf391ebbe8c691ae3fd4695dec84f70eec7c13501e2972078c6",9.917710196779964],[18876,"86f71f6c70cea6ce0cc39b730eb94e2c9bede6d187720292f1c4e9d836da3824",12.033930254476909],[10509,"daf51d2e52ea7ced2df4da5a10052169e4960764ddfa639eb92ca1d39a261ebb",9.917710196779964],[7268,"f1556b3b7160d793e3a23e3ddaf9b48b071107c35ad12014c22ebea4ec1039d0",9.917710196779964],[16656,"64fc7829846b883e3cd114a216f6a763ca5af7ad5248eac2d262125000328d59",9.317957166392093],[7999,"5875a67c493dd67aa6f927a721a6d2070a4b9767d8c6e70c8fc75df52d2386cb",9.917710196779964],[10636,"adf2a6e13b9ff37b1bd7f7169c8503f8e0175270d21d431b0731f27d65dd72ba",9.917710196779964],[10006,"712c97c1e81b5d6dd7c9b1ed2b49b4d5155b137e1c649d39862b2f0708474dbe",9.317957166392093],[18825,"d02978b73581423cbad9954c58d527f8760580b79e53ad2a28640dcc6461f425",9.317957166392093],[8686,"9c1a78aea70199b1ae9fbf3e8b604e7e0344f176b9f5ad7de10a92b9d5c7c2c6",9.917710196779964],[12372,"bca9af736ba5c0a2a983bbd1aaff79667ae649981f5545f0b7829f5c68caceae",9.917710196779964],[19067,"354ec7ed720420da7f86b1afba28761dfa5508ab116de3faeb48aaade84a171e",30.989547038327526],[10201,"7191f375eef40fbadf631396fcd1b0e30477efb5ab55527cbc0951f473ea03bd",9.917710196779964],[5604,"1c1a0125f879be1a28128566bcef3beb5c1bb57e5491f90bbc40c65920999edb",9.917710196779964],[17959,"391e9d339abc386d4748f3b91a4f1c65194c7667219410403dd7ec50bf0df23d",9.647446457990116],[1972,"82197a86d3bd72dd1cf47730a2387a576f71ad9a9fce50ee9fbc34a4314c31f3",9.317957166392093],[16922,"9efe82a18ec3c05503ff31e8af97f646a419f3acc7f95ba7fdb66c1f1014b953",9.317957166392093],[10514,"e489e28dcc7bf80929c0d1852344cfedf92c5864a2f117535d113c0ad1f917bb",9.917710196779964],[9466,"5ad34ef10a8502940be09b9dd4bb9882aa9a3e52252e91c8c79c99965e3febc1",9.317957166392093],[633,"e53ec6828c4122d9f966d496b75ced906cb9b6b1c2e6af7d949315032058b2fb",16.057761732851986],[18631,"e83270dd204f64693119595fcfc472d038e8b22f7c1a4492c5a5e59d4a03842d",9.647446457990116],[7657,"2333f959f45187f0cc2c5a662f9d15691b568b4e6640dd29f8ef5f7abc41dacd",9.317957166392093],[8099,"ac2fac98cb69fce63c4116e6de8c5c18c370533debb89ff820a5e5fe42fac5ca",9.917710196779964],[3038,"9aa1d12f5c23fed249a1db8d0c5d8be31d5c27b8073d9ed66181ca4a061610ec",9.917710196779964],[10578,"346bae9220f7f9e06a7eaf64199dee9fc6c1a7fcaee51d8f3a75cbcf1e19c1ba",9.917710196779964],[15925,"23dae448b36c7ecce5efc324b91faad0abd4ee8d87d6ab86de0797c115ab946a",9.317957166392093],[12127,"cdd13e35b86af45afb3350d31a39313ba9207ebf8aae61429a6e1027162481b0",9.917710196779964],[4014,"5c8e5a069e31697a2b67f86cf0c66e7d203a4ff0d68612b33808139e7df6a6e5",9.917710196779964],[14001,"3bb44db87f4bc7138b7098d6466810fb5a7d3215b4d90ea4b23a324bfed5e294",27.853658536585368],[12465,"26721165764213c15e248974ab14d034fc4bb3a6b594c95491e53901047135ae",9.317957166392093],[581,"efa8bb45e8ddec4f35f280b03d1b663efb2299724f600f9ef4d69ef5a1a909fc",9.317957166392093],[13805,"4e902291d37a6dc9b0613ea32b719b995b1320558f56f209ac49b0b739144299",9.317957166392093],[7804,"eb178bd7d8688095b22468e4bd5dd6fa41933020116da5593fb3b63772c8c1cc",9.917710196779964],[4958,"dc122dfc254501986eb7a7d1694549f064ac66f3fd1662e884d981c939e47fdf",9.917710196779964],[7518,"baa922c9fe0a95325a7478800e48b128c0b4161b4ed3c93615946035992daace",9.917710196779964],[9433,"2a93695275602a2bcb3f31c21a9c00f112f92184628bad208da20a3fe39724c2",9.917710196779964],[4567,"067f3706825f8606032fbedaf96cd1c328def12cb7c676a42ea0c8e1e9eddee1",9.317957166392093],[17882,"5e3e8a5b6d56d94aeb79ad32034c433491fc6c067019216b17b4520aafd0a83f",10.052724077328646],[3441,"686ac97578f99776b683a60e2cd60b455677044df5d352f9888241ebb8466de9",9.317957166392093],[15583,"abdfc47939df067725eb758a1ac79d624a9d770460c564ab6497ca608550bf71",9.317957166392093],[10479,"41f4d1ab40ff75cec9ef6d5b3e73476df41c030dbc710ccddf2efccca75f45bb",9.917710196779964],[18676,"0910837ed4c63f098befa3abdad98a4b64f0e6dc3ef70a34603f793664fa7f2b",9.317957166392093],[18784,"d2e6a18414f6bd07dc5183e1c4d049f80e7abe77ffb44bde04a41aa75af19c27",9.317957166392093],[6361,"6442c5f9ebb5b048788b89d788d56b0c4284df93e91a57aea1bfa14333919cd6",9.917710196779964],[1575,"cff529d52471c0b3334798052af873b4d65c83e662b6da58f2dad5a424abacf5",9.917710196779964],[7906,"6b633348ea897097e82a8e7ac5819350daffa58596d38ea02f040228761f33cc",18.116630669546435],[15141,"1f12425ab8f6faf6274460113515bf8d1bf51cadf7ca068348da8ba45572b57b",9.317957166392093],[19271,"ed55ddffaadc79169fc94d2c09993f199140ef516f1c21aaf0065939b056e715",28.848056537102472],[1990,"9dceb3579a8b352d0865e49eb78e1e516a0fa3932311171a12b8b7d4a54811f3",9.917710196779964],[11711,"665784b7bbd5f4611fe49c1d8e57c7c5f733441b3891f595ee1a1f75f9143bb3",9.917710196779964],[9838,"a38b3bf9c373da0c00f0695a53d15190e0b8a6d6607881fa4976dc66b2345fbf",9.917710196779964],[15174,"fed8ccec80294c7c93a79b352bbf10a188892e67841116809601d10ef709057b",9.317957166392093],[12840,"3ee08112ab7622cd66f341cfa08b28153cc68d37ca3a825a2920fe5a472db0ab",9.917710196779964],[12695,"d778e6ffb55f45b7d42258b3f3299de7bc4d8cac3ce8a59c995ea72097659fac",9.917710196779964],[18166,"c266a2727d31550ef84c88a64661e9691154fde0c9ba35e4a363036b34b20a39",9.317957166392093],[11874,"ab270229a919e15eaf64580bb767ae3d5619d20406b1270c9123579c4b053eb2",9.917710196779964],[9775,"917b35e08292e298cf668b8669d5f69941d5fdae142e8b932d804d261325d3bf",9.317957166392093],[11713,"192757cd44da2a15d8f5bfa3c1517ce8e4ebb913f710b8746a957de093e639b3",9.917710196779964],[1480,"8899d7f560988acf6e3d23e198e6165213b6c89b91c6c6f1ceb39db55bfa44f6",9.917710196779964],[3401,"1013ae015141e660cd55fc5a9a0982ef306dfbbdbb278b9db8f300577e76ade9",9.917710196779964],[11217,"428f0cbaaf26ac33605b42438ebd60df32c0cfcbf6227249ef01f3a7d2c397b6",9.917710196779964],[19854,"d7ac3f21bb6f475203c4b9cb071f3de5172a37b0def103efc8af1ea2e2c1ad00",9.317957166392093],[7479,"95d6c90ae4e64de11ebd6da7fc6ec4cd3cbfe3018da187e50b113ccf3d95d7ce",9.317957166392093],[8046,"4f3fa6e599b87ccd28f078b36e6dafb067dffa2d72fa10ce41ca9d79e66839cb",9.917710196779964],[6751,"a05590140c1bca73e3a600d60ab0bc2209490ea4ad1a90fa2398599d71d994d3",9.917710196779964],[17089,"cbe42cf11e6006c51c37adf7c41cec4fa2a7dcde25faca2215f817a442fc1650",9.317957166392093],[17362,"42cf5d5489cee06798aa704f457c8d13754fe200d79e5367f5a41b7157f9934a",9.317957166392093],[11532,"7457155d188411df6127eadedde409b38302929956bebd031ca532ea50ff56b4",9.917710196779964],[4126,"c52e9eaeca3c70f545619a96d3364eb0ecd9ad34994ecac3733683e74fa5e0e4",9.917710196779964],[18331,"818381f0cf410b146c819d5499b425e2a02527f646582801a47b559060a73e35",9.317957166392093],[16760,"8da5dd4397ebefb3dbbe2b0d107eef3dffad16a0ca893ac3f63670816f383b57",9.317957166392093],[16289,"6ee6ebbd50e5d4a0fc27f7f128d7d715d5ca8d5c2adb53a9c51f9d2a4ba46561",9.647446457990116],[13560,"ebf8d0afd35f9e5a2da4e21c3db6bf5a220b9161583c06a82d4803d8870c799e",9.317957166392093],[9284,"4c7d6b070f3816ae1ac0545e72eafcb5095d4b5b463d754577b5c5714393eac2",9.917710196779964],[6058,"1144dddfd2d83a7cbd3697dbd336e6ebe442877d80b309badaee79b5c379b8d8",9.317957166392093],[15215,"79429a0372e5e0776903b54df834caf54349969821c91d754a468fa66ffa2e7a",9.317957166392093],[13046,"6c6a81e7554f7e443944de5337e4f25a2800882d4a9dcbd778a08bfd4b494aaa",9.917710196779964],[4316,"fe7fc42768e730482f02855d499241ec00c381d7947fc788a141fbd62307a6e3",9.317957166392093],[14798,"66fbd76745c109f33d14545ebd075731884643d1930c3dadf81e9b165bd4f982",9.317957166392093],[12403,"6de4d0e83a374df9ccffc08ebc05c69e04e025cf4de0bbf5260b8644728b97ae",9.917710196779964],[6763,"cb0b85cdb400b5df7ca78265600950c5f787637c248cb631f9a7d04d18ab82d3",9.917710196779964],[13418,"2334b0561d236a27d8615a9f0a3eb64eeb0a2c2eebdfaf384e4398f6738104a2",27.130168453292494],[3104,"8bb5742dc916da0bf9a62501d65d012d68578fee2bbf96e9300adf4740dca0eb",9.917710196779964],[16803,"1a6c9ee91b1db592d0e701fb7b91aa5d51e154bdef864afad4377aca98f52d56",9.317957166392093],[19582,"0a48a964a80f125c1a4a3dad0fc98f739f754fc9e84698be50243b2d7c12ee0a",26.40963855421687],[7018,"679db1fd2ae4d50bd9a533d6c659cb3ba441383c659fc118361e4f52f36de1d1",9.917710196779964],[3180,"a11f42a10c4864f9a76d8ac6ab225ec404119408a2d640c01e8b3bd605d325eb",9.917710196779964],[18670,"c7e734e940678a443b62c1a526d523e250e32419ebb077e3cd73446b4a99cc2b",9.317957166392093],[10147,"26194655c320761c19df8f4bbdf725ef90c36f330a4ec78d0eb7bd654ab067bd",9.917710196779964],[19121,"f52e7163f65d116b8782c43011edb4afeddfcbc8bd8a6073de8332289d008a1b",31.03846153846154],[414,"efdbdc33a881cafd209846ee8178792c4cc2448ac29861232a9407691c2546fd",9.917710196779964],[3226,"1b741b2bf7f8492f5606ea0ff3f368d246a21712771b12390adc00bdaff7e3ea",9.317957166392093],[12572,"d9aef47c7a2a8dc8931d54c1ff68f5feab71d1e808ec5bb14232f0bdc26170ad",9.917710196779964],[5644,"c19b39e638310b5032ad39c25c144dbad64d9a6f813685f5689edafe71415ddb",9.917710196779964],[6230,"15aad7700f66919b6477b9c43ec307992ee6f967d1f8d05aaef8b883b1638bd7",9.917710196779964],[10708,"790e1222df0f5267d475404b32d1ad67f935b5a2853aa1f16a4e373dd896f7b9",9.917710196779964],[4257,"19d68606dc9149a864d725f4bc606dc9e7f761dada27964a1c7bf1b14f6b11e4",9.917710196779964],[8267,"25aae0714d98ee60815d73ac4e0b7d440eee9eeb481b2af6335b12e31d3085c9",9.317957166392093],[17081,"793c33159a1e7c762fc10822e4c672e0fa69bab070ff8e704de15bb304004650",9.317957166392093],[3702,"57b14edef077f2b8e852f76a3e9cd7e4fec5513e10ad62b3691b8d91a40d95e7",9.917710196779964],[15777,"b19580c9adfe69bdee0f720230f5f09d111e0154137e116b23e29c080333c36d",9.317957166392093],[2917,"d81b0f6346bc240fbd4bd9a5d180bcc418a936402e85e3d13b4201c17031f8ec",9.317957166392093],[10220,"b052670f37fe56f2335ec3b865240f222b78b5ba418aa9399b0155345bc9d5bc",9.917710196779964],[7069,"f4680d93ced41d09cdea615ae2d453fedf2252127e9c5da19b7b0eb7f98084d1",9.917710196779964],[19415,"0304a30c17fca7277fb34b76aa870dd5438478ef604a2a388adb8a79362bec10",9.317957166392093],[15382,"894644fa2846744cb9ebf8abda51e6ec1991eda3eee1adfcfccd3039a1b0c076",9.317957166392093],[10581,"b06f0533dcc8fe9800964dca23fa3fbcc7eda4ac80781858b80fc1319ac5bdba",9.917710196779964],[12481,"69e44a6ca05ebd473f560b2c91bf853f1f21c0fb9ef5a3f116eb822d6ffa0aae",9.917710196779964],[13899,"f9f12381fc751a59966c1e590526def4f9b91e4d55ec821daaac7385b4f50b97",16.05925925925926],[7120,"4e67f5bef3f6b18ddb43c0dc62548b49757f7b5a775dd112d38ee8796f0f33d1",9.917710196779964],[18314,"a8891a2308c31d5211bf3f574036bee1aff06a5b2b1deaf2b3daab77af938f35",9.317957166392093],[15826,"6d232391efbc7c87029b081b6b3a985f1de9f090621fb746a4c739f98095e36c",9.317957166392093],[691,"f8f07a3aa2d1d7c53049ca9013ef7366b15711d108d0b99faf4dafc8d6674ffb",9.917710196779964],[7051,"5ebf4a8657517f1a351369c45f927434ce4ba69b923bcfd318da2522d185a8d1",9.917710196779964],[15596,"fe44fca9dc76c1f8388ed2ab71ef8099e3ec61a88516099d5ec37827f7126f71",9.338112305854242],[205,"e30d66f526128f41f8c4795e22e7c659520b7c14961f34a82e583fda065d97fe",9.917710196779964],[18688,"a332091a6c71e2f5f5863fcb3398da57c502f8140b8630d77de5a7764afbc42a",9.317957166392093],[1856,"0e7355edb11d14db95e72a94f170efe200b0563ea0abdaddceff7344155ae7f3",9.917710196779964],[137,"dfa9adc930375fc7266e29042bb184084f13eabbe0cb616b6c698f1ba2d813ff",9.917710196779964],[17022,"fd030806df3162bcc32355ed910b4e07c27b65beddbb7264d04c475dd8a77e51",9.317957166392093],[5727,"28c6d3dd4bd20765101887ff74d58861e4fe3b5dd54eeb5946caa017e1f9e4da",9.917710196779964],[18302,"0cbb77ee7250670d65469758a531b859320cac96c5f05754c02a7439ec13c735",27.908045977011493],[5310,"c7b5b3ddf2d43bd98c269afa85690340200ee1993b072b7099f7a67a948352dd",9.917710196779964],[3031,"bcdfd87b2597518e31f2865ca13b818734d2df27598e69269b76d2df284319ec",9.917710196779964],[16976,"ab7a22981d2a6dc892094044f63922ad66baf592095d8b289f75fca4286e9552",9.317957166392093],[1065,"34562174736635004826bbc252fd51ee6f7e6705c636109d03644974eaefd4f8",9.917710196779964],[10188,"30f6a1c56d9bc4c8d1a8a8b5538adc604cd39ac043a8d25fb8766eb8a83e19bd",9.917710196779964],[18940,"1556b64986e502110af77111720cc2c20c0ec84e4a844d741574d6d5a1ec6b22",9.317957166392093],[371,"d6dfeb80683b213d4adae9a69b9ec6b8bd614686db37f8ad133e43271c5098fd",9.917710196779964],[6383,"af4c9051baa10c71fd79f61f5797042eb73faefd0e34852066abcb003ee16bd6",9.917710196779964],[15102,"a894bf6d4b158f25e594106f96623bc9e7eee59b82f775864ec982cd722f947c",24.252991452991452],[14727,"577a300a3fd9ac66593a6d23ed0ea7dd40c8f80af8c4be713b938714723f6684",9.317957166392093],[17238,"a22d109cae20309a1e6a8077d1c9d1f96775f8d5d44d6429d060109ff6c6194d",9.317957166392093],[19759,"e1f3e38aaf25edd7dbb9f7baa8412a90a16f5196f73e0d1d461762979e3f4104",9.317957166392093],[6902,"c00dcfb6a49ed3be60994b9631a04b62ed1bc8ce8609b1e14785cfff8ecc9bd2",36.883553421368546],[15246,"181334adb4a3ffd9bc59ec98217ba56e52cb8aefe20dfc1c939c5b7f64768579",10.022779043280183],[15670,"7381b75046a4d47e0ec758de8432656dafa0fcaed6784992099fbdd436f90570",9.317957166392093],[9525,"dbc93ecb0c5dbfe2acf2701a8524eca0f3f2ee62d3030135988efebea4c989c1",9.917710196779964],[5734,"ac18e0c1420b7cf03f2251d8a7f604d41cbdfae58e607bad3aee89cf8d0ddbda",9.917710196779964],[1286,"71b9b173a1fc2faf53317c5073044319a2ca4bf956a50dd11860205213cc74f7",9.917710196779964],[14839,"88dcbd25760be6cf38e5769dd88242ab714f413e4d1f2669a705226598c92e82",9.317957166392093],[2668,"9466411dc3d66e6d7936295f226ab1927dd942c766b019ca0ad3adb595fcb5ee",9.917710196779964],[17048,"a9e4fc1ee74923e40eacf9aa56dce28d3a681da7835d33d2f5ed4b6a3c8a1f51",9.317957166392093],[6610,"3370fc3032363357c6adbf847ee853329586b047cc942303eab916bea91893d4",9.917710196779964],[14847,"58262343adf007a85fe7f7c05eff41d2302c4b6219555a5d75328ca64764fc81",9.317957166392093],[6031,"a83190ffa507a4c6066bced30c7693828630391fdb5160bc4e2cf8118fe1dad8",9.317957166392093],[11822,"10efcbdd82f1a1c6537faa6c83432c74248ff5fb65c4a9b83951b7dee8e590b2",9.917710196779964],[10194,"323e690fff39fb64e9d93fdcfd7db636e35d42266ba2fa76b825ff03f5360abd",9.917710196779964],[2179,"677076452383c4f93b97965a6dce4653c0b456ed6398349fba35e49ed534b0f1",9.917710196779964],[12923,"6458ae9afb7f6f76d5553bd8d543521887485baacdc8725b4f3a9b89a2b725ab",9.917710196779964],[15861,"30cb31dfc72d62ef0d79cde6c19252ef18e2ff11987410ac98585644ca55ef6b",9.317957166392093],[4077,"3be80e675486c6b43a7d0a244c5f26eebcb066fabf66f172bd94a358a2bd35e5",9.917710196779964],[14577,"d591011b8198da8aa7302f0a4e1508e9c5766ab3e2c9db520f343e60b4678787",9.647446457990116],[6833,"573c71a8e6763ea49b6d0216a61a92aae0b8b71e8c069a0064905988fb2e08d3",9.917710196779964],[12870,"81d4735c759f392fc0a8c18b2010aa0d6d9663756b097206cff0dacfea0471ab",9.917710196779964],[2642,"11c6c76936bca3ec97f4723c5f29adfb600665e710bea6c96319010ee576e3ee",9.917710196779964],[1903,"aac0b5f5d48c79e087b9630538de9ac2c301af697ce1555e7cb6a441d60c9bf3",9.917710196779964],[10288,"ce8f3345196527cfc02db6a6f378d3e7e335f8ba0a6253e5130e0921d67d74bc",9.917710196779964],[4949,"01da9631778e8853468b0cd2e172e65f0f35861d192f321078024fd42fcf89df",9.317957166392093],[12608,"0a1cff5fd7395ad49a75bcd470cfd5497daf9400c68c1ab24891cfa3c68c36ad",9.917710196779964],[16926,"65a092c6a49e4ea97629daa0fce44b9a36ebca0f66da0162cd563a71f68dac53",9.472566371681417],[1771,"02f2ab737e4f382f04ba44e720e49ef22341e55239ec7ba4d9881b9281c576f4",9.917710196779964],[19526,"e39f23357e765b01207b746364e2cbdd63944acb06fb980181aefc3afe2ba60d",9.317957166392093],[14471,"11a6cf35de0d2e09949706a13ca13789f7c37a6988fac8705cb81b1927a0db89",9.317957166392093],[9717,"9a5c2fdcc2c5d6074848bd3ec1a0c3cad90268a7047ed7b9d367770102763bc0",9.917710196779964],[2675,"c9d46e6895e446b419971f15c9ced7de72ccf36022d92e270ab5380db8b4abee",9.917710196779964],[5962,"910f7542ff055432d7d4b4665e57c1255c1a8cff2bd6ffaec2fc400d338855d9",9.917710196779964],[15092,"cecf55bff0fa9bbb8c9e93d7915c54610da63b28d14f456ac7cee6c25cf5dd7c",9.317957166392093],[14433,"d6860de158ca02830672b27e390eb34745eb10838be3f3a545a1fdd304a7a48a",9.317957166392093],[4477,"645fb60229e6c984346ccb7e13159cf783e6bb24a6470cb0851a89276a648ee2",9.917710196779964],[15739,"c80c326da600340a02e5a11c6d439a4137dc929d4307e6ec38da3ac60c39a46e",9.317957166392093],[17051,"330abe5f4b6abb58b05c743bed29a0167da96b003e1b55d617bffc5b3eba1151",9.647446457990116],[3621,"13bbe120f23431e8c5877846010c65903f80c988fb484b9915a773eef69019e8",9.317957166392093],[15786,"fbd24ba6a238828c9d4cd292fbcd3379fa7a98306ccc2910fbdb1068cac6966d",25.30812854442344],[3017,"eaac34206bb74e3f80b8ca12e45d80d84e21c656b99ba404b3bca8d8c63e29ec",9.317957166392093],[6288,"4984b12477fed73d648f5b772272fa92bb70b09936934506a55a2f38a9af25d7",9.917710196779964],[7979,"00cec4b92ff17eae2ec35cbb39d6b5fac04b540a7ab231cb38aa372f1b18accb",9.917710196779964],[2256,"ad8e086cd4dc355211362fafba55771dce7f9574e790c0233a448438833038f1",9.917710196779964],[5782,"748315b3aac3fead60d1d9801057e0cfb39a842dc1c20ed6e82cb33b566c8bda",9.317957166392093],[907,"7ed861247e465f2815e87c94e95cfcc8c93a88915a9c7dc34cc7f3db3682c8f9",9.513513513513514],[16724,"9e0bd2fff8e716c2ccd69f876eacdc172974a2facc01ec3db237fc922fbef957",14.188034188034187],[11939,"00e35212eda0896524e46beb07332b5f35ccf6692dbb8f8423d4cd2ac9ecb6b1",9.917710196779964],[13742,"2447e8676f2273562a04886048347d2785b588943273e94bc2f0d3298c589b9a",29.28798185941043],[776,"163da14380670d726480d6ad5b71581db0ebfd33561d2f52fe26abe8914db5fa",9.917710196779964],[15791,"aadd8a59c8614dd67c1554f1ce4907fbbe3c7c671f8b5f46f636db3deca7806d",9.317957166392093],[6362,"5b231526ad818214b6a2b4ddb0d638401dd49609e74823e6d96bd3bcd7239bd6",9.917710196779964],[15107,"5105f9e1b7f4d4068889393615580106b6d8c67a205a7137d2b850f2888f6b7c",9.317957166392093],[6380,"8ab8134326ab8925a3cbe0b9b71c4984944413ab91d723fce226d7837b2871d6",9.917710196779964],[10554,"86f3c527e703cc8edc4af94ffb71095356198635be79af14b63d4efbe1b1e7ba",9.917710196779964],[19349,"4a63130b53abb5814aa8dab81084c5a9400e0ee4f02690874523868ac23d9613",9.317957166392093],[19801,"407fe8b0b8a9602f3af3f2c625feb4ce05d3115579dfa58a052d8ba0edda6f02",9.317957166392093],[13086,"86083a349fb1833c0b5194b458c5abe56f1f752fa107e1787143aa6de4b5cca9",9.317957166392093],[13648,"75a84ddaa7241147372e3c358c2bbad60af1f7540afb1250b78ff96011d8409c",9.317957166392093],[383,"cacf610d55cc6ed54c779453aa6e372e27ca479e0cea5d5e73ca4fe6557978fd",9.317957166392093],[16839,"7d603d42d9c0fe6ecb7329bcc2f343f3c6ab788f4a58e776128965d77d0c8255",9.317957166392093],[2416,"e75285f7e8f877c9b4455fc9d0815403e266b4bec3879d126933a30cfa115cf0",9.917710196779964],[13516,"e55b0fbaadc68eb47e5857ec553049ac2c5ab318f217fcb0aac413c5d83c739f",9.317957166392093],[9218,"68fe0cc13bcc2833c62c48762bafa8cfa36157d8f8f63109caa2d0b1469f5ac3",9.917710196779964],[11234,"020ac9f9b0418937d0942fb8a96411a85b8b2eea9d826c11582e8610e5d274b6",16],[8858,"dd9dd8a440b685328a13673a0c7a18eeb7e2a4f4d9888bd2c0c0d83362cebac5",9.917710196779964],[302,"cb373cd384f218827a1863ca72be70c65d5dbaf3032998537af54a330a03f1fd",19.19290174170227],[9825,"a4c78ee3e65b419e77a0283187c4bbb8ebda948555b7f02101a1f9d3397478bf",9.917710196779964],[5859,"1e7197e7a00e5eb08133ed691dffb4718277553d45ed373423784240bfd0e6d9",9.917710196779964],[6269,"3e6eb41f940c74d1c5d987f139902da65cdfcfd1b925eaac6cbd71e9a37a4ad7",9.917710196779964],[6491,"8e9247072be2476813560f5ac82fb46fe8460b06eceeee3e33bdf3b9b29e8cd5",9.917710196779964],[17800,"221ff7db0581c08cebfc095337cfa8133630b8dabc82e7f01c9b473446194a41",9.317957166392093],[1931,"1f407f1b86f349370bfc19f3de03f41cc051d5c5ed73152a7821d35cc64e7af3",9.917710196779964],[11067,"6063b4bd8c2ed3876200354744d8228a3478d9d384a8750d525370689eba88b7",9.317957166392093],[4393,"a285ddd0e56fc80b0b05092df14458c9acf92cb85da0fb2fcae02649a38420e3",9.917710196779964],[5884,"70eb93d2359c26856b71dd93b860272e58b9a2055a9bf1181221accc7c37c5d9",9.917710196779964],[1141,"9598b1685f513411dde48b97b63045d860ea81c008253fe932cb212649745df8",9.917710196779964],[14296,"a6c4f7c551efc51b64c88e1f9f403cac28c96f407b699ee9f99b6a27f46fb98d",9.317957166392093],[5838,"e58787442bd88415c225a867a1c636ae08783183d9fae55e915e42e536ee16da",9.917710196779964],[11386,"3256d179354767700efcd5e1470b1d3e626c3a9ec350e1fdcc51cff6f02b79b5",9.917710196779964],[8023,"953a38053764e2b8d81f07ef003bc40033a51ecc538cd03c452649c2f2b568cb",9.917710196779964],[8815,"0c17f78f38f5e47d649a8cdfaec2c7e8c1db7eb3401169e00f9d56fed7ed02c6",9.917710196779964],[11025,"3cdf23626784eb63e9e3763d9502f39dcde7d01ef1c5c0ed98347c0275eadcb7",9.917710196779964],[19540,"fed77dfc26915c96341720cb5f83f871da89a80868513828d5ea28ece1661d0d",26.138053097345132],[19175,"ab717d466f8b932633ebbb767d982b383507d627e46531cfc2d92f8f50cc8c19",9.317957166392093],[8834,"469a5443e3e1d6905a8a07ae9cb1cbee24b09be4bf894239285340ed741de6c5",9.317957166392093],[8030,"bf52fbb6c8a7e7c268225eb230f269f4571b3684e5bff73ada81e37244ab5ecb",23.844036697247706],[18207,"b093cceca63aa7f7199ad6f67765dfe19acd8b8fb581e3b755c28d344b87e237",9.317957166392093],[4410,"c0ef4b0f493b92ce60874a960aefcb5512a3ff722ac31e58cc7e17cc02f604e3",9.917710196779964],[1338,"418399b703a1825ebc9d9096c1eadc79a8b2f987532201405b709bfff46128f7",9.917710196779964],[15345,"aacca0b012c6fc638711b0bbe9132ede2ee14b44d0f1318ef868d862da9c7277",9.317957166392093],[5348,"0a37f25fce4e4a9750cd61c56d7f9e60c390019bcb2b174da26db9a9e8f828dd",9.917710196779964],[3985,"e78c679b11df1eda5156a778dd2dabb6497476c2c606b72d105d56e7b336cce5",9.917710196779964],[12510,"e4363f5283afb3ea52b721e61cc187a3fc6111ae457642b740642e5c12ebe8ad",9.317957166392093],[15426,"7db6de9a0df41022c599233893bd978f70df6d33d9426b4012d24730d755bc75",9.317957166392093],[18830,"ee9379381ee1179e07ae9ef35a586fe3fff12cd7e0a9877b36766db581bfad25",9.317957166392093],[5219,"28a39e6ae74dea1489afdfc5e4f64e5c0cf5e0efd3d94dc936e7647961e0dadd",9.917710196779964],[16053,"9a30c9b1d531ee8111c6ccfd873f276f3c3f835ab64fc29501da4838541a5367",26.09252669039146],[8329,"0920eb6475439c4cef3252b20d342de49bc308b46ca755440d48a9acd89821c9",9.917710196779964],[17082,"fb0a301fe628e701295ea35ec5f3c0d92ace8377c2e5ff74cc76cf9412054450",9.317957166392093],[4631,"a34ec385b1f551a3749779aaeb2ce775e779b4137041b7d1f4771fbd93ec6ee1",9.917710196779964],[5652,"608af9705365616ec3d855822b8d925484c89d92a4cf0beb149cd6818e904fdb",9.917710196779964],[18892,"1c55db5c8a57383bdb6c1e8f51aac3ef322850f83bdd44feaada51b0b75ab323",9.647446457990116],[14815,"88b99db57bc6a7625be2ff89bcab464d052e8c50776ffe7cdcdb7e7c27827b82",9.317957166392093],[5388,"6884a90ca8ee185c635bcf0eb7b342262d078882f53a70ed129099bb03ede3dc",9.917710196779964],[4964,"fd677277c65351f806121f27ec668678c735eedae10524be26001be49a866fdf",9.317957166392093],[12702,"b71c92732ec5b265083540253512ae68d54ca3443cda49b6e43c946eafbb95ac",9.917710196779964],[10713,"7f9edb9416c287ba279dd77c78e8e1b1b8057a705b39aa75951f5e0c8c3aefb9",9.917710196779964],[5265,"da51a9ab0c0901b8abdd111d28c5bfa1e3bfee3aa6b3f9c05a233cc5178a97dd",9.917710196779964],[14927,"d903b23d40d0d1bc15188a10d04d82aeae5c1b1afd388ca4e5a18af25ee85d80",9.317957166392093],[8454,"47194bf54b18a924aaad7c0f22c7bc2dc72d67535e31aa0e249375c122aa4ec8",9.917710196779964],[13996,"77e6a03cf638527b4ea0d1559147367ef95f343ae10724676048e9e274d71295",9.317957166392093],[12919,"bd8b70f3a7d9e14ca975d26e5b2ed011bf931e089d5cabfc450ac320f90c34ab",9.917710196779964],[19682,"e18bb373685ef477cecf226f9ff314b33c61dc5313c308407e7b6622dda34a07",20.71301247771836],[5743,"d411279bd5a72197e48b55693ada6b793e6492e23a55c55a5702c77dcc83d1da",9.917710196779964],[17025,"8274341725b065d022dd84ebc5b855948c8e5bc7150ee95a6a24570b3bda6d51",9.317957166392093],[4286,"4cfea907d98ef4bba6b64435e6ea344bdb31595c7201a5152703c7beeb95dbe3",9.917710196779964],[2426,"a94ae7e21c48face50a62a7f86c1e19e8d02305601fd651acf817f656bdf4af0",9.917710196779964],[11539,"fe8fbd6c3c190e33193fbbd625bf40cd7e048cf5895cacb2f9a9b79e587e4bb4",9.317957166392093],[610,"aca8d315b2307938957eb35af75876bcb9318d1e30f3478bda9d149c89e9defb",9.917710196779964],[12214,"5c7aaf76ed041ff7b7530b383d7f01aabcb6d3c29324a09c4ed363774cfa00b0",9.917710196779964],[9208,"b3efd5b8dfa08033c86bb9ad3febcd69453e2be27ad70b0a419356ccb3e364c3",9.917710196779964],[10516,"db42ede91cc8eccc2679d4c079487ce35ca521441557a795115f818e9c8717bb",9.917710196779964],[2555,"e69e10ed5bbd6f934ee84afb5996989247392a0644e119a4cac1b66f9bc181ef",9.917710196779964],[2033,"22099dcab2f0537c55e5092b180cef4e32c0e4f6e7abd008b9d25cba1fb2bff2",9.317957166392093],[19336,"4782099ef92e675bc51260e809140ab7d202933857a7f94bc5e35a324d150314",9.317957166392093],[19267,"6fbdb8a7abe1ba6598bbc43b61be7b2657b5f76bf021e50618ce4bb5819b1216",9.647446457990116],[16025,"f48eaddf0e019def8f043568dff6656610dd1f942122472b5a2de5ebca2df967",9.317957166392093],[10372,"414e402151132eaf99e934310744042373f6fd7456407f4576e4c2027783f2bb",9.917710196779964],[8512,"944b9a08b9b3f7da4d7c15dd060bba0ba5efba23de78b29472718c50a26bfbc7",9.317957166392093],[12787,"7dbce90a791389b23576c9e22068bbe85c7bb0edb61bf5cc7e4662a11104feab",9.917710196779964],[19120,"e1d2dd06305c1ada415ff4e22214d15e38a315f4cf494d93b06186e3fe2c961b",9.647446457990116],[15914,"f191c24710777b9d8380dd3192ac906cccd7ce45467e77380f95a44f2eb9c36a",9.469939523301317],[9954,"5528cac65e799229d2c6e94a5b0645e2f9a5717acc21796598c5465c44e89bbe",9.647446457990116],[279,"a7d8ac79eee38a0fcd614987210266df03cabb922059da43866a1ae1fcf012fe",9.647446457990116],[14273,"11a90d5169422f270ee8197f9b4c546025d2eb75b9b2bd67d0c4d94de2207c8e",9.317957166392093],[16983,"057c14adb514a818953c869a57867f38ff2fe62a64528c1f6e9b08a8ec857452",9.317957166392093],[16644,"9158143d39f80a42a4e9b701b43ea4f5045f91a13144ff05bf5028681bf6e959",9.317957166392093],[13667,"c65d5ed873717b2757b5b0124e336fd504d7e4462a27533a14acd3c8b7c4f19b",9.317957166392093],[3325,"c29dccf3c67ce78cacccfc35774e0fbfb5689c349f897e08276a332e597836ea",9.917710196779964],[10061,"72cce8eca378ded76a8f15e16f97b2df86fa7d0f4bd5c01a7a57013695a1fcbd",9.317957166392093],[15984,"50582eca80c368518877a00b5190fe9961f6b0bbaed430c609b0555c3f28e168",9.647446457990116],[410,"7f0d27adc44a31ccbf93bfc2954626055760b1f37c1bb990b946933bf6a84afd",9.917710196779964],[13685,"c1135754a9bb6dce543da6318f36016407c0f99d03c4908f1e23d1108ac5839b",9.317957166392093],[5461,"d1caab0308a2cac0bcf20f4c790be5a2e96a2892ea2dbb5dc9a5bd854a826edc",9.917710196779964],[11702,"f01d59332f2111e846e8a640cfd71fdc5544cf3e58d063fe6e0d71b3fdb54eb3",9.917710196779964],[8934,"21dbf84c5b9e24747faf8fbc9f9d4c6859f0ce1a809bd5cacae340af078f48c5",9.917710196779964],[15872,"51cbcd51f330ef9b648ef57af30dec446f76e573d22becc4df50103ec8cf9c6b",9.317957166392093],[13379,"8b901f5c4b7c5f9f3eb7a74aaf1a058b499e353b52f03a40d12b061d03f8c6a2",9.317957166392093],[1328,"038ac382c367d0b53e10065c2c7a7126a2f9dd0ef24a2125f15e584b4c173ef7",9.917710196779964],[15982,"7cd0d192f612f7cc73317676657c0b9201191509f2c2ede261a5e4d7a9b9ee68",9.317957166392093],[8424,"f0ed7c7bed76a55ee4ccfd1ae10e54419aad086dbc4390e72974b5d62bb278c8",9.917710196779964],[1996,"e86ee161a0bd4be827dbbbf81c76086305b47844b2ba2e2dfa3bc5ccac5f0df3",9.317957166392093],[18023,"54512e7538487780ba3a1becc1728ea40f9d9f0b008982180d4c9caee227d63c",9.317957166392093],[2345,"2685ef7936cc79b8e6ce5db735780dea414b3fd856a97b44008fc06ba28ec4f0",9.917710196779964],[11341,"892d4247442280f088f293b85b940c3cc758d20d76ba72d7a19fbd53c2a6b3b5",9.317957166392093],[10150,"8fac34cc894d9495de9799024453d89e4ec92603598bca5ed559fb73817c63bd",9.917710196779964],[15435,"b6ffedae9f5c2b80db80872d39f6dbd1dd0b1dd0f9b8735fdd7f797ab2046e75",9.647446457990116],[13421,"9908516966d1e90eaa927e643739b8c461d3e8629f488f6da8681f46d6acf1a1",9.317957166392093],[3915,"b2aefd7b97f3ba45e80ee6eb02966735ac55737da00bd5a77a88926557f83ee6",9.917710196779964],[2614,"26191af3357a7e33fc337e4a41af6828f9d201c940e9f3ce0bbf35c3e7c310ef",9.917710196779964],[8375,"1a3252e4b8634c966e255a7870e67b449435d5da673bde019f74b6f8261dcdc8",9.917710196779964],[5633,"80d9009a2723b9c1928e6a1abf611daa83756e9c1b3b99056df7d0b6bc4570db",9.317957166392093],[5730,"b96252f78827d01965bfc6ae1845692cb777d0deedf4172470ea3d63c103e2da",9.317957166392093],[19369,"bf8163271c1e766461cb11e73712e9804acde37c286d950bba29f78e5f792513",9.317957166392093],[10427,"582a9f3e8c50929facccea9c43a9eba98d8ee05045300f80a2c9fac3a6f4a0bb",9.917710196779964],[15734,"7551a6d1f649b9886a1b0c47c0eae7feecef41fecd0960a9e608db417453cf6e",9.317957166392093],[19650,"919718001a4e513893e040073a40f58e165b05f9ef3794ebdd44fef8b43a1c08",9.317957166392093],[9133,"e17f96c12ecdb8c27225a4ee0925cdcd46a565b7f7b516bf79113b28a31ee5c3",9.917710196779964],[1946,"d4d4924eef9e47f5d971197572e6ebd0c272e8b400be9372321935cb969b5cf3",9.917710196779964],[2304,"7770000eaeb3d1949d1bbea0cfb9ad7074bc0fecf086d70f93fad9d77f4601f1",9.317957166392093],[6834,"0f7ef4fae7d05b460500ea6ddc0508d7f00551b8a788211c9b40909fdaed07d3",9.917710196779964],[2253,"715e773c68a9e6c7725575b944662a7dfbc3b72c4c75439db718e007d5683af1",9.917710196779964],[18905,"81d33aa4a0347b8e3462d2f5594d9e6f9da73a04e28ee5e406584e362e614f23",27.853658536585368],[11240,"2703dcf3342e9afab18abc69efcd13ff71b6beb0cfc782d913caa9d613c06bb6",9.317957166392093],[17187,"ee33833d598b677b865fdb07fc7b61e643aca900ccb776699d9e2fc122c00a4e",9.317957166392093],[19306,"4cdc538ec086b80244fac9aefaa528e5df43a4773836b6a09a2cf0368669cb14",9.317957166392093],[646,"c723459e69d1f5408823df30bda5c04e128c71f80c9f9d7b11a70c4f46a59dfb",9.917710196779964],[1517,"c28e2d40b4a515f99b3aeedbb197fddfffcf786aba13324d00d4929b2babfef5",9.917710196779964],[11470,"925b4069e14a8ef877d2d9bdc5f8112cf196835d097d42ab4642ec2e16bec0b4",9.917710196779964],[11227,"7ee3420ad1fc85ca0d7ca3c47c9f1ee1400111d0db65cde4ff2eb7ef207c86b6",9.917710196779964],[3008,"dff95a446e2ad6358f2dc1bf7cc0c8ac1661eeda67c110f9749a53abd6433fec",9.917710196779964],[18387,"c5e6f0ff499daa102a8731bed3ff91eeabbd1aefd705f7c70defef142c91b033",9.317957166392093],[6459,"f4bd5540335a4f56c0577cc2c6950cc5fea2609f42cb69a288252a83ec2bd4d5",9.917710196779964],[16645,"ce1d9defa1604c1c1a1d065cdf66888431383a79a386a6ffc3b2cb490658e159",9.317957166392093],[15534,"3457e70d43cd3c1ee13cac2091882a8e36085f472fc794d01465c6538f4b4173",9.317957166392093],[12286,"35072f72d05f4ce1be5e21d5ff08ce4bacd9e391d005949b45d37b14b93859af",9.917710196779964],[8938,"e5c4b62ce8eb388f0a4b44161924d87ecbd433270c0893733546ff8bf35642c5",9.917710196779964],[18296,"1401075d2f936a9498d1e9f1291a02d4a0e399380cd0375a9e75848b1467e535",9.317957166392093],[19124,"1e9ac67d040dc1684b23732f40c43ece008ecd862a92e1d6131ffbf87b4e521b",26.877828054298643],[7605,"b73febb42bcf2d3fb9ffe40642a3734bae586fc483377e646a6bf9ecb0872bce",9.917710196779964],[1457,"54f338c8aa73f72aa97cf89e6080ba2aa1f5e56af11abc08cc5fbcccd51672f6",9.917710196779964],[15663,"399c4ce493fb06cfa94c31791f9ea2a7439b1c802156a94b3ae4753d7aa11d70",10.052724077328646],[247,"e3b0abe916c2ed086864863a285a195f43547c61e1218bba5b101f67520c53fe",15.947454844006568],[7123,"11b1addafcfeca5cdbf23ed8da71628e3ead1206b1fdfcef4a23b3d9340330d1",9.917710196779964],[17193,"ad7000530ce974b13cfde5399fd2438a599feef5c8d51cc8e1f4f2c3e6bddb4d",9.317957166392093],[14334,"dd683ca78aad50aeea91796507ee88d98008403e7a26f010189565133c6b9b8c",9.317957166392093],[4742,"275d05609f8d89bde8156278b8b7a5dc2db2b30a28b2e30fedc5ff6898a9afe0",9.917710196779964],[12276,"58db0d63df9625f8f8712ac541b9ebd97330c7316ab2250e22e25b920e2670af",9.57544757033248],[13150,"ac2cfb494f351fc21f565a8a761271e090b6a26c301e9ed4c30d7e57908605a8",9.317957166392093],[5493,"9f21315a607deaaa28cd968cb0b933ffe09cfad2f7d94118657577b875d342dc",9.917710196779964],[6771,"7129cbb4199114d63e6917b7263890e64881f45361145a227ab27e8628d278d3",9.317957166392093],[5322,"8ea435ba2af1771ed50dc754f669ac09adebf563d26439ae344470b1a5e948dd",9.917710196779964],[6020,"cad88438966df41985a727a920e042da7cab1ce1ea79d577e7fe7eb96cecf1d8",9.317957166392093],[11153,"a135000a097b375436320eb1e87373ee28c6215d60586b62a030b2807a8bf2b6",9.917710196779964],[12003,"ba53bc892e89e20e0ccaa6a431eaa8110c9ec7a36761ff9df5293465ef6a4bb1",9.917710196779964],[6581,"a082b0604d78314ee1189a78559fe32456e516cae2524dc302c1e7fedf97c7d4",9.917710196779964],[6301,"eca94b1e8b431649b5af5848718b55e9a746ec5ed82e0e2c60b49f00bf6202d7",9.917710196779964],[2541,"79732c0fd7ebf9b1ab0f317fc5eb5c94c2017ebdc47eae1913b64db7565e92ef",9.917710196779964],[19101,"8344328bbbb43676c390433dca9723b26d6ad9e7b125d547786328122cf6b41c",10.052724077328646],[747,"ad232304aec13b955ef6720fb29962ac90d143a19c614cb5aa9ceddd2a6debfa",9.917710196779964],[10281,"27b42b2c51f2fb2b20490fa0c47584afcf443f0847a54dfee0bb7047b4a085bc",9.917710196779964],[10979,"dbf981486d4855bd497214bd0078da457d9eed7823b1410bc26aa23a36622db8",9.917710196779964],[15326,"a87119c3c00a220c1800b48adf6428f67d8e0a3a8e85b0b67a5159603a50d477",19.12388250319285],[13930,"27204f6531d4969fc8535e3564c6d95ea4820a599d2c45a9bd08bd25df2b5896",9.317957166392093],[6566,"b8d89f34d319792b28f132643e1b66f650876ec78f6c5fb346ae489c9f08edd4",9.917710196779964],[2481,"3e8daf6bbd7d9ba4927f614b136c1068db789406dc55e50afbea921f42dffaef",9.317957166392093],[19422,"9b68404cbfcd753e66e04f6bcea89a6bd730eaff8d7a1ff7c3d1b0374f3dbe10",21.010526315789473],[9740,"c964c77ce81a61883b7a3aba2713ce058eb683a2ed9186a8d08e4410c9ef0bc0",9.917710196779964],[13217,"425e42bdafe206fdc19cda3c06be5ed1f6ef04e4db75d94af0d2f2cb840888a6",9.773123909249565],[12498,"4a9a4e00ea0a3f83435c5ab939211ffb2d2fbb910e1288a48f8ad1b67155f8ad",9.917710196779964],[14658,"d9412fe06ccf7c43f3bcecc0cf24adf11f4cb46d3c448de721ed5a89def0bb85",9.317957166392093],[5771,"8ea2dccbc2bd9d2c63e8a5a85e7321d520d10f00748f9ab412c8c4a2634da8da",9.917710196779964],[10619,"cb1d123ef2e3710f82c45f3e0ae7a2ba4b1d4bec2157ebbabbbe97c5a58990ba",9.317957166392093],[6481,"311b82c6b4c0b52f6edaaf2b3c40a349206865c4965351d4acb3a1f0966a99d5",9.917710196779964],[12215,"5911a7732715f5885406a00b68c9d5a003e1bc30cf74b2673a5e6ea0ccd8ffaf",9.917710196779964],[14049,"c41d3eb136cea7c812784399129a2ccc6752b1b689a32ce25dd554d20c54b593",10.052724077328646],[13022,"c2923ea50fe3fac6ae43505750baf70f59b331443b4b5243d909b16988fe6eaa",9.917710196779964],[17723,"cf0218f63ee145b34e55309229f0eaa632ac54e5ac508decd6886f31dcdcbb42",9.317957166392093],[2229,"9cd2d30c59b92c8b2ff3a507db26132d7d7bca8f3954008d23e86004ed2c59f1",9.917710196779964],[7462,"78ae6b9f65b79368f06c698bd533a159a31202aefa86967e8b5f4e63daf6ffce",9.317957166392093],[12110,"5d512e88b8061f5e3aef8668292fed618efc05844d61fc24edea832dd5eca9b0",9.917710196779964],[13898,"fac603f224d1e9a6e6ee86c8825c89bd2db9846a7cc49c2170be2f9fd6fa1197",9.317957166392093],[7672,"2a187a849a6d3674efd962a972904771481b5f227818c0d49a48ac0fed2ec7cd",9.317957166392093],[5399,"ff754fd1fa00b450a02e542de365c208cf21c74f03726b3d6918cde3db4fd0dc",9.317957166392093],[9289,"bb16bacfaf8bc0d34275b35e3259f7a4afc1f539411b9202322dc09784bee2c2",9.317957166392093],[5012,"904611231992fc1752caed2d582e272a7d33506122652f84c995b062f89f16df",9.917710196779964],[13613,"8a27310ffd7d6c686b19ca8b4d66861b541b12121ac6336e64a3b9efbf47179d",9.317957166392093],[2136,"468b3e76106b4009abe18fe1f1d9c731aa89dc990c662de8da26dbdf97e903f2",9.917710196779964],[16174,"0220d80da33b4cb5baa224821ec563b36bb45f7da5028a78645b8e0d73b18364",9.317957166392093],[5710,"d4901aaf423e2fc5c857778a4dfbb77ad01b5b2d391f22811ed0753dfdce01db",9.317957166392093],[9291,"ebaccbbd316a28796f80a77752f76f01b9a20c0b8d24ea00b4305d1dee93e0c2",9.317957166392093],[6840,"6b8d29eb4cee998e7672fde032c510717c3c47cc9a16fef39628df5dd3f902d3",9.917710196779964],[11222,"8e1bdfb7dc7d03cffc072c7b06cb4e61b4b4e57f713506d34b69a255fadc92b6",9.917710196779964],[10817,"60797b340728d55032d17ba55e44b8a06bb311a8977115dcaf9509be238230b9",9.917710196779964],[1556,"5987aa3294614087b73035785a246c92b8c1fc055bdf99a69338c99e900bcaf5",9.917710196779964],[7430,"01282d78c0ecc31cf70af0b5692789bdffe9fe315007b5516470f48b7f1130cf",9.917710196779964],[18010,"c1001c19692650daa61ebf4fbac615b29ebdce4b83ab128e3c3b6bbb7225053d",9.317957166392093],[2827,"980cde889bebf007449a151baebfc2b26c4b1611a42de40578cbd86def7884ed",9.917710196779964],[14107,"de1ea13af91fc4cf57b068e706f206b109c7dbfd5c099387d0d70df4b3cb6692",25.311942959001783],[15561,"a1fa2a389e5f35af2dba5a627e179e08371106f79fb77866aa3d1bdff1d48372",9.317957166392093],[16381,"807d92084b06de0ece1734edb75898dd2d317352aa311b7cb94b92df5e817c5f",18.269956458635704],[757,"62655582b82aa747ca57df3c3fc529ce598eba9c3a99706362e18d328c3ad3fa",9.917710196779964],[10880,"3ab365fef393d6f550aac2ac7d5c10bfac0311d3377bca79dd00a6cc3936c4b8",9.917710196779964],[17086,"65336a7ea01fbadb433e505a3c818d2f215ebdc8673f5793f62a1e59b4cc2150",40.253485424588085],[10425,"1434d8fb6e93975b8685cb2196698e452e723f96bb02927a23e9ca7e3267a6bb",9.917710196779964],[3337,"44f17495694db98f49d83e8ed98efdf3cfcf5597db6836e1032a8c202cbf16ea",9.917710196779964],[2322,"c66c67d0be974c14309fc4047c613478b0709b2d4040c4acf1112b0cbf61e9f0",9.917710196779964],[3293,"2d001fe1dfe7b0a84c6954c468a94de99ee1a71658e1d53ed760bd6e948470ea",9.917710196779964],[6914,"18290925ec5a53a1b9aa962f376a000d718630e77fb076386870fdba39c37cd2",9.917710196779964],[6857,"39c3ece130110dd8ad116a0d906ec75e39fee8911abf87bff82c95b38ea9f3d2",9.917710196779964],[7059,"fdda8ba422694d33cbaec2448ec8d1c2cc7ef3832336e335e7597692e2d49ad1",9.917710196779964],[17458,"f4fdeb2c63786e644b90812f64bb610f5569f8b743a0db8cec5ce1de6ade9f48",9.317957166392093],[10272,"559da3b02b8fe93c466dbf58716ed7553a8d6fb21bfb3d69f864ca170f9292bc",9.917710196779964],[2313,"4cb12d8b0d80ff4f1d0d955dfbb6706d54d3a293c453617b6a15f5bd6d92f3f0",9.317957166392093],[17365,"8101509a9d595905928f4cfd88590a09d367ced0590e54b02484934ecd848b4a",9.317957166392093],[1894,"1923eb374ce46aab83cce65ce588585955d689b98780daaedf2bcb71cbcca3f3",9.917710196779964],[8476,"fa603647ccfbb80b77b27cc29b8d8c0ad5600e29bb2b5828011cc00394fc2ac8",9.917710196779964],[5331,"be8226688d990aa0ce7513977d715aeda43ab03cecd4515b4ef2bd4794f53cdd",9.317957166392093],[4239,"f1d1878f2c13d312ad30e0a261337f0a200fd2b72b810841da1a422cec742fe4",9.917710196779964],[8962,"e2f78259932960c8fb6b9bc3c5e9b799e5da936f3f1dd3fd3d19f681f4bf0dc5",9.917710196779964],[17220,"2736d1869880c9aab6e46d5e224d7432a72d9358b54f569fef1431dc8606844d",10.052724077328646],[9367,"25d5f8819ff87fedc2e5ecaf04400cf8194cf7602c42ad41a6facb34d76070c2",9.917710196779964],[13249,"bf1576b144f8a8456ca93f75d130a11f2190bb1bcb3d90806a7faa8b6e8bd1a5",9.317957166392093],[12855,"2f49c6df7029de44a40a872f9b41c840e5970c3f0ca5b9622953402936f788ab",9.317957166392093],[3040,"7dce1efa5cc055e736ae50e257bf457aa47433c3410115263bcc87c114950dec",9.917710196779964],[11304,"4f6cced5b860b01d37f93c09094a26f034000a6cd9cef51c91ba2190da99fcb5",9.317957166392093],[14170,"a978a558d22da0c460957b9d92354d1a82cd88dcb55c00b9e46ad2eaece10d91",28.149732620320854],[13680,"58b5331dc6fca224dde3d47c4084ef05b33a071fcc514bc77130649535b7a89b",9.317957166392093],[7743,"c4063a70c251ba868803282f4c1815e9c617386189e46b25ecab9ed461b031cd",9.917710196779964],[13874,"f26fc37928433a4bd7ec87127e744827a968be29c2f6ae23c40bdb9a37cfbf97",10.052724077328646],[1471,"6db74732c6842664c11353bc3edf73f803b156ec3841cc16b3e9ad468c7557f6",9.917710196779964],[4859,"a431ed1c9e5d6da2eea8bce22f29e7cf267d9770941064a3f1ad864f8aff14e0",9.917710196779964],[5476,"0b698e4277481b2a5d6d0993f06d7c774ec991e02f95eb21f1b87724c8f35cdc",9.917710196779964],[14537,"0c1ed4ad999f3aa0c093ae16227a0c5d7eefd58c0036978861deafcf56308088",27.902268760907504],[11255,"b375d9a2c322aa16217955dd1914ca676e37c4e2cd7252e7f3a03d38867a50b6",9.917710196779964],[951,"19e12738eb01a5561c0cbae583002a3552aa9e1271cf91b59046cd93daf97bf9",9.917710196779964],[12529,"9d2c158bc8aac26912b9154b9974f8c137d51b1de93c1d0bd93f08d49dd4baad",9.917710196779964],[13489,"ed52f41ea809db177fa505c4124b440c25d8e3efa4171fde0f7a179183c71da0",9.333333333333334],[18752,"fc993fa6c6a80cae89b3ecdc88ad39898dfe55dab8250cecc5c1f02e6ab57d28",9.317957166392093],[6014,"31b57cf1fa5c23497d8e2c155e836d079ac06622d44cfcf813e20f557794fbd8",9.917710196779964],[7461,"d929df5203ad494d0ce66f0332dbf1f1881caebdd1ee47b233e895168c8601cf",9.917710196779964],[17517,"0cd1bb615e506a347a43677a9b4bb9bd8e67fea7714110d03a9fef03b2be2c47",9.317957166392093],[12821,"fe9d72f97e0ee8f24651b618b92ba9fbdd395514e8dd9bd15a0ab017e8fed3ab",9.317957166392093],[17510,"72dd497c4505f5339b8849834ca0d2c7511b6ecab4e48f9e27cfade7709c4547",9.317957166392093],[12319,"0e8efc1a6aabdd9962ee799ec075511e21fa8136be8106656e3c1787093015af",9.317957166392093],[3843,"3048f835612500e076f11ae68daa0c96bb5f352dc21bc89a0df58ea31dd7c4e6",9.917710196779964],[13565,"d905ebcd88e991b66f22f3b3eb88a006ab9fe22de04d054760e847527222689e",9.317957166392093],[15773,"a5c5d9b9adac9d4e2d2897b87277928b700b3f183e91dc910b7f3384a3fce36d",9.647446457990116],[449,"1f2933fb5f2e98a5dc579159fdc4648a1b1d67d6e1b2c086a47fd97b72b512fd",9.917710196779964],[8979,"35195502859aca6a999c0d21b1c4bf2fd86cc50b5206822ad9a974b0fcbef2c4",9.917710196779964],[19183,"291850ecacf736bb74f178388e9c314516d0d6be72fbf50ac3e2011a9d413819",9.317957166392093],[11005,"052d5d3646675c5b2e66c1da5fc432f7f49c7440a3cb2a842864169e85c4f3b7",9.917710196779964],[5125,"d2ae03870b99a21d6488e30f8546e065d2618cf35783ab05f9d79370633375de",9.917710196779964],[11872,"fa40ff8f17f2b15878eda17b2cbf1dda8dde2db89a02be979ae6b498eec73fb2",9.917710196779964],[2501,"d54a0e60c3044452d6a8749c25438c9508e386fea6151f594a5e327019b2d8ef",9.917710196779964],[16272,"4b3ec3365cc926d0a5f91c91ac03c68f65b4eb6bf802a45f7de89d4246eebc61",9.317957166392093],[16628,"c5a765ab80aa1a636a3152e6ddc5d17058739a735a604e160ff4c765f688345a",9.317957166392093],[14885,"55ebbad856c8d5d29e81f836782853838489056febee91c62aa14e5d41fd0b81",9.317957166392093],[4860,"72eee508f4e3035de2976aed663582f83672548b8ed67254064d7cd9fe2714e0",9.917710196779964],[19775,"9a2cc5d1197eb3539329a9a6ce4dfa252ace93fed970c8d51f54eed558ec9a03",9.317957166392093],[11970,"c9474eb3457154f7c77aafc2bd23529dace528815172f17b95ae9b8c552982b1",9.317957166392093],[19777,"69d09f55c3b2be00e8dd493468b60fc8079257fbd0d6c156fef009a1d9759203",26.721621621621622],[9078,"39013938674cc495e3c4c0f6c1e43df2e2ca73afcbb0286a16f4c6747a9048c4",9.917710196779964],[17352,"3f7b775e6dfd6a17368944a3e4078c73725d0eacfc8cedb81e83be9185edd24a",9.317957166392093],[196,"82f39f74a443d624bba734dd18be1cd8c6f9caf16a00278a28f3f6b3370cb0fe",9.647446457990116],[5548,"a4b945ec837d1aecac68eb7830af925247b7eb45be01bbb1e460b4192ce2f4db",23.404871626069784],[13897,"c454030eb65e66b97196bd6931bb7ae5fe0f490cdaf4151e61badfbec79c1597",9.317957166392093],[19296,"ebe12990fcde3268b68260079952c80a25859c60d5cb159860665c94bc0afd14",25.309734513274336],[2291,"d2a97628e873a33b4d53a44b1ea207e35b63c5cb88a9d310f9e931486bee0df1",9.917710196779964],[4010,"18e77accb3461032ba1831a3aad7a5dc39eefb0d9020925293e522d982a2ace5",9.917710196779964],[9781,"d2b6a8f9b00ba0f0956fa71cc628a4f4e15e82ab65a422db51648b06618dcdbf",9.917710196779964],[17114,"8fc18fdb2f0012fd6bfdf6a2212544f7dc3bce7135b6e3055f55d7d47a57ad4f",9.317957166392093],[15500,"27122708ac6861d8a0bc4c034af3533e536d392534be5c1d4aa3b2a18ac51d74",9.317957166392093],[10359,"dcfc12953ba81237999d96a05aa9e6b867af174d17315460f9a45b3bbdd302bc",9.917710196779964],[7522,"3316c2cf78a12a8f243100c6fa0e2e101a573115bd6946f835cd73c4caa7a2ce",9.917710196779964],[17578,"5bc9387058db940333a356663174a3df0b4ac56355689374e44ccb725831b545",9.317957166392093],[8148,"c102a90d253034d0d809c5b0565aba1601c0f82c8909fbb50d9fd116b03963ca",9.917710196779964],[8860,"6a07d8a28c085b9e3ed03cc3762ca7e4f9542390c3d8cf2db9a61c24647cb8c5",9.917710196779964],[14181,"b6b2b708702555c0540d9f223e2e0061035cf0ff7e31e4884126f84096c7d290",28.94830659536542],[8406,"bd21deeab7a88d5c174de6e21c39a1edbffa9d43d042eefc73229eeea65992c8",9.917710196779964],[16770,"817fb1075b4048388d11ccfb5b5bb90711d6b4cbda9a0f5539038762d4140257",9.317957166392093],[14425,"9178253201c74a1d5d425cfcc7fafaca0f59fa6865cf493ad64410db60b6c28a",15.003322259136212],[8147,"68b4bbea4906bc463197d4f11932c4437bed79298bb20e9a282de696f62c65ca",9.317957166392093],[12296,"8230cee045da4a03f97d59629c72154017ad623d77f78bcac4d6fe0a58b43baf",9.917710196779964],[6067,"be21b8cb4e192232d0bf06c6d1da46ec046cc308328df29bcea0826a9338a3d8",9.317957166392093],[1553,"f875e0c3c13f5fdf43299eabe3405afee06c11215d95a797723f6db8e7abd1f5",9.917710196779964],[17994,"2647bd174ec217c7c5498b7b9d6a661582ad59dc7396fa7951f85927fefc553d",26.09252669039146],[12208,"106016fc68c125838d57097196635659cd2b209a5cc968d0ebc5b3ccf1aa08b0",28.077562326869806],[2264,"b78c77106aa39fa97ee1c8cb6a62b591167de557703d4641789fc7d459812ff1",9.317957166392093],[7356,"9141fe4680be7e217881cbdd34dc616e6000596d34f920e42ddbb6ebe9a0aacf",9.317957166392093],[11508,"59f998b468a17b11c3058e8c3b51768ba08fa740a0515166ced68fca2d1a77b4",9.317957166392093],[16924,"7e8ef69be33d71d0c1739bf5b465a11585542fe3a5d6d688a77a8906e234b253",20.045351473922903],[16695,"50c8117dc2403c4a58b50749fc7a467b1428b056bc53dc69b96cc185014f9658",10.052724077328646],[5410,"9f4305401f570529058fe7e92afd4a3e57e4f7dc5de4bced2cad1823c907bfdc",9.917710196779964],[13733,"76654fe4bd2ae3c92b21e703dc5892ac4b6b0578c17125d43a8bbc68d3b1ca9a",9.647446457990116],[6049,"279938de8f387516f778928b7bc07fb63ac43f2b21fdd6908a9333efc8f6c2d8",9.917710196779964],[4431,"0cbe825c0a8cc88c507a4782cadb9ff2f39a872e41a2fb4189bcbeb1f1d1dde2",9.317957166392093],[6127,"d94475fa39f7e978e944f347d9601efc0940ea3299afd4dbe22cbe6fbed048d8",9.317957166392093],[4790,"8e835fc75b83d0b8a5c4b314eb83dfb0fcaa7e1e2d4f93c50be61abccda275e0",9.317957166392093],[14854,"e8cce755b9eb40e037dab31833731927b356636cba1204d4f90ccb336bd7bb81",18.96797153024911],[2173,"2d76bd6b771b9cf1089868a7335fca10ebf4dc08aa36263c60805a79c7cfc5f1",9.917710196779964],[17767,"74e09d84ff7d7fbf5882ea479c1f133bd600d195dfaf88dff98fc8bfde69ec41",11.232989690721649],[1126,"133ace57a10d7151b675424cd63b17928fe900be932d6ca6a58a1e4a58426cf8",9.317957166392093],[1682,"fadba451fc40edc52afe808802b578fb4c3736ecce1324c9a2e5b2ec6eff08f5",9.917710196779964],[13997,"4c29f5773922de9cd8613b89a9b7f24f6823c736e11622de8822cb8e35580b95",9.317957166392093],[17774,"105c3c004aaa96d2cd4eb171e313ef3ec441c401832dd8c94aa2602aa8c3d541",15.94306049822064],[8140,"3d5fedb5c84d49f6635303985c9266dccf4c7e55d250a99916b7d3b16e3670ca",9.917710196779964],[19835,"14672528f63649d7e1a0b7b1cec330422136bb68c52928c75f5fe0fd45845e01",25.83775918515824],[2602,"dd376f14741e9d562e95de446e8ff07820946bc791ee64179455260e0dd522ef",9.917710196779964],[3739,"63afd8f3a48e40013dc86e61f4a2cc82c9e4149eee343a49fa76109e995e52e7",9.917710196779964],[7560,"e7fbb06cf197f84ef91c4c2345b47d910ff10498c5f6e4ccbbef453c784573ce",9.917710196779964],[13440,"b4f5ba8557e66b66095d3712e254d6a8962987e7de183aa7215de9775cf066a1",9.647446457990116],[2110,"2857c290b172a1450f5be0e8f1e492028f4af9f4fd47b7fa3215ded34d0c29f2",9.917710196779964],[19265,"cb28b2b43889c5a8f467414a5c1b30376135a794d35521bb6c0a0c73721a1a16",16.083769633507853],[13307,"4b2ca9a516f4a925bd26c5e23b4167798d503c1cc77c328e0d4fc09fcdb671a4",9.317957166392093],[15325,"8780f393baae0eec52a0a2f25b4d2855c47ea5ca42f3df0fb2088f2242efd477",10.052724077328646],[14675,"42bb5ca9461ff0cdd9ccb88344aed9fd3ae1789c066c0987064ce9c05b715385",9.317957166392093],[5818,"38341d84d1aa969845c834804fba573e624985416891eb4592715e55e3ca44da",9.317957166392093],[6745,"522ac06fe0caff6f2125efad515489ad9cabe4f930108969a1af79285b289fd3",9.917710196779964],[13310,"8f72e60d29321c1ab05bf840941ad816f2ed6cbe65fae02ba2a062169af566a4",9.317957166392093],[16545,"324cbcc802a4ae116b95adc1f35bde8265708ad53e08b8b1cf31090fc243205c",9.317957166392093],[11834,"815325b3a830968bea0215199b7f8000cedb4ef76f7108ac52ee162613c382b2",9.917710196779964],[6942,"f9b29162099e47a5d0c659819f5151cc2f59d94d2334947019e386b6d97b5dd2",9.317957166392093],[1211,"cce7d268a5c7b732f3ff2d26ce71ef91a1fee5897468c3fb1ae55be74488f2f7",9.917710196779964],[12897,"edc9696e33179d0938998b0de640409936dbe48352439a46ea06ca2d557850ab",9.917710196779964],[944,"93f12969a3696a08ee8b8ae10c48e51d3cebc329966cc85652b547e87e0885f9",9.917710196779964],[4340,"af810855f289fd8b3716218ebf90fa9aee5a0e18ecb7e5b465a31b02db4d7ce3",9.917710196779964],[19333,"a7fb3c1021d46738c3513ff873fb09949badd446ffb21cba85367fb0ca7e1c14",9.317957166392093],[5460,"b541bb94fd142d87058838b659d3f40f5ce0e7b810c9be026d76f2897db86edc",9.917710196779964],[18344,"a3d2cfff1590d9d571be42fb33916549ecc1be4e8bddeb859edd454e6da6e834",9.317957166392093],[2493,"bfd730939de60a7f90e05ad6b398745bef20eafb2e325cc25a13f3d2004ae4ef",9.917710196779964],[13620,"d4493221b548a01a1e696f11936811b6323147639ea4ced1366357738572ea9c",9.317957166392093],[18760,"0c797156a765634cd7db0f4466fa00a9a7a2e40286d90343a8cdbabbed503b28",14.186291739894552],[19857,"91deb1ee1f6ee54192a5938d327dac07a589da5b59f201c52bdf5674549b8900",9.647446457990116],[847,"a2cfda6d20fae82600331c64c030ed2f6e6e88bd11ae04d66b3f34a8e8043ffa",9.917710196779964],[7694,"9cc36aa08b957f7956b0cf84660a9419d0bcea269de50a0637da96d81b0895cd",9.917710196779964],[19011,"8b6ac97b5a8d04041b8900fe7e8456ab64d816af85d26a9b10039286a8181920",10.052724077328646],[4739,"a866c4d136e478ae2141dbe89970873fa1ee10b26dd4e8977ad023a59deeb5e0",9.917710196779964],[4587,"3761b1f62d28aea02c6fe9884bbdc9199f5d551fba9e340dba22e8f8affbade1",37.53225806451613],[12100,"47dc7cc6066c402f5df376269ca5895cae0453a8a4e2520ec6b1f452092ab2b0",9.917710196779964],[3727,"337a9c71d702ab2661d2275cfa10988e51fe88f47f3e9ad0c8ccfdfae2096be7",9.917710196779964],[13836,"42d55dd948b488507beb3a4b31d87e27d02ad06052fb8a52cf3af3a02cc99398",9.317957166392093],[14703,"0296add2e88fad1be2ff57e691cd83358b126d13fce507fcebde1ce0285bd184",9.317957166392093],[2707,"8d2b753be8018c5232f806251d62a00ae1643edc65442c78c2dab87e424369ee",19.115384615384617],[15256,"eb093514f86344bc5f2329b2b3313188c90d131e93a6600aa9ffc93210a65679",9.647446457990116],[13821,"a87a2f2a815ae915a7860a0528b3cfa1f8136b46195dcddbb90dcd64f47f1499",9.317957166392093],[7450,"6d4ea0154e2eca8822b4a25ac1684802f0731925c6b7329c06f50a45a95d14cf",9.917710196779964],[16214,"a85f9a913bfbbb13b3629582a54adc9d7572affc5a6bb845c7426d77a1e98163",9.317957166392093],[13709,"96121b122847e8425cf7534a323305e9946da06e02add3c78d269b3b4aad2b9b",9.317957166392093],[14656,"8e56b78e6ecb821751891d2efb7a34602d8040e5872c5e3cb59efc9748f9ca85",9.317957166392093],[1735,"0929b24de5a5941029dab6ed2c6820f588915a18cc0d891ab9a67611aa88b0f4",9.317957166392093],[7777,"ac04ba3eb62f03e9f43a02ddb6d47ace4035e46f20c22c609f8fe7ff748cf5cc",9.917710196779964],[19694,"0b1ca223ab0a6accf03b8e714c0b28d8c531edbe01b265f7cbc51e1117ed0907",9.317957166392093],[13515,"6d0e9c39fbef73fba6ca3519696f31cf4bed644df518988fa805a9ae565b7c9f",9.317957166392093],[19239,"04f3ac7517657990d0e4d92c7793464d4df9128574ef4c4830b77b3f33544617",9.317957166392093],[3107,"bbc43bdc89d1c8b59a8574efd68c80f9456710ac5720df38e82319b2ee379ceb",9.917710196779964],[6759,"72422807cec578618fc39e3f96b84015e66330fd3e2cdebb2dc1c98e200385d3",9.917710196779964],[7011,"1514c13f44e021b3c1ce5753561aa01301436122e6fa3e6bf6352a68d434eed1",9.317957166392093],[19201,"be526d40a66c2dc6d43d87a18abff21e41a8f30b87e5bd6bb3dd8d946e998618",27.83273596176822],[14179,"69998ef6f94f5c5061a7cd9fc33afb77a0c0247b1794998f2d981274deffda90",9.317957166392093],[6512,"518a5fb3a52b47ebd7a65b6a3c20d230ab8deb8ba404240fbbe0591a600c54d5",9.317957166392093],[4922,"6c5702c9bf9461fc4653c384f411e1f1d80b2642f87b923d8b95d9d91da0b9df",9.917710196779964],[6071,"9be71d596a7f7ab41868ad89408abef7b6cb06aa7f16d92be5016a6062fd9bd8",27.933649289099527],[4455,"d56348a314fd28c726bbc7161747f0b732813d516dc648165621ead3b04fb2e2",9.917710196779964],[16462,"e84a8159ff055e345b03ed8546d21473faac3a4969b8f0361612064faaa4fc5d",9.317957166392093],[18705,"f171f6e8e98505b86167233968b2202281f7da49352f7ba2d3dad41400a0162a",9.317957166392093],[16870,"689afc3948d76f5acc80f1821ee3d5c85aeffe7d6b244bb5b12db88454f0ce54",9.317957166392093],[13513,"54710881ae7df911a1d64028f96c78c0c0a1a1a769a6ff1592322ae518b37e9f",9.317957166392093],[10157,"43b5a889f82bfd94fb8a444f0eb05d74850f7e04b987efca01a86bace7d15bbd",9.917710196779964],[1854,"fd2e66b83a06d3244cba19b957dd35e94d829df0dda8459bb0fe4d532c00ecf3",9.917710196779964],[9565,"0cdff27365ed649adf891ee65869b5818c1637fcef133b8bec1b7b2b285335c1",9.917710196779964],[5061,"b326f7382a57952b2c7d9d647aa0b9f93691a511da0ee05f02e47ae1b489c7de",9.317957166392093],[10489,"ba15d40cca543399d16a34c60fea581d9f5c574b7734450049e4b408bf2d37bb",9.917710196779964],[13159,"c565c2140dd9b90b0a635d5c59fab0bd045b9ec2404eba153f380bcd7bcad1a7",9.317957166392093],[3512,"7afab4e8164acc0ffd011c3dead26370e9bb08ecb35be0c8e050549102a8e8e8",9.917710196779964],[15331,"87bec09d36a30e3ffe4380cf82a90a88300054a024baef2615f006444988bd77",9.317957166392093],[2636,"667f2ce38d6d0850ea3e6275686acd4a63f28da781a36efd32ef73a9e4c0f0ee",9.317957166392093],[4482,"81f876af95eb6e5967e9590e9425329e2d901525b69c57633b92f446cecd86e2",9.917710196779964],[6379,"8b7d93cfe8288c7daef83beccecd0b9e943c0aeaef2786439c4e2a9b381374d6",9.917710196779964],[18811,"03d132751f94a3ecec8b12176482acb4d6e02867f02b2e0a3c610101e6415726",18.682835820895523],[448,"a3ec3584ea6a5e42dbad76b191721db24c850ca4560fa8ce2d413130e27c14fd",9.317957166392093],[2483,"3fbbde61688d426315b1784f4b15f9874f6ef51989bf6e0c6f7ad25143f9f3ef",9.917710196779964],[11310,"c207ff61777f268d932e2572f8ea390429092695ff63f63cf4ea5a8b8d99eeb5",9.917710196779964],[19563,"cf05d31bb33d404893371867388993614bfef2a2cf368e42ec9ac54404082f0c",9.317957166392093],[7815,"b1a6ea922d9301fbe854908a501d46d5d8110b3073e79d6ce068bfb211b4aacc",9.917710196779964],[6944,"6e731f2983d528d8afe547cf11b986747d875cfca8fee8ed66ce8beebec64ed2",9.917710196779964],[17873,"ad22e8b32a4cf61236bd4261bfef13e3ccbbf49aad131896b0f240865083bc3f",9.317957166392093],[4264,"90cb2d403460de933be1b6d592e7990a65b64cc216b5186ec7e3d0f72d8b04e4",9.917710196779964],[5510,"3a56ef4eb6e4e93645387f253dd180a4f5309d55a633b84e9b69b3bd0cce28dc",9.917710196779964],[14618,"a30e5832fe5a00a9241a86de563935b9435b50573ec01524b76b8bf51036af86",10.052724077328646],[10866,"b83f868c0994289f237f13505a6e6d915bfb31ce4a823e2903ea9fc11fc0d7b8",9.317957166392093],[19051,"a5d75250c65e5546d5597909dba97a9bc324733e64502de99a32c8fe32c6ac1e",9.317957166392093],[14270,"a1bc31a2f24c47e8be40707781bf0b9467c92324d42dc0a6b311d54e5fd0868e",35.906103286384976],[8347,"a6959ff6fb2775b5c156a924d14d90abb9b41577ac7563c7bb4211655f3d03c9",9.917710196779964],[12179,"0ec000ef8f2e21b05a0d8870e56dd23fc06033b5a4811c17d44ac8ec00e833b0",9.917710196779964],[11681,"f9f510151763da3fef0d9ff080c37c396ef7bb24664c1b7ff52b14d2ecb670b3",9.917710196779964],[10328,"320153cfe5d39ce20ebe31c4311b01811ae7fb532702904c1c7b2c860b7927bc",9.917710196779964],[18901,"7a2bef273049562da67bc5dd6c4c0c56ecfdc9da37072c29b468b808adc37923",9.317957166392093],[14714,"61080f9cc7c2140cc3d7f4656a5255ca1f425a20b2ee22707e6fe59b07f79d84",19.06236559139785],[6737,"fc5ee64d82c47044721f1bab3750d6a7b8fd9e82db2422ff65c443f6cf89aad3",9.917710196779964],[9082,"df254c412fb852890940fb20f08bc66a5389d05f165be8a7ad360355795343c4",9.917710196779964],[8756,"d01c3cce2ba6b2245f7736e0d463fa16b95127d2a84b81a14a8bfd3bd1c24cc6",9.317957166392093],[4383,"bc20b3272a6191f5b7f12cbc45b926c6f8888fc6f5e6aa85723584916e152ce3",9.917710196779964],[12185,"a1df420dc41d72a11e7464f4878d0ce2519953807bac9494a5751bccb60927b0",9.917710196779964],[17163,"31ff5d8781bdccb11d9ccf4fae2867846b466c2c32c4574b430eb76ef1b1a74e",19.101604278074866],[19397,"ace6b791cb4ad2ceb63d84febbb08f5167d06f6f6f41dc613dcaeb940d44dd11",34.88770053475936],[9185,"62d767e0390eda62e84307805b8dbaa75c353d75a1ea2a49ba3ba1cc783497c3",9.917710196779964],[2748,"517bb8536320b430f8ad9f2315abee1079c337abce335ea110677e7aebfd1dee",9.917710196779964],[7349,"525f41a65874d66804054efd6f9f14e98199d117c7a52e68e17af8014e76b5cf",9.917710196779964],[15481,"3133edafab20489a47d91bac9a91a29b82e65f62ed4744d67a5bd4ae67c38074",9.317957166392093],[15449,"dae85f8f503a98a65d6da42820926a4cc07eeb887cbc5679f621b072ca402275",14.864253393665159],[15915,"b481fb1d88d326d25866e96b04cf8eec43b259ed00b86ed648cb64d80bedc26a",9.647446457990116],[9949,"40df8492f0e2c4e64715271111625705af9a072872edfc013e4474d5fa4ca3be",9.917710196779964],[4123,"be937b69cb05d8b138d8c00dbb4b041f06d4f7228c431f4b52d144d0352ce9e4",9.917710196779964],[10500,"d641ba013aea7113e1b3e462cce0273f5305901ad0ba05e4f87a949a9d962bbb",9.917710196779964],[17918,"4066bd2a2cc6b52f87b6653febd553be5a3095b4b84fad7bf2a58268ebb7ee3e",9.317957166392093],[9435,"9b9a667a9d4b5334b5d8c276125ae2c40dfe215c69a85e13407955d2553f1bc2",9.917710196779964],[4867,"f864ab34931acac83eff8cde7c392ec4921a0865598ed325bdd34f3a4e1a07e0",9.317957166392093],[10779,"32958875459caa94cd832e55c6eb1bd4820b494a13811c750cd7fe3864f56cb9",20.202443280977313],[15013,"fc19383c5ad9ff1803cd082806b716c2b4eafb4496d749175d75e8117557157e",9.317957166392093],[12738,"2fd0900c022f1a23fe0c2fd04ee643dae812e42ab1959a2a36c2d503655a53ac",9.317957166392093],[11980,"75b2996dca3afe1c8132f891a60e9c3cbeccfd4073eeaecb119f4b27d46a6eb1",9.917710196779964],[9984,"3bd0ef6a040fad6a0e67c94a21631f7ed3a4378613f01968b5297b6e724e6dbe",9.317957166392093],[2160,"249f2285c70cf4030737ba1fce2faa93ac18b7d1540fe7ef447f0f5f0902d9f1",9.917710196779964],[12960,"21fc7fe90dfa9c8f788aa70aa0d17f918fe7378ea7a9992f543c646183a9d4aa",9.917710196779964],[17880,"a3d68753c8d7ad575d3bcb35c7bbfc7cfe4d47577aa4c84317c3ba085cbba93f",9.317957166392093],[13493,"e57a22721f410c387172c7813cd043662acfdd4c76637dd83c17b606b1d9f49f",9.317957166392093],[11183,"eeecc91ca2f80e55bec7c321aa0a4a119e215a9a9035af882873a12a82b7ceb6",9.317957166392093],[1426,"392344a363c373de03b965df52c4ca757000ab20222cad0212b3cd1848f1acf6",9.917710196779964],[8051,"e88d0556b8a6f5c04e86e5ffbdc84f077381672df3b5700238c0c2c1ecf526cb",9.917710196779964],[8207,"992627941427600846ede2205faef74efcccae7ffac1658fec0e4458f3c0edc9",9.917710196779964],[225,"dab03ebb56aefbfc04275853ec8689dc05e76c99420eab45a28d8013e44f79fe",9.917710196779964],[15372,"f5de5ff6d66c7e11b08ea18dccab476fdcd6ed450cdbcd5ae963896b0f23e676",9.317957166392093],[6770,"eaa6c26cfbaabe2bb67ba348eb27b715bcc75d6a1b390158c3bb6113debe79d3",9.917710196779964],[8389,"f8d02e4861ee875ce5f29b81db1691625569cdce06b8b520a3303d82112db2c8",9.917710196779964],[13702,"494cd5b9d6b65820f8dcfa3c2b283e2de8d5a2c0dd127db85fdf2a9cd264459b",9.647446457990116],[18267,"7d8f8801bae224deb52731aa510ec7c5fe496d750b2a6f50cf9d979cd63b9836",9.317957166392093],[19014,"2a4e96b0f786252b8ed17ac81231d51ccd816ce199dbf9fd8103af373b3bf71f",19.771836007130126],[2684,"7c5176f1b4a78b9a416b10e9d4b5e85a71b45c91587bd0f1a5fad645970594ee",9.917710196779964],[5874,"6679124b6864f00e228b5ab2d4f233fa8e91d379f92353b6a0e71857b4d0d4d9",9.917710196779964],[1042,"23a2e7e0bd05e6162909bbb0d6d35a86ed77b372571a946d06cc0f21dfe707f9",9.317957166392093],[19658,"938e328514830aee3ff75f1a734bd7ae2451c16a0170efdb9aefdabdf62bd807",9.647446457990116],[14227,"567d3112216fc86355e00a82a8ae19c17dc0025909f70bff601d01ab77657d8f",9.344947735191637],[18287,"6fa3eb5d5fe974daba40d9c561c859c97375c0952769d9ed47efb27ec43f1636",9.317957166392093],[19080,"77c663075017e3a61e7e7461bc9a25745d143a8b82a841be8b2deae9c09b901d",9.317957166392093],[13177,"2555e4e3e80c5382efe047c16a2c59283b56804646682468ab0c85b2634e6da7",9.647446457990116],[8173,"01f4973b0202fc25d426dc7b717d053f3cba99b9247bf1d1a726d72f751626ca",9.917710196779964],[8543,"66caae87c6f72deef39da80e38aab125614b7a7b588d9f7f16f2eabe559ec5c7",9.917710196779964],[13213,"7fc3da55a220c76c93c4ba71bbf05e2c6fdcdb7783b2c86011cfcf6b0d519aa6",9.317957166392093],[6190,"1f86aa94c9ededacd1aaf4374fdb2d68ae92ce03054ab033eebcab96f392d9d7",9.917710196779964],[7780,"ce125267529a7d40b04e94c2e9804b6b34860f8e3da9a1c896b565ff1cc9f1cc",9.317957166392093],[10600,"6046e1fa3f97ac4a8ef996e3a45cc17e59df0aff5eda01d24c2709d8da64a5ba",9.917710196779964],[7159,"35748792356132e294829af0ab28bead62f595bed1f3df753c12171f3678f6d0",9.917710196779964],[11409,"7ab4468a1c7202a360c3fb0886f4a61966ed9183468e42a4046aae25fc134eb5",9.317957166392093],[11738,"69c6df645abc814b8351bbd6d7c00d0861ecf005189dc892a3d229b9e3e213b3",9.317957166392093],[19869,"912a98f21c014026fcbbfc4ee098196b16b79986fbcb6b1036dd73ff3f6e3100",45.06926629040534],[7470,"1ddedd722bdfe02ca4a71f45a31b81e79985d6d727137ce2e40a7384606be2ce",9.917710196779964],[4744,"7fa16e5eface7fa5391e1b347d373a481562c97524066d6970c316831e07ade0",9.917710196779964],[2214,"59d468b07bf5d3038784e597a0b6429a4a70bac35a6e4bb00ab0b7b83e6b69f1",15.003322259136212],[19781,"0c3c67fa64c81d559535118b1a61cfbb3595913b03efa4a6adc7e0325a527103",9.317957166392093],[239,"47711202678bbd3f8e9874abdc61120a1a629e8e03455c6ef0d4a6440b5f62fe",9.917710196779964],[8980,"71392be8ac531504dd1845eaf694aaa4505010fe8cd3c7796701ab8e841cefc4",9.917710196779964],[13322,"b4b6b947b1a96564698f2c986dd1150848e21559db67a9f47e7217c6053231a4",40.766146993318486],[7732,"4ac3bdfad9876c7294543a9d83fe343e71d1e271fe6d4d73b5bdd7d5d98747cd",9.317957166392093],[9081,"75c18e0eb2af97ce7f2a03078cb0f997b0b0642799256cf5a381c2ff803744c4",9.647446457990116],[6462,"cf35f6a63275fbb198bbc54d96dff537dc23e04eac4fe20edab17adf0ab9bdd5",9.317957166392093],[10388,"c3e9d26f3d1990664f796e292f0820cd274b3d0b5f4e4e6a9996a317fb2ce1bb",9.917710196779964],[14441,"ba5b10c6aff5363ef2ae1a71a6dc4843cbd60e5b81c2291a9efd976ae2ef668a",9.317957166392093],[17495,"9de705908c55fdfafe64fe23338cb8d1b1b551d4809cc1829e806901bd68ad47",9.317957166392093],[10249,"71237102e8c9e9d8e372209215bb215247b8d7145ec1637bf1e71b2464fdb5bc",9.917710196779964],[3735,"db6cfac8d617fed661bc1ef7f62b39c90083529ea0dddebc80362cf29d4d5de7",9.917710196779964],[10124,"0e7b151463f8ec84045587e0f8f727d04b5b2b6d4f3c482de3e595e2305b89bd",9.917710196779964],[7691,"2f4547d4ca065774c31f8f64f02b5a402da015240806472f5ddcb173a7649bcd",9.917710196779964],[10802,"0ac91b5c376d04d48f15453445c64fa65cfb91758a99d01a8145b748b89a46b9",9.917710196779964],[14195,"ba493d1289cf7527aa9df12af2958e18ea86934b3357e60a9aeeb9b2964b5b90",9.317957166392093],[16267,"b923577feceae1da2803b39662c34267f31293f02ab0e793ce7e54976808ec61",9.317957166392093],[7510,"7ef595a6386c24af5d3f3874e5028681487b2277ee9eb0e7245f9fc8ed99b0ce",9.917710196779964],[11449,"5e1d1a8cb66309229e175a7d1d9aae6dc299ece30491e5bc80ab6df00414f3b4",9.917710196779964],[14127,"e24e2f727a69ddd126d2439d23dadb2928fb7f29fff484c94ce17a76aeccf291",9.647446457990116],[15865,"ba0d0023e78d814152791dac9e49c1164c60b53550b73951eb4c38d4dfc4c86b",9.317957166392093],[15026,"333db29b02612c52d2a7055a52952a8365077124f547b71a46fdb7b54a8ee67d",9.317957166392093],[13575,"8ae136da971a5dccffc249d0d25cdae8abe5c40bcae4af7f4d8430f3c7f5fe9d",9.317957166392093],[9342,"2a456c4d82f9d5abf031a16f33515d120beb602aa31d6d75957ea0a63c9ea0c2",10.052724077328646],[9295,"c3dac2a81c2e74baee913e96f374a930a38bd5eabd77e42f84967c1ee2e4dac2",9.917710196779964],[13835,"d9a4fdb7f951f7eab94086f22afc20c515ddd3c57fc61d82dc15d28351d49898",9.317957166392093],[11524,"a04d7ff1cb0eac899fc6255b7a7b32ca9c3e4f16912a049e116e357089ba5cb4",9.917710196779964],[13239,"0adfdca3814fe5d860adb23b264120729030c4678c230d799dbe28a058541ea6",9.647446457990116],[1764,"264b52c5bf52f222e1096e9da7ad5227af1906333ca6475d08f9cbadd17e82f4",9.317957166392093],[5035,"dba5fdaeb6d7d6d3afb9cce5738fe1242c5a31e94a91682d45572232104ef7de",9.917710196779964],[398,"b6a22141fc79160355331a3b0dd57f29090335643bf99ba4cdb45f60dad15bfd",9.917710196779964],[5721,"9d45d5407e96aee62071ebf9a5e28e6bd56d48726007ef3794b8b65136d3e8da",9.917710196779964],[10820,"2384db8c6a693c4d2c26d8a5eba94395051ca23a229080160a944ff851692cb9",9.917710196779964],[14366,"cd4246c9185eab57e981bef5e6f919586affb9da39fed9685db0639059601e8c",26.062052505966587],[12765,"a95301864fb45fac52459ad06fe33cdadd62eeac186851608cc2e158401521ac",9.917710196779964],[13571,"f47db26258cd7ccfa5344c788200db264ade28e2b8f027087d326ce43c412e9e",18.131907308377897],[133,"1cf614ff5b730b30e350909b7cf8e863683b17ef486b99ef9d35bd58e6611aff",9.917710196779964],[9705,"54807b240cdfda2661e2072d4501523b283b6180ade27b541feae4e5358555c0",9.917710196779964],[18968,"44f3949f54e2563bb9ecf4ae237bfe41c6c0ed37de3d4c16e16041c0306d9b21",25.40463458110517],[3124,"044fe18037607bdc86a2ca7a39bc4e9076023de57d1d2c5ed50a1b25e68383eb",9.917710196779964],[1349,"12c59014eee4fa265cae524aa5c0dc256c901ecf023058fb2ccb0415efdf13f7",9.317957166392093],[5340,"f8d76c0a00772de756662c5eda4fef6915bdd250ea41f6b8862f98c4528231dd",9.917710196779964],[5112,"89aebed3dae8466728ff5c169e070f46f8482fa55f672ccd97151eff320482de",9.917710196779964],[3498,"93fe86c7ada93ec9ce7b0bbc25532dd4190c598c6a4033d11a8ff2649d5800e9",9.917710196779964],[8022,"c15e2e9a208201819da5b64bffe7805f2355316cdaf780555755798ee2f66acb",9.917710196779964],[6827,"e5a61868aa7c216adb3d473ebedc1d7ea4872b650934b2dae38e3d97f99912d3",9.317957166392093],[15491,"f97f8afca9cfc6739fe1a00f84b02080afb63398b977e9e54f382de006ad4674",9.647446457990116],[5195,"96f5c2e08319288ac3cf0ca23be81dd6383d55ca42a7941bcc1cdef5ccf101de",9.917710196779964],[578,"8a2cac1363e3f1855fa94b316ea940ce2c629bcc782d439716a9a35b7a0d17fc",9.917710196779964],[6634,"744345b6cd53641276547468d7f7e3bb7c9283d7dba02df370b5a9e9019d70d4",9.317957166392093],[14210,"7ba459c51cea8a58228f177caf4815b8f7f2f681710fecc310bc646195c1fa8f",9.317957166392093],[9410,"168965697745db50fd01a9322db1ff63c53db4f146f16860de2cb4e857b13ec2",9.917710196779964],[6270,"27c0d6acd84268dd1b6c4a355b6f9a1bc1fb6e02768069494a9bc5f8afd448d7",9.917710196779964],[2871,"692adb0f64eddf33484fe5a3e7c22e91a12130297123f202f1494408eedb49ed",9.317957166392093],[19559,"9b25a3e85dee338b96f76b46a8272c0a1226e687d54fdf8976b807d275e04f0c",9.317957166392093],[10733,"2e25b4ca912a1b4d08d2f23907e741687980c1db5622e98025fb5aa55635c6b9",9.917710196779964],[6825,"00a863e55f33033b7333707962a19b4e96e42459cca4ff9972ca9d893b5119d3",9.917710196779964],[7826,"50402026963581995cbf5d9657d70d3e5a079ef61a4ccc3d6b80e3b352f099cc",9.917710196779964],[2378,"372380e6b68b7c6c063cdc79048db1c0c49b78e7fea883939601a5b0842895f0",9.917710196779964],[8069,"06c66054e8162b9c9c438c69384d2adde28e0a9cf417a3704ee7275f443bfaca",9.917710196779964],[18444,"06ed8efdb563844228ec0ddd01330ffcf85c87123a662dc188f879a0d623d132",10.052724077328646],[19170,"febaf8abf228666f3ea28ff83386ee8d824951ce6ba3d460f88e479d209dc019",9.317957166392093],[9255,"4a88372dbd0b9327c76badda255562251fe9d85a0293318c338c0578ab6219c3",9.317957166392093],[13116,"3411add606f1a509e24e8aae0e84af1d17a5ceb5d22b8de2f66a6daaf0d8b1a8",9.317957166392093],[1165,"b897bedf67809758edb161eabb739584def931ea0d9b1ab536e5dc8f8f122df8",9.917710196779964],[6287,"1b701d0df041b386c1ebed8a878de463de9818b16199fe0171ecf3f94b6a26d7",9.917710196779964],[3277,"12645b226da82f29e78e164f1585d95bc94bda30f3beea5d6b3ea1ffd7e98aea",9.917710196779964],[9687,"8cf49d82cf22a1bf1c8a66263219082b91b0db210cefdc24da7ce02c04117ac0",9.917710196779964],[15751,"aea881ad0f0695cfac796386a7afe5117ad64cb0411d6b21458a1b86e429576e",9.317957166392093],[2590,"e4968e2f145c3c80ac5f7a14228f99bfc5096b8a3ae18060c490cb8944f234ef",9.917710196779964],[8994,"a168a5efc6d4824d9811909207b279b2fca29ff6ca9887390bf868baa96ed0c4",9.917710196779964],[19152,"a8c11f69cbc1e31fb00b81af57a40aed247e2ae8ab9fec51ba8a860d09bb691a",9.317957166392093],[12711,"8b8d618ed131118ce462a76b2275ae6440b41a2444f2e6d056044285f24185ac",9.317957166392093],[1370,"c16bdc001e162b761f548d4d056a40db4b972b005ccb3615032aa7ed374cecf6",9.317957166392093],[2220,"00b11ee5c0b5948b1101dd671f2863b411b5b16f4c9b4d7e5dbf5984ef7762f1",9.917710196779964],[10904,"1b2573e7fa0bccfb066ed9e357cadaf4518e8964ef2323ffd31a0a0c17fba8b8",9.917710196779964],[4639,"315e6871fcb89a45dbf0ce14cb875b0a76f44b836d04d6a94365bdba5ceb60e1",9.917710196779964],[5557,"26ffce18a42151712bff53b77ba2b73498df9ba7b8b38a1947ca1718c478e4db",9.917710196779964],[7239,"457292947fa9a85a4f12953b504b6ee7d85bb0ac9780950b6346a08445fb71d0",9.917710196779964],[15846,"041cd6235efc7d7de20b12ba9bc3dc2225a2891db6387c804b15f63371b6566c",9.317957166392093],[855,"63c8b19f14a7cfc2c81359b99b6d7fe64daa09441f5523ebc18520e90d152efa",9.917710196779964],[19773,"2e4717b7eb3cf9c4675748f8b4743b1d6d70d7cb2718c7ddf4c38eb31e159f03",10.052724077328646],[13691,"e2fe8194daf5c20e5f83d3894ee40b09911705fe30c22651af8499c42e9e629b",9.317957166392093],[3077,"df41023b97c96bf4f379ea28249a93bc0eefc456afeedd479e36f6078bcccaeb",9.917710196779964],[1187,"a29f58fe2c8d7a46fe73dd81c1a638174c9a9cf32c293a27e35d6c8a413d17f8",9.917710196779964],[13567,"a27add9bf6fc935a0bab62150cea546b6ca99131c3258ccbdaaf674f3b55559e",9.423008849557522],[10662,"2f2d690fa80e11c0b7b9fefc5a9b5d47b3d9503ba3d8e71af7533500f52a47ba",9.917710196779964],[1818,"39020b939274f0aa31156c3209d3447097c69b9f18a2d06ad976fabcfe3421f4",9.917710196779964],[2429,"6be12faae188d6d662a19f9916386d82f8ca9023d5ff0b83212be58c2d2344f0",9.917710196779964],[17356,"732ce2bde75ecbe756ab24a7a71ccd3c9576503f6bf549dc57686c49aac8c44a",9.317957166392093],[7226,"148510041582218a7f02eee0cb3df3a2075d02853cc0fd70d9a386bdcae97fd0",9.917710196779964],[11132,"7a68c559d4ef561187bd7f1adcff526a1343adb2ed7a6e31971cf1c20ea219b7",9.917710196779964],[15302,"57eaf23323086064d6d5ed8e23b67bc30279d0120953cf048d0415c913e96178",9.317957166392093],[14353,"ccd0198de6ef7a246fc24702476350ca453f378bc164537539db8b9bd9424d8c",9.317957166392093],[13312,"e14570d94e7e7e7e8476670301bebd1062a5142808731a2d65828c31168b65a4",9.497326203208557],[8870,"c0956a6ed31ff083c1c010ffdff7769b5c307076420a154c36e7bc281c96a0c5",9.917710196779964],[2845,"651c86b885ac071021a3c4f8a00cbdd3b065b1c6ba20965ed5c2c3163cb462ed",9.317957166392093],[9523,"ff9e3eab702a9fa12a5b2fba30c2614f0133c938a0cf3aeaf562d38e98228bc1",9.917710196779964],[1013,"a8ea32aa5ba0ab9e9c6116af5c9d65b41516c179ad1b71d2737dc90c780b20f9",9.917710196779964],[2908,"8052df7e9d5b284537b7cb8b38c485709edfcd2e3e16aefa08293b71b5fe0ded",9.917710196779964],[1251,"e09a8e5d39994b6eb40c0462ad4a1048805e764537b68a2a4cd167eb570eabf7",9.917710196779964],[5064,"9dba29b5297a51991b4e2452fdfd78dc597c07e7a246de95dd9c819e4beebfde",22.26876090750436],[14422,"83f67fd9c4200d538485e5d846c6e2fef2d31616a289814c7b7e16f84be8cf8a",9.656716417910447],[11948,"acb5e120725750b554449fd2d69876eddaf642de85299c910fc70e62804ba8b1",34.92],[12245,"235d69859a7f6405674a13fcd8c39d8f4a4ecd6fbc59c541061dc88bb0dfb9af",9.917710196779964],[8823,"07f92ecabe4f2cdea43f57e397cc85cf0d7e583f4cc4ff07856018bf801cf2c5",9.917710196779964],[6714,"23054402e2f1218502cae97c9c2e7b1baf952fbdf6ee1ce60a016e5bd1bad6d3",9.917710196779964],[15482,"7c18689a4b02c39aea91c488c2be8c930e4ba9b89fd7cd6fb7e42081a7338074",15.073170731707316],[16667,"380e91a6fa518e1ce67d81cd8f6378ea7bd913c37d76e992a36ab87aa1365859",9.696644295302013],[9315,"c611e670568c53c6b0433cd7bc8111d4ba4b84e89451facec87054c6bd87c5c2",9.917710196779964],[8921,"5d7b847626f5bd0c45be6d13ff9752a742eed93d3a582002c878c8d75b7f59c5",9.647446457990116],[9430,"abb1b78af254f8696daa73acf91109314d9bb419dbdad60a3d54e8de05df27c2",9.917710196779964],[8467,"a31d43728e56b478b553d7daa7ff2f3c15b021be2ec6372463d87bd05b6238c8",9.317957166392093],[17021,"841c71c7a36bc4bf3229f394fe5ac687ca2aa824ae2555919d2a7d18e1e58b51",9.317957166392093],[3116,"820dbe1dac53ca77d3884c70fb5844057bcd84419aae1e60bdf5700714e58beb",9.917710196779964],[18838,"b33ce1a25cb924059fc4869c048f9069a0e343b0774780fe446264191c977225",10.052724077328646],[15682,"f4c6daadd70551c62d637d8d480909a595151acd1689caac39f2bd959db8c76f",9.317957166392093],[9917,"b75e8f10f6391fb7b6df0bfc8d986dd7563f0a44e8fb64a71873bd1c3371dfbe",9.917710196779964],[6548,"3f235fd02367ffc99f0b03f91a8ba2bfc3d311aa1130eb5d2da353b8690a0bd5",9.917710196779964],[2718,"ab67eb0d5955b0c9be38d21a666513124d8d77904c15760349da7499597552ee",9.317957166392093],[4805,"a7b4345361d2821a41c02649db52c2291f107c7eb1f747207c90a92d79ae5be0",9.917710196779964],[9810,"96b7920cb35c10ff0baa1c2c3c8a90e382fd3bd8180e1d7b4b58fecc859391bf",9.917710196779964],[493,"0d705b3328e2991324c65d23e4409434322d31bcf78c7bfe45556a699222b6fc",9.917710196779964],[17013,"7ed215d221c1bb3b92d27806f0d48499ac98e70d629bcec0e7a44e8eff0dc351",9.317957166392093],[5973,"835df2225988de994a6066756c409b95bdd0dd525144d79f05ceeff1e39748d9",9.917710196779964],[18233,"71b823e0d999478a9483f28c77b0843dca621727c7bf39a8b01b17984ff94d37",9.647446457990116],[544,"349ba8a0619b19b89f66e663dde667b6310b20fe547c4c089a32f2e2a7ba53fc",9.647446457990116],[15654,"5688de4b88a01edbd8f11026aefccc4fedc9b35ce0be19f7d41267bd60b94070",9.317957166392093],[11297,"65016ba39fc2c2d3e65fcd68203eaac003fda269628cf20d9b2d7a55f1f811b6",9.917710196779964],[5034,"21e654fff356f105b8f2eb4091d426d4c56eb39058412bddf40f6b1d5e66f9de",9.917710196779964],[3091,"040d9d2476d7129fe29afd05f0bb93b381003a70f99c76f5b97afd1315b5b2eb",9.917710196779964],[3633,"4cf0ddb1c81d272c85656c80e747f60e0b89f230a72f99afb1206fae634f09e8",9.917710196779964],[5826,"cbcf8dffe9fb13ff49e385546d1a06f24512505f63ad7b1801541c4ccb9f2fda",9.917710196779964],[19117,"0c182c4591fffae912f8c64cabdf93d260b23270cc226fb8e46b131f6471c41b",9.647446457990116],[18466,"d8cb0d59df889d14a9d482c51bbccd46519b945df256e7dcc5180940e40b4a32",15.91459074733096],[7529,"dbe266b53f2fbe9e16086f17b617ef3f0423333ad2ace360f2dd6a08488298ce",9.917710196779964],[17076,"fa2c7603af0a9b08322e88e9d1b142c81f274928f5ec274422b0b89f090f6250",10],[6956,"e0770c6c19843bb93e9b477fb10a292e06a336cd711dae15d02d0423780b3dd2",9.917710196779964],[8872,"d64773cc6d0abbaf6a0decdd2ec1419eb21a4517d610ce272322781c5f399ec5",9.317957166392093],[1677,"6e974dc4cf860db4e8f411bc1e8ec518174088e4f1cb436559aafa5a442d10f5",9.917710196779964],[11960,"3ef2ea60548b09d98be53da3a31d4b96a1599188e9d22efcff1e06f8f98398b1",9.317957166392093],[10833,"bad24e30d687705250dc1b35f64226fac6f9ec3d7a02d5dfab7e524dca561ab9",9.917710196779964],[11398,"209cd03660e01ecd038fdbcc2b30375d7034a37748b98060dc117ad7db715bb5",9.317957166392093],[7326,"928171a803b136a33437708f23d0d59b8e21f65c87379500f363b6922827e6cf",9.917710196779964],[15094,"92a75c449b5e0d3cb6a359ae23f02e284da4aaed35cc85040aedcc28e860cc7c",9.317957166392093],[7651,"d4894ced9aee700c42db393057ae9192107e2094d5d326d81b29a1b2e6d4e0cd",9.917710196779964],[13066,"c7c68b7177177e124d0f314340d302d4a471668056e49b564270f56e486433aa",9.917710196779964],[3994,"490ebd0e1a5a79ef04c20a336fad82a588ef85459e9d2d079b3179f85dd5c3e5",9.317957166392093],[12280,"c8f47fac435e7aabbf2a8f5767e0720704814938d9ec9e1280bef1961cd269af",9.917710196779964],[6589,"4ff3f32fbd8610ed9c9d9723c314cd43726efd5c25c46215f80891984a0ab9d4",9.917710196779964],[9859,"6e094af8676fe702c014a20bee29b73c207ff5e5b0eda49e95a18ab3a1d836bf",9.917710196779964],[12026,"18ceacb5c149db30e26c28532ac5beac9dd1618ad2195d98f2f49055169825b1",9.38219895287958],[10975,"3c95767a13e02d6d8e81bba6bb7432fd5e79deb9ace4bec13ea672c43cbd30b8",9.917710196779964],[30,"d4638f4e91d589c7c2c00bc274bba39198e57b0ea83e50b5556e773c3b7bddff",9.917710196779964],[10775,"fd390d37d8ed065960191a021087722bcae064a5ee58c30f1a62a97523b875b9",9.317957166392093],[10656,"62b426c27a1e46c905161c33d0860e13ba76c6a9f80f14e47bdb94b2cc7951ba",9.317957166392093],[16683,"33127bf8fe07ab95eb484b2911d726ea38a534b69e48ad15b10612096c34f258",9.317957166392093],[5116,"7254e4a20f748765d22e6f713143c59e3268517831165e28f277b0f9ea567ade",9.917710196779964],[8274,"75aa7060024ab0a995497cbc5652bfeb80f06559b7d9964a3efb180eab1681c9",9.917710196779964],[16458,"c995f588b2e6d572644d8d26a42509bf6d828b3431849a0543361ed01e93105e",9.317957166392093],[1250,"865b72d368c9eff0ccb5f73c202edbe9526cad18092f5cf50cf0bd7a1cc9b0f7",9.317957166392093],[3989,"8a567f6a0c329d0140d0f4384334a44ad46258fcb98cd9a3459e32bd9113c7e5",9.317957166392093],[12487,"95f52388a9788ee5fe631ef88853d9b5054f690fd587e681d1531df0b40306ae",9.917710196779964],[7192,"4a969af6c13e34b8391537c5aebccd2f04c76f9c270bdfd2b54d809ea930c2d0",9.917710196779964],[6519,"c26627c9aacfa5996a8e1c3edcddf42cbed48b4d4ee49e24bda969fb879947d5",9.317957166392093],[6734,"f1575a1a3272d413e31849b16deadf48163aa42bbbd72886337af550ac8db7d3",9.917710196779964],[11192,"96f7e8109314594135442a77c021bb3f53397c8a464899e267933126e794b7b6",9.917710196779964],[4590,"b08d9a58d7bcdff2ac34f7b809292eddc9c98121b0c52083400a25d9c503a8e1",9.917710196779964],[4751,"499b1d8729afe737f39d29ef36a4ca347315ada22eb90ebb4d7a49d02f80a3e0",9.917710196779964],[18695,"c86592890c3d4dcffd56146542b9923b935165a6212a518743669ad71ba2942a",9.317957166392093],[16890,"5974935e5b84360de5cfbb0a348379744cdccd71be0a40237b1408c7da0a7a54",9.317957166392093],[10240,"65f8da314d9e4cd0148c4ab9bd7dc9ffceed8d9548a2964e0311f31f0705c1bc",9.917710196779964],[18916,"9d5c22e178c49f3a1c0c0a3590f20554e4075be12a1269209d27ee605e7ae022",9.317957166392093],[13211,"bf7065d708f4ced48f1cf3e7146336591029a1427880e2664ec5d80bcc04b3a6",285.204991087344],[13445,"47e1ed885ab2d96f8f6d9656ff4b5049072b550d57c6e3817fe76717d00b20a1",9.317957166392093],[13088,"f49be480065e0b6de4f77da95cc10117e9e7feef1ce86bb5f3f8b9029a1dc1a9",9.317957166392093],[4214,"58c7b81bb2cb7d492087852be3f768a4f508ec416fd058437a373bc097dc5ae4",9.317957166392093],[8865,"d590a5389ac2995e23625448c04c6f20da915b01c48b5a7bc19ed12905aea6c5",9.917710196779964],[13906,"957940cacf72f81ef4a8d76c3bcf9940146d980a0ecee2845807d5012026e296",9.317957166392093],[3147,"f813b48ec93584102739605b94dfe6105e697a3d2d5114a66eca9deb7d375feb",9.917710196779964],[17360,"51c0abcea17310ce0ebcac07e11930593aa9e9450af66f4507a97218f189ac4a",9.317957166392093],[17523,"07f02ccaeb218e7bd3e3a0daf51d45024b7eb33ba41bbea8a785526d14ba1247",9.317957166392093],[10013,"dbad921aefd7f7a27986845dd8d83cc14440abbe0ec1aacb3a6dd0eba25c3fbe",9.917710196779964],[3260,"084940d0b88875a99720938d8b8fee2b2304599c513c95b075e179814c8c9cea",9.317957166392093],[17549,"d1ae4533bd7ae7c4151e08406e10a623b8a6f3c66df8fb67f8fadb650a967a46",9.317957166392093],[8953,"6fe6fb15d07b66f59e99079cd3425b8425b02b3c13102cac70e7deecea1b1bc5",9.917710196779964],[704,"682e17aa3446208897fcf358c2d4f83ed41ce57d24440fc6873960ca50d033fb",9.917710196779964],[9839,"1ba80cf2d29cb3aa69011472a44c700e3e8a83edae02cdc9bf9e3663236b5ebf",9.917710196779964],[1899,"b7536afbf61cb3b45d6612b4d83c105d67bb88f35c662e4cc34200222a6aa0f3",9.317957166392093],[13834,"0c8a51713df4d0705e5a91f3a45dc83f83bc0c1df0a18db60d7466218af19898",9.317957166392093],[14166,"ae22d6b1dd1f857167fae978caf945e18ce171f4f1978438cb87afdc5fc31b91",9.317957166392093],[15997,"54dc02aa0b2eb5ccc23043c97871704a79a7cb3c6ad39675a40406df93c39068",9.317957166392093],[6083,"3716eb9983eca80e7dc1b46342e88323d183428c4ef4c01030950070c5d67ed8",10.052724077328646],[11517,"81d405472389589c68ad386346accf0d7c20119f0c4b33fa061957153fe769b4",9.917710196779964],[590,"28ff7dbc39836c573dd944eebe667570f5017a3b7d6a68bba1492cc0fdc4f8fb",9.917710196779964],[6597,"008a60e0be567fcb924cbf404719101c364548932ad24ae700578260054cacd4",9.917710196779964],[5206,"e25f17a145c763793f2d04006c0105fc6d3ee6757eb509c9758fbe779143f5dd",9.917710196779964],[7504,"6d7501bb5521921ae84a4dbfa0505d871d57bbea47d9f10a860182efe808bbce",9.317957166392093],[18808,"9373c3c9c30a2d555a7f384a197d5845991fff82d8832f66906639db98cc6626",9.317957166392093],[1142,"333bd76bc6a9eddf39f0404a684910fb47d788942f2ae72d7e9465dcadc05af8",9.917710196779964],[14895,"6e6a10110138e946419556ac457f0d6c305b320fc92a7b393a4fb37f3fd9f080",9.317957166392093],[1094,"c86063e0469123991bab8bde21b93bff1f0075220ba8db98ad9e70b9068b99f8",9.317957166392093],[14914,"7754f6f6037fb3c104488fd8b01d6bdf0a4b48e5901df1df67185dc9c60aaa80",9.317957166392093],[478,"cc18a15b0f4c2a30858d83c2ec83444f97dfae5c801fa1371d6f815f8e1accfc",9.917710196779964],[883,"7db845b5ee4425567a9ad3c5ab1cd1f04c60025eb15d2333feeeb4894bab00fa",9.317957166392093],[4576,"c1581727839de6ed654ddc69005ac8163a624b7c5704e8fc2cd3df6e419cc4e1",9.317957166392093],[3063,"a16bec999adf92118061220f92a81995fd2a2115e91667359091a6319286e4eb",9.317957166392093],[4747,"52156ad02a98b4b8e5ac2da4876dbf65cca7a99149a18586d2b71641b869a9e0",9.917710196779964],[15686,"a393544818185b21a68e381fdf7cdd155d3dc87e092447ab70d29eb20e7bb56f",16.34954954954955],[771,"93dbfc340adaf8b443596c90a79d218273a8e1bf88347cebcf91f4a2a3d3bcfa",9.917710196779964],[17638,"40ad218a88a537342e6c701534c62b0ecc2fd4e2cf38d4fbb8733589f5756d44",9.317957166392093],[15542,"096bb7eff9cc1634383dc4e0449344b87795a831f0eb076ac204e13660812873",9.317957166392093],[1767,"5ce2a67f2b7a699967e45fb39be3a7873b6000124980c720a0bac7dd95797cf4",9.917710196779964],[17304,"44d8d49d8883bd322eb11b99be2b9229224f7c8e8e4969d9031d4cfb3a55e64b",25],[1954,"1a06b39a259782be11e7a6390d38b6b532f7db4f66a43d0f2f3da1379dbd54f3",9.917710196779964],[16551,"b0fa3afaff7c3771a00c70d5739a4509b8df51091e9baaa34ac1ddb1810bfc5b",9.317957166392093],[15365,"59aa67521888e47eb88ccd781334ad7016140e262295093e100ccc5047940577",10.052724077328646],[7835,"b394b038fd4feca6b28a551d07f5654c765d32f5fb61db68ea4955bb76d891cc",9.917710196779964],[2267,"3e80cb317effde62b5c542e1bfa79742369da259818819a82f971022f58b2af1",9.917710196779964],[2300,"3e870530d583c8e1934a0d78196abd4d15a272226d1cd623cb1e159482a803f1",9.917710196779964],[9540,"0a6c1748653967c183b01f8fc4627a6f9fc3aafd06bd54c81a9de0e8215c73c1",9.917710196779964],[1761,"ce76ba0e732ffe2d300370d6729ef3997bc8dc25b42d7867a68f14120a8989f4",9.317957166392093],[12595,"15827aba90ee189f7bac889061f4be3e4e2fa5d39bd908b48390ceb5301d4bad",9.917710196779964],[5573,"78aefe3c889e622c8dc4672d70c5bff2cb7df78d49cb4b2625fca8ec4fcac8db",9.917710196779964],[19688,"b3ed5295f718964a9addd97c5a235e08e4dd9fd0e6c1e21dc58068c0f93f2007",9.317957166392093],[2057,"1ef666560c2b78ce378f925609b69dc4839f73a347fa580e68b6450056fc8ef2",9.917710196779964],[14825,"9291ae4639d91d3784d96bf2c68ef72c3043691e53072925bcd728d6cb095582",9.647446457990116],[17488,"d3f88406a82377ce4bf232948e327098265f09c2f9585e833bc39c956d7ddf47",9.317957166392093],[1120,"9f977ac8ffed74144fc4627624a78059a95528a6367e9125b1015080f50579f8",9.917710196779964],[356,"5168ff84d1a76c29bd2c8696bfd25c41a984e5760c12b10c32935a938433b5fd",9.917710196779964],[9803,"c6fb2c319847a3990cfa939d564981bef458e220ded800d54d0847ccfb249dbf",9.917710196779964],[767,"e295f5675da699b37edb464f2e9c74bd643041e89a695f77bfe470ae75d9c0fa",9.917710196779964],[730,"dde5414b69bf7684adf44beac41cfdf7df917a9d24f8e56c6a7e498f0fea04fb",9.917710196779964],[19787,"eef7a9bfaeb42e3342c11c3589c84ab5b42aaa293656d112901f526defef1503",21.755752212389382],[17524,"91ac51ebf35180d88649d6ba7303c130d1e69484ea70b33c3b9ee9a21e520b47",10.052724077328646],[14973,"0ea5b9d88b3f5bb2cfa811742e67ce7c268af928c8da717270f402a959311f7f",9.317957166392093],[10735,"34db6260ec4872d67c2f3d4d8aad9f5d8c5fc6c0519a446705ba52524249c4b9",9.917710196779964],[10293,"bb5370bff3eb2e372fb65dfb355b972ba1f05d0d3136363bf98572827c6e69bc",9.317957166392093],[1729,"af9f1bfc4d2a9560271d5b1e29be733483b69937faf1bc4be7a4941703e1bbf4",10.052724077328646],[5511,"e6b002b09156814f3e0c74e89096d2cc550f5d280cf83a0f527926cb950528dc",9.917710196779964],[16858,"ac52468e78198c99f1e8fa5aad42e0fb5e8919332dcafb93d15a3dc414012655",9.317957166392093],[5446,"3d45e106ca1fb4f65b2fd059871f40a9ea22bb6aa4a5983e6112d869998180dc",9.917710196779964],[2672,"03900310c6eac854ba8f041984c892c6e0c247a767f35690a155d86406e8adee",9.317957166392093],[13520,"1c374846abf67c1bbd07db4dfa50e4e17a9f03323e3820960f3ac1a7d784629f",9.317957166392093],[18550,"862d4a643ad9522ccfdc659cb34ed8557daeefa3ceabe356bddc875214837330",9.317957166392093],[6747,"1a77a3699df72c486e306948c0a037c5fc2507cdc73bcc75eaa1ce8f034e98d3",9.317957166392093],[9126,"e852588d8497fe36976e712d8ca2adbb3b8be0109c89ce80053d1ee5ecdbfdc3",9.917710196779964],[17562,"3355f60f79989c5e109676687c26784b428a93e391975ea683e78fc47a605446",25.968141592920354],[6414,"a81ce99ca13fd91d06d4f8beccd62f748d9f35323241db6bc41530daad603dd6",9.917710196779964],[14705,"8176feefa38a1ead05ce556c19d67d62e4caa8dfc637c4b4d4ca74419307cb84",9.317957166392093],[9191,"fdcf65298546fb8366b28189ee9e511aa0c1e4fb7b87c80c0503e0ecfeb787c3",9.317957166392093],[3511,"69d8713a0cb56c90f550f1ffbc9da974c2def314b453a78adc94ab187e4feae8",9.317957166392093],[16439,"8c3b9564f3c73b100f6be8e1c7b5feeb3bd2e0e4889c82120381f6f9ac59605e",9.317957166392093],[10896,"ea82b8d219d8d4ff4570eff0b5b1771944fa05b48d325c5575afa6e3c662b1b8",9.917710196779964],[12424,"aae9de1f8c110853a055c220ad79b1c2503b111e62c3fb3158e864ee0cd969ae",9.917710196779964],[11100,"3a39dc951a996683ac7b1c5b832891972f99992f99e3ec9264e23023e3b33eb7",9.917710196779964],[12819,"b1cb042d9ba894d6ccb42c4dc2d28009763d62ebfbd746fc13ba2e5f6e96d5ab",9.917710196779964],[2121,"415e6fccb00463dd6f2feea77cb5006a38999fef26b173248e0180252e7f1cf2",9.317957166392093],[19573,"d53e9fcbb141f4043c557978407e381caddb23841898971d15f647ff356f7e0b",9.317957166392093],[4276,"337991551c1b07a885040c8909d411c4dfbd12034215a1fd5652360a5b98eae3",9.317957166392093],[6643,"b9e4dda4dcc7ce06189bbf9fc43d4415ba2b2bcda400108d3bbfdadb8c505ed4",9.317957166392093],[10967,"5b3dbacd802cc38b6f22cc5f9ec4a51683ee1a2d908940c92ad377ade00e3cb8",9.917710196779964],[7350,"f210198e06e77c5e96b35e1522a69222573a4c1bde2e76ddd552dfb80086b1cf",9.917710196779964],[11445,"b3e97e54b989cd3806893f042156e8f8620f0cd51a248d5671dd58163d02fbb4",9.917710196779964],[12591,"245aad3e9a15620fd4576fe777c2b843803214d5ed09674f60f472edcab94fad",9.917710196779964],[12813,"1fd85b739c308bf6b6567ce87b64838434b3ba1aef99d72075a791e0f30bddab",9.317957166392093],[5737,"0c15bf03a0b9cb99d722693f3153bb991aaa1fe2d0725824f2a32dfd7fa1d6da",9.917710196779964],[2175,"c809c60648a56ccdd74bbe3471a7c52df3c1c09f8e50a9cf0d070150ea2ec2f1",9.917710196779964],[12059,"26bc39c6dd54605f661c98418a236c7a06f2f3f87d5fb5d387f9ccb0a41cf0b0",9.917710196779964],[7819,"363c43ccb4b93ed60a2c400087847d674ce43954cc9d485b308c9b079b56a5cc",9.917710196779964],[11094,"f45150830af553bb4d5ec3820647582a02593eeb00ba48b30cf992c8e36d49b7",9.917710196779964],[6975,"c620a4aab8d6ffddec5ba117fa0eebfbdd928687a32cb2f5f5d74761d9ad21d2",9.917710196779964],[16846,"c7459fcd778cf1eeeeb7d875cee56b328f7938c17378bd806c55a0e54fea5555",37.05555555555556],[10302,"e20c3b54d59a94a3ebb8fa3dc07153a7916e66b85c91ee03ca469832e86f5ebc",9.917710196779964],[8249,"bc6c765d6f8e8f68961938d05eb8219322b49547336cef2fb328d09d0af1a7c9",9.317957166392093],[13309,"69deb11622500796204a2b69d1d5b9b5ddd8e6d750617c5e6473d3c07d4a70a4",202.50480769230768],[2014,"8050636f12c083d4a7ae3faa1c8bafc00fb5eecdc52799ec5ff77445c42beef2",9.651245551601424],[14213,"21110b58dfe9ad767d737f990cc484daf8beb5ed028cacd9032025c776efce8f",48.19223659889094],[7949,"f9e7967bb6f222deb6b38bb9f1904a01537f134cb49e5a6148fccc1d119edfcb",9.317957166392093],[10722,"15b549752316a92b816d324421b23a5d75ad068e2a4b8c3009e5c37ec7b4dcb9",9.917710196779964],[13279,"faa0aec5144cc1c85534894e7071db34da639f933c140ab253ea5f66217306a5",9.317957166392093],[18570,"7e1d3a7743835d5d463a8d3fa055b1dc10d3bff28869788b8876171612bbcd2f",15.073170731707316],[9166,"438c7c8d203bf5374c662b9fabee713bb669c05f343d114d7e072e744d56bac3",9.317957166392093],[10716,"abb9f2a65df0390cc1f69657e76f54b18b72927dfebf1a4bbd4bbf1bb59de8b9",9.917710196779964],[9108,"2ede2c365e697dbbabe738212edab7344b095fd0de3eb3049e563e41498b19c4",9.917710196779964],[10541,"4cc68b0feb511f973569fdb066f1a4b5e59dca01ff1b2723a06ff6f3ba2cf3ba",9.917710196779964],[10170,"ecddb2b7a0afabc57ce6987b4cf4437fa6eeff806e3fc4b21d9b07ffce694bbd",9.917710196779964],[4309,"1f2c0b0ff27a68f58d61882ddd0abd8e366f62357f9c6f7717da03b237a0b4e3",9.317957166392093],[5275,"3d3b5d4ee28e5c888a8082f4267cc50d1b3a7b9455c2ccea5d72cd7c55618bdd",10.028818443804035],[4841,"bf3415afdbfa966c90379930d19ca2476a7a92d3324912331bfae54922592ee0",9.917710196779964],[597,"251aa1170cba7a320d809a0698b1a936144f25c58950a12ee17d84b281dbeffb",9.917710196779964],[3111,"38fcf5948aeac0e9218d19af93235278dad9274103d0f788c6b9529c465698eb",9.917710196779964],[15891,"384f82e9589605b4fc894b7fee6bbea7da5f72ab1eef7df304d8626efadb336b",9.317957166392093],[12365,"401c930b6e8b8c120d99b5b086f0efbe241e047b6202c5aae9e11273f897d3ae",9.317957166392093],[10555,"4cb580c8e4294cedfb7a495570a32585d1d0db842043343fd674debe8b5ae7ba",9.917710196779964],[3169,"4fb321ade50e8a14b8d1c0d6f75fda5d9eb3bc4c7066b4ecacf5b51aa68d3ceb",9.917710196779964],[18937,"b08c86cca7fcba9b6ccbb5c6f437912cb6ae29c61f984d8238c7083eb5c17722",17.052325581395348],[19592,"bcf2ae0b354f3e246c14fbcd26ad5f0c90c72a133bed6368bd49a0a85804720a",9.317957166392093],[10584,"e9afc73b666fb60b96ef5319d075f6541983743983c40307e9d19a23b7e5b7ba",27.90088495575221],[13937,"455ada42621cbfdbe9e7c1e1481e7b40813c8f05866b11c9ac2057aee3d93996",9.317957166392093],[7537,"175e3a52625267420747ce0fefaf885bb7bf85f949fa6527cd4098ead1ca95ce",9.917710196779964],[6704,"dab614144a540fa9df6451defc4316aa6f9c24ec349ae22b1c138ba941f2f0d3",9.917710196779964],[18520,"3e70a67adf2f5e22513958d3cd1f8d3edb31d30cc6ff8965ba08e2e2c5be0731",9.647446457990116],[8141,"1e7f5d9f955d018a453ad145715ef5c254b0912613a9b96337b79a3ce42a6cca",9.917710196779964],[16636,"736618bf9b18b85f20ca281d01224a48323bef00bedab48d8d002f973d9f1b5a",9.317957166392093],[1577,"b1c8d454964d8c00c01c38181e4c2c8c59db843b7d8d79a8a31adefca982a9f5",9.917710196779964],[12126,"d1d54d594247f9097bac9a4fd5c8ab271df550c94d77893f8755845a9c9282b0",9.917710196779964],[18757,"4f8c9bd11be96a5f5f3a2af485d948bedf2524be68e519d805374b1c8a544a28",9.317957166392093],[8283,"bfc2f6b28a91f45c3354b9f4fd7ffd9c279749e49d4fcc15775e7b9e2a2e74c9",9.917710196779964],[4465,"e18d5416287b5621bf7b4d9dcd4e498523f1e47169fb62062c7ce9adb0dea3e2",9.917710196779964],[11373,"1646633dfd2ed1136dea85e73bac57aa8f0ba09b32efeaa040a3deb1930b90b5",9.917710196779964],[10085,"d7e24a4be39fb62afc829bb8c679872faf73287fdd7056941ca952800933cebd",9.917710196779964],[15775,"ec83f348e35d7779f7f3aef3259a3e521ffa838678b9ce75aee563be4f43d56d",9.317957166392093],[12061,"dcf4dfd7feb207a300abf10cdd68caf3b1186dbba19a6b98187158f42d57efb0",9.917710196779964],[14947,"80f2bd92bc6ebdcce3848e6a4d7e2f2f798f9502a0b1fd2532414aa438f0e47f",10.052724077328646],[18611,"bb6f7e9a4a7c52620a6c2d6948aa5acfa8bd12cbc4ab1f66e5019be3a9dd532e",9.317957166392093],[8414,"4b65a8ebd5793e36abc91e974c9f073f9474bcfa8a204f9dfefb8016a2f487c8",9.917710196779964],[14,"b0efdee4b619df38594c90d4a5859c371d8dec9bb935dab1051d8fe49565efff",9.917710196779964],[9225,"b362f732098c29ed9e6971e61300d9e6f02d60e30de3c93304067040462952c3",9.917710196779964],[3652,"feeda3df71143ffbaf004b0ddcfccd36bb1a1860a167ac51215ac0b5462deee7",9.917710196779964],[922,"a9dff7053b8174c69c56c531f67b866c9da5feebd009639987335c71f9b4acf9",9.317957166392093],[19850,"76ef0f3752353c97f50f93431ba4cbcd6d129164b3c21f7764b57e99f52bd300",9.317957166392093],[442,"c325403096eddd362da871f93fac827b15528e40d25edcd6fdef9e6715d819fd",9.647446457990116],[15378,"2a599552c1318f7c7f88f9d6506760f15c94ca51e9c678ae51dbf228316fd976",9.317957166392093],[18452,"d675147dc4eccbb8fc15dfd832c2830275be350cc413d7a4fb2bf03773cd8432",10.045662100456621],[8625,"a7a3e9758c82294a92368547320656cf6da79c5b764275975569c08e1d6d45c7",9.317957166392093],[8895,"5ae9db075b56a4bd21e4213fd745c3e5990fddff2ec5d11beea2281e93f175c5",9.917710196779964],[2749,"b7c40e8ae03a3ad3bc032415c3d53e5676f232b800f2387236251e42da861dee",9.317957166392093],[1713,"9a697a67b5de45562575e1b0314185dd0a87b6fdb927503cf572dc9c0310d6f4",9.917710196779964],[13583,"66e801a7afcf9c9730bad3d41ceaecc25c45a4d83b22966e1f0280c8b199d39d",14.188948306595366],[18411,"84f802b179c1bdb87bab74e92ff7126283c3d59fed3b9b5dd54c9f142cf43f33",9.317957166392093],[6289,"4d627db784c2f526d18dcd4a8d2610b26d244d888f3aa6e74ff253544c211ed7",9.917710196779964],[17659,"1d9baf97ce03412876e43f8179870ca9fc52637812e981228e45ffa4bc3cf643",22.68018018018018],[11669,"572577025588721bf0f659cfbf97a54e898f7cd4a6b7624c415d0f16b0d378b3",9.917710196779964],[11949,"49517bd50943b490d74ffe1ebe51a9f318911e8965c129a4947e059eb8d6a6b1",9.917710196779964],[17878,"55d410bd3c64a6448e63d7d5f334806cfcf3640e42de1b8cc7e0047ef199b33f",9.317957166392093],[15529,"f1c5b712e2965511761ffdcb3365f6dfcefca1b527c5c02d7e40732649ca5f73",27.151515151515152],[13053,"d9f699c05be07c3b29e80e2184bcec1bd6bd3aa3bcf8312e3339b7bed5d642aa",9.917710196779964],[17350,"e8f98e86fd4183c78ff32b17cc52408a258f0bfe547f5dfa16b1048c6cf6dc4a",10.052724077328646],[6872,"86d3902ca781fbfd91e7a3ee46651c54b654d1367ad18411697b88578a1eccd2",9.917710196779964],[12700,"7521b75af4f94a02ed76be2e86d0dbc16a18ba28f5d43d2bd04707c74bfb98ac",9.917710196779964],[6651,"e19ea4ce8f7d49c23b03cdb04a666ee8da43584a90852d9afb172de4c9864ed4",9.917710196779964],[3015,"ee1cd8123f3a5fffecf6571a6fd2ccae1a4165ad08bba2631d394b9106cf30ec",9.917710196779964],[16451,"af4bd5c5aca8c89786958cef3216d9b28f9f30af0bbb88962cd66172cc1c355e",9.317957166392093],[9818,"4d8c13592aa013bf09ed40646c407c2d42dcc941fbfdabc26125be7963d485bf",9.917710196779964],[3437,"29d3688e81e9e198f642e7ef399fd526716740e813894036ed389a5db3fa72e9",9.917710196779964],[2855,"e562872aa7c748aed6e1c5984cc0c7fa5c8ca2fd57dc97309c4daaa67d7c58ed",9.917710196779964],[11782,"e5ac028a15c191a91ea2274ff7bc673f0c911e7c21094b204cda209687e2d1b2",9.317957166392093],[7953,"6ef793485a579af07f3de01dccffc2970dc71c1663f49a57b9cf7003058cddcb",9.317957166392093],[12615,"ee487361840950b3b38827ce5085a9bfe98e98411bda3c36a3a21c50168026ad",9.317957166392093],[19232,"98072925340b43a126cd5afcbe676357e9b2528bf4f5cbce299821a012518a17",9.317957166392093],[14757,"6a34bf9ddd09e6bdac547e5016e4744e04689fc449a317d52b461e5699d2c683",9.317957166392093],[18449,"eebddb8ad9eefbc6fa33e1b548cbf540042f3196af600b47a219f8461f5ca832",22.49469964664311],[10466,"4ac612c36c9b370d9b3e97bbb0a93ac94174004bde0f8829295324b96a5154bb",9.317957166392093],[15476,"28a41bbfbc6bef8c74a2313852a75e845be395870192f86b3946edad46c08e74",31.05545617173524],[4628,"8af238eff237a513d868d033b6887b2c7d69a15bffc5f43dcdb75724b0d772e1",9.917710196779964],[708,"e0a2a93d2a637d66a4086a4cdd9c4230c1a62f9692c99a346c83f442a1452dfb",9.317957166392093],[1862,"7b95efce102eaab95fcd561a2418ddd6e36a1c3962c03ec033087d50223ad8f3",9.917710196779964],[15328,"788d7bd016833df03f7e50f2ac01d73c85088122bfe9c5fe24b148335515cd77",18.411953041622198],[13724,"f5d0033d77813ae228469430b1e32c51615670a3eb4d0e0d01155ee1e2fbe69a",9.497326203208557],[8236,"fbcc4689fa3a5f01d1c8f074e95b499699dd805037d9d5fe0fc728400e18bac9",9.317957166392093],[10260,"490d9e8ee6affb9a56047734a5731f4e7f64370f67f1cb4efa5b591e16dfa4bc",9.317957166392093],[11610,"600463d9cf2ab78c0b1a7eef60e76b02d358f60dd4e5d50d209eb1bb97c2d5b3",9.917710196779964],[8386,"424bfea7e8d0825362f8f5b04a093fb09057e28fce16a2d46fa60203e03db6c8",9.917710196779964],[5658,"feb55d47e41e422022125e8593800d3cfb27d0236ff743f9a36487ddae3846db",9.917710196779964],[8288,"62a26662c8ce16639b5bf913107697770afeb783d18f7447b6e106bd95ef65c9",9.917710196779964],[15338,"2cc94099c3354b229041c213bcc34a975f1656a741901d0bb55431531cac9e77",9.317957166392093],[12890,"cfa28fa99e983ef061fdcd03aaae913e66dab8bae25bf16b8a6a98d3e7c157ab",9.917710196779964],[8190,"6abc2312bc5d287a7779a53ef5786a7e66af6263f819ddfa1f1f85311f940eca",9.917710196779964],[19802,"ef64016127005700adcc793653d6bb002f15804675c73f03bd43e4e0288d6d02",9.317957166392093],[12907,"171dd6b460c96b0bef20a125d4c49451844248b89fc7d836575521431ec244ab",9.917710196779964],[3587,"81bc26ba6b82f9ec9c9728cba4316144ddebb30231d53f45214494952bc162e8",9.917710196779964],[8646,"5ba0591145897cf6a125af44d12bdee974d75ba3ed66832e40ef081223e313c7",9.917710196779964],[2394,"31f58510aef0f73ed26794a86851b48a49b6aa53d67ffaf7a1cee7cb2a9e83f0",9.317957166392093],[636,"089b2fb485d447d614d03a99c7e96702f785259636a5b37bf9ec765a8ec0aafb",9.917710196779964],[768,"0cd10ec18bffcf70693630f9e9924370057026838009ae921b159c3fa997c0fa",9.917710196779964],[16812,"0db20bbafb0d344e7464a2eaea8e96d4b8869b3e46f58360bc0a5d59b6890756",9.647446457990116],[17989,"6f361a8fbb03aa9c85e7193ef289e5bb08d93836fa26fee7170af88ab983653d",9.317957166392093],[6277,"3f0b579681caa43124de40c4ebf218cf9f11aae0ac2df908eff73f5545403cd7",9.917710196779964],[13521,"3cff03f8114c15838b4844dcaddc2eea476429e4f4542ff016957bd5a362629f",9.317957166392093],[4726,"83161eb94e18135d5a7f39c5c78cac269ebd125e3cf1aa8441847e64afaddce0",9.317957166392093],[19224,"cba59bdd2513de0cd9698cacbdb8477a9bfb32f5d0913bd6a19a160a883cd617",16.91103202846975],[4484,"e3ce0c62eb27fffad5ae9bb91638d669a1beaa8147b6b9a481c0452b9fee84e2",14],[4759,"ad622ebf7d56763eb29f2672cdc0a2daa2e963caf0420548905bc18f504d93e0",9.317957166392093],[11385,"5e86c763eb78d4af77939b3f247f6bfe0088f9323cf7af51a5d845a5bcea7bb5",9.317957166392093],[17466,"ad541adb84f08b10f9b98351ac5c7e38d10edd3e4d28aac82bbc94942b107548",9.317957166392093],[10989,"a17260a45e944d16150506c3e9536e4b4b6f769e165e427c095ff7fbeffd10b8",9.917710196779964],[7171,"18cc1c86352c0b4c6657fe6b6d73c823dcb6859e241eee40b130324c4df5e1d0",9.917710196779964],[6871,"d893a5d02169946d4e1a0d5198641ddadd0f8468bebe59b9ec0f55be5068ced2",9.317957166392093],[817,"0a0a8101123d97ba901e002494518e32b94261e485bef7f08d5963a58fda6efa",9.917710196779964],[12194,"3b9e37700be4354c469637b6ad3a9a4636e5c97271aeb0641f183b37b9ed16b0",9.917710196779964],[11232,"7626a5956931717cee57a25363f9fbbfcf941d472491f08a9b1364f5c04c79b6",9.917710196779964],[6090,"3252be214f85d27038ec219c3cb28c29a6362cbf1f642fc0c3bafe2378b571d8",9.917710196779964],[5639,"524b982db9f75c115d0cc40a37572b897f3f1fef0a198dc05ca4b3639dee65db",9.917710196779964],[7983,"c9f73771654bb6a249be8977aacbdb81d39190b721b48b6d965f8c125f66a1cb",9.917710196779964],[5795,"1c3acd35cac513bb65bf8ae5179378ca8edd655382a74c4f5cd38fb5275177da",9.917710196779964],[18495,"32c05862ad8b146a5f63898d985d834c9825248c2ee2dd78d40e5a62cdda8131",9.317957166392093],[1322,"ab2ce3313720126b4a5f7aae46e720561c2c8933be893b86bdc4e254132644f7",10.052724077328646],[19711,"5fa5347dda21ff955b4f15e6baa7a56b789f1fcc5c58244c7118f57132bb6706",9.997888067581837],[17137,"08dabf333cc2930c1fd66f6829d53862514c1b35a540a87f1a50f79a2b9d564f",9.317957166392093],[16005,"6c2157956ffa8fcf0a4e65e0d20e82194b1be8509ccea85fe544347f09435d68",9.317957166392093],[14637,"93b28de983c368f77b1c527e4e0912d7906987582c68e416a4aa3d2e2d003886",10.052724077328646],[564,"08795419a559298bdc9f11ef1b99fd3b87613012a06af6c181809205ff5a2ffc",9.917710196779964],[3021,"4914b8cde2a8f03eee27eed1d9ada7548266b4b9f483a08f870cb8fe0f7620ec",9.917710196779964],[15437,"de9bfd51e4c48f3ae199c994d91339b71c8ba5fc2963f4e1d3bacf8d932d6d75",9.317957166392093],[19337,"f81dfaeee671214b4f79e214e75c08c4ce76d1737bc6f43f034dd2fd4ae5f113",10.052724077328646],[8371,"6d4f2bb462613f17a831fbab28b71b156e8960410448c20f4feac5fae1ebcfc8",9.917710196779964],[12016,"0ea37fc9e31d8661bab4be8e6fbbdfcb63f558acac00f264d8e46e4d8b893ab1",9.917710196779964],[226,"0117c987dd35bf1e89b75d5de01ac0ff49eabc6597a94c41a8fca2897cd877fe",9.917710196779964],[4613,"f146a5b174c60bebe28125a960a80e7431a62fa4d2c0b9bba32ad4738b188ce1",9.917710196779964],[11528,"dcf5514ed61c3c00c167ad948eb65311bdfe62a9dade907bb69ae364ee7a5ab4",9.317957166392093],[14817,"adc5c4d2e1f39b1e90f7421b78bf7af4fe8b3a441633248c0658b77958fa7382",9.317957166392093],[14520,"b3dbe2fbb4e5cf17864a0e0e37076d6faef3e57ec946fd40248028178863c988",9.317957166392093],[16385,"101720280a77f79e6756cd95ccae774756e0c25351f4938dd8a6d0b79348695f",9.317957166392093],[19225,"d9ac8804909e3c141c31ed8a1bb2bb9de7090ff20e611849ad21d57c04fdd217",9.981900452488688],[3195,"86427a44fd7acc0e5ce6322176d08aa83d2f2c8d2f6b7a510034097c938714eb",9.917710196779964],[3892,"005ba369e19686db25720fa4ac635b75cfa15dcb24a458013b25d30c65e164e6",9.917710196779964],[11768,"ba62262dce09a4f573aa6dd9c525e48d80fe8e39a790c24dbe4a2a6219f1e5b2",9.917710196779964],[12181,"c117742ad06c956d478b7f36fdee79a87228fbd210183e7d880c4bee7d0b32b0",25.950738916256157],[881,"d2ca47e000594ceeed4e9eba4b1e4a5a39c2eef3d2e56bebf95baa53ecef04fa",9.917710196779964],[6225,"ce77ca6ef905fa94509227dc25d445067924321190cb51cfd7a0be98f76494d7",9.917710196779964],[8922,"d2c098bebf18436f56385136b48fed2586553e58e01a31e81ccb7ed9297859c5",9.317957166392093],[2764,"3b4f922845b1f25c3a586fe3523ccd4c832dd2a90d2e5a4bb1244dfe1e31ffed",9.917710196779964],[10978,"4efaa0d0b2b9739fb7249629e650478048620f6e03bdc3996b4e32ed42f52db8",9.917710196779964],[3650,"01f9e02f912577005d67a9cdbea8b867834c69746da71a8e204159bd64f5f5e7",9.917710196779964],[5998,"a9c9a0131f3486767882329f68646810dde7cda3c5fc12efedbe2b53145d14d9",15.971479500891265],[6286,"a018c735fd63dbd0baafdabede391aefe1c9fad6cc84f0a4baedc601e78129d7",9.317957166392093],[1308,"a4f71645af0e7378025fa0964cbeda666a5c6e475b65d740f087710fc91c57f7",9.917710196779964],[6692,"8301b52eb5c328d6bc35ca9139f0ed30354e0f979de999c02e64d47ef65802d4",9.917710196779964],[12248,"a1e8832b8cfe01e6502f7f735a8f2fc77536bd87e2d7f65ca6e0574cbdc7b4af",9.917710196779964],[7716,"57f1c9d768499aeb2af2a5be3d788b24dd78e2164c9d25785ac28504b5c46acd",9.917710196779964],[12915,"60779de361639dbb47efd66cf8d888ec15176bb5a891fe657c3e7bfaf2a838ab",9.647446457990116],[17099,"6ccf429d793e9a5c2beed6191a9b472ad6b557ab06cc26fe98c1db140c0f0150",9.317957166392093],[5139,"78c5b005479b10c03279234767a6d627c33aa2883a5397f681ab7e15f2f95cde",9.917710196779964],[10864,"670fc06276caf47c619006515db1a35c358e370eacd07b2f68181c349babdfb8",9.317957166392093],[12135,"722b6fd4fcaef0fd83a8135ddc6b51daa32e41b3ae04a4e2ed1bfe5a36ac72b0",9.917710196779964],[11854,"be4a8f1418b7634f9dd4aba771d3df24ef0838f24bc4e6a6616c49b8585c56b2",9.917710196779964],[5311,"fc7c2648f5d675b9972e1f4e855ff3afb02c71fd14c6535fa0157a30067051dd",9.917710196779964],[11110,"db5b238cddfd26dab6bb46c2e3f6c0d9b112a68437c57283934aae8af97f33b7",9.917710196779964],[12255,"6336470eb6057d513d7a694e6c22db503e47b09be8ae13ba4c30f70573b3a7af",9.917710196779964],[1155,"39079ba3cd8878a3ff6deb8b3bdd255183b6b05a4f1d559297f443cf939746f8",9.917710196779964],[19092,"851fb70e886902cbc6b0bfba44244f005a701910962ee048d5c60c632898ff1c",9.317957166392093],[3037,"65065e2ef49dacad16fd05896471765933a62840f97a9b560df3bb178cf410ec",9.917710196779964],[13168,"7cfd0b76e70d1efb54696df726d7766103ea7f923ab10c7cf98e3979d218a8a7",9.317957166392093],[9704,"e97573884b728f11730d67186b6267d2d50bdea2ce8bd81c317307a6c7c156c0",9.317957166392093],[10279,"b9c59c48635cf484bf929aa4e26dea1c605e5a6378bcaca84eca578940df86bc",9.917710196779964],[18571,"839d796b46e4b77466dab443650f17614c9a7790cf0d03b9b199132f1b88ca2f",9.317957166392093],[2679,"f29567d7570e619857754cc2dfec7b9468b4bff17e532c6d659f48cf7639a5ee",9.317957166392093],[6947,"2687d74fe165e78f44241fec8e14cf7129b32a96b6a1d0d8f7ff8289d5954bd2",9.917710196779964],[37,"f758fe956a0133f9a1afb801eea047331e9257593ae89868eb57e1554644c6ff",9.917710196779964],[1014,"3cbd979f8d3af57a44eab3d165bf58b85b71f2d0dea602923b26336793fc1ff9",9.917710196779964],[12116,"1437261ef2f2ef8dd6b3902d8c9a4a1673578f39b291035112525a8976d5a5b0",9.917710196779964],[2358,"267dc6ea759208e6c4c3f7f035af340b85b4ad949b4b0cddd4f8cfa023fdb3f0",9.917710196779964],[10138,"7e30a454d172b8a45b21173efd22f9882e3f7e98ed9beda10c1b74e21a3b73bd",9.917710196779964],[12404,"83e003685767c6694e3b42a0ada14dba01a1997a8f50fc3e2bc23f0fc95797ae",9.917710196779964],[17521,"fe8910d5277a26e229737012df51369171eab88b181463521e110303fd242647",28.09534619750284],[14003,"a9c4941f4682e13fed6fbc3185ac0a6c97e78e09499a9eb3679212d20f3cc094",9.317957166392093],[3710,"12024ac3cf0a5ac92fc10816e38a4b2b372b80b6732634f127a74c5c3ff286e7",9.917710196779964],[5567,"694e8a10ba52091e9777fd397ff91849eb0e78983c8470a2a5ff332ded10d2db",9.917710196779964],[19471,"7443de77676510969832dcdf113d8cf380cef0032212b8a8126dcc7d34b4620f",10.052724077328646],[18407,"0613a11c9be59a6cbad264a9387437518029517769d6ddf9fc9f6e47f26e4733",9.647446457990116],[8665,"88a3fb355f920194a0047c5bdc062b700d1a2409ba8079006606f83b6bc5eac6",9.317957166392093],[14568,"ccf9657fb87e020f3aaa0f17fc2e06e0d9036b995043ebc9614a09bfe868cc87",9.317957166392093],[18463,"b9256e5409395599320531ae2df75ce7ee65d935caa434624fd70b3bea505a32",9.317957166392093],[19364,"ba4f4d67f86ea10533d88b52b5565c8717217c702ca284beacad3aba313f4113",9.317957166392093],[14405,"e8d532a8d02ce470d1d7a1605d25cf95a9653cf6917a702ac2a241ea805d328b",10.052724077328646],[18437,"297c2d76f77f976b55202f2ebbefea494fb984379e0e713cd4726c3f724be232",9.317957166392093],[2118,"b6d3f40263c6794677261404d5ab3dda0dfbbf61c800cf96a6952c05b24d1ff2",9.917710196779964],[12178,"39f55b3435a43fbe1da3c9139407a097ff0fc9f64a1a730da3795554262e35b0",9.317957166392093],[3554,"8733c9c3d21e555051a14c39d9e71d3b2127e3b42f712554cfb8226998ff8fe8",9.917710196779964],[3358,"f563b75bb9dbf7d26fc394301115ae752f0a78ea15986449a44d45e1543bfbe9",9.917710196779964],[19542,"23ab96bdec579be9ed6588f3710d5b69c7df8d723facbe0d191f45f225a2fc0c",17.95964125560538],[18353,"99c289269aa277352abe4663dcfbd9a67d54a11037620a3a115e2ceaa8aeae34",9.317957166392093],[5645,"88baf0f146b4b5621575cafb0e897ddb06fc7be1d2ae12ea4b6f3bd2a9d15cdb",9.317957166392093],[16309,"edefe8bc1e521de7d420d5ce0a6ae846cbb1cee8cd76baad194c68188405d460",9.317957166392093],[11102,"efc387d174d15e3d60bbc1659a8f5d6f55b57d4b5d5081307d79713259113ab7",9.917710196779964],[14171,"49b557092006104d50f2559c2322d567ab19e223e74d3caf59d3157827300b91",9.317957166392093],[15787,"47f3825903a2fe33c8b865feebb57c63b7d39d3b8f20a3f2d230a4badad3956d",9.317957166392093],[13214,"74b01d1b78ee01d4cab487b2e8d694a9426125cfaaf850c572fbc318683e95a6",9.317957166392093],[11888,"67185af304972d416d16303e59992f570cd121f52cac9877ad9dffb5dbd116b2",9.917710196779964],[13281,"59fe1814620efec36db642d49b1745cfdafa4ba0209a8c7135394fcc3ef004a5",9.317957166392093],[11484,"99978a35ccb05cc0808a0afe3cded1df51c6ebaa1afcd613bd218e2662759db4",9.917710196779964],[11286,"a1ba50991b975d84dca8374f056e1296206674000f80b60f6eca7ece2c391fb6",9.917710196779964],[17876,"33bf61d9dbd737256d630972afecc51aa228befa8a9757a073962d67eaaab63f",9.317957166392093],[12857,"5b255c7a6b1ddeecd78b5244a538adabe16fd4dcef76794096d16d19ecdd86ab",9.917710196779964],[404,"4837266d31db719c150190f8db3bf9b70649304aca8bc817fb20ae244e7450fd",9.917710196779964],[10697,"720de9abf09003ece81cb2d5ac57ccb7be59b910cc4f6a929f6a49c1859206ba",9.317957166392093],[17157,"f8774c0c97f242d14c3b60afb5e23b109c5574779161a8744957b68cdaa4ea4e",9.317957166392093],[13526,"6e9ce609b9fa643649eb82f3b9f7186b75c183c74eb5b08ecbaa8d98a31d3b9f",9.317957166392093],[9146,"04acda8d288443501a84781d6cfd835c21c2a07b7a29665802709f970f6fd7c3",9.917710196779964],[10277,"309d3ac06b555208b9ecb6e1cb4fd54f923fee72d67b204ba1bc6bb7dd6c88bc",18],[9606,"a14f882ecf7c07811a4155c78043c7caf81d979c4f39083fe3092de66e7e02c1",9.647446457990116],[4029,"91c0c1aa35aa20bacc9359b263f842e3c6317014ac96fc8628cd0d5584de8ee5",9.917710196779964],[14978,"dfe7ddc967692905ad268773852e8e90e9338fdb8d6390d60c3837f2bdd6067f",9.411764705882353],[19352,"755267e6ebb32f47c1630d895bd3a6908d59f02017945a398acb2d833f508e13",9.317957166392093],[1186,"00fb18137aef4866e2d40a1828da515f65a9c135d654ab8fb0000571db1b1cf8",10.052724077328646],[19278,"3b63fc670cc7deff36af53ffe36cc1f0786b3e5d344f3abfe213f9884e6ea915",28.098939929328623],[18345,"2e3d56013896596103fb6c8407ed176d3eaa2a89caf05069085953411a45e834",33.523809523809526],[15523,"7c80a125e6b241314c24d50140fa5486b43223a7d0eac373a66b973862ee7c73",9.317957166392093],[10860,"a11f4d9dde2e7d2b88e9e8f7199bc82fd6e317a2af5bfeb1300d1006246ce3b8",9.917710196779964],[4220,"93cee4a330105de8262831bee64f6f38b4fbcad86747caadfb1750f26c7656e4",9.317957166392093],[8460,"2fa09ac5ab525aa8abb56edfd64d9125cfc480651228f7e1df4f24f43b5241c8",9.917710196779964],[3877,"e513f2515f7d104e5d7c6fc00a3e2e2d6344542759281f18b239593af53184e6",9.917710196779964],[290,"0badc7c9bc87c2146e66dd8ae6677d8d26595efa4d4a905bc5105f7bdd8703fe",9.917710196779964],[19318,"0c19c3fd48980f9fa0b36d0c5835e28bf51838ab08676eb3e2605ad249dd6114",9.317957166392093],[19254,"d362d52cf3b6e1148dec0aef949552574a263508b3c6ba27ac4704dbbedb6c16",9.317957166392093],[11235,"fc0638cd849c149628f5029b94b169638e175d385256aa8b8b331f30bbd673b6",9.917710196779964],[13711,"3644a2a8147da31a436bc9df8b395a08b3e7dda9fed21d5b077e34b95e7f289b",9.317957166392093],[1911,"6ed7773b1c069da0d43fdbd39a9988b97bb45722c134cf2209ac8b84a18393f3",10.052724077328646],[19220,"de867d99162cdf67fa478fbb77a1a8448dcff8c8fdabdef4f8c1a020c5290118",26.118721461187214],[1930,"ba5bd1848c3537f91e39d70b5c320c586053415d3c798c568b6b64d9a12f7bf3",9.317957166392093],[17945,"0dbdbcdaad41d5a143c99e784f8c712df235df14866b186161db65786952533e",9.317957166392093],[8356,"361ef2d5a91c0046e6e0f18492954a9d117b8fe223c437ecb51a8e9d4b86edc8",9.917710196779964],[19618,"62de2e6f9aed5df50ce420056bcfce19af9928003564b68b1624119032fd2209",9.317957166392093],[16209,"d9b3dd6beefb2f6e75433ca0df10a99d98b9567e3dfa9b1ea8a2986c6d7ea663",9.317957166392093],[11353,"a82d2e8771ff20fe24deb7a3c19937c7ae0198aebe88073f7849ee5967d0a3b5",9.917710196779964],[14080,"2f18e0a2fd60c5ace40d6940a26445c398307114d526da006fe1c83da92c0893",9.317957166392093],[18431,"f342fb0c8b9dc0b91fa35ecf8712b59c660b374d9649e87aa011fd3fea140633",23.00503524672709],[3041,"54c730b27ce3351d95411d44585ccb8546133c279848182b974b0bb4cf3f0dec",25],[14755,"508ae1640f1b7144ad189c9c781c4f5237ae6741191452576a31df1f307eca83",17.195402298850574],[16857,"dbd60c4d500fa366c435188167012421450c8636d0d1cef8255b743b91722655",9.317957166392093],[8805,"0ae70772763393f6e2db15804dbc289218062f6521ab18d38a499a7edd9d0dc6",9.917710196779964],[10389,"0d06b7618ea8067aafd225c918eded619bc878fe356c2fb8bdf57e69b3a5debb",9.917710196779964],[807,"6a02b24dae66465d3cc14b0bc2ffaad936e6b258b88a65fa7d870777d5b381fa",9.917710196779964],[17033,"1260a2372bb4532fbf2c76699d0c7633936b4c18ccd73283be7bade061c04e51",9.317957166392093],[1239,"c89b85c3f8fb3f6f6df5036fdd827ea8d8695ac837951e8283cc60b97be8c1f7",9.917710196779964],[11402,"4b4fbd3ad86e2408fc812f95c77d340d67662554813d4348d3da17bef5b953b5",9.917710196779964],[17141,"59bcaaf9587c00485190199382139d9c8ac370123445f9165ab9ab113549484f",9.317957166392093],[7972,"351b8655db1ff7bcae0615e69b17e89f56ff0ef1b6c170923b7743ed313fb8cb",9.917710196779964],[11050,"58f4315487f9158736f0279d00f42f0ed9ca06c59c01693b2333b89de416a9b7",25.114854517611025],[9041,"4da660df48f9aabcc4c24cab08834565c765b5d6d852dbd45fd5f344b55f82c4",9.917710196779964],[11775,"b7db231089f1d5a786e5ebde3d27c882a8c95d51337ac6e6c19157b00d66ddb2",9.917710196779964],[549,"e263142b4d5fba55d42ecc44f3c92786f4bac953f9e45fd27abf07077dec4bfc",9.917710196779964],[17594,"cbc448f2e20030e2b238b9648fd081a968032cc428ce6cf89d1aec882ee34a45",37.80782918149466],[792,"35991a45570903abba0dd71c16dcc9c1d0cf2f60e89a9abc581c8c5a9ab292fa",9.917710196779964],[6372,"08d119c4f2d8e81ab1b0402165de22a261c70263eeeabc6672c486e3294a82d6",9.317957166392093],[8146,"2e6db47c17cef4574a33fda4a7d8d825d4664a2cbaf389fbc4358ebb925667ca",9.917710196779964],[18613,"93cc63d1d6254b1b53ad6d0a923e24c9729302ea40855e568240bcf8b0f2502e",23.01298701298701],[17265,"633e2f07e17f6e6f0d4d0b73b5216a7188e461834837fb8b20b2cf848bddd74c",28.898446833930706],[19456,"7d9223ab967d0e11274c2fad4b562a4695686537d5056cc787060c990076b80f",9.317957166392093],[11244,"9dd4154156bb384eda373a82b5eee4c5f8433fd46f83d8785b0f6bfb590b65b6",10.052724077328646],[13735,"febb72b0e00f632df89425e4af198fc5f7e428a826c4ce597897d6439741ca9a",9.317957166392093],[15693,"176e7e7e3f0b72d804e80b7a8e9f4339da9477e593a0aabac32ef6316eeea26f",9.317957166392093],[17627,"320a37739553a797ff79bc61844682c36be438fd59bf4359edec85345db0a544",9.317957166392093],[4209,"4421487b7784898769da9b435d4a4d3d4668f5ec6674ec6a3c115679c4465ee4",9.917710196779964],[9502,"07b94ba4c0ee9d62ac0d8bbbac3fcd46e5ee4574b6f80344516d91bd9fa3aec1",9.317957166392093],[16913,"cbeadd7f1af035f75aeed68422962cc6c9ecf515599af5ef91fd24c11846d353",9.317957166392093],[18877,"06a34bb930923518b8168c2405571aefbba6355b17dca2daee649f7c2b4c2d24",9.317957166392093],[13259,"1a940b3ded7f4b623798cc54713a1bdb59e1ab5d185ef4508a5d18e5a3b57ba5",9.317957166392093],[18780,"078ef08f0b26fe31eaee0d5003b017965d1e1119537bd760db717732dc16cb27",9.647446457990116],[6599,"54cde98075e8b5071f478e443aa99afe710b7c893eec91ce6dd822760f4ca9d4",9.917710196779964],[6853,"ea25f1d42d99a9680d6f597d03fa5552061f8ec57aa833e269d250f15882f7d2",9.917710196779964],[17997,"9dce9e818a92d5ce4beca271c2a635c7b2a93a13a0850742d826bcc65fb04a3d",9.317957166392093],[14056,"9f7019b63015bdfe586449ae544924eb64e4b74d5931fe1fe1081487b01f8f93",9.317957166392093],[3556,"621b9d5399d6f5d97f5e83904528bd85a4515de7389030c625e4bb1cd2b98be8",9.917710196779964],[10539,"2ff917bffc30d2ed87a7a3493c939402cae435d561e08b16fa7e76c95c0ef5ba",9.317957166392093],[845,"aa9f7a9b8b0014966d019db1f7c7e73fd322842e834372d6f5f1d6e5197741fa",9.917710196779964],[14771,"3d69aef91c63c234b970b009192e9c6a3214919288777c3d36c858baf73a7683",9.317957166392093],[2307,"5e9dca19936765c449c39862b0fdd2dcd867267d9874c10bb9d3c5262af1fcf0",9.917710196779964],[6167,"8cbb2498ca785a04a1e317c4ecfbd0f89377731c96b74dc6850c0d919d6c0bd8",9.917710196779964],[5901,"9b9a7eb3d25873e13cb864a491934ed5f1c4c3d44961eff45fb82d46694bb0d9",9.917710196779964],[14148,"32f5eb15cad12af70aaae7dcc26f8ade6b4f140760e080b46d082bb0794c8a91",9.317957166392093],[3890,"8d668ec705cca8b58e84f449e0b50dd671f2455cf3751144457ab478c8d867e6",9.917710196779964],[4494,"91f785a64ed08503dee6c41f2237662c8d7c2666abae5ddf189cb9f81b2c73e2",9.317957166392093],[3598,"79c5c5cd8f71fd3fc24c9cafa5744adb0097388ed830848a30478de6f32339e8",9.917710196779964],[16075,"79f77a5e1948ca82d09f97776a2ea2ef740ac18e51ac1ddcb116028a3860ba66",9.317957166392093],[8494,"2ae5fa2eddb3043cbade63d1c9698fa047cf8e1fdbd6981dd9bfca5158670cc8",9.917710196779964],[7472,"0dba4e1bccfaa1c2cad5da21d03442e9bf20fcda7687814fae47dc50ad02e1ce",9.748672566371681],[19245,"e0d24720f5af64c37a16d4dc563b16640332496d47c87c49560680c926f61117",28.19047619047619],[14547,"73052d52b85f1a97fae284bc45a08916e6f97e26f8c3f9e4b2b08e09cb082c88",38.70022883295194],[8349,"e3f9786060ed355538cdc6eee1e2385a3a59dc0a247d17c4ba979d7b7b7e02c9",9.917710196779964],[3732,"63f11dabc1d8f897a72f4fd7922e893664bc3314be5dfaebd4a536de60d963e7",9.917710196779964],[14499,"be731bd38cf497b108b7c4875cc61c677d0c3abc4e24a92fd2da07ba059c4a89",9.317957166392093],[16020,"5ec49c6b0e74520de5ffd1f3b4cadfcbe7ab70aebf89b8a683cf81db4d5d0368",9.317957166392093],[15448,"fbdbc98451bd5f34cda9ab463825781d563f74f70ab5add954cf4aa7ea982875",9.317957166392093],[11290,"3c2bfe282619da3a75bd25d546b4c2550d889194bc3f8bcc45d2234fd33c1cb6",9.917710196779964],[13064,"c25cabffae0e392b6491296c19fc8d3fb848c924eb37b87d598ccac55aba33aa",9.917710196779964],[3893,"6783bf522ea0793158335826aeba1b1d6a373e6af56ec3b2ac2f54c15fc564e6",9.317957166392093],[1536,"8c65ca06efdfbbb1ff92b47ebec55fc3330b1261c9a4e450b5faae686be2e8f5",9.917710196779964],[5610,"a589c9a1946a563203f818cb6984a435f5afe2f45b1d124fe835808c5c289cdb",9.917710196779964],[14553,"6ab6af2381749af038b3426867724ca4c9e219270681e511044b039395d80288",9.317957166392093],[1643,"0449053b3105185e41907c78735b5e70cdb184a493c250ec7fffbaabb2d754f5",9.917710196779964],[18697,"68dd1572c1dd7d3539004bfd35e15a029a0d4c9729b9a1dc529aa5d6b2b1692a",22.52252252252252],[17546,"e94b53bab5d1fcc3fcd96becfbd434086f5463ebf410ade03280263f7ac29046",9.317957166392093],[18189,"9cd8e4f9cf5a7c622a48c72253e207d607ee5bed5b678b6a51c2486722aa7838",9.317957166392093],[17656,"bf893d3090fe3f9614e328264227327cf7ce016cd6f8f21e88f6c0bce6910a44",18.127659574468087],[18123,"ce5cba43608ca786f7d840b9d991ba5beaa4fa040a340c2e8d2bc95b8602683a",9.647446457990116],[4954,"4055bc81069e660aceea79dfad06ca961a06ed00c74783792d4e959b8e1786df",9.917710196779964],[9961,"0e38668db2551438e22ab02d05f7212730872a8391110017eef5a6f168b38abe",9.317957166392093],[15590,"31a81a162dc99f5b003dbe2d41ecfec98fe0ba7470508c94bd2e733c0eb18b71",9.317957166392093],[10681,"12bd1d058243e99a8db0aa323ae20ba4884824110e472404984ac35b3c932aba",9.317957166392093],[10060,"0c9aa4e4c8f3df189543388e3a00f0815d7edec8f56b09de882d0da93456fdbd",10.052724077328646],[5099,"e7c7eefc1ee38dcc78f6762650c593fc2bd1d6ab708ce6d8971c703de79595de",9.917710196779964],[17951,"67c032054eed2091d2190b8858fb953f930513fa2dd4ad018707a225b9d3353e",16.2152466367713],[1528,"10643d889ad989dadea83cdd9354a498a78875910a42f4f7850ebbb39967f1f5",9.917710196779964],[12087,"45494d614a4328f833c1f7290a43982b4e73a1cc0506a91378575f90e578cfb0",9.917710196779964],[19745,"4a80604a516a69bd0b863f136ea24fedaea6ceadffd1cb49460e3eb6d0c1fa04",9.317957166392093],[10749,"df72d6434c7d33401451c60e5719befb35facf5884e9d27e36b1f35ce5d8b1b9",9.917710196779964],[17080,"c7b99477b7a452de92d568521d83222a3442997f04de91f33acfc38f55524650",73.75743707093821],[7364,"a4d91d079db0199cb729293667c85119031d4ac387c8e81d2e6ca44839e8a1cf",9.317957166392093],[1416,"506b5ed80fd7d8743aa9da8ed3dfa0c3a5f746a2c5fb8a4d52b33276fec9b8f6",9.917710196779964],[2428,"50b2d9bf39692ac3b30cb09aec63a3b66f3d597c73fa2b5961dff7ca2a9245f0",39.20855614973262],[13912,"369682a469c989bf771e93d903e6d9929bb231bb8989df90e3e169538a1dcd96",9.317957166392093],[17763,"97ad1bbc2cee1588f50ef5ac8b64098f4edc5715f32ef504f80ce6682bf6f541",9.317957166392093],[13776,"f1e8566db483a4f57bf9a599d6349a3b6830e6f283c78774b5900a67d853df99",9.317957166392093],[10460,"45a985ca9204ac0f6fa5e655107ffba863a8e26e683338bb18211f57f5ad60bb",9.917710196779964],[1210,"5e6317a9d4284843af172cb9d45e15057ada70df99fc7cdf5f739f08bfc5f6f7",9.917710196779964],[4950,"fd8456671f0a6e3476a82966828cd5ea56989abd96e24f0af8ec194690c488df",9.917710196779964],[11444,"77e9bddfe56e0be17bc37087b027f5c271a7d05c7761868908bbb2ee47d3fcb4",9.917710196779964],[16361,"53d8bb2ea5093c2b8c6c1c2597386de7123a9f14288ebcba8456fd7a0197d25f",9.317957166392093],[13350,"dee8ac11ae7c19502a05e2051652d7a19e7d0f93a07406ba3a1e4b0165f27ca3",9.317957166392093],[11554,"7c4ef7bb9ebb2a230ac416d5b00fe70fc610c4f6aeca4cbc5b02aa94c38734b4",9.917710196779964],[4752,"a37c9a3bc7d3e73e68408e29d6bdcc4e105f00dfcb51401829f3c6015e8fa0e0",9.917710196779964],[9999,"826b97dccbfbf47df61a9844b567204a285296126767bf208caf5c4e816d59be",9.917710196779964],[9242,"25a60a731b6790a7b7946927bae1faa87990b15254f1c7f67e9c058de0e32bc3",9.917710196779964],[1690,"bc88aa724e66c201a1ea16a50b85053696b0f5a1c050feb170b4907b59f4fbf4",9.917710196779964],[11662,"383f9f0a9e014c2e65def22a6acf632e8572ab570d30a56a8cab1bc3bfdd7fb3",9.917710196779964],[8171,"c0bd0c075b85dceffc7488fb0824d2454d8bf237f38db4d4eedda94ff02e2dca",9.917710196779964],[8591,"82eaf7ec392d8c94582e591a42d6cb4e80c17a47a8ccb3218f560b2e36087dc7",9.917710196779964],[701,"2c9420c7dfa0091001d8d7ba6531f8ca7c8fe4075d4346a4be808bea9c253efb",9.917710196779964],[8394,"26eb1e1c7803c3abd1dfc46418d6eaa756e4de9d3a0d50b9faed1a998bfaa1c8",9.917710196779964],[9583,"ddea1f9c34d48e433851ff710eea6e20889149d5e39e087966e83cd2aad81cc1",9.917710196779964],[8734,"515dac7e2aa5069877db08dc65350de9e2e8e178c96a8e74694e87280d8e7fc6",9.917710196779964],[17784,"29a54dcf12ecde23ae115a49f8598a14a8e7dc9056b86d69e09acb39bd29a041",9.317957166392093],[17487,"73a96373111902b2b44ca6f1c8a561bc8761ac4f583d07a203e0e0acecc8e047",9.317957166392093],[9853,"9c9a313fa347b29a203388c2171e45faac65e9e264c7882de3f3f1aaefe747bf",9.917710196779964],[1607,"4d726f5857aa0490697df131027bed0908cb4c0ba8516c4e6fd1d1ab4c0287f5",9.317957166392093],[6550,"2b7b43c0ef947e6642ab29edad8e9c01f9efaa1819291877ff55754363c902d5",22.854014598540147],[11190,"febd3d877d5e4f6d6da920e795f3f7921bd8b0503d2d3a6b125269ac1d3abab6",9.917710196779964],[13578,"550be940ac0eea5b5b3ef2ebb1a8d4046e76ba4d1cef02db021ca72d05dcf59d",9.317957166392093],[11418,"d8c54144cf377a47dcfac7c31f94c95fa5e6c3710168fcec8f7fb2f7a5e93ab5",9.917710196779964],[16994,"56459a2d1ea58b166a74e3ad8b454b38ac48bd17be6979d627c59ddd66ac2d52",38.00353982300885],[877,"e23dcd929d6d7019c955adc4c57da9918ffde4fc1fc0e931d1fbf10f66b80cfa",28.09964412811388],[18127,"1de14ae0fb7ba55600d30b26b1a8fdd0d4b27519422af71aa1f2b433147f4d3a",9.317957166392093],[7567,"3838ddd7e7b55423b79aa6db93a52a4c0000b3901058a66b7ebb15f0959063ce",9.917710196779964],[13042,"c211495c96891b781fab2d2ad0a945906bae224986453236ba361d6ba9b24caa",9.917710196779964],[1018,"6bad75600a171666ce5fad9ca8809c7beffdb3ee1c1755a98c585e7f6aea1ef9",9.917710196779964],[18289,"4d07c3acc11464329b8bdd716971aadff7ccf78a927213d9b92ffad67d180436",9.317957166392093],[12391,"70dec721edc7fe1a51a1054e766d67bdcb054ecad872f3fb47174e2f3eaaacae",9.917710196779964],[19059,"dcf8985ec18b7fecf43815964e2ee7a41a4f1605a45e328333f5036fe995741e",9.317957166392093],[640,"f5422e1ff5ebbe65df51e8eda8244044cd7e04f84e62be24382905f302b6a0fb",9.917710196779964],[7278,"1f486f0437446c4ced3dc1d1c28e48508344c536f7edeff3e20fe4caabde2bd0",9.917710196779964],[14065,"fb406c5c4e6d5df07c761dd28f500fda30521deeb7346cb96713a63bb07c5193",9.317957166392093],[15953,"6805002e3fb4880f7bc52dde4a9d61ccbc2bb1bbea3ea7d5d760bacfe5ace569",9.317957166392093],[14710,"e3febd56eb0d25b5877799427ad1c8b0ae3e30f77a14fc4cd4bd3a33af5fb784",9.317957166392093],[16993,"41066dd2311419052562f3e472df1faf75b5dff7e63307295ea35fda15213952",9.317957166392093],[2396,"45960b211ec05fa223f5db18ac9e798e49704ac6f5f711b783399304f9ce82f0",9.917710196779964],[17386,"680799b1b1c19318d1e468db4968327ee01330d2e243d80d7fb4f7bd136b064a",10],[13546,"d3e71819ac7a5fbca5e334f3cacf5d7e8bbe5de5b8182a4474cc81a2aec8d39e",9.317957166392093],[16358,"a19f5d655f6a85a86aa7f1ed85d7fb1856a3fc756fa5ccc1b3415c13b9a9ee5f",9.317957166392093],[18989,"01df1ca9b65c96499331f6dfaa2d88468e3f1f1e27cbb1ed3558594cb05af820",9.472566371681417],[7030,"5f8ec5eeb5fa6989b728b703395ca4b56621a9c4626d419ca2e61abcb5acd3d1",9.917710196779964],[18322,"7b5934190543b43dfea668c87abbec0c928764eefa5c81254aca7ab68aad7235",34.77580071174377],[8095,"e9c4ba08803be0410793cdf2535bbbf1533d6dee42b016e2695d9e0b06fed0ca",9.917710196779964],[10566,"045dc4be59d0148605e7c77811cb7e0a998b4773524dcc6aff81d40eb68dcaba",9.917710196779964],[14161,"820a256e655f71c9b0295e823e5fa43d95ca0367e0bc61538ee03eac96443491",9.317957166392093],[13650,"2e9cf1db4c66813f765872146485a3a442fefb513a908916e70e306a84f53b9c",9.317957166392093],[10804,"88b5d544dbbd578ec9285c0f9845e69d78bcda786593cfb98f510204fa1445b9",9.917710196779964],[19103,"ab79954f804cea67fcfef3a3ee6f0c27f5b640f19789878fdcc71b65bbf0a61c",9.317957166392093],[5740,"a5aed0b890d61f34c7ff931dd7c05ddefa9675e760f2fdab767a3f7f0ef5d2da",9.917710196779964],[8128,"74055df153e129879c672f046dc7b6bc5a20a00e0a416b2bf1f6fd2968f292ca",22.265486725663717],[1269,"ffa7182be23ad5189bd96c713243e8bc708efcdbeff66eede00461f9ebb88df7",9.917710196779964],[727,"f40ff594be584f27b5de5e12c3f592512db862606052afc52b7641be6e9f06fb",9.317957166392093],[12492,"c7580d1d5773b167436470df4215ebb9d7f2eb2784de9d330168318fe4d301ae",9.917710196779964],[15489,"2f51f485eeffd91e84c88d55d4572a6344e16ff022964f7749e8188620234c74",9.317957166392093],[7325,"3e0f54ce527463f52925997f57627e8972e40642ecea8b6636a2b0de09dce7cf",9.917710196779964],[1905,"7a99ff1c825b5f2a031842060cc7fca85bd6cc29fc055a7c94c2282b6f2999f3",9.917710196779964],[17646,"7fb55379335c3ef5899030b38d322d17d28933710f67f1455131bc30007b4e44",9.317957166392093],[3794,"828446f376409958b3b4f235553d0bd397f4649ee6bd8245fb29e5331197fee6",9.917710196779964],[3084,"5c1e2b3d7e774925c3e06529f9421133b332cdc7a373384f42533f83225ac1eb",9.317957166392093],[1263,"73c5f447e23200b6e4c811211b0822bfeaf930ff2bf7cb929e62124189ac93f7",9.317957166392093],[19504,"0c43b64e91b32214f4d18b293aaa1236bd516b1ae97e5c309140dda227e22b0e",9.424083769633508],[5119,"8d47af4fdbc2f7794b2fe243db3c3246fe8808285dbaf9255d964d654ad479de",9.317957166392093],[13327,"b99b4e154742cdc8649b86887513fa01cd27a58a5abf251c21eba54dcc1e20a4",25],[9404,"8cdb425a55107824035e84f510722e3bdea2d63a1b990412aedf5121c49841c2",9.917710196779964],[6755,"55d6f1b9cf3ea423faf322e76a9743f2687b7e5b20653b06ac606b75185b90d3",9.917710196779964],[11072,"224ca481e8cff054efdfc8ffa098edb801146175bc72e631ff256e1391ad86b7",9.917710196779964],[13666,"f72913f9fbee8af15ab57c92ebea5f0e3a09a2651c8dd0bb6d121fa6650df39b",9.317957166392093],[18292,"953560e7dc1e63958dbb360806e6ddefadd130e06fc490a552ac427ef4b5f735",9.317957166392093],[12726,"71ff9463261521a4125e2cf76c942cedb501e8e8ee0c0dc083d1af2386d96aac",9.917710196779964],[5759,"a4177599db86e99223562531094e3503bc10fa28c9c2a3c675feaf55ba64b7da",9.917710196779964],[14260,"09e0682a6b7b9ce619cbdfbd2b7acffdc0eb1ef959472f3552f75897611fae8e",9.665924276169266],[5635,"5f671ec2bf183710c3e24d18802412d8d83a6275657555713feffd86e3f36fdb",9.917710196779964],[14370,"a8102e0b97148a4075c04fff028e3c419c5b30719bfb296a323d2b3d189ff78b",9.647446457990116],[6637,"6ec07bab41c78d101dde3a2abdab9b9a0cdfc2bafa02bc2ed6e4089dc17d6ed4",22.869409660107333],[12431,"227377d9c5a95e408df8cd016e7f9f3e3ceec07274e43a2ee9359b8f42705fae",9.917710196779964],[15213,"5bb496e0e4c358fbb470d92c83ce7e3121f02de1f98c5681f413f6965e463e7a",9.317957166392093],[5952,"aa2baa588913efa12f80e7b62c2ae35243ecc93a4900e053c5b00936948768d9",9.917710196779964],[14356,"036ca35afe50aa4bf4a793439151b1e09548f17cdd71ae934fccd061fc7d448c",14.352402745995423],[17909,"3629f85f371c9d131ea8a61af3bfecc53027343c0260b70a95b93f59a283153f",9.317957166392093],[4302,"52c0a41351f78611654f9065cca022a312aaa8953f59b48b306bc19680e0b9e3",9.917710196779964],[8482,"a58ca206e23bdf8e5c850bdc9d641098ae6304bde7949e69952e912bf29f1fc8",9.917710196779964],[13101,"53c236c3bb5760e93ba5ffe3de8749829f87f8fb94f0dc1e9482c64a2c293fa9",9.317957166392093],[11164,"853c67e156eb5a94562574eb7d3c7f210eefbe2c7e7f5926d2b234ef651ce7b6",9.917710196779964],[5027,"f214c06278de1e7f08a462f8bdf1d37d72768a06f59de0be8550de39ae5203df",9.917710196779964],[10658,"4f68757496d053f1a91c6808eef713fb9e582d12a34c31677997b9cd47494fba",9.917710196779964],[12691,"ad9d93091ac21e18638e328ff01e513dfee0980b158489466deeed94cb85a4ac",9.647446457990116],[3503,"2742151663e0810ffd622729b276b879a075d6bd5b22d7314537c9ecdb4af7e8",9.917710196779964],[19085,"653e3152900fe0579d5e1edf30f29ccad8da37b69284856c62a7c067cf13651d",9.317957166392093],[12065,"db445ec5367f31dfa54544508144d271bd60087f785fde4683a049dd117be5b0",9.317957166392093],[3896,"d0f71e6d7c258c236a9b1e168c38ac913e8d69cfea803e1e25cd6f87625d63e6",9.917710196779964],[11157,"49f81d272b70ff04896b31b80903943c8fd800f1a559f5c0a1c613e978eaedb6",9.917710196779964],[1208,"feb9f8893fbb4ead39ef12bb7620ca6942a2926c1ceb349f92e6c5f48bf4f7f7",9.917710196779964],[1074,"c330a1a2ac3374b4d71f0607d872f6553d7bc0e35ea24c8395dc50992327c1f8",9.917710196779964],[15987,"300f834394feae0a92452dd0f0dcf770a685ac03ea44af0711a1f8668ca4b068",9.317957166392093],[2159,"2e1cebd10b85ac231f6a0e9d9961555034908f14c5d049e751a8721ca6c8d9f1",9.917710196779964],[5673,"440e81fde5150e7cd7739f204e38d34e5360d64b9b778e1811afe66428242edb",9.917710196779964],[711,"1453d92a0d2bd7c6110d61bc239d833b0c1ead18bcbf33f863865b8be78327fb",9.317957166392093],[11815,"5d9a86244d8ad118d37aee3a9c7b292d0ff573253506f369239357a497d49bb2",38],[18576,"9b9fc05ff27387b646e25d97719f94182fd51de5143d4f62971e020e8223892f",9.317957166392093],[8770,"f047eb55daf624dc0a091f0ea690ee7961838b2d8eb2b1c34a67f1d7a2473dc6",9.917710196779964],[12725,"d1b390a57f9ef0f6b9f735e33f46e82d64d44efb738220c0321b8c14756b6cac",9.917710196779964],[2257,"287d6c9f9c9f0a7ca50bbd7017c4187c3d7760c883cc54dc2099f4b28fe937f1",9.917710196779964],[3497,"12c3200bfe271ea4bf774a4bff299e4a675e9741263ee77ca9bccb47b61602e9",9.917710196779964],[15239,"63787509de27fd1f948703e54532d91afcf437281558d505ae9cc695cf5ea979",9.317957166392093],[3823,"ee9a1a3a6ff23e9c33199edab7cf7bd11a5698e4524c38c8e309a6553ab7dae6",9.317957166392093],[13625,"65147ece860d5b9b8031d20d0f8bbf445769e4519fcee2adff802c59d7a6d59c",9.317957166392093],[5149,"706707c91322b4d6743dd16f7120bc2144d20808813fd3cd5bb4fda49da54ade",9.317957166392093],[849,"e722b0af07c8e82fbcf8089667e492e5719e7af73e6a0167f716f467b9e93cfa",9.647446457990116],[7310,"a029b69df8e0c96dac6060f69ab76b0dc3ac504adfcee86ae91816fa07cefecf",9.917710196779964],[13050,"d4af217fcb9aaac8558b7ec04378ad4b87e921c1bebdcef3b1ba035a0f0b45aa",9.917710196779964],[5870,"d2483b34e651bc8abff928711250d07635044ab33f5437f8244ca8a56111dcd9",9.917710196779964],[16585,"c4d12332cba4f1f71d9f7e2da2c4b1af3dfd294a34ddbfcb0c89ff7f0b2e575b",9.317957166392093],[10680,"611fb33b849db84d618c3cb7fd2e35085bad2d66925e58ecf5c625d6e9fc2aba",9.917710196779964],[6437,"f38d876f068e054e47f07ee1054bc5f544dcce32f2bb30491189b5313f1a00d6",9.917710196779964],[18464,"c52a2489609838694b262b3cb07e4f10d8525a835bd9b74eac268a5697805432",9.317957166392093],[7501,"f2c151f02869e42f56d785bc1b7c08107f8b916f1013a455a215d0999918bdce",9.917710196779964],[17596,"12941f40f46884d834fad40729c472cb56d250dbac63740837e9a7ca86733d45",9.317957166392093],[15006,"242bab51f78473b5928d765ced924e8326c0d829a3176f1da1ebcd179e1f327e",25.839930404523706],[1314,"92ba4bba985d78dac784101d7fb39706b5e760744fee07a986044c5c727653f7",15.915194346289752],[14488,"11d9642cb69fc0644fad53f45e2290d00fcaf3d2ba6e926270b7addafe9b7089",9.317957166392093],[19248,"bea4393661abb0188842c3998ade7f45f1f270fa02e4a4bcf997e1b09715ed16",9.317957166392093],[9513,"5818cbd935edd73565b13ed0026cf6cdf1ec8d646658b5c73d623b92b16f9cc1",9.917710196779964],[4491,"f961491b9d16fdfdd261d8f29b412425992cf6054925f3433a35384cea8978e2",9.917710196779964],[15614,"f78f66c5120aba76005914751cfb9076145a886fdf3ac26ab1a078c387ba1771",9.317957166392093],[7073,"d8a78f553c332b286d67c8ef88379a2ea68b6ba5f6c02574c365fd62ddf37ed1",9.917710196779964],[15836,"4eed7e681c4fcd715749a7e40371d05bbe8cf16ad57181f760df1e68d34d956c",9.317957166392093],[9554,"0a4fb9081769a64259ec8c69c8ab7ecf658177f29bbbbe94ec65eb2de60f50c1",9.917710196779964],[11382,"378c2cb2b50b31e91f5e6a23c3ffad291b3f5163cc05bf6206e80b407ce381b5",9.917710196779964],[15807,"485a6cbafae1156f337c0f49675fde6f2238441dda01a49045add0c1d4253a6d",9.317957166392093],[4777,"12e838ad8a2906ca531fa88a00be22915d78304ac051676511d53bcf493887e0",9.917710196779964],[16473,"5e29536a7df2e072aea4909d5e9600c3724eeb6cfbd00c15a8fecb80294dd75d",9.317957166392093],[11179,"e7ccfb97f5897564c903d4acb0ceb7f822d07f82a381421d171c1a7b675ed2b6",9.917710196779964],[2494,"01bcbb86b9cc566aa09d626aa1885270f6264da290892599ed2de8a34048e3ef",9.317957166392093],[11751,"c759b867f31c586a3160f17b73804417db18e7c8921434b5ba21def21060fdb2",9.317957166392093],[15321,"dfa65a4d451d813835fcbf9099d552c2e704315d0ad1763c67b8c5e643afea77",9.317957166392093],[3200,"e00e1129ccda932d674c32e5a79094a9b4d99c3cd3668613a9aeb0a36f070feb",9.917710196779964],[7353,"972b949173baf604dc8143868a8fee41d59f42d558784f5cc4bbcb93eef2aecf",9.917710196779964],[18887,"7a349ad9ecc3ce2156a07f34d395dad976fb849cfaf963dcfca359a087cdd323",9.317957166392093],[1736,"3c55327acf0fbe7c8a2bbb6e43483e082dfb52acc509a927fdb2d6a6a416b0f4",9.917710196779964],[2995,"38623c7cf2766c725b648b80c8e0174122f8252f2b2d6f466c8e907d549353ec",9.917710196779964],[13289,"77eefe67ca21c6596c76738123f9fd22f1d084be1385a87a7c5d405ae5edcca4",9.647446457990116],[5695,"f76cdd827874dd1682e5c81e14d7c05ad5c350ce3c1c19a0eb1a6fe336d415db",9.917710196779964],[17317,"0ba7dcf0851a4a0f3ae9b0fb239b63c4315fdf568b28bffb85d314db6390974b",9.317957166392093],[1305,"8f9c3d5bdb2d495c7c72707c9eb178ff432fb364155dcdf788a6a219162d59f7",9.917710196779964],[810,"1f0ce254871a8d0ff072eccd25cd712f1321fdb1a4047c9ef92e849925be76fa",9.917710196779964],[832,"1fb85119e6a164ace5b3378954a7513282a912d9214660b57b04105b882c55fa",9.917710196779964],[14796,"b48e29683cca483862465121f4423b893f2546fee3479a145d5a0c5f061e0883",9.317957166392093],[16911,"251d0ed0e252158e312966180efe2be8b8c6d846a713fb8252210b8cfda9da53",9.647446457990116],[3324,"07b6a766e5a81cd735adbc492862c662c4bba4638f7876c17798879051e637ea",9.917710196779964],[7711,"896c4890ebcd373e69d9fc5571f9b25c874f0591b52996cd948473526e6478cd",9.917710196779964],[13808,"f464ac171ededf8a61f6f52e0f9d66c52ca233dbd3bb28724dbdb4bddcbb3599",12.053811659192824],[4925,"a13d9e22861b2aac8965ae2d5a0a205287bfcdf83249cfb3cbfe3ab29611b4df",9.917710196779964],[2928,"2cf018c1c563bd9380ae4a27b1863d212d603e43ba9c818b448af87bb732ddec",9.917710196779964],[5355,"ef2acb44829411c67ae4c7c1c618951a362cbc89175b8cb39047de6f2f651edd",9.917710196779964],[16709,"52610dba2969247fb35124f355ee69d1b8440f7ff99d8623096ed115184c6058",9.317957166392093],[3529,"28de70a059faa154e6ff40b6be611cbaba307da902738c1957d3b42fc262c4e8",9.317957166392093],[15124,"467e1c5523ee2feb2a344e2a65c0cb392a12b57026d6af1ba413ef666951327c",9.317957166392093],[10918,"0b12070de9a963a7058dfb924562a905a2d2fc429a4c5cc82b740d3ab06a92b8",9.917710196779964],[9742,"c279d0d2c5a23c591ee83bbe0a18c7c6b0b17be6e14f22c101d7e197cfa209c0",9.917710196779964],[2096,"3ce7d2f0a3627a4d520e3b1d20f5edaa3ea4dbc292af23e2d888f526a30a46f2",9.317957166392093],[1500,"1f662bb1ec846dfb130a51c3eab436851a665ea81cd97a403c0549d4496021f6",9.917710196779964],[12478,"5e4ccad233e6e21c7a9fe44b93474346d09d76481ef81dd9b7bd11fa587f12ae",9.917710196779964],[13129,"9a4874155231c293d972fbf8366c185100795547568ac3f8b6b374d0fa656aa8",9.647446457990116],[1658,"501726f54c51e96f2a6171e9e42352d1e1b856f8d3596be0253cab12a93137f5",9.917710196779964],[14396,"6d8f91a9b2f1685ee696d83cb61547441c55005eb2f8aefcc9242f5666b74e8b",9.317957166392093],[5427,"596669c78ae443290e3a85f660f08c5d31c1b448e35f991b5898e880a6a59edc",9.917710196779964],[596,"f5e55815c4585cd07b7b890c5c60ed7c45e3470067a43a69b8a5bfebdaf7f0fb",9.317957166392093],[8791,"830a47f62a2eca2c93058e24d2af6764b6d8fd9b16e341f78b4ac108127d1cc6",9.917710196779964],[586,"91e2bebbdb4f2e4834173721828303ed7b514e84551dc6dfdb7e5b32a44904fc",9.917710196779964],[1496,"c3fadfaf931ae22d9782c3f6319c32ec40a4d693f3b4642b86a60e0a581624f6",9.647446457990116],[2703,"0b4f2392f9c97ecbb0cc1e33b4099d4c3ea78d578ca8314a2b259b6a888d73ee",23.945812807881772],[3449,"b2af143132f3510ac256fb36388fd38af3a2e47108e49b88d9db3d2772cb5fe9",9.917710196779964],[8984,"b5bc0b5bec4fe71a1e807bdbd7698f82776e04f097f40acab05b22b87a3ae6c4",9.317957166392093],[6347,"a74a3b38a2aa12a1247ac9e94113058d409ce220216f76f1bc2a2bb48295afd6",10.033508207818581],[18701,"5649a840fca690a3c0b4c74329fbd8b996f5ff629d3dc742abec2f04cbed4b2a",9.38219895287958],[18231,"bae7b95f2983b55e41f22e47b6efad174248a34234c77b83baf5fde991165237",9.317957166392093],[14704,"d92b1bcbceab3a8ba017e7493fa5f6a2a023c1e53d2a82bfac185de5d9f5ce84",9.317957166392093],[17983,"68ad8a25d6a5e1a75e3eb79f4405e065304d675a6965b0a145a1559ea8537d3d",28.099408284023667],[7422,"4f25e6610abd391fef7707ff353d645e79d25c1d769b13ed8a1f40d9331b3ccf",9.917710196779964],[3481,"de4ed27a5eb1f5693c79e3dc1ae439203f7acbb326da261e416111e5b47327e9",9.917710196779964],[4657,"207dfe35e28f486371503e2e5622268c1fc4dce51d19230968dedb9afe7a42e1",9.917710196779964],[8631,"08b4d87a417ecd552e677c9d919196675de330dbbcf2f28eeed7e43461173cc7",9.917710196779964],[4324,"baf29c47dba7c46cb564b4a4b538cb3d592b69005322d80d28ecc05817509de3",9.917710196779964],[19570,"df138bbe511689ac11fcd64cb95978296d02ebe1ad5213fdd7ae665d82d6d80b",15.942959001782532],[18413,"85a43d1237b05c4fd5b8408dd6588852ab66891ed5abc7f74a8f10fcfffe3533",9.858793324775354],[10004,"d4c11d0e67e37fba5da7b7bd6aa3dc1d468430f4a104e4653af2a783fdd74ebe",9.317957166392093],[4148,"c99d71af2d50bb2bdabb9bebfe81c3b85edc43d6b0e365bf4df454feedc9bfe4",9.917710196779964],[18883,"e55a8ed6ada40c35c4e4c5251fb2d73b3c160b32dd0ea342e6d788f63368e323",9.775743707093822],[11800,"25ce1bde310403f28cb79d0bb1135513abe7a12c9fb69c302ac17e930ae8b4b2",9.917710196779964],[3120,"489886d4e5f30153983ef6cbc6b118b1c789c21732572a2bc82a62221c8c89eb",9.647446457990116],[8341,"5d2d683716ecf5c9c4605e0ca92ab34fb69a9a84602d3fe50937ca58f15f11c9",9.917710196779964],[5178,"33c83b5429401ad2ce88c4ab43c1d0089c786a4fada763bb264c37b228ed1bde",9.317957166392093],[8529,"6c93fe4621ed0566910748c361273dbee764c7231c1eb8164d9ca17decfed3c7",9.917710196779964],[2598,"8104104834fb674cff20f42c88725488b1b7af3a91597386629f64a0dcce29ef",9.917710196779964],[18325,"b13374de9c373782a07b3447dc069749190cf479fe139b7dd095ff5146a45d35",28.187082405345212],[6219,"cccac245816076999c66106f87641c50367f7f7258f206b67cc10c3773e29bd7",9.917710196779964],[11352,"f9a738856ec2d603d9c9a1be46e968ea0daa619f0c0643190a0e6914eec4a4b5",9.917710196779964],[11486,"c5a3c170238ed850d1b9eeb9f231bdf2efcd6bf3dc6e8fc09f4eb7c181039ab4",9.317957166392093],[627,"e7c9472da9ca0ba4a65d44eb8761f6e5aa6dfc9f00ba5a19200fc4aef09abdfb",9.317957166392093],[19750,"ab37fba008777e25dadc6128c7210f8439b93b4b937afb42128f086c9992c604",9.317957166392093],[3952,"b88e71f64aff25bd6e75b6fb0850b8849ebb6d8dc1279f6379b626a1b60800e6",9.917710196779964],[17436,"28563bf68936d3a5f74ca7d215739be729514abd893198c32129e3634f1beb48",9.317957166392093],[7220,"f71142df524401ae67dd14efb515abfa0750d54c806d9aea9312c3733ce68cd0",9.917710196779964],[13592,"ee0b5b5bc8eaccfd0bc4613f1b251a732fd22e11d7eb8aa10a5d668bfe1ba69d",9.317957166392093],[12129,"6f3e7909e833b9062fd7b48ced9f4a122008a92caac5f206d61deb4519447eb0",9.917710196779964],[15490,"1b0932562e6f5d673f7a2351ed279d7fcc21ecc52e51945de7b57a45bece4974",9.317957166392093],[12123,"086e496a200ac000a95dc1459f47c4b5971d7de1b3686b579b8107aebfc491b0",9.917710196779964],[2670,"580b2cb63cc6abc8b65ba7279ea51145b121c68eb93f34d8ef6c795b7286b0ee",9.917710196779964],[12860,"198a4674b2583b8769161e14992b8a3567033bd2e9955e7dc3728f82eb2584ab",9.317957166392093],[9700,"11923d32e15cfea02ad2ceab1d8bc6cb426ebe4f3c1ff796d84f5075e5dd60c0",9.917710196779964],[2114,"e8aeef484516d8ece3be5ee666cd0e3967b7ef1a421b305e32682575495323f2",9.917710196779964],[9219,"86cd5ba23a4890d9592606951c1e2cd6b95d33d30e8d58695b84b184182059c3",9.917710196779964],[3054,"6a9e9242b27bf9d3935d96c6c00142105e0fe99e77fa7a6f7fe7b57c64fbf3eb",9.917710196779964],[13274,"1c1a38c2d5c2979ba8ab63221676fcd15ba54f15b69b9bf7ad9b6d8250ec29a5",9.317957166392093],[8158,"eb2bbcbde5ab188fcccca169c2d5d9dca4530a21c71cca9b63ce7c1578b54eca",9.917710196779964],[11057,"978a926d5c4cd3cd2413c0afadad51edc0b8d64eba7e1f31bb0f667261729db7",9.917710196779964],[15409,"6aa00cd91d0ea8fa3cc553ac46baa125101ede2198d24b8a6557cb31924b0d76",9.317957166392093],[4955,"dd915aa5ff628958327c91349a8de16e4e557f35fabbfd1c843cf57fa3b785df",9.317957166392093],[5068,"81631df3a3d5fbfcf443214795d06264b7213ae5920e04ee993b2dce23c2b8de",9.917710196779964],[14975,"dfb1c3e81029a19610e7589f35e470a322546f5a7006301a12454b51b0b71a7f",9.317957166392093],[15776,"4e697261d8252c995ee79ef1258e568da3439254aab7917e95d49449746ec96d",9.317957166392093],[10332,"a2849f77722916b82e479e9b5deb31afef9fe52ce839b5c73f2a3808bee61fbc",9.917710196779964],[8310,"10c58055de162a9483d491d07992473687fea24518a5e2d83aee4c5cf0f241c9",9.317957166392093],[12887,"538433044785341e6c40a5343bba71a12d2097e9485e70fda96a221a20725cab",9.917710196779964],[8188,"0d150174b5a7579f2e11c7e4dddd21083515f1e65f27887586d2c2f1bf1912ca",9.917710196779964],[7728,"4227cfe682e9684c86b4b24df9daa9327fb1bc9e8413ebce49ccda710dc64fcd",9.317957166392093],[12036,"5b4b450d7160d1b7f874cdd48e2e990536c8f82b186d31b51a5f1b6c1da40eb1",9.917710196779964],[18447,"984c5b4ec8ff6bfc355442caae70ca38380f5554b3b7e0fa293ec0157adeb332",9.317957166392093],[785,"58a0dd48914161b6665a8408548e63d0444a2f30ba8efac8a86cbb887c759dfa",9.317957166392093],[13037,"8555d1382667fd4f13d85881473be1e68743743b7679650f08f056607c505caa",9.647446457990116],[17311,"b55e936225c2e631c3177c4d264bf2c361ea7e78d6ef8b6437c845842899b14b",9.317957166392093],[11145,"5c6662cd6e60b370a68df961e2f5bcef712885beedf8201f6920961af28ffeb6",9.917710196779964],[19087,"e43fb3154989b13b252aca33f621d052b699e12bee335c87e59866b534b5551d",10.052724077328646],[9325,"5035a68f69210bd97bb002a077de727321b7edf0304e824616690ef77715bdc2",9.917710196779964],[18857,"2ed4766563f709dd8690de317e38a06c537fc87c318f34659a6cb2d710fdcd24",9.647446457990116],[1198,"0d6a3397e3aa58b36cb80fef19e987454db0d58229bf463abc14fc81092b06f8",9.917710196779964],[15932,"93f182c357f528d378dbf378de2fd6b0bdad141f47cd23bfbd7aeb6a57687a6a",9.317957166392093],[18093,"edd3e204ce3d83d7c1f88ccac49a7ea5d6afac39570f706226c39dc8dd54123b",9.317957166392093],[17855,"e70db2ef98a4eb7cd5403725e645d32b9cf4cdc8a1643c6d83dd2cc254f42340",9.317957166392093],[13387,"f5fe7e5b7d35814329e3840e349cb17cd638ba28d0caff42c7f65e4602f1a6a2",25],[1545,"c23a817bb362aa4deaa1dfbf6c0bafd26e2920f940ac61ef0d64bd689f7adbf5",9.317957166392093],[5544,"f8c2d010f25d4dc1197256e0fdaf4705dac1b50fd6043fdd4e18ecb5f963f7db",9.917710196779964],[5006,"b9dea40538ccded81d683209cbfba7c0e8c72dafe68b25c52ad9c78843a720df",9.917710196779964],[10618,"a0431d2bb4a887ed69ed443733942619568f6af5cb7aa061538414e3593a92ba",9.917710196779964],[5145,"e08a762a2ddc86f8bd56ed0e6bd6caf1490d3d74b9ae5326e2271846780553de",9.917710196779964],[5295,"206be725ccf1915ca5b59ca54d120bb111abfc825bc9738bb9b4a69ccc5771dd",9.317957166392093],[10055,"c990be5780996c17e1d7ed07fc1022abff34a8b4e5e2b138456ad876e3e504be",9.917710196779964],[12938,"72ae5a1b0a3cdb6702562f76d8544179ee9982af214bbad517442c7585a400ab",9.917710196779964],[8592,"435f2effb93e3d358a7a771f1315e30e6ad49dd026f2d586b291ea828dcb7cc7",9.317957166392093],[3999,"c978c1cb4a5b8738cfd97700df0b3cae176293af70341a8f4c9af5559c57bbe5",9.917710196779964],[8780,"45415cba293ae6cb2a48918ba31fe7bdfe5bdebe8f547d51c0b754858e4330c6",9.917710196779964],[13362,"613a19dd679b53adcc4ebb64fccdb5560d65815bd18cfdaf762d22ffd71342a3",9.317957166392093],[51,"2cfac5a17f943e1059e1360520fd670181d9fe91fc72c76a95ec252c0d0fa4ff",9.917710196779964],[2699,"33d6641488d73901d3471479bd6291ce0a151fb5aefdb68406dd2a7f27b67aee",9.917710196779964],[17799,"e37f635a242867127d35b5ae708a5e88a87e89c2031c3cd4bb6964793a265141",9.317957166392093],[3519,"e05085022625fd920e313349fb41b66f29a9360f111a93ff744ff9b3a933dee8",9.917710196779964],[1865,"603ea1f74c9ad20d1a6133bff263c46d9fd958645665b787e9093a0ecbc7d5f3",9.917710196779964],[14063,"7e85f143bbdf286dae7940f37299bdc27196d324f9dbadb58ac1765f25ae5893",9.317957166392093],[880,"88eb68b6015e49b06806e0977f310266080e451a6a1bed0e9fedd1f3692006fa",9.317957166392093],[19425,"0cdb321cc38a41e5deeb5747d3261a651b4c866482b8c697fc86c63ac2209f10",19.066666666666666],[18575,"ef661fee49182fcff52300ee4cae6d68ab2b6a5a352ce572681bb0317c67892f",9.317957166392093],[1765,"f5dcf704bb08d49d364c80137b4b057cf1ca4b80a0f569360c135606763e81f4",9.917710196779964],[6407,"04fefe8f9f31321c923c19fc2688207d1d1fca8c5ae985a3e50de050ed1449d6",9.917710196779964],[5755,"663ccd6de07c4a91736839a572a66ced7de161198e92ad74191b589474e5c0da",9.917710196779964],[4699,"b3da8d8fbf11e485854b0db6b4cb02bd9b0dc1479784c521c1fe893a225301e1",9.917710196779964],[3537,"e8976f6885eef04bb589a67fcf17de7d340ed7623c6cdb5eee2e212da5eeb9e8",9.317957166392093],[15498,"431a71c940091153d30d1fdf59c09bf3e8fccbf9cab51f486a150a87cb822074",9.647446457990116],[18706,"aac7f97d4eba3f084170e85fcde9d4e8183d6a898019869c02f17df98e06142a",25.60096153846154],[15717,"c96e8b67c778c615884a7c62158ff0110993ff45698bb87cf5b611d573e0216f",9.317957166392093],[5381,"777d1bb602f05476cb8b32d3423749e715cac3bee314cec3a4cda8b06139f3dc",9.917710196779964],[8029,"5f7fd4d52c77ef0391350ec72dc07206a215bd6532797e11ede0e25d65ab5ecb",9.917710196779964],[19805,"0dff3b7b7a3c5389773bb28dae456f7e6438338d51579851b45023994ded5502",9.317957166392093],[45,"8f558083d449b785531ae8de314f070a2cf00546e7153577a55d278f2bf6b9ff",9.917710196779964],[529,"690d59710f706cad8de651c8360bbfbb5d55695e1c17c0535705132a1f367cfc",9.917710196779964],[541,"05b643369ffea0a65bdf34af0684a3dfd345d56fc5046b1131089297e55758fc",9.917710196779964],[17622,"e372a2af4e0d52a0f1b2fc6da3575df2fd342e36f374e6050b9205564964d444",19.073643410852714],[2830,"b9dfe83d8c232d8dcda5a7223cc2fbdaec6ebc83ccd4fd574faba871918d7eed",9.917710196779964],[14640,"935ddf288d72a2f2064444f6bee05760d468c82b3fb2993a3b54a4f831652b86",9.317957166392093],[4609,"11f01be66a9142e8f67486489f6a694b63227fcb8186c2fb45d38cb6453e91e1",9.917710196779964],[15255,"2109af3f7e221674940a76a5527d294b6da245792629c4739160492c5a865779",9.317957166392093],[9941,"46d5bcbda70b66032648e5c78b7b02e1894209b1a355453c171b15e2447eb1be",9.917710196779964],[19489,"a7ab0eb96b336cbb844f7015b41a040a8a3f65bdeb9d77ff94ecdf3d9745c90e",9.317957166392093],[3526,"e816a464a39d8c1dfa59b5a2282fb39bfa79e4fedd70e402d92a3a3d9c1cc7e8",9.917710196779964],[9728,"8c0b5c5e4430a63060ee83b3f8545387fd856fe11baa9a666d6864a3586420c0",9.917710196779964],[3781,"ae61ac2d3615ca0ceeeb88469691afcfc3f42cd19e4937d121f5f795454b12e7",9.317957166392093],[15343,"9e0423ee73d1d7b1c1aa0d78bf3954679381abb0bdbded2dc9683aa477ef8077",9.647446457990116],[9874,"29c4572c11a5ff6d3c24f87c9ad69ce1e4b75ac44a5cb851f9342016ae9518bf",9.917710196779964],[4269,"d7d5381c6a6fc94f21457e905a6c5f0b076df767b247481d004241337e32f7e3",9.917710196779964],[422,"dcc61d066b828074190ceea6c1de007a684367938d4d17ae371d5a99dcb93cfd",14],[19078,"c07349d268c05188134e35a4812988593f58dfdce5ef2f04fc406ebadd3fb41d",9.317957166392093],[11309,"7e8101b17b1b39393e86698af14eedeffa3b96e87992ae7f345eb6451e96f1b5",11.165035877364645],[7614,"26974da62d0408b8d5abbe3f17c6a1c95ef504ce86b4c73ea6497257f9ab1dce",9.917710196779964],[12092,"844ab5bd163dc472ceb0966fd5a171c849de63bf9bc93ccae293b66586c5beb0",9.917710196779964],[6010,"7b64d27b72f19240cf360aac6171b0f19120eac06578a9da019862197d0703d9",9.917710196779964],[1951,"8ea8e9d89010f23d9d855e68b1725de773a8008d7f7423cbdf724fdc063c56f3",9.917710196779964],[18394,"0458655c5b911fe3abd858bafd1a61db905a55cef6f577a50033e4a4ff239433",10.052724077328646],[5753,"b27df0e791631b02795e390700e00754f5e93bba6561edab9ef53c7eb702c2da",9.917710196779964],[12625,"b94eb53b179f02615eb988fd6171c38077bda8dbadeabf0f6fd59a6bcdc31dad",9.917710196779964],[17168,"80d5374c01a3841d3829f9144b6e1766b928499af3cfa07cffc31d1f4d3c8b4e",9.317957166392093],[19179,"e58aba956e0bb2ae10ea79ab4a761f4260a46d981f751a82973507a56a7f4819",9.317957166392093],[19151,"483e5ff49e736b23f748acc6176a91759be1fcf1b6d401ea634869e1c3e36f1a",9.317957166392093],[3368,"0698cc503b5eb5182bbb25a209ee39125e3f6c752c4c16a5d0c260ff7c7df2e9",9.317957166392093],[12659,"d87f475f5b67503d5a439c23103612dac6d81cf9fb6ec659238309f38d3ce4ac",9.917710196779964],[12555,"6972c5f78b2582ab91ac08c22faf8f79c3756391a02230336da35d229d6399ad",9.917710196779964],[8086,"baeb9a1d0005edce046d9be100598776a98a5bcc244191ce7d1cf2ee9b6de2ca",9.317957166392093],[7959,"919d8eb94164d3ceb630658e20e0e200250aa1c57e2081be8a6c4eb41b9ed9cb",9.917710196779964],[6351,"3d234826c05bdca11aa478c14606300206b107350a52fbe5f3d2e0078591aad6",9.317957166392093],[1408,"a57417ff890ae3a443f7a0d8a9c86a5ee4226ec26271b8dbf0a72f3be5fec7f6",9.917710196779964],[6933,"e89e4c67a8361f26b9bebe262fde8fb909e3ee744f2257a3b255d91bba276bd2",9.543147208121827],[2600,"9b63c808cfe2b569f1fb4be40b372b959adb829c7d36c61e98aeab2ec02b24ef",9.317957166392093],[10261,"d830679dd16d18481a867ba7d202889a86c026693924e15ba9ed659dbdc1a3bc",9.317957166392093],[4487,"76a24773186df6df76c58dc488b92f0d894aef0fb833c91d5bc0cf4ba02781e2",9.917710196779964],[10258,"e430937144d494535ac63e9ab6f0f5df2ae5fbeb00c5a62dbaecf9a3cc56a6bc",9.647446457990116],[11029,"d7dbc05cc8c8ea2f0e60c2404403022d1a8d321b15e74ddddd545695ef9fd8b7",9.647446457990116],[7419,"18efbab4cfeabac572ed781b6c05ce642dd6f80b5bf558a3fc77cc442b2045cf",9.917710196779964],[19062,"6d29b78126c9c5201e42bc068d4802d1c44fab919507a2f1a413b535e6183c1e",9.317957166392093],[13831,"f4fcec01e587a539e55b05a8decb258c0c574d27e46738ab9c8cc0c1b5b1a698",31.753424657534246],[3220,"592f6502ad3daf9ce5b069e09ea44a4be791dd67fbf3c076b062f3c8cc42f0ea",9.917710196779964],[10639,"eda34fc2048a2e83fedd2308a39d7e2cc60e609fa40d7e3ded83f1271eac6cba",9.647446457990116],[2883,"3f1596bc17a0e81b430f5504f924f6962cb9986d548709164f11e6f264fd39ed",9.917710196779964],[5686,"74a090fe034c65697532f27f5417779749dd87e59e9c1b13323239b348b422db",9.917710196779964],[4636,"b5ae2edcab137918136c60a5fd0cca2aefcfb2a8989c0831d3427e0bbcfb66e1",9.917710196779964],[13974,"0f985cfc4cffc8ce80482d4d91d855e15ac80ed5e1c3d96ca9d3088c91798b95",9.317957166392093],[7126,"6b3110b03bba64827b390194fabcc87453364bcc547f562b0f7b7609396124d1",9.917710196779964],[1565,"969f8e72bbfc6e98e4437f8a86f31c77e1aa198aaf6b4f3c02d041d7e96db9f5",9.917710196779964],[11074,"b4c0ca5ca9b50d6c10ef5fc52a045f050088ad7ef60c9822c9f4bc22a0a27eb7",9.917710196779964],[9930,"0fb29b6629938fcc3d60c763de8909824418b4d5bb30583f86af414ff928c4be",9.917710196779964],[6455,"4115851afec6ea7e8b5c992ddd4dfdd3f62d767fe29ca41fcd31b8962222ded5",9.917710196779964],[3181,"a6ccdf5dc133699898b4d3be7b48a0d85ad9c7eaca5674e1794186942e0025eb",9.917710196779964],[3378,"1a96f3515009b53e0b588fe69a89318835f37c243b36c337426728448b26dae9",9.917710196779964],[17298,"794014a1837edb19d4c357e7f9bda0a4e227c203426ed71c29e56529db940c4c",9.317957166392093],[17477,"3b4bf7472abbf74666ddac151872325c7f7bc4c4254c5116ab1d1881b1ef2448",16.132544378698224],[2550,"9d85cda6f75c7360b38d2d584b7f4c5d651d98c2962bb1f278cb503997ec88ef",9.317957166392093],[10579,"cda9e2c26443d7c17288bc3cbc4842094061ef550c332193394f10f6437bbeba",9.917710196779964],[2133,"4756faa213bdb5cfa2cec18328c3d20b2eb927a4c7f5567db94fb98ae51108f2",9.917710196779964],[2352,"6ad88c8595d01196f52a3d51d972040c6b0fad98aa66ac30ac45f40b158cb9f0",9.317957166392093],[1188,"d4d38551cdbdff8bd8c281fff9551e108dea69134273360f0d648bc38f0117f8",9.917710196779964],[12437,"aa2f7cdeba2de32ab85866195660ae875719b708d0e48d34d550a306be165bae",9.917710196779964],[9947,"1b71872efb6b4e5eaa88460780e951f7bed950d693a53eab654e4af2f6c3a4be",9.917710196779964],[19756,"ec17647f1e83587a2acaeda1b428f89fd84930953f5080db755cb4736b265604",14.188034188034187],[19396,"e9e3ae1ddeb42ef9e3884a70ea4d5871defe25906ea3aa9a5f5b9368ad2ae311",9.647446457990116],[15058,"35f2640a37f72fe002398ecaa49325a367746103d8479947ab6cc75c562b667d",9.317957166392093],[1563,"b08f755407a84500e41d1fcdebe34186f587a9750642a44ef366fe8e0cbfbbf5",9.917710196779964],[5987,"ab3ff4b1d7fe4254f9f51213c38645b93d9c602f5dd7c3220b526978b16a29d9",9.917710196779964],[4253,"fd51a7dd345d3012d30366b9db3bdd5dd0d1a7bbe613ab887c7c7284982a1be4",9.917710196779964],[1293,"f4bae84e4b9fa20069e606fdc2751d70f86497eeb60bcabb03a674e8f67d6bf7",9.917710196779964],[458,"ea22d9ae96328c4072d9c6221deda5fa52de4e2c4d4412235fb213764a57fbfc",9.917710196779964],[5532,"23eea9a3fa5353bddfb7e12f885f0d7f84670340de47aa98f7706d65f3fe05dc",9.317957166392093],[7752,"86f4c7aa8f13a7dd344331879bf22a0a17324f86f9fb14163aa783d5e53821cd",9.317957166392093],[7355,"b69ab10b1533333c99afc4aa6945b1952ee3a515a47324405f6343b6266fabcf",10.052724077328646],[4800,"b3c44913ac3635488c500c014171cf05f73bb558d5187b0815b0f08f7cb660e0",9.317957166392093],[18301,"c734b682dcfd25a969f8ee6172aeeefb7ed2b1c4e4506f3959c97f4b7d15c835",9.647446457990116],[7062,"a60da4508405b24c7cdbe4156d5c3c7cf60a9e269d7f71608a4264c2392097d1",9.917710196779964],[8260,"455c22801eb831fc24fd325132ac8f21f2c02e3504016f94f383b9a97c309ac9",9.917710196779964],[10334,"5a0ae0b502942123f13fca48ec48ee1b07199bc81f39d1659f8774044ac61dbc",9.917710196779964],[10414,"971b3779135a45ddd1a9d33cdb9f0bbb47178c9d562236d5fff2e876adcfb4bb",9.917710196779964],[2176,"991fec8ddadea828d9a529711e7cd94f649b0bd889121e9e4a5c590c4444c0f1",9.917710196779964],[19666,"0749eb69ea3cd645e5cc7e390e2594d2826bba30cc9f5cf894ef482cb6129707",9.317957166392093],[9355,"4dce193fcfac061e2b7bb1172f5f9ae3a10a9ac009bc0bd3cd5947cafd9d91c2",9.917710196779964],[9990,"fa7aef229401a637bfbae755f20714772b0b39e673a6d2844cabdbf8ed2c62be",9.917710196779964],[991,"4f3aa682db9e881f972192f60562d313c96bac535ad9bdea37d95996a82145f9",9.917710196779964],[16753,"000c108f1b7753fa29a8cc44920ab7e92f7bcee7c92fe498f096414518ed6157",9.317957166392093],[17831,"2b084544dae210ed4996ae8970e70bf365901f6cbd769a34b42f0d883d8b9d40",9.647446457990116],[17527,"85ba748215e25361b396433438406afaad270af92ca7526eeebaa6c3ad56f546",9.317957166392093],[12882,"261d39f37b4d00ee50c6174dde6fbf7e61e98dbb502bbbdbca17703d780f63ab",9.917710196779964],[7869,"162585939a2672ca60ece5bddddc64bbfd9cc5cf423b87fadbe810984a2171cc",9.917710196779964],[13288,"7bd1c3d089edc05a972278978a54aa8288846671fd3c74da2dc68b527b21cda4",36.83769633507853],[9692,"b35dabba8bbe0c0bb484daf6dd85864168497e2bb56a7821236ce1ec354975c0",55.245535714285715],[12550,"dfc12e36c8b9157269eeda2d7e8d46793844180477b22fb97c6f22e10057a2ad",9.917710196779964],[15881,"b3be049c67b04618bd4dd13cc1d74c4955aa5f09f5afae4a593c4ace959a586b",9.317957166392093],[5058,"64ef94eeda4e3f28ff961e07cdb37a7d5700a5ed59640ae7e58bca03bf57cade",9.917710196779964],[18878,"b10cfbe1c2e89e4234cc3ccb8e8a5c3f7d0cbaf0d7e27dcfa4eaab46bda12b24",10.031471016209265],[4788,"176595a2df533df69a296b41670833864fd370e02531c7a1cee31c346aa17ae0",9.917710196779964],[2251,"77a3a3d98c6496499574557e009c57258db5b467dfc527d44e875cbe933e3bf1",9.917710196779964],[9488,"cabc4770575f7553a3fcf3eeb5cd849d371d3cd6a11a6d293feef4961686c0c1",9.647446457990116],[2019,"de55bee401b739c882fac17f9284599be6e73013c5857bdbe6cacbdad78fd6f2",9.917710196779964],[2288,"046c8a6bd67a7bf584eeafd0366d79a2752e71d06d3097c1f0ee574757270ff1",9.917710196779964],[16868,"b81c2e5aebb3729b80c1ca072184fb6796156c9b95f2461d9da498b35885d254",9.317957166392093],[3233,"4e188ee87e498123fbd7a3c44fa038dd86b35f2b9f10114fc0c5c8833a79cfea",9.917710196779964],[17891,"00d20d1a524a9d35d4618f8dbcd9d5cf3cf67a04caff6d9d33e380e3b56a723f",9.317957166392093],[4993,"0486de3ec3d30e5e73fa1deb553752ce88184576d13603e931a5a87469343cdf",9.917710196779964],[19730,"74bab55304ab09c0e44edef7d10a32e7ecfb56f92bb2b564bfebc0c7bddfc305",26.09252669039146],[506,"e98e1173f45f2c590853f15f1beadf37c601d2b02d829d93a34d5b1e7f11a2fc",9.917710196779964],[14246,"10901f1ca3b04e251682caa4f663136af698d4010fe94ce826fb9f8a2884038f",9.317957166392093],[11223,"7ca3ebbd7d3375c9deb3a3c75e59b4682ef2ff1a21e588e14296db3df50791b6",9.317957166392093],[13718,"d800bbd2264177ca0627f0a4c1d517922c3c0e361b21c5e9bf19295f7357fd9a",9.317957166392093],[15113,"ac81f9da8a96637e4f543e9c7da7e583f9d30415ac320ed60b1864d2d70e5b7c",9.317957166392093],[3122,"3abb751f9148f9bee80e95817f9c7b4941ccfd44a525863943d214eac79e86eb",9.317957166392093],[12009,"377b4888d4cd0c7da0d6405193b14f7fb6c72ebff44db0e6f736ed7938c242b1",9.917710196779964],[18976,"90f875cea430c23e15cff201f40c0dc34b23085b19c4d13e50d798b65d805521",9.317957166392093],[10081,"0837aab4d2c13ce1a1559deb274f40a8ae79498788e03c1d619b37d1bf8ad0bd",9.647446457990116],[15467,"0717b956de3b9505621e3e0505b6a2e9e442522a3673e99823117a42241ed774",9.317957166392093],[1271,"7018f528e32de4025905a868d7581e9ee0c0490178a8ac8356de99f257208bf7",9.917710196779964],[9518,"3c6baec64278219113a07154fefc49803c265bacc39681b662560a5d3b4195c1",9.317957166392093],[5097,"284176832193d10a56929e46d979862affd9a6226ec3f81cea7bc6674fea9ade",9.317957166392093],[957,"7f08f3fd1745cfe71132f1b9405b36d374bf94c4c5a26defee23690bb82375f9",9.917710196779964],[15521,"469b3b9fa7390911d3dcbe9d5a2d75fb0245f3b8dd344ffb06fe561eba199273",9.317957166392093],[11410,"a9cc81ab71e28544f40d8f1c81e7426438929fcf0c2c1023d7ab943e4be04db5",9.917710196779964],[8690,"3b450e47a6f4395bc668544bf735019155b471ab4ff1574547bd81191cb0bcc6",9.317957166392093],[13406,"9b3d2daceb370fa00813a2fafdf8479182363d957013555de2fa4db7de8e2ca2",9.317957166392093],[5930,"bf6c2ebaa8755a9944542ecc9a24ae7d72de6d93c9d679a047c9b3f8f5967fd9",9.917710196779964],[16389,"a1b802c94973a016a8b8d044fc216c1663b7996b4a11237a4969bdc95e35475f",9.317957166392093],[13907,"7f13f9778d9aa6ffa702c22fde49c9345a1b3f4dfc7b43fddc88a426e8c3e096",9.317957166392093],[1366,"459593b780dc06ab5d120d0042ce726350cc83aca4a0ef0753572c116742f8f6",16.03628117913832],[9106,"58a3385c3a8b117af5fe24ff25ea9336331eb60ae39fe7742255f717d2a11bc4",9.917710196779964],[11131,"5344ca6056e140d188797b0dc6fd4c2fea6d9b9bcd6aba37c2e2ee4d5c011ab7",9.317957166392093],[18214,"52b9771ef82b842296af19376f3d230859bcd7e7f8d604804e7b0b9027c5c037",9.317957166392093],[17008,"29509fb028d5a95fd2d240ee272489edb51cddbb1a99c51dcfb5f47f220ce451",9.317957166392093],[13339,"87873060989a8b2c62fbc069618e3d6099f5924359d020117952bb284cfbd6a3",9.317957166392093],[13721,"c2df1b984caf174fdb6fc010d068914ad6dc5976c64403520e6b3a3dc718f49a",9.317957166392093],[15077,"85b9317e6b0832ea6c6f8be2fef3b9df4992b562f054285d5e7cb4bed1111e7d",10.052724077328646],[1481,"73dfba03a594714b366933bc3dea0e48b195d0b1989b58a962d8453c186e43f6",9.317957166392093],[3430,"5d9746f7ca4a5fcaa6ecdbc5e304c333c07f6e0a9601ad332716abbaf9c17ae9",12.064171122994653],[187,"37c01b94907d5598ec7f6b6b59c89d816c82170794566a87c70eb826e357c4fe",9.917710196779964],[16498,"8a78bf031fb9df4bf2e5405566b3aebd9772d9bda7eb9e690b63cc0c87b04a5d",9.997888067581837],[8166,"d590f8d46be39b2fdd56258e4e94ba36194e9305a390242cc90bc6dad5d133ca",9.917710196779964],[3331,"0e2c2979132fb353c463bd2e93f1b39173edb1c793fd3a62c02c7d1d236729ea",9.317957166392093],[17810,"66445c7f15bfc79b2a2c78da2666421b816769356dc7bb91990f662936a30c41",9.317957166392093],[139,"dab6497860a733d738d8609922ac520b81739c4779ebc1381ddd7049705313ff",9.917710196779964],[13411,"30d19e5ab1d0788f3a595a2eea76b9638bd4c97153c63f41d2ace8fe6aeb17a2",9.317957166392093],[13779,"08bc5df547405011c902f5c3b6c19eb83c56773da5164c1b4702801a52f2c099",9.647446457990116],[11506,"4853f7496ebc899cbbde1c21eb5ce3fc8944392ef12edcd81c04716aba8579b4",9.917710196779964],[16828,"87f3bcaf53918dfce1d9b3bbfcf3955e383e4f72eee824f591478856511dbb55",9.317957166392093],[12704,"f8a55198b3051425ada69b64dfbe347e0e5d14572b47a940402be4b6ce4594ac",9.917710196779964],[18038,"80c7feb3ee7b85675e5aad706947c8220f6dfaab630771fa260b3a9e942d933c",9.411764705882353],[18051,"8c795ffed3e69052d0774eb37a54e035781238b7de12fd5d12b1f8c195b3273c",9.317957166392093],[11976,"adb3846cd536504e48c5ec340675b216e1e1433fa77de3925e924c18992076b1",9.917710196779964],[17682,"46f21518095306d55eef753331784f5ebb4812d03ca178a6cb578862f6dd7d43",9.317957166392093],[10395,"5b9762edf4f5a4326a74fb7b30cd7c041608291bb9c25dd461fb6c05470ed3bb",9.917710196779964],[18335,"3d24fbf299c5a258c2c606014b6d27e8e947e58b23809ebf8c6a0df7ce6f2835",10.052724077328646],[6665,"5f2c71ce603497cc4eaa23400d0efde5809d4eb0eaf99aa9b54d79530d9932d4",9.917710196779964],[5651,"293fb3828490c8df1967a2b816890527598d11d02830467dcd9227a8d68e53db",9.917710196779964],[7,"47002b51da3f2ea398ee61cba1409c5ec76e2d0e6208c49a0bc41e3de9bef8ff",9.317957166392093],[13505,"6322aace99ce0e0b7e4420d83e2635c3eda24fd90f5368ad4c13bdd245c5ae9f",9.472566371681417],[8819,"7c9117ec36d14c68981d714c12d3639518ea96c2d74824cd6366aebbb753fac5",9.917710196779964],[9783,"a51e8f858b3af446341248471d7f8f84d1e7503d3cea3d8a119e676dfa7eccbf",9.917710196779964],[18368,"7cc0bff1338116f0c51c48017c3ac7e42dd431c6587c030766c18941af4d4e34",25.294077370763436],[6471,"2a0d8a0b42b0f228939c33f8a148bc182553763119a03cf7b245e3b9aa12aad5",9.917710196779964],[17248,"47766b1b2e55cfb75268ea418b035fb71ae07064e5c906c769fce8efa86c054d",9.317957166392093],[9965,"cdc1da91ef1ca02129f5b5f2198a1d27f5b625f21c8eeba9c7cd86ba487086be",9.917710196779964],[5678,"fb8754cef8f6d4811eddba8dc99e65a1e9cb11b8451cd6551a931c6c67c92adb",9.917710196779964],[7516,"56fb83c517f9218855e50e1e13c30026139c522dc3a67df02e7053c83446abce",9.917710196779964],[2072,"495b837f17456434bf1ed4031db82e769820f3b8d31695035f8d3cdb659970f2",9.917710196779964],[14904,"f27e9693a0d44852e34fc596b219238ceca40a64ac261bf92a429d6e625fd280",9.317957166392093],[9258,"a8bfa8f889fe6c6d73100922f8007cf354087a79e876aec29f83d03efe9d17c3",9.317957166392093],[13902,"c960f91e8ce412483ef6d61eae3ecc8669709348640a378ee5161a344ba20597",9.317957166392093],[18024,"6fe4282254baebceb7ef9cfa953af8b198e60de24d15cf34d259fa8d63a4d23c",9.317957166392093],[10109,"c3e74285164f70b246b3dc26e621ee7156a762958959361510fb744e5606a2bd",9.317957166392093],[10282,"2270a08dc672e0a4974486ef1451c2c9070d027e1f93e12e93611f4e351e85bc",9.917710196779964],[1162,"bd8fa52281c11c2edb09101bcc6f5fbc94f6596ea627cfa6409fcd54b34e31f8",9.917710196779964],[15701,"b7c9d2b9f334a057311fac024194af14118da01470c32e9aa73fa43b3005776f",9.317957166392093],[19374,"9ebc48c8752c7d747f2582a97ab9a216be0bee7998cd311fd37528868334df12",26.173719376391983],[18729,"553b72e565af698f76ba3b9ff317c5bf4a812baead674c2929b15b10f09a6129",9.317957166392093],[8363,"612fb8b5ac9ae50e583d8ed87874ec8ffae77bc82d1588e6054484d841d5e0c8",9.917710196779964],[16791,"bcff74ae312297646436101a925ae0f28f1cd69e7eb47bdcc1e12091e1468956",9.317957166392093],[19696,"e032cbf753d001a417a2c9f00cd552a209b67410984ced02f3b405f98f09f206",9.317957166392093],[14218,"7d4fc95a9bdb7ef729b4b0030ff2cadf46296f72d9a4c586abdd718d24d6b38f",9.317957166392093],[2630,"39627ed5af860b056ca09904fb99b61977f948f9a97abaab327a7d0665ceffee",9.917710196779964],[12922,"06e33fb12204ee12ed269e5a885e9f54e9613e0acef467f69fc801ebe81929ab",9.917710196779964],[7748,"455030f3f14c59e8a5db3e016af9af72dea1ac22cb2fffe489c69dd8f48126cd",9.317957166392093],[17703,"94f989c14fc12e66b39ed1602bcd5d33340c18e9081faccd1d4752d626752243",9.317957166392093],[1745,"55440a36630e82e7a088c9612dd490d781236d2ab08a0754fd93de9d0dd3a3f4",9.917710196779964],[6555,"b979f0b202de5d12e10e7d1bc2b352214379f5bb94ae2b1cb5357a9628d4fbd4",9.917710196779964],[3705,"6f64024e5f2f8f37f9a094ea8104e8f8453da6404870eae0d1dd22e3da9390e7",9.917710196779964],[8360,"d33f99e72bfcac1169b835a904a73e9940c1475d1bb68841c870e287efdbe4c8",9.317957166392093],[16057,"1035545e44793aa6366fe6671b6449a428dc618ced0f7241623d5dc1d4134067",26.117860380779693],[7153,"03ab17a664fc4586aea87d6b4b1871a8f48e7b323f4fd1a7c9a38602e2baffd0",9.647446457990116],[17927,"1c1a89a684af567618f7c9cd6f6cfa453790d1552ad89251b95f0fe164b3bb3e",9.647446457990116],[10710,"9eaa4e7cc37ba06e938e09fba6532308c168b3487fccfa138aa078b48815f7b9",9.917710196779964],[9352,"f35177e96fbd9ce663eaf48a21570287a1d11297785888efaef705b4052a92c2",9.917710196779964],[17648,"28a987e4ca42149b68430b26c6556ed28e30543b4225daa9a5978b0b6c1b4844",9.317957166392093],[15045,"a7e5138e3c7975cd2c4410905f91c355cd17476205ce8414e9574b0bb75ea97d",9.317957166392093],[15677,"590306b2766cfee28ed39ad9109e52b817e6185bc27a6858b0d200c09d03e96f",9.317957166392093],[4318,"0788299607c1494fbbc7a4b5a522c25ae8863304458ed645fa9cf349f4b2a0e3",10.052724077328646],[3350,"bdd7523cc478fbde5c8df7d9cad52e79fed404326271fe27e8db754577d002ea",9.317957166392093],[4754,"46bf6c3db0cc4dcf515576849133c2a6d230aac5bb5e1700a4594fbe4f839ce0",9.917710196779964],[11241,"1944f68b2f350f088204f1ab1af8bc2d2521b6394ad242563442cb5babca6ab6",9.917710196779964],[1082,"c0809f15776197e07dcb7433f6dca5e22a5e557e0265d85e1dea29659c9db0f8",9.917710196779964],[6343,"d701cfbd73f80945365e2cf169fd88d511cc76e9cf157b5e071dc3ad5995b6d6",9.917710196779964],[18434,"6b0953b39a13cbedc69c73e61595b697df9ec11edeae09c8d613fd53e511f332",9.317957166392093],[6685,"0359d24c8961834ee7b817763f8a5b1809eaa8a68804b94345a7112f986014d4",9.917710196779964],[12507,"278d5cce1b528dac565d41bc0937bd51be4203f568927d6b426d5d564203ecad",9.317957166392093],[18945,"b9d9f768a6394c8ed9849d1cfa284279777f39d94d10e932acf62ef330344d22",9.317957166392093],[19729,"24c164e342c256805ae6e3aa1ce352ef513ed134e4cc5f077baec227cb59c705",9.317957166392093],[17550,"ac41a605bfd0cbbe37803aac6a5fc25159fc74554ed17a9f02fe46b21db87246",9.317957166392093],[13180,"7765928ff39af42cc88fd3013f9eaf809a3f181f74d989778fea068b02bb64a7",9.317957166392093],[9596,"3e0a3065a47760802ca8a7e28bbeb99950aa9a7ab489e2b2367fae6ab11b09c1",10.052724077328646],[18090,"3d247480aa7fd50bcfd74f301f682e6f4d40d5ca92c8758505571558c65e443b",9.317957166392093],[4912,"bb7a52accc0c15af834834e87a802af2ce334c003532521ef58f10b94fb2cadf",9.317957166392093],[5594,"50fb6e45270ed775569dcef07ac4959be560d3be992010898d7cf6e62e07abdb",9.917710196779964],[8776,"6dc12beda42e7a5cf5e052e474a6d436cd5442ceb7d104f223f0801e60ad35c6",9.917710196779964],[13118,"eb3eb2d3f2aa55ab58c698fc949711e769c9b4cace2040065e2887850af49fa8",9.317957166392093],[3832,"df686f2c3523059d37570157afc9cf787b64dbbb90876caaf97ba44cc430d0e6",9.317957166392093],[16176,"4c362bb85acaf9495b0cd98722084097a988c0b11691b3c72ab3e71217f47a64",9.317957166392093],[19211,"a6b55e5581889950c1262046b0fd407b2175ec8734bf38f791bc3905e6506618",10.052724077328646],[4007,"0fc2752967a06a353d29570984f4f49621b9fdaf2ed421a8a786aaf35f2cb0e5",9.917710196779964],[12856,"f8925e7984c6f7346811e773d555650054b1111eccab99b96192c9e38e3c87ab",9.917710196779964],[13580,"27ce98bba1bb41ed7852907f40a3d805bc5ab2e5dc5bcac0101db06f3390e09d",9.317957166392093],[4731,"34cab9c685737ddbd81335ffa2edfa3e255454d7ed44913fc52255ee12ded0e0",9.917710196779964],[3332,"9667fa1e32cb9a277cecd2aea018bcc4215601fa907841081b7b1236f05f24ea",27.094076655052266],[16503,"0bb87f9ff69395702577d3b7cb02e5cce5997c0ab3cf3d60c5da6f9fec2a2b5d",9.317957166392093],[9527,"bc9cf24d0fcaa5781bdd432b9804190a2a51840396efe2f4befbe44f2d1283c1",9.917710196779964],[7439,"1382b807faec8372a3d78a0af87d2f641110d48b1eac569b4fcde3be39f624cf",9.917710196779964],[8433,"91e544bdf5aed53453fb020fdbdacd17c78d55349578d027a388c98a2eea70c8",9.917710196779964],[2221,"858387e9a7c62ff269a99e5fef2eb3efd892d1c5374fdb7c25b357e17d9460f1",9.317957166392093],[13977,"1585aff326816ef219031a69bfc1843d08ba6c42bfca48e23bd74211d3608495",9.317957166392093],[7197,"6bfa1bfb4482f451302cfb35490c843ca2db9425eea73c52ff84b79bc7d5bbd0",9.317957166392093],[5204,"a342ee2542db6b1eaee72859082ac618348fa7438d5c8c8a8131e372e625f6dd",9.917710196779964],[1920,"42422a3a53e3af9064c490ea5123dfc9e0818c458f685429590760a1638289f3",9.917710196779964],[10391,"d9d95eccbbd959d69419232e94c80da1e606bec30fd8854c2f3078f4d30edebb",9.917710196779964],[8992,"dabbcf9bd1839e7f4ed7bf01952105a8d9a698d7286d168a3d3b29b688b4d1c4",9.917710196779964],[12204,"524de4c8ae0c3a7439f763a009dd0123d92db1554cb02db567bec5b926a00bb0",9.917710196779964],[11762,"e2f7fa08c20b4df9f8f9fa2d12af621df7267cf831d7d0f70db06c3eb768eab2",9.317957166392093],[495,"37424e134d7477ff91dc9140abcd48c388ec644150ad3e188b5ea390bfc5b4fc",9.917710196779964],[17254,"ccbf4fb760fdd6af21c9f72c0117fe1af1242a676a5dd69b6fdbe2779271f84c",9.317957166392093],[4965,"d7794bd2aa103efcf76a901aac75d6b03f1ce24279d05ebfce6edc3558c66edf",9.917710196779964],[3756,"b265b72ab475f36125d85908b6d66c19373a9efeb78a9f04c8f1814b892c39e7",9.917710196779964],[9340,"102262cfa0352c835d0fb0767c5b05f9c6d1d1b96fe7370bbf30136d09f7a3c2",9.917710196779964],[15155,"53b6a3e2ba2ae9bd894c0798bd3f6331bd11a9834121e421b25331c46bfa677b",10.052724077328646],[16653,"8955275de9af8f7bcde4b9683eafb99038d4740b4117c9c61d31b5f0d84eb859",9.317957166392093],[7210,"f71b3a69798e3c68e47edec23b86e85c026c24b377b2029b512290c6e5d6a3d0",23.15541601255887],[13910,"33767963a5a5fdfec3cd6445d3dccbc2809852f715dfbcf0a94b06f375dcd296",9.317957166392093],[16383,"00b41af1b74e54cd93097070faf8d213387be60ed415ede16e2b1de9db5b6b5f",30.94168201350522],[9852,"c5c935b05f36210e6ad5d8bbbcdc87c944203785710b940dd82e5f81899d4abf",9.317957166392093],[15923,"5a20bb048ecf9284f15e96c8e0f9e68556650c90f98ef881b55657ebb034a36a",9.317957166392093],[8725,"b856f6b5a8e8842973fe84cfb6ad4436cbbf083cf012d16e95c7b032ba5e88c6",9.317957166392093],[3743,"39c9a4cc18b190d6ed81d6f3a9d31af0ad823e310e20f57160a88d6b527549e7",9.917710196779964],[18392,"eb82235e3054c619d44e32a3746a716bf17fa430ac6bbd6d2b21c41c32339a33",9.317957166392093],[19588,"e9ef494e4b78fd1cc2bc43f2a081bc3517343d1c9fda103357b13b8ec0149f0a",10.052724077328646],[12101,"fcdbb66ba24856613ddf3a24ad69c2d6c7922643380a7bc0da1e8d74e04ab1b0",9.317957166392093],[12476,"e0d5e127b98c60e16c250ebccf22037f743cb455b652bdc5318b331f1e551cae",9.917710196779964],[18663,"14109cc7467278cb2afd996e88c920a94e3b107dae9cfcb76edeadad8a24282c",9.317957166392093],[11546,"2b0d2bb3805f44e7606df27f0a928d7748588303763a361dcd42f08c5c8c42b4",9.917710196779964],[6152,"0ce655f6daa45268ce1811093aaac6c19884b7ed335465279560a3c9f93823d8",9.917710196779964],[11919,"454bec99360864b66a234724bf8a90790ae39326bec8a031394184fce93ce5b1",9.917710196779964],[16326,"8178f5b7d4ef483c866efdf5959bee3313b0789f442022a70a1a375e6ffb7c60",11.894551845342706],[2462,"289fa753bbf45086c7c055c967e231db21828061c1453f4c8f3372268c571cf0",9.917710196779964],[6517,"c4e561b7c59f82cc684cf90c7aee6ab13d5c541b9d8a4e4fa8df615ff94549d5",9.917710196779964],[6593,"9d224e44c077bb7cb5815609309069da5b429c638d8531e868315434ea39b3d4",9.317957166392093],[8563,"b45894d6906ccf09de19ed33ab4b5ea5ac56e2076d98592ffecf3292685fa4c7",9.917710196779964],[14980,"bbca0718f739eb9f103a28ed1f3b5928d93bc29e38bffbb944cd0709fc0deb7e",9.397642257991386],[3812,"d713ae15b879833ca68da27770c3f9c774921e6b432baecac203c4a0e961e6e6",9.917710196779964],[2958,"b6fd629b632412d9cf83df4b4e220220ed39ad9d14413c62d0e55cc1c62499ec",9.917710196779964],[5623,"dc8919636e1f35eceea0fa65f6de6aaa5ade94920d4abfe952387eec09c786db",9.917710196779964],[14958,"d0ee0c51beed7313c54795bcb59de90699958e129b8b25308ba6e3d702c1857f",9.317957166392093],[5332,"cdb4eac7e10dcc50d22d92bccc766c511541e89bac5f31078800195c36383cdd",9.317957166392093],[9434,"7789dc97a90e7ca792a1310e2adad76e8e283b596b4326eac9d01631995120c2",9.917710196779964],[1456,"d9b0603e8cd376e3f98970b12e44f0917717e4ef378ea7a8c5ccb30f2ac977f6",9.917710196779964],[9751,"a33fb01bbef409a107e8dc0f638d7043c662d29da95b3efb0c913b09015b02c0",9.917710196779964],[6042,"2b06ff9365a7ddb81e558ea0af14fc955e67f902fbdd84b8828d580f207bced8",9.917710196779964],[2107,"d466f290f169d53b9b917a3960b95689e098d286097ce8010b9c3b6ef47231f2",9.917710196779964],[8752,"aa47d7c8a290f9d37175a95d492d33ffba682576e0385e3b3805293426125ac6",9.317957166392093],[12979,"93e3a5074b9295cbc230ffa34beeb35851fc5da1c5ec0831aec3ed9a31a1bbaa",9.917710196779964],[12666,"b37c8a1edf984bb32a0eefd2985db7506a806e58fb1baadcaffdf4e09cd5d2ac",74.81518987341772],[13550,"395ff31a81f87fea75a62211f7fbe7eea3fe3e037cbe21e504959a20beeeba9e",9.317957166392093],[5374,"1fd3b779ae51e95e86ac3d3f8ccb7c0ef01c9f683467bce3dc931255ea94fedc",9.317957166392093],[2761,"e7895e068daa5861b1ba4042fac50fe5b23e937f311cb0c884d386f30cce08ee",9.317957166392093],[7954,"dee413167fed8e7b6a93a2e77aee1de73d08c99f5f0a15a06cb1bf7dbcd8dccb",9.317957166392093],[1505,"6d73e1bb4651703046e72a514a73d0a663b3b6fdad97ec91f2d0566e96af13f6",9.917710196779964],[377,"307cd6e82a61070121d58ab576d1bb58aa2aa8b0adc27fed77b058cfd7e081fd",9.317957166392093],[15392,"08210b2f954b0696a100ea0bcc5092db3e921a58e4e3e4c02190f064088c7076",9.317957166392093],[868,"711946b542c5744c55b8c51471f8f59ccc8993d4f371e69c3d3b74bd88491dfa",9.917710196779964],[11827,"c4387654703553e81d0572387aeb03c6ea127c7cab0387efe8beb6099de189b2",9.917710196779964],[3617,"4bdfb8ad89bf724c8fb0b2a8ed44a6dc79490681f1e96ed6f43d62d4781a20e8",9.917710196779964],[17403,"5cc5f97939e2a8632430ad862d554149687626cb5ca577ab5f67adf5256eb749",9.317957166392093],[19834,"7d63ea62153d89b3277af5a38ad89e6345aabecf85e8b1ecfc78cb43f6086b01",9.317957166392093],[18321,"1c7792fc93cbb79552f2edf1d5df024b16ac7ee0eff3e1812a7e431c4cd07535",9.317957166392093],[4290,"95ab73036cfddb2a0cc9212699f2a0449f37180e3474c602f8cab70b57e9d4e3",9.917710196779964],[13192,"1d132ef3845146495923f11321cf522bef805a2f84a9323f57d2f1cb728d02a7",9.317957166392093],[8852,"94ce29ce22303e073e88bb645948d58a904ad4d0121521cec259cf4a1dbfc3c5",9.917710196779964],[17532,"cb36dae4e3c9e409c48ecbcce9bffd1de7d5322a8b47aa389cc36afc1bbae446",9.317957166392093],[15093,"dcea497f7b7a263ad45652e3d1e1ff139a91336cb0d4f6dff6983da71606da7c",9.317957166392093],[9377,"3ff0d2cd95f5a440ebaf6c05c56a69511aee8facd84da7ada600e9a3adfc63c2",9.317957166392093],[8931,"9a3d8959814134189eaba131deebdebd245b99952b7e999091890c571c8e4dc5",9.647446457990116],[7820,"db7ed9cf6a157a949460f29588d940564819da00a35cf14871c126da1537a4cc",9.317957166392093],[2954,"42eef5f6c80ff6f139016f2718b00775dda965143606c8ad16460fab0f929cec",9.317957166392093],[18236,"8b62c562e53218e5f0af3eb740e71decd7c39271868639a38285f049bd054337",9.317957166392093],[10608,"42f5f8f70434d6e203bb4a9220c37f0f2b826349f6d4b31bfe6d21e5eb0e9cba",9.917710196779964],[964,"c9847291459d92da2440f21e96dfce5b29f2d0154f8bb05320479c40d0da67f9",9.917710196779964],[4509,"cdb6777db09004cc5f363a4e1951347d4bc7118b1386daeecfcbae33e51c4ae2",9.917710196779964],[10875,"9481adf4195db2e4a9e49df2439bb9e1161d1983a286b1956b8ab9e6d9e6cab8",9.917710196779964],[13957,"6397a19876ffb204ca5ed9932c238f95dd0acfe50b3a76216d0e26470958d895",9.317957166392093],[18795,"9c1b9e4830decd6f67a83a70d543fa627812b7a5bf1ff0743cb5f36bf6de2327",33.171110718700334],[11689,"a8297cb4883232326f752319f0c16198a9c328fc9cc3949cf5948267108e5eb3",9.317957166392093],[16597,"e46317819243905f6f2b2e810cab19c43e6c0664bb4258eded6bfe0518a1f55a",9.647446457990116],[7625,"7db2c041493bdb63ffc093a25388b8edb5a9984f5e468ad361433e1cb5b70fce",9.917710196779964],[10341,"7c8cf38f2087f982bca14e96f587653120bdc52db5a129f7e7605f2cf8d114bc",9.917710196779964],[3234,"ec95e337f61df6c11103f0a90c0adc1b98c04caaec859a11a56317fabfa5ceea",9.917710196779964],[8565,"0188618f428c35bc68d4edb56992e0219ad3560ee347a07e003fadd0c857a2c7",9.917710196779964],[2153,"612c18bcc7fa31d99bdd725285a698a4ddbc4336b36d9a910fda762c7e73e3f1",9.317957166392093],[17263,"3a5048e04af1e64dbb7f02a3bd9533ab26fa951aa221c71061beeb096143e14c",9.407572383073497],[630,"4345a2b78b4f4181cdeed3c202f053215ec435a979478f2b92f450c26963b6fb",9.917710196779964],[14772,"761783194ea1977bebbdda21f5c85b980840c717246199968c47c70f43fa7283",9.317957166392093],[4475,"6227003bd0cdfabb33f5f2a2e5a2ebf49ca39d973296a7d8b12365397f3390e2",9.317957166392093],[359,"f247847a8a6826866e92b36f02270aa3c255c17c181a545f3b0c109b2bd8affd",9.917710196779964],[15310,"5d0b04a7d48b7a8eda45651d1c5b9e06e59a80f7574a523837cd0134c3ff2c78",9.317957166392093],[4702,"ba67c44c77654d49839c8d26a98535ef50733af5756a8f7e52b67c6d78d9fce0",9.917710196779964],[1135,"692d313a7446164dd986428e9e3c6ea45b6d88a12bdd58e0ff141c755aa762f8",9.917710196779964],[17478,"538fa899af62af2dd41cf514e68e875e06b593588f821b4d139485300cdb2148",9.317957166392093],[15525,"865d6eff4de23bc36ad9a0fad09245f641275b95f9fdc843e6c6d9a7f7da7573",9.317957166392093],[5185,"d6617a7dfbffb1f90abb4af6ae8e843126baaa684c0a04a568606fa3c95811de",9.917710196779964],[8963,"f35e6bbfc1ff3f4eb4b9fb4ea608cc6ed96beebbb53d861e5df01b96b0ad0dc5",9.917710196779964],[3916,"646838237df607e8de3aa1b435d65febfcb3004d518c4b7a5f6208102cf03ee6",9.917710196779964],[13270,"6a0f10fa7868fd21dcd54bf7f74c4aaa5e3d786eb1d7a665726d8a9f3bef4ca5",9.317957166392093],[18230,"4a45832fb73a016ca8b61efd999bf0b540d3eecb26a63a9ba274082123515537",9.317957166392093],[8830,"2addd32d7c03e6a03b72f05bde69d78eb2cfb784d7a511b4ef26a3ff2901ebc5",9.917710196779964],[3119,"7c1a8e1f05e2e83e04de6676a1f39fd061be807645cb7e8059f843ee06508aeb",9.917710196779964],[17450,"cf6b7a7657588f06921d6e0745e07f5437932f00aac8ab8a396b16f467e8ac48",9.317957166392093],[1987,"998ad5aa35a85e081ebd62222d9ed01b5717cdaa53b2e64eccb4a3b0a54e12f3",41.35472370766488],[10854,"f0493d8d7fa523d952082a42c09494251ba6f6d72b69d914736fc35fe77ffbb8",25.912263210368895],[13090,"24268dddc7925c193b4c9efe6668e64403e1f79e243606d7f29b4bdb3de1bca9",9.317957166392093],[9114,"0294eda34cdb73c88ca916195931af0ed81e009f35c64e5be7bf0c27f3370dc4",9.917710196779964],[18391,"ead012e807120d61ea3b61adf94253a5c2b737e2afe5060dd3ead0f199599a33",9.647446457990116],[18870,"1bd1981b14c1764c34e907210d59eb9dcee3d8f88bb86de33840eccfe3125624",9.317957166392093],[10721,"fef48a91a32ca255bf25c695c824f13414b2ef16281bb743157a148d023addb9",9.917710196779964],[15951,"d4155c0916e2a8f23bdd170dc02c392786dec17ddbca81840f891a2664a3ec69",42.26310160427808],[15017,"f1f2f0f846ff9d25fbcc7c61e18bf7e0399497347b8832946b14453f744b077e",9.317957166392093],[4741,"e372f597bc3f732a9b6b351cf3c12334868d5f1e15f680e6b9bd3c9612d3b2e0",25.426621160409557],[3696,"5a2a70ebd54893d9c606d0fd642e2ce5c3c4cef19e79bd31517400f283609be7",9.917710196779964],[6604,"3236c09713981680b48f7b4754e676fecbfc9d2f610ae5cde3bec361e1309fd4",9.917710196779964],[7785,"a88ecfcabe797f14063238cf0d2df86aa71573f4aa181a4d6b184b830933e8cc",17.97173144876325],[4376,"6df0292204ddbf0c014a7f5d7a7b8d128926d2ba7f730a3df7c977dc46473ae3",9.917710196779964],[14237,"c58cf5c13122f79d5c42ae9fa6b91d9286de802398a35e02ef6ff2be49324d8f",9.317957166392093],[7769,"b7b3eac8817d2ff771e2da91db6feaae1f31ff6913e1bc297c5b66c35bad03cd",9.917710196779964],[6970,"40af274d03d8370fe6a6510b5df4dae0920d3b7fcfb6851438e9af924b3129d2",9.917710196779964],[17096,"6a6daf63c4105d4373cd4c5b232ef501d34b17362160cd6123e9002e43290750",9.317957166392093],[11523,"8cdec609689dc4a42cfa90d1bb2db12529248246a622a9112e7fcb11ab8561b4",9.917710196779964],[18125,"ee3ed7396d9f6219b2f853f178315d2ee9e95b4e50292edd24bc61c6cc67553a",28.899115044247786],[6839,"c0531d615b2d7d71fcb6f373ecd69a3c02d203e6d5c0dba0e18abb98aa0503d3",9.917710196779964],[18777,"522f9413fcfb213f561ab3dce14c6c11db54d694ab0aee4e5fee10bd3d44d827",9.317957166392093],[6065,"00839954bc75d44e0fa786bb91a04d3a98a0d819fb853c555ef5d7b82467a8d8",9.917710196779964],[17504,"a416b608f5da19e36988a5f83e32f71ef4074d5571dc2a23227ad4a5f94c6047",9.317957166392093],[3757,"0708520c72435b8928cf63d6e1edaa8d827e4d3ad48b18572a4873982ea734e7",9.917710196779964],[13993,"cf076f9d4c656f4893e54cf1a2e1e1e77358f1a0f641c9a4ec4d974a17fb1c95",9.317957166392093],[5101,"03def356f984cfc4db33544b2816523fc030ce30543ea811661d8bd7587792de",9.917710196779964],[5603,"eb5f0efa168a1011e72cd38d6ee453966329691943b41db8ef4ec1f43eca9edb",9.917710196779964],[16515,"873d2bb8c0a7044d4025f6090cdaf2b1dc00711c883c6a517e6e2e6ff4dce85c",9.317957166392093],[10493,"813221063b3c6dd76ffc657b38a92b80d74721ee2504ffd860a16e96cb8d34bb",9.917710196779964],[12385,"a2d703a77e1a3a7a41321408cfe1f927a90dcd5b7c7ddafa813d42237c02bcae",33.724381625441694],[14902,"1cf51207133e2b553e92505c2dc090449e31d4cef338b96eefbc1e21f848d680",10.052724077328646],[2331,"26fd6ba71be91e7ba132fbcfcb0b6b9636124879e739f28b388b8df00975d9f0",30.128205128205128],[9077,"bbd815ba340bfed99e6603e7563dca8ac6852a0e0b5ba56d994f1a064ab549c4",9.917710196779964],[6888,"13c2787dd35a7646034bb683d1aa1bb4efcadbdba33e06e00f83b611cf8db2d2",9.317957166392093],[10010,"b84cc409cf6386201ee675449edf141b26ea1850d92e9e69ec3f7f20704043be",9.317957166392093],[10732,"fd612c12572c6273aba60df368feb4e1b245641d6986cff1a661df2b6ef0c7b9",9.917710196779964],[12295,"8aa3b382472b2b2296b0253f01ac9c020a92e0519b0a271826dd22f4544644af",9.917710196779964],[13576,"66f2882e1600763a11ad0c3f009e70b26b178c3512693ae54d254335f5cbfa9d",10.052724077328646],[18704,"9f47dd87e387469bf40faacec1d4e42e76e7adde4ac662e48529b19258f52f2a",9.75609756097561],[11197,"c1ecc8e5840e989ecf275ca0cd690e506e9ab3ac1ca9c30170dad318b6fcb0b6",9.917710196779964],[16059,"e6080e9ffe44bde84620a40c1fca1e6418960b52977feafe2062c060e2783567",9.317957166392093],[16378,"af9110f856e7318dedc32ae9afa28200c32c31552f1c89932cedf53b80aa845f",9.317957166392093],[2050,"bce36f4361964ad8f7887aaadd6b7d13a00423a42d2367cb135a30d9b955a0f2",9.317957166392093],[3571,"82b64ce5ed63a379bf59e36af439de9dff7152ef8de65528e18aacd3eb5579e8",9.917710196779964],[10403,"5c088150478e7e5b8afb62f59b5db2989454114f840d3b2a8155246bfa6bc6bb",9.917710196779964],[19861,"cd9a5aa3ba78ab5c499989b6d9d33ea90db3cbd58749c976fc25462719cd8500",9.317957166392093],[18416,"eeaa1179dc35ecc6059d310194b65a651cbe8c200bb2ca8ba55a5e6332513333",9.317957166392093],[5351,"7114de7cfd7ff78eef7cfcbb8bc170fc62909b3c9797b5215ee4917af78624dd",9.917710196779964],[7762,"9614d7e8198528b759d72d24c11b5ca925e5dd0af21f48264b3d9f2a619c0ecd",9.917710196779964],[13756,"3ec7471e0a1a4d714b4f514394d8c488c0621ce3d74c453fb7609d300476439a",9.317957166392093],[254,"7fa9ed29f78e3469265637b6d86c3939e5ed2f2400a4ab8b7e6e51e3915f48fe",9.917710196779964],[17007,"1159b5ecd700ea8cc7f71b032222f9934ee3f57df610545301a49183d700e551",9.73393665158371],[18625,"6de3574b573097cf758c7438e6039f4ac67b1b1ac8c0e7ba103118259e15042e",9.647446457990116],[14964,"8811a1c8e93408542646d92a621d463bf3b34b21918a7cf14de310e8fd6f4d7f",28],[10319,"c27cbc73a75cc4fd91feddee17ed2125f7deb168547c337f3284b447b7ba37bc",9.917710196779964],[1927,"b9d2fd3f006e15477f926dc90427a3f595d59de68e1405f3b40784eb831082f3",9.917710196779964],[8275,"30a4424b771242f04ceba731b0f6b483987921f41c82ffdaa31e655f7bc87fc9",9.317957166392093],[14126,"0b2e5385fc3bc57e0a4f6d9b724a1f882139e799fb1f2a242c2ea5ab5651f891",9.317957166392093],[12439,"26c85232073b0d3f0db5dd0b36c85b2d16b4997fe8effc9c52deb38b985d54ae",9.917710196779964],[12504,"2c01a4f11a1561ba9d94f4a7954a0634870bd1a74ffc4cc59609f286c295edad",9.917710196779964],[14419,"7f7462302a9ff98559e464d6fda158a8656e8607e74ebbcd03150597ca8bf08a",9.317957166392093],[5891,"528b8636f81f842f00e85423ec10c4fb88c3c0ff21f60fb5795fd8758fbabed9",9.317957166392093],[10954,"d2acc04cf0f8de0996e5f98ff70b4e01a87b81c945ef2796c1d697bde91b50b8",9.694581280788178],[7161,"e65bc73b7e1f5f6bb104279686f2e1fa2955879140d86fa4c3b66c819105f3d0",9.917710196779964],[13242,"5921cf7055a3d951d1414795577b0bfefc80205ad485a2735db9cf20dc2812a6",9.317957166392093],[8189,"fb2d43d75a59aaefed1acd761b68c9f4ad832766ddaf2f6873c767d5986f10ca",9.917710196779964],[1977,"81731eb23ea7b351bb65a24d57b36e82cefb1992129f58b05f373e2d38f024f3",9.917710196779964],[18164,"6c9330e484d84e63b241c12ef41b754ac3316340384f355563e0008024a50f39",10.052724077328646],[15010,"74a99fa50eaec10d824712151e1b0f165bc39f300dcf272908bf43d0a7ac207e",9.317957166392093],[10234,"2d7c6239e1205823a5b73efe6b5608a53869b8ab105ff3d60a25b0340d27c6bc",9.917710196779964],[7285,"567123744e766f90dcad5fb02caf8e60a2fcf637f436b3a98f2eb4399e6428d0",9.317957166392093],[17837,"26905759103269f0e27939fae11ffac2a462d6a1b9ccec5531b203e35bd48540",9.317957166392093],[5768,"9688200b6a049ba308f94727672d4c65eed8a8bd507b470d9ed55db28ff8a9da",9.917710196779964],[8449,"80738202c97a0a09d14240149b9d961c430852639859f68ea5e297f7f5a354c8",9.917710196779964],[11692,"31246bacae326e56cc647ffe68dec96bf79c045316cf64ac0eeaf86c7f8354b3",9.317957166392093],[3541,"9a2548bfb859a6af05be59f1d74ea34e832d1f9bd965e9bbf379c1498f30ace8",9.917710196779964],[3210,"759dfdb38cf303fce0344253c1e02831d51826872435770cdacfede13565f9ea",9.917710196779964],[9541,"2fa4b171a1192f66b4f703ed664742101867205ee174da895da8f1337ac071c1",9.917710196779964],[18761,"bd9815c93d1321871a72c8a18b107c98448a7caf1daecedfc9dce77424643728",9.317957166392093],[2726,"0e4e712f074907f206ad51a298b165fb8d79e4d13f7cd8811714ccd99aee3eee",9.317957166392093],[8322,"06a64bd70447b87abf4adb74deb075df48c70ed9b522784a438f003905e030c9",9.917710196779964],[13092,"a25c63afc58b9789c7fc41efe3fdb3b36dcf7873acbfcb5aaef13c63d478aba9",16.196209587513934],[9000,"fa0d18ae93191ad0a11eea57ebd985c5f122a49c772007b713f08f0211adc7c4",9.317957166392093],[17741,"5603b3ffded51774e34ba6e082d395f1c60f81e9d4ea149e0ca498d180526542",9.317957166392093],[8521,"4e9236de0eb243be394b781871c8faf7e5a887adcc990d446f68576e331ae7c7",9.917710196779964],[4528,"1c824806681c59bc25e58bf6d4faed3c429d21660a0a6d423c5129b81a2d2ee2",9.917710196779964],[12000,"847a46594a1f20f08b36516de06d257e6704f5496d537cb0776f3ef461f950b1",9.317957166392093],[6084,"a9a45125f67739149b5da011a1652697804facc17b5181de1241ee7877dd7bd8",9.917710196779964],[5017,"858ef3fa42c60480b36ab52d01c07e1a48f2b50677c80f40e1172cebc9a00edf",9.917710196779964],[2872,"9bf4108dc52d438a0d6939bd3db2041d3a8f9f6b4481decc248970f54ed049ed",9.917710196779964],[13796,"4c06d0cfe8c068002dc39cda0a64a79909b491ddc7105cd60403eec3122d7f99",22.88256227758007],[17642,"7e7d85cc08eafa926ee04e607c1bc1201efad71808cd0e2f81a21bef1ced5644",26.138297872340427],[10156,"18ce969251ad4b59d0fed12fc9c195c2d35173cfdeb8faf8a6e847d769345dbd",16.142857142857142],[10273,"4d43aeb9a6a5511e02adec2a64bedf21e4434fc8259afc9776b17d84481b92bc",9.317957166392093],[16254,"026c62865f4e62bc67efd3b9f929a943f505ff469f7a9fa6e4dc214902ba3b62",9.317957166392093],[362,"1b3a84fe3430b8654e2295faa7f471d7cd33e32a05065bd9906467795352aafd",9.317957166392093],[8572,"3ad3c739e733f202287afa7be276a986590f18f6813d61bfa75ee230867f9bc7",9.917710196779964],[9391,"5e99e93adcf38f54e0b3b5f25f7d2ca1674876bbf1baacc0cb693874731c52c2",9.917710196779964],[9938,"f8d0b6f2437afff5f6e961f400b1fcf8acc08e79ae3184598b59e20780cbb9be",9.917710196779964],[14851,"d12dbd513d385b19143e409692922e09ed08315a5c2e191e04890d136716e781",9.317957166392093],[15263,"4ff4690c996f8608a93eac1ef622b5247d6ab2c6a2cb147157b61f59cf5c3579",9.317957166392093],[5453,"c8f9b17182a288f354b30dbc2e5ad961aade270a4fa244703bcb62fde9f476dc",9.917710196779964],[13384,"4c435a7facf08afb89e33102737cc9a27b34812ae8220207c57c22ef653fbea2",9.317957166392093],[14332,"90d882e35600bd3d3af9b88e372444139094171da8632f4b2553d0951862a88c",9.317957166392093],[16168,"05d4eac52e7aaab53c16957155f5e1d191df4a9e364bb76955897d563aae9c64",9.317957166392093],[18219,"b297b973313bb8d05b3562b05edad79cbe94f8e7ba2476ba3ceca0bbc857a837",26.109396914446002],[19157,"837e647da64d9c6831b9450f84cb148f68741f9036218a2b2aa21f0ac45f541a",9.317957166392093],[19820,"505a663d8424a8b5784f09191cd4e86e69eefd8dfcf0512898af8e82eb68d301",10],[1376,"e25d84adcdee44462499990b506a7c1cd52d9c0502316a55d049d44d8622e6f6",10.052724077328646],[15943,"522de228f89e2f9487a5f40425b3742bde91beff0702a448abbe5bcaa9f9166a",15],[2228,"f9421b485119d3f3a3010e0a41822ff306d5f39f2caa8c4f53078e2ea7d159f1",9.917710196779964],[1316,"0f9916e9e93544a7fb0b51dfdcea67918e3b1260b78739dc001b21565b9351f7",41.04347826086956],[12760,"79989c33f3edb0688a00e9a32cea95472b8c6c4073b2ec353d4d66d6fe472aac",9.917710196779964],[16271,"3a220bab72f20144bbb20aaa002f563d1fdc1c07db3506a061fb5a5e0031bd61",10.052724077328646],[18439,"5c9e2f1d4ad4fa92c302c75ce32f92a84b5169ba58af2d67d6e1ba4dff01da32",9.317957166392093],[11439,"43b1eb361bc48bb6bfb4af5ba7c6baac62cc101f85a55b985b8745006dfe03b5",9.317957166392093],[9099,"d7bc898e8efcfafa0820836478cd44f04d8f48eaf89be229584d57a33f182bc4",9.917710196779964],[6504,"ce7b588b4aecc90b7309977ea77c91889804635a128c171c9ca4f7aeb6bf6bd5",9.917710196779964],[18873,"0792a137e534a1078df7eea49116700c7653a18035d2ae961fba7c859a9d4f24",9.317957166392093],[3875,"ea9328c4174330dd18c315ca54c35a61cef6804a598f21834d583317767f89e6",9.317957166392093],[12386,"5f1d3156b5d50ef16683a98de8a5821e4873b66baa0e62c3582cb0c44136baae",9.317957166392093],[13427,"a0465da78e4a74233821154ad7688de58e59f83f9a54f85ef511cfd26f24e2a1",9.317957166392093],[17132,"a039e25e0da3575887c430b6aa66cca13058422062130052493e18ba916a5f4f",9.317957166392093],[823,"82b8f49104b22b3247bc4e090accd8ae75875f9d955acd933a603da8591d5ffa",9.917710196779964],[11195,"7fb4a88d03bc1013e90ef6f74a3525bb7ea510a637bfca6fbe6e41592009b4b6",9.917710196779964],[186,"7aaf47a48e86e1745a53700b5ba3a11a8155ce5c965957dadfeed23b22ccc4fe",9.917710196779964],[10742,"2bcb67aec58772811537e8221446b4fbff5f36ff7f4e44453b239e0f2c5fbbb9",9.917710196779964],[17649,"d517a5cdcdceaa16072e7cdf7c456032aef1a1d9e60111c379452187bca04044",9.317957166392093],[17908,"2d2bfdadb538e3f1b3af984d5d9171e647c73d0309a95b68b52b4095b3a1193f",9.317957166392093],[7956,"7cc9eb4e37e72fbae9139098cfac472c7e792cc7a1c523ec01676c0039c7dbcb",9.917710196779964],[15220,"329441e37a74ded42a11c6d83608d2daa393117b50523e49aa019447c0af0f7a",9.317957166392093],[19478,"93d0769d40aad822044c01ad9032c8220c1183b6656623546f74e9c5c7023b0f",9.647446457990116],[2545,"c45a3a9769825e627b70f2827aacfe1549267f40912802821b51a76d75e48eef",9.317957166392093],[6051,"4e081e83f2c3d668b9e74dff89930f43e8d08792f7d64f45c9789545e6b4bfd8",9.317957166392093],[351,"168dd6785e2b6e56c81acd5d168dd4104c5cecf36a1eb533099bed52f805b7fd",9.917710196779964],[19208,"7323a76b0d5835b3592e40e5a2c54f84159f69fc6ed34eadbc28172210a37818",9.317957166392093],[12678,"12ed0d846dda2d9c94025d91c384bcbef78adcf3a0dfa10998430947fc42bdac",9.917710196779964],[1112,"af99156baa4a419c92ef666ecc856c7cdfba8604d73acb1f1fb06e98c9a181f8",9.917710196779964],[13356,"8d025721273a4f1d89b7f4b22abab4bfe5ea9cd6e4f8a57e584cd8e84cd859a3",9.317957166392093],[19359,"96aa7753ade8a985cff321b1e42d6ec58faf2b32d7197ae8c7e1a7b7a6245b13",28.09964412811388],[12309,"2f13ac6eef15a5e1d209af6d6809cb1975d54fad1bd919732435bc6e654c2eaf",28.054919908466818],[13436,"332317fdaed7b837c8a063f90de86a6ca0b5e8cc5acf88579a7c8fce465da7a1",229.2876712328767],[19669,"c52841bef11f96fc7294112e72c1bb15c451425f9956a1e22a92104a572b8f07",9.317957166392093],[9826,"d008e06f4f5edcd2fc85fa1e94c07806176849ddb60b2ef1222af55b72fe77bf",9.917710196779964],[10590,"ee9ff4adb615a53d7b2743997e6c43d02d33869077cd222197214e68eb08b1ba",9.917710196779964],[17000,"340a7ed86dda2d7498a04d9115cf2e5ff3f032860f9ad9252dd369c0d935ff51",9.647446457990116],[12626,"7b0f6c7a374f34a7387fdc81dee672c6944ccc6e2496e2dfb01d0978fcd31bad",9.917710196779964],[5443,"0495086e6a127c7a9099161ef8bb67a8ba9b3b37c35e9af3605b2bd65a1285dc",9.917710196779964],[811,"4b553080b69f2bfccdfac4d9cddfd23dc46486d869cc2746f6828a28e7bb76fa",9.917710196779964],[14747,"92a7b6cf2bf2e0a9c2bb0e5064dbfe19da8a60eda6be88d3ca77265b9009f283",9.317957166392093],[3980,"2c6eaacc1f19b4ffb0ea41e6309a5e16601d5bccbfbb6cfeae80eccb82a9dde5",9.917710196779964],[594,"ca92a077973504ab1c37b41a8907865d75d2c827f607541870bb6489b3b9f4fb",9.917710196779964],[15884,"4a157a2991a8ec478148312cd3c66be5d785390527c7c2fea28cd3d51bde4d6b",19.2],[15854,"68fda30d9acb105dcfe00c12082bce3bb93f0bb937cc7e02804cb4f742b30c6c",25.83111111111111],[11182,"7b69cb08a933df61edf7a7111a9069e9983efecf0b3762898e285df811f3ceb6",9.917710196779964],[5000,"a8b5df26171086353061dc9b836731351eb3596afee168a087fa474eb32f2fdf",9.917710196779964],[13677,"9a09fa81f71f13cea38f3377b3a82a824e3222b484e4d5ca492a21e179ffb99b",10.040705563093622],[13182,"b5af91cdc2a0851f6a25bc9df54e68ee4a1ca071909235e5692ccc3e2ace5fa7",28.146596858638745],[2241,"1d4af4d7ec3b1a9a435aa395a68571fbb767af845a3afb7b5ddf6a7111444cf1",9.917710196779964],[6465,"2e4406c2f461c4bfd8f75011bd09a88ab054642f1db65c18c05a40386e30b5d5",9.917710196779964],[16844,"8b77904c648b7a05bb8cef81032c49813c59cd92ecc478795e5749145e3f6255",9.317957166392093],[11752,"1991b97451bc9dac6255935e7f80b8ea5fe04dfd1fc7e7dbaeca198981adfab2",9.317957166392093],[19395,"b9e7ad026bf8c01ceaa3fa35c86b0330cb5058381c9203fbb078f79d866ff511",28.098939929328623],[3355,"4c7ab7c301e03028e99d81ae420d97a9ece5f46a12f5bc457ae166b58d1600ea",9.317957166392093],[1842,"fb2f7d6e4405d4864e4bc286a03d4c044c2992f8ce64e4b3435c5a7c43d2f3f3",9.917710196779964],[15858,"5db3d2dc914d6c37ced3523662fbc9aba4269d539e9d8179e1be10a0002cfd6b",9.317957166392093],[9072,"8ce0a087c82b26990c38f1d2a5841a09adf05b9d4e475ed1c09eeb79822a50c4",9.317957166392093],[16197,"4b3d90331b1a4cf0cdadcac9f37b08ad2f8a56cadc4dbd09c1b389d848500964",9.317957166392093],[7090,"4a6b4bff51d8d1e658e1549cb347a7d747c1623f168e799cebc2df95878d6ad1",9.917710196779964],[16853,"41ab1d55ca86eaba058c896d952bbddc62aae5611bb7132ef0a3884887063955",17.056105610561055],[14780,"ff83221a0417432ae99dfcd4787d3775fde864af0b6b1675e830a872425f5783",35.825783972125436],[11073,"bceca5560a4e3153874bb76dd6d7006797e76e60c3dd283b628ca036b9bb81b7",9.917710196779964],[2666,"c769d4a711a4a6c2665c2e5959f37993113684ba489ef38ad98833420584b9ee",9.317957166392093],[4680,"b8f56fde391cd7aebf6a555472e3142c268e0c1493880e7046eb871db1d41ce1",9.317957166392093],[14087,"2f90b1849ab7f9bab65533e3bfd316589f436b66efce4f779c7c99a85b25e492",9.647446457990116],[2838,"b729226455f0e59b0292f4c9eb2340e61e54244dd9abac7d7540fde3bffb6bed",9.317957166392093],[10005,"fd6b4b6787ce4ad9e7740c38d24c9d77068b41f238ebd6c04d2908f2fe2b4ebe",9.917710196779964],[6920,"4bc800af603c7a533d99ac39431ebc12361423611a982b2999751802133079d2",9.317957166392093],[18966,"749e825c5e320bf9e9ba85451b2c0c5e7f867dfd386666ba64a478d422b49f21",19.170909090909092],[15969,"1a531d9cf5b31914d1b44c6066f53cff7ef0f9da4d620b42b2ff09cf1afa6669",9.317957166392093],[6570,"d94b68bca20d526f034c9eaaf88f2f70a989970a2d2184ff40c9ec8846ece6d4",9.317957166392093],[10642,"c2aaccb130f110519447b1138d44620d0f80c4cbe125114e9cb1b66d0a7f68ba",9.917710196779964],[5336,"3073adf9c5f6f653708ad8fc8e23856298cc5cc3d0dcebc7e60a7eedc6c533dd",9.917710196779964],[15744,"67b3f01511f5bc087f3a3fada9c2fbef52160d5f0a6930addbbd09afe367806e",26.03693931398417],[1145,"7e2bf2ed4eaefae335a05407242c0f7f50065ede8044f5e8e91978ac842c55f8",9.917710196779964],[56,"94c9f5aa44502f568bacb6237ca0ae845607d7768357de2e53609d4840fa97ff",9.317957166392093],[1274,"472fc37d7baf00daf266ea3d67ca0af258d32d9f0a8ea4d60220aead896c86f7",9.917710196779964],[8499,"512bf7b1018cd76b567b544605ffadc3d83846626f2aff9934a78d10f7d206c8",9.917710196779964],[7967,"6e8882fd2443eb9449aed634970f7f602ddf352a4139cfdecf1e960ebaedc6cb",9.917710196779964],[1310,"0874929e0fe11b8b747a754cbae00f8f70434d642700d3ccd8abcf8629c754f7",9.917710196779964],[8654,"eedd92368902cc72b2d57fb3834210ce3329503136bc1bbcf2769df0153601c7",9.917710196779964],[14605,"bfd876b0b4ad0e66c1a2dc6adf36573335f382ac0c880c789007c353a08afe86",38.00356506238859],[6903,"af63e4e7d5d8466251c9157ecb4b888a5e1941cf2a72186fb59c2e0e70179ad2",9.317957166392093],[12346,"1180ef8f04ffcaf5d527aba52e00d7b4e904b4071a8ac7894e17ea4bbd8febae",9.917710196779964],[2936,"d90abfaa921dded6748eeb3acd05751810a41181ba326957ca40c2272c23ccec",9.917710196779964],[15296,"1b209a78cc02168b6259c11ae997729f67d23ce50e1440d609a85b12713f9578",9.317957166392093],[8936,"de6a920ce814dcafe3c4dc53ec8aea62213c4c6a9456641671783e05a34b47c5",9.917710196779964],[14905,"a20af25538129e1d74afa341ee8786e1a724b05fd1d9f36b5da41b8aaba7d080",9.647446457990116],[17262,"99587e40dd9ebe7bce959a5a8f83325072a78562a131962aef153480b97fe34c",9.317957166392093],[8299,"59d0eca565939b9e766d52b4083aafc0333ce7df10f5bddb84734c03c27356c9",9.917710196779964],[3795,"15d0956dcf0134b53abae6edec50b84188307215c8fce4bd82a476fb4c82fee6",9.317957166392093],[15814,"69556c1e950fd65fbbe77b7f2816e728757737f380a8c6d49dc7170f0257246d",10.052724077328646],[249,"3306ee4f478865ee47d79fdf5f937e61080483ac327fc0e29506c1ae10ee4dfe",9.917710196779964],[13383,"56b8837bc98d54212f7ed94cad00514b633e9fea0d9d5a6cc46e726bdd1dbfa2",9.317957166392093],[16143,"f6a3caee0ea1b216353583d267fc8f001c05cf4f2679803fb2cc703230c02565",9.317957166392093],[13130,"1863d06623919580e57997d6cf96c94bf6e8afaa9eba556d201afa8a7b275da8",12.24070796460177],[598,"82eec47d09a70116c304bdd9c56251a4c99396a621da9f6ed5e987230c68eefb",9.917710196779964],[18546,"3290e4a3dc6f8a1c2ec963aea82add696d899835fdf30850a72c66fc9b418a30",9.317957166392093],[6526,"8b63e06c8f21f29feef7b2b5a28247937b1097591d52bef7646ba9a09a0a40d5",9.317957166392093],[2009,"0db4146f26b26ec3d18fb7bf5d31947ea9bce8c1c72672d2ec8a99dd67abf6f2",9.917710196779964],[2080,"9c52c417c9a1ed6e9afe556ab2f493860f00aa408f04c3590dc6d6fc248e5cf2",9.917710196779964],[2180,"1530a4825f65db3cbe2091d6af8f24f9971be8e1c67be2e85a3711c0aa07aef1",9.917710196779964],[13581,"b96e06fda49f206d690d0c9acf379fe5caa340aba57d5e63f61e71da7798dd9d",9.317957166392093],[588,"24f4ba4dbe6b0cad0e9b3d43d5634a5fdc904ac17de5d824baecd98dbe05fffb",9.917710196779964],[18376,"cf525ec2da4070950c547a25240f6a78069831b837834354a2d89803f4523134",9.317957166392093],[5039,"10863e94492fb1013bc7a200f172ddae12665e8b12db0dae2a794dd18c73f2de",9.917710196779964],[11015,"7e179d4300035f87b87bfee606b8ec88dc6a9017b78e48f836639f5dd788e7b7",9.917710196779964],[7426,"fdeb89cd42d62a1112f942f2d36d6241f10cd29b344253c7a0478fde903e37cf",9.917710196779964],[8014,"722a6fde498677721a5f82af7e058e0a6d5d8484e41cd86c487bf60ccd4174cb",9.647446457990116],[7623,"0700289bdec1fd0c9d9bfd64923d03f6b61ff3c7b92e7310bbad03e92f1113ce",9.317957166392093],[18930,"06df0d3530cf88769d3c6634b828bb9940b6cfab49cd08891049d81982298c22",15.003322259136212],[15332,"718e8707bb3ffebe5728a6563763f0a3170b8adb3089e0de05bc3865f9dbb677",9.723356009070296],[15766,"ce96b97574d022d7f64692a7c7393f32ef991bf17a9908d905caf165d12e0b6e",9.317957166392093],[2282,"8dbb12296540aaaf810e550de78f0820f2bc82c4bd1a21c26388348cf1b11af1",9.317957166392093],[13422,"53227dbbfb0d40a31fa269917f3b2a6f7c990190022fe9f51e2bded184abf0a1",9.317957166392093],[19424,"1d216d01c9051e29b2095e60a5361e10e9376576a8a423d3e392fb1badcfba10",19.23112128146453],[17287,"684b2fde14a9bd5487796c3cfab0ead68859bed87b5768620beaac0c5c526b4c",31.022727272727273],[626,"8898230c5a94f6c5378d0f36300c727f37da0114e67404b75fb14f44ed5bc0fb",9.917710196779964],[1715,"d7e5818982858b78aa7855d23783ae42fe0d40b1a89aa86b7e3a8d1964c7d4f4",9.917710196779964],[146,"ba4f4e7f8b5756a23c6a3e6bbef37468351cc7a564497abffe093a07309600ff",9.917710196779964],[3913,"ec83ec0a24f4d4909d6f31b085c08cea599c8c655ff1750198892ca4aae842e6",9.917710196779964],[2393,"39faefef8c729d474f724fb985cce3618ceb0b28086adcb6de8113a01fc384f0",9.917710196779964],[17992,"2934f99778fcf1fe6edca35e8b58e83e672a70e6aa87c493c76f04d68989633d",9.317957166392093],[4035,"d634c334984e814a36178c3b3e5f1b78e7308382f41a81ca752b86d7ce8289e5",9.917710196779964],[17377,"3618d931f22a891f722613f02c36dd6b4564bd33dfba6d8e026ff2e35d013e4a",9.317957166392093],[13872,"b635eeba0fd0f504db54ebd393e41c248bb094081b9f1545f62031b4ed26d597",9.317957166392093],[9507,"9e586eccc1e0dff84677da8fec8222426a60b61e99cf0ba6e34a5bc8eaffa6c1",9.317957166392093],[6247,"c8f5b323a44fec008ee653d9ef7b7e65a253aaa840910d64f47e8036b99c69d7",9.917710196779964],[15853,"04035859f7823067f7dfad02b5ca9f361ce22e1d64cc19b486fab8f2acf1196c",9.317957166392093],[4503,"1d4471b91a0103b7c796a8827117a58d96cfe3e919ec16b2077d4d41857f58e2",9.317957166392093],[912,"2131a69ee04e848763d382847e63a1f6bb63d75286dda2e268bdee1815d0bcf9",9.917710196779964],[16071,"d4d9546ed43831d08e970387c09e46fe4158ec0a3e2a56fd538d91ccf8aac966",9.317957166392093],[14437,"5e73ffa74e66aba57b3b5a401fe6e235ccb777e8c5e806ecc22649cb0f4f8d8a",9.317957166392093],[2967,"e2761bf237245a7dfad107e27d7dfff335b1962e7dfca4497b07653270f385ec",9.917710196779964],[11218,"3560d352c7b18811a598258f3d04ecd8875dbc6541630e130eef2e29af8f96b6",9.917710196779964],[16475,"9b5847632ee85e8eec477cb7cb8001b04ab86fbabeb39a283f6bbab6a1face5d",9.317957166392093],[13336,"7da0ac0e3f34cd857629def0281d1bf22dc9de1e4f8eb21456cef35e9e61f3a3",9.317957166392093],[7227,"98ea850911f9c4b9759d01af69787f0cbe1e268455d72e7aac78d2b5737f7fd0",9.917710196779964],[369,"c611f3e7852efabf8a8e47449743dc8ed3fcbc591332649451554866bb04a0fd",9.317957166392093],[4983,"96f2271b7571fea3dbda7ac28b549816bdd8c7021445277a9571a5ffd3f24adf",9.317957166392093],[18561,"c4bde48c4a66ddc807629523c864ba9c509fdae773a79ca864c7be7f63df2f30",9.317957166392093],[5389,"add7a5644a886342d69a58478e0ed517c79e829df6bde42d9f869d172bc7e3dc",9.917710196779964],[14552,"093fdcdb11c41795c9fa49b8d6b2bbb7ea407c0d425c81484e24348d1bdc1d88",10],[6046,"cc9216dc8178ed2be8f4809e253110cdf4b74f7a69e18da5a1b9beb7b61ecad8",9.917710196779964],[3452,"b84ee87fae3c4244adb3132d4cdde4277126371ad3ba39d3bf93354f671859e9",9.917710196779964],[8254,"c7b1f19a4873195d7a7420f503702f50c8ca70ddc389d824eff66ecfc47aa4c9",9.917710196779964],[5698,"3885894888ea74afc5544d52a9ba7cf6552c065ffefcfe0837b8d3f98d090ddb",9.917710196779964],[4183,"2c4c92b58ba3b71c61493ce16fd4469cb7ee648bcacdc6a72f6663eefa4586e4",9.917710196779964],[19180,"177c862c8f28a9e29ba0b44238c65a82d29333afd2cebef9386dd7a7cf994119",9.317957166392093],[1095,"c124510130b6ad770f5448504d37e976eb5b8b8f6d37c07e6444d1e1426696f8",9.917710196779964],[8441,"5b5c6120f6fe3cc3e1fe12df38370917bf150a186e42e996ba912949268960c8",9.917710196779964],[3815,"4f0ca9c4f6861e4006fccf1aa5cb851624c6cefb3f93bc012a47a3ce19d8dee6",9.317957166392093],[13971,"161dbc05a462875316ccef4009bd767c03d0441e8338a0312b7a1822e778a095",9.317957166392093],[15903,"55c3c4907c9bc0e70c812a84006586a4f605e1dff27ba29b3baaf72fc2d2f96a",9.317957166392093],[5811,"d25cc1ef82458f0f931c638991c8667839e6ad650a565af10b3b7c3c6d4d52da",9.917710196779964],[8771,"5482d622e21cf7ad05958608f51475aea037af97fa3521db44af03949cc53bc6",9.317957166392093],[6306,"bed3a1a4f82503c40d9c28fba503e4d9ffd5e089be00375c99dc131b8595fbd6",9.317957166392093],[392,"2072bc1e4fc578f1e9cc9cd5df43f0ee37b8eee9cc747a33a3955055b7ab67fd",10.052724077328646],[7664,"445ca8fbf47a98f733b6e60a7b55f87ca1585c4682ee329acf4c3ab556a3d3cd",9.917710196779964],[11553,"3c06c783b3a6de972a5594ceeef5f6647ff3a941b5a703559b421840c8ea34b4",9.917710196779964],[3284,"f4e47c341e85dccbf86e3a45ef35d04f6972aa178c77c2f4abcd2f0d69d280ea",9.53899480069324],[7305,"b015f32268386e8104bb3e05e0a08e7d211b09765a955e273e2f30e112b909d0",9.917710196779964],[9413,"119e144dc4539837cf7eb57f4a48044b63ac2e532b41181b278d185108a334c2",9.917710196779964],[18656,"076c9833ac503b1d3cb07202156bbd8935382458eb0c95130940aa2ed9d2692c",18.19178082191781],[7137,"bcd2d397c0588326d7dc7307e1a69bf88e36537fd1d2ec1cb9dc5c22ffb41ad1",9.917710196779964],[2155,"8482a9e1a25fa4a3dea79dcf078b00672bc26428d0b153f681bd4b777e08ddf1",9.917710196779964],[5676,"958d4695d6b71d0fb1ed17fedb67adea8b291c93837086eca965311056142cdb",9.917710196779964],[2663,"61881bab5550e7f198b863c166455fcfa2748e6db540c627e0c498d1d572c8ee",9.317957166392093],[12443,"49af1f6434cf8351d20eadc52ff5255abbd9bb26c098fce52fe31d67a33450ae",9.317957166392093],[5004,"35101ba6c7949ad3ca78ee8657c33f744ca7ce1ccef2413d051e887ebd5026df",9.917710196779964],[13589,"535c27761d559c032074d14d74d82694577929c9a047a1cc058ebf7cec9db69d",9.317957166392093],[2046,"a2065f9cc59a89dfc2e457e5dd3a8a4b805206d54f31c41bcf6b3a336d77a9f2",9.917710196779964],[7876,"d7669febff2723ac9198d14ce803e19c0af80b2f916277265bf0818af97c6bcc",9.917710196779964],[5345,"854cb6c21c797cf61c67b7a8bd71f6eb18ed84a49f13379b9c3f7362fbb82add",9.917710196779964],[5515,"52242e82aec78d91c962579f6c5f140839c850caed5b5a22548ddb16b00c26dc",26.647686832740213],[14344,"2d0da34ac3af5f8427ec26e32153e9a3d490157b80ada15000cf56cb49ca7a8c",10.052724077328646],[12163,"73efafe2f9d6fe764be91d5916ff4ff5697362e9c2071a512684fbcf432648b0",9.917710196779964],[2398,"ac9b09dfd6478fb75963f2ad3d20fe76e3dcbfc2f861a99ae9cfe0cb652781f0",9.917710196779964],[5172,"666cf912d227ea7fc67059f5d119ca90aa3d383c6ec6a934f25be0914c3d25de",9.917710196779964],[17056,"f593bfe5ba9760f3c5eb2d5f551249d630dfddae4fd16f7058d6f2176bb1f250",9.317957166392093],[9339,"c6f858158e3fd82ad20c45eaa865946012dcff5a042e67bfe98fe18c7ddba5c2",9.917710196779964],[11343,"4134e4f538ab63157620857181a3d07722c53aa43427939e2108131b9643b3b5",9.317957166392093],[5729,"c998af57849ac5ec9df0777de29ce938f7869a65cf24e5386ddafdeb49c7e3da",10.052724077328646],[4399,"bdead448f371e3b2ab012a2645fdb22c3fc655bcd8e6d12dc1b0adbed5d417e3",9.317957166392093],[8619,"3ab910e0f34eda536872cc001d64e047bbf391bb7313a080d46e628cd6584cc7",9.917710196779964],[19765,"94943deb95f68b4f155486ee2098f86321272fa9afc6c7b4630739325065e903",9.317957166392093],[8285,"9b9f2249701c46fa59d6a580c66d38b3383d35197cc3a65b1db64e0910ab67c9",9.317957166392093],[8762,"e16c526308acd1c8d77a8ca74d79a0da74f1ba985e614a5fa4835729680945c6",9.917710196779964],[12070,"dec5777f177c47cd8b316a762d718780f72b36fbb69c46766eba1e5937f1e1b0",9.917710196779964],[12722,"35760df8c1173a7ca4fcb3d2377ebde02a2e863cbcaaf429f182650f6eeb6fac",9.917710196779964],[9057,"ef0983ac007bc2264c30805eb78712c7254231e7edb6792bf85a1fbfeba26ac4",9.917710196779964],[17288,"99047c0dba2a3bad807266e5401f59f387bf11d416615836f2daf10037f86a4c",9.317957166392093],[12514,"d3a29819846acadc81a93628fe990cce62887633b9f7d7d84763ff4cb996dcad",9.917710196779964],[12782,"526087ec690331bc65cb9fd12bb409de37fe4acc03c5d2abd45a46047d0106ac",19.228318584070795],[12146,"ae19200d41733a50c65e50f9762b6b70a1563fc4baddd46cb665599080b95fb0",9.917710196779964],[17223,"3bd747a1b5f55c4dc76ef79b07a49955ee84cb6dc330cb7c94a4711693917e4d",9.647446457990116],[11301,"7073bc0a115877440e1118424bdc17b9d57f6bdb4b3761783384bf6779b703b6",9.917710196779964],[4695,"73505e13a1483228ccf72fc9449deaec034dd34bd94ca440a95bddf57f7b06e1",9.917710196779964],[11494,"051598d5911c7a732b541efe75a94b3263375604894e82d078bbbd9552928db4",49.88864142538976],[2745,"643897388a75fdc542186e4227f4de2b38ffea09d037ad2e500573e7b0ae25ee",9.917710196779964],[5316,"e50c1aba93c612600c9dc07a922c7dc5d032f3c892c3ebabd40f8c6d68424edd",9.317957166392093],[7003,"d759b1ddb25c51b0f6b61885e7311f34121df69dfd415097d0cbb39651b4f8d1",9.917710196779964],[3590,"bfa97e17fb7291abdb34e7a18e234d844dd4f23a1a158792a2314820fc955de8",9.917710196779964],[16437,"506ae52671ab3cbb2bc70a058df54ce4c1c8dc4122c764b8cac0655e33036a5e",9.317957166392093],[16837,"7d3d7d47c000fcc635124819bd90ade9abe93e2706d39504360e36e5fc2f8f55",9.317957166392093],[16455,"3bf8d92dfb6d0b6fd99c84fe93e8066bfbad8fbc080159b4bfc0ff4b718b1e5e",9.317957166392093],[17848,"c32c6fb35840b5939b1220047b937ffedbe3c06b77577d400f9bea23dbfc3d40",9.317957166392093],[18793,"2409ec1a873292cb50f96804a4680af5d55f6fc61214c1740bec422c2f5d2927",9.317957166392093],[19302,"a0b727f250f1cc73e6319addc75453d308a837f6eacd2b0175e1dbd6f7b5ee14",27.853658536585368],[1999,"d50218f374e45bde66afc3444fbf4703d2e97f0248b0732eca128d957aa007f3",9.917710196779964],[3263,"93651c0936e99a2ecd98dacc5685d321d21cd27bf900856eb64508667ef299ea",9.917710196779964],[14130,"1c8c10b876667f6ddbda1ec854863d737c52b21031eba9dd942c52db5d62e691",9.511228533685602],[15501,"fccd07b55b030faaeef6302732bfb6689bf9c2bae1d03927351fba59cb1f1c74",9.317957166392093],[3500,"7908593d04e329bcc53a06540cbac01cf9b69863d4287390911217a46a43fde8",9.317957166392093],[4135,"bca106250d26056a8e9a9e0f7f2dcb8fc458a9dabc1010593a4ffd5497bdd2e4",9.917710196779964],[15955,"52bd5990e3a153a88f420b8afa954ae13f5ff8a836bee493f022d6fb18cfd669",51.11175616835994],[16335,"920d95529cc414786f812681d9addabd1ffeaa1afac14e5387efcfaba0b95960",26.972340425531915],[2863,"166b67b43ab58200c4dd0933e942eefa4b0e038cf50fcfd096f48ee1e97454ed",9.317957166392093],[1568,"784e90e1a81f220b3db0dc47e17567d5c93e5ea1a2b3e2ebd9b1921c19cdb7f5",9.917710196779964],[15650,"90d494595438b608a10046c9aa77ee8371c268ac3385b3e274aca9effc634e70",9.647446457990116],[14724,"85fb5a836d6042a52ee8291780b50855dc342c1e86b518cd808d897ec7657284",9.317957166392093],[8788,"9af5886c208ca9d3371471c845752ce2e7c4121bd3a1ca4e2b6717721e2a25c6",9.317957166392093],[12423,"9f0918ce18cc8b2ae8999e8c1d203196aa9a40028cc30e330a39dac8313c6dae",9.917710196779964],[8639,"c06a9fa698b345521d618afa8dc9f16b6fc8a16879bd5e275a2756af2ecf2bc7",9.917710196779964],[2594,"6c87f703d27c93987245cf417fb9ba6bb87e49cf100f182f0100c0837a7f30ef",9.917710196779964],[16527,"a53b6da1ac576847a3d12e555c7d6135bf9c1357259b1db5db548c715b408b5c",9.317957166392093],[1462,"592eb542a48066a1f6dbc51231db18a6d7c3f87d92d002daaa7dd61e54696df6",9.917710196779964],[12336,"3e034f698008c29ea6a63acc6443dce2bf1524a814fe2311ae37cba6cbacfbae",9.917710196779964],[2357,"a00a69979eb6f901e69a4c0750637f5f0221fcb4e64a36abd6dbd03f74fab4f0",9.917710196779964],[13373,"b7c26e398fdcd443d0ac3f1b07f5c8b5153dcb9adee407328e92f66b642cfba2",9.317957166392093],[19429,"fecb71a585d2eaa96d5d6098f757182c26ff506861edc759d71b42ec67578d10",9.317957166392093],[7615,"5226e4d3cd1d2f425a49a4938e83d476bdcbd908d13178e6f77d4cf861111dce",9.917710196779964],[1744,"1a819c6af462b448072e104357b398c9b3b74ed04c68c83a43ccae0f2581a6f4",9.317957166392093],[16187,"ee21dfba86633f85f856ec2cc7367c188869f198642418559af06ec02f073364",9.317957166392093],[9196,"ab93f2c3b28c979fd6730eef8ccaa783a5eed3e9aeadc562643953a28c4a75c3",9.317957166392093],[6922,"28c60dcef4f0ef6ac799b795235a6d8cde4832187048ee63513cf9493fc876d2",9.317957166392093],[8906,"67a591d432ce03cef1bfb2cbd2407b582a9bf1adeca7bd2aa22636aa08ea6ac5",9.917710196779964],[7513,"92288fb249ea77adfc559629addf5520f56831773c6030d12910aaa5a261aece",9.917710196779964],[5387,"9df5b396bf83d54db9853eab3f2261e692eeaf3b339d129329e8cf2be22ae5dc",9.317957166392093],[11719,"eb3ddaa68fa598d44c0c2a694eb2542e212671d8647059417d9d92aa30b92fb3",12.063716814159292],[16955,"ed8398817f73506ffeef2d8e468f44b8cedf5a12d645dc86b0bf42df389b0e53",9.317957166392093],[6758,"c9433f7b7114b704a29c71b8d315b7548e5b39a9f4c33fcdec3cb3b91b5a87d3",9.917710196779964],[9019,"a6067a6d89e4ad974c15eb273407c9f1606652f4585e95683b0b57709d8ca5c4",9.917710196779964],[16751,"00a74b627af1c2b1cfcbf0abaae594e0ce86a88f0179d9f68d70284e7f386c57",9.317957166392093],[8585,"6a6e7da8328d683f07d204c5b5a02bcc14a064042dc350ef4e6de834995285c7",9.317957166392093],[16356,"5207c70fbd85a97718788de3a138f857b32c572babf54fcea4ece436c926f85f",10.016260162601625],[3953,"3b5fd18eaadb75b438608e7e84040c6baf7ce1f9b3140a5d658ac3cc813ffce5",9.917710196779964],[4793,"4ed4bc09a64c68901a10ebae98eb4182531a0c1bad9b08815d1dc75064f56de0",9.917710196779964],[15754,"e64beaa3448ca654028b7e3ff3523227d4d74209229c2c5e4410dfe71009476e",9.317957166392093],[2902,"c19a300ccb124d7834309bc933be3bbfc0e9246ed4dd93270e71a87a42521ded",9.917710196779964],[4207,"7adda028d697866682479ba7e50263906ae508d7b45f0bbaf79650b420fd5fe4",9.317957166392093],[3276,"eaf2fda05797d109c341e7b2da17e0d8fdb58be0315a37fbc677647885f88bea",9.917710196779964],[3232,"69732b68d06391bf6ae6b001adcfc7f74deb018485d9fc6650d9b7548ccad1ea",9.317957166392093],[6451,"fdb1f4b4b94a6f0997fd720aee6266aed318cc122960e380ed0d1144cba8e3d5",9.917710196779964],[19657,"0dcfe3d929df57d64b26bd732dbf77de55cc46ca25e1bdbf265e3176949cdc07",9.317957166392093],[19045,"17fdc0b94b97aa91e04b11bc289c71dac2ebb1ff4e0b6234ffc816c92254081f",25.401769911504424],[11154,"c207de3661f2dcd92310c17035bc8772afd1723def8e7979d8cbc33d5f6bf0b6",9.917710196779964],[9597,"b168a8869fac2e9b89ff42498e2449383c53f0a76c81434231a455792db808c1",9.917710196779964],[15898,"b85b418e917c7775e20091567d64a695beb049626ab2ec9aae47dc7b3ad6106b",9.946524064171124],[4438,"2b864c22d4a2238a107b90986cb00040dee7a951793752ac5e2f33f3c799d6e2",9.917710196779964],[10985,"7e61ded3d30723cbe0c77846fb7af12a9376d1d2833c27d17e949b5d430e16b8",9.917710196779964],[19446,"f25479816e702da9bb6a4e14bb1a38aa58487cd7d85989b6c5e1e93ec3b0f20f",22.279646017699115],[18530,"3b8d7293c8bba586fde191dcd8de78afde9a021a6a9aa2e69ea2e08d0c9dde30",33.40961098398169],[18247,"b8166708c89edc876bcc6368790cd24008d4c8486515bf46436b1644cf280937",9.317957166392093],[7889,"fecb6760fd85bcf112933f36b02ad4977a4450dd84e663e03236b97589c753cc",9.917710196779964],[7836,"ebea2fa67a0634af1694a884895ce393290bfe9c771e3503799facd8f06e90cc",9.917710196779964],[7157,"3602d42a5ccbb58f40b844c1fd6e7e70d58b90e19333afecc328ce752ee9f6d0",40.11899313501144],[7284,"bf4144d51d30ec1cca7757d71e81e5dd4e2098a5d4aecbf12cee6b7871b628d0",9.317957166392093],[4420,"3ac0d7ef09b5b6e087c8b58d44addebc19a2d8c4acbd55ffa545a06b14aff3e2",9.917710196779964],[9183,"80065606ce138e8c3ffde80926b249f2a238de0eacbcfaf878203b01053599c3",9.917710196779964],[812,"bb92961e695368ce4ccf60b8b835fa2b538f1d6cfbdd871362b2bac5f93c76fa",9.917710196779964],[6642,"e9df54a89919e30d88aa64d0d01963313fab1b0d0384e6aa2efcb1c63b4161d4",9.317957166392093],[11339,"e9e66695ee02f0147d42b182bcfa07daa5476cad1caf18c7061c1bda20b8b4b5",9.917710196779964],[10321,"ab3213ea12c96b396a75ac6afc6dd5ed1caa345c8e34f5c000a8ad5cadf335bc",9.917710196779964],[6370,"d09e2bde8cd6bb5c971f1c4b21524b516fe338e92cb1ce9e2e33454390628ad6",9.917710196779964],[14664,"485576e067cf4c734b5dc3ec08ef7b169da13459e8b7ebf958b1b6822138a285",18.130434782608695],[12649,"aa33d6e5976c96409d813813f489146f4b30d77a3b00490eaa6a89fad40eefac",9.917710196779964],[16066,"38679435c9bd40b2c9dbb7294de8283610dd3d81a844cd7d9b2324691f590067",9.317957166392093],[2741,"9764b58979c1633a7521671e18cc4b99219fcf6bdbd2be81077429417f612aee",9.917710196779964],[15988,"ce53d156d04db06dcde47119617cd5ba3f844bac0464f6d2267462e59c67af68",9.317957166392093],[600,"235813e9f621ef0896d859b91a4f95122be199c3153cc70f999d7d1a8590ebfb",9.917710196779964],[14872,"0ccabaa2405ca6d736e3e3e80a1073f0b5f926d38be450169e6ea69b0bee5c81",9.317957166392093],[8515,"126027c63bd6a934ad00f7131202eb9c24e284b727e68ce1c40db6cbf797f6c7",9.917710196779964],[3388,"694f7bb0f1b4e4143afdadcc1adf3645e923ea05cb2715782fe31c9c6e3fc6e9",9.917710196779964],[19687,"ba28adc8144ec42c5e10edc28228180452aae237798bc1bc91358f5e92ec2107",9.317957166392093],[14189,"fd8220b275b94a98c2eedcaa48da026b683af17f3f9ad8d943a1ef8ed69fa490",9.317957166392093],[15286,"04bed3397b883c4cef0f83d64ae780f5704b0f30baf050bdc415c25d7453a678",19],[1157,"95cd80ef2edb184458c95f476482943f80dee3b235344ba5eea53ce276ea43f8",9.917710196779964],[19150,"b4abba8fa51bb864e846361365388e2328d766ae6f0116da8e9ccaba5448841a",10.052724077328646],[3363,"cb4653d28ca356f955d68902832a6f07cdc780c0f0e498bc5960069b757af4e9",9.917710196779964],[1258,"247d27664ff3b4206e30c1a8e567c0c43ec4df48234aa3f18b32240af9939bf7",9.917710196779964],[10684,"e7c180550a56e36492d6f55b40450f70c942d2a32e34387bd2576b103a5926ba",9.917710196779964],[7160,"db7b2a512c566a9883c3df0a42d944239cb10727c0c70dcd1c5a77c54870f5d0",9.917710196779964],[6111,"955f17e028f4e3039af2635b81bc596ead7dd08edfa5adb0060a5b293c4c5cd8",9.917710196779964],[19351,"37d54b29ef21d0ca99b77ce9fb75c098731a088c9ef462df343aa7e3c8289413",9.317957166392093],[19241,"5b0f4088b0427137e32e2e7f98cf8e02d3d8424d53765c6aaf190a73f5732d17",9.317957166392093],[17315,"42c66faedd4c2e60f2c5c120ca348f66c45d8bc6f5c30ba200d0c2bab681a34b",18],[14365,"16edb2473937ebb3803f9f1a99c3baa917378891bb424dd30090d27f59f6258c",37.03429101019462],[6255,"73dd90ddb0f3b526515cf20eb06ba7ff9c56497b8a12b3651770d857abd15fd7",9.917710196779964],[14528,"6068600f041e36f298f3b57fee92126fa90ae8f98eb85dae85ec3ed53978a388",9.317957166392093],[3822,"f9a48e5ec7eac0dcbcb17d90a1ea61821e4f9d1d28beda67c8f21662802adbe6",9.917710196779964],[15283,"2176a50c9d9f720a0133c04f71beaff4f591362bdfa2731ccc899f05e9bfb478",9.317957166392093],[6584,"3879d036a4f7522e440d01a8ea53eb918d26b439fa9e2fe12c61592e4070c4d4",9.917710196779964],[15995,"3f18f3815b9693c13ed36ee34f96fe4e07b4e7cc4b2ad298272c98e0aaff9668",9.317957166392093],[2753,"fdb667ebd404f7110fbbce0cac0053f64eec5235c66307dcb2aac214ff8f15ee",30.14218009478673],[8959,"26aed3de4c5c8808c1c31a246751d49a22db71322ff7aff312029c7e642f10c5",9.917710196779964],[17906,"1164cd1d09331adb8566740273a0f409b2837f7a3ca8d3a242e2c1f6e5b21e3f",19.079056865464633],[5819,"f3b0ba73b4887ec5a97782d6a16ef7182dc377cc4aba3977705a8ae4d03844da",9.917710196779964],[12147,"4069035e1c16b492b3262a0aad2f094e5fa3cf4e06351aae4c5de5908a465fb0",52.72745391131041],[15063,"821211e773346edf2aeb98dd410574a45c33a0b2f2eb896a760f3ed1cb1e547d",9.317957166392093],[428,"159327566ed800af15717e32aa06f934656b5169e73079da0f7c504c5f6b2afd",9.917710196779964],[4994,"68bfe66b1ffa750a2df4c4e8b4434eaa5aea0a37da312a2a505e6841edc639df",9.917710196779964],[4945,"4d30630d2936e51edd181c7fa744bb3938c2c4d1912b3390f5d9dd0c72958edf",9.917710196779964],[1051,"4effc3b1d102612c30ea5a99cd16602726f8bc2f0f52984c6495a0ae2642eef8",9.917710196779964],[11972,"b95ac989d7656e7dfe9146d2f7468c2006651776563c10241ce9e47d393880b1",9.317957166392093],[7281,"1abea982ab7f57399e28d44596da1d6a1035fff41d9e3157640bece9ff3c2ad0",9.317957166392093],[1450,"feb65f369a1c168c395d7d2f9f78b0a16637700fa16913c0fa6456d3ed0a7ff6",9.917710196779964],[19325,"e9c992dae523786c6f82fee60c9e56a3315d7b94f23f7bf50fa1bd8cb5cd4414",9.317957166392093],[5739,"7ca90eaeaea32e376d96c3620151100c1036177c5c86ed992782a4ad1ac5d4da",9.917710196779964],[10418,"cb7174a415e22799e2a7bd4987048d5a3a98574ffa7faa66c9271791cbe0b0bb",9.917710196779964],[15061,"2ede579ebefc28fe14a7d5678777201940af7998ce1e28219051fd7a60985b7d",9.317957166392093],[9983,"e08b86509fa9af3a737043b3d17d1a53ae9c760a134f3b8d9f12addd50456ebe",9.917710196779964],[19445,"1c562d27ecf24c68c7524185341f85fdb6633ad35f8c3f56c728cf527542f90f",9.647446457990116],[9703,"eae1a6e15598b9ea9fd4bb100a60919850e6dd36182b8133b8073c1a9e1857c0",40.15586945932781],[16556,"66f8238d3173ba3b6a2383245dfbf6905ea710568e8ce1c6590623830b02f35b",9.317957166392093],[9761,"918de0812ba0de3c15edea48ffc435d09f2a78e01460f37a5b76866946c3f2bf",9.917710196779964],[3240,"80b9171495cc6ab158e8a63573008ec44e62b61291470ce3420b1274c82cbeea",9.917710196779964],[7572,"518c8d1a92168acb6007e0a85eace51a3cd8896da95e772c760ed57a05685ace",9.917710196779964],[17888,"73085fe928fae02ac011f15723cd0ef5167e70f15c54def5015d47c736777f3f",19.215686274509803],[11680,"9f1bcb4a9ad045b143f0bf2412bb7dfa260a7e8c60ecfaedf7e2d176afcb70b3",9.317957166392093],[10914,"da72efc34cdb98542e33afe82f874453bb6161151afc0273921fa7bc18f897b8",9.317957166392093],[8605,"db6ae729b545b0264fe2691ebdb3ea43f7e2c5574505bb8722103239733167c7",9.917710196779964],[6885,"ef623e0de8e8de454db45d54a53dc0a3c2948fc6b8307c19b49604a35a2fb5d2",9.917710196779964],[8470,"bee9f0353550ea8630c4918e1841e10590eb48589743c7b422ee91e0287233c8",9.917710196779964],[18067,"510ff7abd8a8f4bfcbc949b42f45116a32d25d417f404dc1315ac93cd013ce3b",9.317957166392093],[8847,"4bb8b357f796f92e3f56c48e2592a4b87e22d336cca3d7cb4875ae986259cfc5",9.317957166392093],[4749,"c5b0a303596fbde8654062e3878b8926f3c809c3919d26afc9a62f5497a8a5e0",9.317957166392093],[8859,"ebc257af5d39e7733da2b8c315a7659a27989d4e8ebb70edf48b7d766163bac5",9.317957166392093],[3289,"78a529b676c2a7e6de58e9cb13a52b539207705138ba756c83cf8558cc1a7bea",9.317957166392093],[6808,"d4b6829b1ffa9265bda2b82487fc12ca473ead41a24fe104c37d9219ce1838d3",9.917710196779964],[4009,"e8d90b981c251544ca2888b7d4cf65ec398e9a1c272f3cb10691f1a96a47ade5",9.917710196779964],[4920,"3415d72adf016c30e2614c0343b1d4bb1b1d469e88436f7fee0ddb3e4d03bcdf",9.317957166392093],[15130,"03f24b91945558bafacca53e375ed02d5e19208b56908ff245bac329a50e207c",40.362537764350456],[5350,"9ae7f20ef042a4a678717c901e40d75f3aa8be9e47f46e0885038527481126dd",9.917710196779964],[15274,"3ee75cc642b3384c01f3b5c8ea2954dec066eb0fd167c4d0a2f8663aec37f078",16.071748878923767],[15897,"79ac658939bf1ef38ef8ce2df7b4a8115721713c534b199d52bcc746b1c5156b",12.007504690431519],[14966,"76bd105e38fa6354b58f0e2c33f01a1b27466fb10622e2d9d4d81abb401d3e7f",9.647446457990116],[16514,"d95e910a68927b9d4babe6d215db28e2dc99cfb45e8b581fe6fa0eade76aee5c",9.317957166392093],[5114,"11e4eaf6dbaad8027fac916f50cec224c59343e7fde31d835d37ed6fcdcb7dde",9.917710196779964],[5407,"570da72610d48fa07bd89ffbb9eb9b575904ba2b8f9cd54a9cc505618958c2dc",9.917710196779964],[13763,"2c8cc972ae67f9812785e00c94d7706e1ab90963855aadd8d208f6cc79bb129a",9.317957166392093],[11699,"9e544c850c00e82e57f07ea1c4a1ae1a6891acd02d23cd6de51855bd14bc50b3",9.317957166392093],[15875,"7afa5384b42d6eb96b1e16dd6b6915601166ec0c0ac5cb8708cd1d5d67bf7c6b",9.538108590364518],[6884,"41a7f6da9ee5d63f499979624b74659d87ffcd024bc1ca953983395e4f6bb5d2",9.317957166392093],[5240,"25c572e15b088365a9ca97aa4e266296892621bcf69b5706eb87b28a4fbbbcdd",9.917710196779964],[13633,"a5410b464ac9e49e9acb1ba279ce9d31b133ed94e4a00d6d676105d51fbaa29c",30.164383561643834],[1705,"3ac4f8378e9a8308ba08dfe05cad16bae273083605e4e05c41301a0b1209e9f4",9.917710196779964],[1046,"e004466cd7e9c2dbf147f93d62f7c1af1769f4b5fc91106ee97725ffc25400f9",9.917710196779964],[6623,"98e533fa4278fd9c9c0579e4fd2faa99a080d31e2e49f167022c1823d8d67fd4",9.917710196779964],[15838,"49d186c9b30024fe145cff0d0adbde2772fb7edcf892b493f46b75a08148916c",9.317957166392093],[12733,"7055b135a95d62bd3849d3e606da31c1afdb178dbd09b2bb05bd81abb19861ac",9.917710196779964],[14841,"6ae4686b136779df7bfcbd2e44e07790be10672821ff71efea52c07ef1b61882",9.317957166392093],[12932,"a47c2318b30a008d8a1805dd58394b806c3d463fe55bce2d32ea285f1fa505ab",9.317957166392093],[12198,"c95f6376a325ef875bc6e6fea5a732097e5bf944b830326fe9fec6eaf65412b0",9.317957166392093],[15784,"deddd76aaa80a39f784d46420d51ea5ecde2b8d2a0f8b5e90f429ec408a09b6d",9.317957166392093],[10317,"81c802be30fcce9fa3944ada49b27cfecfaa1a0c685df9cc39155b6ecbe53bbc",9.317957166392093],[6409,"687e88ffc6f320ef9239e210a896d9384e0124fdf38796c20e8d170bfa1548d6",9.917710196779964],[16127,"d7133f14a2323af0d7b6dc7d4817d56b6da884814c5fad436fd7062c1f806e65",9.317957166392093],[14201,"19461e85bd61f903a6bfa1d1f5be418dee7f1c230b4dddabead5474ce5e92990",10.052724077328646],[9863,"946cbe6a42abadc9787232b9d05fb4f282cd0b267d6a8705e6801a29e48528bf",9.917710196779964],[11690,"a8a5013cb88ffc3e2d9eb3583a636883390014d597934881912a1142868258b3",9.917710196779964],[19758,"95d5dd75ccd57b94eb3f811eeabe9e915b9a26ab9ae106a3d1173c62a7b94604",9.317957166392093],[4931,"1574510dc5f9f06a2ff2c1accd371f5dd014ce59a829fb30672a198359bea3df",9.917710196779964],[1890,"472cb458065824ade5a72e5075b340aae0c3c512a0567714a541ce6cdeeba8f3",9.917710196779964],[134,"5e6a53b1edd597e3d831fc1d755e3ee44fbbcfed888bfe45e67f6ad74cfd18ff",9.917710196779964],[1768,"1412ee8a1f66a927ff96b179abedbeb135e060f5fdcc79426c171fad5a877af4",9.317957166392093],[17786,"496b4782a21b6f4b0b85358aa3013782943961eaafe02c2eff67c4ff68d59541",9.317957166392093],[3384,"b41eb76ab460ba9799aaeef44f5a36e2fa0d856ff05cfef1f973b27472d8cfe9",37.981042654028435],[14477,"a6bff832dd6f295c93e09d787fe1e00b973b22d4a04878d49d12e19a39f6b389",9.317957166392093],[8670,"f49a019dca15844002fd82b3769516d6fdd7959a46c37bdb8a538d37686cdbc6",9.317957166392093],[12381,"6cbdce03e2f6493247f5f78ff5c2948ecde929df48b318a6f381dd6794e9c2ae",9.917710196779964],[2899,"c77fc8254957c51585d310d2d5df745b75c3dceac47f89f6dbde76a20ffc22ed",9.317957166392093],[461,"fd57cb6057611aeb1ce10c38a1f69105837161c68720f3bc4d814a4fd722e7fc",9.317957166392093],[7221,"2171639be455abcf75e1b353fcf3370ba324b70edeb2a3d04c450fe2f9648bd0",9.317957166392093],[11955,"3d37d99b53332c623fd4a78622be47b8df9f05200c75f619a9564765a835a2b1",9.917710196779964],[1595,"7b34aa12e0f5a9724bec5a8d4d59536f28dcaaf4623bd5a91ecf5afb8cad93f5",9.917710196779964],[17783,"e5ebb2309d4fd3dbfdf09bf18d25dac5897d5f12bbc453f225f8556218d8a141",9.317957166392093],[19667,"a4853baedf979f52173ddc2c117ae6a403ae7873a57955281e59f21244439007",9.317957166392093],[15496,"fa00bfb06a59419eab611eeee41e78882e942eb10475bd9b7d7f1de6ded42774",9.317957166392093],[11442,"353093856d61e0cdbb793d34c73dd8d92bd184dfdbee11db9fe597529db1feb4",9.917710196779964],[1050,"a90cc40d9a8fa0c95ea155861cbe74af189c4f1c8b410f3c4c3e4e24c18df4f8",9.917710196779964],[17201,"726e3fe96a900a729890d2803734993c5aef8986cebe059074dd7eb24db2be4d",9.647446457990116],[13674,"00840d33e6661041cbba3958b3be64c51f1b05d9095cee710e96dc7cdc4bcb9b",9.317957166392093],[9487,"79e7aa318830da7b9a6526a90cc57dcddfcee9f6aaeb04856b8cb94e1815c6c1",9.317957166392093],[13105,"4837d551dfb8f4c9261c41e6b157d776e19e85f4735c32e13b4799785355f8a8",9.317957166392093],[17161,"a96583985fbcfe94a37fecfb16dec563178db8fc266b160cc41ffe843771d14e",9.317957166392093],[9922,"8c8f7bbfdba614bd39479c98faceadf69e86931990214fc37886c49e0ac2d2be",9.917710196779964],[5301,"d288d5a491685d1351ef252e0aba98d6c023611b9b971074e7510f09538763dd",9.917710196779964],[13730,"329f4c11470123a8043de9319e67301858767aa96b64073134d0f6397b85d59a",9.317957166392093],[4110,"61fe575f4458421f212eb4155a94b497c443e6ac35960cc6aa715626dacbf7e4",9.917710196779964],[17955,"88da53f18212bae58675326bc959773a0bff4825d45fd2ab56f22fc2dcc0223e",9.317957166392093],[7327,"78b6a4ce6e40e4300098b5ae8c8617a528dd33096fcced4996d05098957ce3cf",9.917710196779964],[18089,"48037653423c6baf4f9e78b1033fd606a453bef825128f9290cd964c781d4d3b",31.611834319526626],[9155,"8e8748da8d761987a754b983e87a468c4876e0ee396a8b70b52213363f42c9c3",9.317957166392093],[13034,"85df1e880949f6a412d65003ae4eaead235bc7b69b817ef156a7d47d222c63aa",9.917710196779964],[1785,"93ae59a9b3769c3d88b2e9c065e6f2178242a16cc2774886101c7dca532056f4",9.647446457990116],[3317,"ddc55da8fcbfa2fc763378024ba9da635002e57b77d85399be9bbf6395953eea",9.917710196779964],[654,"1c897f8d7ad982ff80a7de5c58471f57e67347dbcd5b14363fdd0e2f9eb48cfb",9.917710196779964],[10380,"6ac22d69f4402a8b0390a9c5aba7b3628ccd9b2f452f1fadc784d014f96aebbb",9.917710196779964],[13113,"73b800376a89eb39a869dbcbe3a656f0007411f46f8646081f39d21eff97c3a8",29.33653846153846],[7379,"70f8d8a0f9e96a9ed7b048c107079bfd9d97d56f758f50a33555bc40338d8ecf",9.917710196779964],[94,"6510e6637f208dcdb70a0c6b7f01999b96e8b2e5daa0a9ed01e0f809477e69ff",9.317957166392093],[11673,"f5c287cac08c342040fbe05558e2f95e3ee2ed26a90dc4af8ff9e897d7d273b3",9.917710196779964],[11242,"8a1f430aeb5c6f360271f63fafa57f335d61d9eb06009ef5cdba05bc2bff65b6",9.917710196779964],[6964,"19d6dc86d71a82a7f6126da746b126b2c5e028e5586619db43c82efafe0c30d2",9.917710196779964],[8845,"d3c589c74c16bc475c706b7e62a94439776a898264dd7cd8a5bb36349473d0c5",9.917710196779964],[11791,"9cb5371ce09b75a16016b680a54a2e06ba98863b5efab3716b7bddaf33b8c6b2",9.917710196779964],[11251,"19c2b01896a6eab78f2f3363f7ba727fbf0ed345ad39f4a63c75683c32cc57b6",9.917710196779964],[11,"5e1944e9cda15dd300c2448f2411c328dde52aac0c902c4dafa550918317f1ff",9.917710196779964],[288,"5d46eb2ffc73dfe95254b95d586cd2091b0083180eb327995ca5d7b021c103fe",9.428571428571429],[2485,"bbb45c52642d7c8236a9ca277a537122df2ca8dd11bba89f90d12d52e381f2ef",9.917710196779964],[11531,"2028f676f65a5587a8df4a616e0a7a12720d4e867a6ab1d3322b708b480c57b4",9.917710196779964],[11601,"ff2d85387bb7d1ea3cbc0f169e704b5b8cac2095f18e0a695a6069b7909ae5b3",9.647446457990116],[11006,"b695c5dcc99849aeb44da871e096c7829be25b1095e028c23e179bf42b3ff3b7",9.917710196779964],[1963,"271f970e0d9cf07cd8b17efba551a7ae9e3bda0513858a1c284f2e03d4d745f3",9.917710196779964],[2099,"0d69a8bddefdd1b805a51ea5c2caac946c1f4e80bc13f10b5b92bb49a90c44f2",9.917710196779964],[6786,"4288dcdf6776eeb6aec655170026d8acfd38f5a3f3899aabd2705f86325962d3",9.917710196779964],[10461,"5d91114e285fd38b8da81660652caef5d475b361dc61bb89994b2d33991b5fbb",9.917710196779964],[5248,"9cd40c62d21ea0521a85bd1ee79d29eea27604727157e3b67cd236daedf0b4dd",9.317957166392093],[5500,"ec3132c33d6f65eebf1cbee024aed333183d8b1834c8bd1c748c8f1731db39dc",9.917710196779964],[9638,"2384dab09ef47828d01bf1731e338925c9a9f8a986f6f09e6516f2198b4dcac0",9.917710196779964],[4053,"e612add0ab7e6c6850bde9b5dba823dcd21a7090cdd873f302cc56b5ee6c68e5",9.917710196779964],[8442,"680a2f4fd9759f53627125dd2f92e18c1a24d236031d5c4504054a6adfb05dc8",9.317957166392093],[15522,"cdff49b8bd21182e3b8d134600a3de19a9f6907f123ca1bffc8e6e7b007b8d73",17.089005235602095],[16772,"92af532ba7db25c35eb2a27056027440a0d384e41c91cbc3df4f28a1519afc56",10.032829052018817],[5174,"e5f44b8b6d35da1271fa4a3ef8d306d37637f9d64f993e81cc7bb3a68f1b21de",9.317957166392093],[12366,"f75215dcfb7e208c7637751aca2715a86aaab3f52b676717ba8e62f99f21d1ae",9.424083769633508],[17404,"56aeae789ac89036fcb8f796ea01fcea7a65f3d92d058c4567f9d9a974b5b649",9.317957166392093],[3357,"b3588e9e76338257bc83404bf7db6a3c165818ac3884e6c5b002fe0c3795fce9",9.917710196779964],[6322,"04ef99fdebeb0f9829a3cea3fed957a6c890d8a5203b1a505a3b4062b9a7d6d6",9.917710196779964],[16819,"b8f905e1e696e88d5d9313f9ce89f3262885585239673a15fd0df0d6753cdc55",9.317957166392093],[6669,"aa930a4f90ba9e59b4578a989a0c7f06663e63566ad1b7c9c29875ab40bf2cd4",9.917710196779964],[5625,"e8426dac84a7b86e2bffc54e80a329062d5a3b98ded5aca83a2a4889589585db",9.917710196779964],[6919,"7c195020cbefc1ea6a3637844428d0bf6466b4209a5c5236d1f95cd16cf979d2",9.317957166392093],[15671,"ac677c05162b9f7bfed50f0f926fcf363ad832ae380f0df31812d223c4f4f86f",9.317957166392093],[5830,"d5be2c56d672a82d5058a7217e051f177ec4a9099979814a987109c63de928da",9.917710196779964],[3118,"f074696ab83d634b2dc0d0e8769a2099d1e6445f6498bf5954950b313e4e8beb",9.917710196779964],[13139,"b08f8f9afc0159c43c5801f90623d08cbd79b723a79ff46fd97c7c39275b30a8",9.317957166392093],[19021,"1aad5e93d19d650402656b0be07b74d302f6547dafd4bbfcfe9424c6207cd61f",10.02710027100271],[16530,"a606f5161a1ebaa838cec0fb981b0c9fb402dc97fba79a0a08f2f61c841e835c",9.317957166392093],[16485,"cf314ef08ec36fe8c8f46eec136b581f66a79be8e8918b8d67932d6c44cb855d",9.317957166392093],[7067,"fd9315c1c3079cbaf4aa0754c06ce656dc10f942a3567a5247276b9154758ad1",9.917710196779964],[15558,"97cb31ea818ecd09ba09b8541a3e3f09e84e0e920492da63294969d3aa599c72",17.23658051689861],[5748,"4a8898880b92e6fc4c32e510dd78c519d70e9fc25fc10c5107bd8c1381c2c9da",9.917710196779964],[6818,"e133335b075c4fe81a4e2e3361d36a2c27adffdca6b0077e759ea20289512cd3",25.358885017421603],[16880,"cc5e3f383c2822ac5f1bd755e5753e90c6b2c4dc05a0da5b58df8fa7602a9a54",18.09625668449198],[16359,"82d49164d7c37763d3a271f8189a483bc154c7247bfbed2b0892edb0696ee45f",19.25179856115108],[9849,"1e6f6de39db1ba5a3e2424a284376358c8932895514fabb7c9d34f0855764ebf",9.317957166392093],[4627,"3c8965e409eb4d457cf4560167bbf25ee27a93e550b825a4959a23daf91e74e1",9.917710196779964],[15405,"806477c80841e37c43cd85528f9c8d1e5957e6bf7e8c4ab5b1d7439e81143476",9.317957166392093],[1318,"a6ca8ad013ddfe39ed808d7a595982906c85de87d448bb65c7b7251966ea4cf7",9.917710196779964],[7001,"165e5141fc72dc8b99d7f67798b38fb35e1886313087f2dd9c2e0533b0cefad1",9.917710196779964],[7990,"6b5b58448435a31f7037f2f203246f3c251ec0d309de63d76d21eb26630797cb",10.052724077328646],[425,"f2110fa2ce680662e85966a119594a6932f4b1609965cfad100bde6baa3534fd",9.917710196779964],[4169,"e5c4d9f29da4dcb01e95a06aa0ecac84e31d0ef8e3712c68287711144c89a4e4",9.917710196779964],[8943,"8eb00a17df1d253a45620586eb88afcfcd47a159b5e37e4c5337c740392f2ac5",9.917710196779964],[4301,"9ccfd11d18bb5da9fe2cc2625c75520f026169654ffbabb0328f1f5cc627bae3",9.917710196779964],[9959,"c8b629ed168d41ab24d8f683d40f11e0f991389721a4d50b47574cf0020293be",9.917710196779964],[9659,"4c081558edd6c0e8261a661aa372ece9350a8918cd78b4b9fe87d9fb3485a5c0",9.317957166392093],[1550,"ebc87829bf7f60e044a2a2fe24526c5c57e0b0f6d84051a77f450d285c8ed3f5",9.317957166392093],[4080,"8c51efaf85eb91e0ba5e5a95025968e64adab199f6a1ccf4987366d00c3b34e5",9.917710196779964],[17792,"18765325a64da180e70ee5a08c8c8758bb12d43de8fcb6d0e3799bf9be1b8441",9.317957166392093],[12361,"8d45229751a2e1f523cc6d463d90842750fb775f6b7b40d075f71749abf3d8ae",9.917710196779964],[8614,"bc7b15c24b9c8ee29d615148fa27a1dc0e8619c92d408ff5cf8fda5bd8ff54c7",9.647446457990116],[3407,"3358970593286a2717e34e3ba4c32cfafadefd5933ec07f872314fd13543a3e9",9.317957166392093],[3922,"f2c050df25e6c718aedcff5f8b47704fac1dd49f83c99ac22004fce1da6032e6",9.917710196779964],[2605,"7aff98567f58c31a0506fd55bf1341c7555719332a6df0fddee5f69fd6dc1fef",9.917710196779964],[19242,"4a257f26ed4a34f449da6a263c5962d86dc4d540debc7774de6bd482fcfb1e17",73.19778188539742],[1783,"75f9170483b93a98ff0dfc85417ac040f2643e49467212844d1b2d383e0f58f4",9.917710196779964],[754,"56fe97ef267656a4c6eadf95ceabb4453b04b08b78fd343b76278a50950bd6fa",9.917710196779964],[3048,"b5b7720e0e21513c4a79fecf1dd7a00b542a5268d8e071bbdbf3ba94b3e0fceb",9.317957166392093],[18659,"a4b3620c6faa90a22719849160f13ec54930bd0182134ca82264348bade2512c",18.109734513274336],[545,"c46b2be3ada56b16d0a950883c87daf8fa4c70e1d96c9ea8289e9aa39a6852fc",9.917710196779964],[18259,"91b56768909388d17c11578723af047ab5a3ec54462c43621fd40fdbf7d7cd36",9.317957166392093],[9265,"c5035b49f68a8f5f1c7cbcb1067c72f1d3f74d7ee8cde8acef924c2b64340ec3",9.317957166392093],[5150,"202ba9ba18dfaa7fbca0fef71dc84d179f4f8f8ab1eeacb022daea14765049de",9.917710196779964],[8978,"0cabe8522563c6c78343773a5bda8667e67a03cee08efc222220c6111bd7f4c4",9.917710196779964],[255,"d0bebbe7efe471fcd21b0837bba2341c6416043f7158b087c6a299cb8c6a44fe",9.917710196779964],[11023,"5d99e864683bd43dd2842f9dd0ab600bdc323bb4ef3df5ac53811c6c2c43ddb7",9.917710196779964],[18159,"407dfb0e2be4ede150007565e06713fa9afd4cd891e9996698b42ece0c3b2539",9.317957166392093],[1935,"bcb74b3eede24f57d3951f1c4f1d1b2a15af84b4364fa4e46d1bf34c6a0273f3",9.917710196779964],[5512,"1c027d94ea7a8b8c137676d463537a7e6b2ce3b0d96d9861dbf83229435f27dc",9.917710196779964],[15695,"07462547fec223d05e31d644ce7468c5055d6f2cdffbc960dd7bdeb961b89b6f",9.317957166392093],[3379,"f29e23a87944cbd495b580559309800086bcc54f12a803ed49ede4c2ba2dd6e9",9.917710196779964],[14820,"905a91cc4af19f4232fc218a612a913a3e91a79df9d2ef317e4af523e43c6582",9.416370106761565],[4281,"b84a3d5c10812d9aec826150c0953cb0d128f2c076e150f73ff281f4213ee6e3",9.317957166392093],[1405,"783c4b970b9ba8fea7311364d1ed182a80576f4cab4757fdbe928cb5accdc9f6",9.317957166392093],[9799,"23c0bcbd0bc6ab4a901b077cbdc9da601add2216835faf35969c1ead1d1ea5bf",9.917710196779964],[16990,"365fe4f6af070f50a4530863b82adb453c5a8422a995d2e65631bd181a914852",9.317957166392093],[5762,"008ac6d9715ffacad61266b59ac4ad3587b816f961a0a3894107e87bd869b3da",9.917710196779964],[2224,"f158e17a0e987d0bee5752c6d0a14293d0eb22fcc36dd6a12a064c507c935ef1",9.917710196779964],[8759,"8e4733ab660132f62811da52b74b8581d2a4e1896da8662c405fcbb3d1b446c6",9.917710196779964],[1561,"73139aa85b647078af0e54df619c34df9dac397efb8e6501242f245681f2c0f5",9.917710196779964],[13185,"9e087b2a1a46669a6768810ee950eda9e18a0fa33ad85f46b6299e8b107c4aa7",9.317957166392093],[12383,"c6496ef32548d15fd967e0bc5267ebf7fa37b8ae03225a387338b01be683beae",9.917710196779964],[10796,"d7b5f1aeaf232e840808b8aafddd78adc3cdb8e0127aedb55c1d067677cb51b9",9.917710196779964],[19491,"89efa0fd31f4b006f8a38a27cd6fc89283aaf4557324936d7da3b2786925b00e",9.317957166392093],[7810,"9764db4fde32123bfd6785209a5ef7549a057c14134c1733bd991da878adb5cc",9.917710196779964],[10803,"aad88ddaac8a598d42f976044336e9e2ea11e61e8cc2635f77a829acd97945b9",9.317957166392093],[2071,"a67f7fc7e3893a418cacef08f7e3463a1550b7167ecf5bdf518a8d6dc5f970f2",9.317957166392093],[382,"591428f336bdf6bdfd99d35bef648cdc89c83cc1350c104fced71410b5e07afd",9.917710196779964],[2715,"dea24f721eb8af15e1c728f7c501af92df955dd9e653afb2205f13f0069e55ee",9.917710196779964],[18944,"f0a78f39fadf31289d6e83a16565a60d7c0760c17ea9e1afc4abe11ccdef4d22",9.317957166392093],[1098,"fbefb737f063eea56491072dee88862cd70525725ab59878e49c1a4443d594f8",9.917710196779964],[12191,"96904820fe42df3f2d50b11979fa5a57227a67bdb49c3525f39c163fa47c1fb0",9.917710196779964],[12950,"a8604d0a37ed12d552133a5e05237d9566cc2986628a9bf9cd1363bd0777e8aa",9.917710196779964],[10598,"d6348097195be6c1006f860ff374fe24da1596fd1de653c4602e4bcca535a7ba",9.917710196779964],[7634,"edb43ae05828408b76d0103c346bf8335c894f1330270a10f1648132f0cdfccd",12.525612472160356],[16104,"b3665903305a5a0890b19f11243bfafb48c920f49c956f735dc63e6f48520666",35.831932773109244],[10851,"2721f13572e6b5dc1dc75d1fb01516610b6191fb42aacc5b4d039c9907cdffb8",9.317957166392093],[781,"50edc3d0c3c2d852e2d299297a2fa8757e4150679af37ed4f9b7b4006a7ea4fa",9.317957166392093],[14160,"a85bfa82c799ffc92bb4b9ce2bb3ef9e7eef9a241eda3b77e2db65719cb13691",9.317957166392093],[14768,"27ccff31e39268831b0ca5392c1273aed22c06a95c0cd878b1605fbaf74f9283",9.317957166392093],[17372,"6df164e24cc4f8563d7300f60389b13397c58de6d15f1f4cc68413cf604b6c4a",25],[11400,"0779a3ef1c232952106570eaa076da5a08823469afd9bf1d79e05020785c56b5",9.917710196779964],[3142,"fc86dedf79727dd847774060732b12c41fb5c57a5f3b86fdf8246f129cfc6ceb",9.917710196779964],[12195,"9e55961e060ce1dbf330240523f70e4496b0ab3a07c4338207a9c458b21016b0",9.917710196779964],[11267,"161956096751137ef8b2692219e0cdaf71d199bfd2145aa3bb5d53e0094c3db6",37.935483870967744],[13903,"29dc5cba39bd99f22eaa0e58389546079e05042984348e0b5e3d9a468862fa96",9.317957166392093],[17279,"7253bae0d43a2cdd9190a5fd6dac3e53607214ffb42d56dc8229dcba17809f4c",9.317957166392093],[11569,"f6556a1ed83913540bd3aeb240349366edb43db21ccd01565a6a2198c87f21b4",9.917710196779964],[7493,"15f578ae7686c831fd69cbea56b202b71c56b9e7b12edb027ba26a18f297c7ce",9.917710196779964],[1190,"020fecffae979f1909a586d9aecff10698ee7e6be5029d35b92eb58e1b1514f8",9.917710196779964],[11300,"65a1a5c4a5ce4a526c9786915bd3f38647384482075d95ce093e29989f8a0ab6",9.317957166392093],[4259,"dcbd957c34d008cb92e937742c3401dce73dddc408a0b52e8cbe64e4a54e08e4",9.917710196779964],[6118,"da98702ad8d2896c7d6ea26cfa2c0e2c799e91ffa836fd03bb166e2b9dba52d8",9.917710196779964],[17860,"bde9ed7571b04654e6695afa91ed091174b0c0f0e6168b0898db8a4a68b0f73f",9.317957166392093],[7298,"ca723252c7ff0ffdf43da402a4f45cc1eb4551c0d203ffa26db06da158c516d0",9.917710196779964],[6204,"6adbfb02a513d373209ce3e14a23341413984e285fe813a89a2363ca8d0cb9d7",9.917710196779964],[7012,"7830e604ed11171565d3f2f0f3c92b4b1c0503f8e2e9bb990a4864358b26ecd1",9.917710196779964],[5637,"4972943331bc9cfdfb52514e5df7b96d3bb6a02c2cb538c1d26c7773a4636cdb",9.917710196779964],[3475,"17f25277a142dddd9a5ab50c4ff41812e07897ba2e59dc4a35e0afee630633e9",10.052724077328646],[16802,"aa54b7c1a37fcefc79ef67e6b80d47b0decc847aba50eb2167e1108a485d3d56",9.317957166392093],[11509,"c439550d71255ba74f41a0782994b3c54f36b250633266880c4eca80c12076b4",9.917710196779964],[3491,"a9e02a743dca8bba1d881f8d0cc9f745a6532b8727e26c420e7d9ea9dd2615e9",9.917710196779964],[2262,"930f74d3168b9be0bbdf5e290988c3af22d67ff656be16358a978a4c4ba730f1",9.917710196779964],[3279,"4a170565a62fe3c1b03a0c0dfe2cc08098e7ac52da654f7d61032cf316918aea",9.917710196779964],[19748,"a4fdb8f8f36e34ad14989fd13caae0176a9aaf779404229d164970bd8f24e804",37.936395759717314],[16507,"b34b196acbdf7c1e1ae59b0fabab70602e68c1bc1aaac0f5a9bd140a9e791b5d",9.317957166392093],[11401,"9514fda4d638ee0534f9881a93ee7725fd560b7636839baab9d14a55173955b5",9.917710196779964],[4499,"fc17d24e7d2fb9e977f9285ca3abcc5f576d03e109ff2a2ca1414914db1168e2",9.917710196779964],[18187,"d40924d1c93b74e0ec4c89f034f9ba9b0167c77f0cd65a18be2ec0e9b07d8538",9.317957166392093],[1620,"836f2a39307e1582f90d280734b28633fc32f667ae3c6219ad7affaf373573f5",9.317957166392093],[7740,"1f3d19aedbee4dddf4019f9e2e8db393f77ea2d74285529dc2e8e5a5a3a23bcd",9.317957166392093],[8035,"d3e89ec1c2e16747f3b1e481d69b866e6c46a644479a43c6948f72e326ca56cb",9.917710196779964],[17743,"9d3bfebef98e1d934e4328504be0af873ed0915be6cd4576775ed0e6c7085242",31.05169340463458],[10330,"885a89fc660e59fc78c24b28db75ca570ee76d32269a8962baee67a93b4f23bc",9.317957166392093],[2418,"42c4c266a3c8cd9706beef7e22e5c689cc0ce72a2f2fcc137f397a6e44e257f0",9.317957166392093],[13133,"9ae3b902b478a0879d9a2b472fe53bbf7a68fc4bbaf48f3bb0ff593b73664ba8",9.317957166392093],[3241,"5d9688a161f435ffeec1add9b8729ee1f2fdd71cd6810f24fd25b360dd3bbaea",9.917710196779964],[10462,"b87754395f5298dbf2c07f83d231700e8a75379c8ae86365358d3845d5135abb",9.917710196779964],[7606,"9e92e3ea9e1f0458c46bb0cdaa7176662050a2d1c4cbd1b32e2350221eec2ace",9.917710196779964],[14742,"72ac9366ef0a18f9cdfe6e9d281a33c93e67de8e12eae2e1b0d1bfff03150284",9.317957166392093],[19376,"205bcb452aa05af518852a38451d790bd192409223cce347b5df6abc87babc12",9.317957166392093],[10845,"20d3cf76ce041cb8b39622849ccf4423f71fc91aecf50e3e2f9c71c4adbb06b9",9.917710196779964],[753,"2e42094dc65d097d033926d3699d0ac400df8fef4ccebb793bee9502f9b6d8fa",9.917710196779964],[360,"806f4d3902713bc1f541c75d5064e48f0da344da453554a412d0aa5fefc5acfd",9.917710196779964],[2566,"695cade054107867f6fff60f2a49965f6cb60f34df9658034b25312d261d79ef",9.917710196779964],[13222,"3a1618de711bdfb49d57fc2ab6213cc24b216ec21be4496c726f2171c0b877a6",9.317957166392093],[3342,"f55f0a44025b6bd5ee2389697bfea3bcd6f976adf21888b7be56b803506d0cea",9.917710196779964],[19071,"9a3e10064208f0f0442877fa8de1dc0f968681d630e6e7018b7a387a2cb6d91d",9.424083769633508],[11252,"0c692e9381d53a8c7b93bab308fffb66f906e34cd21e7811c37121f80e4c57b6",9.917710196779964],[17714,"64553d08f3aa0b54a76353bc5837f591bff08632b66e335cab9cb23af3c6f042",9.317957166392093],[18720,"40169b18558f2b514df070829ed93dd05a05d0ecc145e5fe009f5d300d65ad29",25],[10184,"4aa927d2558ef996981c1ad530012748780c64d15e4ac99d47065f11e74b21bd",9.917710196779964],[106,"21855b3fe16e0f556faea4713d80c1b8df01ddb9dff9fc04a9bcf697c39856ff",9.917710196779964],[14326,"14502f6a1b03bd995f6853c042f055ab62c7ab1c6ce53079985eae66f63ce98c",9.317957166392093],[18031,"d75365db995c4bc072f644fbff4dc1cc28d927277141ea76f12e1211af4ab83c",9.317957166392093],[15497,"a0c7b43d22dcd34f442aed72d10cb015a164c5965bd0064df127953f48ca2174",9.317957166392093],[9285,"c8f6c41a240d2d97bf45f6bff08de5bf93a59859d35d29014630bec5ebf5e9c2",9.317957166392093],[17020,"1b16954c0a70efa61d754b3b808b6e09166602a7245471f327198f9c1ab38d51",9.9869192561356],[5679,"c17bf9013f3a2caa4803468184cd02d8e5680dfa04964cd6c1942a4ea04e2adb",9.917710196779964],[18204,"591416d6573deffd4cbaacdebed9e55ad6c563ad37345c5f924908b823791038",19],[11311,"8790c404af657847bb3644660bffb7ec4f147a307631787297f435010f05ecb5",9.917710196779964],[393,"d690d630aff1bb0439a49721377b32cdf0af14b2e2e91a634ff38c2adff864fd",9.917710196779964],[9026,"b3e5b794dc6b84dbf8548138006bf6eb414c9dd38b6587dafc90a2bc78e69ec4",9.917710196779964],[9649,"11a1e2343c095f7c0460c45e40342fff775ac83b7281b61417787bf88c07b6c0",9.917710196779964],[9378,"166e4c5a756a3aefd399084240ca36f6319f1f738d53544936f3c84b9a8a62c2",9.917710196779964],[16698,"4c383470f34e6d5fe6fdbe922aaeb6d7c3990cbbf61e48ec4c50d7b811a58658",9.317957166392093],[15949,"53d2031f19f419e8049ca9821759d160c354f5b30d39e437ec7ac3984924f569",9.317957166392093],[4163,"1b71d53bc5daf46d126540b0daa3cc7c7d8bcac55c384ac6c52e9719690ea8e4",9.917710196779964],[7433,"76719bd9a29b2ef6bfcfd50fc1331dc61856e39b239f65e039ff69f6bfb62acf",9.917710196779964],[1639,"23cce3663be140efe0021c6d1ad8053722c70439728814cebf541113a7f65cf5",9.917710196779964],[1671,"e2a92d1bbdf51c51627e43061156dc01f45c3febeb22e92953eeea2aa0ef1ff5",9.317957166392093],[8951,"f619bc18c6906e18e503e2ac354aa1d0b175d90b94a0ccb32a0df7e5e8a21dc5",9.317957166392093],[9681,"56006b5f76535fafca97bfce49fa2485b0328614c92a469fdf965128f4c084c0",10],[18598,"8925c23bb3bc692bb2432adf1cd873d0eb8d1d19235cfd378b3c98d92513c82e",9.317957166392093],[9568,"2e83962f9c1cc53dfdc3b5096272ab281117213a7935e37771cce08e220f31c1",9.647446457990116],[11395,"856e978203ca52a626b7b00dbbc3128a30104767e24216876d70daef4d9a63b5",19],[5632,"79978d907ee9a104393b571ada76bf77fe7c6b3bf23183ef00cecd39a8c370db",9.317957166392093],[19537,"48d2c9017753ec8b03af555d594f12f02ba1cad15a09246383012e32c6e03a0d",26.17687074829932],[9795,"9d20b9ee92dcda0d6d49c47ee53def83531e6819f98de91b858de66a0f80aebf",16.07111111111111],[14009,"f62818f66abf34cc7786362fd6264fa58f32dbda1e7db868691286c1e5e79494",10.052724077328646],[1539,"460bb253dd8b36b0c987e08f7342c9c4fc97f872cadd2db2bcbcdbf92ae1e5f5",9.917710196779964],[2720,"19de5d628a86854388a5947f1323bd66673328b1b6ebf077fb79130dc32e49ee",9.317957166392093],[16891,"4a7888428d58bf451dcb37fc5eaad80086adf150a4599ff73b2ba3c3cdf77854",9.317957166392093],[13424,"0299a03272075e30fb1ba1cecc4c64b4a7a17162d28357cddbae6ac44e9eeea1",23.88170055452865],[9330,"062f0efaf838b64dedcf0ccc0fa347b86800e533d260c6a44f49f8945198b5c2",9.917710196779964],[16060,"7ea456808d2a889e9cfa144aaf2c8f89da3af36927c2beb3bb4b438e6b5f3067",28.126696832579185],[5209,"e488d1e34e78987dcd44d299951797ec4da7bacee5b9d58ff5e33193c9c4efdd",9.917710196779964],[16430,"8640ffd45e609307fc607b3a95bfd69e4945d6ea7350d4c51cb86ac4b788805e",9.317957166392093],[11130,"fb74ebbe1cb464d6962b3adab1203235b41b12fd4955073e3c6863a0367f1ab7",9.917710196779964],[10115,"031159ad364384bd26c82b30b99e4aab0faedf8b97fbc4f324f292f493879abd",9.917710196779964],[17696,"57268ce6a92cc20561dd32fd07d18a1ffe266c314ae57068588b984ccff24843",9.317957166392093],[17283,"0e64e297a6c8a451a7e2b5ca01aee5259222de14fb73534b3cedbcd6ab49884c",9.317957166392093],[2752,"17c9deb92f09441c75631363c6cad91e130c14199601d98220d65db5f83c17ee",9.917710196779964],[5352,"71d07deebc994d426db8df8b12111a1b57a83c79baa3aa10879c15ded7e623dd",9.917710196779964],[11895,"1997d88f286e99fe8bbabe0985d04cc5185c0297961543109562bc6c890010b2",9.446224256292906],[19684,"ef67de6ceec01aba54357020dc942154ccf03ee1d751d6373c870fb22a573f07",9.317957166392093],[433,"6d13e5dc9ca74a8fcdd62b0c642be9c28d4765efdd9ebf9d985cacc44b9d23fd",9.917710196779964],[18707,"98e5b067d9bdadab71af3e1ef9d811a0c64e32079ba07ba0551583cc0729062a",9.317957166392093],[16866,"d42ebeacef10182cb7bc6bb47d0a767211acdbf2e4fbcb471b7badc64384db54",9.317957166392093],[11287,"09fd149dcb14c902e3a6b8704a4a15d8c60597fcbd3d7343b9c20d82b5f51eb6",9.917710196779964],[1295,"c16d8f34fb50428980d0f3e77c2979d754e68209d60c7041193391d3fa6667f7",10],[16631,"41b03a6b02c6f8cb58f2ae18d30435521b5398efcc551e4f068ee8b73f0c295a",9.317957166392093],[314,"458fbe51ab3bb44a0ed852d16db12a7412e60d18a328e0bbb5a10d4f7424e9fd",9.917710196779964],[2004,"adb05174d926526a569289c122bcc48337ba13f88d3a52861ec3306240e400f3",9.917710196779964],[6999,"88f029f7536e77290a280f55eb5a5259a6a8fe13728b9f237ea65800a383fed1",9.917710196779964],[5764,"e9e7e2467d433bff441114d0ea6683d87c70f6c7b46ff4faf59564fa809eafda",9.317957166392093],[5559,"09395ef299c11e7d0a65428f02388d84c9d7c439db8f36bb16c4a81de841dcdb",9.317957166392093],[12543,"966660bfac91541ccf50b89382c5ece2902cf365a8ed0ca31c60511dcecaa9ad",9.917710196779964],[8214,"4876d373552f793693f69d0cee58cd162a3ab873c9072f7f747ad2b77a6ce0c9",9.917710196779964],[2194,"fbf87676aa6a49f368d59fed52cf4da1f73db1e9990a7c0472b227806cf296f1",9.917710196779964],[5128,"f6b1ce4702bcd8657681334d991e740ab6066abcf2f17c91e77d049a83536ede",9.917710196779964],[19212,"a08699aa548517d768fab713053937863312c9ac7349c270b40a02d2938a6218",9.317957166392093],[11158,"06f587a36c148ec13426f4c5f2c07ed8b2629d20b5508fe542d7414178f5ecb6",9.917710196779964],[16450,"6ae99268c5ebc41d3b14c200428e83ec2d27dc27f42225fee4483a91b298355e",9.317957166392093],[18472,"5eb62434da869e5e660a673b775c0c0d9cb1f24bd51d5f382f1163c5277a3432",9.349282296650717],[18423,"5e37eece4dbf85e86d51a656e9def6393c093d558082363289427cc0489c2233",9.317957166392093],[16472,"9614e6b7c2ca21006f1ba6d07f1d1443abbca79f32d77d3f6186cef3f511e05d",9.317957166392093],[3252,"3b352c5210a7a53124abf5d9794a73f8f6199371f5c8794c654e7f16ab92a6ea",9.317957166392093],[6016,"c2c52482a0421830b93800aebfaf33473dae259677bcf2b2a724dac3866cf6d8",9.651245551601424],[3266,"6a54384d0ae9a33f8f1e20eaafb620a7e4d878fcfa3cff1e3dd45cf5cc1b95ea",9.917710196779964],[5052,"99a6f0c82cc66660f9ad6b9cf0303cddae2256ac507bc302abd89beba512dbde",9.917710196779964],[1522,"90816cfe36511d79784534853e6e34e547375228a68d62b11e449b88d6c9f7f5",9.917710196779964],[3799,"91855a14d72cc918c25fe6256f14a7926ae3c7a73c2b18b5ad5eb8d3572af8e6",9.317957166392093],[14041,"9439c5c35c21fa7e21607f6a99c406b60c5f9fd599015e7267a2aad2a912d693",9.317957166392093],[1339,"b3a377ba87c7671eef14039076cb8740716835afab58462fc850b3d18cac26f7",9.917710196779964],[17928,"d10ce7b5f96ff5f9c3e621a98a81fc10402b5850a66bc529ee31c0a7d938b83e",9.317957166392093],[7195,"0ba6e060c7494beb00196eb1c1d12c29a7858ff5bc7e8b612a2cf8574253bcd0",9.317957166392093],[2662,"b52c6d5e65381fe40b36121f39084dee210e6252f14a636b63a2b92ca7a9c8ee",9.917710196779964],[17566,"1c40eb15306df65c5d9406b05717fd260ddacd64f0090c709daf2e82e0c10046",9.317957166392093],[16090,"c144cd4509b73f67564ff354eb35f167563de643f52d60ad57ecbdfbe8347566",9.317957166392093],[3341,"acf0cfc9ca6e75ef0cdf5aedb22f9c1213be061ed099eacb6f0bc7a9b05f0dea",9.917710196779964],[15455,"f79c9ef45748379a950207fe6ff9a1cdda8674f284ae21818bba1073f12c0e75",9.317957166392093],[1527,"62ac73f54f804cb5809ed89f11f4f30a29c61f6b6ae7aae114075142befbf1f5",9.917710196779964],[901,"9e93ff2c4a96f1fc90f1ece452d50a8a9bb4426e1d778aa68ef23d52d97bd3f9",9.317957166392093],[19231,"ae798ff9d58821d5da41436b5b203280f43e1ecd4e5f67406964b5588cfda517",9.317957166392093],[1076,"1aed5659389f98cf59dc9506946f064d03202f253b728824cb1ed9235080bff8",9.317957166392093],[13544,"a790365dd55f1f6a5eb89a54bbcf74c72c042dff8fe4954e4523c864e936de9e",9.317957166392093],[12913,"eba37d5a955afc80b75804bed967009c780b07c8d0f8567a5f9c9979355d3aab",9.917710196779964],[1834,"d8191eef2ac97c8cbea4d326d99708f9a91ce2282385f59fbea3fede960509f4",9.917710196779964],[4580,"b3f43c5ff1480484c0c42a52dc6ac77a3082b34e9f496a584a592c29b024bfe1",9.317957166392093],[3752,"a641fb481ec8c73a54239fc282817f04b64341eac0fe4faf607bb43a5b5d3ee7",9.917710196779964],[10651,"81596b0f253f9ddfb701b4a7f4a8512647d5a78a9b4d5e29fdfe3f650c835fba",9.317957166392093],[4998,"fb254bc1625bbd1b033aea6e54c9d1a27c45db1256eb33b9396385e6f44032df",9.917710196779964],[18536,"36c2f9ebff9037d018353bb11940d97e0120e8419696c09a2ddfb498ee5cc430",9.361256544502618],[12965,"f2c77119da18d03a7a65071387e14888648233297a1b4c577f5feb715551c9aa",9.917710196779964],[14182,"4d5422a4b65c67a8ab13e72e14adcc0965fab383f21931a1d848e7ca7d43d090",9.317957166392093],[13292,"59ce1783adff236fbbad9359f1195247c0eb88c73582904f4026e81858eac2a4",9.317957166392093],[4308,"e9f2efac85f260d5f64db4eb7258a26c8d950b15eba8dafdfb806a025bddb4e3",9.917710196779964],[2795,"297d5b63b7643692dd875d12ec52f8b9a0df89169b54e2732ae2f835c789bfed",9.917710196779964],[12024,"a22e77dc75302ee41c33f011ce6c0d50ef93542d5a6b37db983c3f4faea729b1",9.917710196779964],[18915,"1e59b0efcb30c1cca8196af782edab8e29c4eae09baf66085e7288aa269ff022",9.317957166392093],[15989,"680558a94772622d2f6a8624e06cdbabac2f204014f7cb7385967d5f57bdae68",9.317957166392093],[1573,"46f1387ac4dd66a252992a32458110e36e51545af5890dffb911ae1a4642aef5",9.917710196779964],[13382,"c664a1ddbd41407ea0c8d1433939ad23d389febd0e78cc690cda7867694abfa2",10.029095337979566],[3080,"0a4803e3d1d2081c8783df169d2e27a7b1a75c6d246422647be1b533dab3c4eb",18],[19423,"906035732215839c415b9c128f783930edac5221a03c5d2df182e9c94f51bc10",9.317957166392093],[6717,"894a6fdf65330cb64495ee3b18c4e4dd751b1ced7c5e0ccdff29d86ee34dd4d3",9.917710196779964],[13107,"b03adaad1885ee44af049a5c110bc583e8e924ad94ef069ca3740f73bfeceea8",9.317957166392093],[6514,"bbe0e1b9a6a569cb41dcb6dd5bd50df6ade90ab4a464a3a88a9a54efc49a50d5",9.917710196779964],[12692,"a8e1d933e3efb24bf39ffaf0d4924a40641ec8e7f4e6fade18e3d3fd1072a2ac",9.917710196779964],[6730,"16b2a8a2a51c30f09f6372ce2be69728f81c3fac0434c99a3a73ab35766dbdd3",9.917710196779964],[18064,"764ba9398b82b63f1786670542b65c4e16efb3c551cf89e89bfed2d0404bf13b",9.317957166392093],[4501,"e395b2d007561a9851332794a22ff153e15fea0e527580473f6d54af0bae59e2",9.317957166392093],[18516,"71023eb510ae13f41e0eab3f4dac8c25cbb8921942dd64bc5264827d48311931",9.317957166392093],[6201,"9497782cc532a2a0274f8d16a4c38d14684bf328164a3493b5c9b2182793bdd7",9.917710196779964],[7254,"f1f7f781207b1445f5b8a3e3f8aae14eb695745c04bd12432bf7651011b658d0",9.917710196779964],[1952,"5839c441e3fd87dd9b0a0fb5f61c5aa422e4ca233cd56496b295d6fc4f2056f3",9.917710196779964],[8082,"5f2796b1f2c76efc175a0e41586d0b518db5b67a73900101bf444238de89e5ca",9.917710196779964],[5368,"6b73a55b21811c2d4d403796c951a5670810c2e9e2cbcd01ed8c822cf84e0bdd",9.317957166392093],[1092,"5409a556c2cab11acc49e8ffc82a9ff3b1884bb127bb8c644ecfe844e1f39af8",9.917710196779964],[6563,"2542390f6f86a4d149de1dd61491b28283aded9d4f633193a1b9a32229adeed4",9.917710196779964],[1966,"fe178239e2360edadf56d6a4dbf28d4f4bea39dad5f06182191020cbbafe40f3",9.317957166392093],[1392,"a2d9ac7073a7d65a3f5baf92a0cea752c993d3d7c680c0c1b15ccb5c91b7d4f6",9.317957166392093],[9100,"66614cf993ff15d745fdc6667e40c81ba848a03d00ccf25412509e28afca2ac4",9.917710196779964],[5032,"9a5721cab0348febf724807ae582de8de1cea99154fc564388ff8855c5bafade",9.917710196779964],[9130,"ef7b172b85b84547ac017c096c4a146cde11fb99525719a1f675433eb2b0efc3",9.317957166392093],[4635,"4d8f167c903cd46e68ca15658ce70f7325f72fed6ebd144995fdf61bb53667e1",9.917710196779964],[17863,"51c56b8b695d94adf3d902e238b6057cb408a79f83bc45de3e0483eab262ec3f",9.317957166392093],[250,"e93f8a101ac701752bc62af6e3119c030f5226f5ab8862659e7156a209424dfe",9.917710196779964],[4645,"335d73071a89ae277bfbd13cbdeef5a83c9e7b04557f1ba7cdca2824fd8e58e1",9.917710196779964],[8766,"1080fd9ef2628e81c9b3805029e6be7307a7421c6a32c862d44c59cd01fb40c6",9.917710196779964],[2240,"ba0a1de9825a862eb956833809c27c89368c7eb3e8d16f7480fbd6bd941b4ef1",9.647446457990116],[9186,"5f56f6a139e3962f3c61b77e1dec75674b14073a70343819b5467f5a215495c3",9.917710196779964],[9332,"d3fe86a4031a8dbadf279368bf14a72c531b9fbcc82c7b62d39ef6388154b4c2",9.917710196779964],[11507,"0b2cfa2e29d310d9faf241e2ec91967a000cdb2209adb5ecd227077ccc6e79b4",9.997888067581837],[3593,"43154106c0dda1ea69b39b9e647a4501a6516f35a5b4e9a72b715e6cc2775be8",9.917710196779964],[11355,"b2de86a5fc836398aa8c90395ba8bca6e17f06a4fc56044e3344eab85e49a1b5",9.647446457990116],[16032,"88ccb9b01478a67219aca744ac009af1b686fef12a4ac067718de78efb93d667",9.317957166392093],[16440,"799b47d1c593f370d1c76974615a1a955031d2398d5c7f5ecfad2402fab1565e",36.807291666666664],[8707,"1c2ad6cbd709ed20babbc320d0c516067c9f706cf77894caaa6c3b0b435da8c6",9.917710196779964],[4079,"4f57c50ca2b214a5877d7ac6a84d2cc1d2db4dcb6ef7de7f60eb3e88797234e5",9.317957166392093],[10810,"4e40e3f2fa7524038917b2162743366a222227c89e2347d2b6d7f1e3486638b9",9.917710196779964],[15675,"791a9ed29c60d9c805d67e21e6c6dcef84fd2b85637d7645ed749ce177bcee6f",9.317957166392093],[462,"146cb9001577ecac7b1243ca622d9227ff016e167af886ba993602297107e7fc",9.917710196779964],[9036,"1e30043c91e60f08e576feead89a158e7ee9b65b44a396e5c47a6adfd3bb8dc4",9.917710196779964],[4448,"d4ce2d4100d5017b7d1487506173109e821e51a96b95ddf782c213dd0a88c3e2",9.917710196779964],[19476,"5268db7e59880e3bf4f76cb20d173d94ab45a9029154ed83fc4969fa607e3e0f",9.317957166392093],[1924,"5fc6b83acb3d536f22fdd33a50ca3881d3327d27f7a3a7f380773ed3ff9585f3",9.917710196779964],[432,"81db7c7e557d8ada2d601bf8c4139c6e6afbb2d14ff6804cf13bf366d30a24fd",9.317957166392093],[1583,"117462d707da5a2a816f95c916fdfea621c52f535bf085fdadfabaf443e5a2f5",9.917710196779964],[19079,"4647e9049873eb4eea92d3d29473edb6f0845b8c0a453400da64603a9b7e911d",10.052724077328646],[17843,"c037dffd5827f2e2f36b5bbb0a3836516022a70db8cfdb1cf8d2d263d2286340",9.317957166392093],[12427,"78bc0ab2ea83386642a5bed7e026db6994c69f6cdff61e843affb6350b7468ae",9.917710196779964],[4108,"d5fe939a2c2d899520099f416e226e12a055b3dda9be44e6d919d24742b400e5",9.917710196779964],[17684,"449b7c8f9dde5dcf8e3f12e1ed76da8694ceb6d4728dea54db7b211f995e7d43",9.317957166392093],[7834,"b50d16b377c44710762fe7de51a986bd775f82b9390fb861eef06530212b92cc",9.917710196779964],[19105,"ebb767f9cba08279edea73ab2b03c2e9b847fd3342255ecd6d3f6dc64dc98a1c",9.647446457990116],[2583,"23a49074a2b50b6a25975e0158f258cc9d8bccbb64304a5f380184a82c7944ef",9.917710196779964],[19358,"1d9cd1f4b995abf3f0c68cc60a5f683c0fdb46583648803c981db5ca3d366313",9.317957166392093],[17589,"a7b6579d7425678ed1f70ae5175a2f86ac423366286354ec206991c1bbfb7145",9.317957166392093],[5580,"068dc102f180a98940653e16e84a1d500910f014f9ed3531c14e91f18ec8b9db",9.917710196779964],[18097,"d50faea049745971ec1bed0e54b4093d840427907e68e002557502da2748063b",9.317957166392093],[12981,"08d324bf3d64a14d2c17624dfd9cde9ffd5d229f2be1295d25e8b2de4c09b8aa",9.917710196779964],[13491,"8ffb1953e4564a291a00f7cae48b0eb032229fb8f8ba9a03d23aa51350a50aa0",9.317957166392093],[2565,"f563b53b2ba52f1e3e6c633f5371af8b9742e67b2e0de5f9427778c5ff327cef",9.917710196779964],[14306,"1e8eac58487c0ae8be40e57e79cc1af3de7e28b426d4eb028d458969a5e5718d",9.317957166392093],[6013,"0396fa9f529f017769c5dac12ff40de8ca6b5c369ba110f710f95ac5d4c3fcd8",9.917710196779964],[9384,"39de2f6ba9cb991cb9a62a5d55e395b4897d483982096356a5558bb424f15bc2",28.149732620320854],[19719,"065b781c1c487604ab8e2051d7bbf7465edc8bf9994b7892482910006a721006",10.052724077328646],[8009,"f26635eb18bd737f805c23bdefd72affe107a319434f560914c301fd455c79cb",9.917710196779964],[3034,"1070255bec636ff108121743751bf62596c0943378d73e0edae196e4416d14ec",9.317957166392093],[13396,"b008bb73fbf31b1586a03aa6381022cd013d5b1ebe2480760e39646713eb5fa2",9.317957166392093],[9345,"ceb962bdea1fd6ea977ee8f0d2f38374247d42868b4699a4d849764113619bc2",9.317957166392093],[4549,"cc83e3ceb3ae4d29e39602cd3453f4f2cd32e535a6bce68b5e35ceee62b502e2",9.647446457990116],[8206,"da04f9e84fcd60fe2caaeca25bb1024c6f8a9e650223933aa3a124668cffedc9",9.917710196779964],[7613,"1f4825e900aefc06f16bacb8da179dc215fad95f7d7b6527a9341684af1b1ece",9.917710196779964],[12929,"3e1d3e91de42bb1b38bfc4f160ea4125ae2b26be04cc8b600782644160cd0aab",9.917710196779964],[19770,"334fb58ab965d1a11beb7816fa7fbdc4d773a388adc59329f9638a997993b203",9.317957166392093],[10917,"b9f3fb3d144464e320b33655390b5013fe4f9b89954ee5830b9849f3d2cf92b8",9.917710196779964],[6043,"4ebe999f1f9b293c87b9c2891adc2df36a419b182dddd466b6170e3cd648cdd8",9.317957166392093],[9117,"3046ff14a68fd0c0119de6e4c10fc0f63091ce7be03f28c404866bd9e47b09c4",9.917710196779964],[12249,"11d0aefe8ccfc59d7eea0ccb0f1048acf66438cc780a233f3b43a98e7357b1af",9.917710196779964],[4224,"fa8c2fa2f87c4a2071753a2dd2e777a97ebb5e9d212eba97dead325727fa43e4",9.917710196779964],[10183,"94afb0e84fe34d0e820456487c75d1ac146dc63f789cb06aa3e5c32f306d21bd",9.917710196779964],[11326,"f2d6c5e17d4b04b4b842d82ca511d525ae7b7d837639d365efce75d5f822d5b5",9.917710196779964],[16686,"19e1a65b61c6b7e27880ecdc103a824529a306b103eb126d57cc6a955024e758",9.317957166392093],[19321,"c35e6840461809a6e3007620410e542aef80c19aed91b22f5380679b86235114",9.317957166392093],[17587,"1749f1ef77bbf7097f3a54cd98b0c26d4756a5e71187eb972b4f7c6dbb377a45",10.052724077328646],[11482,"654ae5d1e7118da1f8a16ea81a2ebc34b6eaa009235b9be8f8a1a5e52424a3b4",9.917710196779964],[14701,"11b5600c364ca2eac1984e0ed533414785826c01f5e21b1029da7b5b23bbd484",9.317957166392093],[444,"314b40aafffa6eeb726ce2a8c77d33d90717941b9884af01f0377d92c3a917fd",9.917710196779964],[12836,"86b9af653c21dbc4534f68627f3596e850f2297675ec21c959d59bfdbbf0b5ab",9.317957166392093],[6739,"248d587247ff67392509f913946bcafeaba88d1640f8b273cc5195c89408aad3",9.917710196779964],[2918,"1c5fef26c64c0659f4191ba795c12aeaa239b0bf13e9274e8d0568c327b8f4ec",9.917710196779964],[4583,"f0f62b5d6bfb94a2c9e490b054c6a6df7e9baa41e6173f99f1e56fcec276b7e1",9.917710196779964],[7008,"d0cc92d8052b2bffacb47cc334dd31e4680ab6078c93c28eee2c89d88a8cf3d1",9.917710196779964],[4140,"3f22db51fd4dbac066faf969f850132929653b7436e51b82c84651dfbac5cae4",9.917710196779964],[12169,"6bebe8dfb3e92e22ec2f1a621defc702333a5b97688395b7c309d905105d3fb0",9.317957166392093],[1036,"e668d71b01e1165001a6365ac037a334b05a874be459007d4940f89165680df9",9.917710196779964],[5996,"64d8b9979d4794dd8a47f571422a0e337a83f73553a79e0b908f0d70291018d9",9.917710196779964],[8811,"1be5ac0569a97eadb48df286b7de0ad267e2ea1bf1c2236e1614f7675acb05c6",9.917710196779964],[2092,"6b06397f01a07deb73a66909e3502a54459d1d793bd878f6f5ca7ffad0884af2",12.082379862700229],[11720,"0998b0e34c1e00d0deef16bf5b296ddebbc2d849438d30f80ec956643ca42db3",9.917710196779964],[4780,"111d51f6d0096878cba32d14f7b74d67b56158d1f3c1724d75051a01603c85e0",9.917710196779964],[18026,"c32efa1ef1c3189f921800399fc1bba07d654b9c9cc3450b7d38bc9c9e3ac33c",9.317957166392093],[13566,"d9d192da0150bd93d20140019bdd349f29dd38eb7d8e08cff321a7a7b5b6619e",9.317957166392093],[14811,"ee42a3cd01b33ed4f87df3ae67d98286bb16fb5401d7563feedfea2486839182",9.317957166392093],[4663,"37bfc8db2d43e791a7803b1fccf577132a85a4b1061f64f5ec8b3274c9b437e1",9.317957166392093],[12375,"d7942758a1e441e64d3a163dfd1fb6e3d664f7b53830ed8854b5e2d78e97cdae",9.917710196779964],[19817,"6e15f052acf8ca73e4a7a1723360296b6f9eba67167d7048dc04027052ef1302",23.003021148036254],[7101,"9ad79ffee5a939c0e95159b7b770ef03565d5e810a7e05337bd1ea6c1f9355d1",9.317957166392093],[15047,"f1a028be93e45ec40d85c841e90b56524cc34f6f12cd56f4eb0e72d406029e7d",9.317957166392093],[17916,"21413e1e08eff6ed54a8cc74054d9cfe588bf4a8fb959ec9dca126d6038ffd3e",9.317957166392093],[10699,"862fe56ace331946e1550a2833644f42118cd06848502d8c8e0a92aae27401ba",9.917710196779964],[16400,"a3db6d228e0447905875b80910298831a18bfd38214134b4de5e623a4c11225f",27.080357142857142],[6668,"4e98ba57b338abced504a6f66713210cad63c2fb49ea6fee20f3679cfa0c2dd4",9.917710196779964],[8224,"482a3f540d89aea3c7db4a3712aa137cdf02042ae98d04aa9dd4c0c491cec5c9",9.917710196779964],[4279,"00835796979ebbfec988ccf1d0c96ee534d3c241d58ccc8713b2e584b3a7e9e3",9.917710196779964],[9412,"a7232a9c7a996ae8650908450592c033e8e3439dac2fc948dc1ba7e5aa6e37c2",9.917710196779964],[19578,"2b6531fe8f4009a2b236d1e37f542380cfe165499eb472bbb56f241ae687410b",9.50445632798574],[18861,"f958d8890cf536972de8d915c03f685926cbb6b4263260fc9ade6a952815ae24",14.953846153846154],[15009,"91ed35abd14c7f0b8c09c5d57945fcac2bc59c70f09aa159646c95fad846217e",9.317957166392093],[19541,"1fcac5ee6f35077422a6fa2f1aa881e8444eb6b046afadbddf4ad3fdf0970a0d",9.74610244988864],[7531,"f89dc0ba08f6df871a3f75ed04b3e011f1d26a8ba9439189dec317cfa9ce97ce",9.917710196779964],[19223,"947131ba9b504bb911476e17c838d399f9ae5e1a40505f394456f405ac70da17",22.5],[8497,"ab42f69395b2a61f58b6cc281c8445ad29a8af7cc9fc40a76f92ea3afcb508c8",9.917710196779964],[13846,"4cba110944c544cf50751f0b30cb5d2b772f59a8ae0048693d997e5441e27198",9.317957166392093],[11744,"caa32b8ea304bf3983129eca227b7565c38768544129c4e19ea4e60c62a00ab3",9.317957166392093],[621,"f7cde3ba01582ee1725e1986f46295491093ce900ac61b83e5ff20d24833c8fb",15.91459074733096],[765,"55c3b9a9f10206b2597a01389a1bc85287ccfa988132199748af0c9ef98ec7fa",9.917710196779964],[2876,"26c4fac3dcf5838ab6cc0e81a459ee8bdaa524b7e7aab452167fbf35088042ed",9.917710196779964],[2139,"8a74a9ae4ac0d4adb306062c83107f0e38387d73d5e49b376ae1f14ae44900f2",9.424083769633508],[17182,"f03216d3e30ca191e7c1fb46414767768e172f377df79c7c37bef53463292f4e",9.317957166392093],[9213,"bf9f3920244afc9910ecb9cfd4ab7ebaf350cc7294314c1b56a5235ee8da61c3",10.052724077328646],[14886,"708bf6364dcb696abdc871055d4bbd234d54af07e93362283b3728a61bbe0681",9.647446457990116],[9310,"bb055dc8908c7b403879e43c7f3064e84d0ba9972e3afa676f4b1f6a9559ccc2",9.917710196779964],[3065,"318bbacac39311691cb7162cdadb143fa483489826efdb1280ffed73c582e2eb",9.317957166392093],[19042,"1d9fb6df11ea353193fadfd7483ed54293c70f231be4e1cd320d43cec3df281f",17.16883116883117],[6757,"289b4a67bd3ac6e6474924bd348e2e33994ce4ed7ecc638fc9312bbde84d89d3",9.317957166392093],[10768,"ba400c4b3c0d065e5bcc45096a2039cbe9be224861724de4ace19b6667cc8ab9",9.317957166392093],[16708,"5250f61bd8cbc0a60488d51b2384c6846637d11c39971ae44bf1414664756458",10],[5852,"944fa1f929304b9664dfa78846ecbdb2715a69ce6a568273badbf6171dbbf9d9",9.917710196779964],[6552,"4c3f1fca945812f310d07dd4e4c42a760d51cf6d9680a3ff46f006ce659501d5",9.317957166392093],[8925,"df04679b523a04cb8f6de1f947b2a720edb9807fbd3e54f9d0f335678a6f55c5",9.917710196779964],[10225,"b0cef8836b63c369d3b6b42bdac6fbd459c6eaafea3b3debf140dd50b214d0bc",9.917710196779964],[2326,"49c0488c098005387f42bd2eb045d7d9a8ed33ed12a8a37d4f3550cc8f21e2f0",9.917710196779964],[11159,"b322442739e123732d934aef67a202ebd5126e87c6a9e1a5383eb51c02fcebb6",9.917710196779964],[3941,"c912b739f76c976f45ef57d265709b453170a30e038153817636f941364c0be6",9.317957166392093],[773,"22ee70ffaf70a43e45ed7f7b7aa1488116d285f990561cdf662b918195fdb7fa",32.91139240506329],[2849,"fcdc39ee4efba0f669fac6aacbbda4b756e2e578b0c4f4cc8e608eebd6645eed",9.317957166392093],[10661,"45a5c795f9fe466fe3bb04f7d1e5e14c3992cfd7aa9c5bc13f11ba13422448ba",9.917710196779964],[10625,"6079ebda9ed76fa6f98448fce7ea8f7559d6f697f749c9a3972cf7c8563187ba",9.917710196779964],[19767,"44d868e5af51c0151eb234e289e3632aaa448f5cd30381eb2b1313f67dbbdc03",9.317957166392093],[12139,"482ff9ee3745c1694c89813594411ebe8319ca6be2e1c0811ff4cd064fdf68b0",9.917710196779964],[14263,"eb6b45a1abcb61d7aa53418edf38b29daa4243c6cdb817d2f2e86fee3258a58e",9.317957166392093],[10243,"5cea83273b6857614a9f054bd3507ef08e4399db10c66b61a8c93e026487bdbc",9.917710196779964],[16436,"9a25d25fc31b1383dc4f4f86ab8f3c4032b6979bbe4985460d9b6b1b0ad06a5e",26.090592334494772],[14358,"583249061ea0ebeaa21fe7bce60a297b8b870c0d59d5a3312fb14743a26d3e8c",9.317957166392093],[1613,"d553abb6c3f2cd86029a33953dba63935f4d71b3603bd86ac93a0ccb38e77ef5",9.917710196779964],[6899,"9c82dbb028043e8cb97a5c707b826c9f03cea520d869a7f58c03f5b5ae3f9fd2",9.917710196779964],[9579,"90d195cfb55efc254cbe4bce502a432bde263c505785b321613262a8523621c1",9.317957166392093],[7937,"a14864886ba93212ef48f47c1be37f4664d939ce11842cd93bd651acc5e8f3cb",9.317957166392093],[5900,"fa60290c91f890068fdc1444e88c864a9f15c6389e7dd42fc1777e67f439b2d9",9.917710196779964],[8273,"7f75033b4d9df4a745c0d70b43b06064d832f4a12e826aecd8d2e28c688d82c9",9.317957166392093],[3484,"87d7eb3685c4b62bb7170a8ba8726da4f9510de64e6501cc9fa7b1720f5e26e9",9.917710196779964],[16804,"498797f876cf8b1a4e9237cd61a0a2935651be5898514c01267524b4699e2a56",10.052724077328646],[15089,"942536a0272f3b53ad66e4402ebf7042eee923f8718b9c864de930775662e57c",9.317957166392093],[5042,"58884a4f6e8784da67d3c095a1422611bdc088d1ed360a9998ff555a9e95efde",9.917710196779964],[6487,"86f43779c270c457a3a0f165e699e02a862f0a9fc1743db8868bb649934492d5",9.917710196779964],[12577,"09b5dccadd7a66fa396ace35745fc33438f2e813b15ac57d04b7c9f1c0c969ad",9.317957166392093],[358,"25a3f4b78fa7623e9f3023f66d1ed9dc169bcd90b5cce98cf87b4bad8340b0fd",9.917710196779964],[3930,"70a7462ad174f49abdd5481385abb05f72bf1f93359ea95f9c278d09c7e928e6",9.917710196779964],[13980,"6f4d9c48af33e0b2cf7d98589a18ea5a23ad8c40b97305fd4bf23fe7d7ff6995",9.317957166392093],[14376,"d5277c37c25d53ec480a1e0dee5af13dfa5d8a04174f7859afd7a0fae843d58b",9.317957166392093],[10787,"391f974152fc23406ac2f74909d878dca5aad0a19d41d311c934a83c631761b9",9.917710196779964],[13432,"96b5f492137e5f0aa4eb18e6ee62165541b1c1515dfd49d1a84ec37bbf83c5a1",9.317957166392093],[6989,"f237eb32ec28294a7f34dfcf6c2a63cb628f789b93d7289dbffd8b46e98c0fd2",9.917710196779964],[3548,"9de9b9178481cd689f6a0b5ca0b57842bcbe91896d5a5e3b6243d92a4ce29fe8",26.00263504611331],[8231,"3da48ea3fbd4e575f371dd194b2d541102c88ce139cc1ef16a83cbf7ac9ebcc9",9.917710196779964],[9483,"baaeadffe28cc32ca045a068c51d76676f4d3605f1e3a95c118f3433ccf4cac1",9.317957166392093],[11231,"fb1d8facbc4024065ff5b9bcf00af3661c90a86ee0f90dea0fe10f605cb479b6",9.917710196779964],[16010,"03f03ed42f1105be68af51ca56b45c1f3617da8d8acb131d47f7c048ec483568",28.126696832579185],[16479,"48997d84c72e863b16e983b9c40af0312123de5696493b72dc36304ba748b15d",14],[8773,"f375013450202149f83224a858789f30779e28e7ab5cf3a1c0dd5f7829343ac6",9.917710196779964],[18334,"d5f89af43683d179df160592094bdf53db62067974da50277a6a9c07dd7b3135",9.317957166392093],[12643,"d000811f8b15197bb140c850e92c0790bfe9fa136c73b4548db270a540f8fcac",9.917710196779964],[8096,"43a6af4a185cf09ef7f01fb469225628ed05e1a4ed61db7a5de7af7ab4d1caca",9.917710196779964],[18993,"edf812d782c024bc4ff0382ae5c8a884f316ced2f589689c67f2eb8523f4e520",9.317957166392093],[5752,"697a01523db4a8eecee66856149a85d18a6f3a7777723e53ef758dc5e479c5da",9.317957166392093],[18009,"9cfc68c8a627037c480d4e0478868b0fb9a81b05e404ecbc7131bbcc1b18063d",9.317957166392093],[18157,"c35fe572710660d6a9311637df450a3817c54d83ed6db821d9fd3301211d2e39",9.317957166392093],[17032,"1b1164f54db38341fa390accfcc5306932e4ddd0fed63dcb4414245586315551",9.647446457990116],[8869,"b0731b5289c9e3a9435dff15ee4b1614f91737cc6632d9c25edd36e367d8a0c5",9.917710196779964],[16889,"91675d8a9bc767c29a9f45491c715ee13b803cda9190aaa240ff61f00f397c54",9.317957166392093],[551,"bcb803d03f82e8b02d7425b9ce8c1f4ae1851fe1a9e3f186fce885f6a63547fc",9.317957166392093],[966,"225db25bb3c2db9919801c01de604b4bb7697292b796029ba1062d13c50367f9",9.917710196779964],[2658,"819a8109b9806b2550f5786f99957cd953976541d136fb78722a43127665cfee",9.317957166392093],[11185,"ac71842217b2ef9fd46994c61139bf25faf356c6557b1484637871196d42cdb6",9.917710196779964],[7038,"5ebfcb5732c7f8c4c02632a0a3d84be5389fd75ec38e28bceed2f71c6da2c0d1",9.917710196779964],[5395,"2ffd204f3df63cb87061af076b23980186ca2829222182232078b78ae709dbdc",28.035],[2701,"668477cab20fc168bafa5525d1c13e1ce41eda003f07df316feb0d706e6f74ee",9.917710196779964],[8020,"1b80746e957c917e8c0e96d6bbb6e165a07e84665f21cf675fa616625a056dcb",9.317957166392093],[17215,"e9b0a5214d47a5a222307ca5c99ba5a45ee6905b70cce90f97c5368d129b904d",9.317957166392093],[18508,"e8875bfc4c8733eaadde1a1536f4746a6ea49cf88dc15d6bc78f604e48824831",9.647446457990116],[14678,"0dc9da47659da178375fe365d155aecd04ed4da5999b489ce3d2164e3e534d85",9.317957166392093],[11320,"81c1231bd881ba3ecf8e097745a2e12c0757a5a829893b96c55577afc9addcb5",9.917710196779964],[19737,"8d277eb0f2d90f010814f9cf0dcbfd7dec884ead5797848445f17d28e8f38105",9.317957166392093],[7882,"37c769763d85b6fae04e279bf386e664bc51a87370013017d20ee015251d64cc",9.917710196779964],[1703,"1033c32680e744d945a42225ae1549ba4082f7dd59eeb366a39602766aa2eaf4",9.917710196779964],[13866,"536a2909167d3e14df0db31366a779f74137934c2b1cffeea445a9a7f06ffd97",9.317957166392093],[755,"b6454eb7d8b8f8e875a8ca1ad90423a8187648ba9f14f6e9c9bce5e21fa9d4fa",9.917710196779964],[14100,"9fde7c8ae55a7f5466f95b69f009b82f2d126b123995bf6d6772a4f5894b9292",9.317957166392093],[17672,"7507d90dd7c2b0b98d7d085a929e159bba2f54397480f821848d50a748ecb343",25.40463458110517],[13837,"2cf4a6d282b5cb0ba962c27c9937f279c9ad96abe06cdc69bf21610e4cff8c98",10.052724077328646],[11790,"831c861728a49a2d4ee640ce6591cc3df195ab83b40be4025ef13cd770d0c9b2",9.917710196779964],[19430,"4ac2b4014e74235598980a62bdba00029e966dfd1a1daa3275941b70e31e8910",9.647446457990116],[14622,"a7297824349ee53fb6ab35bcad86bbfc5477f7a4ba346616fa983eeb73728086",9.317957166392093],[934,"d64b00dd9e81f25aec9ad2192c364aa44bdf2a7a778ee28dde9650ae9b8f9cf9",9.917710196779964],[14011,"1d2d78a5206941ee470038536af37b27814d82980817b9943220ed60ad0f9294",73.19778188539742],[14184,"bbddc3a39ac8e77f50750e1eb858b05d59282fe8c784516e0c0e105f791bc590",9.317957166392093],[12318,"9e589ffa720f0a4a6a8376f1582346d72d082903b962784dafdc885b67b516af",9.917710196779964],[4734,"80487bc506cb626f33059ede2c5ea46bd921af9ad8d4a1a8747371a62cdac7e0",9.917710196779964],[9960,"c8b3724c85500498c57ee81f17d49773defada5189e49d659834676c90b691be",9.917710196779964],[16045,"09e448a2f7158f4e488f11ccf5f3308c976e53ed71e72a56495d9862d2248167",9.317957166392093],[8672,"0da81b242aee1bff628873aeb748bed94d0a08aa0765200f41e7dd2b5064dac6",9.317957166392093],[2991,"b3fd075269bad072b6cf96d77f13c90c7542ae717fb0212db677ea9ef48158ec",9.917710196779964],[8920,"993919adaf16d40c9d1818e348c4fdc1ac00aeec2fb435d37c3ac962ada359c5",9.917710196779964],[6427,"05abfdd6b0013a38704586a1f459c4904964b30cb307f04a6c0c0f1cffd415d6",9.317957166392093],[19236,"c34e41e2f5cf76a7eedd41a9fa5b0e7691d4f6b6462753fd60b7ac2d84256317",9.424083769633508],[6965,"03de5a80aafa67a0813eefc4737ed46396c2364476027200cf9bcc11a3d52fd2",9.917710196779964],[17796,"87d5e428c591c248b9dfda8a0b4a8eb467982e79827de833de900e7f81df5f41",9.317957166392093],[6798,"fd3ff3b05169ec286eea76f84cd73172788acace9aa221827af797938ca649d3",9.917710196779964],[1222,"e7b138ee5074d759a4312f50803fcfd77be8f3118093f3a2b72b2914044ddbf7",9.317957166392093],[1675,"0a60a2fa82265658ce028c9a096d1739f896f5d61d2d04bfd1b1a7c8293d15f5",9.917710196779964],[9902,"ba49983b483f0f963d6752586d4c6ac2b0285951f00e337837aa94a819c4ecbe",9.317957166392093],[18864,"b2f045da699900482141f06b12f19d4359764ec9473b23ccc0a10d948ea99224",16.169611307420496],[14473,"542e8ca5f26b91811d96e767f1e62823fbcde02989418464e83e7f36636fc689",9.317957166392093],[3261,"4ace04997a60db7e6efaa8a2175da77b76ba21158acbdfe4e1cca3a453e79bea",9.317957166392093],[10795,"1b255d7e1f41bf28d3e90fda315fe8053f51212b58982f22227eb14d69ad53b9",9.917710196779964],[6374,"b5a2fc98e76340b9a7674a528450588485582e2e30fa089f242c98b808e577d6",9.917710196779964],[5553,"75fcce05732c9dfcbcb935c0ad17915b4f269b45a92e760a2c935503c618eddb",9.317957166392093],[2773,"1c1f14c19938851fdb38dfbb66924221d63a0004e1e9d57b7e42637c9f4ef4ed",9.917710196779964],[10394,"d14b7481d753f098f54f884bd321a02da872f28ce2b27b464acb01a30ab7d3bb",9.647446457990116],[6851,"2b4f35d2bb10c2904754c0ea3ebf585ba9654f2eba4197aef24800901e11f9d2",9.917710196779964],[18306,"62d9ead67e4461d30385927b8ea0c234317bac209c9a2300c953d2df0ff9c035",9.317957166392093],[17537,"3e1ebb47d80de697bc0a3e869824e5f7c80e1908569cc35527a39e9f6419ca46",9.317957166392093],[3492,"2007ca9a4fb68bf9984e3968acdcbecb217beaf193ec1a55d09e1ef18aa80fe9",9.917710196779964],[745,"52f280b5a600e685e8cd97e127a888732a06f2322e9950981badb4a62a88f0fa",9.917710196779964],[18903,"49648d7b5ef638e9e8dc9d7ee7a2388b2296251e23730e0015ad73127f587023",9.317957166392093],[3392,"74713b30a542ba1fb7f65ad4c90963deff997d27fe15ccc29e3c35720f4ebfe9",9.917710196779964],[15794,"e4bc5c4985aa150c9c689977ad502003de59947bc530bb67824235c6ed257a6d",9.317957166392093],[5886,"911de092d09f5d90a798e227cb74f1cefc445be0409692e1eded08582336c2d9",9.917710196779964],[17538,"dee0c830c28c5f2e88b8f1837b5ab74163fa1f352b007e72e71ef89847c8c246",9.317957166392093],[4061,"72a724f8c91a81f03715ae7beb1d62652cf0aceb419e8f71950465a42c9458e5",9.917710196779964],[13170,"e689948120053edfe896df2fd8d3691f9c35cebc0f83fbfc24e99df869a596a7",9.711670480549198],[3619,"d0bded898d80611da94314c2eada734b386e7ccd17701e60fd9b0552e1701ce8",9.917710196779964],[17093,"68d0ede6e7eada17d5e6817d1855dccabb034fa920a47e695368ab139b7c0a50",10.052724077328646],[5677,"d5ccff17770a28a0516f86ea190ca4e280c8b1f6f69be13c12f55eeb34e92adb",9.647446457990116],[7225,"73e6905fa633cb067081056b36a6d9c1fd42c28fb779ff4d2f707001d60c80d0",9.917710196779964],[10648,"72345f3db1e33a933cc942eb60c0e11a5abda328c3ae49354078ec4e436664ba",9.917710196779964],[15471,"e485de7bcc7f1a33ffa87bffc70ddb6dcda05902c32cb31137d1ab5daa85b374",9.317957166392093],[19196,"4bcb8b6f76677676f2e33a1b488b684a2fe02e78dfa6db9c9159d0070bc4c318",9.497326203208557],[19524,"6ca3a330d72a6309d93df2c44c6337a1117376de35eaa78308af888dcbe7a90d",28.14867256637168],[2385,"462b6f0fb18308e5b4b1ae0ac187f821693b3844a97b91cb59942a5e82548df0",9.317957166392093],[12843,"8545264fbacca041b1ee2ddb653a321a6e38909d1b2377258090217d324da3ab",9.917710196779964],[4121,"7ebdb481a583ee67e047163f20d4fbdf5b3ec02eba8b1d7cd7b33634c25aebe4",9.917710196779964],[13554,"243f23acde78a0d16640f4c30568ff3facd5ad79f1ac08ed15748e4f3d12af9e",9.317957166392093],[14636,"5a99b2a84c6f56f2af555f3dd1360777d63369cfbd715ff6d93e113604524486",10.052724077328646],[4968,"d50cd034600f58aaf2eab60cfa9c4389ed124181c58f01c6bef2cde446bf67df",9.317957166392093],[6686,"3c157253357946d1df85bcadaa7de566d174018313f43aaf7d601f0719dc10d4",9.917710196779964],[11440,"6bd9829e259053acf5eb21c9724fffe7d579679b844093e0c939844b7f0f02b5",9.317957166392093],[12038,"4fa97e88eb3ee5799521771b7fd83472e8aff0d9d1125499bee69b8362990db1",9.917710196779964],[11608,"2102115c24a46c6f2ff607db32abf955f2b07feacc811865df27b8f3e877deb3",9.317957166392093],[5106,"883e75f02e54c51bfbb1e2036c7010b4a5d199058216566de03ae0b4cca388de",9.917710196779964],[13390,"157eddda7effe7abd92b1ec729136b9ec2fef7eb18fe49b1e0380024812f8ba2",9.317957166392093],[18943,"09c0207da2fe2a4eb7912d98983a7873dec9f7ff04467e85ff6d7d0eb0225322",9.317957166392093],[11346,"3eebb62239f33c94deeec54d99736e8f6bef610ad771a24f0e12809f36c5b0b5",9.917710196779964],[5218,"e5cd75093ccd3d73dd748cca70bb9ba2aad2fe02c1105352dd2898fdcb71dcdd",9.647446457990116],[15465,"efe55c769a3900679c9c83adcbb58e1e6c9232d0b8c3c6006e38364d7998de74",9.317957166392093],[501,"8ecdb753020bbccda427c327c4fb7ab10d44aa55bd84ded0f33870bf1a8faafc",9.917710196779964],[821,"511a38115b5f545096b7c0ef53265101fe79cd3441ac06b71a46d5574dc062fa",9.917710196779964],[9880,"6c5ee17e4d954d080b3bf8b1d9f231ca7e16f7ccbc28d5899a0fed917e0014bf",9.917710196779964],[6684,"b9281f678bad8eb206c037d67961f52cb9d1c142b6ee8aaddc414299f56f14d4",9.917710196779964],[12578,"e7bb0fdc9daeca5dc58eaa635fd727cccf10bc043581bdf2f5e146f8db2267ad",9.317957166392093],[6532,"2590c78104c1f530d960b5c08d7be00906e405c18da53aadda339f46290e2ed5",9.917710196779964],[118,"8ba31a0956a957dbe541f8ba484e52989aa207520e73141239f0e2c3933e47ff",9.917710196779964],[16549,"3dc6b6c3c8520074f70e05f35d8491b4236381f24d8a23d82dac00e0e49c085c",14.188034188034187],[5430,"1f202610726e961249e0f4e540f6d7e79de6487544d2f2cff7cf241251d299dc",9.917710196779964],[8328,"fb4e3032e8e3ecefe10ec396cffb02493505c2805c544d3e02db8f49e9f021c9",9.917710196779964],[2712,"c5e3e58c519918729ea379aa07b5fabbc88b4876d1aec8a90b862579107962ee",9.917710196779964],[3171,"ac4ccb9c6bbc364cc1e36a0a536fd59c13fac5f17eb3621c97871df9f3c334eb",9.647446457990116],[18524,"b46ef55131713dfaf35faa6cad2efdd177bd10a97807a2689f4e1d3295e0fc30",9.317957166392093],[16762,"8bd2727f19d7f03d8c875148863d5c7f55d29ccb6733814fed743adafb9d2257",9.317957166392093],[14458,"03d9a648114e50715a580438e2461a626dfda710657bafb431ca51c2707f188a",9.317957166392093],[9061,"de988106f9e1af8c51b24467da19764e50115064f0815fd209055e7ea4c367c4",9.917710196779964],[12527,"379e72c3aca7d3db1ec6454d1d8772c522b2bd53df579760d112092e1241bfad",9.917710196779964],[2038,"e162e678f110be169d47c1de0c3f7b7fd0164c0500db399b5d56d94df11abbf2",9.317957166392093],[3749,"56df983aa2fbd515957f911570105fbdb146c99a3d8d34a6759d942ef20441e7",9.917710196779964],[4621,"da67626ef9aa5e15549f2cbd03709f5a526100eadae80cc2aaadba40baed7ae1",9.917710196779964],[1974,"ba04017802628bbb27ce8b2eb145f4691b8f281252c3a0ee2e4ec098063b2df3",9.917710196779964],[11009,"d9090eb74e8212167e939c1f170dfce92d21eb4e815c30e30d8ae0f1618eeeb7",9.917710196779964],[1351,"4f7d4dc4ef837476cdc18a3347c26344f0c86368f8b99cc4d7aa122e7b5411f7",9.917710196779964],[6721,"360883d596f0339124f31c24a3af5993a4a100ea1948189dcdad108e2bf0ced3",9.317957166392093],[4713,"9638639fb2f1b097746782d040de1d0380f9535ccc261aea10ef95d580b6f2e0",9.317957166392093],[3779,"2d22168659d64e77bc02dab225fc95665f406678e0d8d105e0291b61f36e17e7",9.917710196779964],[14794,"4b3da0fa526326a788a569c62dfd3e5dfe03653d30fdc4a195747516ebde1083",9.317957166392093],[168,"f0c1604e54766da06a3e939f250fc49953a2047e7df373bda9e54fa629badafe",9.317957166392093],[4975,"a1bdec2d27b1677e9819686ee82dad8eae4baf20b9205a34af567de38c6b57df",9.317957166392093],[4960,"9ffb8b96f999b809ec0bd678438d5771f20f21f827c10480f1f34fc462967cdf",9.917710196779964],[1386,"92af38e562fc7ea7ff6dd4c4275f6b6d2014b25373948b28358509e4465ed9f6",9.917710196779964],[2854,"b8dae176fb239a8f55c4dbf4b1f75030328870e94a52f954124626d78bb158ed",28.09964412811388],[267,"60f98e74904dd588f9206d52ff6ada802e44f8fc1a1f851889e579cdfc3226fe",9.341346153846153],[1816,"745cfe575329c0bdc29dbd2d02434b7597b2fd766c00685c29059652092323f4",9.917710196779964],[16332,"e4f1cd1f95356480062718f70ef0a6f9b2235da08bc6f5129615997b18ad6360",9.317957166392093],[5963,"3820437332b66db7f8aa13580b3290f132a566db778386f08907cc08341655d9",35.88830715532286],[14498,"15b0ec678aeea63ad5f14eae46daa95306a2594d7016983f3fac4b592f504d89",9.317957166392093],[9431,"00f6da9f2e965376bc610f67aa6004d681b16d20398cdac1c61390f4fdc826c2",9.917710196779964],[3465,"2dbe4ff4763d05516208aef4241649d495ab7dd287608f787da9408d3ee946e9",25.837817355058736],[2337,"113ad49f334b1636d9d85d75a9073edef9eae5be3154b1b6d9e798fc62ceccf0",9.317957166392093],[7187,"84abcc2351c3bd1ecd55c08fc3d6256071365ad84ff936c15dc5d39b8435c9d0",9.317957166392093],[3346,"ce2616041b573cfaac22de6c475d445432a35092a7b161774f803afd654e07ea",9.647446457990116],[2508,"3a449e981ff6ee80fd7f9884e4aac3678bc3ce7a3688ed52fab71c7f5ba7c8ef",17.072553608703902],[8300,"b876aa5362172d5fa038fb4a245ee7c88d5d631bee236e067ab9433e44b055c9",9.917710196779964],[9842,"6a56aa5c341f7e9e33afe971a7eff24a0ff50453a254815280e0e6223a7159bf",9.917710196779964],[15320,"3a74c4447854eb575a3244f3b151af8ea1042f880c8bd0f14010282f427cef77",9.424083769633508],[13676,"d635bc14cec0508b118f4996791db45297e191a44fc0186232e457d0c7a3bf9b",9.317957166392093],[10247,"8959aa532970abefd612f18b56aed3a5c3f22ae28e9f772779c5a7ee052db8bc",9.917710196779964],[12535,"89918a55a9e267d32fad6f1aff2d6777938a3541d2f2bfb59fbe6c4106fcb1ad",9.917710196779964],[13892,"a0207eda6a31ba18ce52830db589fdcef8e13b76c72011dcdf113c3d878d3797",37.52860411899314],[5140,"fe6d1c548058faacd23d9210847b697537007ef0835aeafd309a96d1158f59de",9.917710196779964],[5131,"adb9f2e58121f3f219775591cd763202b5de81db0a77bf2f60553360e0266ade",9.917710196779964],[16641,"176bb4f97b3b12930c98a8b43b40d561bab17dcb619b0b9f62a740f1e6c7fb59",9.317957166392093],[6240,"4facc3e47257eb7843fe3f55412f5087064e363847ffd3e3a56a846c9f667ad7",9.647446457990116],[919,"b3f58c39d88a0ad9d181aed1ede25d7eb036c0f80e6f64ab9ee991cbe7edb0f9",10.052724077328646],[18773,"f28b42da07f793c3e5e25f6933edb2862a841172562b7a2b6cd7014e520bf927",9.317957166392093],[16967,"c49ed5e9845c15930ca6262f0df80f43f177895ae8ae1c959d466c02cc3bbb52",9.317957166392093],[6847,"35ddde34d4fc1e9c6c9a51310554b309063268143b6d7be6e87ca6b949d0fdd2",9.917710196779964],[9611,"3e7125939c0774d4121abe9de8961d25cc633b0703003de05644c14b1176fac0",9.917710196779964],[8923,"75105647180ef252267338e85ea7a0fce578cdc4de65338dcb48a731195e56c5",9.917710196779964],[17671,"86ee3d2a4ecea3f72c2a5aa0052044f71bc25bfcd9f2e73334a4157e2f71b443",9.317957166392093],[1113,"43887979e0f76ee280d9aa742fffd4cc1bbf17567eba086593836d7c8eab7df8",9.317957166392093],[7509,"7424768e5c05f08d9d4fddfd95c595846c7dd10ce823666716e2e1a8c1aeb2ce",9.917710196779964],[11305,"e246f3d11b37f3f6a7076b28dfe2cc49fdbd6e890eee1579eadf0f0db22ffcb5",9.917710196779964],[11425,"6db1bd4a7bd511bbc929b7b222b404b6ada5dabd51fb4a425427aa6b4b6c27b5",9.917710196779964],[3791,"54072de723a91b4f2985392fd7f7a9676b31297036e9fc457cfb646ec3e302e7",9.917710196779964],[4019,"f8d698edc2981490cd9bf9a459adc396aebc3c5f68d2ce7011566f654a12a2e5",9.917710196779964],[3403,"f409cc85db5de87f2ba264247e0e57a5670b6d7e3007231c1b5a3a7a715dace9",9.917710196779964],[2209,"60a5a46c78cbfec03ca2f4f878f0b1e033c915f477f6a3fd4be9b948ae2978f1",9.917710196779964],[4134,"84b317a98a92e4865aa7bcd3424a35a28db7343d040810d9e5e62806eb2fd5e4",9.317957166392093],[6928,"58fd8cf69b2df5f8fe37653633b374c117799672fb9b2d55864be0981d6f73d2",9.917710196779964],[7693,"3e514fb5af358db5635f256b8a1f9b753d0510d267fb853ba22372c44a5097cd",9.917710196779964],[13782,"2c810084f031baee1eec16407251848c1a4e67d820632047803b0687aad0b599",9.317957166392093],[15311,"ca530729d9ebd306e94f22f19b21afe724ae34440a1aa8cb43553ff991ee1978",9.317957166392093],[3486,"bb9f4ab04f67fea70f43d87ff50af525e7b34f95d094a64e06928e47de131be9",9.917710196779964],[19846,"360c75e4a4a051253bd547840b76e7038c5172940e9133b58d159d7c20e3f300",9.317957166392093],[5391,"909baa6e59069b09cd8d34e27b8f2980805c1043c1cbc67a2491e469e0d5e1dc",9.917710196779964],[13746,"0e2fa617350cf9145bcf4b21661095cd28c1d6c756f0cb3173ffe9b620f6869a",9.317957166392093],[10824,"2206dcd33e56bf0b9bc74897857e34f3d8927ac519e7b09c20a1669bbaf825b9",9.647446457990116],[18425,"93897cf1043448efa9a3f9e11aa996f9d2981b9c45389a5dc97f7b12b2561533",10.052724077328646],[3998,"73a21967a641f8e99cee36d97c33725562d9b926b97162a93c598482ffaebde5",10.052724077328646],[15931,"e82e6c04fc30de35d1ad7e4f4e3c82523dc32a2bf94ef333c6a9be3aad2f806a",9.647446457990116],[13429,"234a17830903ac05c33916895b4e3a905dbac3860896c19d0ffeab94adeed7a1",9.317957166392093],[3367,"a94b414e8666f30aaf2cf721214bf6c079d49906b8a39c39291987cc9ee0f2e9",9.917710196779964],[7916,"a73cad0cf0fd363df64514add4c9e665821168ca499fea13d34db29f8d101ecc",9.917710196779964],[16039,"d023f1d139e86f6fd2c190e1ed41a83970af25a7017d6dc75d595cbc69c49f67",9.317957166392093],[18453,"5965b002a40894ea9d4a453b3913309f8eb0e0439071a685205aecf9c1d38232",9.317957166392093],[15024,"c4975459e5efaab792a7b04966b5105c9a4f0c9e0c0ec5eaadc5ab2a711def7d",15.956521739130435],[19555,"b9caed8993dd170f4b597fd88422901d4a9213e13f458d8ec25606288fdf6e0c",9.317957166392093],[3911,"f355429ff818aeb880a55984593d13019f3de63f419d45c71ea73b26c93248e6",9.917710196779964],[16269,"ad5479e8d70fd65fbcaccbe7368772e2fc5e002901a9ab48577c63e6caddcf61",9.317957166392093],[5050,"d1a2005962eda4309bf7113dddc78379a9ce7aae21d150adec6788a1d5d3ddde",9.917710196779964],[14668,"91921b137f74f3633d0d6fd8b5302fa74cde50072d5b9556d1a42b0b897e8585",9.317957166392093],[15380,"f7b24ebf5efc1b033d490d1b62a3fbf95ae446ee092164388edfc2438de4c876",9.317957166392093],[13302,"59f63661d4354790adbad8385e637daa61e6df7d1a64301c3aefa205282384a4",9.317957166392093],[8167,"ca684e7d9a9ecfc6c892d21a1324e54693f8d610f3b0020f9180991db5962fca",9.917710196779964],[11186,"0c80bece611fe7152b8029544e69b82b2d53058e2acdb6bb419dc93c52e8cab6",9.917710196779964],[6907,"ca06756f1371a2dd59ecee25ebdcd8ca186c41cb0e4379dd97cbf3506fb28dd2",9.917710196779964],[13972,"ebf6b6d4d6bebddc55e0f21a72c4114fb7d4d600eb4932f2fe850bf828e09f95",71.65836298932385],[9584,"db5278d2a5bf092b28a79b442ad6706e859e1a88414e3c2856e3dc43ab0d18c1",9.917710196779964],[7756,"a3e954855dce9d9197440a0380f5440122dbf269963a5143b9b2207d77df18cd",9.917710196779964],[10723,"85feaa51d7dfeaf471e9e419515316b1b0eb1cef0a173d08be0b7d61b0ccd6b9",9.917710196779964],[986,"70df3f5a49ceb5386bd119bf31d1fadd6694c992697419bb03c7723bfbe34cf9",9.917710196779964],[19347,"f559f7ba23fb3b965a806543b575ccb043417737e3a7aecd3066efeb7b599d13",9.317957166392093],[9002,"a570c39286ac8986bf07bbc6d7d367e29641dd7b3399ec0efc7993dab6e7c6c4",9.917710196779964],[8318,"85e58540c5f56d3f3221794b50aaa023b83f8be1e235e4d4601599a4d9c937c9",9.317957166392093],[19630,"24a46888e37a24c2159b3d21fdaef9524386d6e4172ef009af45bbc9b33e7808",9.317957166392093],[64,"65ed5b76a5e971e2a841ca0ca8c6113c2ba0ff501ee8ae6279c51c1a81918fff",9.917710196779964],[17915,"2bd1a3fc5bd860b9a29367e57d667de89c4b9efbc3d9c6d064397fa63c5c013f",9.317957166392093],[9802,"3c334741cd306373d5bd32ba8474658847127766c7c04429feecaf5c17ac9dbf",9.917710196779964],[3859,"a8ad52c3900acad4e55e27b1eb6a0c0dba56eb5ff6d4a9e248629385cf889de6",9.647446457990116],[7144,"ebd602b04354522723178f094640863b1b069f281494f92a16e4b02d67720dd1",9.317957166392093],[19677,"4b226242d99de02116b670e1a79080a4ca629da50d3ad86c3ca03a806e3f6707",9.317957166392093],[648,"fdc886883bf6a3b0d2570700e1b96cf913d60243caf58d037f933969f0de9afb",9.497326203208557],[8312,"20ddb4b94cfc0001cbf5539ede386aa245c02edf753462987eddd14736fb40c9",9.917710196779964],[4796,"69e80e4b353062f1e0c17a72ef41479376d87cffd01ad0df70b4bb99887f67e0",9.917710196779964],[6886,"2b34a7903e87f4a0e6b8e5e2ede0be5e19b5710d4219152588d221371f8bb4d2",9.317957166392093],[13514,"5fbec240e9d02a0bdf9d0768b6bc8a9f203c7b22d78cf06699734714efbb7c9f",9.317957166392093],[14585,"ef9cf892f7c0c9ce3ecf9635e01529d40bf003a5edf4c8ba73803b488f8c6e87",26.118721461187214],[11337,"6b487b069b5d2d55586168569422ba0b1cffc8641a40ee0d01920a56dbcdb7b5",9.917710196779964],[5371,"0bcc31f1964ca7e8c97ce4fe74f61f5567fe4c861863fdf0cf974663f8ca08dd",9.317957166392093],[11656,"a8cbc9c92f497a17caa2efb16f821a1bd6d87715bd5023e16725d430e30890b3",9.917710196779964],[16939,"0c3f771e15166dc8e4829bab02c2f99e0cac8df35b6ada32ab13861101465153",9.317957166392093],[3158,"608657e11047fffec67bdcb12eff6459eb723e7e1906fb899bb8873a672351eb",9.317957166392093],[18356,"a3c4fec925c54f8442eed2ee5abec3ec362cb805ff75a140e4c134cdc7a8a234",9.317957166392093],[4162,"69d318fac8ac7c19fa77983011adb8d246d554f03df8690b976696fa2719aae4",9.917710196779964],[4238,"d97c945bbcf9edb8bac38e6b8010bc7b3e27f6361cc7e98a69360e0552e92fe4",9.917710196779964],[11674,"21f17010354feb87880cf9ebbd4994cc6ba3c0afee11faed387190bee79773b3",9.917710196779964],[10381,"07f1b399949d56408aa2dcc2e935fa045e12e44ce73c83704d103338b230ebbb",9.917710196779964],[13191,"a0bb61b7eead76823b3fd2f1e9cd7b912f5e7eb81d07a95433207176e9d806a7",9.317957166392093],[19354,"bcbcc937f9f532e8fa989c789719c03098993269104232adacfccd60e98b7513",10.052724077328646],[5860,"aa3133b5e51fc15c2db0a3544879ad79615b367a6daf71fd3079753b3c56e6d9",9.917710196779964],[12158,"3d88dac75e07a77749e79eb9829f0bb725d2b4c82f68ef32af83b53c547c4bb0",9.917710196779964],[263,"0deb8080a45041e68e5f68aeaaca483de3bf734336338d3ef81b0581aa1f30fe",9.917710196779964],[16151,"1aefd8336198c42a03a74dfd582767cf130e788f8f8cd9657f102acc688c0665",9.317957166392093],[642,"6be7fce766d1ef379c49426efe7d4bf86711a7664b43605d19322be2a02b9ffb",9.317957166392093],[9785,"fdc9c8752e9a83a410ac06579a768beeba6b34edc6712a8025064e989be6c7bf",9.917710196779964],[10915,"dadf8ead2b8126f0f93b3fac6820b7c4558dd9f6e00bcacd6c4b6c2ca8ab96b8",9.917710196779964],[18953,"b5d5bb6220c40d1098aca7d34f1c171b9ccde6b2d92c40a1636e0487d4c00022",9.317957166392093],[9528,"a8391490faba4696776a547d2fc780d3487dd4978921e1d8ec2c8d5d968881c1",9.917710196779964],[4571,"b43064ad0abc15c77cf3fb6d5dde356f0d2ba5fcca8e83fed6730f2462d2d5e1",9.317957166392093],[16438,"70960d811b9ce69a43de8678044d1995df9ca6d98e5c6f95f8efc5451d2a635e",15.003322259136212],[4417,"1a860c31ae3ecd97f557a216dcdc538c30ad8c9afc7b336100c1271982a8f7e2",9.917710196779964],[14595,"fa51ee12f3d0171504266da2dbeddf80eddc10cbc6b868e691910398294e3287",9.317957166392093],[11090,"c803b4b35e800eaae39bc606b85dfffa8746dea458d9663ce8c08db0d3df4eb7",9.917710196779964],[8661,"38acb450b7e2b7376c3a9dffb1e1e1cce9e223bd4be40043b58737983a58f1c6",9.917710196779964],[19561,"7a01c2818d8783f61b527a3c7d08b3a44bed9656f9c78f7074cd8d0070a2420c",9.317957166392093],[19505,"ed7e3a48c322d8bced0af147a9da8d31e1b2c8eaea4ec1e800c45494890e140e",9.647446457990116],[4184,"61573bfffe22919f54a64e9b0cd743215211c8f6d3cd271c40e5837d8c8b85e4",9.317957166392093],[12804,"173e064933825921df43d6559441bd92c554de6c8898f289bc3642fc8c2be7ab",9.917710196779964],[18442,"39d3feb54aba2e86f64867ce4164e4a68a2c50fd24e35a5524bbb0f29740d432",9.317957166392093],[2147,"99c2fed3d6ac2fa88865a71f80c34fee536128618353cd8d337866e0b56debf1",212.64988558352402],[16663,"6e4b17adfeeb727c33dbf6784c23a1259cf189242f25d9562cda3c3032997459",9.317957166392093],[3833,"9bc5564ab720eca2763f1298fe4bffb384c4ac4772a806076bd12b3814fecfe6",9.917710196779964],[9357,"4119887772a80926783e872609b122b0476aec16bc732d2955c0e8b616758fc2",9.917710196779964],[8012,"47847ca6bb38a9b5d93e8c944c64f7cc1ecac974765efc789e348060cce876cb",9.917710196779964],[9793,"79ca571a0787f7baa0eb532165fc3272b307c09bce734f00bdabe9e71e8bb6bf",9.917710196779964],[744,"443ab06003a1145e3067edf678c99b7f37fe580a831d3a6baba055c8464ef1fa",9.917710196779964],[6802,"23c3a209c714a32a79759d6a58bac1dadf721c029b6a280f2dd8e812cad942d3",9.917710196779964],[11257,"872eb3f454a7e0fafd9c74b300118d92e120779cc8c83d00fb0b9a2062154eb6",9.917710196779964],[19788,"8efcf2e0659d70549ae07f0cc4fef7debdf80c6278429c18c243cf969be50803",9.317957166392093],[14759,"398a03fb19692eff4d4ce09590108f766ba0c5dad19cdff685a89887b10ebf83",9.317957166392093],[12974,"1b99a549c44ab504f69f52d3e3c929618b59107cfe9b08c13d87cd9f0678beaa",9.917710196779964],[6126,"3d7844878db04fb111836d44b6bcb425f03210a97a895395743071b86fe248d8",9.917710196779964],[31,"e0d0909489ee379593b57b9c0e4632479479d0a529cb10363fb7a6aaddfadaff",9.917710196779964],[13334,"cfcbc3df0624e04245d4affa4dcf4b65c01578e6aab03f1032763959acb5faa3",9.317957166392093],[8431,"34babed9f2ad7b28ae56de2a25b4f02e831463f239967b3256ad37d72e6571c8",10.052724077328646],[6,"875cdb434119b35ce34de44796fe457e4d246efbaafa089ac652f0073f71faff",9.917710196779964],[6157,"7247609051169d7832a634d38d08a9d9c360d2ce3eb736c923c58232fc6c19d8",9.917710196779964],[7707,"ac0600f844a231f699666347c4d316cebb61eeb4dafa5676e0243a23aebe7ecd",9.917710196779964],[9777,"addc0272192dcdc046311c45e4f9a15bce72a039444377a2f9309abc5dc8d1bf",9.917710196779964],[2044,"75742d1fb4f4c414a8aa1b37ddec72d4095c09f11dd4318018774a2290efa9f2",9.317957166392093],[3079,"374bde93369571c93eab316fd4e2aa9dc188e191532be2a1b2910b0a79c4c4eb",9.917710196779964],[8511,"4f65f4202d97a8c7f4d0ca38afb1446efbf06b4f6e78bd5b53f3a036aa74fbc7",9.917710196779964],[14778,"70f1bc10cfbb0240d8f76961cfbe6f894986cfaad13dafe775b94a8662565f83",9.317957166392093],[6700,"7c21656491634c587d3c2eb2970e90f909f60eabb222caab19368071285df9d3",9.917710196779964],[2172,"5eb3d61817e0330fd71d4c06155f1f34b586452692f0ebd2d7d7c28f6fe3c7f1",9.317957166392093],[14764,"3a71233e48218ce379e321d41636e3136477edd47e46a88787de3f66927da683",9.317957166392093],[619,"e2f4d2401a695aadccaeb1059175a9e75737ff2175af314a288a1323db84ccfb",9.317957166392093],[10266,"ba68bf02fa70ea346b5ae8242a5c00c531cb3b57bb25624e0547971974379dbc",9.917710196779964],[11613,"1f432ad9a34a4baee23d4b6152e75801a3190d1a9a5daa2809301c1c440cd1b3",9.917710196779964],[15864,"ebc15df39bdb19e31d0430c0db6326f914d0b65fdcb7c585c51ad0723cd2ca6b",9.317957166392093],[6479,"75198c171798c9e563b141a3dc1affbae4e2bebff9fcc2f91d4d5e18ef529bd5",9.917710196779964],[3128,"5b4d935c76c5c49decd46b5f988613b9e745208dcfc9614307e581410b257ceb",9.917710196779964],[5075,"b89bde6a150faf2cb6b196c51ce5cac1a1b4a52af5cd7874a1b05a3b11d8b4de",9.917710196779964],[17143,"1ddd14b3a9efc5c52517013a4d309387e9041b3c1bb26182dc3381c6beea394f",9.317957166392093],[16696,"e32089029235458f179b987672cda7230ee422ec5655ac54e15b61c1846b9258",9.317957166392093],[17979,"f6a5561320a9b57b68defbd99c0ec0e1832be0f855d8dc71608d34641de38b3d",9.317957166392093],[11175,"94b6501d7ac9c144dff20a70965573bdecef2c8ebd1f67fe8ab59d21d615d8b6",9.917710196779964],[18829,"df92d06ddb59de86fa5b2fe4ecee9abba924e052796dcceee39cf35f47dcb525",9.317957166392093],[6569,"31feb8d882c93484b18d4daf891849dc301cda662b24b915b0ed3623c3ede6d4",9.917710196779964],[14039,"5212ca6234a3f460cedcfe72b1dbaffeeec9c47b258dbdc0a6941edf619fd893",9.317957166392093],[9820,"1f5cf2d8b1e231f13e014f8867ab94edaf3781e76f799ba8db8cd48a7fbe7fbf",9.917710196779964],[5073,"1964a58bcff930b40c6cb1f009b3cd90298de2c5418a1f0d0ba9a771f7c4b6de",9.317957166392093],[16903,"b08b9cdc315e0f125f8a146ee6373ff7b19bbfb2bee82f23b0cf0aed1aa51354",9.317957166392093],[18208,"d0dc2a5fd0db7e568a4dba2d8e3511392219c2b01b7eeffa92afa5d7fa7ce037",9.317957166392093],[4798,"34db01cc1508e0eb56906c67f781f8c9b326d13f93fd1b2f6d9b77b0314c62e0",9.647446457990116],[5911,"cd7ae2d54d2460921755a52dffbe712565740af0205583aea7d1a3453b2f9ad9",9.917710196779964],[13830,"53655c011ebe7dc5bbe0bdd429f441692c9c042c1342714c6682a26b9486aa98",9.317957166392093],[17249,"c5dd8345d16eaeb4cb5a67c5af0134e150893b188abb9c54191a71156dfa004d",9.317957166392093],[100,"8253cd00ff2ecf741c55bc9ab590309d4e6c7a67755b0b0bd9699e0875d660ff",9.917710196779964],[18902,"fefea460ac02eabfde9369083b7598a6ec41de8e6c48af343e91618524f37523",10.046511627906977],[7609,"c4c6cdec74671eb1a7671355d8e82c0a244c38991bedc8fa736b592d4dc628ce",9.917710196779964],[15189,"1cd610beebe3c752f6a350c31792f072994e71fdb963332fa5e8dd750ae9b87a",9.317957166392093],[6577,"4111d6c24ac43f18e9be9d49d1fa014b638e9d4d2ea6b116ee01bbbb2ebccfd4",9.917710196779964],[8127,"bf117de6b0b0f4cbbc43b6a6b53f94289215a223ad9f79be12c4c67ff10493ca",9.317957166392093],[9732,"76aa9c1e8efe0abe76409fd40406ed5eae533276d0b9d422d9340d50b9cd16c0",9.317957166392093],[13084,"eb34386807af74fc8f504c3a5ab70e8e64e834de51ce4713a842b43a95cad1a9",102.70022883295195],[7962,"c43f428584932390c565d9eb219fd64cef7c7109939a8f452a8c0d0e9c5dd3cb",9.917710196779964],[7569,"de8c6a723518c74d983fb062c1070d7a440e889a05d4f4a152f67225098b60ce",9.917710196779964],[5636,"f4f53a82ea600345514fc8306d04a6a54d96379f089a0313e0e7c07915826cdb",9.317957166392093],[1255,"dcd44df196e1d6ca1b888e002e1b9583778b1583bdbe3bcf38d14bccf1289ef7",9.917710196779964],[14415,"4a6778661c03df2bdb699a4b8fdc43f638ec416ab051cc96513600e42f62208b",28.041828503137136],[9380,"f59de0b21531de903d52679ca981d51440d480682753633a197452a0359f60c2",9.317957166392093],[12091,"bcfe7e5ed61b8c7e20fdfc8f2d02a98c1438761a61f027083fa0b3fe11d2c2b0",9.317957166392093],[9095,"8a9a5e955625fbc3a045a04d54aaa5234efc1604e30a431b74d4cb2f1fb72fc4",9.917710196779964],[12315,"cce2f4f79e106ba92a1ea3e460a91b2037883c3a3db46aaa2af7fd28887b1baf",9.917710196779964],[16756,"1555d4cbbe03259c4595cef9970a8bf04f2950f0372d40b96e6275872b335757",9.424083769633508],[2243,"3ccbfb5c518d668aae233742667a3c9fccffaf03211b15c1230774cf20cc47f1",9.917710196779964],[10759,"265407c55fa955a8005c0092f9896eeb5ddc9cdb32b064bbd1a7df9dfcc19db9",9.317957166392093],[1848,"8be2b71814b8695e8795cd5a6e70cd69dc23d2f20c688dc0c937c1493befeff3",9.317957166392093],[14214,"d41007388997307834bb8c779ef6e969556fe707bee3d0552d38e28a017ecd8f",9.317957166392093],[16540,"6ce0f4f38ec93aec6418e043663211bf7fa0df7c7d010016d50b4afa85b2545c",9.317957166392093],[1928,"e1772b043168c4a940f0d490cdf2421b312a1696461d8f900045b7bfc8bc81f3",10.052724077328646],[9871,"e6298aa37560e25707d8183787fdb9579e5b1759c2b96bb09e368eb9205d1cbf",9.917710196779964],[9177,"771663e6ab63afeba50a0bbb884845f363e0d01c535704205cdae4705207a4c3",9.917710196779964],[5539,"b20ba9cbe7030c10b805f5ed43889ea11324a0fed6e2abfe7856535fcd43fbdb",9.917710196779964],[4117,"bfc9a9ec8c23980cc45bd7434309fb12106c309405018396f3e52d361828f1e4",9.917710196779964],[6144,"7f9f8f53b484f484b74d712f20eb075df36de9c8a7c0731b4381dc4aa7012dd8",9.917710196779964],[4043,"ae49cf52eed8f78c10583abd217b737ca538ac4f6753b54489103d9d12df7be5",9.917710196779964],[15119,"93954df9a8f831f6c176c085f43a56dbf8b8de8bd8c2cf602af2b3906c65507c",9.317957166392093],[878,"a9f2d705b5f4ec7a8e3c9d48f04f8fb15d100e0cb888de5b910fa5a48d600afa",9.917710196779964],[11465,"adc5b44be1a6ee93c4a81f4210d6f19250be7fc7502e441a3967a1de8a5ec8b4",9.647446457990116],[829,"7b94903333e9134f1e131dd31b1e96071ea21126d5a41afb00f49527fe5159fa",9.917710196779964],[16125,"2672997e87115f637aa2da68a92b19d00c654cf841e7d2b300dd278e7c697165",9.317957166392093],[13252,"d2a20e1474bfd99285dd439754512d7b023f795e111de17fb662de79e429bca5",9.317957166392093],[4115,"c7cc1c49a1c28b0efa4646f4d59fb35da64a6bdac181e59085c8cd54f721f4e4",9.317957166392093],[10809,"42ff0f32bbaca5488fef9e81fc1fbf5b6bb15d939d4643a14ac28676e04f42b9",9.917710196779964],[18751,"84a23aa4fad40b12c42c01c66c1b692028c483d7099c5dfd05b32cd4bfae7e28",50.03700962250185],[2149,"8671d78cd08096cd9253a5348da3f9edde39e0daa8141dbd8b84cd810800ebf1",9.317957166392093],[14004,"4692f4b6055ff2cdd5f9dee717aaeea859784815a62d191b67877a27a28ab794",9.317957166392093],[4858,"7b8758d41966517082109c8cd0812eac9863c26ac51f7ba01fd2817df3e915e0",9.917710196779964],[797,"5bcadb49b2a039a26e69b446f40866cc114718f731c364db169e71f9db8f8cfa",9.917710196779964],[1101,"0c071e7597be96a38b511d96502fd3494850d7226c093ab4b2d42b1d21b892f8",9.917710196779964],[12829,"6f2950a6258281b6cffd084d12b2a5e51d5c7d9caebe0c0edc131de98b24c2ab",9.917710196779964],[4034,"f93022621c2293cd2cdb866cda57a5835c6b170d8324ed1e6120fd6c40b08ce5",9.917710196779964],[11464,"ef63bedda5630253250add6d99cd4263759f551d5843282a1f5be8f7f934cfb4",50.02901915264074],[11829,"2e937e3f3c5f2955af3502f03d1bf876fd879b245f2459cedbeeb240934487b2",9.917710196779964],[19739,"67381f0fb2cc42e084684959549605e47e7b93d71549d8e6ab65a00b59856d05",10.052724077328646],[9672,"87f095487b00704112fdf95709eb1082a4c65e612603f1e2d5be82e9b53792c0",9.317957166392093],[18155,"c5d828ab05a381ff122786a0210b49038b93e2ed50fe50bc7b503dde4bf83c39",9.317957166392093],[14802,"59308987da7f27a11fafc73700a21b223b736912344e24aa450a54e3cedfd382",9.317957166392093],[10682,"7eac8acb7484b6064a55bf7e135ff1788165331577f752857b4431defbf626ba",9.917710196779964],[15226,"0817568c325fbb81884bae89c323cbba2d7cff63eda6aad5dfb6ce2f8f92f679",9.317957166392093],[10799,"35146dce2dd0094d490be6472e2a059b4dcfeacdb8f583ae6a71cc7fab594cb9",9.917710196779964],[17619,"457195a3b36d5c5df559516046798b87df4c7d33db88c3c79f796b458a89da44",9.317957166392093],[19591,"1fe7206fb26789f2e6496347063862a5a365561f07cfa4af7ff38d1eaff1910a",9.317957166392093],[8160,"6222f8e6b81a1ea7eff830f4174c4420e031d73542ea3ddd9e15c88bf89947ca",9.917710196779964],[12130,"bcfc9872b3f4b23660e2a97d74424149b05e42356e3fe7e7e1dd2cc420657db0",9.317957166392093],[14343,"3882667701553eba26307b9911601f55412a52a80d92b7d30093f690cec77c8c",9.317957166392093],[12277,"29443a1a4b4e1f07975d51bdb1dbebbac1b2bab63693dca49dd7e9846eb76eaf",9.917710196779964],[13131,"c278a369ffa9aa466e026e019c42144445f24f8487b4abb264b62dd7003e5aa8",32.066528066528065],[5979,"169e8de1d0048ab719cbe2e14486bd2d821a749660c23de5e7f32f847e2038d9",9.917710196779964],[12145,"f552767165c353d9f444000cd55a94028314f04d0a94456a6f14832c0ea162b0",9.917710196779964],[2847,"60b0f0ff794431ce600949195efe3ab2315046c612f69f44164118ea7ce360ed",9.917710196779964],[12650,"908b6584968a80d07af8853e78db5b34fcf7fd74f6b4896c991cb18be8aaedac",28.098939929328623],[1650,"b263b82fa935181df55f35d5b5903135790d728f69a349140f2bb98f10ba45f5",9.917710196779964],[8519,"9fe937f86ba431d6d2e7c1b3e8134170e274e500d8d6d7d3657e4a7a141deac7",9.917710196779964],[11152,"897d13b02ef141790fbdf19328084a5efceb0a1c0e615f7e0eaa8e8cfebaf2b6",9.917710196779964],[8621,"035c72585e1ce2e2489f9ffdad217549e7f21b81ce41778cfe08ccfad4a04ac7",9.917710196779964],[9547,"9f181e0b64721e984238994f301a5ce2290802e4e1a6b59d32e8108ca09267c1",9.917710196779964],[683,"638e8ab9afb8b5a85d24c2699bc3e935a031c2e28306111511fdbc3b8fa85cfb",9.917710196779964],[16384,"13c6da775102f1eee8685c6d41b5016b2129909a1d3ffb8ec1ac609ffaa6695f",9.317957166392093],[15387,"2dc85de8741197f42a8a1cbdd1c3bc2c4f25310de5e26515c3ee754ca18b8b76",9.317957166392093],[9629,"dd240c18c32100392acbe537e8d00bd2d179cf8b4d31548101ffb14749d1d9c0",9.917710196779964],[4689,"7cfb4b034e4e0b1eab7453e327a67342792809b72653757d364ac0bb125210e1",9.917710196779964],[8675,"45b2f7f5d7328dd7bbeef590635996f9e35d577dd7dfd9743f0027490964d8c6",9.917710196779964],[11920,"a201cc4245133ca599d8939270f32aadd5d4fb10449afb3e9c4660af565ee0b1",9.917710196779964],[6790,"6997986d2b5707fbac87f144c761fde4257b5a3ce406ba255b969a483b7d5dd3",9.917710196779964],[15269,"53de0e959517f85da1da2a73e907be7b9f58b0b2c9ea7e58d0763fd40169ff78",9.317957166392093],[7713,"0e9025bf77b9b9fdd17e5af5519ef3bdc18ad842c86111f6b4c4fc44321673cd",9.917710196779964],[2529,"05ecf371dac5f1293f93e789fc244e75bff94a4485fa9d87dc1f927f3bfd9eef",9.917710196779964],[12588,"229693d425bf9a3483949b33d4c56f1e40f981e4167aa8159176adad023c56ad",9.317957166392093],[9711,"6ba4e828bb3a1b503759a56947dbfba8b641ead40be730146286d1a1d9074ac0",9.917710196779964],[14855,"9db47c0bdfd9951e93fe3e1630c9852c06c95547e1fb463d03a91554d369aa81",9.317957166392093],[14805,"a2d5f41bba28c4f845851fae4332ef729da88a48ee96d7af43a702c7a31fbb82",9.761819269898265],[242,"378c455597ea10343830b18be17261321503cea97bfd33cc9249a446ebf35bfe",9.317957166392093],[10297,"30ec6b165a87ef843ace1654bda6eaf43c18930946b01de6c58a4a61c22d65bc",9.917710196779964],[7437,"8d7917672ff8f36e1f6c973ad1c556db11785e0cf27ba5bd4bc5929f734f27cf",9.917710196779964],[13165,"8e85c308dbee48e32919c3828dc5c559ac9f31140307085afc680a3ae5a1b5a7",9.317957166392093],[15576,"5cf4a4521fe26ba7dbf28b434d7960a36ab4a7c628a673dde245753cfedc1172",9.317957166392093],[920,"dffc3b6f6babe23a4e645ff390efe21dd8859721dbc6952a24a6f27a264cb0f9",9.917710196779964],[11725,"ba06a3ccde51f856ed20e7eb47c592e5f23449f8354a916ad26dfac85d3e1fb3",9.917710196779964],[7248,"a76772081d7bc1b83f9ff707f574096caded4af22020e71b7802ecd8538962d0",9.317957166392093],[426,"a8c0047f8a31aa42ddc488e54d086554ebeae85419ce7ee34c1e9f1102e433fd",9.317957166392093],[7500,"0c3f006dfbb5d58cd4902fd86973f40b5c612a9596f99c084123fc2aa61ac0ce",9.317957166392093],[11675,"18689de62f9461add41678170ae31e5c47de88bb69b38cf573206a0c0b9273b3",9.917710196779964],[15524,"c1db3926934ffcd8588529a1ee83a2b6220f6bf23b2baf25a2c2101778e27b73",9.317957166392093],[11421,"f5675082b6d41d0b5db50a9f95d3017a84a5d1ae547eb68d5cf95ad25b8432b5",9.917710196779964],[17788,"e9429a934f0a2cd7c739f7d44a551673a1278a3b44d3f3a2e1fc2ce13ee59241",9.317957166392093],[15398,"9df4f3c3f333fd4aeabc0583c99349c339da8039375ce3a9b748104ae5146076",9.317957166392093],[1997,"92569768c326b107679698b25cf2b255ea7de0997f33a8aac6bfe401feb90bf3",9.917710196779964],[4979,"fcefb01d55535d03bf52f508f7eeb6f1b6ca8c2952320b5c0708b62746ec51df",9.917710196779964],[9489,"3f3cac267fc5da88e79172eb35f5b0b8531b5c6331d8d1d973271fd71846bdc1",9.317957166392093],[4914,"3ff48dfe6126eea2e785ea61cccd269c31f27ef463749a620656e3dc829dc8df",9.917710196779964],[13740,"836a1d558d91fffbcdbe6e995c7bb4c051982468ec9665c7b0b18119be05a09a",9.476682093271627],[2492,"eccfb14d3785014a4df23a4676d9ecab0d2f28cfd673c9c96e0a39e00091e4ef",9.917710196779964],[13045,"eb060f8f7bc2b290884a4476c278b79bc9b7efbea91546f5b3b1894928514baa",9.917710196779964],[11679,"2300d7c82d9d586f896ca1a574be89cc2bd6e6c03e0022478cbce18f1c9e71b3",9.917710196779964],[15705,"032391e961593e320f8e04be7bbea5dd880eca4f9448e0de739f6015bc90666f",9.317957166392093],[6242,"04c596e440d8962d0af522ff386948a46d7db0db1d78fdd58c750967751b78d7",9.917710196779964],[2839,"cd47ebf9d2eac4980984285f5300550c981edb962a8ef15db47fdebacfe069ed",9.917710196779964],[19413,"5e68ffbce815810f532e763ddc5b6e4fdf0bbfaba6c7df7216dae24354660711",10.052724077328646],[301,"0e89885bd6e8dce8917d93a15256ac360640fd98667925e7c5bfa1b69e29f2fd",9.317957166392093],[3937,"2c4d5124c84d5d3b1be224e49501d820922713df2e8dc11816edd953228917e6",9.647446457990116],[14632,"82a25fafa713cf2acd0d5f04d880e3a6db5cc7225d4de5c2e36d9dbf17a65a86",9.863013698630137],[12229,"1035c3e8059e810cbd365b07f35553db33c4ebbd2c705103ae4ca14536d6dcaf",37.58222222222222],[4226,"0475f0acb540ea096c23f012c35662d3fd5ce74e36df40e60c1a0429b59340e4",9.917710196779964],[18217,"65c30c0609a7939202cd4f2ed19ebfe29fe5910ebee6c7b617303d17da2bb837",41.69230769230769],[7037,"a27cfc3a7e652fb80cfaa3348732f4b217b2b65f5a41da7ebcfa7d4b2c34c2d1",9.317957166392093],[7896,"9ad9871aa66b920c48fb2ca8ef9aad021804b9e2d5bddc0206283c8f50b844cc",9.317957166392093],[2956,"cdc40ab2c4c464d36b8e1a5686741b3df14573983785462e17611cf2e14999ec",9.917710196779964],[11647,"7936927d1e7ae9dd8a54cf9a513821fb3b22dbde0b2648844a29ddb8ce77a1b3",9.917710196779964],[1804,"1adc30808505bff81d5687ac679ab3e5de4f0c944283ec13642f45fab58335f4",9.917710196779964],[12325,"c2b5ca142a2506c2b2ccbe8c0dfc33fec29304eac2bc2da4b81fa3282dae0eaf",9.917710196779964],[16982,"233207b5c038b9b8554c2c93f91e6f81afc13b92a692449eafd5656852e57752",9.317957166392093],[15244,"47a978b7b067166b9f9c0e0247ee6e78833337bf0bf8ae7f23b5aa2062dd8d79",9.317957166392093],[9160,"ef91009ee95ef901e7b2116c26354d4c9d10bee3f9d75eb9fc28b7504107c5c3",9.917710196779964],[7081,"8d81bb5468de781dc85c97af20f4b2fc16edcfd5cd0eb495929e5ff112da72d1",9.917710196779964],[10794,"e80f2dcfbc12de8276305cd8541ca4053a06768f67d2f3c0705eeb65ce8a54b9",9.917710196779964],[1427,"9a929c8b3272e78ed167490072b987da15c0062f17804a2d3d0d8bd51b75a8f6",9.917710196779964],[5832,"ccfaac2198d8efd6273d09ad0968e7ec49a7c18e5744defb1bea67a62d0d27da",9.317957166392093],[15745,"3d583e2218085fd9636936b96e2d9d03ac9758b2490bdcea68c09994fb277b6e",9.317957166392093],[16619,"42cf6fa163569e015c9cc299d2e88269978626ee900693deb39aee2d6386745a",9.317957166392093],[17422,"9e4f042e19a6a0eadc266ee93c6d26ee4967152c759d721b73bf2b67ceff5849",9.317957166392093],[19583,"7995534d0c07840f87a6704c4ec632b6421020fe4a09705d3f1ca4424fb9e10a",17.09090909090909],[10767,"6e6031c28c24a5c51ae7385f41fa922ff1c6860d20ecec91b82cc31d1d218bb9",31.06376811594203],[18581,"1f381b5b6bef099194aacf7725ff44dc54bd1969d7d01bc167413129e8f95d2f",19],[2777,"4deeb575b36472920f38806fd18fdc3f5078c58cc6dbed657edd96e76877f1ed",9.917710196779964],[5293,"bd9489b08ec354013efbefbd401120d7bc95eff0c68209feb543567fba7772dd",9.917710196779964],[8623,"cf53d32cf869aae3eee378858241bccff6458d59f38fd72cbcabdd0765e647c7",9.917710196779964],[7488,"171227893e22de42caee6be2a13919fefad0454c9f22df1edb942d09e424ccce",9.917710196779964],[6945,"b61cdbbdb8348c7220cae1bd65fe93b06cc64318903468f7bce4b183c3164cd2",9.917710196779964],[16765,"8caafc0e5d054c74243abe5ebefcf7bb42df0b11249ae28e993d212541d81d57",9.317957166392093],[12428,"92031109bcf184139ad13c73f7b5510eabb90c7dea57a414fa5b8e9a376068ae",9.317957166392093],[9964,"176c79b73b94885b8874550218041d15b4bf0e5a2e9864553f2e975de60f87be",9.917710196779964],[16614,"d20d89cbc44dd4f8f85144b768d4abd1b1363c7ad35efaee1da77dde4a2c8f5a",19.2],[14720,"6735bfc69c1924456f3baed81fb481bef49867e20cfe7046d80c78de357b8484",9.317957166392093],[13023,"0a45eac2d42bce404149a5f59bbf5149d29e5ceeea1331b34a89b9b4bbb86eaa",9.917710196779964],[593,"0a96255839542ed605a2a997cb31cadcf0e4eb9324e144d3fafab9adcbc7f4fb",9.317957166392093],[7534,"4e1c7225916238c160294613eed3f5f52d064ca114fcd2396f67fcc11d4696ce",9.917710196779964],[6699,"3114566d300f9803f93e34f80f8f409b4596d1fc436580d18d842aa14464fad3",9.917710196779964],[10416,"e2c65c99256ab7119945967f8f796982cf15d0b1fc3242d16459067d9736b3bb",9.917710196779964],[15019,"4cc5f2f35c81cd38654aff2abc972c5257c5bd389a3d67f788132c358d3bf87d",48.07692307692308],[8955,"da08dd7d46d20db1c351262790e4fc584de06a93225b039526359ab24c8415c5",9.917710196779964],[1749,"1b8b9f9c6ee5ae043ce32c558efd40d28687bd50ceda8d4eacb7485de0119ef4",9.917710196779964],[4871,"1caa50c95ba5e32553070cc0bf1149d7f08bed0e4b6bef9aaf25a3f648df03e0",9.917710196779964],[13494,"d1c436875be4b1d3e91aaadaac61058dc1605ce39e4c6ef7005b319bd665f19f",9.317957166392093],[4350,"38a64bfd19b5487f9503cdb37d817fde1591df298aac69b9cab8f525d5726ae3",9.317957166392093],[12196,"fb827cdffd95e68b71ff23bdc5aef5fb6106421bb07b19626939779e541b14b0",9.917710196779964],[14074,"21f02c8a422699c60c0344a9644d0912694f3897045030c5195b650307c21f93",9.317957166392093],[7336,"7b74a688a30e0e3ad088a25477010d70b77a1629681843c5a1f838e2b37cd3cf",9.917710196779964],[12564,"3fab7359fe10ba9d47a808a26975f238baf866c22b76b58db44123fb4aed88ad",9.317957166392093],[19474,"821c92de04e05ecf50ef493de9eae0fad83a4267bcb2c117a02f606335414b0f",15.942376950780313],[15802,"2f8ab90eaaa271c8d8381eb07882e4a94e013a23c116cf50a0dcdbffdb2c4d6d",9.317957166392093],[12452,"ef484f58fd5ee397e7a4b04a9462aa941e1c7bdc3d62af2901da0bfb213545ae",9.917710196779964],[11648,"6e979dc5289b16a1126828a9e3555fb98435b577ea6fe6261ccb20aa3be29fb3",9.917710196779964],[13367,"ae5895f3ce112064dce59788163d02fca3b57502edbf54a54c23dc5f2d8b21a3",9.647446457990116],[9602,"0b474a7578e54c312849ae65cd96b9d080a5a176413a404eef16c43666c304c1",9.917710196779964],[612,"5e2a42629934bc3a05cf6699a9bc3bd09346f1a8b7ca29c6222c29cf6c97d6fb",9.917710196779964],[15037,"6e7121ec686c48feab143b667aa75e29dc9e4d8d1f6883819c279e828122bc7d",19.014694508894046],[5104,"059dbe053c657c3164197bee4e3908038565b5c127685116d8c043a6d5018ede",9.917710196779964],[12541,"4880e4c1fe4897b30ce0335de863684efcab0ac1d7b26aa56c3871d7aaefacad",9.917710196779964],[17990,"ef9052e302ad51adfcc57d225ed9bf921688f8e6391b3dfaefa6e9c2545f653d",9.317957166392093],[17647,"a7980069f0fef64b5aced4c536f5d382e8ea695f71e3d9ad8157e239e8394d44",9.647446457990116],[2454,"a140909822a033d9b33791b81757780520f7d5cb83061decdeab3199ded72bf0",9.317957166392093],[8982,"7ff0279501dc1c0fe630cd0afb98d94d0f5392ae089d1ccaf3df7479f9bfeac4",9.917710196779964],[15526,"9244acb67b3b7007ff456ba99f6aa4a2e1e9eeccddbd2066a179ff48ab146873",9.317957166392093],[18725,"49f0061cb116a42515063c197a25a117c86f6f8613b9986e2f01bd035a1a7029",18.030981067125644],[1150,"579a02a7798c91937de2a8b3de55c59ec8b93cd5fae46879ecd8fd05cfc350f8",9.317957166392093],[1107,"821b08444d0369c14ab25a2fd29d628bd23c71a44849cb9cdaa944e8ea5985f8",9.917710196779964],[15922,"63bb24bd3f5e637a53cf94e4335c8800c104e48485c3fb95d50c6266f957a96a",9.317957166392093],[7662,"c25a84afadd451e0d7bc3bccf28a73541f568a6cf07d95323050b1c288e5d4cd",9.917710196779964],[1742,"dfa8480aed5dfddde5230549c75b9c46cb0a511cd8bb6aba1062ed626b02a7f4",26.173719376391983],[15166,"2d8160b7e83ce3d8e1451a4f5b1ab35a8c0bc3fe4c564145062c6a9da083247b",17.09090909090909],[19034,"106cc7c455ce3fd19670f435af8e26749a4c7b7c9bb9334816bb6813cbd9721f",9.317957166392093],[18232,"67c927bf121dcc3527eaa7318ac686ebd692318efc784845a75a88f637265137",9.317957166392093],[5801,"b0886e0a5f7de4dddcbe32796cb446c9decf62ae1744f5d618bd39dfe9d46eda",9.317957166392093],[12874,"8aae806e9cd4a12f58627d99429a512796c9b1080eb71db634296a8717ad6dab",9.917710196779964],[10949,"68383a3f2cac91369fc627df91e8dedb22fe9293e21e2388e116e1c468495bb8",9.917710196779964],[1404,"bbc1a69a4477f4d1722a02f7f68719dda9f6bb2b09bb9c3a27816218ff31cbf6",9.317957166392093],[13833,"14c515d2140722a55779ee24ce8f35a29afc95ef6b126c7056626dd15c69a398",10.052724077328646],[16568,"9c0088d2d98e83db2d4d7f0b0fcc5f0b1a8d7d3a608ea7c2520a09c6fdbbc45b",18.059405940594058],[4060,"c65717b3f5f18d33dd08f81f6e7b73bb73e1207c44dfce57d55125451ba05ee5",9.917710196779964],[16336,"792f1e85b337e145bc0e990afd596c6b816029f9a52f33152a7f18deffd95860",9.317957166392093],[216,"22e3e70c728be468fe53000593909b4acc7f32e08b5c02ee7ad68b2f0d3885fe",10.045662100456621],[4295,"7e8d999899de22a74197e9fd5fafbda0185525bc0a15c0b5244bbeaebd54cee3",9.917710196779964],[8000,"b6022c78b7efaf87bb17d4a2b3e16f3fdef3cacf734846ecaa6bcac443ff85cb",9.917710196779964],[7951,"205869f1ea39ded3c9a70a89969a69085d36c282068dc3fb21cd268b5c56dfcb",9.647446457990116],[8879,"0c8f35b116e20c00110c6d6ed64cef1c36e5c0ceaba2bb128ab2d893162e92c5",9.917710196779964],[1368,"731241ad580f85aa0eb42fc7ba04aa0de1d7436fc07c195da618ea50dbe7eef6",9.917710196779964],[3428,"e5c58d86b55e7e4bf2d340c6eb4a0241f6ba2a62c20af2ef1b2dcc6bf0467ee9",9.917710196779964],[16593,"462649df0478970643ca9a229463d01984a5e0ebe0675feca0e6e498a8de0d5b",9.317957166392093],[17780,"098aae8b6508718b5687d33ab1c9b1da415c15f80d18ab5591d34a98368fb841",9.317957166392093],[10652,"8a35b3cd52d6c3102d582e39ad9dec9961cf3ea5d6b6c38ada0ecdb277b85bba",9.917710196779964],[7619,"c39c93a674966aa3b075f0f928856e8db5cdb6804d39c9bd50bddeba265d1bce",9.317957166392093],[4248,"224a8ef3a7237fbe21c3b0b9f17912dd18e74c9c0edc2c51fce32942c70323e4",9.647446457990116],[14336,"18b33e216fdf1d38417c6bd96bafc69cae78c81184c026941f0f1d754556928c",9.317957166392093],[10463,"50c867a0b71938bf38e976134e666a60a47de97ec7df9cc2a13c2ba4b8ef58bb",9.917710196779964],[1214,"3f2849fae44121bfdf78b42562680140586ae4c114b34dd49b455dcfee13ebf7",9.917710196779964],[568,"9433a6d4c1f29ba81a53a6914f6f54f3e1a77362f836ae9f88737708e1ff23fc",9.917710196779964],[16998,"7504c7486f96a1228065679a87bb2ca601a997e89317ff81208799dd94520852",9.317957166392093],[18794,"036637fca0ed297172f42ce8965a1821ba4d8f80d1f3ecd1bb0a5bda021d2827",19.06290672451193],[890,"9372d7cf434e13aea8cfd195b0cb4f767dcd389f1d7bf47e27619c2cd3d2fbf9",9.917710196779964],[13047,"ad87a76170574cc02bbd1394cfb7b22810f9ccc942146b5bd15050eba3ae48aa",9.917710196779964],[5210,"c71041afa43a0e1aeaaf9d1b54997a66947072d8de460df55e4c157848f3eddd",9.317957166392093],[17314,"8a449ee2daeba25dc49be1f33db0078adb01ec023170c29f64c1f33a950ca54b",9.317957166392093],[8700,"0fe87235e8710210522ed461281bfade0383295ae927220727612b01bcfbb2c6",9.317957166392093],[4485,"45b30a22b97ba8b9cabeec1e283dd1ba76223d1235b13600c8df7524378a82e2",9.917710196779964],[8296,"d05b7378c082625cf8ec1165763abe768ca2d5595a4a020de60e6e543f895ac9",9.317957166392093],[10071,"f7a8080d2444a1fd0110aa505900da16cddd95b64e50fcffafe9e8519adceebd",9.917710196779964],[12663,"665fb56161f61e37e6b734d9fea9dddccac4d7e767f4abe64e8dcb5b6586d7ac",9.917710196779964],[14868,"77e897086837af486b9f6bf71f8b24852a2081a8452e4a2accbdd66ac8606f81",9.317957166392093],[5080,"48be42f0953d3555cfc3121f0b38b85bed4927b3488714dfb5ffe1691ee2adde",9.917710196779964],[15581,"e96b4c6061945921e9c0c892b8659d157c44681c37122a53333a256469e4db71",9.317957166392093],[5272,"46610ceb829c590ea1ce98832363b1966d529ae41fa40c4895cbe1456a4791dd",9.917710196779964],[16996,"fc136939cd3b297488d6595cddfbb170b378011922c7126c6fcb917a46061852",9.317957166392093],[7464,"eb9038c79a28887985bf527858c141d37d85b396f7bcff6417cd5c930b57fdce",9.317957166392093],[6028,"f777fc9527493f6e6ba108071274f345586314d8a28487f19ff87ece8890dfd8",9.917710196779964],[6791,"2317728542ae8e100abae04703055b3ee450f85175ef9d32c36562ad17f558d3",9.647446457990116],[8123,"16d898fccbc63204d973840c9ec179bc91ca564898242f168eb1c7e8816d9aca",9.917710196779964],[6002,"8a21f24c7387060c702e49f1170eeb039ba7bdb10ea379a093463b2136aa0fd9",9.917710196779964],[5076,"a4c19acb399aed2cf9a81cfc001e0e3c863f0222e715f4dbb70cc39ba629b4de",9.917710196779964],[15685,"d770fb91ddfb566e7a8723959b4e822dade99399c154a9f3db33db3f5a26b66f",9.317957166392093],[17853,"6edd4c9d7aa07125b40a710e4b020e5e976df62e38df514613434dbec7842d40",9.317957166392093],[5650,"087341e7495450820bd20560babed63556dd587dfe06b8e0dc529c28be3554db",9.917710196779964],[8404,"91ee24739ebcf2a8294d47c1b5020d7abd3cd17249d329a4d40ddaf04fdd95c8",9.917710196779964],[13453,"8becbdb52114b78a4fb41046516075c59ae1a9809c52be406e2062afbf7000a1",9.317957166392093],[3370,"23db1dff8ce51fca10a8aa4e80b6946c26971d912490c05a35292792f3abe8e9",9.917710196779964],[8816,"ec8afd59b7f812f81e508e3a4cde3372ee2592a5fe415dd21156382e92b802c6",9.917710196779964],[19736,"745052e5f889ac4a18710f6026b94b083fd9b652a5bb0dc611242f35274d8505",9.317957166392093],[8105,"9f32966c32f7b14d578e712babfde95a37e8d046a57d92e46dce185b5cc7b9ca",9.917710196779964],[8077,"4bba035491655df8164f373da8f53dff2749477d47f7542de9bc1fd64afee7ca",9.317957166392093],[7287,"c7fbd556968547b89a91de20fd30e4c28cea17109b0ddbf5427b7ad7edbd26d0",9.917710196779964],[11606,"713c7ec4b6f4ba0c31fb18a0ebef3d943c038081c1cbf38cf34020478c59e1b3",9.917710196779964],[16677,"982cd68228d9012172dfe7cfe7cd8fea0580bf562bf3f0acb0ecb90e29352059",27.151515151515152],[13728,"8d07cbb635073521d0557ad3fe3f4ad9746d87ccbf1206f1b9970dce5cd4d99a",9.317957166392093],[2593,"7899c1b600df8fedf36ff0350204463012c72ca82d6d619078cd4905094c32ef",9.917710196779964],[6018,"85cef5377f98d9fc7e500cae0703730e9400c85ef5027b913891b7d8fa75f3d8",9.917710196779964],[6212,"1840102a1913997e0fc6d7d743fe245d7b0e0d68df810bfaa5b73fb431bfabd7",9.917710196779964],[13612,"d3afb5735e84cd1fc6f6370e76442fdac69ed901f9092c47720501d3663a219d",37],[12496,"77639c5714a06bdc3fc4444068b4c3be1a423412863f7f5bf8df1cfea6a2f9ad",9.917710196779964],[7586,"463d4ac1fe7070e40167b114bd5e2ede11b4773d73492e3cc2aac9da7b4c45ce",9.917710196779964],[5324,"ea1c0d5646ea169a9cf41c2e2492b3616234a9493108ddf7634c5feb0af445dd",69.53931203931204],[12500,"45c2ec4db0d0532b2b28628e6ba19c2e1672d28c1c75cb76de520cc9f618f5ad",9.917710196779964],[4271,"44eb4f46637b05a869e8f6dd006a9cc8db21979bdfc0bcc36ed768239bb0f0e3",9.917710196779964],[1748,"bff04b40f844df9425914361d39099b26c093425906e6ce65aa8d4b01d07a0f4",9.917710196779964],[2553,"31c837d0237f4a511a2473001d549b91be39d9871163a2a7fd0747216f0886ef",9.317957166392093],[25,"40ede1f4bf10ae88328ae00fb56a2d5c26431d316fd7419f7661648c5879deff",9.917710196779964],[8697,"501b2a7ece618c68a40a9b84a67fa5a206d83514db84e630b4ee4ac07549b9c6",9.917710196779964],[17250,"807c53aeaca0d00f5c13a3e5fe04124cf95191bc4314b62e4b9b6c5892a7004d",9.317957166392093],[10892,"b91f43ed34b039725cd57cecb9b4ea407da4e923cd00855309a1ab0f126eb7b8",9.317957166392093],[11370,"85e09c6e57749900358b517da7f73b45ff7c44abdba871344033ecc85c6492b5",28],[3792,"bb3184aee209f8f9a0a8128c43cf621f24e84cc4789587229f6f65fd8d3202e7",9.917710196779964],[11592,"b68c73c41173a4539d59ad88cb704661b88a36479b5ec0a514060f26d3a8f2b3",37.936094674556216],[1236,"6795d6c912f3e2e05623e822522bb94550995721ef03b9c1ebd0c08d63f9caf7",9.317957166392093],[3253,"9329c1c57ec0818ea528617ca1613c9362e64e781b225736f0ce8133b5cfa5ea",9.317957166392093],[2412,"363456f8754c2a03f67e9df5b0f92797f27c739cd9a516e0dc11a2e11c7460f0",9.917710196779964],[17599,"1ea465619f74c7076da2521f59874a87b0bdebf9451c73e159ea08f5dda61845",9.317957166392093],[3308,"b021d6cdfd83ae4219b298b2bee3b506ed6ce8c0d0db88d9f36c3fa5ae3154ea",9.917710196779964],[10299,"c58073a5641b5e8ae7ebce6750e9f5a9cc7350e2d93b912a162c1541227060bc",9.917710196779964],[8155,"14d8e5b9c18a3bd8e4542a9f5d89754a016ede83704c459ba03f7baf7bdb51ca",9.317957166392093],[3322,"ad882a6c7766498c2a47177194cfb78f63e1e07c757709f43eadb4a5ae523aea",9.917710196779964],[13956,"f071b66f9190704f338fab565bc96f30dce61230cdd2556aa46c91875731dc95",16.97508896797153],[7414,"476e8038590b3046fcb07335e2b40ea881e3a0a616bb5f24543b5f1f08cd4acf",9.317957166392093],[5162,"37f97ee1fc9c230a980c37491402e5ea67c05214a4a1c5a1487d658429e832de",9.917710196779964],[10047,"c71a8e0ac38a834a30ea7b895f59ba81afa9eb053ff1faa13533e8eef63910be",9.917710196779964],[5751,"a14d66e1eb2d2638cb1c292c684e79bac7debb829f826eb4b86d0b011645c6da",9.917710196779964],[12614,"e53631dd38fe4e479c138a1b7bb301705fafb48b06335ec057b60bdf848c2aad",9.917710196779964],[19715,"603a75fbe5ea69ef32489575df3811cd141a7303474ab1550ea0f363273b3b06",9.317957166392093],[15222,"59d39a8e185488d861315027b19832a3751728fcf91eb2758ab8bde37e99067a",9.533923303834808],[15927,"c6c0a85960eb72e6cad84f198246ca647574e0bb46a39ef43db84f049e52936a",9.317957166392093],[10670,"f75942c31bfa3ad4daf0865d93525ba848ca37a81a4c1ccac786fe485a403cba",9.917710196779964],[3439,"c68601cd369930a72c35f9d2ac6175bee52a516eebb9de67d2a4c4e7777970e9",9.317957166392093],[11225,"afb279ebb4e956146745fa5275cb4dc985d006bd9415bb2cee5f8f87e9808bb6",9.917710196779964],[3596,"b4777281460b4098ec94e827e3f7b3245ce36d9975eb327fcbedd372cf3c4de8",29.822064056939503],[13231,"7f50710c0a62f351c9f58f63ea01f70a2ad3804c83f643d5248a015d683c51a6",9.647446457990116],[18537,"0e35935dcb736a5847f8e5a6b7f2dc089280dacf2d9e2eae8c1834e88fa9c030",9.317957166392093],[11594,"e6f2aedc49e60e02c9f21fdaf84f4521860f00041888b0240f259a8edba5edb3",9.647446457990116],[2116,"49625e6aaeaf3fba327135006714325427ab8decb35c5ce812136d5bd62320f2",9.917710196779964],[11737,"a5136b237a45e60ba16a72ad40df060eac3bc58f0775c737dcb16ba35a2f15b3",9.317957166392093],[15647,"da35dd7505109cd37ceb3a1e8002353a1ed6573539b290e3aecb420253d46670",9.317957166392093],[2696,"8260e13428ebf940c5e2546268be593979ee99f12c66a4992a225df96fed7eee",9.917710196779964],[19672,"235188e2ab763c193b949672804a3334ca059e282b15592846a49c6fbb068907",9.317957166392093],[8881,"98cb23dffe84b5b0763385022f330789cec41f83a2431c6234969aa75df38ec5",9.917710196779964],[2090,"8345e8fef1fdb05bf9dcf05646682d1e493ba5b86981f69430d98e1934af4af2",9.917710196779964],[13490,"6fa3c5b9845da748ab59a949c094384559e51c7587cc668833380a5d9a2e15a0",9.317957166392093],[1477,"6c49133b9793b317495c0b946b3a529bc911adb60f6c24cc1a53a7eb1bde47f6",9.917710196779964],[8603,"d29651fcfd99e1a3c56d13454c92d8665f6ac44045e6dff89a6c982bd2196cc7",9.917710196779964],[13773,"2541a2fa095cb5126eb111150f2e5258059f7074bbc7d1fe776ca8c29185e599",28.124444444444446],[9948,"43784141eb7b1cde01f00712a304ac02254a91e2a3a04b9adbc86deebd8da4be",9.917710196779964],[2676,"a7de08ad463c327e562998bc1c18e5e8aeb6b6c5b9047285edcf7429da11abee",9.317957166392093],[19338,"febe91c05a41fcfe25114b32bc39a53264abf507164d632c1346f304447bed13",9.317957166392093],[18807,"77e6e617c3afb2ac680d9574bf0afee85b6bd297da2188945b754cc39a8c6b26",9.317957166392093],[1566,"23b437fae014ff3ed32d9870a485c67dfb7804bca1d3cb71bf1de888b0e6b8f5",9.917710196779964],[16810,"34007cde20cd36d999852577979426618ca5b41a6b2789864bf9584534290b56",9.317957166392093],[3698,"e4040f67cc91f0b10f05164c1e5e299e1b949b0a17836e3f111d9836f35e99e7",9.317957166392093],[3221,"886804bc8b1bc9f37f15ff9b944617d2fc7fb9a3b39b176c9e3545bcfbdeeeea",9.917710196779964],[12098,"6e0d033233ae433fbb5f7501f44360f725ce1725e807f0122deb83977a85b8b0",9.917710196779964],[12879,"785e249bc131e2657ff68f2547a9d4b962f34c707cb93e302a3eab61238368ab",9.917710196779964],[7469,"61767da3ed2be06cbb91a53fc91b9cfca869fb6b7021763ca489abd64c23e3ce",9.917710196779964],[9749,"e9f809c5aac6051722936eefcb3caa2badb2c0b0bc4958f2ff4e6770071603c0",9.317957166392093],[11215,"fa4c6996cb841ed695ee3c50c5511ec05222ed77b550639845e46e0743c899b6",9.317957166392093],[15828,"2d6c378306d75d49c0c3c1bccca02ffc972cc7bf347a24e2dfc07eac7e6dde6c",28.848056537102472],[13486,"4f667d9e4a762aeaf7332adeb7d860fc28a66466aebd180fcb140202b06532a0",9.317957166392093],[215,"ab4ea053ece2e77456016121a31e00e1e120cc0a2a8f5960fe08a2e37b6d89fe",9.317957166392093],[10066,"5f643b8e3b783c975529c3ffbc774805bbc4b1df2ccfcb2f7305974d290ff5bd",9.651245551601424],[17083,"305d5215b126dc1e849f60a7ca10a92f3a2b858cb137e4d7bd3ad1a34c6a4350",9.317957166392093],[4317,"4796103aeeecee3d5a0e6c4101ea74f82fc6be0e7733c879b47ecd470c2aa2e3",9.397642257991386],[12669,"23f1a51f64286b8a94c786f8284477d5134269ff010826ed212efca373f1caac",9.917710196779964],[11022,"32530d5362eb7bbaf94dec7072430fe3ed837e7a1bc150f0cba4f57f1aa8ddb7",9.917710196779964],[9862,"31d191268a00d488386ba439235bed2d27d19ee10e55f6a7085ae111ac4531bf",9.917710196779964],[6341,"4eaabf9a0fbcd90f0c5100bac50f72d3b52deabeaa364d84df866313e2e4bbd6",9.317957166392093],[10879,"d9cf2d98f4330c339c18648fc3ac6d58e66d862b64a428465cbd7118e039c4b8",9.917710196779964],[15661,"367afbfeb82caeb8c4a17870e97486a9edd65d3be84c08869d61ba35f1e02770",9.317957166392093],[3940,"ddaaa39f41b0689530f902c737001ee88885cd4ad72003d890588b93447613e6",9.917710196779964],[2217,"154650e7b0b041eec8bc9d907e1c1f37b16d83dcf286cee5ec35bd2ee5b365f1",9.917710196779964],[18748,"9b4439978ac14447fe0885990fdf707ddf01ceaedecefa71965abd26986fb928",9.317957166392093],[999,"c5f291668fdc9c795ab87fe003c8cb4377ff724a4b4624c4e3dbf99938ad3ef9",9.917710196779964],[12109,"63b8e12c2ad06d50640eae834f55844b224401f73c244c47a2de902b5e26abb0",9.917710196779964],[7438,"ae52da1331662fa135b094270bd81f098a399a41dfcf71a4d5abd2845f3525cf",9.917710196779964],[10613,"804b323960ed7a12af7806c04cbd3c604474cf3bbbf80d9e9656cdd360f795ba",9.647446457990116],[17227,"5b651e04f6593fd2b7ba3ec9f3c2896380c7b494e375cdd10300beabb8595d4d",9.317957166392093],[17674,"a018878e012c8333518333d9936f20006f50f527b528c52122ecc1bb1fd4a943",20],[1708,"37ae3977a09c33aeb9957d8c329e2c666171404d963f4ff2b4a0d410f5c6dff4",9.917710196779964],[3595,"d34b6bd824be1f8b50b08cb68b93bf9eb9b1e43692361328b319bef25d9e55e8",9.917710196779964],[19577,"f44746e3427333fd2cf137b6fa7651d5f1287c1fda2f7e5b3c3f559784a7430b",9.317957166392093],[11879,"fd811f85f5883481dad71c82b40d487552a29f596cd814dbde3fa7e346ec2db2",39.20855614973262],[5620,"3de90c50595319071fccfeaeaf7535115c498219a3dd4441a8b20a1944538edb",9.917710196779964],[5675,"cec4b1a55b4769dc41e8b8bc9df4e048cd296ac228fc64de79d81252dfc12cdb",21.863917525773196],[7382,"f8056d81fc4e5208e17b6ac3351b8e9aac467d842c414ecd004cb280f3ea89cf",9.917710196779964],[16354,"530e62d6811337c3b414b3a20059329141d2de3f38050f8ef9bf0edf41a0f95f",9.317957166392093],[10312,"ed5fdc4bd26dcefcbc05686f71a3b8bb0e33ea90a3343142ed3effd24c3d43bc",9.917710196779964],[169,"75b9e568ac502e9ea8647e0891cb33839fbc4c920c6a11b98820b998a264dafe",9.317957166392093],[15,"d1d94f1e7ec647708f8f2486efa40bcb7d6ecb3d96a86b30c68efb79cc23efff",9.317957166392093],[11889,"f69230017cd2f7cbd35dc099fbf2c1210f0a622e925ae7e0028151e8925b12b2",9.917710196779964],[795,"5ef48a248a7483cf813467a9e32b54655b447911eba76117c2d2c312aa7c8ffa",9.917710196779964],[9089,"a19a4ca44c75eb7b60e5bdd6567572b73833ee4dee508b842259501cd9143cc4",9.917710196779964],[17115,"a7d491b17acb06080e7bafc0eb8eb76ce2b1b5c3bbc4350f078ec629d3ebac4f",9.317957166392093],[994,"bab3973e51063d68423f0c0e8ac493c2fc8c5dbadb9b2d77a960b0eb9ae043f9",9.917710196779964],[19514,"527d323a6c7ca5afec12d3ebcd8777aed9ac12bb04282e60220513920e1ee20d",9.317957166392093],[2310,"159c21b077a99f2aba9db47bfdb4b5917599743e301479206b187a502aabf9f0",9.917710196779964],[9215,"dea58542a4474a36e138c2e8ee2fe2945f845a936c3b606ed66b6f55138c5ec3",9.317957166392093],[3352,"c2dff0b697d542c8d6325cdb33495990ae8c396a9ab1bddf1d45ac05cf9101ea",25.968141592920354],[4201,"3518a7f01b3d427a054765278590e62b2141c9f54f5f3e65ce54367fdc0a6be4",9.317957166392093],[3533,"af29acedd691e6ff5b98457dc3ac059c5019e1e6e7afea316d6fcf696bbabde8",9.917710196779964],[8026,"acc8882e3be4e1bd0893c5837f1a91243fc1c4aac2b7dde425de6fed321065cb",9.917710196779964],[10746,"87fea94d8215b891cc829ac2055c5fe78f34f91ec82f3c4d3a24334bc74cb8b9",9.317957166392093],[16794,"f2a33aec0375b00913f8ebd17ed296678843e9c4e2893e838575156ca2c86f56",9.317957166392093],[7494,"fff53dffc06baf610c038717bb598079fd61e550ea61f8731f6508565a91c6ce",9.917710196779964],[19454,"b93142cd0e8937e82e247211167bbaa883826475f0e8a2f882b162d3789fd10f",29.32959326788219],[12069,"a06fcba9f2aca3428c5ca765032fc8117b1cda4bfd2fab235f7f40eeab51e2b0",9.317957166392093],[17581,"d01ad65105e2ad80e156e6ec08b1d7a2a4ac5aa8eb2fc988ad158714f5cab245",9.317957166392093],[7555,"644d3f823c3750bf3bd789a8e1386718b23786fe663f1a0b686fa698b27477ce",9.917710196779964],[16953,"0ff8cc51de895b0c8835e337df6950868f0b29c5ce46f2d97f56141381631a53",10.052724077328646],[14866,"34b7a664694a1bdfd331552ddb1ae6ab7ac55c5f05d0177c8efb789996a07a81",9.317957166392093],[6181,"4b65c4ec132386f07ce22f60ee96737a1e5d39c0da871394804918062a1aedd7",9.317957166392093],[7727,"d03eaef1ef91a2866d4510649c3ca832f3e8f3d7c03e9249dbbeec30c4d94fcd",9.317957166392093],[5732,"59bef7f73a5a0718212ff57c9e9536149ec80a130f62a1597222431509badcda",9.317957166392093],[12613,"b226cdcd5815bc360f30c216e7aa10e281447819e62162b4c267e73faa8c2bad",9.317957166392093],[11686,"b5f7e02939f27e2fea68ec73242ba137df28ed047986525d759a719ac0ad64b3",9.917710196779964],[4736,"5aea97fa4288f8553c6dcbea9802832db1571247a1bcc52dbfd9109ddadcbbe0",9.917710196779964],[8846,"ec937be5ca54dcbfc3ef10a0fb0b80aeb9f94f533a901a00180505800f7dcfc5",9.917710196779964],[4402,"ec715fe2ca9b9d72d1fd27c8319fdd87bac99f4a1c593df58ba8884dbaf70fe3",100.68649885583524],[18252,"86306d221d7067aa08439c4afc6a29cf328588ab3c8d6aa2c0023bdd0d2bfe36",9.317957166392093],[15432,"35e78d3076c36c9db1c191b96c5a06a0162f91e8c23e1d5febc6120f0b178775",9.317957166392093],[19707,"bd11cdb0c5c908b2d4458d321efa602f65bf3da7364aba07e719c06e1ad38d06",9.317957166392093],[19371,"87d479b1e4e92272204ba360294649c4417dfadc119c3a91aff4254f80bc0413",100.14197823000474],[7865,"2c00983b03958b4431ec8faed08a8d4deceeacb00b12ec31f579bdf5c50b76cc",9.317957166392093],[10971,"08fbde8314136d4e20799bfd26551c40d7218699c1df7116403f71452ec234b8",9.917710196779964],[14862,"99cd5b66a3f1d2c7a21fe02c37323d17a6cf7581cf9ec858e71afa9d31f78381",9.317957166392093],[12053,"c1cf551b309a351ce0a120167e1d430ebef4f794d00647dded45cbd8c5e5f7b0",9.317957166392093],[7789,"6f28ca98cccff6195db27d8a85de34fe9468e6c1eca8ec8a7ba110f854e9e2cc",9.917710196779964],[5746,"3bb418e264786ff284109fe64be600e833a5107bb0d0cccb839d0269814fccda",9.917710196779964],[16239,"0d5635a9cca74022d8971d3f4f1c1fadf65e72844bce4a455507319b66a6c562",10.052724077328646],[15334,"d4bd4e244613daa96f184465c272712e75c81fa2c32445f09d62380680f4a977",10.033847820200378],[14196,"5d27ec593a3001c4a17b135f4c737b756b76a57ffefcf7ea5ca9f98eef185b90",9.317957166392093],[13509,"430399c3173312164070f189e5db572f00ffdf3b0be49b2f21b225a33b239a9f",9.317957166392093],[16072,"414418153a0f0723f94efd2514c41bbc2d2a0d0b833781aad91fd36af5f9c266",9.317957166392093],[18383,"fac93b62900b32e3f33d52958b189090b6bf35e42d90aed3503626ced188e533",9.317957166392093],[372,"5550e407d15f37215466007d98c86c336f090fa814941c43ecda9f248dd893fd",9.917710196779964],[12694,"d05da2f0bfb210afe011a8b685f132adcd8457a218828167226f5f8b62759fac",9.317957166392093],[3778,"a2b005cbbe153fd21517727c923319612d99a64f0ee02961dfa5c6da77ca1ae7",16.412848867825172],[2245,"318823ce08b1e319e2feed5107f9c03461dab433022f2eb8c24b6e3f818147f1",9.917710196779964],[17371,"08b3954a0702f40ad4154118c80d38e32fdcc012779425bc42bc2403ef3a754a",9.317957166392093],[18742,"516d0d6bd2788bff44e40292d298b13283508183ec7e2496c7fb1e562559e628",9.647446457990116],[10622,"69cbdf4fb17d1757f8f59a2d16fff64f24fc94906cb3e9268d5889fea4f58bba",9.917710196779964],[6432,"d63749606dd6e301ff55987ae69c167783284d23fb17573b0bbbac1f40b710d6",9.317957166392093],[9563,"135b75fed17e8c4613d43042e81422f7424c2410f7cd9e7624bb99e0a3e838c1",9.317957166392093],[9924,"ad972a87640ac12f93f73c323933a650689d86e9edee1b94ff2da1098be3d0be",28.14867256637168],[10533,"31ccab0f01ce4e4ed45f70b472fd67b93acba729d549ca38b364004090f3fbba",9.317957166392093],[10574,"ddfa6345e6e9c151c1aaa9892732e743830042be25ff24e0558e8e2e3fb1c4ba",9.917710196779964],[14959,"23058e6f733f74f5f645238a31704d19bdf05e6a3694aaec8462d0b0a1d07d7f",9.317957166392093],[6431,"a45c6fc06d30135f73d320f275aae894f3f4394ff9cf8230fae41f745c0b11d6",9.917710196779964],[17525,"4e2bc0364302b7baaa560e1f763ce31379c68529bd2de2d2ae21d37a5b1f0647",9.317957166392093],[15666,"008cf90e32e69904ed006d6dec186d1848f4089cd73a23e60b0649bf56b21470",9.317957166392093],[12767,"2de8cd7ddfc80569ef471c9347e25d4c4e12b4e2b4106f4844b61c2dca7420ac",9.917710196779964],[11730,"c4531c1856a33ca9288a643022c529a41ea9b763345826c94d9d7e3f941118b3",9.917710196779964],[4630,"da34361e3c8c1ca365580fe9e415c6d362e0fab94bb8ac6d7a9dcc0b120e70e1",9.917710196779964],[19068,"5bda0404458a5437c69f344809fa89469677f2a6a7a9ead2ed8045795a53041e",9.317957166392093],[12413,"7129201fb30b38b0d682a5dc6147fa9fe2c1e8c718c02ad99530b6ec81cd84ae",9.317957166392093],[6761,"91af291795fdb8c88ecd79f5034d2c0d639c839483f6068aff2a35cd335a83d3",9.917710196779964],[15195,"98743601666f65c0d6daed34f774497fb17e42d0f0805986021d14e01b9b997a",9.647446457990116],[6829,"5176b462fe5097a94f73dae7f9df2f1e68921ed96b01bc014f10335da20d11d3",9.917710196779964],[7190,"d793d372f40b95069721175231488349c91f041f9624faade1da68a99802c4d0",9.917710196779964],[3501,"af8a3be9326ff58427b047391a921a86d5cd9e6720bd7f779c6247521af0fbe8",9.917710196779964],[8010,"014cf0330d8b36bbc398db3a639f3d500fba94768dcec974bc6dfecbfb3279cb",18.091370558375633],[959,"895aaf71ac0a0424375b5cc4704f947176ccc96fe97bccb1f7e60573ec8f71f9",9.747997086671523],[3459,"5a5c006afe676235f6d06cf727c755d3799b05993293d03f6b614aac786c53e9",9.917710196779964],[6883,"bf11506768979ae2d064e414e302fccdcc52b405c833c46b1b55a113a6d4b6d2",9.917710196779964],[12073,"5879af39392c7fa8a872b7ab635624206f030d88f9c8419ffade9c69325addb0",9.917710196779964],[5411,"63688f903188b5c96610eb36d67b20e527c03f9a79d431bdbf9ac19a85aabedc",9.917710196779964],[19297,"d72503bba386ba83a18d27e74972880fa93e200f3e6c37c3df5cd3982e80fc14",9.317957166392093],[16668,"971a67dbf675fbb39287e79db6082e845bfb1d6b23637052f1744832e1585659",9.317957166392093],[9715,"d3e813082ad32da254fb10bcb9c93ea437543a087d4c5b411085d7f4d4c73ec0",9.917710196779964],[15223,"601c66c9d923540b607782b809049610a89c381de0c8719f15d22d54b8f4047a",9.359398496240601],[11579,"426fd078f64465945ae0b4b7efe94c0c1bdd347b8ffc8736e47e8ed409fe00b4",9.917710196779964],[8172,"c1a59a16ead8cdfed02aa61c647b5b650999834d76f31d46c72289d93e542bca",9.917710196779964],[7368,"c5ca189b7a20ca19ab360b474e504426cb6e969a8e8184992fee0928533498cf",9.317957166392093],[1437,"5fc77f43aff3971e2effbf133af9ccc2c7461b130f49ba5fa4a84c05baf196f6",9.917710196779964],[16076,"15655fb1f801b3ff725369cb05f5bc29c84cf534ae1920bd9a418a9a0f07ba66",9.317957166392093],[19104,"15862b5cfbd30fa3cc6e61260b15e0aad98ac2267af3541c78c87bd49ee2931c",9.317957166392093],[19680,"8ee8f316e88e0c1570456b6268f5bb9375232f11807440716b6f42c21bcf5f07",9.317957166392093],[15002,"e29bbea9fbd1f0ef34e97896b95e3f29d5c72d8414151f5d9ea4be85967d597e",9.317957166392093],[17585,"f5a2b8a671beda8f06d269ef7b2384295592622314b3d1ce48d36a3a8b568e45",9.317957166392093],[1868,"343d83b09b875f9a9758b3107ec5e95f0d909e14aca1777ec13df051ea86d1f3",9.917710196779964],[5794,"2f09624e9d6b182733bd63eae1cad21e5d3077c7c8836f39b7f00cc790e477da",9.917710196779964],[6936,"f699e1900516048b9af35c2e563d5e0fefc2776cf9f7c8ed89b809dcfa2d67d2",9.317957166392093],[5501,"e772296bb49c52941a28b5e449b338ef71623187c132a2b502506ba5a9ee38dc",9.317957166392093],[10256,"e6b973ffc6f65665f18694d1ce224265b84670572e160679e880eeb18beea8bc",9.917710196779964],[18337,"f6857d55b9698b8b0d6dfb89b7a9f3406a5e3d19fe42cfd94854277c55cb1f35",9.317957166392093],[10419,"a75bda6b697be112009fdf9ffbf11e7b7ca35b3dad3e7b2f4f4aa100fe6dadbb",9.917710196779964],[8015,"a6463f468ea409e681eb2bdf3cb9e6330f423587b83ca27300321861565173cb",43.67736883320282],[13652,"eb74b1221eac95acc6ff56dbe0d6e205ce487008b71545dc35ce3d8d5c1b259c",9.317957166392093],[521,"c8de37b0b76baf094960b1f7676c729085a33958a7857f8e8dba167945e288fc",9.917710196779964],[9232,"252a9378f167f322173f0c42c174f786897470dce69cfbff1cb5162fd3c537c3",9.917710196779964],[7666,"2366131b5ccc821eda7016b716720c7ab5659ade8446ee4cd3be41e67014d1cd",9.917710196779964],[8087,"6681d8e849e98a262fe3aff0dea189b08b3ca524daa43bbf3c7b0264a804e0ca",9.917710196779964],[19762,"060bda3f4072b4e7406f8fadeffeeb8fbce383f2d8e507aa4a492c65d0f43104",26.093862815884478],[16800,"7eafad09158f84c3fec9fa0bdeb6c86d1cc56c4f4d1c084ea21f9a9c05244556",9.317957166392093],[16782,"df609eb8140c4d855459233c146bc074a4f97d2d578846a98cb084864dfebc56",9.317957166392093],[1030,"80132ec1348898a6cc77157cf52a694b38be2c8c31ef4788c5e31745759311f9",9.917710196779964],[14837,"02080923fa3d62a4461bbc2b709bfc7189da0a752a54922af5c8faac45c13082",9.317957166392093],[6633,"0f518fa0b0237bfad96f11684b26a529a0a4d7e899c6da7dc82dd1ca78e270d4",9.917710196779964],[16224,"df62d4c8b8133f02a6a373d428f2f0fe199745219045b6b5bcea54081f783a63",9.317957166392093],[5426,"ff7122bfae4aceb21d765385e24bbdd5c21f5d2ea0b6013dd5f2e827eb6fa3dc",9.497326203208557],[222,"64f0b258bd4745097aa28c37737ebe490814394df1240b429a503162b3227efe",9.917710196779964],[8956,"5e97f11b629b899b88648845d932692e6ae4fac8303ad7dd85df59a2e44414c5",29.112403100775193],[338,"3f33a73c83101a57406b425bdb0a48b55dd39a6aa0b65a372e75c566d340c7fd",9.917710196779964],[10224,"461ae97b4142dc9a3705cd7241fbd9a24eb66df56308489a04b48c18e652d0bc",9.917710196779964],[10111,"74655d081df5ed33fe3c9647a19238131c995d98bf77d0a2aad5c4111e829fbd",9.317957166392093],[4789,"40acdd9399662a63dac7f0935488fe95eabe057d92b48ab8289e7bb1a9ea79e0",9.317957166392093],[308,"0ba5224df71d11110ce2c5501caa83b12162ecac87a32ce76131a9fb3ea3eefd",9.317957166392093],[12586,"d13d207ace69f120aff699b4850ef402c1d1a9491b1ce8d0cc66e5d36a4159ad",9.917710196779964],[2285,"90bcf442dafb00747e127132a965490d1a926809a5665301498eb92876af12f1",9.917710196779964],[11833,"eaa8ca551b0172bd7c5bfe02d2389fb46d548d155e3f7ae64e6667847cf882b2",9.317957166392093],[14447,"899bed49665cb76403ccf551549b4676302e241f73e4fbe654bea25e2cdc4f8a",9.317957166392093],[18593,"c4de5809868ad034a18971662784a9ba0a5d891dd1f06769ee84c4c64e81032f",25.35410764872521],[1204,"a46ba082b63909dcbfa3dc35a71d78db714a1f726f28023295bd92c77b73fcf7",9.317957166392093],[14663,"9e4b6382646c38ae7351f83acc8afa67c803c468c3f50369b74cb5baa48dac85",10],[5264,"56145843ca8e41c0b0219e2ebcfd60b6bbec913de8e1bee56166cc92361998dd",9.917710196779964],[2880,"240d816f328296153940e8705fd2b3499802e670973b9ac45fd3223114a53fed",9.317957166392093],[559,"358c34a40b2f6e60063f173a91d36c506fccf53d30798ebcbfd14e405ca63cfc",9.917710196779964],[1813,"448796669b6c385800e16e9f600c3a86c63bc25f13118f615114b31f14c025f4",9.917710196779964],[4677,"0c35678a247a4912d00773694ca21ad8d38d7fd0d265ef5ac00584629c2d24e1",9.917710196779964],[1394,"26d033fbe0a1191658987fd17880d74fe8dd25f7d192ce8398e10580f08bd2f6",9.917710196779964],[11070,"bedf644bced4b512c360a80f554d32d16e41d4286844f14d73f80886b60587b7",9.917710196779964],[5761,"21feb2712612eb7346a4799ce7d29283bfa286999b7a33496fb4873bbedab5da",9.917710196779964],[6206,"596773591e026171f6edcbf09e81b497e42f4826009be0059feddbeeb77ab7d7",9.917710196779964],[13764,"5555706a681767eb6db3c8636623ce8c1231d8e135f68d462fd1e7812373129a",9.317957166392093],[14019,"6a7a189e45620b4d97f4f4f6796b2e211c3fcd670f43446d39a1e54a64c86994",9.317957166392093],[9009,"fcae7f72b0d639ec758a41f81e61b0c00a85663c6be0db8157e7777ac68abfc4",9.917710196779964],[6527,"273d624101a829af44d91e8a95816bf8a804ef9937aa50ece86fcfd440163fd5",9.917710196779964],[11196,"91f9dde524d2539f5f963e12f3c96fee02909b24f33042cabcdc6631eedfb1b6",9.917710196779964],[18648,"34b4b1f31ee52f9337679f343801078f71bb3acf9d3935d8a7869f955ea8c12c",10.052724077328646],[1740,"c033cf2bdf0f2d07dfeca8bad030dbded39610ead76a95064c473dd0304ca8f4",9.317957166392093],[5384,"34bc7263fe409043cb269613f5cf319ed6627f5595a8fa8a1cc21cf52bf5ebdc",9.317957166392093],[8800,"cccb8eebee5a4f2913391e91182b8ab47cab69167d32032aeb83fdde5d3a14c6",9.917710196779964],[8606,"779f7cbad0620c4b7bc63ace9769d3f358e1ebb64a60a5f0828226339d9561c7",9.917710196779964],[18101,"f7b34107e6e66094359d9935532d76734623398541c27baadd1115325153e83a",9.317957166392093],[15350,"bb5674e7463e34830a1347c20e2fe610285ea7bbb9418d37c76fe70b56c45c77",9.317957166392093],[6900,"95c0a399fe9edafd491f34d3a7f222e225195defea3437b0195a62c6d9149fd2",9.917710196779964],[8331,"f7cb9fd7ee0dc8791dbf75fe9c3888064ca072ac7ccf17c6c13e476740a81ec9",9.317957166392093],[12511,"f6938d89a471927a26c3fdf4b92ccee6b3527465021ec9885fb116818f8de7ad",9.917710196779964],[18193,"ac462ca7df6ac3e6c377d502113ede8dffae151cf709b304d647d1621fc25a38",9.317957166392093],[12006,"baa603427e2c40252745697bf9be5bf236860d4179d8e682423e4347067f47b1",9.917710196779964],[15870,"76fcb936c5082c0a1caf49c77a6197aeb730bdb1dfda445feabcc5e788c0b66b",9.317957166392093],[709,"71fbdce3d0c2c7ed43d8b380104dbfe481589162ec62e8f6da3d84b757d62cfb",9.917710196779964],[19842,"6955ed766402624c61101bb11cad5400302a0b06299aef35f9027feb30b51201",9.317957166392093],[3876,"87109c0d4ddc84a7aa329db2b2c2a0adf58d83c6bd5ecd67e47c67e5321988e6",9.917710196779964],[3072,"b793f73b61138a6275ad276cbb96833f88ab64dcc096a19020cae1c5255bd3eb",9.917710196779964],[19184,"9f4c64984306f7454da36db510a0cba829f01f0a6c191a52e1716aba37223819",10.030959752321982],[15104,"c9f153020729f6492230642a2653041c926441dc69c91ada2fc6b33be587897c",9.317957166392093],[3179,"57fb05067e71d02583f67349e59d746fa2526b6b19294e9dfcc66010584d28eb",9.917710196779964],[15188,"cde25e0d9ce04db50287350f2dbd1fc4de78d28116d020baa9c2d348e584bf7a",10.00375234521576],[12012,"63bb2ea172df0415cdb58d8b2452ee2b14414991a9c7d25978ac26d248963fb1",9.317957166392093],[9605,"5a1f58cc76810437f8b95b6f8f09088684fd76ec573f3b92ec5e4eb2765e03c1",9.317957166392093],[3432,"c8300c7f645cf325f7bb7636f6b9240942e283215f414553cc596fc75e7479e9",9.917710196779964],[6530,"0d8e7da2fcdbc9e1d6b1f115c3d739c0d7a6d1067fccd09892744703fdcb39d5",9.917710196779964],[18606,"33a3496167636774e62ff0342e71259725b39204a183109c8ee104d209867e2e",9.647446457990116],[3842,"6e0ee5449fab8dfc0f99910a3a5c94201f140c5215dbafdb9271485b2c1dc6e6",9.917710196779964],[4476,"7a811745fab5670148dfcd61bdccd337670fef1f1b818bf178b8d77910918fe2",9.917710196779964],[1446,"d47cd8ab8691543578e527a025851f49065d30a0829bf660829eab6c8cb888f6",9.917710196779964],[14626,"664365e9d79d3b250eb015178c260ddefdf7b618228dd0114efcde9fd2ec7a86",9.31549501337874],[14403,"49fb495069b8ec61c8453a1a5359427518e82aa3246fe51897cfee09e16b358b",27.149153625039922],[7630,"fd70d8e1fd83ac596473770604a71b1f9ab163f1e073c57d96b5d3f8391107ce",25],[12808,"9e1237712e120ca7b9da5d02851b8a7227a1c4427c60666b16d512c9b474e1ab",9.917710196779964],[15395,"5cbbcde81c031471153adc1c3bdf8eda3f9b6fe105128db31cf51d15ae846376",9.317957166392093],[6147,"7db33a6158608de9cc94d031ff71b8a6382884d0893854a054a8809615f128d8",9.917710196779964],[16936,"5265a7bc182c3f5103b36f7d3a8c7f3381d2e27380f27889a8060c415c336353",9.317957166392093],[13602,"a2fa26314a71582d1002b191a2797abc3ce4d5dd82683369c099424b291f5c9d",9.317957166392093],[18283,"94171af7b916e928c34406c67ffff24c2d795ec1f9101ae7d41e906ebc6f3436",9.317957166392093],[9537,"74abe8df0e4445378c2e1e9384e9f444e0e48dcde53aeab00fa2be16076c75c1",9.917710196779964],[19695,"4af7dc9f2d8851cf51f5b76b2013229034c80e9bb7801bd6370bd9927f81f706",27.004807692307693],[13393,"a5eea0afbceddf6829f4afe4f1fc3f86f9dff83ba03cd10689c3524f84e07ca2",9.317957166392093],[17367,"45a64f6f8248d6c6c9dfff1a7fb75c91f8de57b08eb16a79b350b41b3bcf8a4a",53.97276853252647],[8880,"4cb84af7b9554f5206f7a76b8c11138db61e3eaee407e82fc3097eb21b0d91c5",9.917710196779964],[6940,"2c4c980067af3f50f858ed59f9175c2972fa1acad578f02116a1694cef185ed2",9.917710196779964],[2652,"ae3b7cfd7a2c461f4c679a5aa71e31fe48789f64cdc18a9079aae4b10182d7ee",10.052724077328646],[10712,"bc49920f39b2aac122aa94f7dba2920983c577e7d82d8aafc2ae505b067bf1b9",9.917710196779964],[14190,"fe6fbd53291009969272f598a10e74412e758784a68148e8f962d74714a59090",26.090592334494772],[14350,"e24d45060b3c578721d8374a0c0b72bc9492eab84b3311c4660717dc2d1b578c",9.317957166392093],[3557,"5faad45f0d46b7f49d49979860efd49e412c71a3fdc3cfbdd495d3f860148be8",9.917710196779964],[5405,"ac2d13381373f8e30fc65b10a6dc36df56d3b4c47f8ebb4ea2c833d2ac4cc9dc",9.647446457990116],[6239,"750fe5eb97857fb70774e83d9117630ab454c42da543a9a2fa37b3dc7db67ad7",9.917710196779964],[5228,"50f48e0a9826ba62126c163f2be21f5cea4427338c7b550a8bba8e782ad2cedd",9.917710196779964],[15101,"4cb419d10450f612f74efc17a1457e707d0b2ce20812d686a92fbec808fd947c",9.317957166392093],[10499,"8ea12f7c267d1dced256d6bfa2b77e8cfaf9a10b9c6e98610439bfbbdc862dbb",9.917710196779964],[6349,"2745327e90be659b0271614340bdcb032283ef232a995e1fc9ac90833807add6",9.317957166392093],[1945,"13e03ee598f36225a51acf24c83e53fff96ca0f5956a6daf6fa2f19365aa65f3",9.317957166392093],[17787,"3d22e18e6966f0b3790845a68e675309f07902ff869758c74353c142464e9441",18.130434782608695],[8455,"97d1a0dec833656f896d675aae9057e1598c0517b2667d7621a5fa78e1aa4bc8",9.917710196779964],[14763,"85d3dc9043996456ef04152dd5a255bb4f0e575959467039cffd97d91c1db183",9.317957166392093],[6171,"eca2844638368229531cc0e6f92369b88db510fe098793d59aa0b9fb6756fdd7",9.917710196779964],[5989,"c56d6ec93ced82a82936de30b9bbcaa492df399aca6fbff8616a17196d5027d9",9.317957166392093],[6968,"649a749210e014c1fa7f1e4a3b71f132a40748d454e457383f8410b226c72bd2",9.317957166392093],[19804,"bb34641f78a6dd3813c2dfd5288faebc3464e3078cb94803283d196d6d705902",9.317957166392093],[11117,"75d3c2cd3f498da5f8f463d65590aa3964cd019505e9aa7dc12ebf8cc68f25b7",9.917710196779964],[7064,"da92b0f770a97e9f931f6147c4645030c9acf03cd2a801e232acbd52d24a91d1",9.917710196779964],[1839,"cef4f982f98db3ea2868de2217edcb7b026fe00db2ec36bcd910d9017db1fef3",9.917710196779964],[16949,"7be1be3ea502e0de0d5636d4c85b7bf7e096e4445cad801c927cafbe11912b53",51.21107266435986],[3396,"706488836fb9402dc4c38ffdddb14d259744a4d78a2532e981fa78eb2fc4b2e9",9.917710196779964],[12892,"8ce8dd653a216fcb73a0c8a36a120422acbb2ff088bf19f9dc4edb1fe2e356ab",9.917710196779964],[2751,"2ce64fd0fdc86d4da3c08f8b3ac13c16ab769617b02b0f19b5b37aa87d7017ee",9.917710196779964],[5477,"954bf398a5838461c412ff75871904098a79f951cda93268f716621ea4455bdc",9.917710196779964],[15669,"67a139d7c9d608774c99b25e61fd37d91f67868fcb55e8faf1659656f47f0870",11.058407079646019],[17423,"c12adfdcdeaaaf9e3689a77f955f5b511382ffc6f76b447a58588bbd315a5649",9.317957166392093],[18837,"003e9643158fa25f7baeb9b9db56fa7367d7dc16342ce923c62adcf6b2197b25",9.647446457990116],[16449,"1b7ca5fecc985a97d06fb3b0abed1483b5d99c6a2ad80c335b4a92a7b9ec3f5e",10.044313146233383],[18203,"852c32ae26be80e11fc602d34c3c1decb0bf917d2c5b2996d92285f3409b1638",29],[6765,"4ea2118399ad994fedabbb966c4e22b45788b7237f57bcb488ea48405f3582d3",10.052724077328646],[5361,"777a66775495d10ffd3735f402e15ede75e2cbdb9fa33bd8404c822c549a13dd",9.317957166392093],[698,"9f914701bd235509e9e31830788b7f40f9e7bd66494caae4dacde7a1224543fb",9.317957166392093],[11828,"4ccbcfb5b02ee8faadc5620a68409908fd82da7a9bc101a2daf426dfb44988b2",9.917710196779964],[9778,"41915a7ec078abf258b5385de43f95611f011003cfb13f98c02f5a72e478d0bf",9.917710196779964],[10855,"ffaa83fbb5e134e702b2c981ea024527a454723013d404be25e55aab958bf6b8",9.917710196779964],[1627,"a8d1fea75cfb2eadea6b03992c3e5e018458c4df133c06e16cec010d958b6cf5",9.917710196779964],[1504,"f187a7cf40b653d697915bec0840eab21c5be5d29d3e5112b6b2efe4f20714f6",24.022222222222222],[12672,"4e54914806da244df660456e1110942580af3550c802ce505dbbe08c7142c7ac",9.917710196779964],[15611,"15d17f32ac5e02a18107ce3853f4656ffdc9b8e69419f2d967b839aff40d3271",9.317957166392093],[5007,"e727aed6cb0b6e96dd19b1215d07669f0b7d7b8693886a3e6d15cd4144ad1fdf",9.917710196779964],[14691,"f8e5890ec78186557eb59274fdef97c96f34437bb5e5d3d756acaf9aaf030985",9.317957166392093],[3690,"7d7f1b3feceecbac37977b172fe6c27123b4e61aa07e8922dc185afeca82a7e7",9.317957166392093],[14826,"fb3aa1c491de6375ca47ec77b33912f05c60732aea1720ca873b3c63b4e45482",9.647446457990116],[10714,"4faf8ba290a73e67891686fb15a45ed4c4f7ecae3ff78ad3aa9957f4cf53edb9",11.036158065599462],[9170,"a098e3b151df2ee655fcc9b22196b0dc58341845d8a0b1011097cfcb467eb5c3",10.052724077328646],[13952,"0e6a388727918b3ee60b0608dde7278c426b09cabdcb38ca0fab3dadefc8e995",9.647446457990116],[16735,"7d33f9e6a016a37affbd885f9834ed6d38a44538b08f4e6c64d7bcdf8904b157",9.317957166392093],[3243,"4ed0cd8406cb3b75abc92c1cd576302ca124a00f27361be4c722b720c4a9b3ea",9.917710196779964],[19643,"918d81099c73041c9a9d7c0a2884b598280ce50af3fe8b8b03c653de0d392808",9.317957166392093],[15605,"bab08c1c6777d050ac3c8738203153a0ad9333c4d5624c5be566c9444d184f71",9.317957166392093],[13193,"e32882366abfd19bdffbbc79f52ea659b86889b5927cc7f8ed56538203adfda6",9.317957166392093],[11387,"562953d9713dfd5feaa5059e1a68feadbc98aa80fe47da3cc74cd02038b96eb5",9.917710196779964],[10711,"b27d503f03639e3a2f4af90cb063032cb898aa3494b28224b2ce044f7a1bf2b9",9.317957166392093],[13060,"67b2a88940edd3224a0ae90b2d0d946034af9a9139d76fb243072c2722853aaa",9.647446457990116],[16423,"bd1cc02ab6a2d80fa21154966bd99590987f3a0a20c8383e7816bb3040c4a65e",9.317957166392093],[3423,"4f23b066397af5de67dd9a1e38fdf9fb559c88f17130bc824516f8c0185781e9",9.317957166392093],[5296,"d9f09f19f183034e8bca7d1906535c83b16e6263de638f4f8e47bc624d0c70dd",9.917710196779964],[17497,"294a56587f95adcded6452a54ec309e3a67422ad06daec3b1bb744590da6a647",9.317957166392093],[1465,"2dc227d98024895d2089e3ede7b84ac662f9d212414e059df22c9487d90864f6",9.647446457990116],[19139,"28d71769781bc20631957c442138510f510fd946d5f6db3097c56a8cd600e21a",9.317957166392093],[7421,"526cc5c03eed31dba7fee693850f575dc3c02983f3a53ba39dae643ebdb342cf",9.917710196779964],[6680,"e8c4f49314907541ffa7e2315eaa06b2b6770e7b72c0105e53801b8c26251ad4",9.917710196779964],[10177,"37dbb7b0675e4aaa182588d8659e1ca21b43b3b472995cb364cb24a8b53730bd",9.917710196779964],[9975,"5f9f636ea276164d91a594b4c863fbc89aff2964fd74e6186e104f91070d79be",9.317957166392093],[11230,"bb5a468829a73d38ef509b86bbaadd9d4d4306ff3877ac5d78af38b9a6f481b6",9.917710196779964],[11563,"6f096c419370116dc2ee4cdf4f1dcaa5e3b7bf02785a1f9cf483ca9b461b27b4",9.917710196779964],[2517,"508f7ad460ad0c0bafa4849791a2bcdfac2b18448736d871c91f646ecf54b1ef",9.917710196779964],[2290,"1b7d266b8ba388d58e8555278ad0e25c7e01cbe677e114b211098ac624260ef1",9.917710196779964],[17849,"6c60d90f4c52034848f9de494ccdcd54eec98d4eb1a8430d9c74868cca0c3c40",9.647446457990116],[2093,"07feb529046401e35299716f380ae4604e3efb07ee1696f9078740cd8b5e48f2",9.917710196779964],[10754,"2e005e1e881cae7fc4edf7d579ff02ccb13fbfb6d1fb3a2b666c45503a80a4b9",9.917710196779964],[14382,"2400f4f5abec562f8168e4d61fe637546b11c54ab9a3b312db5f4cac5881b28b",10.052724077328646],[4047,"1ad041edbaa4035f6d8f44067825572e0e5fc3be73050b7fd09e6e74058c74e5",9.917710196779964],[15353,"1917c7cf8bde8fb07611312b021db3df910378adb9a613480c31370a0dcb5377",9.317957166392093],[19660,"558ed5f72ada65a7907019bf94670b1e8d4e6d22ca7a8d454cabb5e3520cc407",19.427814569536423],[9531,"d779797160a15e452ff89c9db9251e98b5a9b83629f313e6fd360bf3e0397ec1",9.317957166392093],[11139,"cbff27a478768d50d2c0007f01be41a6e05b55aeeebe20186ebe070c9fff06b7",9.917710196779964],[13028,"9a7c059fe44300f0c356bfe8645ef625bf7f7011ac79f65936771f4dcc8b66aa",9.917710196779964],[14731,"ce0572eeb14196a2e446ee00a028d88c03cce94d00f0b6851b6f6c5140204584",25],[11016,"dc0d28dc13b013e8108c0f699a7a51b2ff03f269ecf68093a3fde9ff0324e7b7",10.052724077328646],[10841,"982a0db9af98a8f347d80445dfdead7f487049121ac49c0b200d6bb128f60ab9",9.317957166392093],[5791,"da38cb43fc74f6076e5791774d941603d85b633d3d6fbe287c768f24ee217ada",9.917710196779964],[6001,"93fec21971742698a8c8968822d80e1075ea5bf42506aa5472ae746bdffb0fd9",9.917710196779964],[18370,"7de7286fbaa9bf6a21a916578526342c4597aa4beab48e7503de469f9f134934",9.317957166392093],[9772,"58ec88f42998a2b2d86558b58a2f7273b9cc5ce7a8276783100393152e4ed5bf",9.317957166392093],[6290,"cc75d36b70117fa66d294bc681205cb29d979ac581431bd3713f30b034021ed7",9.917710196779964],[7841,"70e3ea1e9ec29e89d5721eacbfc31931584697eecaad5fa190ee7f90b0008ecc",9.917710196779964],[11683,"c2c82825191ec1185ac958db7f3623ab7b0c77f9e2fce90057d8c5dbec1569b3",9.917710196779964],[7888,"8197d8a1267d4ab90c00d8323707a10dea9597aac494bc4269735a778ecc55cc",9.917710196779964],[7981,"e43ce2a44a4cfe57cfbd7a99759af517ae0bf7f74605a08927ffc5810043a5cb",9.917710196779964],[17239,"db62883761dd6d8560970f9f04ddf32c4a45307b22d95aa7eaea7108c584184d",9.317957166392093],[10495,"2121a2526508f7e35232dcd89e5df1ae29af399afe95f3c2135c83fa993631bb",9.917710196779964],[15649,"281fd9ba79aa7d4fee341ad17f608ecb71b063bd96151aa6322fbb4f45285470",9.647446457990116],[17112,"7f0be11a5ff71dbd76b3a60390573953c2c8c5dffd22e6726db75f50855ec14f",9.317957166392093],[4643,"14ef3100c6be8d8e1d2dba0e324ac8b8f06d5003d0d13e228f033996ace15ae1",9.917710196779964],[1299,"25480d9cae5746e70b8949e1059e0d6ec8468bcddc69b49f63ffc81cfadb61f7",9.917710196779964],[3798,"b16b27263afbb775f6dd344afc5604f0a75cdc04ce41e19644cdae47105ff8e6",9.917710196779964],[18875,"99912d20a0d9e0b78922e7092b85ed56e4d6c7de9f3331ccb1782cb311d33d24",9.317957166392093],[10290,"a64fbf0bcf4a30f24a41eb1d458bbcae22287df1559c8632fc490231d62f72bc",9.317957166392093],[8315,"1c1db462d7fc29700396322446acc5fb15e8597370b0329e0f6c6f8188d73bc9",9.917710196779964],[10932,"0820fa8047462c85c88324245121aec692515af7e54c6c98907d5a34c5e17bb8",9.917710196779964],[15735,"ecc47cdca1db338e4f6361eadf7b8905ce096101bf446778767e490ad208b76e",19.216323131376225],[17725,"961cc75d562bb48390879f2bf6d469a09329435a259977aaeff5b5df6800b942",9.317957166392093],[3194,"c1c01783894e62236972cddd994707300566ec15b35598ddb5221c53fc2315eb",20.848484848484848],[6696,"55781f2515469aec90f8538852cc6afcc9b1689e83e1c4743f595a6ecd8cfbd3",9.497326203208557],[13253,"dd65c5bff09cbf1c0236e0dad61e228ed42ad241e6f3e705073fd3718fef9aa5",9.317957166392093],[17669,"b8d8947b58f8d32704a41269fe5c620857be620b4e151bf5b111901b6071bf43",9.317957166392093],[10958,"f840cff7e2dbd886d616c02c96f2faf97b4d69fc860e77e00df7a40dfcb84bb8",9.917710196779964],[9670,"2c0f2514dfe0b12f3869352d494c2339c015dcc4797e2c7f772afd21d7de93c0",9.917710196779964],[3912,"a76609586e62eaa592011b92fa97082f047b45db83003312ba4c6e449d8047e6",9.917710196779964],[13992,"b65cbaf305e4e693ff4e615b5e444169049f3bb146c20443b7bd3e76c72a2195",9.317957166392093],[17212,"056ffc07bff14ab4cf711289a163ba30cea1e3accd693c5a57088cf42a69974d",10.052724077328646],[8942,"6f0cee8f4d8fea88cd3dbb598329d3e952ce1ab554870d4a5381d0a6b03c2fc5",9.917710196779964],[5217,"9a0c12dc197a41d8dc16a2e6887645afcd00f48e712b329cdd4867600ddbdedd",9.917710196779964],[3303,"e788166e2da9d66f4e39954ae152999875392eca583689d535b6167221355cea",9.917710196779964],[11649,"747c58aeca15570cba7701b68b3d8c7565fd853b81cabea8e3f9817e96d49eb3",9.917710196779964],[6619,"46761d46239ffaa1ff597267351891622d4d2f255003401c23515437361583d4",10.052724077328646],[13167,"63b5bae702bd97d4e2540700c09aad90cf725a157d8393c43413233d0419ada7",9.317957166392093],[6208,"99a23291e8edf2c5e2d01e43239a62d7054b74c88ac90b45cd81a2c41f54b1d7",9.917710196779964],[17850,"be75175eb91fdf55a32da4741155cf8e524c48c15bfee0f1012e043ec18e3840",9.317957166392093],[15368,"01545880cfb4fed70b34fe75d0dd7be2800226650561a8b4dec5f352975efa76",9.317957166392093],[2778,"0b8f1b40cb032e13f4768b8003efccadc2f569059c0868021c92cc498edbeded",9.317957166392093],[3869,"df7ebfb7d2e959c71b4b172d018222d42d68d5d9d4f598a0681ec08a1ebe8ee6",9.917710196779964],[18894,"2723ef45f17b52b0a55af611ab8d667caadaa24abaeb103455d34e13853ea323",9.317957166392093],[19557,"8d6e4f7ebc271751fe51e3140188d007ac6e6b66b4af61c17af2cc78a91d600c",9.317957166392093],[3092,"b6fe7224195eafcf76ae10fa6842bbb113da088eb9127e121b9727fb8f86b1eb",9.917710196779964],[3897,"9b7784e3eb8274c9679d4d1a4db3395dc031c19d143a9c0d499c767d3cc060e6",15.04117108874657],[12337,"40817092505e3e5df608f33ea9b239b5b5ea511ae83721cb204b82bec1f5f4ae",9.917710196779964],[15138,"0701ba8dbfaea542c9272185b71e2db4de517e41f6ae63b1b5ce10e689afe17b",18.09625668449198],[17418,"79833141f0c203eaa93ee1a1c83eede0c1144928dd507a9bb8497fa2ecd06949",9.854867256637169],[4733,"96103d744ea226d23ad483bf5a7caf1a9b567cee18d881e6801da22a1204c8e0",9.317957166392093],[17175,"cf1642ae4ef52dc55a9d46ee4c1618117fc2fe645a8b15470bd0d5c919ee4d4e",9.647446457990116],[16029,"3ecba42504e771f36f77bb8bc3f8824409ae53a20b2f218601d9a1e0fe39ea67",9.317957166392093],[8003,"0b5563ae6fcfc0ca5c7a6f1c669090ef8201b2b7fcd134429bee82f897e482cb",9.997888067581837],[1149,"7414d78951ef7cf0157364a268b23c77a4eaf4e7775f4d0c6beb11c66b1251f8",9.917710196779964],[2528,"10f076e8b165cd14d0cf62b0c546caa60092a9b68cc5963e2e4a25d3fef19fef",9.917710196779964],[13539,"44d1d78f65100cc5f213a82dd1e6ed861b358a430826c0067d1ffb63bdecf29e",9.317957166392093],[10962,"4d8503843e3cc07bebcd98d283ea07267b89c8b0344fdc740d7024ee76d841b8",9.917710196779964],[8792,"8c7b36fe959a04556e02eb7a6b2ad9d674d6ca5d0f9cd6fd71e65810982e19c6",9.317957166392093],[4843,"29c007ceecce75a3cedeeb8a5edf9d2e38f3bd21a4bfb52a8c70d44c4a842be0",9.917710196779964],[11795,"e8be077bda7ac13530713dfbd556eb658995bc969cb5c285f174d2332c62c0b2",9.317957166392093],[4760,"a2be87dc58f7b5bfde572037a2873c12e0ec9acbf0688db70c803863980e91e0",9.917710196779964],[17138,"decf4514d202b819a29bd69685e0c6c99498ed30b381b10bc2fc19cd9802564f",9.317957166392093],[15806,"a391ed9f1f9c3310c76da50eca7fc0d93c05af74c70144f41ff550eeb759416d",9.317957166392093],[9640,"241b8ac1be26b760434cd5d6230cbd65e91f7ab820163396023f358a92f8c4c0",9.619607843137254],[6648,"36783e99caaa3683f29dcd053b9aa175d6c90080d357f1a78748a803e58556d4",9.917710196779964],[13446,"dd7f530f4eac52bcbdc2a390afd4f60022d179edfc2ccb6b5bff3afef7e918a1",9.317957166392093],[9634,"e97455a95e9fd268fe210965f0fc520288096c8cab7e6d5c1c76301233a0d4c0",9.917710196779964],[12683,"b989774fcbb13df4a555753ecd1f7921997a25b84140cd6a0c1ae5157c26acac",9.917710196779964],[13792,"57ff536b65a17b5abcd2b2967402c690a43f7d19b8fee193c885dada070c8899",9.317957166392093],[6822,"3ab3d0aa76a9a9bad6e6bee7fbd6870987b97541d3f52d74625f6ee6780520d3",9.917710196779964],[1128,"9f45929f078bdb4e6d59501ad9fe6a6db31b3006e4626bf2f51eb34116bd6af8",9.917710196779964],[12953,"cd0fface488ae13e51095346eeec9629283ba52d5ed0cac338ca6bce8a86e5aa",9.917710196779964],[3312,"ae84785075e42b2c1a1c054ff6515a21d219dd32b04bae1a05631411e0544aea",9.317957166392093],[13075,"e634278cb0854140d2a300dab6249fb1b483b15d1af66d5b21a702c6e56a16aa",9.317957166392093],[17809,"ed83d9f712eac397ff5cea8452c51b4dabe95938d4772dee201b073fc49d0f41",9.317957166392093],[4845,"e17582d858461da95258df95836465213efacdb9083d5eb671e9aaaceab829e0",9.917710196779964],[2539,"9f05f0cea5d65ced8654fa2253fabf444ae0c979d124d001bc4d1bd7acde94ef",9.917710196779964],[7247,"33aea470182d0d1349c4cb8f6163830be70a167e84a18f24bf41f12d94b664d0",9.647446457990116],[3618,"5705f08fc7aefc0b30a0fc1d6081ded8bef4d9e3082a1dcad2bffc49fc611ee8",9.317957166392093],[17665,"8f46fd98445c6d8bd32f1db6f1c5ab51f377b99c05769b29750dc851dc8ad843",9.317957166392093],[1918,"7fcebb42b4164698e427fb40005735b81ea73acf9cf2df846dfaf428d24e91f3",9.917710196779964],[7257,"d5accd936aa7e6503d174f5edab4a8a9c653b7d304d0aacb9658958e6b4451d0",9.917710196779964],[2919,"e76afd12fa3b14cde3eb04fc44dfea2af55bb007b20380073ff142a301e3edec",9.917710196779964],[700,"959cd9d9d99d5476025e5d0f2836808fa3c8f01898cd0f0deaa8ce6f56ff3ffb",27.11946902654867],[19712,"ac47c907f5f6455a447c80027fadb216fd0dd3c9963c649d6a5f36bdb61f4b06",10.012158054711247],[16750,"d3207fe69bde35d1a4e34ae6533b81abaaa6603a3290897afbb462ad54e67b57",9.375],[8222,"23000accfb0aa8651e186ecbf6251b28aa8215eca6e916916075be419ce3c9c9",9.917710196779964],[2717,"f2f0df3535a440c72cad626ff506725f6d59f619ccba14c6f978d1b058f954ee",9.917710196779964],[12898,"08b7d211f3aa600335fa113c57cceddaadbde8f77e1da6266c72315848e44fab",9.917710196779964],[17678,"bd8c4d2392ef8736abd38f0fde6129bbeb66823379c61b6a90a46dc3f9589b43",9.317957166392093],[2914,"8150c08044183ddc32dcdbb0b3020d284b634a5df4a809f0647875f4e180fbec",10.032489508596182],[16328,"abb5a34963db4e1bbcbe0a637ab8ae05ef6409acadff7866a1b4d048770d6a60",9.317957166392093],[16419,"9f1a02fbf32a369b93bd08a579e5b313a78cc8033ceaf5e3bb0b58455e2fb35e",9.317957166392093],[18721,"53cd58136cc86f48ea0273459134a4b65952bbcc97de46d759e938180bedab29",9.317957166392093],[16921,"d14beb97fc91c35b168a5c0c9371a4f7b835c3caaf3566b0d758c3488c9fba53",10.052724077328646],[8129,"c47b9d8d5b4dc5d6b6788c17205c9f83faad5af2e98d82a13137e489d5638eca",9.917710196779964],[5765,"1ec5da85df874c8e072256108765a91219df191a04ba15ccecb2656e18f3aeda",9.917710196779964],[15097,"04d9f47dd46cb306fcbaa74e31a2ab52815f2ff7caeb2294f978a1a365bda87c",23.027027027027028],[14516,"2fddaf22a6a653d97f808701057e0a8d3aa61419146c2b65571d4690d17ed188",15.026455026455027],[11031,"7049f58ef6e3cdc23063b1002bdb66d7ea81aaa766919569702eb44d5070d5b7",9.917710196779964],[1207,"c34dbe30f13ff8072346c186aae8d7b6133c6a502732c62ac4b8537f351af8f7",9.917710196779964],[3975,"cc77dea7d502130bf5217ace8fbc43386f9610ec9b283614bd2df4fb7688e6e5",9.917710196779964],[14950,"fe75a395a5c5685d8e2e0db6c18993ac5b262c9e4bb345b5f309bee86117c07f",9.317957166392093],[6837,"a744c49fef4fbf22e60e0cd61dca720bc4bb61749a6f60c00e681924bfbb04d3",9.917710196779964],[18099,"98ec3280c13963a824db8d99d970da0d38d8f9be172d808a447493082e98fe3a",9.317957166392093],[14992,"f1598cacd44ffc970eed133714329ef4ad98c2764c15ec45ce3de286d9f2ab7e",9.317957166392093],[2000,"7fcfa4d9e2c1f6b149535da76e36d69f0f7d119adbe61b90252e0d54f15b06f3",9.917710196779964],[11115,"775a6023115723226a114ddb3318552c5c6606e6e8d9d210d71b445b5c5129b7",9.917710196779964],[9321,"9776758dd166662420e7bd256fc98ab48e9b3d5cbe0069698c5f8ce675f7c0c2",9.917710196779964],[7147,"cb065c97350e01cdf83c334399f88f959cae4c9b18b3896a24f07057fdda08d1",10.052724077328646],[8169,"f816f83205a5515b231e931d8af281b92362d5fb7a61ddf577452635175a2dca",9.917710196779964],[11354,"d75f69fcd478ae75df1da6fe3d1f6f2542880d4990c25894dc3e8f4066fba2b5",9.917710196779964],[6515,"c1b618feeb265c87231b056296297befb85adc74e5938867a65db062d1354fd5",9.917710196779964],[5484,"a70f819b4ea530cb9bb95044ef0ec9a3d404dbdfb098a9aff095bd0309694edc",9.917710196779964],[15981,"97649f8a0ac03c02078bac1a9427a6261cdce254a639da438f012c4c2e3cf268",49.146268656716416],[2942,"fa8649ad2397750562b3cbf79370c9105b2f038fc34fe24544537acbecebb9ec",36.056752496058856],[15162,"e6bf7c46734196b55c87ecfad5a9d6769510282ab09bf88ec2c2963df8423a7b",9.317957166392093],[9281,"af3fb4a71a16332fd3bb8fb3e7517871e455eb27df4679228e8523c530a5efc2",9.917710196779964],[6881,"e09954f3eb3463e0509b7f7f9b78750220a993b29aec0065c8b41992bd35b9d2",19.066666666666666],[19023,"c36d6baeb0a707f12e3aa6a1b2e759c883775d2f1ffdae445454931a06d3ca1f",9.317957166392093],[2349,"6a5a3cf215ec610201c800bdd56cd631a4167d7a95024bdb10ec5a86b49ebff0",9.917710196779964],[11566,"f9052266f6d29bdd5959c801e4a0cc6ea05c254a85708adce55173b40bb624b4",9.917710196779964],[10089,"0ea5c457d6cdb8e6b39addbc785f08a76e95daeeaf023fb48291bbb04fcac7bd",9.917710196779964],[3567,"d4ff0ba11e801f9e81928d12a9397e4e0e6f52b98c8b680c4ffaa6b661ae7ce8",10.052724077328646],[10028,"c53b0525b69b15da6f5a810bc5844d2fe4830f6b30793ed5f1f2d638175724be",9.317957166392093],[19509,"a028e4d4b32c818e0a7f490357bd4beb00ed76563b3010a12f6ce3273fd3010e",9.317957166392093],[183,"2347736123f57f75354ea7cd42b7990988b655411224d4cefbb19211733dcafe",9.917710196779964],[15580,"f56e66609aac47efd688123f202ea606fc4cd8ddf85618ac322c8bf7b0e3e271",9.317957166392093],[12825,"366865e05856f29087b286136a712cae21016ec5b4da7cb4f711dc59893ecdab",9.917710196779964],[8072,"cffefaa6f02056d466ab3904cedb24fb87947eb1c122514af44864c233c5f2ca",9.317957166392093],[10451,"3066f5bb92af4162d3a4a6377b8f7a7024962a222a4f889ed4f11770c6286abb",9.317957166392093],[9420,"c7aac577f20f9e653c157872efe6319c2bdad29a6457c44c0aadb7681bfb2ec2",9.917710196779964],[11740,"9ae9188bce993503d184467b0d19f013ff708ea70e40c0b6e17c35cd6fb110b3",9.917710196779964],[16177,"ebb61373a1209773b2bbb439afc3e690571c535bcba9e7640109efef13486c64",9.776021080368906],[15638,"07aa17dd7ba6f0e4a6ddb2e1d90ee305b8a817ff98ee9f3b060a408866368e70",9.317957166392093],[354,"596c4405802b0b4ab24cd1bbfad59dc0209df56217a5d9782c3ec129efceb5fd",9.317957166392093],[15592,"0ea7eccd92567061bd69fd04199716e8876957e5bcd1fa0cbc76155cfb138071",9.317957166392093],[15879,"9066bd80f6e05ae6a6c2cdfbeef59b37e73e675c9d2698c82c233e31ff89636b",9.317957166392093],[17757,"491d5b8ca1f477649da94bd6fb19898aab0dbe17e706dbaabbcf982775c01942",9.317957166392093],[9603,"a3f377c75932bc3986a5cdc3ef739c3ff2f0f0a2068e2da0ca8c9182609c04c1",9.917710196779964],[10149,"db47197bcdb41456d5ad19af7226f2886f3fdeb9e21399f605e11a6458af63bd",9.917710196779964],[11081,"053115669317038258f55997c36d13794642a0da39b7575a538171867a0465b7",9.917710196779964],[16337,"f6c9f53b797dc0430bb2a7cdfa0fef035a75b8466ab04b015a1f69df619b5860",9.317957166392093],[6241,"c44156c17d2a76410c383ecaba215bcef804e9f6494cf620801bb6ecda487ad7",9.917710196779964],[4418,"bf73ede06d681aa3ab814f1ad6c867dfba486244aefe7162e7ba6f6f64cbf6e2",9.917710196779964],[8451,"ff75a82b6afbd17a4e54f3f51851bf7f5f1b1723b906c791cb51b87090aa50c8",10.052724077328646],[3826,"edc53036bd4ae46fefa40a6d4ae7d8ba0fe6c612e4211fa8ccb9affeca02d9e6",9.917710196779964],[5550,"b9a9ef2849973025208f6004438a9794824c6b5659ae13da01834b98eb9ff3db",9.317957166392093],[8985,"cb73c369723e418dbb9bde9e9505493cd6bc1b6036a8ad46dd2a5e9752fde2c4",25.829596412556054],[5904,"694947b4420082e4f7accf0eedd2326bc5c4311ec24bb3fc42ddf34c222fabd9",9.917710196779964],[34,"794f976a49c81e1101000b29f74733558014b974ba4ee82b41fa9d6456fdcfff",9.917710196779964],[5687,"f4d42a2b9ab63f056b33a2a65e6e673bed00a6dcad7490a697987a145a9e1edb",9.917710196779964],[5268,"921d1c80e3c8cadccd3368cc0d96f189238c68294b4ad01a8fa678c9395394dd",9.917710196779964],[11365,"3c5eaed98ca7950bc2f7fd4a8524370235bdb8b9d5dfc333b8b1956f0f339ab5",9.917710196779964],[4314,"1b5f1d657f925a46f7eb7d0a927afa5190527fb60d65f7d300032b233517aae3",9.317957166392093],[10063,"704278f936097ceab5b8f75bf52813f2732fea6f525411904b5e231a7429f9bd",9.917710196779964],[16292,"2368c48fdfe03db46a80a0e6f0eba2d8f6ea7b6fc3a77d0b25bf68730ae35861",9.317957166392093],[1495,"6af1182259f4dc51dcffbd3b85c5349f60a91b3888c19728c957840f5d0f29f6",9.917710196779964],[6860,"062e4ce0daabcefb2151b1ac98045352b9a3e2d8e8b5d2a0cec7a1177489e5d2",9.917710196779964],[14311,"7dd7fcb52c3ae35595e4279b7dfda8d9536b9a388eb9f5c4b42992385d4a5f8d",9.317957166392093],[18501,"6b51f0e7ff36ec5dd7f5e2977cf17d21ca4db898c354056a45e5844dfed46631",9.317957166392093],[11372,"2f638e38643464509d3c11e68686142cd1ac297f606fa9b1a75d539d8e8490b5",9.917710196779964],[234,"3209ccc3bf73440518136e17508d6012efb10e1ea5864de88e3f492e47916cfe",9.917710196779964],[4682,"c7d024eb0a294288fa26e5b83e4c7320b248aa1b6ad2e7b00d9ef6b77a9e1ae1",9.917710196779964],[19340,"6655676bbfd882f4bfe36e7b5a0588906c0ca925b971da5dea4e4f51f553cb13",9.317957166392093],[8897,"9bfb3ccc88f63b5a6abcd84dceb9bf702eda0e6bb957b496a9812d2378c475c5",9.917710196779964],[13488,"900668bd85d658355d0d004f4773f1ca2a84cfc548dedbbe207e0d81c4e21ea0",9.317957166392093],[11010,"9836a496cd23b8bf7c4919be81c89c22502ed67a596ccd8102fa91326027eeb7",9.917710196779964],[7791,"461f2137a8d928e3d2b50db110ed7c908f7989a3bb299cd15b66acaf3047e2cc",9.917710196779964],[2060,"fc596051a65137b5e78c612c60334b16726dbcb33f255cc52e14830e3c7580f2",10],[19161,"3361a5b65626314840662a0fa124c135976c587aaf79cbcf6cac0f71a039171a",15.964365256124722],[3218,"a498bd1e2a5b9d3bba850d689e40a334c29ea705a8332b6d8223315f8941f1ea",9.917710196779964],[3264,"adb3f69057c24a57aad2e174cfc634b6ab8ad0f40be8c3ff1e500ded9a4998ea",9.917710196779964],[4505,"650970d5ff39bcc46b4479ccbf865d2eed672b7740f9c4aa5534428bce9051e2",9.317957166392093],[11781,"d6c3fa1ec564b4cb0dff1469fa788606151843b2168e3004b518b934ee92d5b2",9.917710196779964],[18850,"d47af70ccbfea29f493e7b7f0e280c0d3351215add9546330478728986d50c25",10.052724077328646],[8667,"523aff83d8c03428e7aeca274199f89c394d0da3f58dce609c344d327f94ddc6",9.917710196779964],[18730,"646ba27cfe17049c2c2084e5ac94c2fac7d1243743067dd748463d8ed5d45b29",30.331550802139038],[1784,"8e565da3134c6a169ca91f90c6b2097a85845ca5f9001db82a4a2c4b3c7256f4",9.917710196779964],[4205,"140b1db719b88cbd1cd2afb124c60f2c8e1f99169c7daf1ad39a1304e6fe61e4",9.917710196779964],[12282,"d4a57e2f062c541fb87da291d1fcf8971b29a8eca6bdafe58e8b0a69c1bc65af",9.917710196779964],[15755,"e206a4f391f0d0800aad66514dc57599df8b1fe2559ebe3f9f714282f5cb446e",33.23625557206538],[3692,"a8e72d087d084dbc7897e23a81606538f29923944d2aa96cf761693a88f3a2e7",9.917710196779964],[13318,"b4a233138ffecc0a76581bfc1a644990d68b17f8146165bee0e8c7eed34647a4",9.317957166392093],[15832,"9511ce1a22154b3c7645a58797968be931db0ef40aaa16196828f03adf7cb36c",9.317957166392093],[7781,"351a3d16e945fc514c21f0b70931b74b0d67789cbf80ba8f064d1cc21a02f1cc",9.917710196779964],[17970,"f2d2bcecb25cb7e51b5c5f64eebc397379ae5b5aeb42ed61c793f48df12abd3d",9.317957166392093],[3473,"457220ac619d6da84b8b2a8f3dcbcffd4d13d639609d8a0b2d6f75c3cffb34e9",9.917710196779964],[71,"daa48a2e7a61bf8f43f3a4d4126af57cefaa1a3aed5fbaf12378fe2dbdc988ff",9.917710196779964],[1075,"6bc079966d7d7242883a6293a8d8db244d02f024d61204ee546576af87d5c0f8",9.917710196779964],[9729,"68069de4a66cff2bef5cb19ec97f4a3adacd6beb8911e78f4cd1501b46be1cc0",9.917710196779964],[9243,"297ba5e20a66e8e9bbc601a84c735b855fe54be2c69ca3d7d3d5f5865a3829c3",9.917710196779964],[11491,"0af8f436037845091f97e484df97afac4cc66fadf3af33de3e83d629b87a92b4",9.317957166392093],[15948,"69ef672c18d694522a6e78b25f01e78a18052189aaf234c1c290fa3b3d1afa69",9.317957166392093],[11956,"a392aae49b7342681fe257feb68bf066ffb20822080b634937cd977e90e6a0b1",9.917710196779964],[17165,"7171a7fc2d8e37a3876eeb26cf774a0084bc1a25eef49d2d9834aa889d719a4e",9.317957166392093],[2415,"59ba04d6b027427c34f18e1fba169bea3fee63e1ff6451de39bfa40e85825ef0",9.917710196779964],[12794,"91335b74062fc002ceb6fa8bde34639a5eb1acac3deffc6a82cda98e1844f5ab",9.917710196779964],[17883,"0c839d3a402575bc24f05357ca7d6dddc12d6fd7bb68ae81d2bf492fa163983f",9.317957166392093],[9456,"3d3e4eaba2018c0ecbbf3c90a931c7befa5cbe281faab05835a383c95265fdc1",9.917710196779964],[18105,"e7886a1f85b56c569859e23310e9a7f73e00d8eaf262f4ae7687349740ceca3a",9.317957166392093],[18319,"23c2bcf0937fadaee6478401e6bde9255cfbaff0f4405a440ce72924069c7f35",9.647446457990116],[9780,"d2974ed5b66b26b1cfcc8543afbcb72feb1359071a03aa831f57c60b8ebfcebf",9.917710196779964],[12537,"770d728eef92263ffa8ff6cba3122f6ce65f5c986273401b1247619b17f8afad",9.917710196779964],[6271,"ee477d5a9b2758bb60e001c87bd823a1c72ddbf78ffeddde50a50309c7e045d7",9.917710196779964],[4877,"4b3a0402403be5bbfdf1ec22e1e816cd736d2ad3f2f59c64ac9f5dc3e121ffdf",9.317957166392093],[18043,"936a759c745fc1db571d719bf4438ffbf7c3414eba5c15edf95bf8066f36693c",9.317957166392093],[13710,"c8269416455c9d831001d7c0fa569b3aa6b3ec00eb5818e3da1427e4433b2a9b",9.317957166392093],[19814,"ef143b025a71d1379941aaee3092ec1c4b8001dd3f32a373adcc46c2dc102e02",10.052724077328646],[10544,"55a7705c89fb86ce489358ffbfe6ccf5e2fb36e0eb447e10c6e5048e1ed7f1ba",9.917710196779964],[9441,"f3b1e2d9cba142a841953e0be83b2832862d37eb8f24e2262e399146469e13c2",9.317957166392093],[14871,"1c6d75ec31614f2d6b39cbc23c10b07c459f6c0249cd2235d4631d3fa9565f81",9.317957166392093],[8179,"b1cab6c6697467061e7d9ee66047dc700e3e7cacdc481a7ec1f448a7aca31cca",9.917710196779964],[10941,"7715500ef6440abd88c7801e25852ef154be8c88c238ff050a842cec06fd70b8",9.917710196779964],[1645,"6db239dbe0b0b7c28ca0738ecacf3833d0bae78cb6d8ec152096392cfad450f5",9.317957166392093],[4490,"3789b484c6694a8a5244b94b06c5f8036b31f140b69995cc44997fc437cd7be2",9.917710196779964],[17526,"1e987a390c43b7dfef931646838cdfac8059b0b2f72e114c8c676ce243a1f946",9.317957166392093],[3555,"83fded0f3fb9c7d1640f7f9e6963debb47259b9d5a057e716e2df16add158ee8",9.917710196779964],[9373,"ae3df703baf3690a24e7942df1ca18af84ebf0a3dbfae88a7075eccb953066c2",9.917710196779964],[7473,"8f352b4add59875fc0e951e6c8efa2558cc466559b3d8b689c6838e38bf0e0ce",9.917710196779964],[12634,"2e2039c0905855a1bea44ed8cba8f0749c1c036297337b8c3ed4fef21c830bad",9.917710196779964],[5924,"e2dc7c9e8b773db1679a3eadaf6704a7481521098ff7c14907bed38d570688d9",9.917710196779964],[1278,"0e63d78e26e08c3005187d123872b3c1dde683910d13e488844b9c89b15d84f7",9.917710196779964],[19844,"af08d0f3fdc497c3342d27d4e8c3092a928c99f7d83898de5f69a16e2217f800",9.317957166392093],[17502,"4356fdac4cd1d5ec4c6a4095187879ef7fd268001bfa7208d7f36b966cae8247",9.317957166392093],[12453,"a26c16382dbb27d83647bff00f4ed0583f1050827cadc9c5392ee0fcad2942ae",9.917710196779964],[11549,"b9c4f4827fce8fe7d4e7a5b58283e0f8cb5c1ebb520e5aa1125f75f634b53fb4",9.917710196779964],[11585,"a0d968ac625d949994fa020a2c604dae3619e6fd3294a86021fb593bb568f9b3",9.317957166392093],[15388,"ef450ebc3b1b04415a7caed65873cef46273035659c3bc1591996bbf5f9b7976",16.07335760473836],[18299,"89b6c2de79e8fd5f924b96d0a439db2850e4b98013cb7c679d51eb3229f4d435",9.647446457990116],[8093,"08c3404e3a21ff658e5b6c7906d7c4a534ecde5fcd363b6eee8f420e1f7fd1ca",9.917710196779964],[4453,"2c6a9754751299bf52331b7c87d65fe436c1c6297ac74a845fae258f576bb7e2",9.917710196779964],[15622,"9cb51401e787a10fd0034be5c4ed56ada6df1448fe8d1507924d52c2abe7ea70",9.317957166392093],[14279,"e9c2db437527f01331d419467976fbc17d84b65695aa302e74f2b68f3de53d8e",10.034207525655644],[10314,"3ac7c824c3983535da48e9931ed6c65b88985ca83bb00196eff0025e392441bc",9.317957166392093],[14889,"6bb7ab3d13b41bc72b985b00c6304c82ce91b1810f888908d832722021280481",9.647446457990116],[10448,"7162c360be482491d8815ae6fa8299024dc8f57c6007e1718ae8ef1d0e576fbb",9.917710196779964],[7811,"804e21b303c9465f712b60a9134271a8bbc12e7b6de4057cfd17cd60bfb2b0cc",37.1689497716895],[935,"8bb1b41e34fed79ff477e210102f080534b9fb287b997b6a923503e223f398f9",9.917710196779964],[9229,"a416de2055e0112325d6360eaea72a4aca0aedf31c16e6fea6e9f7f8fa9043c3",9.917710196779964],[19368,"97de8d92d9df83b85fbcb4dc7c7724d8e2b1ff45fb1a67e51f317e96bcc02613",9.317957166392093],[6292,"b85620bd7f24ebcda371fda4810928d198dc460f0d650015b864d268fa1e1ad7",9.917710196779964],[18921,"624edb0558c0c4d9c80acdcc8522b0471fdd0ac03141a2b16963cc8e5722c222",9.317957166392093],[14228,"d1f6c95b8dbc274329e43ddfcb396e6444bfab3734ad4bef4e318e64aff07b8f",9.317957166392093],[12143,"07ed72dad76064f96d54c6ef12a03c9e3a7273c8ed3ad144d6667e6a0f0264b0",9.317957166392093],[1348,"0286680e27ad0a475104f8e635892243ef71d960a8ee4414ebc921848cfc14f7",9.917710196779964],[6505,"f9ed96e2b761c6f5cda83464cf5774364a4868eeaef771d91e0732e8218a68d5",9.317957166392093],[5307,"31da581b1aa765433b86b365e9c846c527225fff318bff3f4bd7d7657daf57dd",9.917710196779964],[10633,"8e0ba33b58ed699584117967b935ae4517d36d7de126edd971d27cacb70d7dba",9.317957166392093],[15902,"a69f4e65e4387292fe8d76f3502dde11dac4f32f5e99abbb08f982400cf4f96a",25],[19704,"9506e5efb0a39900226f415aeaaff00044c9bf0525dc4829de6e68b261ecab06",25],[14492,"31961f2b9c780717d2f4bde9ff7a78d2fd4a4766e11b49c4b0b6d4126eec6989",9.647446457990116],[6252,"7836c9dc02b985a4eae5216b02f882143a7bb4c8c52441e54a69e62e222964d7",9.317957166392093],[13057,"cc29d2ac9c94ea3b06e99b7b77defd617324d09f43680c3e64442aa8432e3daa",9.917710196779964],[19029,"9fe558984c233d4338cb63c9d737a64377a3d6301b21ccf9b9c9f9f238a9a81f",9.317957166392093],[12444,"488f801d6516b00836510c4807f95550e9d397799bf0d26ac995430e1b9d4eae",9.917710196779964],[4784,"513087e3f1a5a5a1287f62a9bfde1685da246cc7e11f1c983d8fbf59d73281e0",9.917710196779964],[7599,"0a8380b1263048726db152ccf095f387dcd99b9fdf0c01ee86d329c0ef7e2fce",9.917710196779964],[11582,"18ba158731d4512a0d6b6eed4305c9aeaeda9d3643bdeab16e9cbe6b8f26ffb3",9.317957166392093],[13243,"1583b181689ff6a092dd42afba63aecb10b33cb6b1c9e8ada8cf49b9034503a6",9.317957166392093],[18291,"e8196e20bfcc70dbe792bdb9d5d3400d628cce049e8771c867092f93605efd35",9.317957166392093],[1144,"14e488de65c0930f2bdd2b01fe82c0be47f35947bad544e2073dc14fc9c656f8",9.917710196779964],[14706,"50ce87fbe2e8dcffbe7cea297b924dbc709cc9fc23451e907f8a6df9e901c884",10],[10145,"902664b4d6db5acfdd0d58ac5bf71ab2eafbd3c53ac9b084f1187df95dcb69bd",9.917710196779964],[12788,"d75d3c9037bd9633f5a27be92ad9fc51b44696b42aa4e12c7057821f8856f9ab",9.917710196779964],[16657,"1a8af56c405c7e0cb5cc12f8b72646048c70cc61a554d89d2fcf7c637bef8b59",9.317957166392093],[13381,"1d9612ba66bda3dc59fafed63bb3988197a51591609a4ee02c3ccbfd0d31c1a2",9.317957166392093],[879,"98cc554c47963f7f1d58ef1ca193fd872afcf2cd335e4bd5f7b7079569310afa",9.917710196779964],[10112,"4f0b7062fad7af551b689f732bd06942338d788f1b82dfa2dcc3eac50a519fbd",9.317957166392093],[2289,"7bf0576dc17c9263c605439e826009d362e0f8f61419e44de61bf00e38490ef1",9.917710196779964],[18436,"cb4380d432a234e8214f60ce91f3a4abf53157e631e04d1b61ca2850f027e932",9.317957166392093],[9028,"50551afd57ef098f77d66b2fa0fe2320a9e9a15b51d9e65620c0e78c0b099dc4",9.917710196779964],[12696,"b218f6b9e5bdfbc241367a23c5cba2eb8eed6c1c563c76fc5dc1e58689089bac",9.917710196779964],[7294,"3ac19595a7b84b54da908f37bae8658c03c0bacbe642613b7febaaadcad01bd0",9.317957166392093],[6115,"4f2ea03fd9cbe46593f305a01fceffc64ba4cbde6006db1c3faef92af6b253d8",9.317957166392093],[18215,"6ff82200d7c5135536f3cd376c1953900f113edd3fd9d45a6a94022d643fba37",38.08577878103837],[18061,"536cc2b1747b243f26d218619b2f3fa062d3246588110f4981f3c82dbc8cf63b",9.317957166392093],[17431,"380e708fb141ab29c2d1406486eaa67b5b37ad8bd66b24a646415a4e89771c49",9.317957166392093],[9996,"462fa490d6c55a7ee64145072314d110a9e1f99c5ba5c9814b98e3f13d465cbe",9.917710196779964],[11998,"91bbdac25b4a6033dcd843dabb7aca66167f1f620ec8e2c626a44ae7abbb57b1",9.917710196779964],[19353,"416ba2b4a961829f2fac92eb21384826141c4696820a8519dee1e431f60e8913",17.027642276422764],[7074,"8621d49d8be2c1ee5212a8bf9df20ef9a7f091b8296fbb47229bb9fff3e47ed1",9.917710196779964],[2373,"ebe6b71322366133f7b2fe7c7387b1fd7b3dbc935fe3a4ec5d60b1d4f8ada0f0",9.917710196779964],[15537,"f8ea6dbcd78051a625f814adc3490b6b7d9f120d0928596ed04c564ca9b13973",28],[2016,"ddd5b31e7c690cf340d592586c43125a84c40c08e5f5c61cddd20e015f64e7f2",9.317957166392093],[18458,"16699c82430adb4067e5da26b4a6461cce92b10b2f0031b2c018c64804556d32",9.317957166392093],[4876,"d155da6b43f2f39907993ea10f825b9ea9854182a3557d3cf38f595a2fd8ffdf",9.917710196779964],[3235,"5f1b7b5ca1fa0015545a4898829edaf9c93cb4fdcdbc0bca044555c9efefc5ea",9.917710196779964],[243,"f9389fd17dd818f1ab3f71b791a3494d786a1f4e78007c39bf2492ed092359fe",9.317957166392093],[6708,"5e2928084e0992ae7ec3976d46c023e59025b301e3866ca77a5c8fe9c4afe5d3",9.917710196779964],[8757,"5da33cdc957b50904524ae7dd4350f11b26fb5f8a43006604657846ec66f4cc6",9.917710196779964],[18624,"8e0915bfd1a98f7f0702e11d0b9ebab8aa102a873c0a649622a771cdcb71102e",9.317957166392093],[2608,"24dc3c8175c6e9d6ebe409c8d88fbe3febac9e487ed49d7c9060b916dcf21aef",9.917710196779964],[8874,"e2b8e0c406c1f06b920e8007922b86bb0cc7a92fabc6aabaf0815446915b99c5",9.917710196779964],[12079,"d891ad0c3fe6161b4734afd3e76d418e5d267dce15ec99aff4f29b12a0c3d3b0",9.917710196779964],[592,"f1b9b69f9b1c377edd7b7a3c0df8571d7ce1f7fd8bd894ae156b389bdfe4f5fb",9.917710196779964],[3838,"e0b0b8f3f22ce4c23579622de3886b30b4b117773d897e2838c461c8cc4acce6",9.917710196779964],[17,"5901d830d0cbcf993532936072ef2d1c4f39dfccb11b9f2ef97595d13c96ebff",9.917710196779964],[2293,"976ece1ae6bfefe43e550adbe199310ca359d9f2790687f108646f8a336c0bf1",9.917710196779964],[18032,"90ef2ebcd7cbc8589f2dd3575e1fe508192abb561ffe4c64eff14acc34dab63c",9.317957166392093],[16563,"5e808a914ba050165ef8344e18fa9dbeb37cf12752a8c2747ce792e718c7d15b",9.317957166392093],[14445,"237466862c35149a214e5753db7d1125af511b6d6584681b4d5b14bce0ae568a",9.317957166392093],[1435,"15ad44c53895279c02471dc74f012c444186523b6d03156c7c6df6be62019af6",9.917710196779964],[11058,"41b775aa800cbf41798a4207b408846ee8394fa9548de2e3d0215e30d5139cb7",9.917710196779964],[2772,"baf2d7e46e8a2e35e48e31631d899a92a20f256bdacb5f26079ce968983bf7ed",9.317957166392093],[1039,"c073a73a3a5f52ae4c6512915cb442693ef634a7caa465b51325f9841cfe09f9",9.317957166392093],[11089,"90f44239885d6de494e60e93896fb7be751a468b75ba28db60aa8c3faeab50b7",9.917710196779964],[1417,"dca649fff50b635093562a776bafa9e1ac2755ef813a93342087718b2a8ab8f6",9.917710196779964],[5944,"25250e6f4d03a7862716b7f971cf8e0d9f388d0b3121958b43fd536ac4706dd9",9.917710196779964],[261,"8275346708700560bc1e768cefd089e7a46398b5b1a89424204923380eb932fe",9.317957166392093],[8472,"df1d3a5b2f041038c9ebf5994fef49a340f74bf18bd6ba511227b575634531c8",9.917710196779964],[19310,"a3a0fdb0247c764c9c12384dccceed065399c466547bae80725fffdceabf9b14",9.317957166392093],[5043,"7c437a527dfbca6e0ffd71ee90c491888c158627322c33c8683b010aa1eceede",9.317957166392093],[11037,"7c86e534d418af8c7098f1f658e249a688606e8672a6ad5d8226c7102c00d0b7",9.917710196779964],[17584,"94bb635993e88dbf09bda52aaf805675c96a5ee127223af6d081034257589d45",9.317957166392093],[19015,"67abaff72fdb665be5e0a79a6023d51d9e9d6b5fd7aaec744ad5f9454a65f51f",9.317957166392093],[3259,"4b4631d3d0f32f3fab0a1a22dc018db45c02340a868bac8d9c0d2534a2089fea",9.917710196779964],[5093,"0e84ca56ce29f5482e644db942a6e09e58490bae9006158159d726a56be99ede",10.052724077328646],[678,"db813703767db0cbccbe36e86842778b10dfa40aec436af253c27283e1c163fb",9.317957166392093],[14974,"9fc25ac7807243dce64cc56f8b2c8bddc4d31ada69b57b3604bc3bc442091b7f",9.493150684931507],[846,"f6199d77dd7107edb429bd013c128eda0fdc30a6f61ab97266a3df82d45a3ffa",9.317957166392093],[16658,"f6572c4e5408f8bd6091928d412da2c4e0e64b8886a1ff6a812c9e81ff968959",9.317957166392093],[10585,"91c2a7716ff87bca4c753f60e1c7559812950cc2cf3f8a57eea5302b9b9eb5ba",9.917710196779964],[266,"816530709ce77546c0608c2afff66a25cabe4847f3b9f9ecdec32bf195f027fe",9.917710196779964],[19713,"70fc22d3f870fd34314e0128d0783caa804e393d14d8b5307eaac92b71144006",9.317957166392093],[353,"7dcca8a13ec21796c331a2fb3f4e204032f8f4109c796d333cfd8d704eb1b6fd",9.917710196779964],[6366,"90f4b9c7ae77a87ed01dd76d94e63aa5029ee2b064d7744fcdcd47ce1da18bd6",9.917710196779964],[11581,"6bba77037ac40d3b4c7ddcc1f94ea071903adfb2e937ec494a630a42f268ffb3",9.917710196779964],[4305,"645299f8a439d3fa168df54fc29362abc303e772f4df6a60be205d6421dcb5e3",9.917710196779964],[2644,"dff239c096fe565b28107a0c1b6ae8b3a6c3fc58bde9f8341ef9c908c3cce1ee",9.917710196779964],[7525,"41bf90b1e5b865b43c7f4fb59ae17295cab62fa45bad042e0f535d520e5d9cce",9.917710196779964],[12749,"796e72e5c3ac723279df959e4809e9273238d02ac38a44a5d124254e2b6640ac",9.917710196779964],[1971,"b97ddcef05044aad6a434a48de48c024d18ba09f837944c7ab2c175072b231f3",9.917710196779964],[13433,"3f7e8b1e0668b1a5eabf42ae410db1b942d7b5b05cb829ecf7dc930c7216bba1",10.052724077328646],[9511,"1988048c94af19211e97ef50c76885ae676a1fd0d1910103d18e886d20079fc1",9.917710196779964],[9860,"17b9f3578e089432d8b22a3bd94cb355a2a953eb0d61c8896a791f4c2fbb36bf",9.917710196779964],[15895,"c5cae938fcf2373a9ff11d35851f172c2c752a5e7a18fbb748a4ac1c9b5c1a6b",50.34324942791762],[14462,"90c74da131ebba98e8ed3092044e5d53c00760467ab68449c3b332228633068a",9.317957166392093],[11119,"21cfe0f8e9d9185992e1405e3ebdfe05053c43ff9fe807c010ca3ae980ea23b7",9.917710196779964],[5468,"1a03e0931498c82495c9e53a4466309f1b280936cb22f7d4bdd1bd28400a69dc",9.917710196779964],[464,"bb81aae72d0854332d4d27a163750947124d1cb9316e5f5370071ec320c8e3fc",16.142857142857142],[1439,"46fbed2d5925da80d127b99bb13d5b3121333342939789a37809d916c68c92f6",9.317957166392093],[7039,"34d36a82fa6dbd293c870537bc15e92917e16dfcd6b91bd9897e951177f0bbd1",9.917710196779964],[2188,"751c8e347954fb1201154827da24f49b680932fc124ebff3d6562278767fa2f1",9.917710196779964],[17361,"d30bfefa6dc04bdb7d1d064b17d992398b6398ab73727f56771dfba926dda24a",9.317957166392093],[4268,"250af13c5de709e5f39c600f5d98e72418ed75ce20dc8a57a9b7379e0893fae3",9.917710196779964],[15054,"9854c35a619ec155815bd2ef615838cf43b5e24666e3170b8b3d6114d61b737d",9.317957166392093],[6814,"231378c616da8b87e88554dd67c01f8719fed10a79a84725f3542f5596dc30d3",9.317957166392093],[14461,"1375c00a5f8c58bea46fe4acfa29b6238bcd1901d27247b7896f931a4666078a",9.317957166392093],[9338,"f2978292fd05737c48366d7258d9e068130b6db8accb7dd65734a0029120a6c2",9.317957166392093],[12935,"dc0e8ac82dc137fa91e1757abb7d9326ffd3f7bd90c9492e538bd36dfb3a02ab",9.317957166392093],[1586,"abd70383c9a9e2d96cdd9676144350983a62d7a566ea72bdd1acc3fb869b9cf5",9.917710196779964],[3730,"188f095b2870cf8c14622896f710a43fda0120a485b2a3c5b1d9d66e78e167e7",9.917710196779964],[15199,"92934ad22380746c9c21e089a1bb1c0d9351c29d663f8c4eec676fec03138f7a",9.317957166392093],[12517,"d77efae6734669824e73bfc99f84d2e7c0f27c295e9109cfbddae7b5a630d8ad",9.917710196779964],[17199,"474c006129189beb13cbe6da3c88262a99f60ae9f14c9e5c6e70e6510c51c84d",9.317957166392093],[12562,"434f0175102a6f59ccce0f3d1bde1268e1c42f0bb57a00e571ec6b4ac4e88fad",9.917710196779964],[12800,"7982884657c6c9b642c52c4ab430e2c5664bcbd33b21ce1b202407678697edab",9.917710196779964],[17554,"7a64d64682114fee411966e8cb65362091b5b5231ed830228d6350a154a36346",9.317957166392093],[6310,"f4b15f5239d702b4eb2d71ddf181751485b8e114345fc4b3c947c7a5e2b7eed6",9.317957166392093],[3954,"480bcc2732d13926070e3d74c6e3f7e24b18ee17f502f12eb8d68efd324bfbe5",9.917710196779964],[18604,"aba020405364ff24795c98d44de6457b1c9cc940d384041215d28d9277ad8e2e",20.08888888888889],[13913,"473c24283ab37cd32f03048d448765b05e824a34235f8c01465d0340b156b696",9.317957166392093],[1827,"83e8ff2df421f62ff13eb91474f3cc5e5422e20c2870f14bedeb412ad9bf11f4",9.317957166392093],[3958,"36e4f2c8c14a0b82444c5d6f3a0d527e48470365d1bc8733bea3a508d68ef7e5",9.317957166392093],[14981,"024c5b7fac8f3f89b05a5fb6b3c1b48e2238d4b58b32ebb603f9d1afd839ea7e",9.436992738146092],[3282,"f4c9cce8cce0c988ed2db8144a41761efbd18030763eb4c82dc9917eb8a583ea",9.917710196779964],[8418,"ca1dd219a33564f2aa661e5bef0f8ad2e8e3ee52bdebc72e16488c213e9784c8",9.317957166392093],[11652,"49be9a1a3873cf636c66fd4f0c29d08c8cc3a8316ef0761a3dee170755d694b3",9.917710196779964],[18818,"1ccb9f9492c466133138a7d8af3ebee15d6187c14680031121c362d9fe9e1026",38.61187214611872],[2086,"499756048415741bfb171cecbc8263fe0f05f6944661de7dc9dcfdddd02353f2",9.317957166392093],[2617,"bdcace9f67cd48d7ed3876682d9ace14457534a9f41bb57fb7d1faa24e1210ef",9.317957166392093],[14508,"44bd3badf089e36f43be3bd695a822677c258e69881b8fe388ac93d4dbcbf588",10.052724077328646],[17941,"155e9cb36682136f7dba28c5064d6f9cf251d42272a3a2bb5f89a9752ad8653e",9.317957166392093],[14128,"1ea0ebf55ffbdd7658e61372f2ba0498388274b9a21a83cbabb155b110a6f091",9.317957166392093],[8339,"0480840b098cfe81b4e377d1f3f883ceeacf0af2d565f7ef02acd998977b13c9",9.917710196779964],[11069,"e1e254c9683e7a32a9c89d25c58cd07ddbe7d7c332dd1fa69c1038b67d2987b7",9.917710196779964],[7498,"4f737123568fca684ba8d5ebc14b16a709f59a4e14c2c458955853011157c4ce",9.317957166392093],[19410,"ea80367f796a21c9e22798efe083311c137f7f4e251b688254411b3bc1872d11",9.317957166392093],[10906,"d319a093c31685093b55e4307562064d0870a6779ec12e07d149b8626ad0a0b8",9.317957166392093],[987,"4e8d46c92c3b7b2ecddc6bb0a401c23b6d9e362ec033e7a016904506098548f9",9.917710196779964],[2227,"d2fa0b66371e59ada7273abd920d964dfe33994402d9f45101072766c9315df1",9.317957166392093],[200,"68598439c064d29c31b7a7801a253ea910421a0c5b83fb6465f111feafcca7fe",9.917710196779964],[17312,"8e94d04d233b2533cce5437347c414e9ef8522a722837f4530459d3c2eeaac4b",9.317957166392093],[1688,"2e5c6998be0e7757e6ece5a7a3917407fa96b9decf33145049349b6ba0fc01f5",9.917710196779964],[10134,"bac676f81087451af68feeb9dfa7c8a3f2a194f4b6fdebdf4b9382debe2e7abd",9.917710196779964],[9055,"b0071bac740d1219d6a5aa8e3d25cb771bb45c84f0de3f08c32fc04b7e9a6cc4",9.917710196779964],[16570,"248c6447ec5f3c5624bff8b10da059b99358d8bf5759ea078bc177e1d5e1c35b",41.35472370766488],[7474,"be3d69b6ddf769b63f9b6cb15819127ce1a34b4cb78541c42fb006695090dfce",9.317957166392093],[14061,"f0bffb9fe5f79c6718cc8b0b86eb397cd4bc45238d469fdbe7a4bde5e44a6993",9.317957166392093],[5036,"0994cdfb96e5a22be03f20386e3b6100bd4ef45ee689e1c5f7d21932f3e1f6de",9.917710196779964],[12467,"0d0e6f75287c6f36cdf2b63a50b65e91e642ff5de1a8e315d961bbb4b20234ae",9.317957166392093],[9056,"75cdfdfab64950fe0b480eb335ad39aa1db71f30b446530043b3d85565546bc4",10.052724077328646],[18566,"e9171c2e2580f5ce59414517514ff9bbc18c294f0d46b2f8082b279477f3fe2f",9.317957166392093],[5671,"5d24c0be7c4a2d52b24a9f62744129afe1b65f9a96209be9fff9754268e32edb",9.917710196779964],[18556,"83f8a0acaaf976b7b2ce124ceeab9568d0b835cd98865f707364247e0afe5530",9.317957166392093],[13067,"06e427430234895cb52e732169c8fb712e6178a3498fe4027f53f457522c31aa",10.052724077328646],[649,"813ee056eecb83e83b58cc7fcd6ca7a3e573b549a859b1696ff85dda279499fb",9.317957166392093],[5018,"cb562f78adfe9974cdf608da4a54d1992b0462a56f71fa432ee8f055e6060edf",9.917710196779964],[1741,"93c7d054dc2919912ce579abb8857c0c6295e3eeff0a706083f6f2a09dada7f4",9.317957166392093],[16642,"34869e4250723b5e036a7cd1d59561f4312e7a309c3d5a5e3d08f580c961ef59",9.317957166392093],[14524,"c8b5ff0a69c7f4d50e2126bf9540bdbb5d5cfbc564663f5e8eddf7158333b188",9.317957166392093],[18200,"211eb999838c8a7ec9319c46f3705f1f881ff7899111d3e936adb7304a362038",25.916376306620208],[4962,"24d3441dca457d63a87bf9a9bbfdb7b1ab85878a236191454884b6838d2a78df",9.917710196779964],[4178,"6321cb95c3b800de14d00646b582865baf8403c5dc8c2c89e8dcb15d71b495e4",9.317957166392093],[18912,"44f0490fe733a9fbb7ca094a14fdc320713cd6c51283ac37ec3b6f77da5d0323",9.317957166392093],[15347,"223ef7d78c3987db6046d95cc9e2e41324e46832bfa8b4a003669027281d6577",9.472566371681417],[2787,"7a631fc4f3d9264297b875fcac217979523974e226586c7d5f0568ff5fc3d6ed",9.917710196779964],[8504,"522612a781a731887c3eaa6d138127f22a4fed944844b8796ea4bc023409ffc7",9.917710196779964],[9699,"c663f3eefd627f1d441992005cc7028f9a0b7cab0e423ec5c5176ce5ecef61c0",9.917710196779964],[14630,"68427e7797c3dbcb326111d389498afa50793ee7f7e8d398cf81dc7d3a9b6386",21.654135338345863],[11819,"58d399bb188e255a6f41f7b9a0211f0a4ee48a7628cc46ed3aa86669fee096b2",9.917710196779964],[15507,"8d375e4e7587bc6ceac4f7cc947c841795fa621429fe1a47c805f15d92daf773",28],[11469,"6aa8dc0c80145456d48493d3a7635cd7b1210c463cd684ef4b97add1599ec1b4",9.917710196779964],[18162,"f72dbd80201b2d796fd910050ab368c3360cb06780af1f04d3ee2e4f446a1539",9.317957166392093],[9279,"fe5e9e69e77752606887e45d72f5c1c8b191a5f7bd6264f2c721dce228aff1c2",9.917710196779964],[3651,"aba0d9f54600fc174a45178ec51dc0d5c0789ea02a568acd4594fb7a4182f0e7",9.917710196779964],[16480,"e02f704378ffba5121d188571729c0adc98e87b6c55a6d36dafea533c9eda45d",9.317957166392093],[6320,"9472061c4ff02348a805c5fd17ec4b6bcd11297c6ac4358fb7158f9e2d93dbd6",9.917710196779964],[18938,"b56de655df8bc2cb0ecd0ffdd398078f81e08314553cea71d1fa01a6bea77622",28.150537634408604],[7992,"6f1bc04f2070c8c10534970a93544a4f80d3f948c34b90cd91ed2edbc37f92cb",9.917710196779964],[9122,"5cbce54f919708a8839290dcb32b21260da98c7876fba231180013066ec802c4",9.917710196779964],[14877,"081dee5186ee9c131f340aa9ab2f4de054e900d337b3316d2491d9cf56e14281",9.317957166392093],[16900,"62eae1d17ad231dee86dc0a3886356192e0f518ea881f3c4d608298868623254",9.317957166392093],[19002,"15f5f29e049a61a388df1a4e099459169421e6b8f68ecc348041701ce3457e20",9.317957166392093],[13181,"97540bfe1bb2e9106b6e514f8bdec15eea20d801f1368396649f24ebe11564a7",9.647446457990116],[9189,"69d2ad6f1356e156f5394a761e81ef6a20f42c33079bca26573f77cb88ec8ec3",9.917710196779964],[262,"914ea516a4ad47cfe888ddf6e14645fa860ca4747f69978c384d989422c031fe",9.917710196779964],[15125,"e3fcf860b71280d518d5e5ab24bd5d978adc0ca07ab4f7114538e8a64db2317c",9.317957166392093],[5251,"edd646a7caab0f538d9c98101ad730b8611badd8e2a5afe969b96c6e1613b4dd",9.647446457990116],[8518,"d3cdadd03a89dd17681ab13c9634f6a7fb799297f0fbb1f70e75aa2e00f7f0c7",9.917710196779964],[16958,"ca9afa00f0e44f7ca545567abacfebd9413c19a597871823348514b1a823ff52",12.018662519440124],[6603,"671b8a5fba72a6787e1cf1a538610564fe7dbceee2114e3673a1e3390eaca2d4",9.317957166392093],[11944,"ecf0d5dd93781ffefadda478e8a07eaf06b080061726895abe9c166af510b1b1",9.917710196779964],[12429,"d2c7a698a3fc29b4f83e6b92aad7766071e19c3754e975f33cd2feccf3e362ae",9.917710196779964],[5822,"ab0ca8d57c08bd3673efd20a6cd57958f90f2f5fe07ab1a8dccdbaee45273eda",9.917710196779964],[16749,"f29c5b068b608b099de952db4f048f15840cf2a132c16491525536742d8b7e57",9.317957166392093],[256,"3b71165eecdef95a044255b14e6325dde7be441868b1037f432d33e7ed3a3ffe",9.917710196779964],[17991,"fa0bab8fc2ef69544ca73fdec7bbd1af3bb96833d9e530cb4f89d84c8a38643d",9.317957166392093],[17971,"99849cf76acdc97a9a5afa976eb2300bbf6525b7e133e7da0456c4554ab8bb3d",25.003537568982594],[15234,"eef2097ca36685d31ab9fc2a74e894ae635f3979c2a8150479a3d22dd5bec979",9.317957166392093],[4817,"f8c75f78a1a8683787169fe2483f3f8c1d33f2c17786deb64965b3ea552253e0",9.317957166392093],[9292,"bb6d2a1c71eff002e1fa24766f0cdea5c024ce64999434bc765bb2ddd1b8dfc2",9.917710196779964],[15374,"41af934dadc39902f70df0d3c77bedcea56057c8d3b896f0c51087a880eedf76",25.359430604982208],[18578,"6316816af814b6a9661df496e9495ae6b851f3846636767130967b89031e762f",23.003533568904594],[16217,"ef171ee3cb24e7076e488bec7f905f79aa9ee6040fb7ea11a6c36dd436fa7763",9.317957166392093],[4753,"6b3a9eb50e9f9152c7e5c65c3f4ad270496dbccef79ca8549a1b6681547aa0e0",9.317957166392093],[16517,"a7a5d63670b9fff3cfdc3f499c8a70aa997bf722e1081284d806e5978180e25c",9.317957166392093],[5126,"af69fd8e4cccb2450705bc1054a62b0056d542d57c7ac7c5d0edcec6c7b072de",9.317957166392093],[14096,"926f9e20d0dec038115bc25b2bc5a72a1933e68a048503cdd0b998d43ce89f92",9.317957166392093],[3391,"2a21368e6df5a25430db1ace11f71cc1901867b13fc25e3842385de9272bc1e9",9.917710196779964],[15553,"372e4fe80b0e203e940bf44086845a74b866c7090edd488b40953fa353d4c372",37.89021479713604],[18320,"89c949b629f7dbc4b5c2432d9bf57478b5063621b62a388ecbc4b6ae967d7a35",9.317957166392093],[282,"17aa6b5f9ec20717ae3ee7000d85a1dc036cb061717ea4f77a71bfd656f210fe",9.917710196779964],[5823,"071508522594e4975c1d0f1e6c74292ae3136ccc398de6c626fc0329e94139da",9.917710196779964],[5108,"add03f8f6a9196cdec2161773e8ac6502d3fde1a378e3d912ac8c3885b3886de",9.917710196779964],[1621,"60178fc0d08d63ec6aa6168eb4f095583dd71d265d48f6b7bb2818ff2bf371f5",9.917710196779964],[18406,"a26ce0d51b082b971c0c572ce7b2b49970c407d228d150b33b7593db28bd4f33",9.317957166392093],[16651,"be99b42458c3c43e5078c65318efc84c41b2f42bea08ae6255959e3986b4c059",9.317957166392093],[6543,"ce7bc340fc947ef2b2224f21c2474124bcfbf9d63023c32df6b5df92de460ed5",9.917710196779964],[19617,"0c066570ba2964a05b3595a6cdd8cfe00f95dd29bb1a13395a16cfd24abc2709",9.317957166392093],[15547,"03ab6bdf473e255a4834c8b5b9a368a5b880b69f1cf20ab1b0f74bf2506c0873",34.77580071174377],[11682,"e4639356f86d2225ed09ca63ab7232e039a7c13b2626f23f3b27f5fd42dd6bb3",9.917710196779964],[2106,"8cad638ebc5ce0bad2fcbbab73423a0c42347c12b02ddcd8d103552ed9f432f2",9.917710196779964],[6656,"d701f3b71946c7584db7c8915e10ea8ab7d71a22faa08946513a5f1b37c248d4",9.917710196779964],[1756,"ec9b6630c6cb9a48338d63d03e25501f6a26f757ddfe7bca4bee812ab5a18df4",9.917710196779964],[18831,"30d0f424b7183111995458b4dbc6864eaa6a49922098870d3840def1d916ab25",9.317957166392093],[7068,"c49fffa55a87641c5f95598de541b8a5fb3d895674ce0fcee118d19296ab89d1",26.13612565445026],[14740,"fdc6e63fe491c3f078875678d26855a065cf9d20ea3cf1569ec178780f801584",9.317957166392093],[19612,"91dc485c96c9eabc71d9b37be2e4c4db16cb29b1855af1390fb97bbf09276809",10.040927694406548],[2897,"90bee63e9197a8233c1a14c196639570756e28fb96e5dd2e5958912fc72626ed",9.917710196779964],[15880,"22fb74bf13f04c88f86a21f1f54f1f51093c0019c09bebc00ddb83957d7a636b",9.317957166392093],[3725,"a3f92f837bf72909cb2751778322ad51cc57738c5442207539db2a01265e6be7",9.317957166392093],[16601,"ba72315f305ad5580fc0edf8d2d0f17bf22fb988aefdea7e60eeafec7afcd55a",9.647446457990116],[19528,"6788db0b75fa33090173304d980af6723bc36847e5fe21ee3ade0f3febbc8e0d",9.317957166392093],[14924,"11c58db18c5b5b05d1afa7028ebce8ee013e802ab9a7c5c45b17133ae6217980",9.317957166392093],[4237,"4ba674c4bab152927a3817dd450c7455b6869e653bce21478bb50f1977fc30e4",9.917710196779964],[11034,"ce76343772336b12d870b9572171453dcf54040b60a4524b67ec605d3b19d2b7",9.761273209549072],[5932,"d35f65185bd98b4c387f102970037970a239b9a9a1344d163c213b929f917ed9",9.317957166392093],[16620,"df488aea4a2f5244d165b4d9d50c415207ebb20e168934b618c37b0ac15e735a",297.30593607305934],[4836,"3b918ac3ec25cbcb61a1dd49ba3c3d99060c6834ce13fb6b00906e7e9b4e35e0",9.917710196779964],[5566,"87e17f2c1a3754a8180c0c774caed5ec04bf362b2df4bc12c2a5e50a1acdd3db",9.317957166392093],[651,"72bac6e52d42ea49f2c777e1803ebf44da8177ae6988b58ee1be7a448a648ffb",9.317957166392093],[1091,"bc47036ccff1f408e5b87b3ed11bb91fb07bd05adf4ea091f622805c01b09bf8",9.917710196779964],[8722,"788ae3ae4ad88bde916efd731d4d85edc696a16c98ca6eaa57b2bf211ab98dc6",9.917710196779964],[3719,"06c5e093bc0e2cb4492e20f679ab53af733798d070f23cbcf4c4aa28c63977e7",9.491525423728813],[9427,"d3ca23c308692e88508ab2b4c2d1271ef089d401dde473a525eb02f83a712bc2",9.917710196779964],[14319,"34740c65bb97167b1f05d9b6e4cc664baa88059d025cc872004d71a0371b318d",9.317957166392093],[13545,"3cdc6699b4b33c1d66b08d2a7667c7a3efda9d82945c2cc38323da144908db9e",9.317957166392093],[52,"77c4913d0b6f9ab9136c36e153d69f69458d2c53b654bc7fd8b4b01e8a01a4ff",9.317957166392093],[2197,"56dba58a2c176e4f24d43037975e1c99f6e09ef8fae224e74c4b2529b5448ef1",9.317957166392093],[417,"d131bb4f91d042eddc6074e46b8d777a846ac75cc9d33f18a5dda981956043fd",9.317957166392093],[7492,"34d8484f6daf61f206f6199924044277317725a92f01b616fd22410119c3c7ce",9.917710196779964],[1292,"316195fded70c0ecca86b8e924a3048e293f8d66d7d2b9865f259aae26386df7",9.917710196779964],[17476,"9ebd3af0512f78ebb001c2419beb5061002ea656535a98ec965e82952db72648",9.317957166392093],[7900,"647bd6433abc4beaa003aed2cc73c50a75e81cf2de1ad6eabe2d5383e9873bcc",9.917710196779964],[9506,"9bf625d6f4cd855c9a5d94b438a73b373a904de1873577042740edaaa699aac1",9.917710196779964],[1666,"40dea0fe3abc9781a6ef01e1968a2cf09850b865096211f4b20e7bab1b9923f5",14.188948306595366],[10591,"7d0d42552a3232404b3a8c93640551a386406764e8921d951be4c0063a95aeba",9.917710196779964],[16678,"a43f5c52c297f6fab24ba0156a671be8b9568d0005ebf430d3ce5e7921531c59",10.052724077328646],[5718,"280b12ae7bda7113568e2b1650269c9fe90ea7738cebab548784c21ac9d7f2da",9.917710196779964],[6356,"47ce4d0527345cc5bdf8c3864c18acdc6a57a3fb111d7221375eaf27f7fea5d6",17.129770992366414],[6698,"a39070b1571066c0e5c2c8f309d450d5e533ec4db3bfcbe5feca34d62992fad3",10.052724077328646],[401,"b62ae97e9e723be827fc666a8915aa0be7b169fb8c6e7abc3eeb6a02a3c454fd",9.917710196779964],[15700,"8d2f16d5949b0a2986e3f270a26cad6dcca7891bf578f6f1bdb31655efca816f",9.946524064171124],[77,"c8f462d756cab1417845dff5a14590e2193099d696f73054caa2ba0a03a87eff",9.917710196779964],[11971,"5c3b9062593bf68ee78ea8c3d9012586827e7cc512f06cc47f3ce8f6888c80b1",9.917710196779964],[16661,"a880e501bd3e409438e9530ef5a04dde1368a864dc9202b1528a0ffa1ce47d59",10.052724077328646],[19176,"85f8498edd73fffd68e6814be8840dbfae44a7787ed13263878e0e507dcf7d19",9.317957166392093],[9097,"0cd4610c521ead0357ed4cd7f69a12d4f844ba005572357dc837b15dad3f2dc4",28.899115044247786],[16,"8a7da6f84c7db1c7944b16601504d8622d94267e26e573250bf1d2bb7c42eeff",9.6],[19586,"e0a234bcda8f346a0c6c30fea3ae8962fe175c4e28614fca5f13839be266a40a",10.042553191489361],[6963,"fe74914eb5abf3c8b93ec90aff547f89e4c0e4294c6b18894919d18e667e32d2",9.917710196779964],[8104,"8e565648a9537b5ae9ed7f910925c67aa2592b142b813fa5af3220a9883abbca",9.317957166392093],[394,"ce4a23855cd66a2731c5d42ef877ef074b32d35d4ca52d3768bd2f84f74e64fd",9.317957166392093],[11890,"307933bdd327f47532b50b5309fb2f7d1dc3d2c693273e3584c5d3521e1312b2",9.917710196779964],[2822,"48428fe62ca715205b7b798510fb445283d0ae7ce7cd43c9949c6230323d8aed",9.917710196779964],[12213,"764f8b2ea4701881afc3d94e87a054b6aa4c553c8bf6705ddc2690a9c7ba01b0",9.917710196779964],[9165,"262fe06f2f9a35624ffc538c93c6c2daa03c9a6b95b86fdee5969ad9f145bcc3",9.317957166392093],[3681,"bcb0e02d50d7adfdf6530d44821e34177c2994b1b974f4f2af9c95378ee3bae7",9.317957166392093],[8528,"c9686fbc748f2ee6e755bcedbc0d3274a82bae8396d8a960d74c8f640253d4c7",9.917710196779964],[4957,"21f60878f2867cb2851000693386d4aa35faa4010de5d9e9be5f8bf2a77e82df",9.917710196779964],[13345,"17fb757a9d351059b34df912face545ee08e01755ed819fc12fa5847564398a3",9.317957166392093],[1202,"c14cf2011b16fd615b57cbca6c01b07b19edb388965fa9ae4e010b08473901f8",9.917710196779964],[304,"6beb0fced35af5b4e9abb9b8121a316a21d4085b9db019d95d273920f4a9f0fd",9.917710196779964],[10067,"84440b65e46952b8c62039feb0a9ddcdcf59ae15db1968b8e4679ac33200f5bd",15.105633802816902],[3334,"60316d38a6b9348d8ecdb54fdb92f7b9c6abf985b3fe4868e2fe82cfd02e1fea",9.317957166392093],[7224,"5c71585ffb2b4803a2f8194d2c3ad7dc4060f211afdf8d4d1d35eb75cba180d0",9.917710196779964],[5934,"c48be2164d903fdb6ec8cff2846e001fbd67d8b84b7f90ee2e1605c896f27ad9",9.917710196779964],[1570,"4a578d15c6c68a010d27eb9a05846b788115d4804afa80f3ee5db7643cdbb4f5",9.917710196779964],[7456,"5e307fd3b28b63b668561444608fd6bf300144de9081eba1639fe82c6f3f09cf",9.917710196779964],[19156,"744c3f06132da9382319d979daeeb1e1cca8c2f5fc9d28cc44cfe3782e5d551a",35],[16820,"bf92fd69b9bd01be0d160902c224ae051404bc36ccee485319220a928822dc55",9.317957166392093],[6736,"5ee65879f389a5e446c1fcab2eb066e7e65606f852b9a7f6ee254d99b300afd3",9.317957166392093],[5618,"f4ddaf719a5ddcf6a9a07356b9517c945f3a72940d8b9f2c74a28a6ed89390db",9.917710196779964],[19536,"b0ce27958b11740cd6399ab39970539fd304941b0b87ba4c0a8a6ef0ab4e440d",9.317957166392093],[4694,"74eb13e0bbe35fc1369ba1799f29b8264b35664048603630b8bc0ece9efe08e1",9.917710196779964],[18190,"b96ef02c9e3c2f9d108bd81aea294df10fcbb0de3bcf7c63cdbd18710de26738",10.052724077328646],[1172,"e33b18aa1c0c84ccc989a8d7b021658dd1697aa390abc3f7ffe1ba89696929f8",9.917710196779964],[12217,"593d2b65875c01086796d3e81a5f7ffbeb343ef53b84de4630cb1ab80d45f6af",9.917710196779964],[7521,"4aec1f0bb45b4c273c473bcae786ef415ae94e271ec8a7c248cddcde7d62a3ce",9.917710196779964],[18096,"991429ed5b09f75833cb6971e7076ca090e6426258c4fedd091267cc1ccd063b",9.317957166392093],[13799,"a96bccf5a7a5aeba74f1e333e75b679d1aebf3d79fa54f6399d536e963d15b99",9.349552444342438],[17791,"de27e3d244d775394dc3cfa30eec7942776f2fcd642f3732142dfb0562ed8541",9.317957166392093],[1093,"f61f17efce2bdec51a666229ca5c71d159747c02528b5cfce62585e1bbb599f8",9.917710196779964],[19644,"2cfec4c3a1a47f48265a36b29e4155b67f324c92ec0ea1cc2bfe20bc2c812708",9.647446457990116],[15088,"23856791031b12dd94b7ed5d826c1c4dd2bdcf27af8a4b5269f875987589e67c",9.317957166392093],[14893,"c2f2c999949b9425c5045dd81af737f7ec8f4f4ff740981038844882fa520081",9.317957166392093],[3408,"7bb2e32f7a3f4f7a337538c37c035b8c73afc5da85ae74862e1d393f5c6da0e9",9.917710196779964],[17434,"3e9d31482c28cf93a4bfc06723ccc1b206b87551bc7c36fbeb9f9fc6f1280049",9.317957166392093],[1609,"92d17ed193a56717a2c36bc4e18da8eea6ff1a1c76e9f5c4fae06fd05bd285f5",9.917710196779964],[291,"d3f6df15631ca80a9de93533ce74b330557e64a4ec7bdd0c45c0e6b4ec3002fe",9.917710196779964],[11754,"3a4d1e7f95ecc1a108fc76b9c01e9974b1d2f0b1fd4c81d96cda0398b0e4f7b2",9.917710196779964],[10262,"a4130b0f90e0a119140d2260d2c4f494cdb22e85d26caa2f4cde693c334ba3bc",9.917710196779964],[16173,"efdb88bf3fac97331574e2300218a65de437aeb6a514d74d84a4193b297d8464",9.317957166392093],[15434,"a733f2bd2445eedb08b43a0910250aadbe18ec59bd747f6f0a0e50ea1ac27375",9.317957166392093],[992,"0abd9c4b42814b5f1693bbe0de0ae74a9af9de7a84dd135058e51eae382c44f9",9.917710196779964],[9324,"7308e7001f0da0517076fa2bac475fc1fe3a196bd3fbbdae64722a297a27bec2",9.917710196779964],[6901,"dfdb665b29a51afa8932f8ffb3cd9850a86749da5e491ad9f35de90bf7ce9bd2",9.917710196779964],[7219,"0a3d26ce29551b67ef072318424e020b46202983ea4e60fa8b146cfcd4008ed0",9.917710196779964],[19821,"f0a7a879514a8c369a5223ac6d1dca84cb1e54102cd1fe71e5a11868a3c5ce01",9.317957166392093],[19803,"0e1eaf59f86054e84681ad536f92ddd893a596491501fb64645171eddaec6a02",9.317957166392093],[12884,"4662cc89eaff1cef7a18a94c7aa6031e83d93e434a3c05d17ec5ea5329585fab",9.317957166392093],[19811,"915537b03b651196ebe91ac5969a44a1f5e9bb3c1ab6bd82ba8597a3c20d3d02",9.317957166392093],[18216,"58b3b9cd1f7de4d91580fd922c5f32cb4ce3c14e5da8e95327fc55632b76b837",9.997888067581837],[8760,"da9134eac2398202c2f682a04f4d4f1131a21f3af05b61227b2ba36b273846c6",9.317957166392093],[12538,"c99fa5d160718074e5c887ba817546071542069c31b1ec41494074add21dafad",9.917710196779964],[15683,"2040d0817ba9dc2be2cb46cd1f319e84a0022e489b630f81882f71857400c76f",9.317957166392093],[1275,"7de8116285d8ddf08de0acab95443757f08bb3db786cff2a5417f8de22c885f7",9.917710196779964],[18195,"238fc0f545ba9a000ffaf52670b4268f4e5f87b83fed0dc182a2e6599f4f4f38",10.014471780028943],[16083,"f6856c4734d073f0582149aa4a245f777eb5e4942682b5043914d0b62acea066",9.317957166392093],[14124,"ac46df91fea7cccd3b3709fb51fa1b401f35563524dd04e8352771d9b83c0692",9.647446457990116],[1661,"75872a3bd4af5f041cba8dde611da195e6e9f5c485303ec8e2a49bc5ba232cf5",9.917710196779964],[17432,"e09c750712e52326c01d2e60debdc66fbd034816eeb307642fc92f3abde41349",9.317957166392093],[17492,"d41fbc858a01ab8fa7ed3e2c6fa3dffc48dd314919118533459a11cbbd5cc747",9.317957166392093],[17735,"8bd08af5ff81d0e9462d93c734ccb7e23a0e6ec63dbabc45a654a7b4706b8442",9.317957166392093],[12049,"80bd8f7680413825065e11fc9360b298257e4b92feabeb61ca54797172d7fdb0",9.917710196779964],[7321,"2de34678e933b48af742971cffcefdb98e799b6e255c1de814c40e0b5ae2efcf",9.917710196779964],[4190,"9ecd7854c327cc1a513fd7b6dbb64d41175e7754b276cb57cafdf43c46c17ae4",9.647446457990116],[13428,"bbeeb5648fa231ac872fa7025ad9f136b3d18d89a9582d52331b4bff06d1e0a1",9.317957166392093],[19134,"c9e586370ea8ccbda65a67e159ef327ae89f4520efc7cc13cd651875ce34021b",27.123367198838896],[14822,"67ffcec8943baee3cda05e33cb270de2092b402fbfb10930a4ae845360bb6082",17.09090909090909],[5238,"b98bee3552c5c7b18554417d4fc464d3b09f07ebe568aaa20f0486757093c2dd",9.317957166392093],[16989,"f7868411ee2d3d8418adae6f33b54ed0557a5f6f2ccc647f54dfdd54a7c24852",25.100591715976332],[8151,"844fe3f093b485450118717d24701c9ee2ce16d2bfc6d991dd58cbe0f89f56ca",9.317957166392093],[3326,"a29fc9f14cb8367743b9b2cd3e527f9708ed936281003e005b5aeda050aa34ea",9.917710196779964],[1851,"30e75ed904abbfd29ca85fbc441ce786aa87b8b570f22b4482ad95d3ee8dedf3",9.917710196779964],[17480,"88ce4ac182763c982fbb07074614c069c7a733ad69bd2d781f6163f4f3951748",9.317957166392093],[14015,"d3b4f2c6d5b5cca7e4202f97fafe6fefe596ac403a6d77aedab2acb0a0ea8394",9.317957166392093],[5643,"44d212044d4daaf3963e63f17e666d4c3afb2e64d582aec886fd5b5213575fdb",9.917710196779964],[2929,"e5774226faecd6eed8862511c879a5ca712b1d8b56f5a2938c88bb88a434daec",9.317957166392093],[15262,"d6710f1cbfa5da5b91567b016f2d369c26ab3b278797c725f65b57a39ba13779",9.317957166392093],[15098,"02a8ba8a8727720c7e33bb93276795df9b5fe7ca6db73cdb52e3ee0f9a59a87c",9.317957166392093],[9817,"10f7de4f24e2d9ca8bee0e87c5fb905f19a46a878d352cc83f26a684225689bf",9.917710196779964],[15641,"511df058e3056129a0eaa61f5ec4a8736977f1381d9a9b14e1c924ffafa88170",9.317957166392093],[5505,"6a62658a23991876beda503df3fdfecf55f77ad9654761029ae72fe8a6b52ddc",9.917710196779964],[10620,"84e2043d98681b488ba9d0bc5005e31337675f5b4c45b21f82a681b7e1488cba",9.917710196779964],[7261,"9202523639f2f0251a39d294e48e6f39fc9ff2d206243faa72482995732a46d0",9.917710196779964],[7142,"7b8a6cc7d189226ed736b5954ada11e0230c2e23b3f26885c4ae07c9487811d1",9.917710196779964],[6469,"69d876f044e082d7e0a7276f148221d2e979d075064b1967fad101f2f4f1abd5",9.917710196779964],[12901,"5851e40228a71f8c090049868b67b460fa242adcd1637671de4f74d7a1614eab",9.917710196779964],[11997,"bb541af12f94ce776e13238545856c69a932b9cba322e2d2bc6496d63ec057b1",9.317957166392093],[6918,"dd95ac94f6ee3d6b9a4fd99a936ed9306eefeda182fcb1f3e8950147cb2d7bd2",9.917710196779964],[3431,"033ea422eceb8e6ba6e9a8b6e2089b916313c21f0848be9c15f2258f21c579e9",10.052724077328646],[15221,"d1b68ffc458126cf4b5ae12ab5b28fe674efd8f1034d62f46120ed5d1b17087a",9.317957166392093],[6804,"82b3cd06049aa1f70e70448dcffa54b396df0d3ee8aa4c3cfd7e3acaddf63ad3",9.917710196779964],[7612,"647c83e2f1db4f44408660281153743bbbd45bdd43b891cfa256b8f198b520ce",9.917710196779964],[19008,"884dd9ef88c390b8ca16dcef3b76e9369bb5781a2ff396e3a5e5d90f4ca54a20",10.052724077328646],[10644,"7392bedd6cf1983a0e837aee60497e9bfce8e645eb349c9daaaf66fdaecd65ba",9.917710196779964],[18822,"7cce70035c953b45ad87842c7de03dc786ac3a2bf61b63452733af415821fb25",15.07908611599297],[8227,"36d7583624bf3b0dd1ebccd0cffcf4fdc77e1aecc4f4181d220bfb7963aac3c9",9.917710196779964],[14645,"0ea35e61250d82e6860071e59ffbfad7ad913d6169c4408cc8a9a27cc0650286",9.647446457990116],[14241,"e8f7eb2d77cf01170c50f6b135d30b48245062bdc2d84c9f18ecf0b98a872b8f",19],[16221,"af4f371c6bcf9e0eba9cee3bee9f1c1d8f54e6ea658c9056db847b85034b5563",10.052724077328646],[9986,"d065c480d4c7e54cd70fce7238977485f5481e20fab1bc43d73ead033d2469be",9.647446457990116],[15601,"fd634ce71179397e7f8735aefde300833c0f22d8c72221d6d6e82c9c6d306671",9.317957166392093],[11866,"28d414163ca7ecb1c35658526f39ca5f44f01ef2ef0d0fced2b8b27888d147b2",9.917710196779964],[17261,"070d63b3d3fb01d4afdb5e8fc0e4237d160eba1399f721f77c82781ca315e94c",9.317957166392093],[15228,"bee3befe6ba761ea0cc788cf86175e228e001da88850a9354313188d6f4eec79",9.647446457990116],[3320,"9bd4c1f0536974a902acafaac7c2af845ad749013b7d95c0acf6613d86903dea",9.917710196779964],[11108,"94859713193065b405615df1d4eb40bc263fb3fba2e66ab44a6dfd3ae80734b7",9.317957166392093],[18481,"cacdfdc891504315ea215535de3e73b6e6e30f094927ef81c289729ab54ce331",9.317957166392093],[1884,"415e14f21b261af92d69560c3c33cbb4b1f077be30918f02cd2c2cf3fcc2b9f3",9.317957166392093],[427,"b859c4c59e62b1ec8494b13df1bf7083e6942b2549b44ee07a559201972433fd",9.917710196779964],[16063,"6540ac6b9c8fc9efadd521b10835f1dedd7c90ff7c1736d2a9a84a0ed8821867",9.317957166392093],[4820,"e092be836859b4edb200b096d8e067053bba7f13e0624c056a37f8f94df54ee0",9.317957166392093],[11170,"5b9e244dd47509e7accfb5946e702b24f0be94f2b11ff7d096e0c40947e2dfb6",9.317957166392093],[8083,"c10deee9126578ad41896de766f60dbd7466becb157173d446bd5f8e22fee3ca",9.917710196779964],[13033,"d6d950a2bd739f8b0c77d51fe6d874852d3e1e63ab5f01743a4905fba7d263aa",9.917710196779964],[12099,"ece0091d299981a02ba955d08079c9356e049e6359e377dca35a8613663ab2b0",9.917710196779964],[9020,"48160e7f6aaa49615298704470e5f71e6aeca826bf537a145748b7dd7b7ba5c4",9.917710196779964],[3610,"351058d46cb93a0d2448628900ee1da82f42f81e896d1b1a9e86678fb94d27e8",39.05061082024433],[4757,"7796307c906aca3ede0121c7b874781cfdf6b860341c8617bb936a4aeba797e0",9.917710196779964],[12311,"5f0702dd5c3988c0c31df54acbb96b1e2f1e6d28ac1b83d4298c4bcbf99a2baf",9.917710196779964],[9617,"0ddffada5d86baacb043c7f2bbea01a04dd39a23d3cef4920013ec122fb5ebc0",9.917710196779964],[15606,"93bc2a1225ac9cae00524b29491563ed6827ee72e128958be742d56b584f4a71",9.317957166392093],[13867,"910d5750505edb6ed5a3ae270e145fd6ac4ddbaf75eb48b706fafbb25bd5f497",10.052724077328646],[18952,"278873cc033943ed3c2913ba4a43150cc4813fc295c937b037b2092b299a0b22",19.20212765957447],[5136,"42d969de27268be9c675970c98ad4dcf6071fca433d1e14ec0f76357e4ce67de",9.917710196779964],[4748,"d3bab19f242deaa420793b40f619077a8aaff78804b2081c398b3c0ca7a9a7e0",9.917710196779964],[17569,"45e6d5fec52c520b78f59b9fe69853a9bfe28a36a2db4d84c51c9aa3b0a4e345",9.647446457990116],[9993,"cba88a2ef51a43870e9c5cf6a548108ae1bb34d4c937e1664a1e1023aacd5ebe",9.917710196779964],[14660,"49e00187c33fdd54f824ad617c9130c68da1fb626eaac9eb03fbbcb579d8b485",18.779456193353475],[2369,"7a44e6d07f6a8b5b8f18fc2401a710604b099aea19fe48312aea3b4efadaa3f0",9.317957166392093],[19074,"48c71023ae7dff49c88e25a39759122630859e06f9fda860f8ac39924fddc31d",27.151515151515152],[784,"cf996f0148452bea4538239dd6274fb1c6aadba1e685012e4dd473c9f52fa1fa",9.917710196779964],[13038,"2d79eeaef3ec3ed93192be2a244e0c0fb39d46079bfd88bf1d780b72733a54aa",20.0734394124847],[18560,"55c1667bdd892788b38dd893e7d8b016a59bf1b85701d2ced4d12f4907c73430",9.317957166392093],[7897,"ec6778de0ec3f345502a36fa78be057c72c65e50cebe6a02fe83f513f5e842cc",9.917710196779964],[6441,"364e01e5b4a1cd093d20018dc0a67571f8a903616e393bec18e05cf37e68f7d5",9.917710196779964],[12752,"92923ed3ac0b71af3ecb8032d23ce6df76462b9b58450bcbe1aff3757a8e3bac",9.917710196779964],[17251,"a88caf9fa3d1bd4dcece04e8aa649846ee80de9ab08ba104c48364ef7875fc4c",9.317957166392093],[12664,"b8d28353909843e8aae4fc1cd48ecd89d40a4a330171e8b1f8423d33cb43d7ac",9.317957166392093],[1596,"c98a87c92e96b068b77aefca8a74ae99d966b6561896bff0b6e067c7496792f5",9.917710196779964],[5005,"0fbbe8d7bda1885fcac531f107a6b8cf85236add093395af2b023f1c6aae20df",19.32116589485154],[12085,"0f0f8cee8c8bf54138ad056eee4e956544f041c3e476d4bb5722f13d9ed0d1b0",9.317957166392093],[18248,"1baeeb3400b08482ce0c43d106918d8972808e6ef8245e6f14d014d978a90537",9.317957166392093],[14250,"9ce80d455b0ce9e6a1e4c85c73f96de6fab251edd18b073b3e6ae37cca1ff98e",9.317957166392093],[7075,"171522b9f00faff668efcf538d2016121aab8452b28acf0ca2a8a42c346e7ed1",9.917710196779964],[12717,"7da2c3b4bce59e4952c4f3dc19612407528121f3d898c64b0f9ff2712c1c7eac",9.317957166392093],[7130,"5ca6f311559afc65105baed7940403d4a427c1d4e78d7ebb1fef0e1f80a51fd1",9.917710196779964],[424,"3d4796348754fe0fe64bab1615e4ab496564fedb23666bb42fb31f350de734fd",9.317957166392093],[7455,"534e7cc7d7491b1ce39fe2cb9782c44b69354cf612eae7d4d1502e90d7a10ccf",9.917710196779964],[5158,"b483a3323c7a2a6efb9642a1dc93c11ae99007c7cc8d003d4fed5e5aefb73ade",9.317957166392093],[18580,"7af06008084f7512d7c21cd06024eec0ca1bbf590c1090c063f9c23ae7e9602f",9.317957166392093],[3087,"cf213cc970ce165765beeb16c2dfb4d34d5e9e10aaeed04c6b51be329edfbbeb",9.917710196779964],[3850,"67f3fcd7881870a6582d49473b154794070444597a7d44f11fb87586c25cb9e6",254.0192926045016],[10393,"2e9aec0e7882cd0c21d585f865555e1f0e676eaf4ff0d5e386e373b2ee2bd7bb",9.917710196779964],[13071,"02bbb59efab70d44f67ce789dcabf277ade335315e9aabbac2860385687026aa",9.317957166392093],[6234,"7d26ff4a9a55eeb193267befac64f9348e875a21b5ce5ad592b9b09b927985d7",9.917710196779964],[15555,"d0b2da0135a3cfbf468fc22fc7ab5db2e57fa6033368fd45d13539c345adba72",9.317957166392093],[10929,"21b5ff74b893685fc4355a80b5fe7fb7352c27a19983ae0f483432761b0183b8",25.961605584642236],[9661,"7f6919c7c31d4419d665bd46907516a79cbc405fed50a25e33574e0161e9a4c0",33.926940639269404],[15608,"86a63e5fb765d60ccbce353def56c66817aad0f68c584123542638e571994471",9.317957166392093],[7329,"4d46ae01f82bc96a0ffed2310a4335d132e4e29f61ff8832659200a35235decf",9.917710196779964],[7597,"1259c420227d43b6e90b10f695359082e7ea58dc0d973aa0a36b0a63e9b431ce",9.917710196779964],[19733,"5ec13c12f440b071ba19ffbde995b8db26e18d869e89578644843833df77a405",9.317957166392093],[5712,"5d3bc832e80171e295fc389746d25af1af4a961b0b3a0bb6bb5cedeaf96d00db",9.917710196779964],[2169,"4341d1cbdc1625f11035456a0716398d5a0cc71c1ad5899738e2a99b69dacbf1",9.917710196779964],[12916,"2e3071197cd40c1bf5f5be425c4b26e4cdb6145b7bd7e6bfc00cf3470d0237ab",9.317957166392093],[8330,"8684c84a81f048664b10110a473f6665e966789c1be08f92cd574b33135d21c9",9.317957166392093],[7143,"f3fe069e6b9f7a4674ef61801002d46897c7f2ea9a2a979d5ebbddfc00340fd1",9.317957166392093],[9046,"3058ddcdb75015f614f2b90853d7260101309d156cae77a23979bb0f0e307ac4",9.917710196779964],[1196,"88664435eff0619e11305b09a7ab995f07b0b005dcfbd35de888fca1e11108f8",9.917710196779964],[3871,"2dabfa095f673c12a4a7b96a994cf699449fa1bb33d00ad4ac78948dd0218ee6",9.917710196779964],[5606,"a24f98ee96e0d302d75054f958bfc0b79bb608f294b7a91479f5ce34516f9ddb",9.917710196779964],[4495,"040309c3b8e18484a01e87972b31f21aad1647d2274fbf337ee727bc11eb6fe2",9.317957166392093],[3712,"faa845e460ebae5506e1121eea16c3b836659684339d607a7e44da898d0584e7",9.917710196779964],[7375,"7b61bdb40014193ca53ae30ef19c766d8873323232860b6353bc9f26c9b28fcf",9.917710196779964],[18373,"a6e4b60f05b71ce710952c3c3e6e28f0c057b49654d8c0f18dd221e7aa2a4034",9.317957166392093],[3323,"76f388e9956d716ad5f63a5eff39a850cdaa34bd404c0258f66d8b4bfc6e39ea",9.424083769633508],[6400,"98df6c6fb79378c89623cfe625508c0245a67c8068d4fc8b7803f18c398b5ad6",9.917710196779964],[7258,"cd2406900bdec92731c43b9ec8583a48e5d5032569f61eae1bbabf96f1c64bd0",9.917710196779964],[19098,"83eb44a6cbf6292c6fca38ebdbe04f0d65818be5986d16d42bb4632ef285db1c",28.899408284023668],[13645,"271b1c19abfe6f5a5e2d49e7b1ab04e07dff4729f05ae68705294e57ed85549c",9.317957166392093],[7773,"f73d26d97054f3bb4707789a5b9b26364d526bb059fd0fa3ec374480ec2cfbcc",9.317957166392093],[2833,"4290f2c5edccbd96255b7c3273a5e7ea001902b24734554660da70c4f1a372ed",9.917710196779964],[17366,"adcd3562308080ca8f647fd53c4c9c6fb4ecca43fdb7e20858abd3b90e368b4a",22.150943396226417],[17830,"de5959f98c2ac6c20023df509208dfa495c9480e3cdb20ec6d0347618fd39e40",9.317957166392093],[8988,"b326f3f20eafb452c886270bcfc181907f78edc53145aee76ae94a5333d9d5c4",9.317957166392093],[8448,"c81d21d7ca950d8ab0b72d1592182006193272d14d1692f0524150405fa156c8",9.917710196779964],[10828,"b3ace72df65034ae5ffdb922769ecf618a603eb4012a9bdca5df42ec42d81cb9",9.317957166392093],[10251,"ecd33dd11dac09ef6041c3275b6c81db0bf3a42a51fcbe2f440872e74494b4bc",9.917710196779964],[11903,"c33e912e1582e0870d21ba7f9437f59ff4ef9491d59a6aba9a291d5c6adb03b2",9.917710196779964],[3656,"f864a86b7a1698001026e1866f4586bdab9ba2f98370917a56ec65b3096ce3e7",9.917710196779964],[16506,"d1a78d6ae1482fc9c1666b02e9bdfeeffa7b9243d2a7695e070e36cd67df1c5d",9.647446457990116],[10492,"dfe904378821a7a2abde7ed7c18ad4a2d4dbea8c08c29ae932af3b26647935bb",9.917710196779964],[12926,"de54087c32af3d6136ad5ab07e7da9b50efbae089757ff677f90ff1da93a1cab",9.317957166392093],[13923,"48eb84a376ff79727af1e323a6148cae7e8226f3cef05832e15fab3a889b7796",9.317957166392093],[7154,"826c8e385a475b12951ee483070b85bdd8ba6938481794bf17b703501553fdd0",9.917710196779964],[19602,"eb79487fa637fc21e4f16f499589aed732256b80b41bcd38f9d42bd99eb6010a",19],[15840,"bc9ec1fa1de8e786c34ba9729a7004e8b20237200f53d57763515178b699886c",9.317957166392093],[14083,"5d68dc82e8359844e6370f91aaa212cdde8792a260dbc375e44856272ddbf792",9.317957166392093],[14112,"2491dcbf1b379df0cfa67b40d0ceddb950706fe4d08928865cd1933a32844192",34.301686746987954],[13954,"b6a21d2982a14c683d8c01088fc6500c25ad25571b1d340e56ee690db154e395",9.317957166392093],[11723,"0de76ea32df9503ac1d7c076df21cb3783bf7f175a6ed3e229b9913d611927b3",9.917710196779964],[1021,"457604cb4dea46bc875f68a5c3fed790d388eff230f13816144dfe1bf25e1af9",9.917710196779964],[19167,"53d9754bb11d966494463bf13dd1d4ba02412bce277de10776b40fb430aae019",15.073529411764707],[12176,"3a289d2592bd4ac61c4b6d5c88a1fefa49dc04ade28cb042b1d14529a94037b0",9.317957166392093],[6416,"7d12046bcc4019b12d190b3371d2e10d8ef1f1132fe41a38c6f0dc62d13230d6",9.917710196779964],[1507,"f496c1ba750837d29ee19f976966266568872dea4dfe4625c7e482d2fa7111f6",9.917710196779964],[4866,"5d6b3ac46b6e73e6638ebc437d72dd5077d8904f6a2cd359859ee3a10f4c07e0",9.917710196779964],[8201,"1c75f542e49ef820e72535086799b6dfee574aa331fb4c3deb23cf545fcdf8c9",9.917710196779964],[3689,"9305a894a0320e7096eacad71ceca6bbcb992a63dd96a65f45348ec39c12afe7",9.917710196779964],[19144,"118f3b1ea919cf1d9298e070b7e76646df09aa22d51da310fe6a00c03f0cab1a",9.317957166392093],[7814,"593bef85c74ae33d2c975b623f07b5e084e1fe8de94cfd66954c5ca6ff65abcc",9.917710196779964],[3216,"8435347d294156a12d1a4f439761e99808670d68caa156952c756ba98812f5ea",9.917710196779964],[17221,"7b1edf093f596c68bd7ed791a9ddee0903d24734bd315921165f9f9d5eb4824d",9.317957166392093],[1796,"9ba5b23f04defbfcea2b364e211994b97ab82f9720cdfe0e991592dd8fa045f4",9.917710196779964],[12210,"a9941013ab309d4e3f2cfa1b7db42c83c22040bcc6f524b89ec3e22f247006b0",9.917710196779964],[13876,"8cec15929b8a1a80324b6a4e791dbfc281024239f3d43d99cad109b4f707be97",9.317957166392093],[8703,"6b2980c36d96f86a0e2cd3e811453821e7a451cea0d96c3059b03fbb308db0c6",9.917710196779964],[14936,"2b4e85b4edf5d827a726cdb262005804f766b44e15e9080b2959249bed401880",9.317957166392093],[1831,"2eac3cf49e7e60dfed7ee5f67db2ec428966c9b396f1584b27c3876599fe0cf4",9.917710196779964],[16366,"78a0254434133a95b6ba2a685c14faa2b5567b579bdb685f6496b8a7f943bc5f",9.317957166392093],[3304,"77024ca5ca9ba732381971cab7ed998e30ac007697edef46c6307487329f59ea",9.917710196779964],[6725,"ea366151ebf610f1d623203d099185a33751fc5020229808ab512044075bcad3",9.917710196779964],[8323,"5d75f33bdfb9b0112a9bed77ef23da39f77d670318ab309d5bfacb18896b2fc9",9.917710196779964],[8270,"b3ebb65090aa8386099a130aaa982128147c902074e9439f4055c378b08d84c9",9.917710196779964],[3655,"dd844deb5d2924262c10639639ee08767013ef54bb873b6aec4c795d9bfee6e7",9.917710196779964],[3936,"347195e7bccd1cb7f8f68a8f0fb19e1ef66764ad61ccf288e1a12848602c1ee6",9.917710196779964],[15645,"50e214d0bd383adaaa452a36f648def798730139ce81c4f64eb621d359c37370",9.317957166392093],[11838,"617696eb85591717070a7561024a2f9bb0d160139237903b8559d9d70da07bb2",9.917710196779964],[18054,"0c6dd3db06fb0dd3b41844a646833ebed36f90d8b95f5f83df7cbd67f25e253c",9.317957166392093],[4206,"ce53524a275626161e1856871fd76e370d7bb92798d66011121e9020026260e4",9.917710196779964],[4280,"747d6154313f3750b330e6e60872511bef7fbb6be722d390f9dad8e0d6f6e8e3",9.917710196779964],[1646,"2a760356541a55ee0079af6e77aa37e68409ba9d007e3c95db1e46ed1ee349f5",25.968141592920354],[3827,"14415e266eaa9527ace54c7c3c1fe8fb38ce136f69e1d0216a8f353cf388d7e6",9.917710196779964],[18724,"5a42c75bc74db2fc99bacf7d75267e9925947bad2bc98bfa28dc142ee75f7d29",9.317957166392093],[2368,"319843fc5eac450b2718e079352f6eab5be50464bae280a85c009ae6428ba6f0",9.917710196779964],[10931,"5ffbad40ab3f5100677bc6464c0d3d754d0ae1aea1fad597efd2b15964bb7cb8",851.3004484304932],[13649,"d8bf9a374217302ef83aedeef1c45278e71553486005423b29c4ce50a8413d9c",9.317957166392093],[2990,"8d42a27110ea693085ae4d505ea5a019c308d05a783c5138ccf65c93550b5aec",9.917710196779964],[19625,"e9d46cae3c53fbf8759e29eead51e4f80147e9fcdb47df69b73ff0b9a4e5be08",9.317957166392093],[6691,"3398d910212fce2604f87d822f3de80852ed3c00dcc6bb4ce8453bbb16a202d4",9.917710196779964],[16732,"fd659900cd2c6f3f844ecf7906ff5b6a9aed2bf0fb527ff838e0c7e15d4eca57",40.57627118644068],[18074,"3f998776598971ab08a8e1fc77b3a7a1d70bee7d5fc8da65c7cd721f88c2a33b",9.317957166392093],[16929,"dd46dc1e62bcae900e8d32ecba3f6fb623f004c35cfe5796b5b5b90d44a88353",9.317957166392093],[1913,"6ba9a514eee291ae0f76fecf5c033e926168fbaa70d61e1ee1fc7fbb8e2593f3",9.917710196779964],[5111,"4f57b98cc0fa374287f494a7dd1b6507ebcfaf060c494da3358b6df3aee982de",9.317957166392093],[7186,"54fe5850174827c5354fa670cabec84646ca805a0109614aef1a2f3d0ae3c9d0",19.11401151631478],[10901,"42423e40b75698831cb286f6c6344badf5b7975334f3b50ae5a9d97791f8abb8",9.917710196779964],[1514,"87cee4394190102477d6ecb53b5ff10865eb0d0451cd1b86bd63cfa50efa00f6",9.917710196779964],[6941,"bffd3b8dd2d58fab20dd3a7ca9f3603789c9a067f3acfdef13084c3a40ba5dd2",9.917710196779964],[7465,"cafc20542e5a0eb9533f0724b7ff015fe53a3f94a10bef900fafa1e7d321f5ce",9.917710196779964],[12149,"f3cd37aad9ab23f0d8e8066a1098186e65d4f91f85c1af719996ae632a695cb0",9.917710196779964],[6105,"c34e5954db20618047f373d9a96649131c35da0886ad80fa4023149a2eda65d8",9.917710196779964],[12298,"11eb10f0f9e4e1b4a164c3383ac54ceb9781a310be47c956e20ec703f15839af",9.917710196779964],[14829,"69422bc03e89869bf669eb14dcb51a1f9b5a3fcd8d72f6eb8834f0357fc64b82",9.317957166392093],[19202,"0af6f4146cf29c77e8616afe36a2c8e81a6fe1cdc4fae376b8d4c7f2029d8518",9.317957166392093],[13850,"403d6939fdf2a734796fdd154b91b1a1c697140eb1fb94facf1cee8403d66a98",26.128113879003557],[78,"ec2955accadac5901613860cea39ee141937d47095d1b04f4967a4deab787cff",9.917710196779964],[12844,"a23ef077ef49872becf73a698088ebb96c98feedf1cae98dc0194a2d489da2ab",9.917710196779964],[6216,"f14e9f182d8d8875761401c91d459f44e81b2609b782921cca56d939c74ea1d7",9.317957166392093],[5631,"3b7152d60b9a4f577a3770968b8a5b664b977a2298226f3b1e3e66c566f570db",9.917710196779964],[17357,"e2a464c519e7e0c49f73ae31ed16640a435d03a17cf199ce139373844783c34a",9.317957166392093],[19416,"374dec54189564adbc013506625f2b6fc9db0c1afc7347342d63afd8e479ea10",9.647446457990116],[7010,"dc83cab92a4e1ecbf6b5a752bb42f4ff2feaa529e689a3850a7191d4d397f0d1",9.917710196779964],[19309,"1182e88a510c325d1b9ae6c11adf03bce34628dbc8e6d63b0558815ebcdea014",9.317957166392093],[696,"81dbebbe9dfa2a0d59128c15b3b2681c74f204604df2c83172d7a44bb43d44fb",9.917710196779964],[12434,"888fac3854a76e6bbc7d0adb823211d82a1a8eb426bfa5fc2b0bc87b7f365eae",22.385887541345095],[631,"f84f836148dc745e5b9b5b48624c8d6f43e33c94cf9613701cbaa57a321ab4fb",9.917710196779964],[481,"5c6e5d608d7961b23d6011395653ce59aa435f5e4c3b3380298cbba22d8fc5fc",9.917710196779964],[16836,"1b9497477ec727f2858518db5d218f687fe786fa40c13e7c8a0d76eda18f9155",9.317957166392093],[19607,"074712160646d6787ec40a721b3c1b975480c36182d85e6fbfbb93e70831c809",14],[198,"b3043b07b24255a7c1ca57edc08399d92568930907fad7428979ec805bdca9fe",9.917710196779964],[4723,"a88dda10fb6fc13fd6600c5fc103288277b1ea6fad027226784d7f73ba0ae8e0",9.917710196779964],[6939,"c673968ff562b2a33c58fd21697f7c32f92b765097788afca2047c2b7ae55ed2",10],[17417,"6ae4411a2b41286e06ac3036edbd8b24db449656a3a2f106734c2583c9f26b49",9.317957166392093],[5863,"6a907c77b81ae3c8a05d69fcaa1b33da61a7889435ad6e14aee095ae0ae0dfd9",9.917710196779964],[8699,"4400fbca956fe35a9b742b7d737886c4a6fea60ec101cec05c8bb6ee60ecb6c6",9.917710196779964],[1769,"d524da19011a03720ed5b4dd4d1e9257f5874df5a05ad33e07dea81967e578f4",9.917710196779964],[19174,"ec63700eba95f8e19d4112ab748473f910b9a5aeaf7c7aa4b59877eb702ba019",10.052724077328646],[1124,"73f171a0816bc800bcedcfcf834769c21b495550b92e36846aff7cd5afc970f8",9.917710196779964],[9892,"6f515b4744178407939ec77099ef451a1b1d9edda9d6638234fa40c7343efbbe",9.917710196779964],[5215,"ac7126ed986150a1a8f2e416195e47d636ecd18ca44f6fa7f229bb717f36dfdd",9.317957166392093],[494,"92c211dbe043e1d4406a571cba4f878a51f099bea9db035c0e5c0ad03267b5fc",9.917710196779964],[14970,"5ba0e06bade98463ce4d674cd8c0db3dd31645b6641887a3b3af51e5ab2d347f",9.317957166392093],[10995,"0c9b258a16c4fa6b8a7b9407e3c67ac42bade091d59d2fbc6d741e83d96405b8",9.917710196779964],[7540,"c3ca8ad62f5f283db2c8d035033df192c557cfeb9adb0ebd1248f80db61091ce",9.917710196779964],[16421,"45406498e22f27bcfe00a2ce71db770e32d1d0496aea65e1fe5ad3e04f6faf5e",9.317957166392093],[8804,"19961f7729d76d9a4d3c47ff454e0d4ca1960d7e050af7509949b968f9f00dc6",9.317957166392093],[10813,"b76d4fcdb6e45255ba6befb06aff03acc29a90ecfe71011de718946f939f34b9",9.917710196779964],[14282,"53db6fc0c0b3e4f1c8e1164d393557ea69a5c6b56fc00db0d4f2eb489d14108e",9.317957166392093],[13164,"5ab20aacc4da62c2cf3dfbbc74ff7457502bea5acd9d61f8413ffa4f5ce5b5a7",9.317957166392093],[14883,"489ff98e24fd7589617b15bf42555592a2a06178b4834963764afed9825d1281",9.317957166392093],[10108,"a1c60f610c6f8ab5916b4774685ffdcb13f77702c408060d7ccfb74ba835a3bd",9.317957166392093],[2031,"3d940b40bc3a5e0c74abdcfe6f51f3175b5577f5677ac3c43e8d79029701c1f2",9.917710196779964],[14225,"53364527a2e1a2278d0d968a7efa69994d7139ad663afcd3c56ed203d525918f",20.027063599458728],[4823,"aa70bde0986d06411aa3aeeb0b35f0a45507df115f8cd84ac54835050bd141e0",9.917710196779964],[16934,"3f891bc63febd1ccef7b5ced9147243e8837e1e041445aa389ccc27f9a336a53",9.317957166392093],[14081,"d5612784d86b6961ac72ddcea8c2324b41656b9ed79adcbdbb64e52274310493",10.052724077328646],[18156,"a6229fbe867b091fdcc5291f09bbeae90aded0075008fa1b8902a5dcf5e73239",9.786848072562359],[15145,"f39d0956cea7b7699cb5ff070c2b411e77bb948e27eae3b7f880d054d0a4a17b",9.317957166392093],[11871,"e153cc4a2f15ec7f8104643fa32a40251b84eb5bacaa20fce1733657e3c140b2",9.917710196779964],[18568,"287c4113763ecb2a41c7903f6214a7f7dc3cb671116e1d60f46347cae317f52f",9.317957166392093],[268,"b65105775e980b0dba6aa74c719282be77090dd3d989dd64e49dd3f1ec4325fe",9.917710196779964],[10477,"725ac1170c537fb25a1de4e9c6a8372b7ce8f03e290c516812a6694a7eac48bb",9.917710196779964],[19482,"851b182aa6de4647de32b3f33d11caf50834022f9c58ad71ae061715fba2190f",9.317957166392093],[5211,"38f5b3163b5dbb9f347b7bae8a56f16b1e3832ac8f2b739287ec4f14bf2ceadd",9.317957166392093],[510,"75c988ce2a74f584353b6a012ff5c53627e2858357039d6fcc6e86a5fea19dfc",9.917710196779964],[9889,"cef7d26b4d0c34ae56009aaf7fe3e354cb6e1bca0cf79f008b2a647ca24cffbe",9.917710196779964],[1170,"385223c2396ce6785eb1bf38eb1eb6a16c4e2f1db60a5c670341c9fc534b2af8",9.917710196779964],[13240,"0664853f93d507efb2ae7f723f8e93238937192934ba905b2340aeb791c116a6",9.317957166392093],[2348,"797ca7aff78427814bfc344d4d8a446f96c5e0de14b2c2cd181b40188db9bff0",9.917710196779964],[10655,"d8b47650f8ac3207c54af0a030cde3ae1b6ac47df01e5e1c77b0efde03bc56ba",9.917710196779964],[3149,"a6fd85e4f7d65eed49ef0a685620c68e56330fa679a58d297d60876ee4995beb",9.917710196779964],[3364,"e5323be2a2a3b362208368ea183f8defcfb1625ce32b45623f015c852baff3e9",9.917710196779964],[7898,"db5d1b1d959c3ce67f58b70b70d494fe542fa0788826168433abf258fb1542cc",9.917710196779964],[18496,"6e3db274a753b0e8f2502421d7b6e14370f874361549913fde67776987457c31",9.317957166392093],[4887,"112bdd8fe32e35160aad22e5447d95e0ccf64a7f95027c6d51ae4061417be9df",9.917710196779964],[12553,"b307bce9f8e3fb5bb6eb3cdbd471a926dd0ca38fe4cfb7bc4eb96c7e7c0b9dad",9.917710196779964],[2893,"415a7dc9dea8b74013d5469c9131666c44f84ddf27375e95b12ba3f99e632eed",9.917710196779964],[19132,"e2cea0df8761daa82ba6a1bf1f0b31fa23925d211e0f2d6f5549e1e210e01b1b",9.317957166392093],[15972,"d4dc172a38645212ebe7d15a6e8487e581ab59fa6425615326f598a8f3b65469",9.317957166392093],[19870,"e78bb56e891d239da15f1282920057d2d33ff45aef8330090bdefd1c0a562d00",10.052724077328646],[5291,"c954ea22a32d81c754e876f774d1ed54d8b1dfc8f1df0fa4743e3f18e92273dd",9.917710196779964],[14426,"016b03efacf6d017caaaf13ddcd39c807753ad294244ca27578af54f72ebbb8a",9.317957166392093],[17156,"6711de634cb8a2d4c3b87128cc17a71e059416875990f594dd442bd59f65ee4e",9.317957166392093],[2419,"2ecbf1ab8481582cc524234f2ad773d2222116c3ecfd8f06def605ea03d357f0",9.917710196779964],[18860,"67260440a2c68d709d9db4157553168250fbaa8e3d94cf9ab3267bdf2a92c124",9.317957166392093],[15032,"df2c80f23dbec3dec9190cdd9c7516c4fdd4257c0c29cfbf86473c7df369cc7d",9.317957166392093],[4024,"abeac91fb0e697b62038bf979a3b954586a57045e861490ef17f0df0e25c9be5",9.317957166392093],[9151,"ac41fd25eb5d7ee648567a34b4f69846009010e63e1625cacd46a4b9f55fcfc3",9.917710196779964],[10318,"bd2a5fa6f00db56717d9e0fcd00a8f6cea519866a7723127d28ee2f1808239bc",9.917710196779964],[17507,"ead40534b9e5b82642956ab4a4c6681030a82c6b0e79fd3f4c1f745db5e34d47",9.317957166392093],[6645,"b06ee49299767a3b5f35c50753337626bd6c13770213194dea6e9148d5c95ad4",9.917710196779964],[9418,"117a8d7b6ae1789f8d8d9c50f24dc0999d6f0d4569a5173f55bf5f23448230c2",9.917710196779964],[1841,"428d59696138bfb836b37357b009da90644e7f15fd53037c41101b9e00c7f6f3",9.917710196779964],[355,"848b6eea9b4ba56c40d208ff51336c2e7fec247f61337c27d1b178b46d68b5fd",9.917710196779964],[12703,"d8be7f2c6a289124daa994ed30128bb5495524bec7bac16be33c6bf405ab94ac",9.317957166392093],[625,"ae6e1c7d0389f2d0c772f97f57722767758c4b875c9320de15f027d384d3c0fb",9.317957166392093],[8652,"feeb9e185dc2b5d2786790c76ea9a798f2c5269066709cda7c3cd36f2fd804c7",9.917710196779964],[3418,"74186044adfe5273aa51325986c3d5a5e223240fa50c75ee8e49cfebd9e08ae9",9.647446457990116],[7119,"917b0cb6110efb53ba73566a3ed245090d67f13647dc9cdf93e8760d5c5334d1",9.317957166392093],[18085,"fc4768cf647fa4241e83b31ff07fb5913af1f0c342750b7c72d52f14ae26613b",9.317957166392093],[2814,"3932bdd26f82f6fb1dfbf371f11c8e732582faa653caed6623cb3d928b8995ed",9.917710196779964],[5619,"6bb0f4ec6d6bd3ad7f3eab55090a5e594b64a436969e712bbaf95a2fb53190db",9.917710196779964],[1608,"9e2c0e128cad52e55e344b2f9f19345df995ebcfd8e05d8428e782511aec85f5",9.917710196779964],[6435,"4e96dd1c3757a4c6318170244cdf27312936552c04525cea9149a9bef66806d6",9.917710196779964],[16141,"ff8bb32e1f853d0385a7c9ec1841441cf453d2a4337a889db947f73906883365",9.317957166392093],[14275,"3abdebb52209c1debb082d47eb0e14ec49c5e265422ea97b3339339bfb23788e",9.317957166392093],[13227,"826b7710d0edd2137524d26f927c4eb6763deb160822852cc4f9f6042fec57a6",9.317957166392093],[2599,"0efa4848266fd1512b57aad145e45d1e56059224020c5391943dd1ef831929ef",9.317957166392093],[9132,"933f4bee61ff8b9efc1deaa1c13994ba5b82f6f6c8e359a31a45848eb984e6c3",9.917710196779964],[16275,"32890eedf05f9777ba479ec42c440fd318de022c2f62fdc604b7e8a214b1ba61",28.870307167235495],[10384,"79cf4b27a7c91c24c9d3568590797a6fe343b36ab14fbecadf9ddd553caee4bb",9.917710196779964],[9178,"0a3b7cde99dcea3b913c71222a910d21f474354f04c140043bda789c7309a1c3",9.917710196779964],[5920,"0cda36f2f706d8276b8c9e2727770337acc0e0beda2e2a7dca16bc899aa194d9",9.917710196779964],[5949,"0d60da893707161222c2c73171c194e21e5296d8a20c5e8aae38e85ab3d86ad9",9.317957166392093],[6017,"d4fe9a119e56c8204a571b25481f4d88d243a2a6ed13a98c22fdd0f4bf18f4d8",9.917710196779964],[16054,"aae8f207f549d2f73da9484fe9210fb7bdaca1ba118a079f3985cd58268e4d67",9.317957166392093],[3636,"e4d3acd318111ac5d37dad732c05f2b1fa1729b572d657df31d1a0c4574406e8",9.917710196779964],[13873,"3f82517f5ae2d3ace2c82a2f09ecc5fb46750da51526c12b50ff014e98e4c897",9.317957166392093],[8042,"ad820ceb47d00b23ea83b8e32b43989185b28442cda31f920cc6a772e6c04acb",9.917710196779964],[19815,"6c3ad30342982930a4b34578b8d00081c0b6ffa69e8d3956a7acd9f920092702",25.84024988844266],[18082,"fdf7774df05fa8e4699c4e40ca8fafddc90329276c6a5d3000ffe87374c9783b",9.317957166392093],[16896,"76958861bdf550dfd1d8e3e50a63b3d5a46449b78c3f8d28facd5c25f72b4654",9.497392881432782],[17841,"23c0789c2e5c24f95782a2090ef92a16567f492d21f0d739f35c158847267340",9.317957166392093],[17467,"e81296f63c168564dade21f4d06a1f67795714a446fc751297338f9765535848",9.317957166392093],[3456,"f065505b4bdf3460eb47e57d10331ad16c50f3f447f8f07e3da5dc780ae956e9",9.317957166392093],[7587,"007ebc734567ec9b12782d3bf88a05d2e0e72e3ef7878ca232dcc1029a3e43ce",9.317957166392093],[7058,"a4336cc4fa37ecc9234bc61f15ca21648066e4ce2f85f9582a99d1cf22129bd1",9.917710196779964],[3846,"f01110568118ed7dab10f4d28cbf5ce6ea3f69f1bf460e5614c750a28db0c0e6",9.917710196779964],[10667,"76e77a1b083f53980e14c55e4305db0356b46b0acfa6725aa8402a68e1353eba",10.052724077328646],[19700,"0cfceb75a161a7f576bda3fe899150e77028cd41580c2df6d5a9070236e3cb06",25],[16999,"ccde38a92c4fa59bcce045964be2bc6200cccb08fceca1e21cafd053a6df0552",9.317957166392093],[14192,"1d9e0ebf33f2a447d90eec21c7a7ea8be5aeafb57b169f12fd34af487d6c7490",9.317957166392093],[1584,"ebbefcca1a1242b76250e397d68e63c042bd146aa12dedc6b2f934c4bdeda0f5",9.917710196779964],[1674,"848851b32dce383b29cccf656c0dadd6ac0cc71fdb89a915e1b026b3c74116f5",9.917710196779964],[10675,"1ea9972022f1b2e6cf2a6b54bfe12422dfba56ebcc6aff13876704178b5533ba",9.917710196779964],[9652,"e1de370ea7c80da83d71d4389450d2390d9411243a3371dca26ae40683dfb3c0",9.917710196779964],[5255,"f03ab5f75d18f57b8f6b989b3a36b25b5d9b1ef6eb35c80dc212a5eb2affacdd",9.917710196779964],[11862,"c1dfadb918450cb37f6861a73ac4bbcd02b7c2c372ffdd780eea25a148454ab2",9.317957166392093],[10382,"7743ede84f614cfec144dad17ffb8eee564a22655fffe04bf0bd29bbc63fe8bb",9.917710196779964],[58,"c243ca0af7ca8bec1b9221dc85edad8600ab97e28ec7e5a23e3fa4b0f04796ff",9.917710196779964],[10027,"05993c43d0fdfd17dfa05880a6aeedc48cb051daad12424508e0a6ad793e25be",9.917710196779964],[13870,"5de26e91a5e8a762ed3a4a75a2085290b9c0f48dd21a4053d090f6445d25d897",10.052724077328646],[15192,"45b8f81f24bae1fdbb4708e1bc9d378def66ece2e2be89c60fde76410c99b17a",9.317957166392093],[11988,"3fcc000c93a6a87d903c5419c062862a8073a39b3b473d336e9b179b47b763b1",9.917710196779964],[9102,"63ddd9b5e32386ec907699e4c871a5b5f310d38fad9c902c1c6386dfdc2a29c4",9.917710196779964],[591,"0e5b7dbb84fec96d2b1b43a8663a8d2b0abee3847a16300f99b75ff35b07f8fb",9.647446457990116],[4939,"49b3482b5548f007afba1886f2e58cffc9ecda269198cfc247a93f70986c96df",9.917710196779964],[1525,"a3376cfa56fe9419a9dbcbb3b37543ec7744c64ec07b5de2637bc1923d7af5f5",9.917710196779964],[14028,"fd0c07faafc4a7c7f80670f7d5859ecf4b701f1c7c3a4931b8fbfa1a1c772794",9.317957166392093],[9723,"6c2669104f081e2f992b3a6ec57a043f8886dbe24b6a4125f1fe8f89f26d31c0",9.317957166392093],[12584,"73cec336bf9fad2e0e6e9994e08a9ab4fb7c04c09936c89601edd8e5856561ad",9.917710196779964],[403,"a854d23dc6600ca8a6ee892645b874b4bd2a29709475af832a1ac8159bbc50fd",9.917710196779964],[19317,"95b9bc420029e8d307627d49950a38b89914964af1d7b5186d6b8371ff6f7114",9.317957166392093],[5692,"8f6768fdadba701535af07d0d9097d87594281167bf21add0c4108de118716db",9.917710196779964],[2853,"930938ec80ae3918350e358041a5d044a88c8f603495b94c2817722488735bed",9.317957166392093],[15849,"13a6b36cac84090e8eb317fd22a504e0783c29bc6111a273c5d15350ea343d6c",9.317957166392093],[1863,"7b735ed7f10fda9808e6f1074bf6cf53daedbef39f2107218c2a523101bfd7f3",9.917710196779964],[2572,"46bfe93fe51dfa38483c23d5b37b7897e058127b25cb924e1c9c1ce8973867ef",9.917710196779964],[9621,"f5f33c373f440a07b7d23783ab1a40a85a6159fad3453cb4c55161ca4e3ae7c0",9.317957166392093],[11200,"d001d0800b59f9fbe857f40037870af96868350e0620e9eafa28130c760bafb6",9.917710196779964],[3609,"b59fe1216cd142a178d66b898febc8e642d5b87e55845b40d3c3de9d722b2ae8",9.317957166392093],[17559,"cb8ce5b053378e471c016aa87ee9aa6cec5d78c2318407fc6526d9a235695846",9.317957166392093],[5872,"70cb06cee0a17da163da1b6179c6424804aac7d74263127eed01c5af2ff0d9d9",9.317957166392093],[5360,"6788f9972fc3f1449a06b41023100b663aa7c97a1c1919786228239b104916dd",9.317957166392093],[7395,"9cdf03d2d6bf86abf0c6b4c05dba94880fd7cf706e015f6075e857b5494272cf",9.917710196779964],[6329,"4b6e558aaf7dd1e21500534e1fc9bf4b5900b9753bfcc006a8bb9f51d49ac8d6",9.917710196779964],[4910,"c62939e4f89a4529c8e662927fd34cf5b1f0c3adf1646db380558f7edf0fccdf",9.917710196779964],[4008,"512c59d0ad7ae3ae1299327807491f76b14c5db79e69148782b5cd08fe9cade5",9.917710196779964],[15938,"3eb0dfde0c3be47cb5f599eb9d650e7d3518537d074913276ea402348f6a3e6a",33.78010471204188],[11823,"37096f48379cc38af536079174849b3a1fab407a6d2d83a1df54df856eb68eb2",9.917710196779964],[6861,"894d5726dc9719fa1df6bd710312738837288a55b719b860dac6825d4b9de3d2",9.917710196779964],[5022,"164c43f3af83f6cd68b57eb476e9a0930d2dbd0852ab22959e13400a52ed09df",9.917710196779964],[12658,"bd5c815700fbe03d2e59c33f6dff9d272c8119059093749f9fde1fb7ea49e4ac",9.917710196779964],[5959,"e81da48f556b83d47ad9f3a4026318823cff67f327efba4c92b199b6222d5ad9",9.917710196779964],[9217,"4f5938d06342a33d6cafa7e6ae0b513534ad69ed020c8b706c0ed46bac3a5dc3",9.917710196779964],[7863,"153da0bf44c8f15c5bf5ef3428a3e7924d05ec0c1ed29265e8f68188b3cc76cc",9.917710196779964],[14728,"fd06f6a45f519c138ebac7684fe5d548a40452e80a665efcdb15ac71ab726484",9.317957166392093],[9900,"0e98a629b7b0003970ef142832927653aa4d4b2bba62f54e35d04a499a5feebe",9.917710196779964],[18034,"c903bdc509ad3355ae6f3e8d51953a4d4521929b8a2c26d5a55e9ef56aa1b33c",9.317957166392093],[6545,"353b11333d372123401b74f850f1dd9aebfc48aa3cfb2e1cd3d187c25fe90cd5",9.317957166392093],[10911,"6fb7b1f897deb618fde77fd169ceddc7529a19629519150b9f1218e598ae9cb8",9.917710196779964],[6787,"8dcca7f785caa71eeb53aa7474c0f15e7f836e4474968ba2774011beb6f260d3",9.317957166392093],[8111,"6ae16a286c3f475ee2110979a49c4ad383a4f2bd30ed502dc8a538bb79bdb0ca",9.917710196779964],[15804,"7def39126c0a525436debc0eaf1d01710a76e2d94565fa1d3f8d4e3fb7a7476d",9.317957166392093],[1199,"602094ca23d8a75a6c0718c78949416cb101ce0dddb6f4e4567bfba4daf305f8",9.917710196779964],[19096,"1065289496643785985041838cac3ceb0d24214cd7ddfd3067e9e97140daeb1c",31.333333333333332],[2295,"6dc313f4145a8ac843faefb41d31a7d901ae38fa9772493ece39fb0c0bdb09f1",9.917710196779964],[3267,"b267f90ed54a295dc98f890fe106da8747e858a9a70dc84be19adf5bbf2194ea",9.917710196779964],[11212,"61cd0e150205dbf458401cecc77fa050d32c8559ee94bd4482e55c2056cd9cb6",9.917710196779964],[15250,"09c2e57c95fb65fe00f6f11d2c2f888c3054d83ef4e4ceaaa8abc13ae0586f79",9.317957166392093],[16097,"a171b857e01b0416022761a061882ef9714bfe13e21dca2658d325a1213c3166",14],[4407,"469cdebc93440d444c3c1524c42f3f4e53ba74bb6b60666d6dffa956ccec08e3",9.917710196779964],[12268,"cd244a6ba7adeead737c9b49885f59ddf915f31f5bfaca4ec9e0d9c71bea8aaf",9.917710196779964],[8758,"5ed497a8544d2789863805674cfc8db075b8f61566451af60db2ea5cdb8348c6",38.00356506238859],[15112,"166d0802d8caa07039094d92b2531572f75c66bf0d2307459899320e61965e7c",27.141361256544503],[1148,"82114b7ab04d455bf15c6445602301632a42d328ee7754d8ec60b292e48352f8",9.917710196779964],[4537,"3076157ac64b0212d9b0bec1c5f2f9eb52e7ad70b886c0090796f53713d81de2",10.052724077328646],[13080,"96712839aff92ef418c4a1e5df25e28a9da0bcc2bbc6fb588125ac885c08e8a9",9.317957166392093],[15049,"5a963f22bb1f16dee10df63e40889690306fb59e57f982f0c48f79ec460a8b7d",9.317957166392093],[6375,"fcaebf38f3d8b35ea4c54a201f2af2d67368afdb682aadc623e39af63a7277d6",9.917710196779964],[1238,"8b65f8d50b2c6dbdb08c34f2b0a71e4e2440b9707a016c9b6ee6513d1669c6f7",9.917710196779964],[13212,"116104944e6370df72f07d3ce361bca0d725e8c01ee6996e39002b436a31aca6",9.317957166392093],[14760,"caee008d922495e1d06cd2db7166bfdf071cc0e7474a90caa045ec776ff1bd83",9.317957166392093],[15041,"bc41cc404d23cf664356b03937164f5944746d13aa6af38d02326522cca6b77d",9.317957166392093],[17644,"6de1d1bf3f03c3ee2b89322f8ebd3cbd25330c1da6594bd14b5d91b0ae9d5544",9.317957166392093],[17870,"f0bbc5ec02c6000cf590aee7a3930687e4173271f6f84a24f6c49a3324a9ca3f",9.317957166392093],[6228,"15408723cb61820d49381a917c3cd48df6b9e658a2f3d99273d299c7611b8fd7",9.917710196779964],[7603,"729a4fb382b57e5524f176df87f811232e9e63ca5f9542ad555f5aab74362cce",9.917710196779964],[18240,"f9070e83d10fc43b93082cc64c62412b50fe3ee84d775f2987c204da7cc02a37",9.317957166392093],[8321,"88fdcc3e1b734f5dd05352d444940deeaf78ae0cc40722772fee3cdb016534c9",9.917710196779964],[18286,"2c9f3e54c5ff9489bec32900bfba9f4b4c4b85695d7b3e1fc0fd510a2bfa1b36",9.317957166392093],[3062,"663cf6a1e38ce29ac53edcce1ef6bd784d5c26553a2c9d56be6e5f4e6796e5eb",9.917710196779964],[18810,"ae495fb1d57f191d2a3a3acbac6b0ad02a67a53f8f41082aa04c295059f96226",9.317957166392093],[5520,"672d54d6255270f41bb0d22e4cdef9e51e3cb9d6622dcf1bc5a7fa14b02820dc",9.917710196779964],[12814,"f6938011e3f2943c9e8f97a66612ca152bfa775bd2dfd236715aba81380ddcab",9.917710196779964],[1441,"7f3d34828bb194f9755e92c0581f3df98c5bcc224df8fc704c77a93dd8ae91f6",9.647446457990116],[16945,"6bda02232f6bd5ba44f7616692000c40f2b0f191327145f217d2f652a45c3c53",9.317957166392093],[9159,"e988a3a85f0615bfe924afe4b5179b97c40b01b55fed2d73917991cbaf6fc5c3",9.917710196779964],[2622,"af2386a40078ab1bc358dca82c460f6e05d9e806065ce0833addeec28d440bef",9.917710196779964],[4129,"c104300a92380325aa72dadbe6b4bc9ad0241965137178c9dc5cd7a6b5a8dde4",9.917710196779964],[728,"f8bb61579436717ae351724bfbfd8dddd6e226c59b31ff182be8de3f895006fb",9.917710196779964],[17931,"d4aa9554a40609f5f4747a221eaa0dbd75bea9ebd9a710f329291e3b2432aa3e",9.317957166392093],[2129,"98e97f654466682ac455710f15cfcfab9eb908c53bfea845dc565e1b75220cf2",9.317957166392093],[8088,"61e27a4ef0bc6e2c4e473d934b28e21b8442a31bf8ff550bb145bf19438cd7ca",9.917710196779964],[17205,"822cf2ac5db0eb3cd49b86f797b49905bd1105a7ea38aa777a02be7dd951ac4d",9.317957166392093],[9675,"c1fd7a195d1c46c163c6cd18914af9b5ca048fe8b899db820e75953736a08ec0",9.317957166392093],[8054,"50646f2028987c4a89e7c2597c4a7673e4c27d823c65b97aa0f184d64e0423cb",9.917710196779964],[10105,"4a69500563514f856737a4f848f7307f254fcc788546a3f8fc28cc4a3d9daabd",9.917710196779964],[10126,"33f31f484ea3bdcf68ac066fd93699c109fe2d0495c47fb9d912936aaa0483bd",9.917710196779964],[8150,"e04d9bb8b68e253cfb2f0cc0e5f6db0aba0113339ec5605d53d18fb8f5cf59ca",9.917710196779964],[19030,"c0854c37681a8ebfda9083777e9ce94a5c3d48429cd3c82055165f44922da61f",9.317957166392093],[17191,"7599d9e23200d7f27c781f00965854fe0239bd23cdbe6f04638f741d5895f04d",9.317957166392093],[11780,"abcc88ea5d6f6856dee78b71c8a7b0e6ec8dddb3df53663ab72e5f14dbc6d5b2",9.917710196779964],[2439,"18eb704376f377f6cd0e8487745edcbb3d0fb5a7f21f8aa94e75c47c5a6b3cf0",9.917710196779964],[11199,"86a828ad40b3232a05183e44779ac29b39797ec4bfa06efd12a93f84c74eafb6",10],[10219,"48262527491a18faa4fd1ff13c1fce7bbfb291ef9d898f0a078da4be5c20d7bc",9.317957166392093],[4604,"b56cd5923a0f2af65da20664935d7f564545eee7eb6542dcaaed7547121d9ae1",9.917710196779964],[13950,"cea4c4b01111fa62db058874be3d38d70edd6c52502e2f24ea4f80b57aaaf295",10.02375296912114],[18900,"afe749943915ceda3355379cfcd89b59b95e846be6dfb9965baffd867f5d8023",16.884955752212388],[2689,"c30db1c446066275fba0f45cb5397e05a3e5790dd4a4060c853aa4c8eec48bee",9.917710196779964],[10891,"79facee009d61993e6d34605600ad0e99f1afa04963e1143080836a73cb8b7b8",9.917710196779964],[170,"517f18ed0e5ed3d3f6ffc1f832476683f5b9372f28ccd69d59f19c5be9bcd9fe",9.917710196779964],[19244,"2bd5f829f42ec16be651043ccd6df284c8817c19add525ebf4d714ebbccb1317",9.317957166392093],[14682,"23ddac1f22ae8aee055a6fb6bb9ee99102029ef05954b7792eaee8b8feee3b85",9.317957166392093],[8596,"744917cf2f84034380a5175d25a8e5bd9aae5c324f3ee055fa074f0ee64f79c7",9.917710196779964],[10496,"88eb3fb14f8a4c1dd4cbae5e09e30daf684f7d8323911b6845bab86101fd2dbb",15],[12384,"f97c27dda92c5a559adcbfbe37479b4f4f16cef21a5e5b8930d3fc415dcdbdae",20.016246953696182],[11543,"23eac7bc7e2d5f6b53b0f080a3d6af681f15c5d58368bf5ad3088909352845b4",9.917710196779964],[1790,"aba1042afbc218f5f648cfa61e25e4fe7ff884f7f8f08f2c4f5b350da8d54df4",9.917710196779964],[9269,"694eec6554acbe5c3f91e44a4c47004a53a6cb543b28ac7e43a2f4da72460ac3",9.917710196779964],[2974,"0e0890ee47341770faa786bba80ba2633be6242a64021c483f0af4fd76e97cec",9.917710196779964],[17272,"a99d48faf09714f637485b0657febe757ef6f061f7e0a93c00ad413998cab94c",37.936395759717314],[14299,"2453fb8f54214359afeec6c9ac9d7dfb7780f504ff39d41b17d10113eff3a08d",10.052724077328646],[9134,"3b35e0538a9bd049259fadd6b74a6e87a689fe2356ceffb96afff45780e8e4c3",9.917710196779964],[18881,"1425d7b4aafdb87d770b2232e19434960f35d9e54a22ce5156a307f0ec2d1624",9.317957166392093],[9809,"d7fbf46465105acc2de8962e7922304bd32157ac374f256f7b6c137da84a93bf",9.317957166392093],[16694,"13a2b914f043d461bfde84338e44516e386e9fa73bc3a07f03459443ce829c58",9.317957166392093],[16775,"241cf26d7efd7deb09a3b284ea69f0c539ba91315df52bd0ae69f6ed914af356",9.317957166392093],[10641,"5d2ea36bd97ad353059f16ca072e262c32ad1f51ac50867895adf5ebb49e68ba",9.917710196779964],[15855,"684743ac2a4c336eb0f7ddcc3b97ec360dfa5c36d6c4c17e35f504aaba1b076c",9.317957166392093],[15800,"82695e2f46305ceba26c868ef5179fdf59e94dd33945c3dd8684f44c32b6616d",9.317957166392093],[1230,"19ff93132cbf951020a0b8c40b54dd038056389cfdfb65cc8e22724f7024d1f7",9.917710196779964],[14489,"819b7456e687224a33d95ea227951c8f7f0e19e2a2254a816a07e51503f86f89",9.317957166392093],[6369,"4176f6516ecf1aa09365edc610dded7945ab2055e0eae5d9ef89834886d88ad6",9.917710196779964],[9087,"cd42f95792de5e1e29fcc90c80bd789d8bd2ea7084e378ba585660199af73dc4",9.317957166392093],[18309,"1b747d5d28be21fff03718ab42bd35f91315363c735f9f5955009ef9f149b835",10.013531799729364],[16253,"8698b3a38007b12a41d4d58dde02b2791a11d85f4fdc4b81a7cfae3e106e3c62",9.32825880114177],[17435,"6f117ae8f3f21acd812e9d5b183544840f29eeb414f349622559af0b2c10f548",28.970558375634518],[17805,"6912468457243054bc0fa87d68460d1a5fd2648c86e79ad627ee18ada2402d41",10.052724077328646],[824,"7207b0f793e1c044415aaf7a506f350cd6d3cfada257605db6fa3ba0c9bb5dfa",9.917710196779964],[19148,"168b080efea52c247de282cb13067c8b73f8ce6fb6dd5bf9e376142971a98c1a",28.187082405345212],[18515,"eb493a326db78f77cf485efc62b5d84a0b540adcc20ee2e6d6e165381fb51d31",31.05169340463458],[3209,"4c9f017c9109e85bcabfa6ac834c4c5ece396605f06abd8f1ef74116d8fdfbea",9.317957166392093],[7425,"cf3d1c7739190ada0fcaf6858a1501d7029693346427858399ed410b81223acf",9.917710196779964],[11101,"f765b552a5b2f897d596afe1e73ffd0c941385bd0305874006cfd086fc493eb7",9.317957166392093],[12284,"3ead42d8a3f579b4a6d99cc36c7c8283f63e8570d759ed429fb00c30a45a5eaf",9.917710196779964],[11930,"dea7767b897a53f1c18340dfefdb657c8a33b7898044d5994c4ca91ff300d0b1",9.317957166392093],[19300,"04a096af5782e208fa674649babab5826275c56a4a35f565908300353665f514",9.647446457990116],[15505,"c1310d2a1d8c635a9db6aa9c91088ab2ec2b5a4225111e36e5f5cdf1784a0774",9.317957166392093],[5534,"dc7d8fdadcee0acd59366aa7a4b2ffccdef7876ee7cadd1b303cb6f8984501dc",9.317957166392093],[9137,"2b856ac7dc252ea3e38893b9af68db729801f308221f51113874a50041c7e1c3",9.917710196779964],[16513,"0909e5bc2cc0313e8eec3b613ac6d63598e46ba700050c80f386f58348d6f05c",9.317957166392093],[12748,"06d131b534cbab5967f9aa33d612b4b955881d80a64e13bc69afd7fa5bc740ac",9.917710196779964],[7496,"ff2c2e39ac8ff85b5a082bd1d80d1b2773f2baaa83c8eaa1dd1e51f2e112c5ce",9.917710196779964],[18932,"69641ac41d79e4305a1dff16e6fa9bbc933a422aac6762861580660137657d22",9.647446457990116],[10086,"f0e3b431ab3fb4b2d920603ebe06cefb1040c49e8757114aa94cc3802703cdbd",9.917710196779964],[10488,"6ecc6114415fdc764931a168b3a7709d34fb5ec24ba668c45bc92fa92e763abb",9.647446457990116],[2831,"5ddf593f193326eb8ba5f62ccd9ce46ad9e351f744ff745827271216bee07aed",9.917710196779964],[11091,"62e395ddc41f949dfdfe6238b70450e9c38470b4af756032b20aa3c415d94eb7",9.917710196779964],[12299,"5d3702245306896c6ec7ea0fba5fcf0605fa41b9771f82039a73a64a712537af",9.917710196779964],[14554,"cd0ddd428e5119d94d53daed8b4cd78bbb23d911213d5110074a08f96fad0288",25.403141361256544],[17958,"1ccf82e934a94c25e79f46d04b13f700a241bad7ae1f16eaa5e5d9297df9fb3d",9.317957166392093],[4589,"8bf1799f1f533b37e143db538766b2ef6e2db18066a03c831a9c2aebcb89aae1",9.917710196779964],[16405,"54590beea2c6b683f6eaa019b318698303c7e11d5c1d8fa8a4c5eef26bf5045f",9.317957166392093],[5780,"55d98aa90e42d6c7cc6e776f1cddb6ac1865637b4c709f513c5df46456678fda",9.917710196779964],[12513,"88555c7b8a51c284d18fcbc9e739bd0588531b7d127cb670d542ec59efedddad",9.917710196779964],[17875,"bc9a88ea264e46e7e5a6f8a7e931f3ff3b8148cfeef91a494d0c7c4d3148b93f",9.647446457990116],[11493,"044a7ef3d908520cfcef6a03eae709af189531c8ed9eb370be755054c7998fb4",9.917710196779964],[5614,"6a62d9251ac1354b5ba6e632258611c89fbe7a08c6a6db762a63e7228d8693db",9.647446457990116],[11488,"2c99604923c34ac4f0ae8389005d420215119c34581ede61eeea04136e4598b4",9.917710196779964],[10429,"ab17ef44439edb9a601edaa48d99b7d9111a97eed3be381c8fd133bd8ec19ebb",9.647446457990116],[8251,"0b1bf162f222deb2a9ae9f710950ca751d929742026573927ecd63d0a95ca6c9",9.917710196779964],[1896,"4f61b3a086cd0dc5649c020358b30d807e04c622e884cf458ccfb5ebfdfba2f3",9.917710196779964],[11332,"007591f1d9a7bae33cbf3f89d9608b6da9225af7e9a1a49dea7a40949915c2b5",9.917710196779964],[12219,"ace515e56a3d2df35d0abecb1749b4ef157c2fd67c464ebe3eea88a7a705f2af",9.317957166392093],[18553,"5ab7e5aa3ed4ec03a24886a85119162ea5d25a88161830b30c5a134eff156330",10.052724077328646],[1407,"3191ce782a2bc614c77ed06496b2812024ea538cae6d36f37eda3228f0d1c8f6",9.917710196779964],[1603,"c6e3cb6cfea02b88bbffb20500bd028f58803b4f1bdc8e462868157f2cd987f5",9.917710196779964],[2750,"5c5d019ca35f0c753f37e9090bf79635c00d7691b98f427bf4e7b9fa63361bee",9.917710196779964],[4177,"0de551ba07d721e806695773233951b949176aec62bb51e90f4cf44a94e095e4",9.317957166392093],[11333,"adf5510f32be7bf1bf1385cce56f792738c591b6ac34844b817adabb28fac0b5",9.917710196779964],[14713,"a17d06039e7e6ebd3a585124ee7fe12b95b04583bf697d58504e13e846f69e84",9.317957166392093],[8125,"0fae421e4c7ec79a85af533a8ab99c4fabbce93730e121c0cba6de58097597ca",9.917710196779964],[8440,"42e10502d12896aaee8b21ecf3ce191b1f27fdb4ac81aca8964303f5956962c8",9.917710196779964],[15871,"426835f5805fc13bfc068649b8161cbd6e65213a167c91616b1c005d1196a36b",9.317957166392093],[2705,"17bdaf0be419124ca81bb0730b6b606edafe0ac4b5a1a3f3d7323989763470ee",9.317957166392093],[5642,"b4ff0656d90c646bdef6fbe2ed61a883b1862c7b9be65e6139dbfc6d7d4d62db",9.917710196779964],[471,"eba496d2aa878d6a2f4dd6f68ee768c72befbb369e8c7fc420ab8b9bc779d4fc",9.917710196779964],[17804,"3c6e43eb90ae7d690e4332cdafcdea9bd4364508eed376e990e5d08928622e41",9.317957166392093],[11000,"7b38745ee64c69b4525b09d0894c078d1ff5b591cd65d20177c422f03f4bfbb7",9.317957166392093],[9473,"a8cc46b64f607296a8b768b35679ce8c51d09d39083d22e5fb51d78032cfddc1",9.917710196779964],[16954,"522d1ea2e72b8b34ac143779e3cb9fde28a2b0b59e1df1fc00a6ea8cf1261653",9.317957166392093],[2048,"bd6ab9884d04e6536968c76ad40016eab85258c7e0d3155008dd7667dd97a2f2",9.917710196779964],[17118,"339f72dea1f85a900586424966cda255e8f504a2c3ecbb7a09f31bbd0dec9b4f",9.317957166392093],[9665,"21b9bb87c92688df0bb4e2e93769e39a1903fb3f513d835d719c6ca6feec9ac0",9.917710196779964],[1289,"9bb533f1c8142623cda1e4c1b956292ddefd2556f02e7f43ef0757a6a70670f7",9.917710196779964],[8477,"7ff4022574ef304544998d9b226ac92b33ec74ffdeebb8fb5e18f3f670672ac8",9.917710196779964],[18540,"756ce7d409b945a9745a92c22b3a0e9e8fccb4f6e2821a0faf7dc28369e8a330",9.317957166392093],[4511,"978df1340ed0cb0334eceb00ebb28d0be6a5ba870ddfac92aa76e36cebe148e2",9.917710196779964],[7895,"46b41164708b6cc4ebb57b94ada76b3332323572d4a3fe6a2e4bccabddf447cc",9.917710196779964],[5933,"7cff5366b390d5cb17904742b19ff9326bd6c8ad9eb8a1fd0e17b44558f67bd9",9.997888067581837],[8893,"4f9d8101ad2a96d790225ef9c5f292b2154e51ea2956bf1aea11f2a17b2b78c5",9.917710196779964],[16154,"7ef4d263aa068eded0b00077c53777ac7cebbee133506ba5b4b3876db6f4f364",10.052724077328646],[9797,"5ab8e68d7e3b619fe674939473384d3e822700258ad8c72447ff832bc1b7aabf",9.917710196779964],[12368,"239b5cbb0f3d0a0e53f06d9368bc4c6e1d11ed8d93c71db511c9523ef1c7d0ae",9.917710196779964],[9668,"90d8afdd59bcee2751a7080709172145a40e4b14c7e8a5648dedb62a960e97c0",9.917710196779964],[12174,"fd3b5755cbdcdced2b78b12cd836506757cb7341b3c990c91b0df205d9713ab0",9.917710196779964],[7319,"f410c7dbc40ef36351a149447c34eff678bb0b45d9496503db9499e02734f5cf",9.917710196779964],[11260,"904cc93d75666892faf59061ae264f88250bde18fb8e6a9d974d36f3a7a849b6",9.917710196779964],[18363,"4c31b53b929ff9324657222dd9d1b039db1814f91b5fff2fa4260c9add486834",9.317957166392093],[1909,"721588490659115f2edb9947c00cb7f9a67c29cc955cd720a409027a405295f3",9.917710196779964],[1369,"65d500775e30b754296cb2fdd3055fff1a9d44e786227bdded390e702a7beef6",9.917710196779964],[17933,"7f86d0a5fff0b08710f368c37a4d79760912da08f658a0689e9d9256eca09d3e",9.317957166392093],[13599,"2dcdb958e9c9136f5b831c2e5e7aa76031ce7143735569e7c26c2681a5a5709d",9.317957166392093],[18115,"3e81478f59fecd0e348ec66ac0c78b7adad9c9ac7cafc3110f84f1c9b9b58a3a",9.317957166392093],[14758,"348d91bc4f3878ae4974573682fa50e8092ae4bf80915be115276df6984bc383",9.317957166392093],[10315,"0ba8c78d2cd809cd246f06153947829c75d3e36a88236d18f8fd00226b973ebc",9.317957166392093],[8359,"c147320d269efce81b8978954bada3356e7705b06b15e4d2bab4c1a3984ceac8",9.917710196779964],[9438,"9e35dd3baa8e6db868b6ec5587aec35213ed14a94c70c2e8194362284cd317c2",9.917710196779964],[5132,"ba5f2431c1bc9d937c2ade5dbc65c572e395aa30dabac42220cfd24188e569de",9.917710196779964],[17260,"80ca1cae86d29ab95f99e11e13791a0bc537432ce4c3ca64965067955bd5ea4c",9.317957166392093],[14506,"69c666e72bf89922755980c71efd4a4914e17464cebb2d1da7ba1193c329f988",9.647446457990116],[9200,"967e32e898391df6238e53ae7c0bf65f49b1365ff7d3d749154e0fa7975970c3",9.317957166392093],[19178,"ecbb2ca443992f2db3d950f0e266f46a5e1d2bcb50ab3c52056c6733c3425e19",9.317957166392093],[15742,"7c768d6b23d561ff317b34de7a0115197a228487802e211ec924f7b134928a6e",9.317957166392093],[8952,"8b4abe418a7031623687db5931f440e09c34f0d998f24548802f0501f5f51cc5",9.917710196779964],[18783,"faa5556dea326fdb65bf14aba91d7ebfc35686fb7f8bd26f491f8271d3b19d27",9.317957166392093],[10701,"a1c160b4af99ec1b5887d8e7d07c127d8c52d8f4fde62b748c0661425261fdb9",9.917710196779964],[11298,"e92f9a78e7242d27ba21c659b3b82f19dcb20aeef80044afe5de4e6311c311b6",9.917710196779964],[14491,"91effab1d13246382428ff7fe6a056cf57ead45e4f64c7d4a4347a98c0d76c89",9.317957166392093],[10649,"142490bec42d1a23fb4337181eab23ab8b7c84653a95f07961946795b0b363ba",10.052724077328646],[7798,"337a096e3fa85481d77f7caede18d43dfd76fe60dc6d4ac90af6f0ba56c8d1cc",9.917710196779964],[3053,"18a1f87620fbec24ea3939cd9ac3345d9b837e1a4872986d7d60b1972f87f5eb",9.917710196779964],[1015,"16259c9c3ca7b36e955778c0d4c5461b03eef3c1892abc885760265963aa1ff9",9.917710196779964],[5354,"4faca500ddcdb2a3591e4c8a7829ebef41a47e9052369eb7ff94648bc62e21dd",9.917710196779964],[19843,"edd66acbb3e07d1ce3ef7ea6167750061360fb56f07053cbd9959e93ccb60301",9.317957166392093],[4947,"6c9608233ba04e047dd7bcca9028a6cb6ca44a14518c3ed14b9919dfcab98ddf",9.917710196779964],[5224,"61e5faeb1710475782d7961b5e9b952a2dbaf54230a3b0a4d97968187e92d4dd",16.941176470588236],[9012,"de93111eafc5950630cb2199498c60d472da681fb70b9bf16fe9bee290d7b8c4",9.917710196779964],[6983,"3f97c1c1c2c63c8f804c782077107af0c6ea562fd4158d44cea7aad5a8ad18d2",9.917710196779964],[7482,"fe85b00a355be3c74959b44f4c702d6a30803aac150bc1e6654c68c7f8e2cfce",9.917710196779964],[15585,"c0383b576ceac3ba37b1a38f1ce338f1588b567d1158fd3b19ea10cc961bb071",9.317957166392093],[9812,"742797158ca32ceb1e9b419d6f4db6016172e5c68e5ed72133aff35de6998dbf",9.917710196779964],[4538,"f5b207f1976afe2fc1e02f5104cce5bd9a99e1b89dd449a9ef411fc486331be2",9.759637188208616],[18668,"a6f7e1997451fd6978680675736ea1a59d7977ccf0e9a96e55493ec61725e02b",9.317957166392093],[782,"6c9997c973f672347c86fd0f38523076b8428949615515a1b59f4427aff7a2fa",9.647446457990116],[14951,"1b0f6f0708aa86a1a1b007a8c6f2b2a366e9038844732211f0cbe9952c4cbf7f",10.052724077328646],[2733,"94628f32e73164f281351624cde37cf5706122fec96149fdfa80ec01e90d36ee",9.917710196779964],[5242,"faea4aef414bb6477c6a49fd6b645755dd0669546c33ae474f3fcf25a049badd",9.317957166392093],[13004,"09a70cc44aad6b3c3c0c9006f6862edd071a6ad8e8ac3ec099f5ef3c992b95aa",9.917710196779964],[7113,"b4e699f76f32a521e22ae6788e18849eaeb257a9947f4567b9f264472b0446d1",9.917710196779964],[13951,"8ce714141ebe912f093fb70e0f224499b096d90690430243f9aed35da420eb95",28.846975088967973],[6541,"4ca808111ea5dbb663101502209e8f28e49e199e230d0d92c017f5d0600715d5",9.917710196779964],[12777,"e21918c8f16aa049d6b02a31de8d8ee6b0ec5943de32f4caa84a64cadf0210ac",9.917710196779964],[1569,"a4228cf56a41276fa6eb34d14eccd48aa3ed4e4639f9f521f2de29a5262bb7f5",9.917710196779964],[12552,"677d17890203b0e86829e366ec0a0b0dfca8b24ca306369af5bd32bf869d9ead",35.881773399014776],[16977,"706d76a0f1c7eb4bdb7c46ec117f155098d7ce350188a7ef5b03558c1fb78752",9.317957166392093],[14953,"fd3458e037d6cd7c6185f5ce27b10aa7537e951411c753a1a53089dad6d9a17f",9.317957166392093],[14454,"02d4c42735ea003832a8b505bcb1dd5c115daa10ad585a1ea072940b5b3f258a",28.099408284023667],[2174,"7951e0bfb926264c433af4c224003d574a4b59f581db11b28a64d8992f33c3f1",9.917710196779964],[4861,"a7314126d3eb234e8deb5ca62c99b6453c5c2f4ae4f6d384b1c8cc0335e611e0",9.917710196779964],[12594,"dc3cf6e91c1b33c9716e4441216e4359c3fad6aa92c94c5e0a1ceed8edbf4bad",9.317957166392093],[17046,"466edab5581eb1d23c44fb855e3e0bf4a07ef555b4f2b11665d0d436b8302151",9.317957166392093],[2074,"fad970f2505a96bbb4a2e82bd03a8ad58c14f5a41ba306adadb8c59825686bf2",9.917710196779964],[11088,"80064922539e4fad46904a2d980d7c1a0083d7bcce8642cec1d6756cdd2853b7",9.917710196779964],[3810,"e6e36ff8c0ac171c9e1e74984a2916d7bef7eac77c1901a9e92317454e56e7e6",25.4421768707483],[10730,"65a11b0b6b89f6a0cd5ac3553455ae861eba7c2999044c588df3c67e0b2accb9",9.917710196779964],[13686,"62e71a1b85b097013a256b33fda38e6dd2d6e838325c50c3bb59a06f54697f9b",9.317957166392093],[15921,"3ff26311242d1e300964acd48d3b00ea9dccf815e05bf094d319aa9605d2ad6a",9.317957166392093],[9858,"bc36f479dcc1d9ef0a5f53b983aa9f193e0fecce86adf6b65e2b297ebd6437bf",9.317957166392093],[13079,"411e50511034daae1ef0d512b6e34b7bdaf273f74ac716e75265a8dba73aeaa9",40.76518585675431],[15346,"b38c42a3df2096640e64b4819d8c678a3243e005e52916819ded9b4733d67077",9.317957166392093],[17739,"417f67dbe1cbd317beb631f46ebae1684c9082f04ecb05c30df4544677957542",9.317957166392093],[10361,"8dd9e72e2cf81cca46a0cc31175cb33a3840e15d5b5d3d4a36ff5c7f366afebb",9.917710196779964],[5851,"1d984f75930c2eb03a550d1d0cb5fa5429285d915898e7446b8a51ac4186fad9",9.317957166392093],[9266,"ac1b693cfe086a2329ebd8881911febd99d69a545c0e8878e72c8d5722a80dc3",9.917710196779964],[954,"4b0561449a226323af1a55c6caba4d6b252c5f8465304ef9db795f136e237af9",9.317957166392093],[12802,"b245855c3547cb8aa66297bb1c30124fe63c1116875ffd4de42b4ddd0723e8ab",16.056140350877193],[5221,"c182c877e0ae347ee4d59f813a98b0a4255008ea4aac8d3be7e60686ab02d7dd",9.917710196779964],[18525,"596afff568c2dc537312d26125071fd5cb627dbe559504534d2b1a177b54fb30",9.317957166392093],[11051,"545ebf41e45fe21fe4fb1f4302dc28907c84c02b01d1c203d3ba4616aaeea8b7",9.917710196779964],[4313,"cf61d1e1c171a01e01f37766d7cf0ef90e05e2daaf696c1b7622d73bcb22ade3",9.917710196779964],[4192,"4039b87559569825aca13136d048f19aceeac9a6da1c1d4987b7201d50fa77e4",9.917710196779964],[438,"7ba39649acf712af425988a45cda23505a551cea06972bd133fe1f81194f1ffd",9.917710196779964],[6727,"56f589ecb4a0462e38a05cd26c6b94d8ad998ce67fadacac24be6ef58d35c9d3",9.317957166392093],[8228,"086b01b5a29fb3182c45fafb4e848319b569fcd75a9c3f6161547f8de226bfc9",9.917710196779964],[7724,"8eb495c22d0ea8cc485aa5aa8f41b2e3748a974a6eee9c8bb477357b329457cd",9.917710196779964],[8662,"f5537918bb799c356bf53dbb3c315b37a6885e26dd29a42afbaeaa3ccb08f0c6",9.917710196779964],[8326,"58e1b65d8423c5578b4fccdc15eb6317a4284191825f435b14c675aff19d24c9",9.917710196779964],[17006,"81bdbee430593fc51a3db8e0b00eee6d3d15c8c35b84e63d6c8b43c11e4ce551",9.317957166392093],[14023,"b538f4eed642d42949f2f3b998b8c1b45d613499f40bbb6706178c5f914d3a94",9.317957166392093],[13208,"6671f0eb883229de8248cbbbce6840079258567d35eabf5667d01362be3abea6",9.317957166392093],[19791,"c9b1651d30c72ee6afba40fab143f14a22e61b6425cd4e6f3e13d96bfae3f202",9.317957166392093],[19447,"4ce2abc121fde997424364a3af5a1b8cdd1f55b4960579fcf493c6fa4c0cf00f",34.83778966131907],[7000,"8698e3d92dbdc3c776666cca37d2d6b02b3cc3a3e03cb9a31b012aab53e3fbd1",9.917710196779964],[4903,"4b91ad190a326bda7f239d7f627ed9b8f94df581e5e8e84e77e72570c0a4dcdf",9.317957166392093],[8307,"765f9c0d0810c63c8d8f657001dd62fe2c06dbc26bfd707e16978224be1548c9",9.917710196779964],[17745,"28a5d006b618a323598adafbc322148de8de65c6ba1bea2ddecff1dbc5154242",9.317957166392093],[7115,"e52a48391fcdf0d53de10adde9fb5f113a2944bf74247c996bc22d01296c42d1",9.917710196779964],[3782,"7c51d43e414200fa6094cc258faeac1019c330ee4db89e81d5dffe76cd080fe7",9.917710196779964],[19251,"b699e785ab3bc998f1b6b7ab55e58156329a77cd15dccf6c752a496e61a78e16",9.317957166392093],[1751,"0ea48e69e6061275ad364220402e238c5ced2db8c003bf09dac87a5f63ef9af4",9.317957166392093],[5071,"d3c2cd1c7e0bd444328c721aa3569f470f66a71318f7b4d33ea719da403cb8de",9.317957166392093],[9035,"b49803e248eed5e4ebeaa6285e42908abf1d0d6f9c53a0130a3dd38b189e8ec4",9.917710196779964],[12243,"d7c9b6c398555bca63b68ce95de71a44d645375714bcbc50ad75d09ae10abaaf",9.917710196779964],[6097,"c6343f4759558c08669541d701259044757c90115cbb8006798d1686e5856cd8",9.917710196779964],[17652,"917b0d61c9100f1ef771b5e4e77540c754ad12a95682fc051f31c14d94232744",10.052724077328646],[2249,"a6026b4c5242fea3cd24f4f8b49ea497e29802f0b6cf2c16e822c845305241f1",9.917710196779964],[13665,"8a31bd9be7e032b0f1486ac01e92f4a1d59ee576920e62f633d00f53164af59b",9.317957166392093],[6456,"84a12d34866a542f070bc68b9147253ba2499b7f641569351f20435e62b7dad5",9.917710196779964],[3714,"0fac8ee8cb05bb68fab366b5293b95510e97b1bbbbfd5bb527572ea6ed1082e7",9.317957166392093],[15462,"c300bb284b8b3d613cf5b3e7d077f9f3c6cbbc55b06a446029ead1d64c66ed74",15.078534031413612],[5168,"3f1ad78fb4dba97c6434a75a5fa94752b5faced6d5d470adab7b77ac5b032bde",27.026519596338886],[7993,"9e2356d5a55dd11a7da0749d53b8aec6d6e3d357ddc87329dde3f14452b291cb",9.917710196779964],[13862,"6fe6d61cdf06e18dac2b1c7a079e7027d198a402713cb057f2402d6b05e32198",9.317957166392093],[1600,"44f1614ad57a776c8049d49bc825657c2488b9b995519b48f242f2e4ba208ff5",9.917710196779964],[11842,"7f9313a3e49fbbef6970ef359157209768ad93aebcab2727ee5005f21d5772b2",9.917710196779964],[9066,"578074716d44701a15df05f4f4a1d47a7d3b7a3b9c84e061b34a0d1eb45f5dc4",9.917710196779964],[13255,"ac573b359e717d5a300327f5e38e1f8e196c00d9dd072a50e1534bca98cf90a5",9.317957166392093],[14027,"92e14f9ccf4a3204996848d9e8bf31643bb0176cdf5d54b447c67c83b1932894",9.317957166392093],[8161,"5e707631a6f98beaf4ea12767aedbc3663b04d30427ea4b2a2f5b02c868b43ca",9.917710196779964],[8205,"c46ffbada0aff76f4b78cc77604b7a2ea137e520be0be56d9c26a1d21be8eec9",9.917710196779964],[8097,"968b1bf926ebeb72fcef5b17d67597be0a8bf59896aecfde83af9af047e2c6ca",9.917710196779964],[9481,"735912bbe8c3bf6eb41e0a521dd5e9358848bcd510aae61f953a559f00c8cdc1",10.052724077328646],[2935,"770f2a0615f2fdc11f35a8cc11060d78e9515816c50c84fd1fb5f15d1b24ccec",9.917710196779964],[13197,"38bc9a47d513ad36001eed1e32e4ef131c929bd37a947f0c75c9ced8116dfaa6",9.317957166392093],[5713,"3c86448a59ce7fb3f17af4619f08050da9863eb64a47c54e24d347b114d8ffda",9.917710196779964],[14587,"f0e6432389cbcd51c8cd4eb6352a36911b3a065fb083db362e01eec3d2326c87",9.317957166392093],[5070,"35d9269a0640cc14ce04da213f6db67c8847663d297d5458897e348fa56ab8de",9.917710196779964],[2318,"8671956be4240fc1edf4b4f9ce168a87bd16adcdac816a7b74afe76ab8c3ebf0",9.917710196779964],[8412,"1b935d532015d031b1ca8d8302b2ac21b95acbcab4094b438bd2193624258ac8",9.917710196779964],[12039,"0120c0aefd86e8c46d5e883666c85b24dc094571c7c699d15e5411a2758b0db1",39.13879003558719],[13423,"8758fc1dd5521efc9bf7a6a5a19ef69c3f2675357e609f776237e5d18b43f0a1",9.317957166392093],[3155,"12dd48c3dbf4f8a5dcff675d55e436c41da37ef9cb38f1779e4c79daad8e54eb",9.917710196779964],[8197,"fe3384cb7e456acd681a7b14981712458a32c20dd7fcdb60684da9d6e137fcc9",9.917710196779964],[4473,"5e59dd22b4fd1cf8e6a498744bc2c50d99dd2c80635b28f6e2c7ad016c4b91e2",9.917710196779964],[15977,"fbd1f1bbee26b40883a4f88b4897da9a6ee9c52b4ed4ff8cbc421d1733cc1a69",9.317957166392093],[11527,"de2963893f5c9ea8868c22ea09ee21cf93ff3ddd0977855fadf977d49a245bb4",9.917710196779964],[9246,"ad40bffe4a690d120415d20005ecd7331430194de5bc7bf8ac12394c6c1e25c3",9.317957166392093],[18816,"112fe319df196ed9c6fcb86646f818dd123b9de2ad4989e05825ef68d3003226",9.647446457990116],[12940,"7f1c03f511e478518b7de3488d1ce72f174b2b7e8c367bbd80f54ebd6eccfdaa",9.917710196779964],[14409,"fa3f7128c63cfc85a0c72052a6ca5b6918acb7d6101f689a6f68c2315ddc278b",9.317957166392093],[8186,"6770682f908444eb0b9d33f77f632884fb00cd189538e7b444eb71eb159716ca",9.917710196779964],[13094,"7fc4ef2563b3686da4cbe66b1232cb95df75f69a6a429f109a6f1022d6eb90a9",12.064171122994653],[13689,"ad7cb0ae5a8e9949334a5db8903d730ab6ffc3e567ba8f5bfba95cdbe938649b",9.317957166392093],[2934,"689919bfd66732d3ccaabfa3a8496524efdcf2fbdd180ea47143915bc0e3cfec",9.917710196779964],[14859,"5db43ca4ed837d1f8d1519fa8bc85115f0348aa682447ced3ccd173278789381",9.317957166392093],[3255,"d41561169b4b37b89d65c2f684aa30b93cff5d2b22019ed8dd5bb035ca31a4ea",9.917710196779964],[3765,"63bac497f57d67e3708227cf0126d4628956cdf1cec8f5e624ce497bf1ff2ce7",9.917710196779964],[12479,"c6d27825fef18d90726bc0369c2fdccdb8c376a04d725879f204bba4093312ae",9.917710196779964],[3047,"c878ec6cd164ab14c6187739b8a7ca43ec4f0c7b83696db101fa18a58ee900ec",9.917710196779964],[1781,"07bab28d4eff5d8b7ab0262012147fc67ac52aed16d89218b0c6d8f19bb159f4",9.317957166392093],[17416,"af1e08c04c11e608faf7c21828d2ca9506b2edf5e02ca8b89baeded2df8c6d49",9.317957166392093],[14129,"8c90ab94b49ec8ee654f11a8f6c56e94a3ccbf2bf1185ba0196ae0498d7eed91",9.317957166392093],[16369,"c74ba909333c6b54a249e8f3a92da28a7d207caed9ae0a23f885088bcdd0a45f",9.317957166392093],[15587,"317b23ee7fbee7ee3a5fa1e6b48b7495e0bc2cfa223903af3d2c6e500a9e9671",9.317957166392093],[405,"25ce9d60e8fe3152efb58beb35ddc4e426c1871914852a65ffdcecbfab6d50fd",9.917710196779964],[9867,"fb619256388715daf43529c2bdcb5f3fc5dd3ecda331d7edb55578c4c9291fbf",9.917710196779964],[17548,"85a21ca0c1be91788daa820a174307839575871b713651f8b2955690c60a8246",9.317957166392093],[19862,"289b75a65ae6e9d6c478b8404a5831f675a2805d7e3e79b1e1f611a53e3c7200",9.317957166392093],[19083,"9fef031c24a95342ed2532a50f92e417c4418d892843528c9cd8a1d0b9df7f1d",9.317957166392093],[16743,"a5d254d1a44410f0b5c858d912c9870ecb111274e35d343b696a9c5bd0f69257",9.317957166392093],[1861,"6a499c6eeb29fc0bef8e1ecc6dc0e033d4e06129cf7e631cb029e80ee6c1dcf3",9.917710196779964],[6263,"50f1a27ea1d3821648458a833113f3abc7968a7d668190df36f377b7e0ac4fd7",9.917710196779964],[2186,"e6913837be9ba82bf756221f6c7e4d1d5b1a8d9f38dd600f9ef4e65d2daca5f1",9.317957166392093],[14105,"7b9cfe60f5bd97f77a351a78697dbe538f8138d7b0bd58c8187eefae25106e92",16.040774719673802],[5249,"8a0eb472152495ede1d04739935ca2968a7609d88b444f93a853b7fce79fb4dd",9.917710196779964],[4512,"d184cd5f5b7984c5ba739a89fb853dc42b43373258d6b60ae079a479c9a048e2",9.917710196779964],[4573,"434ec8f4ec821ed77f4daf144408cba017b0cc87ef5223d9cd7bbe5e0377cce1",9.917710196779964],[16202,"9aca3affcac35a8f27c64dd5c1f78fc6efa38a1bb4ed26cd213c0d2ebe6df663",11.07482993197279],[13817,"59fd34ac5f9f0b9141a65e9fe6938828c7a55ca537f2d75786cc13ed7a4a2499",35.830388692579504],[9,"5c8157e56e4879bae9d8048a3351e579a2af94f40c738ad1bb66b5275f95f7ff",9.917710196779964],[35,"16ef0e84ebe956d9fbbde12bac1460f5b34174ad189a942d493cf07839a8c9ff",9.917710196779964],[13975,"f90093c4e5c801f4e73032ba4f8e70ef39846d8592b09e4326c5b8de73758b95",9.317957166392093],[8525,"2103744d7224dbaa3e81af876317791b43294f8544a4bf368f693a02f3eddac7",9.917710196779964],[14347,"e0e060e55c45d3178b9b4efdd083f3a7ffa8b953867a9023047bf4df6a1f648c",9.317957166392093],[9290,"469770b9c6a559c5565f849da63c0f0099faf94e324ec2d70a6bc328db83e2c2",9.917710196779964],[13591,"2e4ca5eb92637aab8be2c8f9a605b4fc5d0bd2abf9a082c29df6f76ad7a4af9d",9.317957166392093],[724,"c72134ccae58202a80e236dd8e4928d622023c10ecef90d40c14c2ea06330cfb",9.917710196779964],[2907,"8185fe0700b89e497852982bd6c714df775313438d846e64ea5a52a3010f10ed",9.917710196779964],[5857,"a1f3eb0d04dd9e3fa9874507a41918833d3f5aae1d6b5f5b8057a4c1b80ef6d9",9.317957166392093],[17297,"6f909409508b96e8c5e331cc7c1bdb7783645e29df4c8b2fe72725527c2e164c",9.317957166392093],[8045,"5721df7eaa150ef21724d197551c505ced0bf9ba9435759ef22f4fae7ddc3ccb",9.917710196779964],[13314,"46f0b947e4c160aea968320e2f95c6451092ccf1af29ef50f0d37e97dfc154a4",9.317957166392093],[40,"45ca87732e08bb2d7798d2f549cdea1d96ffd38a9a3f3fab9b3495af89e2bfff",14.787682333873581],[12627,"497b0e8d55ed1b1e177e54d628cac88cd42f49c4b76e2f84112eb808a07d1bad",15],[17679,"31007a1c60df0eecd06650215d34398b0996df8190d2c3decf91499eba029443",9.317957166392093],[457,"2c9e6705697eb41925136738ef60a345e4fb914857eb2c9ae1c2e0079d5afdfc",9.917710196779964],[17333,"15f3e2033e9a74008d797261889b9452403ae9596a42a7c893afe0d38bb33a4b",9.317957166392093],[16282,"2fd7241161d6a0870ac4c8852c84c64b70348cf955e82064f418cfcc08139561",25],[7044,"04adde8f8404b290153672c075bc9d28e6293c20879f6df98d2d014b7df9b1d1",9.917710196779964],[15122,"3bdcddb459c5bc6156322f80309605b70240789f0b03c7349574d2e98794357c",9.317957166392093],[19734,"b8c88254ec6940c8e455c5b60e43b5ed430037e57a78835cca4837bebd709c05",10.052724077328646],[4492,"4360814bc9edb2229aa5eb56f971c4db580adcb5f002daab03ba6c2f306e74e2",9.917710196779964],[3751,"2de6b09b1637107280bca284c43732c940973be739066507878d463b89b63ee7",9.917710196779964],[9784,"05c0839b9dc13cd6038e8e5fdbba12e0706c81cff6945bfd3f64042536d5cbbf",9.917710196779964],[11887,"2e5111c3eda294cf3b1fab76c321980b566d3a0ab1432ff7e157f65c42ff18b2",9.917710196779964],[886,"75e505012b7c0eaee358fc4c7e6dfb3f4d94a33d8fe2173b3caf0e1aa576fef9",9.917710196779964],[11865,"a06d092ac5ea036493a95ba3bd2ed55ca8c57f0d6401188ed21937d6d7ae48b2",9.917710196779964],[2094,"d9ee8916bbd8e37de2a945df9360a9383ba540f84b85e3082935e5dee9df46f2",9.917710196779964],[17378,"51c99c0c5cbee2c8a67b2d37c8fe6d480b3048bb06b357a468077302be8a384a",9.317957166392093],[1763,"4cb722e78ccd1bf11c9dbfc246b628de3241035170ce97a0c5da4422f00084f4",9.317957166392093],[14438,"34cd60accb2202418544a35fb3d3b0376c1c8de951adc7127019f0a37d33828a",20.07662835249042],[16490,"3fdfc77c74e0e3bbe86408ae68295a4e8babab1fc69f5e63c5e35b21e2617b5d",9.317957166392093],[12579,"ddd9339482f00dfac582044f8ba95e351f4bb93fdaa0b2d7b0987b85de1c67ad",9.917710196779964],[19822,"408b7735116df5aa2b588813bf56622dbcffda178b450c4290a6fef9009cc701",45.648],[19418,"bf0eef0e4bf41a1f90e0ff15e12b13211c2d7dab771d5648beabfb88b018dd10",24.261248185776488],[13449,"6afc28ead708b65a42c873d060cee8f14a7861631bf5337b0de012cb0d9d14a1",9.317957166392093],[9142,"4eb98557d8a472916e25559a7fc741d85644c57c00d2323aa2c75b8b10bbd9c3",9.317957166392093],[8937,"76b2a82e8888bfa68d1fd5d8106883d0b5bd470069a6c61259e2646014b546c5",9.917710196779964],[5538,"f65f5bf8cd8a28b7a558602fdeaf834e4591e63e89947a484cd157bfdb8bfddb",9.917710196779964],[8562,"cd587e8cc1164cdb9b22b839742f5d7d792b6297ac5c8084738b42651b1da5c7",9.317957166392093],[16536,"2cd7eaabfbcaec9f5fd348ed97a56ea41c7d3bf8ba8622305b41cbaed6ae5d5c",17.083197389885807],[15512,"8a890d1d637287e571107c29a254ae1a37cb7a4b31bd659df3da71fb6c8ed073",9.317957166392093],[4629,"7da0ef5ce9fd2a2cc114b59d1bbe41e1a82b219596b98579a290661f26f371e1",10.052724077328646],[11855,"e663ede03cf4b6a5f4aec4cfa42aec2ff3dfd19c54abddf070da52b7a6d754b2",9.917710196779964],[4057,"ea643d7a3f43bf211ee11d8477e042760cb26e2bdf4cf4906a669796a83463e5",9.917710196779964],[6450,"7642f70b0ac8d357c2df0ac7539e671314057b7cce66c1508e84168e31c2e5d5",9.917710196779964],[3737,"7a9c485b16bff4450a98a3c783ec705c8590dc0e2eafad43838e0caf4e9458e7",9.917710196779964],[8957,"e3222bd9197e5e7a4bbd235a3819600dc241c076910b2f78eb007dee564813c5",9.917710196779964],[2311,"064b6232b8115fff85500a9ed5464897d67547ea70ceb3d905c8f68ee7b4f5f0",9.917710196779964],[4781,"0f0d149b0b226d5c3f4d28b2ab0ceeb1f17dc810a4cb1513948c6d1ce09f83e0",9.917710196779964],[12447,"64bd1ca6c7b07a6e5bb1983d3d1bf25be85a7bdb6802acbfb8a25649e31f4cae",9.317957166392093],[848,"ad749362f11fd14af04a9518dfdcf8b2f1d07af1e99b359b9679323daffb3dfa",9.917710196779964],[7618,"94c1b3beb0ebac21d42c9be9850df505a6240557c2dafc3fc821553c9ecb1bce",9.917710196779964],[12918,"57ae374d0bf81afcf0ba91f192b1f11981462fca27cbd9517ad3759ba53c36ab",9.317957166392093],[882,"97aad5fea849a7145b6f20ada93454ba67caf1763f455563a794e0fd793303fa",9.917710196779964],[4561,"3c6b912951641a8afa0e227f0150ce4a8b4feb8c98ca325cf09bcef3bb9de7e1",9.917710196779964],[15827,"b0c095e830bc238b5618d63d4c54ec3fdb6b26424fc5e4eb004924149a43df6c",9.317957166392093],[10927,"e4bff34825bc7d2dda132d715b32faac8c2a46e9f2e1ca2af68d97d0916d85b8",9.917710196779964],[17736,"23665012f2efa8e242458e26c6c74d80ca393b1ea536739cfd2175d7ff4e7942",9.317957166392093],[10785,"71a0efea48d083d567e06f502f1ec29c22caeb6bcfc087fcf1d643276e8868b9",9.317957166392093],[3531,"523fff0378cd4cdab4e59cbfb0652176cde9afabce241b91171c55306474c2e8",9.317957166392093],[1849,"0c665313497254920ea27a85f356e13220e828d95470c16f7bb5175b1b0ceff3",9.917710196779964],[13621,"24fe09ba03de6f83745dbbc9f4677da16abbc5d5c22654e6128e1ab742eee39c",9.317957166392093],[14938,"6aca92cdd3a7afcd2fc0c9c9400f06f4210fe8078be583bed1eba3be1f0c1180",9.317957166392093],[13600,"89715d48b1b0947362355bea67a1f9d0294ec789860b650231054fb82526699d",9.317957166392093],[10726,"b044a036d101dc333b169f2a71561003c9f8cf3f162cae3842bb4ef31f13d2b9",9.917710196779964],[4905,"61b8b155a08393643b629d3454230481c83c6f773889cfbf6a20765b3f87dadf",9.917710196779964],[2067,"b13c42774144117a447e68221a5565e903a820b7f16bbd2b7a8707e47fc874f2",9.917710196779964],[15631,"2a42a5bc4c8c849aac7fc4b00e536a0f344be3cff362aa1ee8036a5a9c4eb470",26.093637454981994],[15665,"2e24ebe194d27708efed803715065254855049a861a7b8018ceaae9919601570",14.023972602739725],[6799,"853d01dfb250d90c5515288cb38905b7bd79a3e0c781eb169ab4bbbb007b47d3",9.917710196779964],[19345,"12d3e8e0d548177f98379de47a774efb77f79b1bd96bd3aac7b7bacb2dc6af13",10.052724077328646],[7032,"6417492d77b8757a38a67b23595667892989e8f350fac83dcbf37a1f0590cdd1",9.917710196779964],[8706,"8bf3b37ba238b6668b79bd3db820439046573c67bafaeb6e41327b3261eeabc6",9.917710196779964],[16923,"2d03212a704043ba6ad6a07d6577ddcad4ef4016007e6fbbd9ac8c94e109b953",9.317957166392093],[16294,"4e37b8e576e36512e97058e1b0f0f5ae3530e2aff85f3519deec67bb50774761",21.057471264367816],[17608,"4b81243ca197d18b6405d8243ad06d825bb12bc6e79ad5375d87118243d4f544",36.57627118644068],[4109,"f03045f73deca178281087ce68c05cc1b12d11d06f3973886b695d00e498fde4",9.917710196779964],[5622,"6cf89e8dc416be45e94075863f946077149975b268b536dd4745823c933387db",9.917710196779964],[12422,"c8c7a4b1d0db5d93c1882a529763d0831048e271053c698b35fcbb89965070ae",9.917710196779964],[15060,"39785ddcd3f1057119ff3ccffa6653fc8e029b6a90a030b9ed8d3a47f719607d",9.317957166392093],[19720,"4731d35bc131f8c49a687b5896884d05a3f90eed1c1876152f90b1bf83b60806",45.694736842105264],[14665,"9688925f0a3bc7e73db220bcb52c9b35963bb8038c512a95e8f8d0b06df09b85",9.317957166392093],[13313,"b56b9cb9213aeb218fbb6c2ab695e7213100bf556868a82185634d64d45b65a4",9.317957166392093],[10091,"f11ca248070b5002a8afeef6c1e2d915c40afbea121d92d16086aea44675c6bd",9.917710196779964],[5981,"d5c2b03c52efb0dca166daf88f2b2f8fbafeaa7dd4d2e99a17eabd83829832d9",9.917710196779964],[3847,"46883ef978ced90327e4043cdc3a8a5c0294720549dbfd5bd5c43f064cfebbe6",9.317957166392093],[154,"fc404cb784e14b62e64016b76591d1507007bba2c0b4d545b47b49eb1857f4fe",9.917710196779964],[4547,"6f5f88e191d9e2cf42b9fe9b259b6349da813125ee48e7c70cd9f2904c420ae2",9.917710196779964],[8366,"f6d284477633df97a7dc04b5940d8d683fdc983be00d5e49b24d30380c1eddc8",9.917710196779964],[16546,"1d41d3c15321cbe82e7d6573c1c2536f4391912d6e7de4195b954676eec5165c",9.386620330147698],[10540,"721fd90bc1058b9dd3a8907140ab13b36a1ab53691ced1df4247efc493acf4ba",9.917710196779964],[482,"b978b473cd9f4e01a2634e21f5a3bf717c31d443c7b7384f044a59559669c4fc",9.917710196779964],[14783,"2e579ab71a3a7ad55214ef4447b80c0ef58f724c217dd19c80108d1695d83483",9.317957166392093],[11213,"d20f2e436bedd4f1df5c336bc7d71b377bc6eca23589aa3378291ea48dab9bb6",9.917710196779964],[3319,"9d60f7bef0c8cf9cdd33bb89c8df359e5ea4983d271eedf66c5e7243f89a3dea",9.917710196779964],[12539,"5b2325fc59b3b06f01a1e795afbcc536f34954e6cb8a7d8b99419d0a10ddaead",9.317957166392093],[17897,"7881d5326e44374f941f34236e7676e83e69d3bec22ab9279f929d955c93383f",9.317957166392093],[269,"5a2da5e7ef2e73137433ac5b740f5a47663359af1b1b9e3c38df1408878824fe",9.317957166392093],[18315,"10a6330b100ec1d2b3c3d32a2703500abd1eb8fa5fea5d0bc5a1975c2ceb8b35",9.317957166392093],[1468,"a91731ab68b09b8c459b8c51c3082dd0ce513adf3f6197bc04aa70cf11e45bf6",9.317957166392093],[5582,"9d485bf7509dfdc68efa6e4d68434589faa69cc87363f3b855743a40cf9fb7db",9.858123569794051],[9228,"a6e56dda0962f4ce41937564fc453e7e0174547c881dfa4649b48445d41346c3",9.917710196779964],[507,"863465ae618e91440636632a14e576876f1742ee221a6676b3732487e622a1fc",9.917710196779964],[14331,"fb0448fa5abad4d96756cec3a5cf1f9d610acfbfe321c240c0c817750aa1b58c",9.317957166392093],[11994,"9a019936d443ca0513f5ef96bf94c578a559e8d258fe80b59bb96826ad885eb1",9.917710196779964],[11973,"1d6d0749012523ab96fd8010229299ab68e20a54663ee1b0ed4c7accf2cf7fb1",9.917710196779964],[17694,"91633c656ee7ca875dab3cb5551de6a33ed9de279c00dd70c884e780c7b25043",9.317957166392093],[19017,"180575a107b4de653371d94ac9ffbfca7c4514194e53b393fbb98a12bbb6e61f",10.052724077328646],[18461,"24050478e3dff0bd9ba5dc94d58e5695b090b2e06fbbbaedb5770c0a102f6232",9.317957166392093],[385,"00c3c862de372bed273b1ebab922ce90879c9b5a8d68bddeb2b3da182c2c74fd",9.917710196779964],[9014,"fd85a2133e0585de6fc0744cfd5ee8f6b70a3d065c9ba18ae1b975354733afc4",9.917710196779964],[12066,"ad9aada1849100fc909cc0a8ae1f200af03f66d68885ba21c4dc61bdab61e5b0",9.317957166392093],[4012,"1edff661efce733aca4c7797c251bcba6d390749cceaa6a72e43e29478c5aae5",36.92788461538461],[10704,"c0afb34066a34224d8c9f66012ada3940588f429ab04040c934c252330aff9b9",9.917710196779964],[8735,"adc652206c9b2f5e0308b91c549dbba8cf91414c4b31ffc6f8e7750492407cc6",9.917710196779964],[13991,"c57736a6e6cd651bf0f25408452525a24f91994e08e11b51f7aeaa600a2b2c95",9.317957166392093],[4783,"5a6c798152f198bc1ac0cd5f8f3ee4e1ac9a1e5d519abe53fb3a5bbb865082e0",9.917710196779964],[15177,"06964c752cbd427cf5493eda0482c587a98f957695da672a6fbc25a5a2b6ff7a",10],[17222,"fc799cd5af442dde914c435d50b2a5648d8fb5c0b6a84945b6bcc555419f824d",9.317957166392093],[7517,"57bd7134c87fcd89de6e863247348e8e539f0ddeee88929abd9e3d6a3a95aace",9.917710196779964],[5188,"5c5749c671075d556a3b2bddd7a91ede8a550e8c929f5479eb3e72e45d320dde",9.917710196779964],[1138,"fd9230bd15b1a68f2b114503c270eabf22169ab94854fc92dce63d2606985ff8",9.917710196779964],[15390,"9cf958e94393daf06395bffc613b14312abb1ca19706835c0b88daf696477576",9.424083769633508],[2319,"a4dcec488268d6e102f4dece9624c71277c77b1d9bf41d2130269a091e2bebf0",9.917710196779964],[4791,"dea36c7ce97234afbee99c5a498143951aadf95f63a9d6a10e1bd74c323170e0",9.917710196779964],[15615,"a228839db3e255bb9113b238835b3ff9b5dfff4cc4070b67776fe1cd5c291771",9.317957166392093],[10458,"c2130d2ecd27cc817f13bdbeef8db06ac073d23d10fd392d460cfe13094f61bb",9.917710196779964],[19800,"3bc139a1c4cbd085c39aa000442e9b49ca67e2c954aaf04e746e5fecb6b17c02",10.013531799729364],[6870,"e33109301ce5a16d51258c9f1e73a7a389b9fdf43ff2e611599779e26718d0d2",9.917710196779964],[43,"2ebc18abc7eba638cd1c542b4ac2785259b435050ddfb02aebe0197ebe2dbbff",38.61187214611872],[15736,"00753ab897a8b7f271193919dd4ca8d1fc97d9f00e17a53ee28229bbf2a9b66e",9.647446457990116],[10645,"fb471ee19a7893afa5ed95edd84239478756db134cf9dfaebc237b558e9e65ba",9.917710196779964],[628,"8a11771d9d3a59eb7f33552e9c7d1c58eeb9ffca2c5b7243eb5ab95c8edabafb",9.917710196779964],[5785,"072c2422702d2f75592da3db67c074705271a1d697162aaad3fc9b720da184da",9.317957166392093],[15248,"802af1e588da54a29703f9b65a07f8993a477bfe312b48f440d243077df57479",9.317957166392093],[18300,"9d3f27b6c08d3f6d01a7f76b5fbad65f65bc0fdb4db9f14d441ca7d37c8cd135",9.876543209876543],[1118,"dde3971193562fee5574e6b411fc5e57574b35385fd41109ceae6f4abe6e7af8",9.917710196779964],[11083,"6f5c5909ca5aa42cfb3ddfb8cc36b65c4d14c8f520ca08c7dc9536e8f8e762b7",9.917710196779964],[7165,"7447526214a8db0430c241fa0061a9bc388f4c66f2b97ff59c218ed64d1cecd0",9.917710196779964],[14642,"6a722bc9c65e75b7c04a64d9f50eaad29203205d74f380f5867865c76d041686",9.317957166392093],[11670,"15e092b25ca3719cc65442aa56613e4a78ef27cbf9ae1c04827001d36fee77b3",9.917710196779964],[6259,"af53137209aeaf0a64dbf721747438bc304a4d12391fa33bc1bce2c309d15ad7",9.917710196779964],[16647,"3391e7a9f495ccf184943da762be788e298b242bc5b308d07daa2b8fb9c2d259",9.317957166392093],[17396,"2bc626a7c01860669da715587b469b0480adc69053887ccea83d1f137af3d949",9.317957166392093],[9666,"882ff0f1e2f0f25061b8c3537d047b29d993be29c0a7a4814780432b8b9898c0",9.917710196779964],[2259,"9b59715f8b04170d9e387e8fa3a7be780c59524226b1d000493e1a7ecc3434f1",9.317957166392093],[12379,"b4bb75fe57dfec1ad0788955a9bb9b4fe5af1ca146e0c766924250cf63edc4ae",9.917710196779964],[802,"d3bf34f4b7933a0cda0bc96e75b2fff13a68cfe5479b931bf712a3a24b1387fa",9.317957166392093],[13630,"b70178f6c7049b077060fc49fc8da47d5ed0c09762e29005888dbaa4b070b69c",9.317957166392093],[14503,"debfbbb890fb1de28ee3ca72f8695280b6f800b097bf9f6a2c781ac5c1e70889",9.317957166392093],[19421,"865c512d057d41cce4b7b51559f486c3cc46324abb2a88ca4b796507bf34c710",36],[10018,"df6415d5a19067eb87ffcd908281ca2c8a811c543c7031b22c0ff192083e37be",9.917710196779964],[2828,"4cbf2e15d150dd7feff152e8cb20f927fe0af3bc61bf753c1551d4deadcf83ed",9.917710196779964],[15618,"41a523a5aeb987c888531b75fd7d186146064a7df12f5a095af040995fe20271",9.317957166392093],[3050,"4e149605857e18a7ac16165887a7414ba3d4e29619400699b96597f05036fbeb",9.317957166392093],[13995,"f362475c168d319c91e7325bb2cb1b88a1c3266a19cba0b453900bdf29da1295",18.09625668449198],[11253,"7bbf3bc7272b8edc1722f47b34d8c8a058b4291fd9cc9ea5ccb2f824b05b56b6",9.917710196779964],[8854,"0265b4f73f2f3cc57b5704df52198f3c871f8f300dc849d95f77dd1ed2afc1c5",9.917710196779964],[16362,"5802b2e941ed8a243b26a7075bbffb28720dac5dbc3387ac0048aeca2ebbce5f",9.317957166392093],[2158,"9d640a36cbab5ad400bc04d860d171c7530d19f2f2a8972f8defa3a50ad0d9f1",9.917710196779964],[8842,"23bda64865292d0dcc1d8bc8da85c2db1e7760332660d5da0efa091f5fe1d1c5",9.917710196779964],[18192,"9e57e7f40400ab24e73d3e46d24b5728eacbb71ad3f098e6498c152381396638",9.317957166392093],[54,"f44777804d6c4cedbfe737fb5bbef06656316f0b9e6ba1571eaf107ad7cb9eff",9.917710196779964],[8702,"8ecf76cd29e786c4171040e55f3d5f984febf8c4b3930dac964d1f5a9b3fb1c6",9.317957166392093],[1068,"d27db89e1083695e3c1084d9cd3cde7bda7f8ff1f3a6ccd1d1bc03b89f16cef8",9.917710196779964],[17155,"58c7947f877765255aaef277933b47cef3df3c506c47ac187b7b5a2f11d5f44e",9.317957166392093],[736,"152ebdad980890a3be9c5d217b26525e814716c1ff78a4a85472dc2a01ea01fb",9.917710196779964],[4617,"4b66b15d6cde95f6bc49b079ed996da661e8afef39625183ec067cb60a927fe1",9.917710196779964],[12294,"72f914e9dad82ddfa9b0b8966158cb501352654c9bc3c4416c5adb19dc8b47af",9.317957166392093],[7871,"8c5b605dfff3b8b4946a86bf61c4a049db6038f39d3102874f68dc795bdb6fcc",9.917710196779964],[2686,"2bdfa841757c06bac7a618191e5dc69878d9fbbfe15a793efacf86d692b593ee",9.917710196779964],[16348,"c5d344bd7c5cbe2ec255e353b2c88d1a4dfc8aa43f3fc6d3c60660b4e31b2060",19.093184979137693],[6754,"f8d7f0bb18fface5246ab9c0dca15d606d4488a58f732157f9ea7a972c0491d3",9.917710196779964],[9406,"41b7d3f15da84b161158f12f140218025d20a28cc0ebd27608fe2985209c40c2",41.35472370766488],[6695,"56926d27aa36c8f078ab365579eba550b403348f447c747c4098d9267640fcd3",9.917710196779964],[10001,"6496a429e81f75aee471db1b0372a94892c3d7faebddc8c343d9dbd859a252be",9.917710196779964],[11046,"533ed0a9b964954ac6e1a3645772e0c2a91e450dfd5d3e3ce9d3372b2e41bab7",9.917710196779964],[16747,"5546865bbc5f34a9ae4079051820fd6e44495d1a138b35388205e310e2048857",9.317957166392093],[2297,"3d942b02859d57d3d52778654085238efb514348e286dce6011868c554f606f1",9.917710196779964],[17511,"9755667d588ac68013d460cea5b8b28dc242adcb7bd38093fcd1f01e1c984147",9.317957166392093],[79,"d460274df1a0f5d77c76804ecef54f04f9991b0e86a419b174b9f66b6f437cff",9.917710196779964],[16301,"a69abe8544f8f102e37a4ecdd967b27d7712022d963de95df123759a193f1a61",9.317957166392093],[8313,"2969b254153260460e18a67eba57982471fcce27104231a0c30925437f5640c9",9.917710196779964],[19732,"83bbb41fda94fa6b5e972746afed82780d130c5fc708820b7816b45f9e79b705",9.647446457990116],[19714,"3b43bb583ed1eb634d85aa14912bdb101bfe765eca1df437fbcfd21cf7d63b06",24.228163992869874],[2167,"491fd14411570046bdd74256af7e8c783fd39fa17875a23c30303f833cfbccf1",9.917710196779964],[19448,"9f847b5c211f8d2710120588082ea28a1e389ef2417daad22c7f92f92e1eec0f",9.317957166392093],[17133,"f3281ee842d81a5d8db755d5f69670f02c768359f1fc63321e38c68ef0a25e4f",9.317957166392093],[13171,"be5a02d5d8739447545a1cddbbc86f9c2bcb5eb9b1dec62b8b89ed1cf0cb8ca7",9.317957166392093],[17949,"6d4f69306e3f83284323cb85046c426436a3dd5677f70e43ca601995377d4a3e",9.317957166392093],[9033,"593cc33be49793d7717c4c3fe672fd0f7343fad2f2645334fb5989bfd3e491c4",9.317957166392093],[2430,"b1bff2f41650e82f538ff35a17ea95b7dbc3846a37c5145ba272e1f640a543f0",9.917710196779964],[6443,"e894ffd141c722981a346548a26e3df787de288bdc58e97a0fa591c42594f2d5",9.917710196779964],[18440,"6434041454a7cb387ed59a8189fc59484b757408036ff1f27ca560ce77b7d932",9.997888067581837],[1245,"d686ada96d74555cb2902542b32065f4b1694ea138c0554670a4dfa637f9b6f7",9.917710196779964],[14203,"66c353b7533ac0c7a85a73c6767d42af2f1fb935d2e6815706f6a009eebe1f90",9.317957166392093],[14875,"5c4b5b58690ffcfc1d42a230547d25fb9882ea6f43373a3b58726c1c58d64781",9.317957166392093],[18158,"2cad79550182fe7163481a445a54922dd642d3bca4f24217e30b58fdd0322639",9.317957166392093],[1052,"8fbd10a9192e05995fc8ecb567bb29dda1fa0e7e5f07497cf57e2a76de04eef8",9.917710196779964],[794,"cb3432e85948fec24c74001d9668e919281ed54fdae5daba76b27d28b0e191fa",9.917710196779964],[2932,"c915a5fa432f1b5c13d419628be3a19840f9cfcafc6542e99fe8744676a7d4ec",9.917710196779964],[14804,"5c615580a16b5b883157dd33fc9d07059b05ab8b690c1eb4d997f2e339f1c982",9.317957166392093],[3447,"b9653f67763c5ae02128f036e64a89c15fd2046e18d13d300e078127b6bd65e9",9.917710196779964],[171,"a0b1c2d06a3438748c3f46d558f61f3cec968b0805d78312885f28ebf981d8fe",9.317957166392093],[19872,"f6f717b7bbd66ff65f0e1634741f35361e6cc4be199ebda95f61c17246411300",9.317957166392093],[8840,"db9a770c45b88f1dc7057d6581039044c28e000ce5cdccf3ce985e752706d5c5",9.317957166392093],[13319,"998e82d4cb6b49e1329627c5551b9e554a836c1c08a809c0a03211d3374447a4",9.317957166392093],[15713,"6186cc740aeb26de068f05e328e0b201b8d86e6d64034a294cde6b75d79f326f",9.647446457990116],[10983,"5b834a575589863e45b0cf7ba253bdc07123a690b0536120ee82def702921bb8",9.917710196779964],[16355,"c19611566fcb367a8efd0683e43ffea3f2349b0a929d303b041305476146f85f",9.317957166392093],[6428,"9571e6a6391f62aad20df195c39d8ee81fc32b22632551eac3c4d82d16f714d6",9.317957166392093],[4204,"3fed6067903ffd0864a861e8341e88fbd3af1733f4c33e761f7b18d8563f64e4",9.317957166392093],[6177,"5bab033e0ecbbc72f2b12bd0454120ff45036306033bee8db621a372c56ef1d7",9.317957166392093],[17030,"f98914cd4813b5dd8e3efec457cb668b5f5a68768c961f7bd321a98626846651",9.317957166392093],[2674,"ab95e6067960bfcb303c0e67ba5aa451d4e69c70bda92007043465b2c8d4acee",9.917710196779964],[7832,"5163a0a2477883f4c0f753621fb74c616190b215161da31d7d9ff7cf7b9795cc",9.917710196779964],[4899,"af97375fe976a58a2d8e9ee1a11455c42cf73ef05ba05920a64ca3c1c797dfdf",9.317957166392093],[14103,"5323dd88effff9e17178bcee1ae97625ee10dfb2ccaa7bca456b354474cc8892",9.317957166392093],[11852,"41a209a52a8702020af21a5c2c7b50395725879c3800f3c54869f90f31f157b2",9.917710196779964],[10186,"64f95a3f2f468205a8016c63d48ed8683ff707b7596e91b79c5a96e210ac1bbd",9.917710196779964],[6483,"313de985e5d3ac19e34d56c02673c3286b754d6f9cb9887a9844fdd7ab3798d5",9.917710196779964],[12662,"5adcc18e6f5e91b1a1ef9000eb47926d0eb491967e876713537289a7179cd7ac",9.317957166392093],[7997,"f154c16f50c49604141da10df91951bff26e741f9638641aee090265518486cb",31.63101604278075],[17252,"40ae415395d1864e98b29d1a06eb313343a486e77b80f63189add5d9ea6efc4c",9.317957166392093],[2957,"3f3bec7f5fe06f7901c750168ea5d08a178a62725efda133199405e86a3499ec",9.917710196779964],[18772,"cf6cbd814ca68ac86d37c6093d048d018a4f315701368efcb6ca07cb360e0828",9.317957166392093],[17948,"9402afde6f32ce4f5e23a1d6d88aa9504011e6ecd3a68802e2d32e199d9e4c3e",9.647446457990116],[10476,"41298d6c217b4d931ab1918defdba99678c21c01c9830f0cfd1c1388ebd84abb",9.917710196779964],[1183,"417a990031d70c7fc23e5476f390ef8705bd51fabafea7212f732c1022a71cf8",9.917710196779964],[6972,"f71e87d9e0d91956622cab1f4e8b06a196fe97c1a7f1dbbcfe2dc652dff528d2",9.917710196779964],[12485,"f93e9cef23e5cb8313348fa24660358c9134d63cc52228784c9450d245a108ae",9.317957166392093],[6404,"72ea6ac123cf49653bda3f608574105d12bd8868a91100bef10ce9cd110a4ed6",9.917710196779964],[14123,"447b61146218d356e04bac78f474679ed57a687149541349dcb78872ac020792",9.317957166392093],[629,"8a8b0e4feb2f00fff2b912b36b8ca8119b8f6dbac993ca3d9198c0e2f1f9b7fb",9.917710196779964],[1812,"45ab11637f162f6e3c144112fb0a816ac432bd168a6eee016f27d78aed7327f4",9.917710196779964],[3208,"9e7bc681a2339680f2e8fa60c4a21133dd300a0c59d67e1e2e19525b8428feea",9.317957166392093],[13413,"bcf6a4d012d8cdddb8008e159031cd319f0d75a432d71d5e6eddedb00cdb11a2",9.317957166392093],[6887,"a92ac90bdbd62452456ceb4e0136fb46ab7b4cc1f555e23a2c275947c5e5b2d2",9.317957166392093],[775,"8356495537fa8497c9964f36d9d4828f69a9f0f39d2bab0991d7e660115cb6fa",9.917710196779964],[1845,"86a5e7de4ac80d7bf8accd20b2da480867be59304d03af0b22ff3f1cc451f1f3",9.917710196779964],[8059,"5343b64090ecf1bf84f621a50e91db4f396c2a98ef3a362361622f13a4a30dcb",9.917710196779964],[8352,"7f29dab746013fe016abc38580343c91569d5adf5a2fba8b32149e2bc2e8f9c8",9.917710196779964],[7023,"7d628a238475ffc8119a3ffad32091b01583eed0f6e19154d2880d55ed69dcd1",9.917710196779964],[12921,"d673fd1eb9e3a88561f268de3db74d99342ecfcd868cd06ca43b1f062b3429ab",9.917710196779964],[6986,"8b4406aa705d6ab002826cfaf3db8f3ff1f47c6d2b0e7337bc6a16f06e1917d2",9.917710196779964],[16624,"6b2c4f5eea50f6bf1bdf2881080b09b735f9ec168f41dedbd97a928ac39c525a",16.013852813852814],[6756,"c4b6c04a9fe86d8a0b575e69b5e320f608bcc9aafeac7f187caf8ce78d538ad3",9.917710196779964],[8696,"0f3051c0cf4c6ac66965582fc58188fb0573a014cc3d93506d5396595b95b9c6",9.917710196779964],[16849,"8d79b849deca33a97b6041664a0bc802ae31bb3e37136c4b8772d032f8234555",38.21408450704225],[3066,"2b40d4ea1d698afb020466927c926b89ffec61aa9b237dcf9405bb5c7607e2eb",9.917710196779964],[11923,"8761be63c20f6154a99d462218e6322ee824ba45676844dd0b532826fa22deb1",9.917710196779964],[18879,"3b0b79a1b1eb58f1a707fcf620f916f01e176b3f44c40e9482c8b67f89262a24",15.079646017699115],[9989,"738083ad0125974556195c03c46ca55fb68befb2ef65bbbaf4625b3d326d62be",9.917710196779964],[9270,"6b649cbd485b7070cb8cacea0a749469bfbd6d99f128aaf1ef4b5cd2678808c3",9.917710196779964],[11843,"25943d42f2119baa58d71750981a82c7594416c60b3e63262a10c214e67f6fb2",9.917710196779964],[15031,"0c4dc2e3c57b9f23cd3dccaa9eb8a3c2a5bdc85c07107407c8702985e6accc7d",12.057692307692308],[14654,"480221993e10ce13755d430236619c83b4e3932d3984b0a0200ac259c607d385",9.721518987341772],[12354,"5f5884314127de629d0ac5f039dd61513f2187a16d6d9f8c89927fc22f27e3ae",9.917710196779964],[10756,"f6577a05167ceceb20a35862426cf18fe2e1f4f2ec30484d7d0048370535a2b9",9.317957166392093],[6781,"b1db130ee0b089becde40b046fba4ea57c1c6f9d6d176a11966ab1dff75b66d3",9.917710196779964],[7352,"fea39047b4d0e9cf65b3897e6982d2d976ad5e1434c656a6de3f37a310fcaecf",9.917710196779964],[11030,"e73e0bb22083e0296fe25bb6b4510ae66626e9ef051f123e4c1e0e6b38a3d5b7",9.317957166392093],[10316,"e333db008926e6e578d6c48cfd04e7369644c88c966ee06a5a43cdad53793ebc",9.917710196779964],[10700,"aea2960b2f00bd0c43e7a1b2909600b676583f970217f57a0b90eaa3a6cbfdb9",9.917710196779964],[16916,"0b540d81f7e44e930949ea2d41d69130c408110794204de747cc58a8de2fca53",9.756272401433693],[2407,"cc2ab23debf7fb7be05ffd7de6d514f125d1457dedd1e111b53fcfb7f3226df0",9.917710196779964],[12138,"62c81d1af2effb6b72d209a24fd1d1ab1ced2d60a5615c31ebd77c0dd97b6ab0",9.917710196779964],[5541,"32cba56067a1c6bf6f9db78d7a196cc3cbe2b6f175abc294e6df62dcba59f9db",9.317957166392093],[12409,"44762b3d91d9355e7bedc53e41a949deb413140d59494c5d5724df982a338eae",10.052724077328646],[18379,"a74e8feef1e65873335949fb68ec9a18a3cec09ffeb443f7aac57002ec491434",9.317957166392093],[14016,"e891f66a2ea23360bcca3bbd7d0df792f677e14cba6eddc1ea13033441d88094",9.317957166392093],[8958,"f890cba12937147e074accab20a4e859565135af80cde7ac79daf0facb8512c5",9.917710196779964],[13828,"e93c4099031833253e72bc5a46147892dcf38451c7c838492ac9dc3e5009cf98",9.317957166392093],[10617,"2a981f1bf29cc6472015459f977d592f9567749b3cecfbad516d52af3f5e93ba",9.917710196779964],[2695,"1d8b9dab47a01bcb08498612b8e3f2f62067e47f4e3582efde951830d52c81ee",9.917710196779964],[101,"bc4ec63616235f6896ef88704fe1ebf9fe29270f0d800e77fd5ef9e98bf65dff",9.317957166392093],[1551,"a2a65ba7814fe19fa9f9b0b0fc19ce9decf8c76b10d6d68d7bc844646814d3f5",9.917710196779964],[2813,"6cda66984b0fcee04c1af156b9bab1336f3591fad27ad58b2fb9c3a0f47997ed",9.917710196779964],[1319,"9595c0d9320a52d4192faf91a45bd107dfdd363d5a59625fd49de53b9c0f4bf7",9.487528344671201],[16865,"10ee76c29ca2c560a03c234a214cfb8188ef618493fe421bd9d582bd3f7fe554",9.317957166392093],[7175,"8f421d1a2c7c35ef7e30d11ff0deda836eeeb4fed153fb6c60bf7df2d5cddad0",9.917710196779964],[12872,"2894c8a1aa8664f3934bbc76dbefd0b79517207b811615827ca93c174bae6fab",9.917710196779964],[8712,"1fc1c0db956c5396454747c6aae05426e956d852d020c380d6ce7b394e6d9bc6",28.155555555555555],[11463,"365817cfd1d2e151572f0f09dc34cf9a838d3481b8fd6eb9a720a01963cbd3b4",9.917710196779964],[10832,"88e39eb365f2722003a1180fc2a844015acc53827f717039438bf05fca861ab9",9.317957166392093],[10801,"4a2ccb1ea404f1ef0e8abd1cd9a0ca316d8389141981f7f9ef74b582502a49b9",10.052724077328646],[18885,"0462e10a0fd3e176d6f2338d91d0f2a8f17e199cab58b67b2e1010a7d1d2de23",9.317957166392093],[4437,"be96528ad4db12a9d736ab65565ae351574d8afb74022b58325f5a21a013d7e2",9.917710196779964],[11769,"24f5f303dfbf41d6fdc6e69dd7e024e3f10235367e5287dc5f25f10dd007e5b2",9.317957166392093],[11358,"0ec7af2e9246b249836c9f27388c52661b07bfdd252d6c09cb9c8e37d20a9eb5",9.917710196779964],[17601,"3a031c6a95ea52f328baff4268998ac5809be44c0f7d1b7e7c7d74e6a7440645",9.317957166392093],[11468,"2aa97b43a922f9960eca5b6df3c7f861d449229a047bf757e6bb2e48f0bac2b4",9.917710196779964],[431,"a207f0aa7c9f816deae89ed1470b5e08318844a4ff897bf557990fa99c1926fd",9.317957166392093],[16087,"76555bbaba9bbccee264e0064b1990154b3dd9b58f9bbfebc6179264e84f9666",9.892183288409704],[19816,"201af7052144c2330ea1b6b700dcc04156c8c393c0d9b85e7ad4af19dcad1f02",9.317957166392093],[6969,"66bca98a5ed383f6d1e183d4184dd73c749c9583c5aa9181c454646ef6102ad2",9.917710196779964],[2961,"7de3690371f6d6a12eb13c9bce866bf20a5d07aef9bccd161cc9462b2f1993ec",9.917710196779964],[7174,"e3a6bd6cb6be9f08a9a0af4037faac1897be4e97fd571b8aca10cd1e0d09dcd0",9.917710196779964],[5917,"18611169274377c61aaac2b2021a12ae668865c6258ac5bac0c33023777297d9",9.917710196779964],[390,"f880c6d8380effdb6c6a2a17d19c35ade192378f8749abd3683ed5b191446bfd",9.917710196779964],[17923,"2908c858937960982551e981fde7cc04a583a6b9a42fb865e62f3be9945ec13e",10.034187455573232],[16017,"3d40595f922feb79f49b29cd887d139c7281492b52b42980f8150024aafb1268",9.317957166392093],[7957,"a18f58508daea96b090d58f926d01b50c8e6beea736b44355e3a7f00e957dbcb",9.917710196779964],[16281,"71ae4b761d5b74d5d36f41656dfcc7aaf8753b9b5e0e6b904dd04e4937519661",9.338112305854242],[4273,"33cc6c267a7ecadff92b000b5256cebab36e9a20cc1d23c4e2e412962b59f0e3",9.317957166392093],[7797,"113d7c4af131629f9919bedb72c228997657e984f096292491f89ed9e053d5cc",9.917710196779964],[10876,"9c3c6098f2e0d88d7484fbc1d423e14eab743f041c31a128b75bcae71889cab8",9.917710196779964],[14912,"7c0e8f39aae5eca4e4fa23637f7e958c9b12be7e7ef8d2a5555cab35d403c680",9.647446457990116],[16935,"a5f7f931c92a280bc9e5b8960fdf7a3c0e91542b8c86858f0e7ca711c1ed6353",9.745222929936306],[11239,"144709f727311e2fdbd8ff50809dc254e45aa5a1a3f880d7e59b34b7d28d71b6",9.917710196779964],[11776,"bbba0e3b4a754963fdbca31f6649ddd38fd48a80245909f8751833b67042dcb2",9.917710196779964],[12793,"a61156c6b2a3f85f81d99b3368d398d71c267d248293c75c1798f761eb73f5ab",9.317957166392093],[6385,"d2561dec46450ee01a2fd67941b2d75fbd87c8f73d630d6718f3db00ff366ad6",9.317957166392093],[9515,"011c9f3616cf347528afd4026f8efc792a5a2ea0206ccaffd7df16d140f298c1",9.317957166392093],[6711,"46fd3f44b6961147c38e4999cc36bd091700ddfdd72578c77e5944421013dfd3",9.917710196779964],[10331,"b1a5f483d0715559c638f6c28c504ca5def711d50410a2507418c6ee768921bc",9.917710196779964],[13450,"5d691c1fe3d7e8fe9a683ee533ba0b9a2456de137ba8ebd9b254adb4226503a1",9.326683291770573],[1582,"9dd3f279f18c54cc1688afa2969f8893d2c3348e31247ef576e4e7a4e6cfa4f5",9.917710196779964],[14591,"7f2f0e815dd570408aa9868e47b378e0be1ed9d48ee07a5a886788ef99d04287",9.317957166392093],[601,"e526f50545e1dcbb3475d998f46194b1671ada494d178be6b399634c3663ebfb",9.917710196779964],[10504,"7b6f8f18ca4a74212c82591ed553515960e3965bef3592e296e369468d8728bb",9.317957166392093],[11576,"83087777ee886519ef320e7e2c8cfef064c10d15ca8ad31db94f472d75ec17b4",9.917710196779964],[19066,"c04cc5f48ce7623d9752d3c5ce812af85ba21cf8b08fff4b9c4958881623191e",9.619607843137254],[17380,"f2c5bf735220aae0658ab55c6c6cb6032b3910045562aead8fbfe95d7f22304a",15.609756097560975],[12713,"058f65ff81ef915ea680825c2e2cc71ce80075413a6e8fcfcff213012bc683ac",9.917710196779964],[7111,"35f767eb3334550f40e59f0355929cebf889719f7c412eb3cf900704e7d746d1",9.917710196779964],[717,"6e61cfcaaea3e3ca61719b1d27196732333610535f65830621e8545f634d17fb",9.917710196779964],[16344,"bc3fe0dc8d83884f901c8e3525b49f45fc52397cb002c4cc28e800b2a9d02c60",15.012366034624897],[15410,"b00b11939705de762645b8046b0aa84637850e0893f2ef97512bce33bb420b76",25.311942959001783],[17685,"0fec53ca7af66d991f89d5d539f83a6ae6e4fdd1553e7d546f0e3521d9827343",9.317957166392093],[12475,"766b83a9002d2d3b51f45d66b7c7579901599bc451729e621530fcf7d35c1cae",9.917710196779964],[19277,"8532b71893b4618e408b307994f4bf18e99131a3366b1422a9b684708ae2a915",9.647446457990116],[488,"414d1b634609f8cd3e756fd9a8375d554633ef6918ff3db1cfab0e424095bafc",9.917710196779964],[5711,"fb399572e7918dfd4dc932c1a50caf5cdb98a5f5019db5ace201f0e39fed00db",9.917710196779964],[17893,"6311a1627a3b9740c74287c4894a22fd8da77fe520988206056d18e8f219603f",9.317957166392093],[10933,"b42ff5decf4fba43e2801b17484f9039acc458e6eae2fd5875fd500b01947ab8",9.317957166392093],[1925,"9607a40228195155296e316c06d0b8f45334af49e2a1bd4c3190d8a5f70184f3",9.917710196779964],[19048,"074c0fec42b73cbe2ed1104f4a2a70484c66954c16e21fdd07380da6bb3cdb1e",10.052724077328646],[3172,"be59745e445b48f013b06ca74b05856d4c734a7918b4e603a2b4f9ed758733eb",9.917710196779964],[16114,"fdd59f3080acb4bd73bc14a424a7de8cc7dac1848a0a0ee8b162bb7e5b86b865",26.003559985760056],[9737,"e44344a5ab9d7ef6c85250336872b9027a5def544f093936dac32d552c9210c0",9.917710196779964],[16481,"9b5778355c0ab87896aa4ba85bac89b2079139f25d4d1ced44099cfda8c2a45d",9.317957166392093],[13925,"f04682a0fcf462c970bd0ecdb10a6c2cf67da6dd74ea17599fc38c1a11b87196",9.317957166392093],[11075,"f37810bed4ab4bbaa23c7798baf8bb8547d5efa2b1d40f1908c72bfc8e6a7cb7",9.917710196779964],[19106,"7d507c36d92700e65472a6a0ce58ec86ac07c3a59eefdb573fc588052099641c",9.317957166392093],[11061,"9850914def575deaa91ec739942b7f95718cecfdfc96ab66790eab2111de99b7",9.917710196779964],[16484,"5acf559568b663f6743b079ed83b9d1500bc4da191df5320c59d2c999666905d",9.317957166392093],[3196,"dd572f7ebe140d4a691afb301f4befb92d100eee4700a27f141a7c1e0e9d11eb",9.917710196779964],[18597,"a624be0a076b58109086c393b1d88e69245711fccb101f38089922acefaadc2e",9.317957166392093],[13198,"51dab507fef537ed254e668280b442225cc5b0323e4208c80714b7e1ce7cf6a6",9.317957166392093],[19497,"db4bcb5899ccb8c86a044e6a3a76a3f7d0ed322f82c0734e7988649b13db630e",9.647446457990116],[14569,"e849582e4083f706de71fa859d27f918cdaba4fddc4ce67a1ef5a301e56bb987",16.056140350877193],[9343,"df722d2c21c19c023bdc8ee6a0f5150354c99fd8fe5d145211ae091c98e09ec2",9.917710196779964],[13438,"88d7a5b1a66f61a493a4bc10620055de464630a1138e6751650f849bbcfd8ca1",9.317957166392093],[11617,"00ff1425f597253c3d8a3035ed5be1cc6f2ddecc3181ea025757132fb6f3c9b3",9.917710196779964],[11767,"853ebafb126024cd58158d55aaa9dc46323d4308e7ccdf70ade0397b2f27e6b2",9.917710196779964],[12302,"615e86f378261cf774ed34fb2d965b140674461a983a216ed727dfaede7534af",15.942959001782532],[8495,"2a39310610a1347d317bbde9dcee4166ac622540d5006736f111cd1b08910bc8",9.917710196779964],[9693,"3f93fd4e0fa759884c488242c1c07875da2125f634b334d254cecd9148be73c0",29.96679841897233],[4414,"f3fee5095357b820ca7a1b2fb551af9106a5b9decdf161fff7ecfa309738f9e2",9.917710196779964],[14546,"c506aa8e49a3fb011cff866c042eb976c7348f8be1a47eb93bb7da8022e43088",9.317957166392093],[10360,"9302e65ee6068f5e93554efbe295e52d67d6f34ef6f60073bfbb923e050902bc",9.317957166392093],[4058,"820500b22f3330bccc3d911ea47f76dbece7168baeb57eab9903fcbd266461e5",9.317957166392093],[595,"beb0993c096cddd2414a7e51eb9ba5e9d8561f2bcbf148d415b5672d7523f3fb",9.317957166392093],[16304,"c453df0219c9304a215d7fc6c268a9f9d50d1ad8e73ee7e999b061f06f970761",9.317957166392093],[14687,"9788f537ed8d65382d72928f97bd0c3dc094906869e0e920a2e197df4ad51985",9.317957166392093],[12247,"2b9a7b0de795fd0a88007f2b8df6b270463e5d5c9ee47b40dc5f964f9a60b7af",9.917710196779964],[18150,"1affc21daf6dd14d7e12518eec31247381f5baa7fbb027ccb59162040a016b39",28.19047619047619],[11084,"c748986f75e924fee5a6205b9a16e1435510a4b4ae7afcc8a71f636ae87c5eb7",9.917710196779964],[14371,"cd2e35a850357ab3bc8bdb852ee6c0eaa286c61344b17567155f1f642eb5f48b",9.317957166392093],[18088,"dec1a014a1ce8bf4116b37c4dc932b17b2d9ba78dcbcd5ac0e6f752599664f3b",9.317957166392093],[10070,"7953c525c9276e30a9b6677435ef457bce85a92c2616da1276bb01a3c986f1bd",9.917710196779964],[3175,"8caf8c2f11c5f30db7dcec9f55d61a4b7a51025dd0ccee1030d22d4e33102feb",9.917710196779964],[14281,"731fc8977bf6110feb465c298b4167bee2ce2acbb04a9fc40ecb6c7faabc118e",9.317957166392093],[605,"a315c1b61eb3522c0c9856148d7b14cfb7b798a0ec803f0dd1cc81fecd7ce7fb",9.917710196779964],[8181,"7a4c4e38add5ce3249de095fc7e9e61b80645bba0c5a47200751cd8a80331cca",9.917710196779964],[4610,"b5f4e624d81c8259413c2c590ee8fc19e5cb2c732afa18e4bd53e504bd3d90e1",9.317957166392093],[18529,"65d39c1b0beabdff96077d8b13f832fc2c4d39d1691cbb6cea20ce4c6560e430",9.317957166392093],[19388,"ec55836178e6e30e6de433151e65fe725bf94c7ca91b060536f59eb693d04912",9.317957166392093],[4523,"e990841264f0d5830a9cc375f039070182b1de60d749397043e60b45e7dc35e2",9.317957166392093],[13476,"581475ba9bfed092745200b719f2efcda2ccc81f0730b98222aba401eda16da0",9.317957166392093],[3099,"d4dbf08d6097466c3b163290720fee74f1c2bd1fe83a8998a9d702a98d22a4eb",9.917710196779964],[12551,"6af2196790197bce6cbb0f7a20d8fd4dcb9c9fff8850a2b26e6a90ae15ee9fad",9.317957166392093],[3349,"3f7168a9f3e3a3054d3afa0b7b01f7b2d2c756035847260d7c9a3b2e1cfe03ea",9.917710196779964],[11140,"2305e08e2310a67ead4d59b26780e18cb765656e8c9929abc5e3d5b3df7d04b7",9.917710196779964],[10765,"87b6eb0171db5964951baaec80c4f8cd257351a0398113fe867c18f7295a90b9",9.917710196779964],[15495,"cd70660a61dc03b7006bfeec33a2688bbac46c2937af9ad5d63fddd179242c74",9.317957166392093],[19481,"0b07b8fb05e5e903948b40a70b188e18c1ab734a7fe86a2f00869bc70ee5210f",9.317957166392093],[11883,"fce1c11c30cc078beaf23407ce1584d14d69e445ccf94319a552406da56f1fb2",9.317957166392093],[1988,"7b3801e3741c9a846c0af22780e537fda95d08c6b8bb915c7dbfc82e27ca11f3",9.917710196779964],[11319,"0b74489a46a4917f14dc2944c500341ebfb32879685ab54068510c7f43c8ddb5",9.317957166392093],[1593,"855db972c37ed3d0f0ce3cb1995ca97ea9d66bd09fd96f578efb01a2dcf895f5",9.917710196779964],[9764,"9f73534aef6ea0eb4f17bae5c2a65e6c1a2a3199d797b4a7d3599e6717fde7bf",9.917710196779964],[1356,"e41dd036c8010b578b2b10630e1a9fa71b497567e3bde9c24ed33a362c0f04f7",9.917710196779964],[18654,"155b2523f308905bf7a79fe4ad4ec33736dbad78cc0e5015223edc00e7327c2c",10.052724077328646],[5522,"8da999008cdafc2cd364e05e96d34b7b3fe80635ecd769534335a82b8df619dc",9.917710196779964],[19274,"ea6a05e93bfff03c6b8d8686bf3ebbd6b8b14c15e37b266c7e44b4d447a6d015",9.342789598108746],[4033,"4ded70a0ae1270d1e6b2fc3e2a975c54174ab0743a56ad1254961bd418d88ce5",9.317957166392093],[7720,"6d6355d0289633dc8c4464cdb4772f0506fb6d61f2c9437b10a95b79e84067cd",9.317957166392093],[9906,"cd4da63d785be84b3f8726fecbba215fc5118de76f79937be6d6a1c62014e9be",9.917710196779964],[12893,"c9613ac3aef065366bae464ad227a3c785122f3ddfbaa4d8e366bc91537f56ab",9.917710196779964],[7844,"fe5ae00ffae55a44ff0324fdb5b1398d26973fad6aa1ddc1c1f85b944c6d8bcc",9.317957166392093],[4886,"82e24bbd8cf0ed18c3cc2a262c9cf1a1847a437be184d32cb06a66b5daefe9df",9.917710196779964],[1108,"ee72f65aa12557d8e7b0c64ca497cd3ea22382341fdf0634df827cf11a3784f8",9.917710196779964],[13125,"7b9fae5c5fba9da7ff968cf9357421bc84becdc8efff76a0e395c9d8c1657ba8",9.317957166392093],[18574,"26683faa3ad4ce3ade4b0b563fa4f01cf934e2f52d700fa99d512ae8e2c3902f",9.317957166392093],[4808,"2575b2b0c34565a5170feae7c0513a57e4afaf4dcfe1b1717722af895fa759e0",9.917710196779964],[2524,"adff2e17185ebb9a1a786ee1fe96f1151140282754a121fa2353bbfc085ea8ef",9.917710196779964],[5062,"44498c427fd0096296b7467fdcaf4caf6c2a38862abe2429fca4ad7c3dc0c6de",9.917710196779964],[18019,"c831caeafa55d1ccbb3597535c234d500519c657389d09194c1d45b7c94ade3c",23],[7040,"1f4155af8626c83fc2c8b9deb1a226c3a62dca507f2fb3383be68e0ffacdbad1",28.064697609001406],[16322,"0ce64045c5fb614e470f7ff4ad556fa96301f5238e1074880b4e09eeca299d60",9.317957166392093],[12525,"ca617a8d33fde071ae2bd4dbfdc1896f6a7daaa6ce365bcdbb86ea193714c6ad",9.917710196779964],[5846,"41ab6a3dc692a2689fc89e327532d42d18290a02a77e479e2ff62729004807da",9.917710196779964],[786,"917be52aa203014809b5f157e99a3e8d21ce57e421b0aed7627ead7f355298fa",9.647446457990116],[6891,"aa9513b7ad36eb6c20585d20b5793b5020974cfb647d15f9a8e7e52fdbfeabd2",9.917710196779964],[13761,"bf5b1047013a0ab128cbd3fd3936414ab46df2bcfad7249ce22ffe1b0cec189a",9.317957166392093],[10640,"92dcfdd2ddb9c8d669f10c0f455eedcf028e6ef072c6374371894e1372ac6bba",9.917710196779964],[289,"80962d9aa07eaac5f0d9bdaf40b5bd795567c5a02debe2d04993c7078d9a03fe",9.917710196779964],[16131,"ce4335e4f2e5a0985553229f2afb548727a2e1c082f736e59c9e8efacda06465",9.317957166392093],[13574,"f492c68cef083d4f4bbc90ef5f71f836ab06fbd034dbdfcd13be5228085a179e",16],[3454,"8ae45242fce5d2fe6f261ff732b51c193836720c0224abf7349b06f2102158e9",9.917710196779964],[4322,"792b0264ec5aee541166c813c4d63345a2c43b7ac13a45951cac9edd585a9ee3",9.917710196779964],[8277,"e10c9d41d488a13ab76abad5677630c8e614fe5e064dd751a5724a79d1d47cc9",9.917710196779964],[6728,"2f86d027ff754556be71ce3d3f2f5a79339de3a48d04d6702d0b89d4efe0c1d3",9.917710196779964],[7857,"c5de21ed7bb83382967d841d9f76e66abe929b98dde27c3b941a5521d5117bcc",9.917710196779964],[11078,"067b4c50c70270faa249dee568c67128c0985b0c8fcb0d9c6a710c35aaf06fb7",9.917710196779964],[19836,"ff1afebc85fd5d39f2ba3927e38a13bb7c53e3b114c6a06e25988a942a7f5201",9.317957166392093],[17779,"b399010d12995faaa6ec2de4949b1a360a3396bcc121b265bac36631f34dc541",9.317957166392093],[8393,"f6a4b85c5f6c855e4cd32efd91c8f92784a55586dca8ce1940a050efe45ea2c8",9.917710196779964],[9042,"b005f6e2dac3d324414c80a50ae9e940933661dd4727a905dff2c9367dfe81c4",9.917710196779964],[12461,"3c82fa7fcff36bcf73ec1536d012e404c3cfaae56b733252af28bfada3a93cae",9.317957166392093],[12281,"c7de70b29fe995bfb9f4b8018745649d0e265322dc7da72f73c4e8ed6e9969af",9.317957166392093],[14989,"53278493a69cc40510347dc34eabd66804f11efb198162497c890d6e4c30b67e",9.317957166392093],[18669,"ad4703270ac93a6d839819576b7d76c6f5957b0e42b9276bb40a7c8dd259d12b",9.317957166392093],[8156,"ccbc2037567ce4aefdc583b52b301747b3a7047220adbe230c64e7819e8151ca",9.917710196779964],[17602,"13e2aa1be1578fb77ca1e659bd334e95ea3115a152d7eb5a2db4901ebcf10445",9.317957166392093],[2265,"60dfe39b91c5a1509570357e0353f2662f298e2e86b6fa7b200b2c8c73df2df1",9.317957166392093],[4888,"3a1a88a959b6a2d7554d5890627cd6dea88c31da3c1f62f1ec81a0901f84e6df",27.15],[4711,"d67c0a2bd26bae8b435e85d1a11bed8fbead5d3fd993068638e242082a4cf3e0",9.917710196779964],[13669,"742340f0d03690dfa57ec49e7efbfeabd89b1a4ae733d28b5020ad4e9531e39b",10.052724077328646],[9248,"174bd2ac7b29aad9b8b61ca36b181c6c2a9a443eed6fb6a46769d80ddda122c3",9.917710196779964],[11759,"332728b6491096e0d724e7b3d8b93d4273b17a3dda70648cb096140ac25aefb2",9.917710196779964],[10181,"e0efd5b61723274eb80ef31877eff1bd79555ee594dac3fff328bdbe996924bd",9.317957166392093],[485,"50b3b63fc751644439ef683f17d4a555784d41db37f99a88c6f1ec4ec61fbdfc",9.917710196779964],[6911,"de3dac9a7fbcf8e45ad10698d08f5bb27853b36131035b904daebdaf406d7ed2",9.917710196779964],[18285,"0b90c812f8f7c6f37ec434c6f40c24557fa9bb41ff978ee5b246375841142036",9.317957166392093],[17200,"b06444dfe30dc692690e600ee652c684364876e28c59e7de8b328e69e637c54d",9.317957166392093],[2552,"e153a5020f579ededf13ad59820521c512d2becc545c5e11405f020db0f386ef",9.917710196779964],[9721,"4e7ac18131925eb751bcbfab2da7e1a68d51cc89a9024f22537af17c892d38c0",9.917710196779964],[18655,"404f7360ec6e06a49c40ac87b4b7476a8aa82b5c9b58b1b70cc05386b837782c",9.317957166392093],[1587,"641054002af5165a158711dc64c1aab8bba6fd18fc070b0a78b1079b90ea9bf5",9.917710196779964],[18433,"05ac27f062be70012bc87363dc48be28f2d37794771810e2beab8be93e2ef732",9.317957166392093],[10530,"ac8d00fe00ae344edd570f43a5537bb6a19c0b28ae1b4ff22c150ac17ba3ffba",9.917710196779964],[8695,"1617d6e2f0377e2f61b93fbc13b02dd326af4ea877ee705a21d7cb1d3ff6b9c6",9.917710196779964],[13968,"755d5f9edeb965c4cc49c6f3d1e98b71e01d639ebb46f87b38b0ada0fcfaa495",28.19221967963387],[11014,"4662c3455b03a82641bca2fda20154b039d3e19e3fb1044fc79ab0584447e9b7",9.317957166392093],[14827,"a40ab8c0df05949c27e098e616b41c48e66d22d5ca8dba3572c6809671925282",26.00755857898715],[19160,"0923cb9db94bfdf2baa1cc8f61475a00f44d097cf6797f752e380b6a0ad4291a",9.317957166392093],[13271,"6742163370a7043fef2cc563e15dfd896a7891d71f04054127741c61fc4249a5",9.317957166392093],[10095,"b4bc40ae173c18dc9661a9e56cdd59fef6a4eaf27294858d6e1c38c42ae5bfbd",9.917710196779964],[4065,"a8ca396c90cb082273eb6549e8d9f6b1a64b994042c41a53cb74ab6195f055e5",9.917710196779964],[3488,"d1f23d26f5070e853e1613a3b59ab09a43a10197c3de4b3358366f4bd28219e9",9.917710196779964],[6985,"c282ee15116de5237fc8075d6cf2e4c57b5cf2e22ddc86eaf577d38c4b2a17d2",9.917710196779964],[17253,"24b70f7fd7a281609732f6157e63acb2e9a35f5abcf9dcf5bcbbcf084612fa4c",9.317957166392093],[18191,"2a7c465355a39b676c205149c041d564e14cd903e438ef3a588aa5d30c686738",10.052724077328646],[15885,"c4d979632983074d884a2adcf8b90ffe0cabbc9d44677ef47bc7ad83b2194a6b",28.5158371040724],[4598,"7ce8c38b684670407be8cb6110514139e1a5287e0cc4c9b48022bad5487ba1e1",9.917710196779964],[8078,"77abbe0d86418c24aa1d72614dfa4cd450672a5ef795dee3e006c2adcb8be7ca",9.917710196779964],[7060,"583324465f105ada2140cabd355336443d5622fe6a33dce492fd775a9ead99d1",9.917710196779964],[9070,"99d5849cfc599d61a04d500218e60bffe20a3af238279b177b749a4f575a55c4",9.317957166392093],[18755,"b0720084a4d319be9b580b3a1e06a6f72ad2ecaededf7b54a89fa0e06f7c5828",9.647446457990116],[18180,"674f2a84f6754ab93c914d125412f3b9070d38d3d34032b0a874932e2740af38",9.317957166392093],[16679,"2c0a434260a9dfc76cf5f274ccfa301fd8d3c5cd686534907d76597a85a11459",19.25423728813559],[8177,"81aea5a66cbf5cbe1e574e66bfa4fd2883f143437a607c67179fc8e79c2021ca",9.317957166392093],[15030,"feaf48d395e91a3c8cf6ec5f71f40ae686f698d58e5acb28a6835002122fcd7d",9.317957166392093],[15289,"ec8d7099c924a57ba9fa4699cb773beb1f5bfb6fe5157769a552eb1457ac9f78",26.135593220338983],[3660,"2fea89103c694a01153ac975961be7ff3d974b9c74de257726bdcc01b257e0e7",9.917710196779964],[15193,"eafaea6140c67bc3115869a2b0da9fa2557cc3fe57773dcb919f8a9cdfaaa47a",9.647446457990116],[2364,"e3d1ba0ef2cf04968f057c3f1637eba8fd3823f6c3c97d1da9bc98846928acf0",9.917710196779964],[18726,"51431e898e965e2e4742475c76c9fa44c21e6811c6d61d0a9b011c8900de6f29",9.472566371681417],[4518,"3d8014bb1727f05cf1d60ca7707c0cc854d0e9b41077650b4ea41cdbd7a83de2",9.917710196779964],[17912,"fa60563de98e8217fe4a999af7220b3f1c75dd6982d5efee0b1a444e1a88093f",9.317957166392093],[6096,"6612c748590619116854cea6b5536035252dc158a52577bbd87315ca13bc6cd8",9.917710196779964],[2360,"adae0d202f7272e762e00c387aa40e87317315886b4e43e2e35d62fe8ea6b1f0",9.317957166392093],[7233,"0b3d4d86e9d788e2b3b8ab200991d8bf9f7776443221c126764d8f3b66df7ad0",26.090592334494772],[16564,"5985959f3e309035fda07221a1ccd8ce44b1befdabdddcb3242e015819d7cd5b",9.647446457990116],[11342,"e8f534738ed974eab8221a2e80c6681a79fa07104a823ec85caf8b165f63b3b5",9.917710196779964],[13860,"5520227404fda8f4671a18d52da8d28b8b3c2e2ec0236321b36d2cf8d2f33398",9.317957166392093],[7677,"5af1e7b6afd97d8691715ff588c9bc0ed771b773d6d2c100e505226dfb22bacd",9.647446457990116],[7179,"a42f128bfb4b788d67f65acebcba889dbc3932dcec9b151f7ef8560832a0d4d0",9.917710196779964],[17768,"843ead855219f24667065c01e77532be294fe043173e7a5675b25ec7b1b7e541",9.317957166392093],[4667,"8f3e9e486995cbd33b9ddf4b89f8212f3aaffe218d5184b44e59c6961d5f33e1",9.917710196779964],[11299,"9319f8bb744d834ff26575d8ab1b2250324a6a39bbda59f2fdc9142f3b6710b6",14.051915945611867],[3653,"bf6f652fbdec270fdcf7a1529c198a998f6f79b61eba665142d8b0ec3239ece7",9.917710196779964],[18417,"2034b8764cddbfff68e1a4517612c506aa3ba3ac78e4297901ef73afdb603233",9.317957166392093],[1097,"558b918dcff2f3ad36b8b7cedd31d1155658176e45dd00b3da057bbae9df94f8",9.317957166392093],[15194,"38fd8f6a57e1d01ae9a123e710a3dbc4b3556371dfe50537cbbd1302b1e1a17a",9.317957166392093],[9701,"46b8eae695c91f787c20bed4f5b462ef0e4c5c3530a2647161f88c42d49a5ec0",9.917710196779964],[19622,"c0fbfe24d878d431584529b475f56c7ba4261c1d48db29c85041a47da167e808",9.317957166392093],[8004,"45e5bf6a82ab3fe25a9a6bf2e1afb81b047cf44ee89ca6b93224b85af74d81cb",9.917710196779964],[14628,"e243780a4269a52e083a737533e89b868d63c6c0482a2993f9b8bb329e9d7886",9.986576933544288],[18146,"261c385f02e85a3a400a02f735be92d544c35b5e4395f298395e4850aaec9439",9.317957166392093],[11618,"55d011e95e01bb32f0e349c5c25edd3a5a41d2d01d6486e80373e0e7b9a8c8b3",9.917710196779964],[2559,"b0e359d474e01f6f4f3d3253e12f2270db026227122346299318d51c88a97fef",9.317957166392093],[8632,"865af64b8193c033325e8e516ed8037be36a93de2f94519ef463c0a8682136c7",9.917710196779964],[17294,"5013c1f0e620d4895e6bc95c203b1e718bf21565529d2ae92027b503434d534c",9.317957166392093],[4146,"7bb5fa23e6b68cd614b075db33cc3fa1d5f11a9caede7614ccbf0eb27f96c1e4",9.51504424778761],[19706,"4e6d2a3f9d50a04fc47cac301106c4df3661e1b555b2d8cf4a99a306e0109506",9.317957166392093],[3530,"b0edbf646a0d1af35c0ecc342426dc6313d9503d086cbc943004712b6baac3e8",9.317957166392093],[18686,"74e1da38eebd7eb45dff3708e900a4544c400cb4b289e2fc477cd56a3e8cee2a",28.89679715302491],[1994,"bd23ddfa93071ba54d36b5e44d5b11f0bfd77d718ceb1dcc8735fb8544c60ef3",9.917710196779964],[16285,"864f11c01e36e7ee747e38304e1e3984e338d5ecfabf23023d85cd44961a8c61",18.185567010309278],[8821,"32d4ff44b91d1fdde26adff1f8261f045d737f1931190cb7e5a8187d3798f7c5",9.917710196779964],[3525,"f7b7b7dcc6e42a21962e566c06cf50fa3ee7b7cedd975697ce38a4e35264c7e8",9.917710196779964],[14525,"8c78fb7d50054f671b28d9d30c5b93d13efcc0d0f85781d27eb869b23583ab88",9.317957166392093],[13717,"e5a41df33f3544cbf5c4b3517130308c5c3ed57fc59a8854c777b458b437049b",32.37202241421651],[3244,"e1bef73a72bcd247f98fd3227a8837cc5e1ddce2ddb1e3c421dbdc518a77b3ea",9.917710196779964],[11796,"2205239e5ae3b59c877b3fa4788178e836075ca6718fb59b67c20e151d53bfb2",9.917710196779964],[5929,"4be7ed10445b00d99c0a943fc70ba3dd99d77968f75626dc686cf21a620080d9",9.917710196779964],[15602,"1bd54aeff90c2154c214799998ab4334c8019a005c60c1b370909642c8836071",10.052724077328646],[11836,"3fdc2b1f1b457cb342930f91e1bf45137dea371ea67cd55816ea2310c2eb80b2",9.917710196779964],[10286,"e34d443af998f78131dfa6563a90b9236617c9bb65fb5d5d967b5be230de79bc",9.917710196779964],[19839,"a412b7301a3ccae5979c0776009bce21c6c43249162e95670bd52e1826f23001",28.087636932707355],[2694,"1faf2c7c8d3f69c44ba0468a05349c5bed7029f404dc22bb81f67200e14f82ee",9.917710196779964],[17256,"8b858b3c1898730c7ad22a9a25f68877e7e6c161a356c8a6474e08108736f44c",9.317957166392093],[400,"692c1ed28ac4150d03d1ea7c5381a1b92eb72db767226be1cc00b9dc3a1a56fd",9.317957166392093],[2437,"98d35e2a1c2caed95aa5ac0722b909783551c3d41e4eb389dafbc44aac353ef0",9.317957166392093],[11383,"86caa50ae00141729517e109a39c025111bd8a7defb0d524dd018d61cc927eb5",9.917710196779964],[2538,"9aaa0a5f0e3833c9ba902640908e07186ec7380309fcdb8341fa4a42180c95ef",9.317957166392093],[1325,"21521f0b5082041e89d1013bb3d38276d88517cf1d701d0c486dd192ba8540f7",9.917710196779964],[16079,"8568da49f957f48c212a7878fcbd16913dc5d53772aac50b168691495b1fb566",9.317957166392093],[6178,"74f68117aa7d5da229cb898076cb5a1b361a8d31869746d0ad48a4a0074cf0d7",9.917710196779964],[6352,"39c50a90b188188a01db29e06135df7cf05554c4fa0f0b7041171395df60aad6",9.317957166392093],[14395,"2e9e1d8b52bb834c627c215ec1aad9dec48836b640d0b3a58b1f1febd28e578b",9.45537757437071],[819,"9c493031f77158c091cd56f096585b8aa63b9f5c7f74276a49e50b0dbd9168fa",9.917710196779964],[2947,"60b8ae36474ece5ffbaf5352991fe481badcc26af8cd0d07c863187a9c35b6ec",9.917710196779964],[2516,"b5db99bc9515494a0bbf614a2e488943908a8cc43af36d8c871a3f14fad2b2ef",9.317957166392093],[18911,"481075150fa4f516b301a47a6f6f980f619adaee9aea01ba984dda1f1c170423",9.317957166392093],[16978,"51dc806446567460117fbc61f4b57f392f091c66b6d4067c2d7ca49db0c98552",34.7773851590106],[18815,"0239841f96eeabd5d74d4e71023059b26778b2a253ca445c676b85e0ce133a26",16.056140350877193],[15268,"2491a98e4c88f64deb3407536aa72100a37ef6758fdc7c2dbcb0d6fd73290079",9.317957166392093],[2427,"7cb255969f14453d9a8be5b802ef7878fc9e7bcff443698994c4b3e970fc49f0",9.317957166392093],[17234,"c579bfa5fd519198284711f1ecce598d5810ab09a50f47b8f7d6c3f8a58b394d",9.317957166392093],[17547,"a5bb8ec6654df609e11b13b25d89c9afb04907007f6ef101bf2fef12d0188e46",9.317957166392093],[1750,"fc49ce059d1449929b8036117ec0fda6c56d9c46e1cf7eb584b5d344c9259df4",9.917710196779964],[4063,"4f978a99ae8e074b66f6e457aefcde482edc8e085a4821533ad081d2a9ee57e5",9.917710196779964],[9866,"ea3b66796539da45f5dba1da4bac0ba29463ec1d9b59808c89c68d9f071823bf",9.917710196779964],[8090,"c875232b0a560fc9daeaa40c89fa4e71a42d00fdff8e6504af0afea97579d3ca",9.917710196779964],[7582,"67744159e1606b008d91b59376ac92977837e7c2bfd3855f48316f4ea25249ce",9.917710196779964],[7592,"2d396df642b2081afe3194f6880096b9b9002879861a25364e01cf4a1a8f3bce",9.917710196779964],[18478,"a6c5a3b462fd782cd284fd26590db5ce7ab5a63caef61d93bc7da255adccf631",9.317957166392093],[13305,"b920cf8cef48ff89a55c38f91dabc2cf13fc2fd6b889e21b299c9f96d0eb76a4",9.317957166392093],[8733,"174c5f13a67af7f7d4f7d9c5323e0822ce7bc9aecb351def6e99ef32e17681c6",9.917710196779964],[3298,"1cca5c7410428199fe3cabfb6c353beebb79a2b271fecd34dfc520b5b52869ea",9.917710196779964],[4307,"8642c8df02d2a06a434b2c173ff3c07609b66da4e5a5c93a7f7104cd3a15b5e3",9.917710196779964],[6568,"93105efeb19e5719780fdf118fbd8bd882d12319e0cbda47b81b04211e01ead4",9.917710196779964],[5518,"e1c51d944b569ee440c2a7f635d209bb31c4b0275c8855d58df6ecdd4adf21dc",9.917710196779964],[17102,"bfd605afb60f5a85090c8225b8f103f08cf20f51e7ce7223895b2adff3f1f44f",9.317957166392093],[7608,"f9aaf821c20e51149720e17de0d23d802ac2e76121a925d9103fd09572f729ce",9.917710196779964],[12516,"e1aa54e087f50a5f4d27ca8683e1a91cd7b172d5e47e558af8060fb5b0dfd8ad",9.917710196779964],[3602,"560b79fc6cde42938a3453adbea5b538d9aaa78041adc3820a66f2ce575433e8",9.917710196779964],[670,"0f94f588274a004d883bfa9b07fa0d29cfe435f15e7626e5fc649b4199f66dfb",9.917710196779964],[17019,"f1f98d2086155c2031a4cd25bdbf808bf477c95e74ea9a4ec0eaa2d7f0b79b51",32.512455516014235],[9782,"039ec663dbfe886a8537833d2eac9c08ce32ed2822968487abf75d240b2ecdbf",9.917710196779964],[18759,"6832a153ad329e26d2ef5bec28126ce21f535e19b48e6888d799719c7a943c28",10.021505376344086],[14446,"bf781100ab1928ea9cfaa9f7a966c82b6e6dd793156aba2228ec62ad5e6f518a",9.317957166392093],[10729,"374ea56a5ffafb2e1b5049af5fbf4432560228a820c4462caa2cc127c339cdb9",9.647446457990116],[3362,"0f9578f5bf5aa4be5acb107e758961820938217e3be8e167786b67b382a3f4e9",9.917710196779964],[14430,"d54d1e09b81c146b18cbc936fd7236fc0cf90e12ddd516ba17b67da2f8e7aa8a",27.24],[10229,"08a35edcd1d26be9f2631c3df9af2684db013e0999b26975943f43f01f87cabc",9.917710196779964],[17353,"1ea47c11a56e379b84426ae230167680d1650990c07be769bb84ca344d4ed24a",9.317957166392093],[18351,"7e85cec3753d01024e9ea98e479ab0f87e993715ff91bbc5b1bb2491e5c9cc34",9.317957166392093],[7162,"aacb88ede6873af8f36b31fd9699e4c9b99d27fc801fed693e7a851537cbf1d0",19.20142602495544],[10889,"214be6e0d9cd6d78cbf97ffdd088e1d866cf7a74a4f7ec97e31c5dc35e3cb8b8",9.317957166392093],[10758,"081884901428baf44f755f1f30b832d220ce0358bd0c1de594b282eaa7e59eb9",9.917710196779964],[230,"c11f085e0ac1710499fa7d242457da647cbbc92bbcdc4d0faa4d0ba2f0ef72fe",9.917710196779964],[11003,"a272983858e6bc3bf7fd415d65c675e806cbc4d02361754a8b5bb322113ef4b7",9.917710196779964],[1836,"bdbc80a30110cb6bef74d899b8aed15429bded601104e9f6fb35e450168606f4",9.917710196779964],[17748,"266f51aeac7ad70fa5afec7403fe960bf5c917dd22dda1142948896cda4e3742",9.317957166392093],[17306,"630e75f4adbbcb2e7ef1e2c546c6e19cb80ed85c3f4e779094dc060a57f1de4b",9.317957166392093],[7637,"4a30b13abfed1a7bf7fefa354dc17f85e3fc89e07f0103ecfbe224b9dc23f9cd",9.917710196779964],[6274,"082b0035a9d98ad08bdf4850418384c12ca445e7cc9dc2c9f5cb420978953fd7",9.917710196779964],[75,"2b4799893daefd47dd21832b174d76aaf6d42e1f7232a17d1f6394f63c4a80ff",9.917710196779964],[8308,"da6e5304dfbb4165828d9fe5ade516b5f5a99e80d0dfc88a339a20799b0547c9",9.917710196779964],[1698,"cb23df60703f5fa3800a69f7d0a5383916350dcbf86492355a882c34a427f1f4",9.917710196779964],[778,"dc43a68fa373feb34de9f5bfb9153c781fcf169167389e2d992614cd68a8abfa",9.317957166392093],[3920,"a7290d7ee700c2cb2b2864f1b0a06069b17873c23083d771b7f9c313bba135e6",9.317957166392093],[5694,"d8b7281d8bc0056a2a333b04f4bad8439da11e6f7953b9572ce1cb01d90d16db",9.917710196779964],[13474,"8e564464f45c63612cea8e61eaec930728b8fc95801a009fcf4e1f7d7d0a8aa0",9.317957166392093],[512,"b00e2c345ab94ff6eccc40f22a8236d19ac11cfa19f4ba317494f142f4a79bfc",9.917710196779964],[19125,"5ea0dcbbe9eeb14fe7594ccd9f5b822275063e12b6658f36b11541fb7510521b",9.317957166392093],[13417,"a25013fc53e4425253738df9a72c668e07942c0b07ae722bee612a72209204a2",15.003322259136212],[12838,"01665d4951fb5f4ad3268a9bcdc2c4f29c99a31e3c8a851cc523af9fa62ab2ab",9.917710196779964],[5474,"02ad6afd9fcf3294a02d600202401d10b5941cebc75e8a3f5afdaa255fdc5fdc",10.052724077328646],[11907,"e24dc01edba6af6a101ab14798887fec9ec285d3d367badc365eb850144bf8b1",9.917710196779964],[15541,"c4cbbee477125cc4e51fcf8d6f56f691d1d22856fe13e0053f9d7cb851fb2973",9.317957166392093],[1313,"42e03a41a27eface802263442160de4fbebb9fe4b937eb23c997e60a83ad53f7",27.151515151515152],[15597,"9115e1ea09d3901ebc3b374ab3e5c03b9856de21f0a84ec66b49714e5c4f6971",9.647446457990116],[969,"1e271d9bddcfa3c08b46504185fc60c6ca8c812de82beaa234a13b86222d63f9",10.03257328990228],[15782,"10cced4dc8900710c2d299e48e0255fc6f0bd090f22d51ca554fd2653b80a36d",9.317957166392093],[12045,"1e250460fc5784c48db5e9ea0ddf198eefd46eb379e33e28c6372e2999f903b1",9.317957166392093],[1063,"9a67cabf6adf1d396620a797d9bc7b43609db2576e75a7824ea1e8c243bcd6f8",9.317957166392093],[10213,"4fc88e16cf6ab09fcd0eecec18ae7e776e98c1d139178a47916dc0f5dbfce1bc",9.917710196779964],[13659,"a16859a5fc1c9d1ab12f62f8a3ac68d8b1c42e67a023f58b896713a3b2f2119c",9.317957166392093],[8716,"a6a0e9e04c7d017ca9f216c996f8ffcd621aa3a49fa5a6babfb9d3a7bf9c98c6",9.917710196779964],[7668,"b483aca4c4ceed3c4b83b7404eca46a1ecb6278a4ccf4c0f40d54cf5aacbcdcd",9.917710196779964],[16425,"b4ad449752ab7316d65ffb896dcfe3281300dab42bf26be11ffb7aab61749f5e",10.052724077328646],[4046,"e1722dff0bc07ec4a6a8fa01354e0ed2510105084347327ca062dbb541aa74e5",9.917710196779964],[989,"4301306a07154733eba46586148491be09a3bb02b4afc64ff95458b6e11c47f9",9.917710196779964],[15176,"5a98d57f9bed15ee16484c32230175d663453c5b4d01c8046dc3f057e9f3017b",9.317957166392093],[12469,"a23dd703f8e77bb96be932d6adcdda69a998b2e7cb844b8b29874449f63e2fae",9.917710196779964],[2791,"d8256c219127de30a01e63dd44ae3a494ba8fb4f6a0bbb439c79fecb761ac9ed",9.917710196779964],[583,"ff568b4cd21a939a6f5d5d5198838baf3767e7e9d88d54f1cc3a292d910708fc",9.917710196779964],[9280,"b7282ce35ccd5c1312c8ac7aa0aafbb93d6770ab36b32ca185a079b72bd6efc2",9.917710196779964],[14931,"7d43992ee48148cafd1fe3077e7e352ed81e380d032c6186bf8a04d8cde72380",9.317957166392093],[5078,"11804fdb1b6c97bfab1f9d2929c383019e6ad5ac8fd754935c8375deb936afde",9.917710196779964],[13111,"d93d4822abfd309428adb37a5ddb3565d70b1f9bf52e382671cfdce94fc8c7a8",14.074866310160427],[6889,"dc2925a868c702e9e59015c2e21abce435478b9daf0fdc4c0ccb087ad60fb2d2",14],[7410,"ff7d0ed737f7a6b6e6c51b1e864d69e0a42d0cad222c4f41105b6c24a0d850cf",9.917710196779964],[18714,"1bcf5ade94975965031f224c7d50746ed81c97c737ce220065fbdf8de0ffc729",9.317957166392093],[11114,"e3506c1c4156c61aa983d4896ecece5a9182401b3460d0bca6bed88f208f2eb7",10.052724077328646],[11487,"95e9f1dda230bfd36e31196216f3f49fe4e0b0bd8864e1b113ec899dcfba98b4",9.917710196779964],[11378,"d93f8a62f7dc5b9abacdc36151a8575df7abfc3f1c6e89a23604ef23e4b288b5",9.917710196779964],[18824,"2b03f1b1910df35808dcee9679b472f5812c99dff7a844f801887c30e978f525",9.647446457990116],[3499,"a4e3794199ca5a280fce335affb9f1c0aa5444f243c13a0ba1f05975acbefee8",9.917710196779964],[16408,"7a45d85bcf064d0c5a26ea9695ce14efa6f5631ab24cee99533c685406e7fc5e",9.317957166392093],[7890,"bed2db35dbf673f2914cbddc7610c5c543ba0e7712f354b12fac7afb123452cc",28.126696832579185],[14898,"24619547cf6fb1cc0c48b5226164deeeab3cc915ba33c736db0e7d3436bbe880",9.317957166392093],[5482,"46ac7816de9a92cfb6a0a806cf7f6bd6d44f6f6a3acc22c5213779e225084fdc",9.917710196779964],[5170,"de03bb079bbb7c1df69d6e2c730ae87646ea4267737673903f0d09846f6226de",9.917710196779964],[10686,"5af1c72e4a5688ee59c1b7829a5a4fe42b9fadb4c8383c89e338e5c8d4fe24ba",9.917710196779964],[7829,"4a874ab5d55a4233e14929cd4f1b3298adee6178e148ea540868a97622d596cc",35.82958579881657],[15913,"a04c61f60f5115add57e34ca73eb957b71a13bf394d19f1c07820482f8c7c36a",9.317957166392093],[14099,"ecb85689a8a2e6707a71c26dca49f0cac9a6a6bc42652a6222b91edc5b6c9392",9.317957166392093],[1825,"ad9850289a545c3a1c82e4b54c0f9bb1c4b76cb63f70c4dd03053d06787412f4",9.917710196779964],[13982,"a1a12eb0d03e60a8072319a0c377f8c67e639462a0ba3df75636cf1622fd4c95",9.317957166392093],[18295,"1decbec18fb61a7cbaa55790cca53bc290a2365c71b5f2669d21b0ae0e13ee35",19.066666666666666],[6337,"a20aa8e9c20fd95f87c2f458723b3f17d987675dec1ace297b4dacf56c4ac1d6",9.917710196779964],[8192,"d7ad91151e103e0d2787e56545a6684e066cf311678942e212fdd5172d0709ca",9.317957166392093],[9017,"e49f497346395cb428a367a5662b2b2e58dd3b5a9beab7c5d5c3e7c2743ea7c4",9.317957166392093],[14036,"4699a92a9a4c422524d5a98e6a981a84f160766ca20edafe15db049f5089ef93",9.647446457990116],[19556,"584f47a82642b6cbc0cf25a2a8f025f781e1846bbf9f7298f80871279d7c690c",10.052724077328646],[1934,"d15854b66515ed957590772edb497bd58f224debdbd480cbcbfac214084375f3",9.917710196779964],[14810,"d032d4c24a689b88446c3c6cde9493fb8b0511ec8d9ecadfbc90897d44c39282",9.317957166392093],[3377,"b858e0ce0eac7c1b6ec4acf78662aa10311467e38f26e4113ed7c8ddd74edce9",9.917710196779964],[9509,"84e0df7e49571af857dcd80699f8071351a5ff5325fb0ec9176685168914a3c1",9.317957166392093],[15893,"ccd8734dfab61bf8ae109ac230fd95bfabeddb46eb509fe41bc4d439b735256b",9.317957166392093],[15183,"87c5214ae0491b9fc92d87659febf1466aba0f0e85928ca3b675d1e28c2ae97a",9.317957166392093],[162,"e39abc2588c3ef48483ffbc417cee3cc6abd028b8fbd5926e1470410862aebfe",9.917710196779964],[12660,"51d7f3c5f66a7506df7c8ff7d26f65ded523ed945a2fe9159acf9353a29fe2ac",9.317957166392093],[6222,"3345351ace0b8ff6cf26c6a955498e175b08e089551f941c1196a24e136d9ad7",9.917710196779964],[14746,"7fa4748aaa0d46769071f8e7c7d059becca2077838d3cd8a8c21691a89e7f683",9.317957166392093],[14604,"2ebca6209ebe9ef3ca7fbc00b6d04150bdaa8bae2a664b8779f894df14d50c87",26.115555555555556],[5506,"6819856ef81de831629c970c27ad693d51fd493b3e631226fbeb1c5dcba72cdc",9.917710196779964],[13120,"c3a78e37384bbfdd91ea32aebb9f477f17040e54a008c551380fa2bea4429fa8",9.317957166392093],[14579,"64b46e94441d2017449d8f86799f718e3e7211f6507c0026f7bc849ddb818487",9.317957166392093],[4831,"9b02834cd36fd48e91ac3768799c2e21b3e83640a8456eff98ac33ce08f33be0",9.917710196779964],[9679,"bbaffc7025b2229a58191980dc48964813e22d5056609435f1257370aac185c0",9.917710196779964],[16368,"a4e866a2aee125a396632e2bdb66488e5e390091d1df25fd75a6744cce0faa5f",9.647446457990116],[7344,"bb678639074e78481e9053d3a4ee4dd8661910ae97da0d82efaf44b74a72bdcf",9.317957166392093],[14372,"a3ad5410cbcca2cf19a57c696f33a6e97e523a69548d6a1f211317dd94dee88b",16.16724738675958],[2446,"abc2c3a7a4baa00a29794630124c545849ec27461c5f01240a70595f909635f0",9.917710196779964],[3202,"bd44d9f3a7bd7d4d5078c192249e11431ff0ad3158c1b8482e1cb28874c909eb",9.917710196779964],[13332,"2d0faff9d4f1faaadb6317bd3249a8fb4e66f8207bcc22a619327f963e0001a4",9.317957166392093],[17301,"29490b0734395c689c81ac9ea839125e8ef398505edd35fee6ec2a8f0cd5034c",9.317957166392093],[8076,"459c7aa9b0cf797fff486c577511e9fb1545962a73f4b42f4c79c47b6a35ebca",9.917710196779964],[7808,"025d1b21eb49579628a7cefb2b0e8db0712d36d605189230f2993f31cdd3bccc",9.917710196779964],[11924,"1939baece8d53511b053605fc7a199209d6980c93083afcdfcb10f4715c5ddb1",9.917710196779964],[2002,"9361a418fa5d2cbab4c7ab852e8f07a63c0852f7426165c0fe6db96640e504f3",9.917710196779964],[1231,"5927596ca4291303594ebc50df5b517d36d906de95718ecf8c959ea81164cff7",9.917710196779964],[4721,"c6c36083c9471ea098fe373321f7880164030e7d91d233b943713d2ef723ebe0",9.317957166392093],[7295,"7339daa7849a1bcac85dadd7a6603970e08114dd16c279a27f45c5c24ab319d0",9.917710196779964],[16213,"c406b5de5ddab6c2a56e50d94b958887913fe35eff026b53f59e15cbffa48463",9.317957166392093],[14010,"15a1e654d729c31377495201627f54c9e6e2078a0cef1cc50c889b5740549394",9.317957166392093],[10738,"66d4110ce14d0e0e4c2010a69c8a93e92db1401b94c1ad9cf3176fa1c307c0b9",9.917710196779964],[4020,"50cac68b1017b0b5d11aac13d2f8c4afbc72f75f8a0ba9e09c0106640b44a0e5",9.344947735191637],[17459,"6b96e078a8109a106b42fcbd16302540cb7462480c9befa11167904058ec9c48",10.014641288433381],[1434,"84b9b7e75d2e207b470a6f605f955ce548a4448fd70ab13eae7a256dc1119cf6",9.917710196779964],[19585,"45529cfdb0fba815f9d17b96963cdacdbd8357e0b66180e83a12c3cda14dcd0a",10.052724077328646],[547,"bf41e803598bf7e89ce9a68c1003b149d1c1eba271e7090caaf1c007282b4cfc",9.917710196779964],[5898,"4c9e9234cdd1d93bde3f49a07a1041e5baf743fb6d589009097a9186f99db8d9",9.317957166392093],[18382,"518328abef51f80e0b0b77bb3613426a8575331ca2948da3e69e6f3d84e8f033",9.317957166392093],[8782,"e578b54417474402474807a63757038f9c443463d9f7f7232934823c0d8c2dc6",9.917710196779964],[3073,"71478a627bb8575d2a2751cc2273cb8e8e1723e3c2f3ae68cf3cb9a1dc1ad3eb",9.917710196779964],[9459,"730a2bf23b251ff82b53ace3d99b0e27ae54d4ede7b4fd306d7d7f60f24af7c1",9.317957166392093],[15087,"87831bc13038ff9d22ce99d80262b6d347580e519a91077338c6dadc7fd8ea7c",9.317957166392093],[19725,"f0dd6ab293b4e0af07927c86da80ff6ca27cb723886b935ff0ecd15280add505",10.052724077328646],[18420,"5db6e43a41ef05066c83e8f7fad8414b7e48f34ff97e2b3167254df358e62433",9.317957166392093],[14354,"ad685e8287793d86452fd66685d3149b6dd8bd7408a3976db64da6a453324a8c",19],[3997,"fd235d4adc1a54b6022b1ea95c9fcd9916e78eb56b65d35c0fddfe892dd2bfe5",9.317957166392093],[18128,"57b9298b1f2c5eca5d9b95da2aa3a3efaaa234fce66a6b5ffa1ad182ecbd473a",9.317957166392093],[5985,"4037602a816ba8cbe88fe0dcd0445e307c4fa131cd80bf07d17ab17353ac2dd9",9.317957166392093],[8233,"f6b74bfc5b6a9587cf5af534fd784193291413f9260f07d99fae9fe1c54dbbc9",9.917710196779964],[5189,"e3aff4c4486ce26d5ba408b80f576ec06abe01f76cccfbc5a280a38ae22d0dde",9.317957166392093],[697,"c3e10891d1e31b3d242acbcae5e3e7ffb73a623e1eacc3476315a9e3a79d43fb",9.917710196779964],[6679,"dde7748822a3a48339f99dea9a78b70e8c8da1f42bef5316960e967a83c41dd4",9.917710196779964],[14418,"5fc69d121eb858615d668d1d712a94fa5546fa54f251088f8ebafcdb31f8f18a",9.317957166392093],[7952,"9436e51528e6f1224f1bd4bacd5051c05237b26e117c43b1bbda6c15cfa7ddcb",9.917710196779964],[17781,"5ccc13f81320e8f28b26239560a4ec65963ca960e9a9737b7b524bb227bfb441",10.052724077328646],[12077,"51acb7cf9650d2e582406a35396d380c742b96a136b261676047cb7deab4d4b0",9.917710196779964],[1944,"3dc4b962cc775263c348f0aa284400a9032a28c1e246626c8cc272cf47cf65f3",10.052724077328646],[3476,"4ba38d170bcb6900d12a81f13f7d6692f1e4fed72cf64fb4c7c022e8854f32e9",9.917710196779964],[19499,"d3f23f029181feeddbac5903895fe560cb9c5e17df96cb2622693bdd0bab5c0e",20.106194690265486],[13774,"125c6959658450066a62078eb4767e3a5f3915ca2b847081cd6287ffd81ce499",25.98428290766208],[552,"980258a3726c67aeb4f5cdf98180e30b07cc72e7b5dd1050187362f64e8244fc",9.917710196779964],[3502,"8fa9af830476d6ef6d3edd14a96b563ebed2f1e7f03f1deb357da1d3adedf7e8",9.917710196779964],[19826,"08e3f575acf42be76a642301c98a66e13a8a572dc486a6a6c0577cadd97bbd01",9.317957166392093],[6202,"cdc11e7febcd1d356d7ec47fd8dba07b9c26e2fd67d38ab1124bd0b826d5bcd7",9.917710196779964],[17705,"32af75684ad4c196f4c81594180c874f81d2668daed693306a96efdc94601d43",9.317957166392093],[511,"5cb36b2018f81acdaf47ecb71e21b58ad3f789c74f3e91f93bb171d0806d9cfc",9.917710196779964],[8304,"02a15fede9dbedd4c9347117637add7772bd2ebf970799716a68d49d3fac4cc9",9.917710196779964],[7700,"7c84ade63ae9f2171610f5a5539b1e59506d80eef5e0d574a9addf033e078dcd",9.917710196779964],[19597,"beb06be877e8b166ff7d286c872af2f94b36545fdd9f85a573e59eafe710260a",9.317957166392093],[12895,"9e48fe579f5f41f4e504e30a6cdadd2aa598a384a8b8ba626e39850baedd54ab",9.917710196779964],[16680,"7a490e2d465d3cd03b2b8cb963d62114bf4726e27680a95de6411230722f0f59",9.317957166392093],[19484,"7374bee7d5561f68f72b8987e36e5f17ca98a945978a69830c172695f3d6f50e",10.052724077328646],[14448,"c56eac9a80d552498f3fe3f4b5c1178cba5d8018839be352dd85507490514f8a",9.317957166392093],[10051,"85946b798fc7fe3427130f5bb4fcdb8bdaf33368600ec1fe8b8f6e4630600abe",9.917710196779964],[16303,"419110fc535c943e18c916cf19381abb179393122afde651b2cd636aeeb30d61",9.317957166392093],[5882,"f683a72783203fda0195375c3da24f40d550ce771c79d95577438b0a9471cbd9",9.917710196779964],[14695,"45a75201dcb88572507b002c1f960cdf5d66c3b4e087662ceafdc3b69a52f184",9.317957166392093],[6410,"405d49e4ff7e1030b2ded262e599cb9904b9d8506c34ad55e282302523d643d6",9.917710196779964],[6806,"974185fd810a165a940debd7423a2d3c69be031a1370f44faef560f1faa239d3",9.917710196779964],[7650,"afe1208ef3c3a5571c95cd09f9f2dc807e32f625e966bb502818b831bd03e2cd",9.917710196779964],[13300,"75a56aae5f8089d7c18d05e0cde4298fb2c13eb1a020e0fb69c9f45e93fe89a4",9.317957166392093],[11495,"5ad6321c14c24f3faae562395a5b217054850726022ebf83fa2eb409239b8cb4",9.333333333333334],[14058,"ff96fe4ced28a3de9530ecf6d11e272e688ca6c2182358397390a783cbe98593",9.317957166392093],[7714,"3fe79e1b5bd079fe606322b4687851a46fd42a722dffa74395751a404eae72cd",9.917710196779964],[9045,"e055d84f9e91c31a331bd280dc9f3a7a884e5ff8e91119342892c9d7c47b7ec4",9.917710196779964],[18594,"ac35e93d63df5f424f9bf2d5fad6f62c08ebf6ed7d30420f948be206fefbff2e",9.317957166392093],[15952,"253f626237b0ac0eb5c3fecd77b0e87d541873d3b2fcc3da838a042ab851e969",9.317957166392093],[9486,"3d31b668f1048d0254d7e441cef77abc3e803379431e2c51ad0de33ddde6c6c1",47.79250720461095],[8594,"36c2797ce3575dd1a56e9cd3b04dba38ab10d8fd932258576984956c28e17ac7",9.917710196779964],[2868,"8a4741037a25e057e56163adbbe4e0e92712e4df783bc93c9fd6c79bf6c64bed",9.917710196779964],[108,"5f8f9e6243b93da00b704877a54084d10cb49c3f343d1dd1cc5a774215bd55ff",9.917710196779964],[6601,"dc2171600d2203ae8e65daee79fe3704347d2b65badfd0bddafbc240c888a3d4",9.917710196779964],[13389,"5d28e5752758529592a26f76ca66c7ac1ec8000eaf2aad0e1fe083619d4d9ea2",10.018281535648995],[15801,"2d1300a5f55c4ed927e1e6389a7cb0af173b3ccf01b8c26c2d48d553bd69616d",9.317957166392093],[13541,"f60878bdc667b89082cb18d98fdb278fee357c114fcb46cacb68eb137871ef9e",9.317957166392093],[3457,"407278431191b6aeb4257270ab4dfc609983ac3d032516fedf1e027ad9f355e9",9.917710196779964],[11303,"d85d6721ca7dde33786f4d438079913698c4924f9a8c3c788a0c4064d59cffb5",9.917710196779964],[12313,"ceff8ff13bf29d0fb04d5d827f0e11cc995355e4b114a4426c45cd45993827af",9.917710196779964],[16091,"46ec7cca7541c2e99bb4bdb7bcb565681f3e4fd5234997106b4c66738e7f6c66",9.317957166392093],[6299,"06c28f63108cf33b4f806530b8916d9ede876d13368b3bd3fae1881b9f5308d7",9.917710196779964],[16095,"cda2806d786c3a0bdb755576486dcb94fa6ffe955c05ea80270b926841af5766",9.317957166392093],[2560,"9a007a12593597748e4ef7e6bda0cdbef469605047b51bf880556127a69c7fef",9.317957166392093],[18421,"a4cc5a768e9c8848bd4bde0c823bc4f495cb6a9f07d14a3ec879422cead62333",9.317957166392093],[13640,"c2760bd4d4b3704e90704536704e35ef916fd476331fcb12d9c90f3a1bb9899c",9.317957166392093],[18455,"35d71d462ebb8924344150bd8e6b65187167255d5266ccd5fa5a74cef0a17d32",34.80504908835905],[1670,"ab1268b9afd41027b8a6e7e3fd094de1b71a4c2b97b7ea795d9fa6096e0820f5",9.317957166392093],[1975,"9d6cbe1aa2f293352d2e36ee764a0e71441b216e54a4a5f1f7f2a0ac5c1b29f3",28.100358422939067],[5844,"aa114ca5ecc0eb8a27deed86a0c595642a5edb268f3a9e0168d71d52ca0d08da",9.317957166392093],[752,"b17fff1b61a7206ccf7d85b96f0ab6f41342f9bc77cc5b5c726cf463dfd5dcfa",9.917710196779964],[16650,"d2d0da14a13dec4a7fea6df83a0673475e8ea47d6b72808076fefc779012c359",9.317957166392093],[19635,"acd7ebdcc4312caa3e8fb8666fe0c97ebfbec395540ea5f06b2559d9ad455508",9.647446457990116],[13822,"93cd69d6a993befe22a5d8edded6774b2370704ee73eb1fa7f4e4fd036d40399",9.317957166392093],[3482,"74caa5251b4f6af6571674fb9c999ef008c5c251ffe6ff1e6df621215ed126e9",9.917710196779964],[14301,"40d300098b49532c19c4890111b8dcfff01f870ec52a29c96af355f50d5a7f8d",9.317957166392093],[6006,"fa7ee33916448f0bc9811ee9baae17ac6360bf33a52fcc4b0d5346c216f108d9",9.317957166392093],[11106,"70f179b065b16173e1c23db94c7a65861093acbba2a0512432127566a22337b7",9.917710196779964],[19286,"149f314646c03cfa804fc75f4a2745b66c22c5a1ac477763a7923e2de1543d15",10.028818443804035],[12861,"814a95aaebac87f37b13cd6f825ce551c6fda5cba3bb73a32fbaec4c915580ab",9.917710196779964],[13040,"d48b927dd269e9e0ae3da276012397ef6a06662b21508c0e012d3811fd9d4faa",9.917710196779964],[14071,"34fa8f075b108941f429e82b58360eee28ce9586639ec08c36051d6843814593",9.317957166392093],[7653,"57ea102e15e7fb2f08196f79beb67e6f7b9c73f5618f2cfbd0abcb7ddfbcdecd",9.317957166392093],[16684,"bb561dd6b9b4e9e67238b922bab3894f8db2328bff5dc665ae56ba720b0cee58",9.317957166392093],[13961,"133a285e5852675894bdbb0d05b7a00fb9374ffbc1cde1fcd787c2d73133cc95",9.317957166392093],[9556,"798925c76ce6421c7e5a08d7eda487c16e1864a65acdbd3b7ce307a471954cc1",9.917710196779964],[11905,"400aa5902d4f158cc1c0c0d9e82a5667a52eba0bb21095cca9a7eb5d870efdb1",9.917710196779964],[19812,"2368c80cd25ac772e5d797e7aeb82b2f0683d7b464e8855d8eb9eefa7d023902",9.647446457990116],[14617,"2a7cc20646c2c996f929fc35f4d22bc63a8687d2462c47bb92e15ccf9628b186",9.317957166392093],[14053,"8bb90ce1cc6732f506285f5bed7d402b4b7a5167bba7c674d0e64ad43980a093",9.317957166392093],[5090,"08bd6e30c1bfbc8fd6cb0a31c77f7c2324c5899da66690be18fc49d462cba2de",9.917710196779964],[3584,"ab5cc010c6d466be4a17d0469cf6194d9852ab6b3a56e76ee46d46de8fca68e8",9.917710196779964],[661,"ddf918e514453dae260bbcb305e6977ed62a7f3307563e1919bdd10e41e882fb",9.317957166392093],[16256,"f312148890756a2d34de8d8ae8324eddb7d9b585190cb25ae281c594dbdf3262",9.317957166392093],[13753,"6a0d162272d560430ad4090f1730dfbb4699fc1081743774e24e2fb83711649a",9.317957166392093],[17637,"625c9975056f3ad278bcb36cdcdc3ae44ccaaf252a25eb547132953acb747e44",9.317957166392093],[395,"018e4606a165c51d53ce51e94f54c92cf0b7dcfd033d974e4255ae2ff55760fd",9.917710196779964],[2135,"8c50f522f1d21d026cd0319060a0a12d6260eb1206fab40950eb28afa1a305f2",9.917710196779964],[13087,"a9f9e890f0d4cfaa19026a97742f4ab19448657721bc7e76d22d14060effc6a9",9.317957166392093],[7202,"89fee6679ff1a474e73791298ad536800db1f8856c58aac2c5ef2aed5d16b3d0",9.917710196779964],[6743,"dbb06f1432aca27e4364fec7edd430091b0bafa0678ff1b036555cf515b5a2d3",9.917710196779964],[6245,"29570ba72e4c332be4ff894bf3e6e3747a82755e1b1f3b7290d85d4caa0d6ed7",9.917710196779964],[19164,"57b0ef5bdac37e8a427b9f8b5a9ef900fc528f1e3fcd046c00a62f3dd5eaea19",10.052724077328646],[2480,"fa5fbd2af2d6650d7451d68c36c75e01e10232acdd131ba76af867f7e6f9fbef",9.917710196779964],[14333,"4256998192f3d32b429866ec9bc52e0460a8938a89c5eef1c7970578f60a9d8c",27.902268760907504],[14831,"814c962ddbb02e2d97d551b1a12c7822f24d009da9b802f4f72bf9afb05b4582",16.169611307420496],[18586,"e8a5d3afe69a3f5943540228d5197ce7af6c450cc5b243b44f5135c062f8422f",25],[19056,"2238fff47accc8f34fd57a138199da1295067e852efa7d006648cc05b3e69d1e",19.54624781849913],[16234,"92576945a5990fa92cdc60bab3d73d846a3cd52eb6fffa51d9189923f86cf562",9.317957166392093],[10777,"b0a07f0b454e7ed5499be0438cefc1b7edd5369f344262cce07fda8274b372b9",9.917710196779964],[9253,"b7d56ec673164072ede3bb0238c71c65e005e9a03f85fb077162a9bd2b6c1fc3",9.317957166392093],[15287,"956448a2d3e31bb3ccd41ffc34fcc5c57343c4af34e42cec144ea080df95a178",15.003322259136212],[19579,"a1e940723ab44707fdf72c20342df361b00b32733dba6bc4ccafd67628b91f0b",255.10204081632654],[13021,"be54ce085f0e16741d62f559dc2136fe7ac25a2801803518e99eacd2ac9671aa",9.917710196779964],[17607,"bb39cfbf0b5d6934acb91c9cd4531c5f1c72c9b180475f230b23ffb57ed3f744",9.765625],[19851,"d859277005148dfb70c576548a476fd5514c77438d0240fa70157121a673c500",9.647446457990116],[15503,"ace13aabe698b60b80e57a8d843a2c731c172894417909b0fd015d2bf09e0874",15.858407079646017],[16325,"a5eb018e5b2b122e92d2ef3a6a4918f9934c8c8197ae34075e9f5c6ac0b09360",9.317957166392093],[7512,"7dd9219010736b9851951e00d80953906634525387d17682db9a6e0eaf91aece",9.917710196779964],[19036,"859f987419448f9f095ca1515f81268d07387d02f328a71a5cc9574bfe77621f",9.317957166392093],[19746,"ae997f775af067e68fd5e0f6f13d52cca053d2b8fe68f9c766b8029f148bef04",9.317957166392093],[5176,"99daa8eb8e9c249e7d4445d069d4a849d28ddc1446afcfb95e0f9e8003921ede",9.317957166392093],[4638,"a494f2764a7e3ba44d781a22c69d34cc1c38e19c4310fb9045cf1772162362e1",9.917710196779964],[10745,"39d3c43cf21a8ab677f8b7eb0a1607d24b1c1f9c20d68679b42f1bf566ffb8b9",9.917710196779964],[10546,"dc4e87e269116fe7eadb38dc6cbe5b0d3d58380336c445b9c8ecb5b633fcefba",9.917710196779964],[16862,"08bf9a927a5dc77b6806affbebf3984d76758402f8dcbe991e58051dea2a0455",9.317957166392093],[4838,"163c5826c04245666bc4d02b2bcdcda477ba3946a428725576feaecea33733e0",9.917710196779964],[6850,"38958513a4c435b087217c91afd631d97640a73eb80f0b6d5950ef2a08bbfad2",9.917710196779964],[9914,"a585ee855793f2bd53ea9d50c8ece3489d951fcdcfb70a68cbeaf5e238bee0be",9.844961240310077],[8688,"0b1e623677eea52b96fb60e09f6166f90df0b25729aad005934021f9a133bfc6",9.917710196779964],[11825,"a1f3d0e63b453bc54da608a5f33c17ca195faa20a5299edac2da382281658cb2",9.917710196779964],[12509,"7f107b3018cb5ff91e323bffe82efcef541ebfd7b94b5068ee7e5462bbfde9ad",9.917710196779964],[13294,"697a26e40407b3b0733a6c7d72469a2981ad5b28911212d3030c1a38313caba4",9.317957166392093],[614,"91a193726f23e69327ee7c272f9cb81758bdb3a1cb3e2205203e2dfe1e56d3fb",9.917710196779964],[9789,"dbb09d184968160900c47ea193fbedccd041ad8d369aa25b5e93d7757eb8bebf",9.917710196779964],[16666,"4f8d0d29516cc44ed1e780335adbfa7162d745813d6c03b514ef95ec10085f59",19.18831168831169],[12412,"d3c7cc9ee3437d4fafb9128754ac93862bde9f31bd1326b8dec733bced1b87ae",9.917710196779964],[7365,"058583b09968c76c1b5d5725d60c2021fcd7d28e3e1972d6bd91e89cc2cda0cf",9.917710196779964],[14219,"1ae2ac92383a8c35b93509de060e0fd541f42dc34480863938f31928abb5ac8f",9.647446457990116],[18997,"da35c4647189ad199e9e58e60ed068a695312ffb60f1d9d7b815668eb6cd9e20",10.052724077328646],[18869,"d87f4b09d00b9cdfb231189abdbc57a0b66b18f091a92c7b93fa5a40f1716b24",14.864253393665159],[7985,"f60e80db3a009cef4fd017c545ba564939c951554eb764333159449cdd7d9bcb",9.917710196779964],[4907,"0a3967c205e0eb80af765aa55fffe9169fc59f692a1e427bf6347f006568d2df",9.317957166392093],[12055,"0225209129b9ea813a55d58fda9eafdf75e60cd36e18b0929d0f5cdcf1faf2b0",9.917710196779964],[4913,"7ac89a06f96e3fbdcc8b840ac032611c1cf2935ab4f89e2db262d0488a19c9df",9.917710196779964],[17866,"0272394939c9571483301019623ba8ada5ecdd61d8b956584d0f434f6fdcd73f",9.392565729827743],[2547,"44528ad2fa026592edd67817e6bcc1a70073330441f95e7a09e8b305f6ee8cef",9.917710196779964],[17586,"0abe9469de54ca1265587c4c87d32abeaa55dce94286e27ddd9602dc0cfd7c45",15],[14111,"93f46f360eab9957aa1cff7694e48ff91afd7883d2fca07cfedbd26d998b5092",37],[16467,"b4433ce1a79f62d00158bafe3adcf39a984619034c6a0e8cece66335eedfeb5d",9.317957166392093],[4287,"ea78c2903948df8068e799ee50f24d7e4a6890dc32fe8b4ccc96540644fed7e3",9.917710196779964],[18384,"c02711e6872e551c0bafaace4d491a6df39a5612504b5db58df610552f2ddc33",9.734306569343065],[569,"862fcc3f2c99b6594d01e3bc7f1a351af0d85c8559f354811d933a80445923fc",9.917710196779964],[13533,"64189ea493c1f957a9ed990651c85592926b086ffea7a65c219ec0a36ad0249f",9.317957166392093],[6143,"ee6928d0a0627bf7d82a991352a602d0bb8338837bc5af4e01b04e66c04f2dd8",9.917710196779964],[221,"cb93c8ade0d2b7c686ef49609039240027ecba1a12537647b64f13bca7ed80fe",9.317957166392093],[5779,"0f83dffb220680c7783b4eea55ed62b39092e7a001366def16680a1dc9a990da",9.917710196779964],[17490,"f7cd7d7234d2920345959119b58d1353bf558cf27fba96f3a7d0b1134279d347",9.317957166392093],[15626,"b998ea553aeb819658bb0112fb0c3589e75295fa1b9b3cb338374d88c119c670",9.317957166392093],[12705,"5a5e9b302884b5730dc781720098ca2002e843d6043467e1931be7f5b2e191ac",9.917710196779964],[2520,"0f7bd86b35585cc271bef3d38a05bf4666a7bc4d9f7e77a4c61d0fa98317aeef",9.317957166392093],[2646,"0a7dc0d5b5bf9d47a9cc19a4cfe343e0127876ebcd461ddfd166441d231cdcee",9.917710196779964],[15975,"c744ae9c6e31f7c3f06a4a7fe3ffa47c08be80106001f91c188be62b575f3769",9.317957166392093],[3247,"630da153a51574ba11fc9dc471c4b83369b661ef87ca0c74526ccf542f53aeea",9.317957166392093],[9896,"65b515f0d219157419dbac727ed038d44c1ea316764534d11688acdcdecef2be",9.317957166392093],[2066,"013e46476493e718ebdd6285932ffa82c713eff32c803e3687747cc9616575f2",9.917710196779964],[8839,"47347caeae52568a910c5a7ed7bd7b1912024142bddb35cf526c534c614ad5c5",9.917710196779964],[2661,"2dfe9f7df32ae3eb10fec5a81125b5dc36fe7b4e57e9bf2c61b2c25d6babcbee",9.917710196779964],[8633,"e68703a5de43ac6865ce2320c4edd6ca6a0b00cf4cfafc9c4969d8bad5cd35c7",9.917710196779964],[16635,"d2f6eb272d6815608e96cb1442986e0c6a2bf2dac7cc5412f7a773a5b32c1e5a",9.317957166392093],[10161,"5aec1551cbaf9823a2913d0e7f46204bdc207445003d1e8050795a47e8235abd",9.917710196779964],[13754,"1aa43d2d72a93e28bf9309035f1cca40963976aa447edbab876fe4ed4594509a",9.317957166392093],[1770,"f3279ff60b86eeaef56be6805dd9b03f823fe13484ed263de9b41cf0d3e278f4",9.917710196779964],[7094,"74e4a39ba6a865436270c3e89765a609b768ede868fd0f4e5f4a4bf96bdc5ed1",9.917710196779964],[3176,"0ca08653b5182401b4be025144ba4ad4206246d76ec2f5277f711d25bee12beb",9.917710196779964],[5021,"1547b7510062cb66ae5389f54a4845f6c8e9f55e54bc749a30294997388e0adf",9.917710196779964],[13009,"e21093343b08dfaa8b028df6c805dd239d61387e5534b9c6ccde4ffc429b88aa",9.917710196779964],[9297,"1ab9d37011eec802183b75694ae3ffdf07a2589beb71440ec2a7d5629f06d7c2",37.936395759717314],[12406,"f38d2c0779ef95abb474f9a9f9eb1c0cfc92303c1670a690bdf355e18a1393ae",9.317957166392093],[1612,"2f06b6d7da3db548b01e900c32136971941277dc6c6c506f42224cd6f0647ff5",9.317957166392093],[10863,"1b46b222a94759f02235ae7bd59dc34d7551ad7a963526c77f1f809fb02ce0b8",9.917710196779964],[17194,"874a1c7126cd2299159de4f2fd24fa42307adaa15488c4d4ea45bd880805d84d",9.647446457990116],[16347,"47d58cf9f029372b69f034a0766d51e18703b7b6830054f22d627941d44f2460",16.056140350877193],[7229,"c0de3056f9a8288201c3b5222c974e8a508391bc2b184cc917e26a11f83c7ed0",9.917710196779964],[12102,"96122297e42a241996e60ddff5382059f6f30e1208c2fe752a14e212c903b1b0",9.917710196779964],[2258,"862142190442d3f52efe94598998da7d47e516d56b5d4024f6b87cddab0c35f1",9.917710196779964],[17123,"88d14a6a7af4768d48348060c3764bd741cd8db70c81224be7cfc438abbb794f",9.317957166392093],[19620,"2abbbd7c6aad80cb5849cd983f66b63e499342250187dede321a9a3ab2dcff08",10.030959752321982],[19230,"ec8ff091963c6c857638dd6e8b79d1fe0c9284329a3b2347f4f4ba9a3a3ab117",10.052724077328646],[6516,"e5eff9a9db8a5874d613ed42a230785d5f46639dd29f5f5afac6b0a808c94ad5",9.317957166392093],[18734,"5b5030d41eff64d5278699754457096a037d9a2af086baa2fdb39e460a113829",31.401360544217688],[7124,"45e9ba09f4f55dc0209a25370868a18e507e41bd20e9640323d745f9e7fe2bd1",9.917710196779964],[15586,"dd2c70d6f0819c3a5ac59ad51c668ddd0bf3a90f9c084fb36d5cf28b8ba89671",9.317957166392093],[16609,"3b39bbc22cb85e69bbf8e732dfcbb35e6ca946daa9880be996da926f1697a25a",9.317957166392093],[9676,"e2d81b07f3e55b3143f109c8a3502c0db03bdcda00b2f91d379321432c278cc0",18.174843231279972],[1053,"5008b495d83ec439a4c777f26a001ed46774380bf7280f62f2e11d68aee0ecf8",9.317957166392093],[12540,"7dfa62861fd93a5e7ad4d4cd354bffdeef0cdc4f1eb6f6e77971796ad53baead",9.497392881432782],[8841,"b96a3259165d48dbd940e3699c5aabc9442a850696a1e1e677661cca37dfd2c5",9.917710196779964],[14536,"120e59b84e5e4912bc842bff13999e533d26cd50e7c4ff801d38dc8088dc8488",9.647446457990116],[15603,"3eaa35541c5c18848390d7cb74f50d399a5bcb85283c2d9cfc25765615465b71",9.317957166392093],[15862,"7879178dcb1339242f67133bf346b337b7dc747fdecfb0457219389daa89ee6b",9.317957166392093],[15428,"e34585399b57196b2bf25ddbf6a66759da4c1f74250efea848891c56e33aa975",9.317957166392093],[2619,"902687ee8865e14de683c845183975f96e11d2d111f7db2f5d00dd195f830fef",9.917710196779964],[7283,"d41f9824e9a9a77ba5a92c44cd69618a3753a1f80300f085d064737bf1bc28d0",9.317957166392093],[4647,"ca9dced559d1ed1e28a956a57f6fba46bf225a4076d6c11512fc0e0de8c055e1",9.917710196779964],[1501,"224e97a9112474829b9ad2a50ab3eae5ad388ab5d11e0ed29ea43b93b2d41df6",9.917710196779964],[3509,"e4b35b4005227609540c20ec689ab95da27dc3e43ca683ac6cc9295f3715ede8",28.955436720142604],[17117,"38d967e365cb1fb6e4c562e7b829c034a7e8dc7a8b4beb6394787ca77b2aa04f",9.317957166392093],[14444,"23297bc90380398ef8db3ffb1ce8fbf806534319c9a80f8de8f91c6ebc145b8a",9.317957166392093],[11959,"608c6212e82d74cf25a34a59dc2579b88afe0db114dc8a591c938e35e69d99b1",9.917710196779964],[19171,"b4ef6716a73b8d8a40727cf171594575184691748046decddfe3212c5c92be19",20.49846782431052],[622,"3e07e65ed762bb29b92e1c551c3f0bfb591aec59b977b01afe8f673aac84c6fb",14.375545851528384],[6318,"f742da6d8422e99ee2d653914d6ddec469f5065bc8e8720d629f418f2a83e3d6",9.917710196779964],[127,"0c4cf3aeb9f202e0242b5507490f81faaa6160df670f2ac029473688e7ed2fff",9.917710196779964],[7428,"154dfa1d044582271b42a6d963dbb9fe6247d406848102d810528955596133cf",9.917710196779964],[3112,"e2757cce52ba18ccf944216b8863a0f6f84597a424a96a408312ee9a9ebe96eb",9.317957166392093],[12522,"84d0ca5228e01ca01345f34691fb97be91e7f73eae92f0d633435b8ff5c3cfad",9.917710196779964],[11858,"3e900fec0d982d9115071458e4977d9426a7e66657bf5cd8327da3dffde253b2",9.917710196779964],[12618,"19e3475bd2b978026dda627f370f0980298adf85060d1c3c09c519cebbac25ad",9.317957166392093],[16346,"58cc6a0a41fea2cbb537fa8138fa2d945e5642e88687ce094e45658171882460",9.317957166392093],[8520,"80612adfec92d9cacd598356d25b19fd98a7a3d2cbfc875e0d4d5b6f246ae8c7",9.917710196779964],[10582,"8ae37c202a33473c382d6df44ae56bd014f12850ef7087af5185a50b555ebcba",9.917710196779964],[8065,"660b02857fa9f88f4941ede6d28fa0274ad648162975092aae422e8066d200cb",9.917710196779964],[14533,"f5683cbb600835d4698712078d10b739b4df95fb0b39defc4256a87d8b388b88",9.317957166392093],[10263,"804af796e459559a6c8af7d37cff5f1de3a70ab21d05e920709fd66f48dea0bc",9.917710196779964],[18488,"b64040d0cf1f22d74b54694811feeae30504b762ebfd8469136973fd774aac31",9.317957166392093],[4244,"df219e11f8701f804aef48c7d4e335ae147b49cdd503f84b62942b50874e29e4",9.917710196779964],[15461,"c4084f4dd3c6e45ea4c36dcafbe426450e1af6544d2daef05f9934e91455fc74",9.317957166392093],[8391,"98be5813129635420979b362a6fd35d658ee881645dd6d27211f17899924a7c8",9.917710196779964],[15722,"237b3e023ee6db7095e9a9b0ecda6bdfe11ebd54f94f218d9b2a7c68cf310a6f",9.317957166392093],[16639,"36d54e83cd0f7f0734e78eab66206b7ce66a7ec4fb98557cf7b4be32a06f075a",9.317957166392093],[19204,"c0e486878864a75571bbc4f4fad9e5abc8705519f0f933fdb6cc0e0bfe147e18",9.317957166392093],[12445,"8074b888c8af96c28e54920313cdf240a5a485cedc89ebb9e4a2a78a53e44cae",9.917710196779964],[8184,"26d14abc9634025cf68ba08caf13008e04fd3132bd423f4d012ed1ded9ee17ca",9.917710196779964],[18145,"154ad2219858e1c452665abb424f94fe7371381f7687ef699ba4426e0c87a239",9.317957166392093],[13938,"54b66ecb743e16c3a38eafe1aee0dca656ffdb18eaf2a928285a76b895323796",9.317957166392093],[6587,"3586e3b40c678dda1f0e0387d29f44611d760739124bffc11aad902dc862bad4",9.917710196779964],[9052,"c52ac139f27f843bdb4bd023c33376145b509f6f01630c9606a224a2a2a672c4",9.917710196779964],[189,"6ca4bc9a24f24f61f2b4bc2db54d6881c2e37c62c3e8c5733ffc2f6c4af5c1fe",9.917710196779964],[1461,"094ba47efc3a80e3bcc19af3842cba865999c9edf3c277fac43234c0080b6ef6",9.917710196779964],[1041,"717fdd63f2906727683c0ef82abbd6a81475e24f70c523622ed6c679b35108f9",9.917710196779964],[6622,"3955bba2a18a6ad764e3f9226f217aa8b611d8f26c3d47675d003443502281d4",9.917710196779964],[783,"de7fe540b68b3dfc10eeab25eef10ef764fff647c35263ffd2796fc2d9a2a2fa",9.917710196779964],[2581,"07e5f4cbe8171563b00385220fe03af4c6023414cc5c6f692241dc3a144f4aef",9.917710196779964],[3336,"c4539ae552cd2461fd61940444bc3435885ba5410826884ad4894fece91f17ea",9.317957166392093],[10792,"dbef96569a4d65bf2bde715e23bee30c92c7bf385a03e5e3ec5b439e584258b9",9.917710196779964],[18802,"9d3740a98febb6e03f4776481319fa0268647fde1a7ee38c1e50cb432d78d726",9.317957166392093],[9908,"10e767f24f0bba7b1c8ba8395daaf3b7de08fd02fd8861ea198ef85bef1ce3be",9.917710196779964],[13548,"1a30320a51120065123f3739cacc1760e861fe06a9c07df462193260f191cc9e",9.317957166392093],[16248,"10ca3ee5987f97bfa97c53a6bda216df6ce6f527e27a80d8684a913c2ddd7d62",9.317957166392093],[9365,"0317a7393dfc714456c3d286a8c0beb5034b2d212c6237c51c7e46c2f95474c2",9.917710196779964],[15765,"b5132a644c81181a84b05208e1bc55724961919a7da15c0c8ae304381953176e",9.317957166392093],[18538,"1868c329745ba063a199a22f21c599ceae1315cd31ca07e40b68f91ea5c7bb30",9.317957166392093],[13276,"a57d36e3cecc7a2bb386bf8e9bdc163c1aac80214587a50d6521bd8de0a61fa5",9.317957166392093],[8523,"931ed2202e6415a9319da905d195cb21202baf2271e0da8d77388413403ee2c7",9.917710196779964],[13868,"c77e93edab22cac0c5aa154c10d1b8e8f83afe020b9186d7c06d3bd4a7dcef97",9.317957166392093],[7520,"7a174170ec16a058db40d59ea60eb03d57d95c679936a78bc0d90739a488a3ce",9.647446457990116],[5383,"3c25c643c0d198e9191d13095a359a8061478d627f76b79185158526ccd4eddc",9.917710196779964],[3115,"e4613f00090164880b890cfa06074c919849beed0e220cc3f97af935d1508ceb",9.917710196779964],[12046,"43f12ca98eda23a7e925ec8d0c5ee9cf3157ceb76f17fc56190ee58bfc1402b1",9.917710196779964],[4513,"0372d8fd9e18bf4043ab3b10db94b578770f7c010dcbdf8a3108fe75f5bc47e2",9.917710196779964],[4542,"fc62becc66d115633263f0c0701aaba8b3f2d02c2588d90fae3effb670d814e2",9.917710196779964],[13852,"763aac192534bf47834e4ee1dfc5f11bb920aea81ab52a0346c093e76bcb5998",9.317957166392093],[14141,"c06612ee5183e3d341ff3c4dd44a074185c916c381baa1bb5bc0f176868bae91",9.317957166392093],[18626,"61a2bd7fc9cdbe5345eb002c9a2653660ed921a5e5c309b8381444aa29e8f62d",27.36474694589878],[6453,"ed965e3d399b8d7bd9b59cd8a9c027ab0bbe1058932322b346efbd25e108e0d5",9.917710196779964],[962,"9bae0ebc4554585c37aa8d5efcf2ad4649dee19829916b188b1e5e62ee2b6df9",9.917710196779964],[13924,"965cb1225cd7ead5439fdbe9bf68ff9d9c0d3ac23cd54b38ca59b0a005e77296",9.647446457990116],[993,"958ec5afeb755f072a95c3c4884fa96d698149e082c8fe169c04554d180744f9",9.917710196779964],[10218,"8a4214674b5c9032002fafd2638018d674a963dda08bbefa3e73128916fcd9bc",9.917710196779964],[3683,"c5e177049dac6d0135e927c55919b2efb857de8fdea026fbb1ad60fa3356b7e7",9.917710196779964],[17829,"a2ce4cb9480d64b50b20f5080906a92ef27ef8448c795237067cfdd15df0b140",9.317957166392093],[7767,"316dde70c40d059c34399cb4edcb34550352e575b8d90c11bd1f469a11250acd",9.917710196779964],[9016,"d72cb92607de615028b8aec8b5ef50d543e33d5bead06906763b50aacd07a8c4",9.917710196779964],[2841,"e3bb326abe873560db2abacfd037ceb764422b36c90640faae6c9077d56066ed",9.917710196779964],[585,"f841493e23338c8d2bb718d930e2d4c8b3876336e77a6752b4ce5486cebb04fc",26.945754047145698],[18608,"2ee5175b0fb04b2a003f0fe1905b1cefd835bf0d914a9940d34b8bc219cc612e",9.317957166392093],[983,"f86ff602dbc270b9bb5a8b368440b789c055c1f44cf13f336dd6adc9e45b4ef9",9.317957166392093],[15753,"319b3dee70c8536d6523bc5cd54ea435b22479e146d3b516b1eedead53ed516e",9.317957166392093],[1301,"17de019ba62572ed8ed099796be03d90aa9dc74f5fbce6970309e119891360f7",10.052724077328646],[17929,"0ea4b0ca198407c3c482b3210e0aea5202d2268e0e8e89cb7fcb7cc89ab0b03e",9.317957166392093],[2557,"e70b33866b6651eb5e69f82b93aadeeb023230499ef6e427464fcb2f343880ef",9.317957166392093],[4556,"6d8797fcd09bed498648e3c957e438738c35f7b2031c9dc137d439df8a8fede1",9.917710196779964],[17896,"bf918837ee2194b6333e0e91b3b437bbb5c3070c3ab502a788e45ba8bf013a3f",37.16444444444444],[8422,"6c3a53462557492efc2f73c116a4da2f61b4178262cbc3adf7c06540601b7ac8",9.917710196779964],[9870,"47750f39a2ed18ea662cc725145b35d926900b48cfe70a1704a9896297711cbf",9.917710196779964],[11557,"ab1eb0d1586f685876972631036cfa3f310404ec9091447c771e847c901a32b4",9.917710196779964],[320,"e9f129844978baebe5e8680061af6c42fd519419054ac7b74e9a7b27c0e4e3fd",9.917710196779964],[18261,"b631c9d212b7e60c6171f798c600c82946f0deed501ad424d0c86067de2dca36",9.647446457990116],[12014,"db5eb01d82cf0ec3c03a5a662f528ea02119205c33600225ea61d9603da33db1",9.317957166392093],[14421,"b22fdf4653eee57b0b58d8fd332ba2902bfe103486404f9146948a8c6c3adc8a",16],[2921,"67ca07b94248ed312300f57860022368e89dd906c2de6256baeb9c60b7a6ecec",9.917710196779964],[17341,"1e47018e9cab44ceedf3db7023b9f6c5be1e38508020809b9e39c4d196ec144b",9.647446457990116],[8669,"b39ce04ed228fce2fefb8be7275e57e9f0ae17525ad97635eb2ecb35d596dcc6",9.917710196779964],[7206,"cdfa14da10c5275aab4854b58a4ed621d3830436db1fb3c82a872e4535d8a9d0",9.917710196779964],[10668,"abebf4578c174b58d5e7c55670f15a0237be55d09f1da7d69b12bc1c306d3dba",9.917710196779964],[2059,"f4b122c1d0573c40fc4ad71496344d3779b0bf62376a3c042903b7a71da483f2",9.917710196779964],[7847,"2c01d635151443fcf4992e812b63b0aafac05532b18c153d8003c07e544383cc",9.917710196779964],[18630,"7a78113bf95c10ebb7b2a4820dba940761c3a888403b095572cf5af73cb1872d",9.317957166392093],[17354,"9eefc5ba0248ce731f23f6ca269fec619264f5548aa39a9f5b45af207f25d24a",10.052724077328646],[18412,"5442e866ed1ba3f14e16b5d03916db293eef6fa2df7955afcac1b4dd8dce3933",9.317957166392093],[5923,"e668de510aacc0c312004fc23c88636dc4debf51c56405af819fd5533c7e89d9",9.917710196779964],[18002,"ea57f1103d3e40e3148b913d91b8eefc38539588d63c702714aa749263ed3b3d",9.647446457990116],[14469,"4b1d9b309d44dec95196df99283c739f53e509d7f06dea763ccf39d2f468e689",10],[14662,"21fa1d47c2577eb92323068bfcc207469c3d43bbcb3a1ca3ea9621b660d8ad85",9.647446457990116],[14272,"096f0695dcc069b4f05871d6c7d8753eed9bd673ca9a6c4199d520ea8fd17c8e",9.317957166392093],[14379,"1e621fd815b5765dd89017307e5e912ed87479ba05b341a654c99883f7e8c68b",9.317957166392093],[15983,"e4b3e5631eaaa47a3776ff714a7f79c67ff989d23551153920521649be0ee668",9.317957166392093],[12928,"e2168a77db683a2f40dd18741fdc31e3096bb59a431a689bb2163c7def6818ab",9.917710196779964],[15083,"fbbaba15ca63cb08f9a953acbb48dc62598e6c96a25e3f025df46cce65f4fc7c",10.043290043290042],[6614,"002362babdb40137fa450b013c56cd707c51f638fa28bcf2e0f35fb4d81c8dd4",9.917710196779964],[15201,"2b30ce2f384a13263bbf34dbf7685a22bec569efee638e1a5a567c9d3a84837a",9.317957166392093],[15668,"7d69c442c92d74c3a40501e01a4847e1612b5d90386a2d1244119b9781390e70",9.317957166392093],[9319,"f4f13055e7d4c1760ce7269a40dcbcab65117ec3a242c99fb964d8595fb0c1c2",9.917710196779964],[17269,"170b93cf99165466500f42bcc761f5d0f518e0cc3143d2c6ffcc35e3086ecf4c",9.317957166392093],[8642,"68ab447d5bfdb68dbf8870a0b8c8bcf8146192cc0863aed300d0221846981fc7",9.917710196779964],[18395,"e6fb66a36f1f0abf6a73c5c7c21b0452a1d6d2830db989d2ba3dafe229218533",9.317957166392093],[3389,"cdc01aa49e91cd959d0d8f3f9035a5ae928619d3c4627e4f317cd780ef24c6e9",9.317957166392093],[8514,"001ea0142756cfc07d313a5d9dccf6bb9ed6258b45a50378b54199bcdc88f7c7",9.917710196779964],[3968,"f027cb318d7a1e66f401df7e2e854aff98f9ce32edebdc76c4d9077fb0f5ebe5",9.317957166392093],[4982,"26c8bfd60825cd92b1e82e281622f3658949dfe68aebaea8fb53f6a346654edf",9.917710196779964],[17398,"10e84ff0a434d3ed60f70f2cea8ab51b7504dd7ac65dcce87cb66d87e247cb49",9.317957166392093],[16841,"13fb02b76136588259a9a2710ff647e6c543b54ce6d003c586e01a01c4597955",9.647446457990116],[2904,"df6a9a0cadf4b024b2ab85b5c5ce24328d75cc988abd148135f3b5fa3ac617ed",9.917710196779964],[6624,"92463f158c28019e7242f1619bd61ad7dfb372849c8209507330e7b15fe77cd4",9.917710196779964],[15517,"224b785c507d27141e22f5c2322887d7caced1ebabe0d21e16d79ccd72beb873",9.317957166392093],[13732,"336eb0bd71892f171f2a67042a1495cda1b4929b3cdccb207790ad1daf80cc9a",9.317957166392093],[19717,"ab1458ae6778458c1ffb344f1c1eec2f82af7d3a008d0932b25a7a1001242006",20],[5976,"82297228a2a61c554e265a3bf8f03a7184f2ef8f877704451b36f8397d363bd9",9.317957166392093],[8481,"e3ccdf18409050f3fe4a78cbf210bf2f4da691104854449e0bc4cc9a47f420c8",28.124444444444446],[10244,"2c944510c63610cf53faa32695afdc3bff0dfb83c9f137764f388c4dfb4ebabc",9.917710196779964],[14513,"83cce505d17ab5f70b29bbd93deb26b03dfd39826c9e1995c0ca75574963e288",9.647446457990116],[3032,"462b1775f7e24462135d8332a679083a2f29a3c8a0d0884b101dd633514219ec",28.43979057591623],[18350,"805aca4eb1d2c2c4fa7fa749411bb6ac404a17c3ded3b964e5b0773d6b82ce34",9.317957166392093],[7661,"a0b3dde422f429564f6a2d8b90c262ec7cf54dd625f6efb495f94b37151fd5cd",9.917710196779964],[18132,"89facbf879d6f6a19af18061a0d797bb011731fbba8c96c90d8deb97666e1c3a",9.317957166392093],[3157,"4ad9558a9442a00395f528322e866040244e2c8a1f394eda375b7217625d54eb",9.917710196779964],[18778,"b6f4bb5021980064169d0295c0e63fd436fd8082060e3b733eba4b1b6aded127",27.571428571428573],[11362,"e72dad784c455bb0135dd3c4c308e63b7e3baaa477761f2daf7fac2730819bb5",9.917710196779964],[8990,"b8f19883365b6aa21982838ad568253191a843809e0dba4affd5931f5fe9d1c4",9.917710196779964],[2422,"47bb7cfeaa90f5d7dfaca9198693967e8349f3e05e92e7cbfa2a989ed0d154f0",9.917710196779964],[8024,"0c9c35df6b8c9858bf2468c7957a32cd30c1c3051a26c7654ad28213083b67cb",9.917710196779964],[1218,"a37bae53bb75c7ba119e1ef1a895bd98045d2c923736b170b5d3cf902c0ce5f7",9.917710196779964],[10517,"f8f2d14f06f9648c60ad67731df49bad7e74a1e6cd9f1f96f5b0b69d767617bb",9.917710196779964],[14856,"c29f18c595c6498d9b64a42501deba4d0e52e05081815039fd2486c97307a681",9.317957166392093],[18960,"081a462fbfb2c260c3bf5b763b42b390991425161b2839ac4617edfbf97bbf21",9.317957166392093],[6101,"5f7041c631d101bacb9270bd6c53a95f3d475cd9683ff7254128e7b59ae069d8",9.917710196779964],[3016,"0f8dae45b1a8455f06efa29ba06db9ffd6419fcdebb452f2be3c2b7a92f929ec",9.317957166392093],[11667,"a7cc6baefb864758e497b40fdbadad54c6d0ba6fe4d0556bb666aec8ff707ab3",9.317957166392093],[8485,"4a60be4e1369a8256554ab304496317cd8bf9fc0ceb328ff7b21309a926a1bc8",9.917710196779964],[11542,"55c1a76f8c49212c280ed344dfe11342678bbe62365a206e37457d8e473445b4",9.917710196779964],[15863,"07a96de22b31a2a33621e013ebe2f72d1f522549ba9f549c69a8f62c3a9ccf6b",9.317957166392093],[3654,"e6cf356ee6b7fda3072709645a1565e012b32a792c82bb15cdc4fb693114e8e7",9.917710196779964],[4531,"055b552ba1145b4e9ecb1a1646009f5e66de2491d6c2239d2a584d5beb3f29e2",9.317957166392093],[2068,"cb6597063c3ab7761e56e802e93c7b979fbc7cd09b07b9ee0794741e7afe72f2",9.917710196779964],[9967,"2ed8e546b3190ed6da3de091e89646ff9a8786edd2a402a0e7bacfe84e8584be",9.917710196779964],[19601,"7c03fd73a2573424b948b85d937a78cd27a45402f801b67f04db0ac7bf280c0a",46.848072562358276],[17400,"81ef7840a09028c155de6f406e89d2ebc25c871b96794d0da85f5dd4b3f3c349",9.317957166392093],[4406,"fb4a01d8b6693155724937a96505447edbaa1aad3749b9399b0f6054575b09e3",9.917710196779964],[384,"57d3a8ccd0dbd57feae64f5393fc21a705fe55ae8589e5aaeeeb03a0c87875fd",9.317957166392093],[18342,"71c035ce85bc9ad334b17b8447062059878a341c82f4c01759f32dc37103f034",9.317957166392093],[1433,"95bbf7f538a1d581e3e983911c8a5c4a7e2a0d7111e6263e71d85179a0249ef6",9.917710196779964],[13694,"82bdc1cb727ec1fdaea9b047ff165a174ec1bcd6266612e74342623b9f21579b",9.317957166392093],[15886,"3edb91bb6aeb2180cf746194c5b7b97a89b8a0e0eedf0a5c64885393d23a416b",9.317957166392093],[13419,"67ea075f515547a726264fce6c20a18edc7769fd79d472dbe3b17eaa44b700a2",9.317957166392093],[10101,"764c39b696ea3ee82afd90276bbfa4b471f48fc3a7eb5c06330393600b49aebd",9.917710196779964],[14207,"310d59e32dd7a705c983b9ffc356d196a302374cf5f16969d8da427de7f51690",9.317957166392093],[6476,"8c1fdb32395d565714813564e33a1b30afcf05862315d8aa14355f3a582d9ed5",9.317957166392093],[17732,"b770bdcf129033c06a122c8085c665cd0fc7f822851ef9dc0069b9448a509f42",9.647446457990116],[19390,"a66a6d18320fbe23e567fb9dfcada6668709fa1a98d42c2486c7113b51213212",9.317957166392093],[16252,"a8902d9b0b249fee3330fd19117cb9f31f39556d5ab86e5f3342f54a390c4362",9.317957166392093],[7549,"337b52dd3d5ae874c82821f53ad609b1c8cf0a72dab3273459229522a0bd83ce",9.917710196779964],[227,"7fdd72569dff432c2a7b76355535bd03f5b01192632302b0a966c48f20e573fe",9.917710196779964],[13385,"a606b198193e2e222f891be5f0ade1bce8f037c69f16594694ef706212dcb3a2",9.317957166392093],[9651,"e99a2d18c5864071bfb53ea9c4e20079d91a2b3552bee1769da3363d513eb4c0",9.317957166392093],[9129,"5e6d1ac6fb4b58b8b77e5f2969745d0bf112f5c27e343b8f40e638ee28a2f0c3",9.917710196779964],[12781,"c0263ce030f3368da41542c8675dac461d642b6ea729c7f1c969c637ba0909ac",9.917710196779964],[6506,"0761b2b8fecaf7d2cb06343d35c59b24a736e29ab506c40099e6e5e1261f66d5",9.917710196779964],[11731,"ee0d26351ed807f326c8c828491e9cc8868c5af4f3bb5bfd59c6189c5cb717b3",10.052724077328646],[2187,"fd84ce2b46af978ae22cdfec867cc2d380f66e32e7eb8f4670b7a94a3763a5f1",9.917710196779964],[8149,"0eee383412f4233f0c09a829b6159238173d624df62f77a4ef6dc40c7feb5fca",10.052724077328646],[12270,"18db9e7fcbd8b4fd1b1492c7701fe0286808ab7b470901431328e57dde9586af",9.917710196779964],[8608,"a944fa00e80ddb31c702e140c5e6d84d82363d646b94eed922e8c46ebc5860c7",9.317957166392093],[12881,"5d2dd58563af7c490243e807d03cff36d1453550449605a7c0a36ae2a95d67ab",9.917710196779964],[13737,"70ae81c728365ed678c6d75db8c38058b0977a0235f94bdc7aebf43f5429c39a",9.317957166392093],[19218,"77a237d21685d265c38210990b6d4582fb19559cf2ce2221df255d4c78641018",9.317957166392093],[16654,"c3c9a8a67424b02085a717d14664b543cef8c6aeee2b9e7c9f01d5e563f7a859",9.317957166392093],[7633,"ea525f17e8d2db5d9412da1781701698acbea87fb63a170b5a25ca0a4769fecd",9.917710196779964],[10209,"a2b6fe39fff39125649585a2d3f0e9b64377b8451b7d9c259d4132d43bc4ecbc",9.317957166392093],[11134,"352904e3b84efa09b050c80b25b8fade796e231419623b415bc554fc0c1210b7",9.917710196779964],[2671,"7e7ae0550c6e47dfd8adab122f62e586bdb41ef598ccd2978622eb42ab60afee",9.917710196779964],[7232,"cc44514de33b750599508fe01cd7cf5aee48bad6b215d787a0be2d9d20c17cd0",9.317957166392093],[9457,"1d474c981ccb8f8d8484fe4b570d77b87c88520773897ba55d908bb57aadfbc1",9.317957166392093],[16126,"ee0f7e7060ab4fa009f78140d63016e5f836395b1b7fa1db51ad177d7f1e7165",17],[15941,"0dc7e8356b3c7063ab1c759d50a4ca7142471867366edc2c39372dabdd161e6a",9.317957166392093],[16191,"0340dab22f1195e78c62ec08f2f883ee1b822576856ba5254d80deffbed02864",9.317957166392093],[1662,"2e00edcfadcdc0f0463cd514188e440be6818b3519ff2251efd8d1a3ab872af5",9.917710196779964],[12240,"9c6c49f667ae9e68930288314910ab68dace4a976dd1b0973cd2c483735cbcaf",9.917710196779964],[5053,"672b268a424e4db6a8d0c73fdaab563db5ea252317fe2e5e257a8986635adade",9.317957166392093],[9888,"ebd0f26939319fd37f98ec05531ea9ff94843eab723227e200fc7816ff0d00bf",9.917710196779964],[6559,"53cc008addfb5e195a33f2b23c5fcf29592f08c97ef5f8c40d37316e3659f8d4",9.917710196779964],[17540,"ea9531e488abc23b391be99f39a0c6952923513a28e9af30b33982b897c0bb46",12.011288805268109],[14801,"1739b23a20406a8a2fe77d509bdb2e0df93d42a9b24bbbbe9c6eec2219c0d982",9.317957166392093],[14880,"b692ab252520ec5e4ac05e274b6607b45ce9676644c8b35723dadd905bf32b81",9.647446457990116],[5663,"f9285af1d8f7c154b3f602d05fcdf91eb6e47f26246b18e95c5cbba0bf813fdb",9.317957166392093],[16930,"2333783bf35e8a906f0d696f621b75ca5775667d2fc12a76711164ffe28a7a53",9.317957166392093],[1176,"6a5a16e21497ecb862095df2c6ea925f039afc2b87d4541b60b46528e30e24f8",9.317957166392093],[7969,"c40be68f04dac0a1138b4631195b4db3fad0ac3a4d4566c89e64bcc25975c0cb",9.917710196779964],[1087,"e2f1defc5fae4252c491d4c40de7353c6f011692681980c753fc09d5cfe7a8f8",9.917710196779964],[14398,"73f877c0a6b10c1b6d5e206f6b1496426e4755202ccc441e70c9612f0a324c8b",9.647446457990116],[10731,"a71b3e02612cf7caee5582b549b6b6e6fbd57c0cf4511338e82fe0bfdd47cab9",9.917710196779964],[12367,"022c99d45ad601e9b4a72da617b879fdabedf902e7ad0e89f32c901d94f1d0ae",9.317957166392093],[9011,"0a20b94780ce7a6d471ab4a2ab9e1a084019883e2a530660b817fc021eb2bdc4",9.917710196779964],[13629,"c4c8e9820e69b09a4f190f46dc13ef1bde43413fb3dbd62f4cc170ad6c39bf9c",9.317957166392093],[7913,"fe5540211741a11e74511efd6f180b0d6a2da831ae01e4892c092ebf25c528cc",9.917710196779964],[12494,"23b8fed2f7376a2c2c78b680fc17aba100c30378532f9794b7a71f1b726efcad",9.917710196779964],[12237,"fa22dab710789596b6dd6bfdb2a2e3fe88149810bae041bc50f05a86ccb2c0af",9.917710196779964],[8915,"6e7c0ec502523377a828a55fb7cf50f11df283bfc58b432c6dd5a938d8b45dc5",9.317957166392093],[8203,"3c13a98ee5432603c51dba5f0904cace00dfb2e04396d044d0411230cd57f6c9",9.917710196779964],[3570,"31a40ade56cb296f76cd8a2d91e6977d09516cf48f5a6b2b68cad98652ac79e8",9.917710196779964],[11302,"5d58dff0295875fd25b3513593cf381a43280f5ca1ff0ba2268aab10254803b6",18.96797153024911],[6064,"0fc4995f0262e603f569c8e8864b0fdd699d94b4837b7277e2220ea7dee4a8d8",9.917710196779964],[11077,"f90e0de9274fe089f1a56541fe49122e44259fcafd151117101866f1c24c76b7",9.917710196779964],[17999,"50b0e812063562646a26785812c5c99dabcc31d549edff63ffd930c58213433d",9.647446457990116],[3950,"9066ac07b8d5ea95aa15da56d07a8d8a440a53637c720a95fe5f0c1094b401e6",9.317957166392093],[6092,"c0754c98231f30a017ba87c09a480813db6a43bc1e98452317e4fc6d14e170d8",9.917710196779964],[11376,"1b60b57e94a7e0627069f9ee48d8752ebd7e70a208ae44ade41d0a4422048cb5",9.511868533171029],[14916,"86f9f5bd9027eb98140b526d479579ea2f7e7a005c7e5e25af8aba04d0d29680",9.317957166392093],[12287,"dd30c0ec660984a3e688fa40c705d90cb2198667893d6fec2d73545e98bf56af",9.917710196779964],[13540,"53d947ff6b7cc72b5e237a9a2d352d7c9fca3018c84225fce875d3a5848af09e",9.317957166392093],[7902,"d5fdbe0691f1638e539d3d8c271c4f15d32df60858fa65a2fb204ea9994839cc",9.917710196779964],[5825,"11606667bb5aa7c7a3862542982e687143d1eba3da871db618157000b11133da",9.917710196779964],[15396,"50fbded84f3c9b3b987aa3b8241013e71e0c2644272b70c3e51a8f2b462d6276",9.317957166392093],[1991,"8ec882cfa985c7eb1ba7afef1ffd5d42a1c387a01feef3ddde98227afad410f3",9.917710196779964],[7351,"48bef7981562211c48b25f03bd4e24b4d2cca5bba19b0598e164706e6b7bafcf",9.317957166392093],[18063,"2d4ad208be5b821de5f92193812489faebe7534488065687acefaf973573f53b",9.317957166392093],[2740,"7006da798c491c76ca61305747157bc14f23315d0cb2661360fe0729e67a2cee",9.917710196779964],[13254,"d0dff721768cedc0bbfd12ff6b53e3f1d99f18f63ee118cba45b133fd35991a5",9.317957166392093],[13858,"54511b64930ea9e5991185f261c86d550c6ae0d8e5038043588e2e4fed723b98",9.317957166392093],[17712,"6a823541a9217a2ae937eaf86ea3fcc35a339882736158edeb65316b123af642",9.317957166392093],[18415,"4bc920a5bafc42d2a2aed1e5252c07ef85477ec8d1bb098e39774d1a21803433",101.30892448512586],[4897,"fe04f51038fc8d06993cf0c0649c8bf56642f7a9262b2aed5fc5444d69dfdfdf",9.917710196779964],[3701,"86ef08c28d544a3a22228c2fa57e1b8fbc9125788ee931fa61d61f44ce9c96e7",9.917710196779964],[13663,"110321cd823060e86eaee6de76557c708322f69114d7f9ae7e677797e4aef79b",9.317957166392093],[2056,"1d67178d5350acd30d6e25195a7e2ed6d8ee7a07527be7cb4380494d523391f2",9.917710196779964],[7357,"3bbb6bf6e58c408b0cd387eef0608639eee00b38282d034b9a951407b69eaacf",9.917710196779964],[19827,"0a94e25551f195162b50367a5224a2a99c0306540960ea41451c9a8f45f0a601",9.317957166392093],[12560,"3910823c14f1a5cdf71f8454d74058d2ced2a61d373525ba6d6a523b461f95ad",9.317957166392093],[19486,"99c4d1b068aaf6bba938991c57b21ac08e7a54687ebb1017a6b160d55014dc0e",9.317957166392093],[3487,"52ffe92af17e0fa54359f42f883d942a555a2137ace1a7c50d68f0f69af41ae9",9.917710196779964],[10808,"2eadfa0c1eddeacff9cebeb815ef4ee4ac4dab036abb6f0f08c4cb969ea542b9",9.317957166392093],[14792,"542279612c48c182057299faf84392053addc6bd888553f5dbabe1ce84a81b83",10.052724077328646],[12206,"f61555ffcf3a66078a080d69b4241f670f30ca40df786de2b5e9d7b67ba509b0",9.917710196779964],[18826,"8c575ed5864286120d3b28ac91068add0a679d00b582c505bfaf60a0a9e8df25",9.647446457990116],[7995,"7ebd36a8236f361ef7a1657d887667227b9ca78e704c925f0403f6913e008bcb",9.917710196779964],[7372,"5d9bf0942e45db597eaceaef628777ef49d9fd244d999742caec459bc7d991cf",9.317957166392093],[862,"58f72a0c1ea7f8e9063d56382a17ec84e7f53d7a19268d567f310e29ed3326fa",9.317957166392093],[5086,"7a97e7be43d9e00e7a7f6ac41fcd00c97b08b56e37e4a316698a4e58c609a8de",9.917710196779964],[7499,"a950addf79e09c2367604caed1f69cac1c6be8aa4defb7dad308659f925ac3ce",9.917710196779964],[233,"f0b725787700eebc4ba822816aaa3696e5a23fc65bbbbed4b225107a286d6dfe",9.917710196779964],[12342,"c5675330ecad950608c3c62a61c02c6d65a0e17a9b5ae3e4af90503eb9cbefae",9.917710196779964],[17107,"ba2d28ca0ba3f3867b42298ab91ee5d9d83bfd32e0c9299e93851150165cd54f",9.317957166392093],[1634,"6e9ad0cbe8f255d251107a2083ed4f5bc6d7764f26be8281ffdae56481d265f5",9.917710196779964],[6489,"44748e7f65fc142e0051e5ffb9a2df659f01d4e8612ff84eeab7f8339d1e90d5",9.317957166392093],[8297,"52ca650b986220facfe180de5f5aaf9531e1c266c8b66d86c35b1b14c13c5ac9",9.917710196779964],[3310,"34ab9b9340ed158d2e095c1ea073d151062b0ffb577865bcb47f86e0290f4fea",9.917710196779964],[14623,"91017727d06c7de69cd32930c53efe595f04f8954fb43abd9e562f12f2437f86",9.317957166392093],[17664,"a600de5f846bf73aba0272f0e7a38fce82454cbd90c0e3ee508bc524d7e2d943",14],[7117,"f4b2ecfa286b2f135b959c8541cc8b86778d75b19f5d02f94741831222ad3bd1",9.917710196779964],[10136,"8cb145d523b332f91432182e465f50326b350d785b3853e34f243ee93b3976bd",9.917710196779964],[18651,"70093bb8fa9832b7aa5e8db771afe7c84371864d98605cbe8e64d436c43aa02c",9.317957166392093],[11492,"76dd3325d76fb95095c06c6217fe39b3b644dd38d0b9c81a3405ac773cd390b4",9.317957166392093],[16733,"9a6a4887f037da806711eca30801205bcbee0bbfdd0fe9b66182a582b677c657",9.317957166392093],[1476,"b3614d69ebb55e34a0f18ba7a805a3c3367b8cf477fc5640581195b68e664cf6",9.917710196779964],[7926,"a44c4ef94b2587b35d2d3102535fcd1391ba6b03e4e7edf4fb3b24b7a3c611cc",9.917710196779964],[12991,"3516c9bf2e20bf7c9d6b4fe596c6e4f80b56b522b123cc845e991209f5b4adaa",9.917710196779964],[18727,"6cfc6b0fb4ea8b0fd39e1aadb107205d7cce9330efa533ad474db77a9fbc6b29",9.317957166392093],[11634,"b04256a9282823bee7252b017b43f724386fc2cff536e2cefef9ceb1b3e9afb3",9.917710196779964],[16089,"cf7c26a80df965df1ca1715f97028e44fd6aca1d0df2d6e9c8b4b85506ed7e66",9.317957166392093],[8968,"000907b63b59fb3b581be96993f4e05f5cd5bfc4ef23a504c44a6153a89e07c5",19.19720767888307],[12657,"bd47aa2e51602ba5a0035039da1fbadd872b4506abe2bcfbf0f7b046e801e6ac",9.917710196779964],[19255,"86d1f5b2070459b41a76836ff515a11fba4ae74548e737f4133a8ebbd5df6a16",9.317957166392093],[827,"a1163d5803f4e564d7ee078a75e2d28b7bff0d70b56a21709abfbc2492545afa",9.917710196779964],[8818,"95764083a456f9fee2bea411819008581c84b9c3aacbd83a3d8ac57222a6fac5",9.917710196779964],[18282,"14c5e302fc64c640900990913e47a5d1e6f9e3171fc5226a226c199227f13b36",9.317957166392093],[746,"6f67c7ad6c15cb1b5972f49e2418820e6b17ede49d65cb2e2b1ee1901b7eebfa",9.917710196779964],[677,"bf5ecd1ab4c38237401da85d586af56900afda606571d69558b951cd5e4964fb",25.385229540918164],[13658,"5b8210d994239bf8eebff502da19bfa95dacdd577d6ba3ed05de6d2884b2149c",9.317957166392093],[2356,"15343118e3abc1a4a497314832bc2ca58b989570cc60e5d33efab5dc48c7b5f0",26.90949720670391],[11396,"73e244f65b549b4d068cd2df048d2506b708d0c4c3399dfa10aa7a6324aa62b5",9.917710196779964],[17077,"8f009005a505a688ef2b8b345c12a98a810a677f8a4fb1899783d9c427eb6050",27.9247311827957],[19403,"2047263b56566974faaf1904957f5df478e5f8d6ef62563b85dcb9a2ea676311",9.317957166392093],[14385,"4be3c7a6216a8ed94db2d305e525bca3024d3218a5247023d066d7312886998b",9.317957166392093],[8343,"4a6c0d7e7e5072ab845a74589e78e62ef6200e3ecb578b089e2c2b1c6ebe0bc9",9.917710196779964],[16560,"26ab0fb99ad69497cd76ae2373fea3308512f128bfd24fcb661f599d32c8e45b",50.26737967914438],[10602,"1224dc551d1cb86f2015e4fd7b39013081d94391182cc551949adbaa60c2a1ba",9.317957166392093],[4291,"ce4b940676b04b7549706db0a18c300734b7901387ba40d0c2a19da7e3a4d4e3",9.317957166392093],[16871,"39455d694542ec1d757e6784161708d37480f3bc9e4fd5daa54845ed095ccd54",9.317957166392093],[1413,"5486b7edc3d98df1cb024ca6d98b1166eb3e02a9bd9cdb31a161cc188110bff6",9.317957166392093],[9244,"e3a8064e345225902f71a4ede69effdec9243b5fda859ecd541efc69a10326c3",9.917710196779964],[4341,"c6eac673507ba3486d83d18b01f9b83a29649849fa302c1cbc6057f851787ae3",9.917710196779964],[4193,"c2421d334dce126b61316159d9862d52dc7bec91bc7d43cf45cdfda2651377e4",9.917710196779964],[9573,"a7056ec4092cec0441ac8dfc83b0c99ca3511b7c473096f8fd820a09d53a2cc1",9.917710196779964],[6168,"18b43abf60fe318a1fcb5c7015b3558267e9c8a77a0daecf7799429b3ca602d8",9.917710196779964],[13896,"49b6685b3b4f6cca925937ca41925340b01cd4220dadf3b2bdbfb928dc4f1897",9.317957166392093],[12610,"823d1d77620ac768b461f0fef2f4c2a621caa742752c9b590088f50824c433ad",9.917710196779964],[5661,"972e2e782d4deab8adb83e2760f2ef8cca4e7dbc54b5431e94aadbb4f27642db",9.917710196779964],[10634,"9a2cb7a72f2add6d5ff9efcbd7b705d7c59542aa620fac4745b46a6618947cba",9.917710196779964],[19240,"76a99f3df318cb7b114a2c302bc017801363b46517dc248ff32c1ad3ce513617",10.032279675985139],[1043,"9e9c18ec8ee46e50f57e82a1253d6a4aeea66daa6e9ebf9be5c3f1a1509103f9",9.917710196779964],[165,"c88950963b1b3afe93695bf3205335b1f785e4b5c7a6b86c5eda3d6762dfe4fe",9.917710196779964],[15635,"3c28a0334c367d9ea755440a3bcd325503dd3ed65c6c73cffc2706afb4c0a970",9.317957166392093],[2941,"25043dae437e2565ad480423f6c9ebc7c5dfa4a4727c4a58969bffbd6584bbec",9.917710196779964],[5069,"d5ad1ef4da07ca7f825160c8e7319a84364a09993cac44dae372b4a06a90b8de",9.917710196779964],[10761,"1f6856a3df2ec6c4f16a6ee3619b8d34c2d7707a3f64f1fe0ee4a89d949c95b9",9.317957166392093],[945,"e57931909e509d1ef06dffeed0a320570431db49185c92b11764341ba9ac84f9",48.42043795620438],[8289,"19a503da01c7720ad5c4eddfc0b06edfba1af3113d5c1999cd2c3ee9df8f61c9",9.917710196779964],[11802,"4fd404c99a7ab5eebfc9b60642f069ebf38451c2e15e17daabdf6474038db3b2",9.917710196779964],[15001,"e9ac710b3366df93cd554fc973d9dfd1e73c142c3d767e79c6ae8dfe6225787e",9.317957166392093],[2225,"2d19f7e8576267dd4c5dbb90c7468a3b3f20b3caa99d52bb82e9b52b6a475ef1",9.917710196779964],[8417,"70b5c1d5c8edc071fe5e77519af70074cc9698e369de1c3826aeb15dfe0087c8",9.917710196779964],[9478,"061b3c91401b520dcf854c44d17a5b69bf3264453cff84012811937daf9ad3c1",9.917710196779964],[4436,"ab335a6c55419079c8ca3c3119ea7776b3a6a25030bd96c7d5e3c5272d51dae2",9.917710196779964],[10976,"1696523fa706cc9c4379e8e97011105aecdac79165ea35663c19ebcfbd7c2fb8",9.917710196779964],[16815,"a5fa22e05234bc5555fc058401d3c938aa4b000440233be14272daa8dca3f055",9.317957166392093],[14983,"b73192e262a6c403e95c0ee39b7b5d11a6168d14aa98a3222b59ff0e4d25e57e",9.317957166392093],[10999,"322c549fe85505b7765e69c509512f0cec1eab84b79d47fcf9c6f74ba0eafbb7",9.917710196779964],[2722,"b4b80eac9a38ced3ee22cacc0acc550b59906fddc918271c67835ea205cb42ee",9.917710196779964],[13144,"ef24ee4a7e858131240c0555911d82dc9c19f7ed3b1c48d414392d0275b312a8",9.317957166392093],[13784,"7f5760433dd685a09481150162297ef94ae2e1a1c1f0d900b40cf227a304ae99",9.317957166392093],[5013,"fc0fa2dda65f14953b604ad21d6f51e936dd89a5061b44cf63996773d18413df",9.917710196779964],[7423,"1e1ccd33e03167b4f92e7c2fe46376fac57456698c8d6441d46df5496a153ccf",9.917710196779964],[15308,"b500da090198fb5769cc13d4a0908b45681c4a592919f00f32dd19b78e1d3978",9.317957166392093],[7631,"47e105aa0cd8c31b93ccaff614f39b949085c1e2db38fc205697180a3a8effcd",9.917710196779964],[19375,"49b7cd911d8c10b76fe254961d1601fa6a263344b4aa11a3e03c540c4012c112",9.317957166392093],[11263,"a542bfd2e0dff43b93e18285e79ee132eb3290a3ee5b7d86dd10c52003a046b6",9.317957166392093],[3704,"b8f25a317e33050358c273bbb5921f21fd92f83c677a70fbcebe1fcba71f94e7",9.917710196779964],[10874,"5c9b290921a12f4e5e9e0aa7b5cc9088599273067741ce7c20b9d421a8acccb8",9.917710196779964],[4787,"4cb71de24d370cd87fb7bdb39cc04f7473b4b064681cf65ae26be5906e467be0",9.917710196779964],[6819,"3614e0c48c63e19b0932bcb4d5ada84b56d455348e327928fca632dbc0fa2ad3",9.917710196779964],[2098,"fb8f354a49454abd0f05e16dbd3eaa978ade59003dde9c3a22b55cee281644f2",9.917710196779964],[3024,"8d93fdc6faf296bddd4f52e2c09c9abc6edb133ea382a24d353dd305ad891dec",9.917710196779964],[7487,"a85a4d79fda72f27c13c6451050f6e9deffc742148e87bd44c7d525183bdccce",9.917710196779964],[18920,"42e3ab19788b5ac916dd53bbb0e3387685fcffd193f4b7bd4ca482ac10f5cc22",9.317957166392093],[17913,"d75267ef9faef568e9a76f81e88bf991a7bc30f63ea0270941a03f3913a5073f",9.317957166392093],[1125,"18930f29fdb38e235eecb1ae87eb9295738e0e9037801e3a2ae932eb7ffb6ff8",9.917710196779964],[3949,"59af6539ec4a50ae75364ac14b7e783c1f59d0726914fe451978982077be01e6",9.917710196779964],[19856,"86ae351c3755de9ca5692a7815aea01656b8538a7bc2d8b515bba1a490a78b00",26.17848970251716],[14240,"082984f7f64f97675fa8db6f66ffde4b8c1715bd9a0ef65197e31bed2f1c2e8f",9.317957166392093],[19527,"8ce2c6cbdb8552bda6ae2147b408e373a2492f9e0ef130dd9feb8e17f864960d",35.650623885918],[12730,"ba76cda27f94d827a5febb8b3a6a2c96a8fb2bcc76fbe6478293aaab531366ac",9.917710196779964],[9610,"3045934822b3dff8483b983153fa4efba9200b72fe818d76f317e26e5fb3fac0",9.647446457990116],[1777,"72fdf6420a12c49a5172ce93eb1c3d5481a4502c4e8501dcd6b7b37c120e67f4",9.917710196779964],[12718,"23e8fee295358929e5ea22d0f4794a3b64591abed507655953976c58884f7cac",9.917710196779964],[17381,"25e488a4da2624b7aa31bc70c8a85d58fb20edb01df518880b538ed2fe0a304a",9.317957166392093],[8053,"0f65b3dffb5cd731a7c3998b37ab249f4ba4332f5562bb22bd0d9b08c0b523cb",9.917710196779964],[4419,"fa3e0bed4452eb321057a3dc869e830ca7b95a062716d260ec298f4adf74f6e2",9.917710196779964],[9982,"d05b27046758c63adf594be34dc657f88cbd63dbd38803f163345669597d6ebe",9.917710196779964],[4084,"c70470d60403fe33c365129f67d5a50252a60d377813f92551292dff3ec02ae5",27.851590106007066],[1879,"cd6687eb3578aa0911651fc88554224506d7abfc5d6a8bceaec6cfd93f99c3f3",9.917710196779964],[18722,"efcf6922c9783b766603a17954233e5ce4cfff4fa7a386b34d97e7d9bcd29e29",9.317957166392093],[434,"4e4b412bb4b22f07c00e936cbe9ff158053fa6ef8739d0dfa2295180740523fd",9.317957166392093],[14621,"27fb9925aa6b183e01c69aeb3e211964e44a16f618a0b784c97b7471da078d86",28.12785388127854],[17984,"f6a4988fb15b44ae4476e720e1a1d54105904baff5304ee72c9ecb070b3e7c3d",9.317957166392093],[2278,"37c2de8fc510cbce9e40e7dca832a36e81fc1a51c02f0bf5dd29d47b14ec1ef1",9.317957166392093],[12778,"8922ca0aa048257e3c9198858f4199d4157f953217cb77b8bf231008a2c20fac",9.917710196779964],[6365,"3d15905fd5c4fcd766a87e7d42b353a0b753f485129126b032174a5269dd8dd6",17.572115384615383],[16280,"c6dc2561d5154759afeb506f1aa9730417a8aa4212d009f9dec09554f30b9b61",9.317957166392093],[6053,"5a3afb208f99909c5395d91774b49612190bb5d45ca56678a16a1a9ac6fabed8",9.317957166392093],[10800,"494aec4b235489a0fa7ab32125111b12b76091949ad259e7690b6e137b124cb9",9.917710196779964],[18294,"ca3b9217407793a225a4f4282df8e00234c55ba52e80ca607f1929b8dff3f135",9.317957166392093],[10638,"503b079b549385d043b4db87f486632db604df5aa29babdd94a0d918ead96fba",9.317957166392093],[19463,"6e42029de068ba37a62e6124f8432a244d4957ec33b7318292626bee6b388c0f",9.317957166392093],[11734,"85874a08e89866693e58d6647db6f6068e6042d1eeae09d974c1838d9ef915b3",9.917710196779964],[5072,"59726bc281f6ca71f7493b4c72ce2f44efeeb39b47e2c3a18021d1dd5507b7de",9.338112305854242],[8535,"5a4977f448473ebbd95a91949fc83d77c86f44a9685d2127aefc44006a5ecec7",9.917710196779964],[15057,"74a811b5521e01f41c52529cd376cf64d4107adccc7fd749183e1bbae5de6d7d",9.317957166392093],[5595,"a3e5be03d21247df85eba29def9f9a93e8960e46363deb93d1296e3a7606abdb",9.917710196779964],[11996,"67207b911e8879ac4fc1d61aca1f037b3153f9efcc6309908eb2905fc0225bb1",9.317957166392093],[843,"9acbb3ef9e1ea6ba9a2ced30d2028536e6f217ae877f7bf126702e3866a847fa",9.317957166392093],[8506,"5ac283aa563a729697fbbefe58d0cac54e6f076a7abd51f3562d1b41d4c7fec7",9.317957166392093],[1079,"f4a79e4225f511aae20a0d524dac5cf436777e33ff71badd00c6452cec35b7f8",26.092307692307692],[9424,"31364fd8631a65d86abc3382f4f2c02fcf678c4ab18d84ccd7a08d1871782dc2",9.317957166392093],[245,"a48e99cae9609700750622726fa4b7198bf83d99c0725b27bb8389e6334856fe",9.917710196779964],[11940,"fa74cbb439c45f60c19003527ed8eeaa9805d658f30980f8c1905c771e43b6b1",9.317957166392093],[18389,"c68f4fd7fdb9ee00f3e3f2da6fbb5e5db20bda58c459870392b7c1a88286a233",9.317957166392093],[9578,"7e1ce7c5071e88397a76600229187c8a7bf09a405bbc2e1e80234fb826b024c1",9.917710196779964],[18792,"d494caaa30fe993c158f69309d00e2cc220c2094b23a2a8919e9daf0695b3527",9.317957166392093],[14474,"6e55e494b4160b74909f418ac60854fb5884e8dd54f2a49bb427367ff755c589",9.317957166392093],[15876,"e735e29f36e1c59dbd52b23876551110ee793688be2e2e830baeea4ec1457c6b",9.317957166392093],[7757,"84ea8cc3cd48f137c3bd6e6a223154ba1b1f7ffd3ec05713804e6be652f114cd",9.917710196779964],[6334,"ed004ffe843e01ac01ebecac40286f10affe001e1700c0889cbcd8524f99c3d6",9.917710196779964],[14865,"bce2f380972dd534e054d1a377154ef8462b0892c51c2a9ef8450479f5ff7a81",9.317957166392093],[229,"4824fdb3dfb61cb7d4a5237d7c5edb9d58f927dd3203ac227c64fadf5e3773fe",9.917710196779964],[9171,"abb82db1417f5f5e5f0638e6da6279b43291cd0b2dcb9da943412f5694acb1c3",9.917710196779964],[10199,"4f98688289dd89054888c8345b185557b2da916555b5fbde69c4717078e904bd",9.917710196779964],[19399,"2e5e396ad5c3e58cde48dc69f3794ccc0bbae5e749299249245f4170bfc2c211",9.317957166392093],[7132,"fcd85cb2548e70bafa5dabb3b41872776ce860faf11632a32145f15a214a1dd1",9.317957166392093],[15185,"af1aa2d7d50d037a7a9e684c7076c2dec37f6e1114e44675df665a505c00d17a",9.317957166392093],[15341,"f4bceeae7e900067f535d4ac27b91dbc04d86d5ab1af9a4a7e75e8fe70828677",9.317957166392093],[17303,"949699dbad809c976a50037c46ea5ad1bab6c18dc37bad045b6fa2df4a34f34b",9.317957166392093],[19243,"56b13b0a9a4a50a9dde6d37b30123b57cb62f3db5e6e7d82ea0bdd9680dc1d17",149.55606708319633],[7806,"e16b513b23621f66970a35835a3bba866342a4cfa3c170a54e7959b8ab9dbecc",9.917710196779964],[9403,"6560ec775ca060619d05f2e00bcafac2ca80493ea908018284d632f71e1144c2",9.917710196779964],[3237,"7349f8b890b539df8d75a263f8efa708c16edaf240b421b6685587886d15c1ea",9.917710196779964],[13660,"df608653a62446608d9c882474af906f28802e68f8074d73fcadd3c41d380a9c",9.317957166392093],[5306,"3b5c8233b08cd5d33ae2bea10599a854fc8470c2dcb7325dcf5598e9430358dd",9.917710196779964],[17518,"062ff09709a75251354c888f597d60cfeffb7e13b141c4f8df31858708522c47",15.951807228915662],[560,"6f3cb9c07cad747c92a037014198219f8fbf91af3fbc5b3101e8ee4d267b3cfc",9.317957166392093],[16038,"344c26d75feaff2953b7c93e341ca62fab47b34f3a4fa9d936867dd15378a667",9.317957166392093],[14750,"23fde7fd4d7746fa25a1ea57873cc6cdc6f690f59df1d5baea0185b18fa5ea83",9.317957166392093],[7878,"4a4e595363504b76090e1138822df0094fb90416f11e6fffb1590be2934568cc",9.917710196779964],[6258,"58fb2b194b44c404d047b885e8d22cee46962897d6a48dfdda62b0b45efc5ad7",9.917710196779964],[12831,"324cd51b13aeb49ef9cdb6968ac282b84c46ae1280a43daa0c0a3513d8e3baab",9.917710196779964],[2444,"5a6433a2c52a87f4107857e3b3dc996ffdd45b9d45ca3a8a55af5492881436f0",9.917710196779964],[17376,"9c7a4ef9e1677eaa13dc16ed58217aca70c2e745b0e1c93417e517b9a0e9404a",9.317957166392093],[11219,"655e358e0d2b28dfbf6e2cc4827ec4e2c142f70bf3480d299ff748123b4396b6",9.317957166392093],[8784,"bd15ae4f89fddf94f2245472b50f6f052267baf4e94f2fb4947c4e8d3cfc2ac6",9.917710196779964],[11133,"20b1d00932f985df65a53bdef46fef02f5307969fe9edc95a94e839a389210b7",9.917710196779964],[3887,"a5f0d742ce67392a9e1ee1f8413586245a5bb59eb721e1bace7a405a11c16ee6",9.317957166392093],[14434,"4488346812167f3c6c46910693f0114cabecf9f1b74635e7230046276835978a",9.317957166392093],[8900,"533bb3bf22a9df46793a4901a21a5dcac83dd43aa4a178c4ea2e40ee69ba73c5",9.917710196779964],[3013,"e04e4d98d03e5786f24e1ce836ddc79440d7cd849dd803f6ce008313879d34ec",9.917710196779964],[3042,"d7eeba404002958db5311b62e7600ccec104bc3d486394b02394aed3ee620aec",9.917710196779964],[270,"f2fecdabf1576aa0fa87b92fabe4933cd4628aaf5da9c771e7389a42f6c722fe",9.917710196779964],[13615,"8beeb42bba075e5bef8cf0b1d076debb1cd87741ece71c8f4052204117c40e9d",9.317957166392093],[4001,"023a575a3649253728bee8122805af520a7dd45794fa602eecbf8bd295edb9e5",10.052724077328646],[7607,"cf75c272dacf06b405a2bb622858a0194e97f3083385de6e69423c29b2a22ace",9.917710196779964],[12889,"f3f20ae09db3e0249006fce406bdc83fe223b6aa7d463e59372a881d30db58ab",9.917710196779964],[16334,"680632b26ecc323e0fe3a1223ea0365077737a893fd635abcbcc3ff09d735b60",27.450800915331808],[1122,"4eee8568f2ffeed10cd4353f8557ce4cb02dea676eab2101bfa04893f33f74f8",9.917710196779964],[11059,"27847be235026df3e235ce8b31d4935f44727ef4445caa133a7664c88d0f9bb7",9.917710196779964],[12532,"d2b1eced4c8590eb71822716a58303998bbbebad2531a190f3116050a4b7b6ad",9.317957166392093],[5810,"ca3726a61a38efa065095b865557a278f88fafefb12ce1e12fe8638e6ca552da",9.317957166392093],[7821,"e3bad681d273bbde3bf724762a4d107b148b1266190610efa932b6cafa05a2cc",9.917710196779964],[9071,"c288fed07e2cdc404015efd7b2ce9c8e1a74ac93a4bc77e2e76ff034eacd50c4",9.917710196779964],[664,"23bc5524a29ad5e1ce7acc8e6a5f4c34b277a3dff200cb7391a859dabb2f7efb",9.317957166392093],[10750,"b7b41a1391787e7580b72d5db32dff83fc2721cc49c2e271c5ca1da8f4c9aeb9",9.917710196779964],[9744,"a2db1cf64e6eb16bd937594841389c5320d37fdc70c4d4c6c0e07d483dfa07c0",10.068649885583524],[7543,"f3a89d03bd59803ee9f23cdd959f74a6a2e318b164850277c7eb976b45348ece",9.917710196779964],[10685,"f208c346b5aa32c3253cd3680363c8f82a66cb171bca3500eb4997fff91226ba",9.317957166392093],[9910,"bc26d76f9ca92a520b3fe8ceebae2a800f299f752387efbad1ff8c5ccecee2be",9.917710196779964],[7891,"357fc4723c37378bf71cca9ae955c0eb8abbd3b2b523433c9900a22f208e50cc",9.917710196779964],[36,"51b4799eb16fb758b6b6da52c738082ac63ee5c06aff3c5a5279db08ea27c7ff",9.917710196779964],[18326,"7eba841c3aee70fb5631b11a03b4402b55aaa92304a7ddf3e37f253b2c945a35",9.317957166392093],[11458,"1fb9fd007ffbdde7da2d8f87d29b732fa9170a801fcc4ab6f5bab3234423deb4",9.317957166392093],[7303,"bf611448a3dad0c520750309fe136d6a5cb82ede934815cd03818a012c670dd0",9.317957166392093],[12358,"5905a64b762eaa2b5bc0aaffc16660bd2925a7e52b36760b190431738d74e1ae",9.917710196779964],[10664,"af223c605901fa3dada16d8a4bc9c304ab73a314bf951f6d3f2f1942c4b743ba",12.085106382978724],[3039,"aad3c669de4ff13573ec5ce7a83e424b9943a7abb32018bcdb45a0a731280fec",9.917710196779964],[12688,"4e3933e8b132308a9aa364f5718c9287507c5532042dee4e7b5f0ec7821ba7ac",9.917710196779964],[15674,"f5153abfc71105a6d8921c9da8d17162fbaa3fcf9dbbf1a87bc57fdac594ef6f",9.317957166392093],[3141,"7eff41bfde20dc1fb56c71913daf45012736e22a6d2036ba9433b1c1f2686eeb",10.052724077328646],[6165,"2a33ebc12710ad18c1a767663090b63643ce3fde1a45ec9149fe8a617e2d0ed8",9.917710196779964],[16969,"c8dd689253d2c17163780b12ad14cd7ff6eb14554590ee76754b38ac7acfb852",9.317957166392093],[9083,"c226579489e5e4a44eff6e33eca7f5fab328e341611b6b779f4ec206a7b441c4",9.317957166392093],[6386,"4317ae6553d29aa036b577e93cf265bbcb08dc6fa70fc2748f194b51c17867d6",9.917710196779964],[3764,"c0bcf206a3585e0fdb078d10d0c70fd93e09e358c3062b4783f9f7b20f492de7",9.917710196779964],[16290,"7cca719922e015e3fb29247e9e3989298e3680f14175fb5f78ac8a6f4ea56161",10.052724077328646],[18409,"0afdaf7bfbfb3ad34b4ed223904a0716bbb1c7d92301453bdcd788f645344433",9.317957166392093],[12817,"1e886e65c3a75cd317ed132bd165976fb2c5b4847bb7af1330e3fb7231d4d7ab",9.917710196779964],[4391,"fd4efdf5861f2a4af662334fcf4bcfbdf6a8de9c6ffe06434d7373fd2ab421e3",9.917710196779964],[12910,"0ceae1356d810f0227413f6a94ba2d125c6d2072f3c40b2cdfbabfbd7eb13dab",9.917710196779964],[8747,"a6f88aaf86a7ba0d9b401d02ab36b00276aa6ba57688ffeb00d3f2ce4c9568c6",9.917710196779964],[9085,"4d5e111e1d77e11f4007e0edd4fb57fd118020b2dc25bf9860d806d2ca8040c4",9.917710196779964],[15293,"2da740b66730ad5c3d8384a3939cb5729f444e80e6420dbcccf6cf6160cd9a78",9.317957166392093],[11432,"1e24b23430813d2be795dd1ed8a162970a3bf9a5831df3ad0e4776e9add119b5",19.985410334346504],[5955,"8f97c08bbadbcedd108367ba7117770d0027d0a8441f1e8dc976c2784b1063d9",9.917710196779964],[10589,"209a925865b13f8ca698dc1deddc0aca902957a3b78bee13026dfecc7368b1ba",9.317957166392093],[5770,"dc9be6f7f03ad641e6218019b2ec21f9ad85697df3a8717b8d0b5367317ba8da",9.317957166392093],[1626,"5aa89f552ad04333f2a7b0001fb25327d0e2f9d8f30fe47e646977fdda2d6df5",9.917710196779964],[17001,"093759cbcbdc28f743e16c7548f6056bfb17a3197f6676472d725eb5d239f651",10.052724077328646],[17583,"431bef9c3cce6d6a427bfa215446ee602025956be94bc73179570e448ee7a845",9.317957166392093],[974,"d7f918d1421f6f331ce8249081135ffc7bde063cf778e2a9f95f6c82627c5bf9",9.917710196779964],[1209,"8fcddc166b847da4d840d11f57e0a145f227c1a81dec157188275a9ebf21f7f7",9.917710196779964],[2189,"58e9b6c73879400ec467f393e6d34b2e33a917dcded3dfac709386681cd09ef1",9.317957166392093],[10938,"802206ecf58400754d444a762bb9def47f9e54ade18966caa37508d5af1775b8",9.917710196779964],[9738,"e79123ccc7f322efc830eea13152ea37909162b5b3fb202952bc726540370dc0",9.317957166392093],[19053,"cba425a893833cf079bcb7d78132828fde9bb87597cce1acff8a2887cec2a61e",9.317957166392093],[7746,"6ec395a0d7701db8bfba6797ab9224d3e045b8e9718c1753f355094b27e42acd",9.317957166392093],[13552,"4770fa808fb55c8880a1148e6d59460e8b7c7ee37b0527845eb0ea049d13b49e",9.317957166392093],[13646,"65ccd97ca2dab79ea0d289b16b82e17923ed8daf6e4ec439e759e4ae20e94b9c",10.052724077328646],[12258,"b2515ef88401e8de5fc350639324ada465a4ecaddeb8108dcaabbd4e553ca5af",9.917710196779964],[12013,"1da34134a16f6945f8dc36b23fff28992442a781042b0e7ddb8c861d2ee73eb1",9.917710196779964],[2727,"24870dfeb03374dd2bfbe5a021393093dbf4e1a5825dcc089168e1b1f57a3eee",9.917710196779964],[6554,"25e7d5de6c195b99faf8c7b53bf41c690cd86ac9e32a349eab49993c3f12fdd4",9.317957166392093],[11632,"1f75ee6d5a1f00a5f49793126a4a8c510a22609cdc202f6ddc850603c1ceb5b3",9.917710196779964],[15698,"45042900179c979b15243150bc3d0ebc9a51182e4d08ec4d812c5af272708a6f",9.317957166392093],[3046,"f40d82ad6ae40cab77a6ab5df4c63afd690c4f3b86f332c82ffdff568ad603ec",9.917710196779964],[16022,"90401a9b692997f5581fbae2d3c6d817e10a02cd83838a40d88f50364fdf0168",9.317957166392093],[6821,"bd2620681a7915febf1c93b02e0e0d80d30b4527bc209ee721aa5e37935923d3",9.917710196779964],[11801,"a6abc4059b929a1273612dafaf9889fbd7a9fcabefb3a94e53f9ed4bcda5b4b2",9.317957166392093],[643,"aa6bc62c0ad191c94166745e084427833aa13eff64abe3a6c6e7a7d959fd9efb",9.317957166392093],[502,"3927cf7f9e88cc0ad49410b900c497dc95c7005e6f9555b9f467f208c9d0a9fc",9.917710196779964],[3879,"1f9bf06215a68c3667647d451238ab1c9fe0e1c5932b35b92125d6863cc881e6",9.917710196779964],[16947,"a85f0dbb8478b7d802648b362ae71fb67824806ed06616b568b1719530763053",9.317957166392093],[10604,"4df7087ff1d872fa19d9e3628a8e21033132e81abca365520ee938edc2579eba",9.917710196779964],[1096,"397fb432e27bbd704ac9f2c9ea8c1bf6c92b308c7ffb707249d816e1532f96f8",9.917710196779964],[3805,"224d154a923e461635cc91a8f556dbd3cec45d958e542c53afb10bd88624ede6",9.917710196779964],[924,"c56f00d02e7d6612fabc537c814798d16a71a4602bd650d31a71e56d4f1cabf9",9.917710196779964],[14013,"4845af7623125fb4eff0ebf6b01624f05e1d67564ad6c2116b922970f0ea8b94",10.052724077328646],[18764,"8c7606dfefde15408a6942f00742c306086d80ab26f26a8be558282e4a202028",9.317957166392093],[17813,"08304b1f9e83aa716c2379c54bc6236f1a3e389265f76ba0b1c3dc75d3af0741",9.317957166392093],[12173,"cfdbc86402fda525ad9ff64af8c81e5dbf66cb3f01f4ee07ab68a7decdb43bb0",9.917710196779964],[14121,"741cea6d8e4c70fb93c5b3c26df45cd5be71946c3ea9299ad7527be8c4d41492",10.052724077328646],[15080,"9c0420bc3324fef2cf4be139929e181b6245620bab67ca9f157aa8ddbe0b167d",9.317957166392093],[18956,"31d559e4e7859d6e0ca398fd105a4550607185f00c8862d476fa71616321e521",9.317957166392093],[4709,"da6d624d0f7e64a4543b0ea6430a5fe83f5c178dcaf6576e037904423352f6e0",9.917710196779964],[14812,"c08279d4d7d2b4c41fc24e7cc8f4e6214bab8d97c679aecaea3d31cb9bdd8e82",10.052724077328646],[8488,"38bd887af495651a2a77c7f84bb551393ee7a3d89b75740fd26ae5f18f8414c8",9.917710196779964],[13224,"8933563f605d96c90e38a69447fe7ff7eb7606419692af74f725d38d79ed6da6",9.647446457990116],[7362,"d41094ce6f50c3e9a6e1dcea4b4333f7195d56046676a8b3084e4cc11b95a6cf",15.079646017699115],[1173,"56babaee4dca40c4d01a2faa76f8f09d2dee3239a6a1ab53d2bba4064b2129f8",9.917710196779964],[9245,"2b4637ae5807ceec4f130b281546b5c162f714f906cdf5f5d494211bec3925c3",9.917710196779964],[5945,"6ee3a77848df2c5d467c406cc85675a4b361ac97b0f44df35a7338fa3c5c6dd9",19.81330685203575],[11773,"2792fb2e22c1426fd5778d9bafb1921df21b0f79395c68f80d54ff2a6f18dfb2",9.917710196779964],[7977,"0710bb33f8aa244525b66269a7e051776ecaa55042dca1ba5bd7f89e7c45aecb",9.917710196779964],[10888,"f73c0f4862818f8fe1e800f47aa002383e4f1fd6e4f506f82c82380427e0bab8",9.917710196779964],[9495,"a4c13dce57064386494c5c894c0d2330383007541f69dc8153ba50af6728b5c1",9.917710196779964],[14646,"3b0916263b0d462ad3775ef6e24df23f62defe3dea04fcfbccd23cfb1758ed85",9.317957166392093],[5700,"6915806ad5689c2dca77dd6b078b99658fc3b054475de78eafda0aa7736a0adb",9.917710196779964],[89,"190217bafd22d40ee1286959caa8b50c8faf60eaadfa3a71ac3e9f41ec1a6cff",9.317957166392093],[7495,"2504c7fe0b770ff037ce88f18e00bc78eff60c82be4607aee56665cb6735c6ce",9.917710196779964],[14625,"e790b38962938873491aa54fc13b48961b3902aeeb7682cc91c2116c24677c86",9.317957166392093],[18689,"b5885bbcad7364c05eb198fb076c73c093274a968be640a22a8be9c5a126b12a",9.647446457990116],[1644,"c7c165273fa66e2b069efb9c23afcd8c95f85e623facbf53b434b2d3f16154f5",9.917710196779964],[19679,"398af7304a26a55c4196d83049c2d13d987fb8682fe6200ea55df8cd12646307",9.317957166392093],[8377,"441766c639ca023dfe93c5a721fedd4c315d282096e2f9f2f051988b2cd7cbc8",9.317957166392093],[949,"ba8ff0ae9dd76f1ff934b1a3e6b0dcc7a676e37cae6c5dff56c11b42dea27ef9",9.917710196779964],[11816,"c8d8928facd2acf17d095e397c6811fb607e058b1c79103a0049199017c598b2",9.917710196779964],[19165,"b8ec5e89b82a6778f46aeebefb28deb7a137fded50ed5e07ba7e169a0fcbe519",9.317957166392093],[12114,"c8f4a1611a93ce7c6af0ff130ba18d353c6d708f16d382e7b93fa55b8b36a6b0",9.917710196779964],[5109,"22dfd98fd428e93f3b78e39724c5b0ee8160d750788bde7f8e9350ce5d2386de",9.917710196779964],[4076,"eeb4df2e31140ee9b96aff2b2cd9ec240e5f88f3a0ebf84310f0d4c3f18736e5",9.917710196779964],[10198,"7b556a47934c4b9e9abe86eb8c5dd0385ed0b5be2411022634f50430b0c505bd",9.917710196779964],[11184,"5e6363683161be1035681a743ae373d23fafad7261a44004901712510eeecdb6",9.917710196779964],[13714,"840820cf502222fd6219fa32a965a3a3f47614bf26119be787d9fa41ace5159b",9.317957166392093],[8878,"2b21f2d16f960b8af39f88eb945bbdca2adff3e4210e8cd4838466ab70da92c5",9.917710196779964],[18623,"a40538a729607cdee97f30b49db6695615cfb7bf54d8dcc211ac0a3ccd4f152e",9.317957166392093],[12442,"66735aa918ebd483429bae25f56c66e2a3fa3ed91c5c47945da51cd6dab151ae",9.917710196779964],[2449,"fd894853eadde57f4885ff2194ba061981f90cb080f3a19fe6aceb5ebb4a34f0",9.917710196779964],[965,"7ee4eabd30f25dc4460b141d39d40e01b0936e94dabb4325ad33134d4ca167f9",9.317957166392093],[11766,"c56f4ca2d8d50755d32216867f37e7e5ab33f791fc43912ea60b9d7a65e3e6b2",9.917710196779964],[17036,"0e588aeba3bd1093a01f489541d4987e681e79d79e55ba910c2bfff9e7ee3d51",10.030959752321982],[14725,"a8ba806ebdedd35571cac2c017f8061275a89e6a31f52e5dbee8cfd52e876f84",9.317957166392093],[6446,"e4e0f99faf82e73b06973bcfffd5806416d8fbcdbcb64a88115e7965bd18ecd5",9.317957166392093],[8640,"61ee76500d5e9a96ae66fd84ca1f3c15c88d0ea80b5b60f0d1bcf44cbdd128c7",9.917710196779964],[18868,"9310d1386c1801cf0bc54b0c10654a4f8f56b6893893062ad6001ce2f8db6d24",9.317957166392093],[2738,"2820ef3530c4762205735b81d269ba4657947e1c2b68d5b6d6e87625e8f12eee",9.917710196779964],[13342,"48fe8ddeb1f26dc24b1a7903ef2e5503ec0c96d4fb0f94fc2f2936a8f3f29ea3",9.317957166392093],[6424,"6589c3f82b380caddce65304d20d0b537e8d9cb4550006573fcc0e99bb261fd6",9.317957166392093],[7917,"a93220e65bf3727adbe1f0e6acc24b08209749ce6ee3897025b0bb2b6bd81ccc",9.917710196779964],[16548,"8f737d4ba08b4d5756fa2f9a4ce3efa17dcc107cb2a99a60a3e3b96f278b0c5c",9.317957166392093],[1298,"9737adc899cfdab62687e62a6810b445dc1c178653efc79d755b9852061863f7",9.917710196779964],[13355,"8ddb07eeee163dc7f0f246ae10397ca0bc073608a2747e0a14041e1f0a845da3",9.317957166392093],[8560,"c5f3a9704036f23aa2702030f259bdb25fe7902d7879813d5cf655505982a8c7",9.917710196779964],[10082,"9917f5159882ed30c1602094f4daf2a89714c40cfb8c81db45c2dd21b4cecfbd",9.317957166392093],[1189,"23431d65c866cdff7af99312e4f468f5156b86925d4dd1a413636f4a290816f8",9.317957166392093],[8071,"4356d9b39bcb00af748445c28bfbe2ac4630796d8ce417dc8c67a1b2b07bf4ca",9.317957166392093],[17938,"a199ec28fb461f5a36b7a56d882637e5d2d5bf0eca8b4ba4741f7040a15e753e",29.30366492146597],[12791,"fff19421d5a736e75d58fa9279315720758aca719706238d1cb885aedd5cf6ab",9.917710196779964],[2812,"65109d405078ffcb7c1acc7e6d307ef2d09533c454ec9843bf91597433c497ed",9.917710196779964],[16212,"aa514b15ef30dad21271bc0f5a296bf99dd2a1853cc109e83835751455069863",9.647446457990116],[16985,"ba0387911f6913f73b1d5f604189cb92c703908893aa68b235d02ebe26bd5e52",9.317957166392093],[926,"311f44277b7ad63ddbfebbe7070a4bbe43ec5914db2866456d277200ff1fa8f9",9.917710196779964],[9405,"9db8f4156fbcc4b11449efc89d4079676cbffffe2203e6d52deba984f5e440c2",9.917710196779964],[15788,"0f8387196d0c92e2f979dfd99ccddef7632b73c06e9096ba68135a32e0fc8e6d",9.317957166392093],[6169,"08f16b7be6ad5c9b8d0f4298cc33ad876c278a75406d11d9a27688bbd83401d8",9.317957166392093],[11201,"028cf9b8837e582a12690e950b33d10f89b52722174fe2f63c4ca8aa7c31aeb6",9.917710196779964],[1660,"81d96f08bc640fb861eb57cab4c2e525990a84d02cc84488e99be5276a3d31f5",9.917710196779964],[18428,"4e5662c0940ae69b80396175a08ff4caacca7cea102bb5cc1be8021847ff0933",9.317957166392093],[10568,"ecf322acea44e81d380b6a144b2fa733fb2fd57e6ee8046327932489fcb9c8ba",9.317957166392093],[14592,"98307a7b4faae7b539a824652738900d7ee99f5fc7ad761160ff72c6f8384287",9.317957166392093],[5516,"24f88b162b6b6ae41d52a5cb120cf49f2fbe98eb289e203b114bfc160ce224dc",9.917710196779964],[13712,"cd2b09b01714281f803c63dd641ecdf9ed355bdcba5493de587b37fab4421d9b",9.317957166392093],[12931,"4980bd7460539d88974105739aca499ef40821907f3736a150ec01617b5707ab",9.917710196779964],[13857,"cce2b8703b644d45cb3c20e585abf4ae6df2b05f623226a86e9529b46fcc4898",9.317957166392093],[321,"8870963be21dfc3af7729a7411970ec6c49195fe85ee59b32a97e1ae9451e3fd",33.08943089430894],[14527,"d7872f52ea483280bd4ada72befeb383c61426e32bb8ca46076c7c19f929a888",9.317957166392093],[16966,"6c8232694a35f1bf42f10aaf0625eefebf8de9e437d1993549ea3e46a68dbb52",9.317957166392093],[13435,"0e0a016f8fc70e351b8be879ed100724185f833bc4c61eff98549c451373ada1",9.549738219895287],[1898,"a56a7da3f7475f1ad122efe81a518a551efdf150bfb2b3a48faf1e0ad755a1f3",9.917710196779964],[2629,"99b1ea739a3671d70963531874298d55066430f9bf49cf0e02b0e810e60f00ef",9.917710196779964],[18929,"8cc4b8442c04d2ff6127009eb037eb8ae68b6a2a719ca7818c089717b5679222",9.317957166392093],[11974,"862617a374ff8416e8aaaeeb77b70fc1e2a73743491ddeea901266a8c5c37db1",9.917710196779964],[19149,"e402d84569ed176a74cf2521464e75d638ba4c8c0a3b9f303c428c3d4ec78a1a",9.647446457990116],[8548,"a126bd60897bcdadf1310737b515bcb9256b5445c90ce4747d3f5709db1dc1c7",9.917710196779964],[17670,"0c9bf76db5f3073d8cdeb79b7b6fc1b5774e7938ef7ac536ccfbbb20c85db843",9.317957166392093],[18198,"f514800314e23838b76075a5cce67d00a50a963c959a9bb50b387b2290e93638",9.647446457990116],[9023,"0cd778ac65a04363f1c2db86bd458816c78ed61c56156aceccbfa1fa0f4ca0c4",9.917710196779964],[3688,"9bd697f09623a3a69aec4e54bb3d98c4069f3f9437892c54af4f6fad14daafe7",9.917710196779964],[14937,"b6d04c848ec42969325d8f34c041839ddc3975596b3a66b08c8125aab7231780",25],[863,"9dfae82bd957de4f2c541241115574828726a68388de82a2842af5535a8c23fa",9.917710196779964],[10452,"92ead12d724aa6dc96d7ef89708fdf0b5e56bd88743c87fc34530145a8e669bb",9.917710196779964],[14348,"d8f3550f51bee28f0ab0d7d3aa3af8a89da3db8b844478b3466df5faafea628c",9.317957166392093],[6182,"9da9d0701ac8a4938216c3548f82abeea7b432502bc8aa683dde22340d0becd7",9.917710196779964],[14672,"860b6fe0936ee01366a13355f73d4be1272199197661c3bbd6ecc30ac4d56285",9.317957166392093],[1484,"0dde0c3fb92d3c7de8471cbc9b66a4c0cc88dabfa1cd2e638ea84e2506ac39f6",9.917710196779964],[1719,"cec9abcf2c84f52c4c25f382b4dc34bd83a30fbbb6918153914699d2db6fcaf4",9.917710196779964],[19312,"cc1ae250c65e5cfcb2107ffbebb4144718a222fd334046ead7ae9e27d9008e14",9.317957166392093],[12410,"3f842a49644dfd3d1ef4caa1aa0b5f4dcb60c75c84ffcd829f2bf218c1398cae",9.917710196779964],[9385,"aa1a21b6114af8337bf11b80e478ae8afbd38e89672010e360c22e0d2a445bc2",9.317957166392093],[17009,"dd092107d02e08da9e331b7d3912dd0ad32a73ccba781ec6538f2efb272de051",9.317957166392093],[3891,"bb68d9f01a28c29eb089e0998605679a4ba682d1485febefc8af88c08b9d65e6",9.917710196779964],[1272,"31b9de6a966e4379431143073c8155f0bce58621f7f4fdba415dd215f2d58af7",9.917710196779964],[11716,"78ec3f815075d75acac314609f4c39ffe846253c6616bae9f2a077e2fc0936b3",9.317957166392093],[2399,"1065bd4e7f715151e3bb1dec411390ac5ffa644e874c5e3febd12827176e80f0",9.917710196779964],[19001,"b0cd5206508253005e1042e6815ba76bfc19276ac1c84e696d9f60a5a3117f20",9.317957166392093],[1489,"83b34b69f2b0e822d37af309ec969294b13a542ff0e76fc64bcca4f0a26431f6",47.86147186147186],[5187,"74bc61abb7fb0f07189e1acd27dcd2b90191e95451547d93afd3baf91a3a0ede",9.917710196779964],[2926,"254b190686d13c49ce72a291dcd0bc39c52a0ec76c2213ea948c08037e99deec",9.917710196779964],[9172,"6217912db870a5202255c108d1dae513c382915523ef009a7998a1242ad4b0c3",9.917710196779964],[14431,"1cfba13df258e7e2703e1ae97dab3954c68545d1ee38b60fab51c20c4c2aaa8a",9.317957166392093],[17268,"be59f8d3631d13846f1e900beba6ba0aaaea6fd60daa12fad0e6cbb08ef3d04c",9.317957166392093],[3664,"5b0b570fd1451d095ed92fdaebf228c09741d61d474a3d3a1ef2218ad459d7e7",9.317957166392093],[1652,"9833d3f21f07e48c307c6e5a477ff357b0c09dd7456689eec86a95bc41d344f5",9.917710196779964],[7840,"da7fcdb68080d5a8f184fa431c002b9c9111ff9f7ace0013f604f5dceaa68ecc",9.917710196779964],[9344,"19f10cb925a67a7cd54f5edd25e06fad7beab2e92f3fde010590473f876e9cc2",9.917710196779964],[18071,"ce4a88db150f214823bae690d847ff5f5ca21e2072db6e46714f3752c865b13b",9.317957166392093],[1284,"d7efe1df824c6e924026ce5067813ebe10c407b02d8fdf930b59c2dbc03f77f7",9.917710196779964],[577,"bc4a3c4172d6787c1f63b7e994b679ae9ad501897888f33a94404c72825817fc",9.917710196779964],[13051,"69fc24d69df67f33f39afdadf32232050c7df272058ac0cb4aea3538bf8544aa",9.317957166392093],[16525,"e347fa4908f16b05657a110a0d5ebc5039d07096c8ea54237821689b30978f5c",9.317957166392093],[2817,"6beb2acbf3e017556c8f0f9cfb98d13e219f67aaa9f9979cfae270b0d47292ed",9.917710196779964],[18535,"8423a9f9302eae14305bca150904790beb3873bed3240c0720eed97cd7d1c830",9.317957166392093],[9181,"b03649ab2d929f91895100a06e58768f3e63a89f4fe09ba0694280ee48a39ac3",9.917710196779964],[18377,"b82e3f7021a423279e4cd560127f0138d0e7d88d6c26774204e553ec627a1f34",40.97682709447415],[1957,"a216c06ade9dad56ee19acb2209b77041c865673fa9e532d77b7a0473ff14df3",19.07569721115538],[5848,"1784dc223e71d03259145eb92b7c22297b2364ff6ddaa35368dbdde7984c02da",9.917710196779964],[8638,"d4b80699e7cd8239d75f869fa1c96a49019b868fcca160bed4759a2dee7d2cc7",9.917710196779964],[2199,"9ef07f09156833a9eef28a608db94ecc73019d2c1aed09001c94e301714e89f1",9.917710196779964],[18602,"33e86c991b608194f26a2fdb0978af8a2caffc8c31af77ce44b6d12f15a8a42e",28.098939929328623],[14844,"6c6f1153eb808183f15070b876febfe6390c9ba9e2058bf507218dc43bbc1182",9.317957166392093],[4879,"7267d560630ac89bb1a60c5e8283daa9cca17746a22f79f55cac8bc4ca39f7df",9.317957166392093],[3829,"a979aab1c6ffd23a041b01390a18fcd7eb7367b92e5d551946ffab535c7dd5e6",26.062350119904078],[17406,"da7e0b8fd7e9dda0ac1ae7142c0b7f66d666b2cc29efe89e79c7af3c46beaf49",9.317957166392093],[12051,"002f17d4efdbf0612fbdff8eb5d592c593528d15a9be868e71ec7f133dd4f8b0",9.317957166392093],[17349,"06f6601217611081b0cbec2584d29f4ae273c38d04c2e7323435a86e7c3bde4a",10.052724077328646],[1221,"27a7b04be8be024648500c5e7362dea63d6c4fc1617add627fb106b7e508def7",9.317957166392093],[3819,"7144e4393d12858a7712a4d2ab944c256836ad58ecbd4e13e47612e91b7adce6",9.917710196779964],[13839,"ae806ec6734159fd51bd45c07e5149b92d3bb8073c5d084cdacabf6f43cf8a98",9.317957166392093],[16189,"9eb5ebb37c01df1b6b086639ca14aef3b67e7f2de18c76fb525f75638e582b64",10.052724077328646],[909,"e294660f33504755d26abb8bdd649baa1120e2e831a6d6a59427d5bd939dc0f9",9.917710196779964],[12470,"ba28c0cdff9971fcd1166585f0328ba800e8b551bfcb1c0ee154fb5d9d072eae",9.317957166392093],[12848,"aabdf5e7c88d211f5517f19b5b0d2b92add359d870189b2c743441c7f80197ab",9.917710196779964],[18972,"c50c6981dd73fbbdcbffacaa176425ee12f838eeacd2620b9efef2f188a77d21",26.11764705882353],[16215,"431e8883dfcb5ca7f87d66b2f4ba2848b619c0dccb2248687250060902417b63",18.009022556390978],[7272,"463cbdb3c3e54b73c41975bf905d10158597c9ade6040fc1fa3e509d100831d0",9.917710196779964],[5793,"fd7f3c7c3d4605eeddd38a7c76e1a63f9154087985b535695a9fac57ee3c79da",9.917710196779964],[13778,"7ad97e87dba2700c668bba234e2c94accc9ce52389d66e4cfc6ed415cecbcd99",9.317957166392093],[1232,"886af20530d93d31d872a5a70e95bd71f2ccda8667f1d99825cf53739cbacdf7",9.917710196779964],[1008,"5c7459e950470e1a96522af0f55e731b140d3aeb9a67036a117bf956e7b226f9",9.317957166392093],[14423,"f531bbac4737e5da8d039e8dbfcca444af17013f4fc0e09f164ea5f2273acd8a",9.317957166392093],[13068,"72bf5021af55a175c7ce80078904bb9ccf186149de49d35657af159cd51231aa",9.917710196779964],[7710,"f384cda4dbc65acb9a6e2293098ee3ea6e86413e08e0ce2209df8a1705ac7bcd",9.917710196779964],[13765,"fe6083ee7fd74cfa06ea1ed13f35b2350537c1fd5d64e4196983bee5e5a6109a",9.317957166392093],[5555,"bfe490d73f5724acfd93c0fa9522c6b0e32f4929bd7aac5d7656409e4f13e6db",10.045662100456621],[3583,"5ee097b8d080164c99d8834af0327e389237f93e034d16e294f79a3c03bd69e8",9.917710196779964],[9112,"4dac2e29256756299f94e5963b8ae09dcf43d970cf9d61ad0827433fd38b10c4",22.689895470383274],[14920,"da63b9007a81da68022c772cb124b0f79ed769bd13c770fb5579554bf8a88880",9.647446457990116],[8527,"381c4b53363db643817192a53db0387d4741e3b5b46fa72f91668effcb61d7c7",9.917710196779964],[17129,"e115433342c6b232616eb1f8ffd29c1a26989c8a1c605c1e5518ee06c06a6d4f",18.895774647887325],[14597,"27f5016efb3ba1f60cb048378bab3248ab1abbe604fa55cf31ef43b142c42c87",9.317957166392093],[12460,"ddaba5daa71aac9bf814ee3008269e966076538c31dc88687ac75fad67e43cae",9.317957166392093],[6631,"f89519c7032b937b6201a16afa0e190a86406797eda2943b41e62af56c0e74d4",9.317957166392093],[16379,"1f2748595786b692e227c8de71b356d91b6acf737adccff1d864650152e67d5f",46.84901109503136],[10434,"23ee62d8239c8ffef3438d608164f37cbb800efb3bbcce5128fe322ee0cb95bb",9.317957166392093],[8115,"aa8f968fe5620304e2e2b6ba72334dd7eb1cfeb8f64a3baee99c18d10b33a9ca",9.917710196779964],[1358,"458742227010b075d63ded8ebc86dc1e0a268ac14569557ddd9a600932d7fdf6",9.317957166392093],[12407,"8c6bd672a9eba65eed96cc34f1b3b376f4c3fa1376fbb6346a901e9d9a6a90ae",9.317957166392093],[7480,"09b0a979c6f5ce18a0baedef8d4eceb1dc927085e968d72e1ba31aa07359d7ce",9.917710196779964],[9005,"e75b50bb90d0c9fd591681df4e0566dc8b19729008d00758f782e91f2210c5c4",9.917710196779964],[5628,"60028bbc6ef20f7fb88381d91641287bd3ac7a59a05690e9108f97810a4d79db",9.317957166392093],[18640,"3cb0f38f133f30493ae1d74f5bdf954f4f326f82b4c62128421ab59ff6ad3d2d",9.987841945288753],[18086,"4d677000b7e78b4f955431e7371ba464712a72a2832232784cdaddce27c75b3b",9.317957166392093],[4591,"d826c6db0784a151137704f6278764873f09441fa5bb8f6ae7944cafe236a7e1",9.917710196779964],[4387,"ede30debb1abe67a49999246f0c972e4485f746670e92de1f9be8e885c1e26e3",9.917710196779964],[18696,"ab3fed54af361189b6551197190384d04f6ea55ba234199c2e625813a39d802a",9.653116531165312],[9001,"88c06ca7eec36302a901d66a910038de2b1045ace8381befb5b54b254007c7c4",9.917710196779964],[17116,"4cd7a6cc284abb9c40a9559c1f60244f6679bd470bc6b5ae2b0f949835e5a34f",26.036553524804177],[1992,"46707b3e4d22ae59db93a8b1338eb60e21342d57377306cd26a3060a65db0ff3",9.317957166392093],[12113,"79c4c429fec8d448acad52547004743d21b22474c70d3d165d763905c04ca6b0",9.917710196779964],[5662,"adb19258064779ddfb52af64b6bc6c65e731e4ac3ac43bf9574432c8244842db",9.917710196779964],[2316,"8dbccec3792e44bc9005f094ce04a822b942d482daf18bb66a2ad55915caeef0",9.917710196779964],[10964,"202fdf2100053b08a606cc846a62f188fe542915277501abfc3894c898203fb8",9.91150442477876],[4210,"558527014bfd3a52dec1dd74f583579f938c2a9faa06a62d0bd2dba035155ee4",9.917710196779964],[6467,"b1316d2e99699e7e87df8ddbf7c9c03ed2633f6dac945ecbafba9b9329a5b1d5",9.917710196779964],[19237,"f721981260d5a08db71fc78b69170ee6ebad5ca0b196b8ddb50595f9f4125317",17.09090909090909],[4003,"5c22f0e0055f659656257c51efadacf51362579496779ca568205f410f8eb5e5",9.317957166392093],[3551,"55a0f391b0aff8ccc77f19d7fa339bbf0e8db85d678df140ecf107bb875b97e8",9.917710196779964],[14264,"228fa4b99146242a38f0e1a46ee391ef56f1fa20542f3fab9b09c268c078a48e",9.317957166392093],[14529,"d9fc02d3bf9ad3eb3669a42c8505ffb4722cb7c1866b15eef30bd9e5f556a288",9.317957166392093],[17973,"dd31ea399ac052ce4f452d8e1d53787e0d9f4df934751cc459c7fb1ed38db93d",9.317957166392093],[19438,"bb2751dceae45e15756e9886c9ae6bcbfe49fff1291ed7e882e46641e3bc3710",9.647446457990116],[9524,"5498ca693bb59212152159fd66b4211a8fcc6f5023301c521a21606fe62f8ac1",9.917710196779964],[11292,"670d242f45e70c8077ee068b493e9c08b50f4556f23790c196505bb044dc15b6",9.917710196779964],[19065,"7fc3872a79ba116b958f0468482656379a63203a806a2421fd92cbabb831191e",9.317957166392093],[10308,"acc48c2e5700e95b74eaa2e4d0102a60dee0a07dac542e1a651199600feb4ebc",9.917710196779964],[14850,"2167135f0d7604b90cc32083a9252563d5ca4cf576029a2104cb69d3ffd6ef81",26.09252669039146],[2966,"22448c2ca2930bbabd259404a050e54ab9f2aa54102d0ecf8702f0fd11b386ec",9.917710196779964],[6192,"266143a1038d151f6c8a0f1a74be14dbfa5d448f3534a667c99823af5744d4d7",9.317957166392093],[2824,"e380074ca6b61041d47365a40022a82e4b6332be674510e4cd2d6d6ddb8088ed",9.917710196779964],[4070,"bc98c4d5cb3898b5e85807049c1b388977cea0d7da50fb48981c10f179474ae5",9.917710196779964],[15659,"7f34dd8ee7d8282e12c7b0785827d2bc938b728c82018603491a13bcee682a70",9.317957166392093],[7200,"0771a69eeb95c09b405dfc9361702cb20ef859c3c96441f1d7b7459bd3d8b9d0",9.317957166392093],[190,"a5566e728f7430f3f6c01fea015f23c07bb1231760190355342b953b6998bdfe",9.917710196779964],[14567,"280d23d6f87247b766ec2472b6f230c6b2f15c3ba98cbc0990f447977a1ccd87",9.647446457990116],[18890,"4def41a3a335a2509e6ed296598b3958944579c4e64cd054c0c8e38f179ec723",35.829181494661924],[14863,"9f30c0245e8dc264ea34296f06e2c25812cd96bbb063f5fdbd4fb9d01ee58381",9.317957166392093],[10571,"c4e88f8dedb3ee98483482bcf7f47d1c5918f4666b250e9f14e459ea9c0bc7ba",9.917710196779964],[19606,"2019641a9fa3af3707521de19f505ba9526643966a6cec2672e527c599b2c909",9.317957166392093],[7809,"6d769370e0ae01f92ce3c9d1168080205933040f797d0bc50e1c90f4c122bbcc",9.917710196779964],[9322,"a39af9ed2e6a253b03f4a736a2bda26d5d026cf87d4d777170ae2d08f35fc0c2",9.317957166392093],[12435,"90f9599a331997c91e5aba2cf2ec54d2b2661e50700d3a8db8d6d10a31e35cae",9.917710196779964],[18544,"bb9d2dadb96c8c7795d088dac3ec1f0142b715abbe56a9bfc368b2e9f1ef8f30",9.317957166392093],[12340,"92a1d056fafe3cd0dbf2b451da2f99e5b7e3225aa032326402cedf2a7383f1ae",9.317957166392093],[11168,"925ee4359a3e8cdf704c7fb28439b1a7a868ed85a641d470f06c9c7d3d9ee2b6",9.917710196779964],[194,"169ea18a96278ca5a71cc72ef68752f508bfd7c1df89af14432a20e22074bafe",9.317957166392093],[11914,"3223cc5074b269394b2431dbdf921ac4e7dc8cbf278e056086e1b6299c0fe9b1",9.917710196779964],[1359,"37ab8c0cb0b555e7e0b50bedbb533b2ce3e5ebcb8974a86bb2ea055d36fcfcf6",9.317957166392093],[3215,"d296e3247778ec9746c0c304f45522f983489b14adced2bd9c43e382e496f6ea",9.917710196779964],[875,"67d185c4ecdf8e233af7cb66d31817d6e8eebfe5f90e34863db19258537610fa",9.647446457990116],[16608,"5b8e227e14e09bb3269be0724ec39b14dfd4ef824e4a362559e721e9d755a55a",9.317957166392093],[13562,"30ff5f9ade8942438ec99d4e707d5d1f7ede3fff648d8b6dd99c9d3640a3739e",10.052724077328646],[12355,"8eae3d170e424d60c62f173a213d6c96befb918a8a57168d9b4b5ad6aca9e2ae",9.917710196779964],[14906,"4a1183b7b62b8dd2bbb7507109611bc2fd3df4fa7a7ce7dac7ebdbff2f46ce80",9.317957166392093],[4697,"39c4d66985a830f2da5248068636e5a8e2bd6d2ff89744e96a39c07a964004e1",9.917710196779964],[12256,"063fb37c1b4c1c218d2ac5edf75d70c9c7683f2e4c7ecbccc39c6ba667bba5af",9.917710196779964],[12488,"9d24c9f5e94d0419e19b1c49aa705493d87bedd0ee5716a6e658b7ef501205ae",9.917710196779964],[3269,"2c3a3584af272bbfe5967fddc379ea986d3a074d76eca65d025ecb523ae091ea",26.09252669039146],[5103,"57b710541148c5c89cccea033d76cde95bc9bb7e3b8668009a583a3535178fde",9.917710196779964],[9626,"222f5e2e500ba81a3ff2ab4da29683427e919f9d59f288e8682094ab4402dfc0",9.917710196779964],[15911,"5d77aa164afa8ff231e0e6ebc6f24a7d7681f4e095545d407439e98e2b3cc66a",27.900178253119428],[12653,"c69cb55ba0a70f0448773ccd1335aa56949f5da3c24ff55b851e9db3ddb3ebac",10.052724077328646],[7833,"eb4e7398229616ac7fc2709c76b456f6ecefaa0b2603b60f3e1da41cf9bd93cc",25],[15007,"c452b2db282c5385f55e7d26fede2277218d745c0d71acf5812b375079a22a7e",10.010582010582011],[12419,"6f58a54b52a96c3c000b8f81c455a23ab27bf82b8a98852969fc053f683478ae",9.317957166392093],[2561,"eede81618fa144557379620b025b6bc2f8a074965e900a57e6dcb4b20ac27eef",9.917710196779964],[5612,"a4f3112bb996a175c90428767dbdbd6fa2ecb7d46a43eda172d6e74caf1695db",9.917710196779964],[11687,"88a0e3b41f5f219d1708dc441b3318fa39de18ea5712a0ca1ea729d1b35b62b3",9.917710196779964],[3597,"93b902f57fe80b1bb3770b37602e9bf3ab816d28d46369765f83911239ad3ee8",9.917710196779964],[18172,"a3c6b47802707d0da32b085d2cf2ff665b296b9e0f50c648bcea9290a541e438",9.317957166392093],[18366,"bc9629646d5392b6f8f41e6cbf2e8bf33f2b89dc0a1b11e3da023a5776d75334",9.317957166392093],[12899,"c4c0b10e40a063dd92094567cfb46cdd479704f2069e00485392f0dee2f14eab",9.917710196779964],[16726,"3a4663228cb5ca59534569af3fa4a841b6655247a48d6a7b76cc557b1969ed57",9.317957166392093],[8513,"863238586b86b4451c5bae271d5ba96d455d2a6851fcf7a8c0935f75a7a6f8c7",9.917710196779964],[12316,"101bb5f78720533cdc34593e3025a19ec75e5c620c0f5a872a7b5500f4621baf",9.917710196779964],[8950,"f30be850f4f552633c0b92cea0ec7b1e69d6c7ddd23bd3d5e7dac097bee11dc5",9.917710196779964],[8616,"aff0d4f78fba0766a854e59db236185d202d0cd5ee57eba355ae00bfea144ec7",9.317957166392093],[18612,"7d9b0d6b5f7fa2090ee59768d6c517569431328cbd3803b4c1e486b081f3502e",9.647446457990116],[13757,"6071071c5f561acf2d72dbdd67ab74315a903add8911a7bb8d5ae04a2f9b359a",16.014272970561997],[830,"a011a7152a5d5c7de27329b797501583423955fe692db836eeaf508ddd7e58fa",9.917710196779964],[11793,"dea67f26293168b1e8f2f06989213e5f7235caea09d43e6ec9df2e41de51c4b2",9.317957166392093],[6203,"b69889bd99a5cd2ffac9c1821c77f1dd8f7489ecd6a64502fcd9e88e18cfbcd7",9.917710196779964],[12682,"f6bc0d0701c2545567426566af8cc38920aa667d06958b221c67a035f97cb0ac",9.917710196779964],[16231,"f03f443919dc7beb4c36789444d7d45c006cfb13ac4de6cace7d00b9c79b0663",9.317957166392093],[9913,"796eb8bb68806a07c7941a7b53e7164a7b513d6ce2c73461064cc19c1c1ee1be",9.917710196779964],[4568,"11cf928edf167cd05fc97a6acdc092a7b942222403a36a554d04d7131753dee1",9.917710196779964],[13024,"024f72be2c7c3e1fdc8b791178b3910cec77f1c380e532dff9f53159fd606eaa",9.917710196779964],[10426,"c1e91766cbc74cbc32d96f635c49d35cd14d9761d5a0d4d293451ccce155a6bb",9.317957166392093],[19722,"ee25384517851da06b2dc46b080be268a7e815aca14876812c89e2c10e0ce905",9.647446457990116],[7346,"26b1c427046681e196d9f8595d6dec62315cba54024c3c4a5c422ba51fe1b9cf",9.917710196779964],[19326,"aa7724a3dc973635208c2b163573ab3d6dda78dd7ffcc6e5e0ea2efcc4764214",9.317957166392093],[3351,"c3f760e3774bf23b1d5a3507258d4658644dc8b2ce6b9b465cb91fec45a802ea",9.917710196779964],[27,"3a04dbed9df229e2b3b31df963cadf358750e8854ca3ec4ba53e1e644573deff",9.917710196779964],[8382,"7042b1394eddf9ef50c715bd335931c1c5d8161c7cf3acc0718212ccbfc0bec8",9.317957166392093],[1458,"bdac6cb86d9a31389d24f4c6841ec30600b5c90844214cfecb0014c3f56c71f6",9.917710196779964],[4447,"36e977a933b093700ee3b8f1296ab99116231ed886077d83d414b35429aac3e2",9.917710196779964],[10944,"916030d3a45aae2fd12a56e5a6d475b9a07e6e8e8ae71ef8707913a69ad46ab8",9.917710196779964],[12506,"4c97870efdbda65c26b32570ddb77461f1c0beb5ae60202a765540526256edad",9.317957166392093],[2302,"6524258adfb39aba3882fad09e86f612cfa0bf9fa8c863d1d697c2890a0b02f1",9.317957166392093],[4164,"cf89371d01ed244a59a12f393a0011dc8cb5d7abec1a636bb9062a04b931a7e4",37.936395759717314],[6746,"d50d745f8bb66f5ac4d0623a04fe757654dabe1364fdd17ef821be0e0eef99d3",9.317957166392093],[8765,"4da87fc75dc048170f707da282fa77bf411f4bd3e907faa6dac622a70c0a42c6",9.917710196779964],[10720,"a976aa5dd7b98a034c153eecf9fea55a613b6368d8f18d515b315121c22ee0b9",9.647446457990116],[7590,"b75ca9372f16082803c578283b2d18bee822f8c72aff3311298f0da6e60340ce",9.917710196779964],[16041,"6b6e24b589b3bd6ad15383e7ea6791c4d8a60bbba9e8ba923a6bcdbf87088f67",16.68022181146026],[16613,"1679e360cf62681e5b33ede105fb11f321fb923df0c81945157275f4af4d975a",9.317957166392093],[15515,"1931a0626dd03cfce090e2427eb0bb7ff402a60d8a07e4771797c6039be9c673",9.317957166392093],[19268,"83d172de0470e8c3542e98213e4dd87d88474acbbfb7cb3a643a52a4de010516",9.997888067581837],[8137,"578306a095c62d0aa7d5255ea221acf02db456f4455ccb67a0934ae1047674ca",9.917710196779964],[13456,"78030db2ea1f002e2a7b01d5a39d6615efeabf6a41656719be27ec50df79f0a0",9.317957166392093],[14968,"27035eacf4bbe868e8d92c757fe8bdc3161a9180c587d6cb7f1941d1a8fc357f",26.912246524395645],[1261,"ab6eea739c295da8996a68fd04dc0aa7ecc7e2ad633db81e28800391970e99f7",9.917710196779964],[9851,"ec8cddee161ef3c7581f81c3e28195d129c796ca74da46709a813b751fc94dbf",9.917710196779964],[15486,"6cc7c902e8c1e95e3295cc90b6ddaeb90c0804a5085b5b6535286c2f0e856574",9.647446457990116],[16367,"ae2ecce718d709a8cad1b2aac056b63852f7844425acfe65d3e5746314e1b15f",9.317957166392093],[18821,"ce8b3772d5277acc81e5eceeae69802b0d8dff164705792b56208a61937e0b26",9.317957166392093],[18430,"7f252c7b2b948f9c9d14252bf807be0c7d9feb5213a081339bb1c13936760633",9.317957166392093],[16705,"af5dc79e42652d3d4d7aeab471e6c2841cdccabfd454d3667c3e5d9a878f7258",9.317957166392093],[6176,"fa1984e2bb3801be7ff9792d5d4c9e1ada96f09dbef4a1c2c37ffb7796e5f5d7",9.917710196779964],[17905,"3feddd55706c9499a23664cc5595358186a202acf7de74852b9f8fcc68ac233f",9.647446457990116],[11631,"4faef95364872a2b8047297dd931e02c10fd5119fffb62500d4f2a168a04b6b3",9.917710196779964],[4300,"fb6160b078e3d5b78eb56f6cd45799250b3737cf6d7032335c38f6b753dcc0e3",9.917710196779964],[12830,"1eb0f473a7ae3c7b15939c2eba854f7cb2be0f85561b10e3c8ed7195ff3cc0ab",9.917710196779964],[8718,"482ca038dfa43d62402ab26d3bd7cdd290b415ec679e8300415f4f95da8f91c6",9.917710196779964],[16070,"0d4e0da2994582fc0cf06a7394b5fd17c33e6a9e970bc91c8dfc0808b61eda66",9.89399293286219],[19702,"6a431ff4a5a543e54d9613dc2205eac527251067ded44c560779a541234cc406",9.317957166392093],[3442,"9a29de13084b6db3444c4ca47740e9a1ec674f08a99bc0b12fb66b1f445c6be9",9.917710196779964],[7084,"1fd73aea18abfaddf57b9ecb13ecacc343feeabb76d6b9a33f9b19ff102f71d1",9.317957166392093],[15916,"5cbe2436ad262957eb1477907e3e457f13eda73f24a8cab81422157c8f03be6a",9.317957166392093],[3089,"4bbdad5d160526170f40facb145503ff0ac7995c482f6ef329fd7e3d9420b8eb",9.917710196779964],[11226,"b3ed5ab9e7b9b16814be4226a86fcbf656f668dcf6d92f1ee67d7ff5937a88b6",9.647446457990116],[19772,"e0cef311838da0629915a38530eb04c55695d0c054531cf5e3120bba3234a203",14.049469964664311],[12182,"4ac36d58f6c72f31771e9fb2bcb82893b8db929f4986e9529cd4fa1aa8ee31b0",9.317957166392093],[6644,"948c0a869f9d448e77a68c899c728adf1c344439778e7fbfd8690d2196d65dd4",9.317957166392093],[14391,"31258e59f2f1a4176c3cbdb64e1f11d548e2d5c5cfc6108099d36437b77a5f8b",9.647446457990116],[18224,"90f371176f66642973d23e1bdd75cf6b7843d56ba4d38910cee150a8d7988037",9.647446457990116],[16311,"324ed66015362c012318939043c5678aabf38e9dd6e78c7c0522a356fb41cb60",9.317957166392093],[13639,"9a51fb28a3d6b1bb7f845cf047f5cd626bed1f8f913d75f3c7d04df8ee378a9c",9.317957166392093],[18975,"09c1c082ea3af2c2cec7fb1df4d51d38afac318b29c50b44c4afd997c0285e21",9.317957166392093],[9195,"27e96a1e8c0f08498ba57e9442765a7c09b755eb178f854c0229d2a5af4e7ac3",9.317957166392093],[2383,"a00be4506a8bd486e1faca789d47f40a1ea035a7a2ddc7ca57aacee7307d8df0",9.917710196779964],[5315,"681468a9e976ac02e497c9ad727664155977491284e0112afc0aa7cf5e774edd",9.317957166392093],[2563,"422d4c5856420f94783b558faf93e4da07d746974c2fe2ca38b41b091f0b7eef",9.917710196779964],[4782,"3134c3dc46bb69e7f5185130770104f0ba19884d25b8afeb3239effdd79082e0",9.917710196779964],[971,"b0983fabade7ba1bac33e2b981a78ccdcdd195e3486dc90b15e3a93c50e65ef9",9.917710196779964],[16754,"cef862cffbb9f1e764bee6eca0547063b9b26f0e0f18807dd697712604db5f57",9.381044487427467],[5257,"1194e43592da5ea34d959ad0ad0457e387489d9588fdd5ac16bba4509ceea3dd",9.917710196779964],[7802,"1ef9caa7f13653941181dbac7f42cb81090b5cd745314d911de93fbc44eac7cc",9.917710196779964],[16797,"9cac6599ccb50e2c3f045a92607c027e967e218e6cd1431921b680252d7c5b56",9.317957166392093],[14050,"50f08765a58d07e43c14f506e5ba3d8338b790c40767794c56a0639b8d04b493",21.32795156407669],[13089,"31c5f8314b5e31791ea89bccb271fdd970cf9d8ea7cfac1410b3feb394a1bfa9",9.317957166392093],[12030,"de8ae53f3cc5b2f2a9e361383385227ee699e659a1b9f2db182ef0d03ed517b1",9.317957166392093],[13366,"249db9e7de68c376b79d2d28fe5a579997fc62a4a9fb0c6198f8856a620c29a3",9.317957166392093],[7140,"0a0fa39847c362535fa05db2eb97990a39c1a39ccc6e650ac173a64eb7e215d1",9.917710196779964],[11703,"794cad562e2750e3812d35eeadef02302265128d0a6b3d33b9e1049e1d2f47b3",9.917710196779964],[9719,"1d794584e842b422d65e08f2d4a5f8ed6029d140e663b9c3144e0b606b313ac0",9.917710196779964],[19841,"ae4bb428e7f268cb4876b1429cea26ac654af5478cbce501bb6f6a750d0e1301",16.2152466367713],[1648,"79ffcc29a9cc482f3b443ee95b15eb2022b0737e8c48984e80e577c2d0a947f5",9.917710196779964],[1686,"e853885c9b0085792779ff57b8c56994cc306e839c61793ded27b7e1cc2503f5",9.917710196779964],[5792,"ba280e203f35b0ddd3802d4a4c83faff9ec91a770a5503180b616e6bc9bb79da",9.917710196779964],[18102,"962d5f96eb88ad67c769c87734d458da989af23fea5a5a03829e4a076cf4e43a",9.317957166392093],[4889,"2333fe3fc441499f485d360570066e01f5c566cbdf9efbf1a079718e4d45e6df",9.917710196779964],[12865,"e11fac2b04e0617a9ae25d39ded7dde5af76f4c264e6f2140e01dd7d6d8679ab",19],[8361,"813bb0185140de274a0780b7e5bb885d616eb8bec8e20853081ce0066cd6e3c8",9.917710196779964],[11538,"f9992458f58620ea09a723f406e92e2ab08b683a5625c81e718f6a3b43434cb4",9.917710196779964],[11628,"8d5931a9a2232d62812ff0121c0ac8b061569941cc6e0e00da2e3468f8fdb9b3",9.917710196779964],[10771,"dc5d7749e93ca3f62616f454ac7fd6b74321dcf4443a4a21a64d0adf54ce7bb9",9.917710196779964],[8793,"48c5702a2d86da9a450f8ae3c3cf87c21e3229feef793a8cf555caca47f918c6",9.917710196779964],[5366,"a948ab19ab3d6f37758d5cc9a054205a93308f5f876341d4ef521b4501c40cdd",9.917710196779964],[8198,"6280deebded452beb9fcf8b54d5c7e1dcdfa623c65450a16815ebc4ea55efbc9",9.317957166392093],[17049,"087a5cbbd560c347b396f9ceb9dde18816bc51a54224f88efe50c3a774911e51",9.317957166392093],[513,"4c6841060ed2a62eea2b0cbb436c7f57fdb538d732ddbb855d257769133b99fc",9.917710196779964],[4840,"102e7c4d15561599567b0f9379a7c1dd951504e36329b1647c9eb48c7fa131e0",9.917710196779964],[9267,"0d43fa5c2e21d08a93601809d27ba4378a81c5968cd74d009e19eaea694c0cc3",9.917710196779964],[12534,"709ee07ee59a1b67d9ff220be82df075d8148af0e3e5690b38f43181529db3ad",9.917710196779964],[6445,"10f77470ed0cc7c5871c68a3048ecfd8b5ebb310ec6af2f7f3795f383f08edd5",9.917710196779964],[2567,"dcd781526047f09c38b6a5de307950d23998ccd826a51d442ae96f96204f73ef",9.647446457990116],[10996,"b7cb5441395770b40fee7ceefc05f0349c9dc31022124ded07884222b4f804b8",9.917710196779964],[8573,"d0225329cb0a70df397dda0a416a7cb93966b8008a8b7db9c729bd17bf9698c7",9.917710196779964],[14075,"cf8080bd90390e7c3b48de72619595782a93a0250247e27727244d2b146e1f93",9.317957166392093],[9973,"3d496e3ad599fcfc539198116e9425a0914de198a349bbd097d08f48e25f7bbe",9.317957166392093],[7930,"f20148fac0fa0755ba849c12001a4a7abf4ec8bbdf28cc5ff1180a99c5e707cc",9.317957166392093],[5599,"c627b6d5ffcf9eda6d0693369a9aa314369e9677a314de5bc5bf07fd5e8ba3db",20.67023172905526],[15066,"19959e57218c00e16898fc50b63bc1b97a249dbe550d62a8cb99f21eed71467d",9.317957166392093],[17885,"b1d2d32c5d5426b6f18d750419805f44492c6d88f0a2a9e20e1a8624123b893f",9.317957166392093],[8287,"32dfdd4a74ded21ade8cadb8e9bdeafea995f34d1c158ca0fb35771a7faa66c9",9.917710196779964],[14908,"71541899c8923dceee79fc43e9af4fc55d2cf72f4aa82697e56b293e1838ca80",9.317957166392093],[16757,"025265b76ffb3b2ef792fec31b5b9abaf54e74cd27e9be1e51f345edc5c44957",30.265486725663717],[7817,"cfa2154cfabaf4319067915b06d59dc69fdd062c04b190ac05e23c16af45a6cc",9.917710196779964],[6348,"f4aba4e8dffdff5cad7aeab2c4d9f400a0efc8d9978320c119baf28cb122add6",9.917710196779964],[8474,"69391531cd22c9eb190b70a435fdeb00524f5a47f613aba1a7fc0ece4c3b2dc8",9.917710196779964],[123,"f18c29391b50b03bd5c060fdc29863c113dcc11f96440eb1ea381df3a95d3dff",9.917710196779964],[6360,"353c14f0151c448647c47188fc3bd5a0b84f3fe73278d4b2f18846767e89a1d6",9.317957166392093],[8924,"55c69687389a5bb143da3c58235c37405993b38b649b720886d8cc35e84a56c5",9.917710196779964],[9633,"1f8a1f1a2b24ab139bd21d31b65b2264058227682e070050153ccc64a47ed7c0",9.917710196779964],[16106,"6e1ab4032e926aa0f0f09e7f142fe27f1d26ede2a3a8ebe344279991ffd9fc65",9.317957166392093],[1962,"78f1dd293bbc416126a3dd035ae61cea65ee43545e4923ded7cdbdf326d646f3",9.917710196779964],[11060,"fff42c6224e710223ee64eda56e5689a3f0d2cbaca6deee7f1d723ec714a9ab7",9.917710196779964],[19009,"9785e0bc69d511582a8638638e18d23d0e0efb2b64ee94bbf07faa0076bf4020",9.647446457990116],[937,"c5d755f25b61e1d40b56535301282bd9fbfea53c58e24146d5d54588e19e95f9",9.917710196779964],[3328,"8082b60156995b1b744b07b02294bee2af7a8e1e965ceb10c7616910ae5032ea",9.317957166392093],[6494,"65a9d6a0176eb5f8a511b97b08bf828e081398279079303cbcc09e7be5bd88d5",9.317957166392093],[10246,"695f276e7ace2b78784eb96f60e8cd9b9626e12b9e2f058c7b99818a294fb8bc",9.917710196779964],[12949,"9c4b06735aebf5e3ebaa116fb2be3b0589048a621d7e8dec47843504b569ebaa",9.917710196779964],[13109,"15bdf0abe532b11792a928ad254d53462d19e423f9a34b7895246735b5acd3a8",9.317957166392093],[4304,"4b23ea6b15d03fbc326727065c74bab8794bd824a98da192a3f713884918b7e3",26.091872791519435],[10088,"2d81ff6ef1519a06e5ec9afd245dc4a98a86d2a458e0357e8f7faac9aa9ccbbd",9.917710196779964],[10208,"e98dcdaada4b8533f6290a07845036cf7bc738a1ae90d90fbbfbd43ee548edbc",9.317957166392093],[2759,"260c12419a9afd2e11da7b7f3d8c8a41962b78b9a88cdaef2098b53ae0930cee",9.917710196779964],[8836,"96b3b7e85c0f469471b43ec506b8310515eee49d2641d38d53b0a7bd5261ddc5",9.317957166392093],[6560,"eaba6f9b067d4ca43a87b05e71097d5c3d6a1fcc2245d5e9bad32130af03f7d4",9.917710196779964],[1414,"a8346d8d72d9e1afae6050497235df1825e7fbee241ac43b182860330ea2bcf6",9.917710196779964],[18199,"e9def09b47424cf3393b1d393d0b763cd3880589b4aea5da3aa96a6f12e22338",9.647446457990116],[17483,"311ab401d085d6f047ae10c59fd27e7bb53ad6ac6fed9c3f98fbdc267d7f0a48",9.317957166392093],[15878,"37fd3408532a32d161edf9ff6d9fa989c369546049510e0e32b39d093630726b",102.6938775510204],[7755,"bb8f8db7d9c7217e66e43e3bff794993289dec697672e076567811a9c2701bcd",9.917710196779964],[19699,"d07b14a9216df22bf416c63b12901c8f3941c33dfd056d882c39e82be40bcf06",9.647446457990116],[17078,"109b10435b22cc50a56f2b5daee6a1261d76b09d087cc08fb78fc74835545d50",9.647446457990116],[8772,"6d82efecf1763c0bd397d52d609a4a37038ed074be0ad0d9c762d08d06173bc6",9.917710196779964],[3649,"1fd5e8e0718a84ba7c6900a0f35615ea20c093002187b6da739834b90adef6e7",9.917710196779964],[19576,"afd38e7916466839a1098d1ed0a6649d5bd29c197e86b1fba4da7faf59a34b0b",9.317957166392093],[5936,"e96d5cd286ef903a57519082a972a2d3712703808c5010a8c8f324a8a53e76d9",9.917710196779964],[17113,"94cd6a46bb9bda8722c3bd7b3e12824f2a5f03455f21111bfb2c0458b579b54f",9.317957166392093],[4909,"ae4b73b8774bfcccd7f1f302d0fb627cf9f1cbe5909ab6403f003dfba868ccdf",9.917710196779964],[14954,"3afc0b4322f8a2b943582700a72e65c36818046541b82dd11234cb5c0ce49f7f",9.317957166392093],[4971,"266c14703642843781a7022a61688106ce6189f5e2b5f2f7d2bd7192f5755edf",9.917710196779964],[15493,"2ae3a346c2868c27dc8ae7b503c59d46f0b4c263a434a0fcd7dbc4a5296c3874",9.317957166392093],[4170,"f3792a23df1f34abd08c2733b04c156f6ccf607ef17808f25660dd5f330ca2e4",9.917710196779964],[9856,"a2d8dbc0a4715c33372667b95cceb137f78b2efbef4f3d24af31db446f023ebf",9.317957166392093],[6346,"f05a61e31afffc2af79795ca83f6f964b7603b679fab52becfc11657c49bafd6",9.917710196779964],[3057,"7b1443d49888a0efd14aaf403ca0a3a9b1735eebdac33eac3d5f74e6b789f0eb",9.917710196779964],[19723,"489177b522fd50b4d2d3bb4a5bce2a03c556e7b11c768ea14941977c8bcce505",9.611594202898551],[803,"05cca215b252c6abc93171461f9e4b811d0ae2729ef8ff1d156b471f07e786fa",9.917710196779964],[5199,"c69806c284d0dd4d090b47961987c2d1d91434925af7e817389b45f6e301fedd",9.917710196779964],[3302,"5aebfaad1e28e174ad6b13484da32f4ca5afc23ee956e2803e1bf244781965ea",9.917710196779964],[7022,"52003e1826d999179ca7485a28afe6aa4a71e8425fb9f192bf2f02aab1f8dcd1",9.917710196779964],[17264,"018c23c0f1cbb720a061f84fb7d3dd98b6311559366f168c22d3472811f1dc4c",9.317957166392093],[19753,"67ee24a1c4f1a01a53d4df679af5c16cad75e34480fcca538a3198601a6a9304",9.317957166392093],[17075,"16827e1bff2a7d599982a9104630161809c84270c5cddce700cabe2ccf286950",9.317957166392093],[15690,"f696b1d2cd60d7e57dddd3ccd1367beedff7463e94adf9c08570a6204ca7a86f",9.317957166392093],[4075,"8a83f2f79785b35860ee523cc81427515f5518f3cc076828fafbb1653df83fe5",9.317957166392093],[18354,"557fa1d99e4a20ac300e81583abfcb7e35bf57fe08a9166802237925b248ab34",9.317957166392093],[4133,"e714eef38c0227ef215489f248588adc1390de90a3385f973934b10a3e8ed9e4",9.917710196779964],[3866,"48a4437101abeb94711fdd82ba22144f1727e0ca991d0b7adace62fa589d93e6",9.917710196779964],[5815,"1f6a1df80421a36982e577da269331644eb2e2e3c2a596ff5c24ca808f6a4eda",9.317957166392093],[1529,"a2a967744909b9a5afa9b20eba90e9739d4b92e2a8e615d1118de1967a55f1f5",9.917710196779964],[16830,"8aa49f1cce31d55b6fbb7cd573d592ae2d1feb1720bcbc34a864a68690f1ae55",9.317957166392093],[474,"f68cf8da6bf23ece6428df18ed74cfbc464b3b9089688b5df7042141c314d4fc",9.917710196779964],[379,"8eb8d498a79259b49c63fe7337ae7d4927f03738c6891bf136c766ac70b47dfd",9.917710196779964],[7547,"91b7b682cab7d6c6a8ab5199b3c9b3a8a79818a36a3052f3a694f1b647988bce",9.917710196779964],[4625,"01d63fd4d3fb2e780caa064cbb49772d66b82fe079cdbd44c2af223b2b9675e1",9.917710196779964],[9835,"a6dca323519876c6b9b22ca0146f1da2cdb093c468d814d42ccfb992900864bf",9.917710196779964],[12812,"3d9fd6429753f6df5e86d73c1c1774ff7b238f726c7ff58a3d3affcf4c14deab",9.917710196779964],[4187,"ebb80260e03c812cb35b869a04821602ce0df6543f025de0b6727b26ec3b7fe4",9.917710196779964],[9846,"f1427328dbf4cc20b39607f95dc7c9674d00b27d8d6043a06c695dabc9b14ebf",9.917710196779964],[15825,"29ede369aec5bb4f9a76eeeb0e208b9a26ecdfe483d0e68851880b183de4e46c",9.317957166392093],[8692,"0569286c9b17758b4ca2e52cb7ea4a4a40ccb4ade4b812e5d156b4720303bcc6",9.917710196779964],[1419,"7f6baab92a18b45cbc6904b5c5284e91b38b2f3440fbd829734a11894f76b6f6",9.917710196779964],[12189,"6f9272dad05c8f6cc9e14af6c411e372006d0dc9893ea6e8c69d7b2660c822b0",9.317957166392093],[15472,"b0940a7ebb2b253a5d7e64733b31f1a249587d6c3a7f07d31a99faba10d8a574",26.091872791519435],[6158,"cbebcd29bc961b189daeb2cf89db657fa69f53ccad476e5c2c5ac1fa3e6419d8",9.917710196779964],[9058,"6e8c9abf39a42b84ab589ddabbf9ed9e48675a96ff7ca0010f0810f87e8568c4",9.917710196779964],[8208,"3388f37f0df0106cbb5071bbc7096822fbb73e40d6794602eae50038276decc9",9.917710196779964],[311,"a63060b55e8d6fa69bd39a3ac418a3a4cfa0d2e740f32c261eb1367a4a17ecfd",9.917710196779964],[7792,"433df64ae574191616d1e119ddf2c4dee2ba793e69663c6a6b6f69029ef9dccc",9.917710196779964],[13856,"341d6310e57b92422fda47dc1b066968ceb705cc88cc445f5d0e09161a094998",9.317957166392093],[12648,"ee661c9ba4dd09df8719a5677f6975f1791ead6147c5787cec4513570ce4efac",10.052724077328646],[17494,"5a9274888ac9bc8754a5ef78ebca589e8e1f91fd624ff13a2388c38367b2b447",9.317957166392093],[15123,"9092b3c555ba43665cb3c7858787f2513ec50e26c9a8e087d1b13a0b7bc7327c",9.317957166392093],[7842,"481f3dfbbd7959fae2371ac4d7f31d9ca5c5aa774ba357e0c93f905ba95e8ccc",9.917710196779964],[6162,"a78153fbf6061e53777b73efb9ad5a77ee33df5274147494d1bc4a6eeedd10d8",9.917710196779964],[17901,"fc751747dacb841cb051844fc9e145e9cef1b63c48225dd3989ca26900902b3f",9.647446457990116],[14791,"22ec1281c3aa871b436dc4da6965830b31a73b11f37a3779b0b264c650de1d83",9.317957166392093],[11732,"d84669b11d58482668c1cbb293e7ccb83e38eaa9b008cf0f468b2096db9d17b3",9.917710196779964],[7996,"d438152648912e473c48fcd0bfb8d5f34cb169131aa47e9b1898eb7a6a1189cb",9.917710196779964],[10165,"0fd943fd2a5f32fe3bcfbeeeaad4bd45a202c4d5b25ecb4872f78f4323a24fbd",9.917710196779964],[5502,"fcc17123e0d380d1cf12ff4e78acee3830413048aeae5f0569bde4aca9f537dc",9.917710196779964],[13036,"4db6122b70896caa7bc84face1af93fb442b98f253b5a4c8b8b1f5d1d8155daa",9.917710196779964],[9121,"f227aa488488254d2af9b66dce9f7b286b2b0ab5111840a55c21df5adbd202c4",9.317957166392093],[14806,"cc525a01bc5a8714c495e792410c6e842692a11332ba44bdb38da1edbd3cad82",9.317957166392093],[18000,"a52a52ca9ca69359f56252748a73392b1a647aca4ef996d98040a42a9e66413d",15.961538461538462],[11724,"3b0007dd399435368da30a797dd3978a2d1bff0bac826934c32b7f8431e923b3",9.317957166392093],[3620,"711099778a683f9caa45db8f076751b62993a97db4c6d2b8b99d478369c01ae8",9.917710196779964],[5523,"2d1fbf8fbeba764ec66cb80287236bd050e183db3cc7887e231807bd1e5017dc",9.917710196779964],[5775,"0524dcf70b5fefc9d23e6b163a8a05fa3fdc090425074ad7b33784de2da997da",9.647446457990116],[13901,"220a0768d746532504e552536e5409c42d9978dc66cd45b015ddb02a17e30897",9.317957166392093],[4385,"2d401b9f86fd52e2242335c0c720ed14eb2dbcfd0b8066e8e9e8646ddd972ae3",9.917710196779964],[903,"f5a731cea468c54c6d16de66a7b3f9dccb73eccace1342efb2ab90f0038fd2f9",9.917710196779964],[5349,"f7aa1629494696fdd8b71bd1db764ae4b69a611249b80d006d2aff4e9ba126dd",33],[8609,"046c4c1363b3eb29b9ede0f553868fb5e49aa979c56cd143539ee63e7eea5fc7",9.917710196779964],[19089,"ff70c2e80d44c8f3bc6e0c221d8de8b0e59b93b4a6828cc0f7c4d34260280f1d",26.89439374185137],[18977,"2a4d735f7318debb2d60fc022a491b9037fae9727ccc24516dd0d9082ff14e21",9.647446457990116],[17460,"8b6c31d154548591cbd49fb0d34ace34773255c4277451c67462bdfd4aa69948",9.317957166392093],[13414,"7a69d0b9869fefb5c70e92f81052ce5323b70ed683cec9aacbc7617f26cb0da2",9.317957166392093],[14168,"e77d35984f7791f26fce929f9a9e8f71b859ed3b4f7bb7a3174a45ac63311a91",9.317957166392093],[4319,"5915041212004da2f59b1cc669ccaddc658a64178b709f947f9f5f709ba1a0e3",9.917710196779964],[17957,"efc19d9b1ec033e32d2360468120a1bca47ab0fade024009f7cfe533682d013e",9.317957166392093],[933,"63bef487c1cef428babe49257582f3f34398fd83af942ade88bc14825c579df9",9.917710196779964],[3354,"2368192479f0aa6aa38fb3a4ee7e085cfb824d0ca5a00dac48499a299e8800ea",9.917710196779964],[14722,"2717d2426e551aabd142b0282b3c1dc045c5986bace2cb73605b01a1c8e97f84",9.317957166392093],[174,"2d1f394ae3ae18fdb4bad2025bd6c6c2de94aa841ce1504b1fd93ba7cc02d6fe",9.917710196779964],[19116,"b717d5b884ebb538b86c6370336cf73aba274b0a53ecca89eb393c86d860ca1b",9.317957166392093],[3806,"97952744f42d3605246f67a5cdb684d8bb51f99b642eb34385f2a16a614dece6",9.917710196779964],[15164,"bcf79c553ff1770a3c6dd31b3628ca993b028cba5a4e60e7b1acc09c68da347b",17.056105610561055],[5288,"40c504429ee03e8bef20d44a6f2dc7bc8db793cdee66fa4c1993ca576ff079dd",9.917710196779964],[12820,"35551f64ae6f8c46775d06c1766cb7d9b6ecad84cceeff58e98575696cedd4ab",9.917710196779964],[3466,"f7faee51e0d2ddeb732c1c5b04ccfb832dce395e4d400c7f5fcc2ba2531944e9",9.917710196779964],[2997,"50e3e763f03d55f66c960704ddd0012b8ffd1956fc5730b1ef385f66fc1849ec",9.917710196779964],[4582,"9608bbdb2fa946c33dea203beb7de29c457bcf249805fca3f8298f98df18b8e1",9.917710196779964],[17759,"c740d7643692d12d7c512876710354667b2406e1158635ecc8bf85ea10890342",9.647446457990116],[17541,"7c70a506e0fdb19b9eedf0abaad698eca6bfc0d76bc961af2e5c832142afb546",9.317957166392093],[4017,"d1eb262fbcdd3135c459090e02daf4efa7fabd18499a9b4b1eb6c65e7b5aa4e5",9.917710196779964],[11639,"ee846fdcfa401c61d54b1404a2c18169e219c08bb1a96168d279dd39a0a8aab3",9.317957166392093],[1040,"777cda087f6dc893a47e7a754567a57f2b441b28ff1995daefaa8639436509f9",9.647446457990116],[12252,"9930c577e0a705a51ad708960a584993cf22af67e7e270fa540ec3f7220bafaf",9.917710196779964],[18238,"b77da24af50c9ecfc9b285bde8535cd21355b2a2673397fac7ff96e790ad3f37",9.317957166392093],[8736,"45e3f289c045c3cab8f158cc802a48dc05398bc382e51ff714d1c262a97c7ac6",9.917710196779964],[16691,"c508644c27288bca6a53151a6721e224489ee20bda8c6015ce375d47549db858",9.317957166392093],[14138,"24312878486cf278479355a45ec4a2ba7bdaf7ed47bc9a3b9e880a7a5aecc091",9.317957166392093],[18737,"34ba567721a9c57d5448d1fa38417ffdc5ead4a83a24b3fe47b95e11c91c2a29",10.052724077328646],[14913,"97b4b2e72154d551a9964b3d2baf23766acf5144c3710111e5914b3147a2bd80",9.317957166392093],[6693,"10e4fe6825bef91ed753ffcd1db19168b446fb2af2ac875968d0dc052cb401d4",9.917710196779964],[11167,"81dddf6656e1b5ffc2df6b4fbbeef816b7ea632d4de3f8223a756eecd938e4b6",9.917710196779964],[13551,"18c9393153665ad1e673ad16fd5aa46c766ebca77076ec43d791ec6650fbb89e",9.317957166392093],[19227,"e8406e952f25dda6a934f155b3a5ec96e17e61d20955a17b9e4577ec2049bd17",15.080213903743315],[7052,"f6cb43fc2905d7e4a58332679442ce32d5478a5f23e3261a7f6381d68878a7d1",9.917710196779964],[19580,"468bf14a4d0c598f20dfb36ce6734eb662267fa2d8846c3ebd38f48db5e7100b",9.317957166392093],[10371,"6a21942dc8b6e15c888361ba88caab11931a1a6158d63054c66777080c32f3bb",9.917710196779964],[13815,"7b5138d43a27fc24a7cc342a2d0c1b8e5b5eb8edbdf568454c899fb183bc2599",9.317957166392093],[4072,"aa0091ddbd910b9c04b76599522e213f1d9ee81dd27f2e4db9086e82e3c843e5",9.647446457990116],[8795,"32b624032bae1e33c8db7e5a9912348e3ea76c4bbc4e16c49688e4ad437b18c6",9.917710196779964],[15154,"34960c1c9acd454edb5f2c01094b33442b65430214eaf9bba11e7b53df81687b",9.317957166392093],[11886,"47705f5be590f9fb25f29643c15a489e30d6799a1c70aa9dc01e14c23f561ab2",9.317957166392093],[7036,"f01220915f8d4b64b05656b634bb40534a6c7f9393c168e7566420fcb844c4d1",9.317957166392093],[5889,"6234aa8c187cf314194bf59d5eaf732241b9fd0d996701985b7217f1089ec0d9",9.917710196779964],[16494,"206bb2ec402a37a000c98f774c4234bd7ff2a72a1d4f20bdb401c8fd6e2c5e5d",9.317957166392093],[6848,"48781b9f16f7ef5b5d2b988ecca297dacaef38aecfa2fd307fbb6ebeb2e6fcd2",26.115555555555556],[9653,"5395cca5754b33424c1b839646542e04d57ed1d5084a9ee39956a2930544b0c0",9.917710196779964],[7267,"a08bafa30e1b8e5d29e7c6299e16b75ec5b6dc513cc3511bcf139511139a39d0",9.917710196779964],[16293,"cdafb3c8ee4a8be53e583ea5636e1c34dbfeb0a946719954b163925d79285161",10.052724077328646],[7579,"2fc1fb18c10289af218d7ef3ef712f8a97c84adc24b29dd15c7e068a86d44ece",9.917710196779964],[19572,"84a6d1158f0a8c14e5dd54d5cb0a3784e18090ee91a394bba4e4fd61d0efa10b",21.094170403587444],[9654,"a7833f985c555fb8a5bae036d311a591997a6246721c78d4354d73e1d4a0aec0",9.917710196779964],[15229,"4b6acf7ceba85b904c5ab64572d6f2b62dff6f19a1f9d9f416c84abbb740e979",9.317957166392093],[4345,"732911a8d24d4a366bc0f2ede72b670f4844b8c50d4e7b06aed8df7f35de6fe3",9.917710196779964],[9592,"c5bec0e2c3a6065c1de99c63e2a2b7201ae4b84276f39d1c9c2e0c6106a50bc1",9.917710196779964],[5774,"6ab5f212b3c67d4ae2a8cb7bc90156149eface808069f47f6389278a4cf298da",9.917710196779964],[15367,"b80b6aeb609f732236e8043daf6aafa3cbb94eaab8baf1f3f16c829f14c90377",9.317957166392093],[7595,"294f7e9627784901e1586feb6ed6d42b658b67091237539c56626ac65e7f36ce",9.917710196779964],[9308,"71d6b61508d75c7616f66a11b0822d92651efc02d4ab5079be0386fffd32cdc2",9.917710196779964],[6768,"1d53b732631a51d9af6f527ab1678a7fa27df3787825a8718258ec1626df7dd3",9.917710196779964],[13115,"88b480279c5a14ee525835c2e087f81ce1ac9c8fd67ad57de2c198436856c2a8",9.354294827979038],[14057,"cb479aaa15689c3f8e5b2d222ba09c9cdc18f419ed40067ccc1253e0a7c58993",9.317957166392093],[299,"03a27deed734eb526577285c8e592a60284aa61ec427a11844eaa1f5fb91f9fd",9.917710196779964],[18660,"e3ef2b68f66fa8d34a551996b3e3eca97dbf7dc02cd930abe0b8674d72b6462c",9.65748031496063],[3348,"3219866b941d007df1de3d415a99cd58d67606ee62fd54320993e71ba0f904ea",9.917710196779964],[8265,"b505e6b1d9c5894e26544064a81afb8a22bacba5b8c15b5fbb39be410af889c9",9.917710196779964],[15301,"39767478259033cf7ca4c1225b654be611dfe7b4a59497527efc3694d7ad6478",25],[18913,"56010d2a91456bc6aa6ec35a274bd6bc884e6f8e091d6a2d269fc99c9056fc22",9.317957166392093],[9206,"148682013464829bf711725b799d299c134b9693932ca75b5ca16764b7b465c3",9.917710196779964],[7994,"9f71fc701ed7a9962d0d8dea2b9435816ccf0ec609e3ab583cbdc580f7af91cb",9.917710196779964],[3837,"8757ac637de3279f3def17567d5e672fd269f0b41a397f14867a23dbff42cde6",9.317957166392093],[2654,"6c55cd16b1cbf664422d81ec6d98547d19b52052e6f8d8b13fddab01e6acd4ee",9.917710196779964],[770,"5b27c904458bc466148de464d43572f949219e9a4d8f6c2214a554f5c114befa",9.917710196779964],[5262,"f429a0d9bd69cc2ed28e3abc55bc6608db1ed9d76dd3188e2a91ac05eba699dd",9.917710196779964],[15264,"24aef0c9445ecceccef08800ea88f338bbf707bc332050903b58730ad4a83479",9.317957166392093],[9376,"ef2dc0c0ea2462752939ac2197c8f7c112ccf96484eecbe1596ea9c3c16c64c2",9.317957166392093],[19437,"4fd1f46e8d7358e435f7b284014ec19ae1ef943165ea8b66895c608d31fc3a10",34.77580071174377],[9043,"e38eeccee930a2d71eb7e608c07d71400c9f0d50c375939a94313f8c476081c4",9.317957166392093],[19594,"c1e6137f2ed05c492fb0b2b82db74479b9e908ab4cc76a5e6ee9fa3297d75f0a",40.712041884816756],[9090,"23d2bcd6268f5396dae5de97384ddeae7cf2fe77ab62cfd0daaa73160ccf38c4",9.317957166392093],[4332,"95fc20882ff7c47c5b59a046157bc9f3e96e819187e0641580cfc621cb678de3",9.917710196779964],[16107,"6298a02971fa09b60c0577643348eed07cb093a5dd89faf56b0db3752b74d665",9.317957166392093],[18278,"8ab1227dee18c2d538ea024bd32b6d4e2fa9ae729194cf8640df6eb8597f4b36",25.33567662565905],[18008,"82da9c94638211f3e799fe7ed1ced9f5f779c606c34a4700089e7235a70c0b3d",9.317957166392093],[4323,"c0d09560ddaff19368fa7154c673eacccd4fbc54f217ad10c76f179de8609de3",9.917710196779964],[1102,"c5d59cc04d2077cefa4491fa568455b208aca98d28aa318092cf8b18fb6a91f8",9.917710196779964],[6960,"cae17d6b1ce0b90be455a87180412f57be49c12bad5a757873f10773533835d2",9.917710196779964],[12401,"a1c872c9f86b33c31536d55051fd7bfa809695cfef52e7bb896c916182ac98ae",9.917710196779964],[15059,"8ee5b9f0b3f14af78b0c81abea5aa875c741ca1faed262012cfa88410749607d",9.317957166392093],[16338,"19a8d144a2f24a6d80154453195e12c52456ee51c8b7c96c2b6cd8e05bf93e60",9.317957166392093],[16046,"28d909cb780303cc85b26671e418a8c504ac060bb08334b447efc026330e8167",9.317957166392093],[19543,"d57423f4a683ed36cd09ab7be553941c9e9f9eeff33598f73c195aa49cbcfa0c",9.317957166392093],[6908,"34f76e52c8810e7c6c2c4c5b894744bae875b95e8ff8b00b57a1556a1ce48cd2",9.917710196779964],[11841,"c66533f01f48b8526866a4008f90f603873aa796914e99ddc8cf21a93d7c76b2",9.917710196779964],[10259,"7389f7915b852809cca213a8b99747edd65c04e101ac56413bb786c76633a5bc",9.917710196779964],[15212,"d0d135fab27f3104c62412c1eeb5055271f5a1f56539fd5e2cb30ceb9a823f7a",10.052724077328646],[12020,"d54ef609bf2558bc8152c8591cc391825ec0686cdabc9e7c30e5c1d9167b37b1",27.786008230452676],[8531,"aaac2af913e786aed3ad1c44ac47c83a0167f4cd3169b0d13dc917f75681d2c7",9.917710196779964],[12549,"7ab9c1e7c8952a3a3290a604cbf264b1001d231d630ca4c1e222c3f09138a3ad",9.917710196779964],[988,"a6591af7f67f9633833aacb6c48bd4267a0f4b0caea8b93509d7f05309ca47f9",9.317957166392093],[4504,"4dc4e389bf91cf85eefdd74519876a69af076dce01dd7631e1edc8d39c2a57e2",9.317957166392093],[5919,"e6a6db6e82d2d851e3fb8c2c64d001729573c66a67de108527d5936f7b5595d9",9.917710196779964],[7211,"bd266dae54792d868e7cd6a406e3fd0086d0098c79f7a48ad735ade7b16ba1d0",9.917710196779964],[2384,"4b31e978ae8d9e0a56efd4beb493eb3515f1ea5b824937c3a2ca3b0d22728df0",9.344947735191637],[1002,"26d8ab2c6ff2a4f2d722d07ff3111d7a1da3c0a78a085772df4b212773c537f9",9.917710196779964],[9648,"a027e9cec0dc51bfdc2182d389e9ece08ac7442c00be6829fc0162e2411ebac0",9.917710196779964],[1225,"04e0b0a6f16643a58b60e930ecc74f0006136b08198b90198db55711dea0daf7",9.917710196779964],[1523,"508827019c07a6b6da102b83955603d78976bad3d7b28a98801373c2cfbdf7f5",9.917710196779964],[10982,"76b6be4ce31606a23b37d0f6dc7d79f4040ef020ae76837f8719b6a9850826b8",9.917710196779964],[10211,"497510cc9169ef31335f1eb37e6896ef0ef13fd67a02cb5e93cd6e293dc3e6bc",9.317957166392093],[17760,"fa0a78ef69cf7e7817d00c948f22f73db6bf6aec0b8f28674e82d49260b8ff41",27.121052631578948],[19636,"3e7ec56816169f0b20767c2c67bac94872f908f3c212b40fe014600575c55008",35.80309101316543],[13275,"0b8c555f3a943511f1d5789294b69b5970473403cedbdb69232b043de28124a5",9.317957166392093],[17925,"2989564e5d388c04ca4de77b35422a53f254165067e6daba47215a76685abf3e",9.317957166392093],[2112,"7408e66c457aaaa34615721f8f562233123f4657efc0df9fe8032319533525f2",9.917710196779964],[2268,"7248e09794edd8ca9d49243fe236ee94301e6db8a9718cee8c05bcbf5e8b27f1",9.917710196779964],[13156,"435fcdb194f2b966b1c22eadca2a699875c28b659ffd8a7ad93a91d536c8daa7",9.317957166392093],[19162,"a4c2b9b20a1f9ed803c8d21a17f042428dc32d8f31fd953c7f051661d51a091a",9.647446457990116],[16799,"a1015eae074504271bcfc10aab7f46d89d47b8e59a56eba061d5eb8525a04856",9.317957166392093],[3164,"7e6d75940ebf2ef637cd9f1ba4cccd4603c26946cf9cfb69514a7889e8d749eb",9.917710196779964],[8729,"83e5a2e42efdd91ca04297299d90d19dafaa016478fa59190565d094c6c885c6",9.317957166392093],[11570,"1d7a1c6028297d31d1e06630faf9d452e67d41ea83ba6f2b5e614217fe5e20b4",18.209302325581394],[4445,"eafc913fcdebc8092e1394be1ba47ad1ba29ebadc9139ae8367a0d7ff8e6c6e2",9.917710196779964],[8848,"5bb1c7713dcd20cc2d2df1465541febc0308b2ac443ec4bda2beff801ee9cec5",9.917710196779964],[14874,"96bfe2b9f4777f958c72641ce2c435359275df50a17b5c5887a5ea6127684e81",9.317957166392093],[18305,"b72b83ee041e28fa6c8f4ae6be9fd7a4e518b7721bb42f37f1480757d039c235",9.317957166392093],[3591,"59e8844f0f72944f2a9144f413da779b7225c154b606be0e5afe5d07334c5de8",9.917710196779964],[4218,"00d4e2317724c71b86663600a52718d8ea8b4fd9ad99373b20162693f21c57e4",9.917710196779964],[1229,"ff772d5a980e57988d51a2201714b8c6d346519348dc399296c4f5c78c84d4f7",9.317957166392093],[2781,"84d722e26da4261a49073e9126b9d895a317f4d61e605470477fe362dcd0e1ed",9.917710196779964],[3868,"38b7f7c7cbf00233e3cc34bc075d67f1f3b7600961a3b5472a548f96251190e6",9.917710196779964],[3265,"6b63c43ec50906aaf36c00e37580b1857a1bf296f5f8c6505d5729af0d3595ea",9.917710196779964],[10548,"6a33779a1e17cadb53deb5655ed97d09a8ad18f671e9ca3a8078dfc805a2eeba",9.317957166392093],[15042,"2e16a2810df3883e652b73502695effec71b01bb14b8e584168ad0224799b27d",9.338112305854242],[12271,"4c6ff42789b9e4998f773ff16b047a95348276119a89745a1ce3e3e517c784af",9.647446457990116],[15905,"85ac057cd85c8ea898124c1ee48b917311b8823cd3c9bc0868ed99853091f26a",9.317957166392093],[10955,"09f4a6e9d0c188e86cc943f7986ef2fab289595fdff714003466ed5fa6ec4eb8",9.317957166392093],[4930,"fbd9d540b5c00544025ed81ceb87375b27d31b14d20eb8f366eada392cdda7df",9.917710196779964],[720,"829b97d2bca367dec8a0027650015478d108970c4e296086c8900366d4f913fb",9.917710196779964],[10950,"24c84cfdd2749f44676614506fcd316dfafe7a8d0050b740eb96017e2f9357b8",9.317957166392093],[11671,"38e6e330ba650923acfaefb0269f305772329afcb3503add3a2357ef8c7b77b3",9.917710196779964],[7406,"0bb55a6c47de7804cc9ebaebace1a4bdd516dbe701cc67e6cede7ca19dbc65cf",9.917710196779964],[7945,"1c60b20a539b1c744334bb187298a19f513cbed1194d353d4c75983a2f50eccb",9.317957166392093],[1143,"d9cd2ba17f38b79e384227f803288ce199bafcc6c74d705b08bba165d15058f8",9.917710196779964],[11799,"c794be0c5490f4502e5ddbfcbe0f747e958799e0937222f63b58924b7c74b6b2",9.317957166392093],[14435,"24d666a1159241449eb532a56ee5dfcb5ac4b5bdeb0ddd38305866ccadbf918a",9.317957166392093],[19468,"b9f55681b437e4329ea9c54d9b38ba70b7122e2178462a43ae36ab02df7c7a0f",46.69135802469136],[18910,"43b119aedafcb5122ae408796035dbf27b6ed70482c26dc0c77a1bb2a41f0c23",9.647446457990116],[12450,"6dc401ae5a38f1d38d90750747043b65b700ae6971a24ecc05851c96178448ae",9.317957166392093],[5873,"512f1b2bfb5999f07eda42700a59b54f14fe4550b8ee36e9c46fc9d3cbbed6d9",9.917710196779964],[13234,"fe92394b3437660e4537dd7650a72c661c78e3e8e3bb20ac872c869c2c9834a6",9.317957166392093],[4685,"a743294ddee858ea46fe7478d75134799486722fb9ceea1b4fd0db347ddd17e1",9.917710196779964],[6976,"02c581af30d4a6e6b362847ac11e5881b787d9958010e1d03a8c9530d91921d2",25],[92,"b9581ee14f5ff576fdcbb65ba1f3162932a210a964d80c331227264a6f456bff",9.917710196779964],[13122,"b891df80e3ab7f807a152c60a36a25c4a8dce978377b38c5726ae89d124187a8",15.191956124314443],[3600,"0ea208eca010ceffbc08606dcd8bec88b700a917fb4b5647bf2dd07adb0936e8",9.917710196779964],[8398,"ab745d5a24cb827d0fe73542853d32617ea77830ff24e2fb8599de2c190f9bc8",9.917710196779964],[16787,"7dd48b3e947a6aa02a56d3bbeac0fdb7531b61415890ca86f452b4a681daa056",10.0355871886121],[11710,"fb0dfb9336d0ebc043c82b72a81928f8b7a9ee6608cc4a74031c6d842f273fb3",10.052724077328646],[8628,"5326a09960ca0dfe5d728190fce24c05a8b9b2100c6dc10730af3008cf3d41c7",9.917710196779964],[14929,"dd2f7cb5f6bb9a3f28a6aafb2b011a44c68c6ba0e776864d6924594b78165380",9.317957166392093],[2212,"2e57c2ce23050e2453d372668203c5e1bc0566cb2f3113f4171a6dd740b371f1",9.917710196779964],[1459,"6707c69dd12194bbb49606773459bcff783b0e685c8c4bb51f513fe9f22d71f6",9.917710196779964],[11626,"770bd607f2644c495a2ae3940b6f89387e8ff5ef47bb47587055f7e12dc9bbb3",9.917710196779964],[8796,"f02d4fd5931e626f7d6052a422c95510adbc3f62bf58e732fd9a9bc8b98c16c6",9.917710196779964],[19299,"73b3f4e201905aae1be0dea851dc118fac737092a460f1523a0c53c4bef2f514",9.317957166392093],[17110,"f342d88ba1fce84594821b3c8358bc2266b18df0652b3e1a57b82d532eb9c34f",30.585365853658537],[12859,"be071381ec6ccaede984d85906c1d67764855d91045b369dfb72f6f0735c84ab",9.917710196779964],[12121,"bb375e56a216af92ee2c83f509629c24acbb0168b21fcc855f099759b60396b0",9.917710196779964],[11952,"8584ec5f6b0a6c585e3d1cd23c4be1a3d2b72b08a7dce01ea8979efdf2d1a3b1",9.917710196779964],[11935,"a427f7d9d267a1e1c0a3891dd0a6c54fc8d7f96d26357c009942e6d7253bc6b1",9.917710196779964],[10538,"fcccdafd5170161538051a4f1a98c141d9880674a85bff06f07a9377d867f6ba",9.917710196779964],[8914,"4862e87b736ed4373f924064926d5c11d8caf22b77fa96c1daf760d55c7a5fc5",9.647446457990116],[5839,"6b7357b8f23e3674f68e873f957f037b947c0d2962892fec21c7dbef238113da",9.917710196779964],[1401,"919608a8422f95a306220bffa3a917827ce53bd61ddddfdb2707dc04890dcef6",9.917710196779964],[8949,"1f69a917aa1d1cffd1bff10ce13666758953e4886fe993df6897edc8201e1ec5",12.034904013961606],[310,"6db15b4e22388c35145aa2f120bed6321d9ec2d53e6441db0450d03e0929ecfd",9.317957166392093],[491,"2bad2e8390897cfcf56083d99e37e24b990e4d7eb16485a97166f0e49d12b8fc",9.917710196779964],[6904,"a7c5e55ec4c810a1bf4c16711bcedd6bf047b0efabd42763b10591b19aed93d2",9.917710196779964],[779,"a2a710fbb69f7b69d20b583232ca51a4af846e42c802bba78c17a18864bba8fa",9.917710196779964],[18974,"60855eca908ab97f9185cee28cb62e19f8a86dc9f3ef8da69f4dcaa221dc6a21",9.317957166392093],[18584,"2fe4132fc02d0ef9ff14e02b2f3bdf632de3d22d835f950e2fd98789dd844e2f",9.317957166392093],[4992,"277327208c0b13ed9a2e12b76e89948c4ba22055386e0faeef52617c2f9b3edf",9.917710196779964],[16725,"fbed2c18ae5a832d93c09608afd30309ef137061da5460208d5e59bb41aaf157",17.09090909090909],[2971,"753e4efd302eb2276fdf60b457a92b8a0336d0db296a250145521cd3a71d7fec",9.917710196779964],[16137,"1b0193965528e766342fcf5c58b5c56efc86acbe4c1aa856f8da811ca6ae4665",35.89380530973451],[6340,"f4f615e6bc48f442b353a5b05e29aeaf5c2de3b3c11f8b04f081283f811dbcd6",9.917710196779964],[5074,"8b90aa6b05f67769db0e25f28c5de5e62606b03992db00aa4a5496fd5a80b6de",9.917710196779964],[4884,"1da00ef3bc42bedac7d6ec5b25c8db407c4f2e8f2ba06ba8f9a65027ffb6ecdf",9.647446457990116],[6394,"a7363df4e391f375f91396a20db6d2132a431acac05e5e3c45b89c84e79160d6",9.317957166392093],[6104,"e5e0b8b48d50dfb7716db0a5d6f8109a2195df4ba053bc8f853f3d91f5a566d8",9.917710196779964],[7850,"7d2bfe7c5bc688fa668593b087725fcbbbacdfe39c03445fd7c39b569d7581cc",9.917710196779964],[447,"71bf49ee97aa7a8aa3d5ee79135ecc2a9aa79be718f98b8883a868e969b315fd",10],[19840,"881a04c81711312c9512f4f91294a7ce06c23c4b847e9d9cbf3dcac9aa561a01",22.08450704225352],[2981,"698a10f3b7f42623da6b41d4d64134bba79954f3371022422e6b10a8df9364ec",9.917710196779964],[11709,"3541211d0a6d30203c82c27507393854da15c2bc5eb8e3bedcaa2f123e0140b3",9.917710196779964],[4277,"4bcc6cf5e4088c7a1055252835db76c8e0768801bc351f13c5a6b238a729eae3",9.647446457990116],[15329,"20512045c8d4fd48e50a4302dc54932d1e8f9f10689c3c25ee0f1e7ced19c977",9.317957166392093],[15772,"9e0ee61863244097da5cb55e92e049c4fd54bb9d036e9c9c23d5f686fad5e86d",9.562130177514794],[4942,"5648cf0f430fb894f22a464e6478c82151a630ffb19dc5a853515d20ba2691df",9.317957166392093],[15394,"212a058e0b55bdf8a50c152ac5af5da8589b254b89b0d8f8c80c74a6768d6b76",9.317957166392093],[14280,"986113673654295b21a2771b9960984b1951ea665c3b75c71a939437e2bb138e",10.052724077328646],[13978,"ad5c1a18244187355016c7b90216f5246f83927aa51335772ba72be1b99f7095",10.052724077328646],[2210,"204b6ab2f90b1ef0d01a236f0fa0222ead55c88002f0f3d8fddc937e0c6d75f1",9.317957166392093],[17903,"4e039265b17ed28ccb70b97b0e49ef2fb19940a37f93f6bba616a129ccfb243f",9.317957166392093],[18717,"39b4e8e2584c6a3825bf011a0bfd3bf1c10b914dcf136f8d4ca389279fd7b729",9.317957166392093],[436,"2ef02f100602c0f06269340aebe5b07d7898ede5ae55546946395032e71d21fd",9.917710196779964],[17394,"12152c758d4d2868af0e614338ab3e5087e0f7405be01e1154f30c05cb40e749",9.317957166392093],[17327,"a4c644b70cc51d0c3e91cd5f011ecdf40031ffe71c8620368da3050a14044f4b",9.317957166392093],[10118,"90220714ce550d2fde4a294b920ae9d90f4f9071e15e915303d3c2f84c1096bd",9.917710196779964],[17751,"cbd71654969c7de66ec45047b7743609b6c73c536dae1472ac42ec0f1ef02f42",9.397642257991386],[14243,"0a00fcd9205d71d18d27a2d410d07e6e95ea55ddede4b2dc8ca7b57a7411238f",10.052724077328646],[6801,"4c2a1301f210752984e2f776cdee0629d59b1ac2341c1209f7e879ee1b6446d3",9.917710196779964],[6066,"a2e5a1172287aff5f10453923cea4fab2183a9d0527117a67b9ed95fcf2ca6d8",9.917710196779964],[9239,"fea7a0280a6452ae894918ceb58bb747e175b4f00faff70b3fd25d5dcf5630c3",9.317957166392093],[2087,"b6637f7607cd2fcb531eedbf9884e58cf6177bb33c8d9e16234b0e5066dc4ef2",9.917710196779964],[17542,"7de1c87118b021e4fa815ff9f8819b632e0ab34c94d7e3dd23eb1c5fdceea846",9.647446457990116],[15636,"864d088c9025e9da4627cbbc1af519f15cf5128b28d83d0b75e7d81afb88a970",9.317957166392093],[9907,"c97adef2dc98bc48c6b3a2287ab18dca28b0ef469cbba931e01741eadbd0e6be",9.917710196779964],[9145,"9b1a1cd1f3248925ea20f78f842372eb75a1e246eee77b4744e62e1bbabdd7c3",9.917710196779964],[125,"6043c6b4dfbf0e411134ece1e39e32272e7ae6d5bc5a4f04f5c64f63e0d731ff",9.917710196779964],[5415,"03ec4a87db6ba12cef1648a7da82b07e3c69935c3a10ec0bd2583bd0e85fb9dc",9.917710196779964],[2039,"b2cb082242662d41de83e69cbf5c6a2c01f2efbda82bd0b1c80176723ad0b5f2",9.917710196779964],[6038,"d1af9ab532612bdef0119d1487657de16e51fa74374d1cd8e036f33c88f7d1d8",9.917710196779964],[11533,"c53cbd77f1fb65845abff02d11c99a4218f3885ca4ce3f33ff05625111a253b4",9.317957166392093],[7404,"9bb21fca02860fdf17249a522abb3bdb2aaca11f7ffac5d65721e54eaf3066cf",9.917710196779964],[6353,"3e2cd37d2c4f87a3e995c3995e03b1b47c28c5611df7101eb84e2381b9baa8d6",9.917710196779964],[9735,"b50813ae3a1f3488931e4b412452d3bdd564c1f58e3f59c5608d163eb71f13c0",9.917710196779964],[18747,"20ebdcfdd8d9fb47631818be64ac927c295ea3b6d6067d84328ab41c7ae1c328",9.317957166392093],[16971,"1b652c52926663b362c54fa41292ed71219ef8e4b17ffe6ad97d61ac6c3aa952",9.317957166392093],[13166,"026a1808ac0e3294439d613d920472396e27bde9c3c856304a8bd82a2316b2a7",9.317957166392093],[18774,"6ce69f085c51c3292520e9ee9cc2454d265c07e2de7311975dc5d85aae21db27",9.317957166392093],[6367,"6916be821d882dfe5d59298328c3d32716a220f44fe7f0833aab1153eb018bd6",9.317957166392093],[9773,"2925c12efd08310739e442e259431b44e63b94969318e513b3d03fba0441d5bf",9.917710196779964],[10375,"83b921fc95748eb6e2a8bea5c7732c451b4925ceb25fc729f540d99e95a8f1bb",9.917710196779964],[19342,"02de6f22c0d0c13153d3defb250b085f65951623c734276d01bbc00273e6c813",19.222816399286987],[7745,"48ea28e2fd060b3b67aa0f051e67f56697704b470f68455e300d997e18462dcd",9.917710196779964],[2900,"52ea52c30d007495dd72d157a783094b1cb2456da2036d1752ede225d9e222ed",9.917710196779964],[2665,"5b5a7ad847149a3decbdf8a145115d3e0e9704f2902e114f5440d228c0c8c6ee",9.917710196779964],[12756,"c6058ce01295bf283d1885e9b8cfec1e108124a66fd927a53382486c68ed34ac",9.917710196779964],[9358,"2491fbfb9581612ae5a819486ae064e376d0ad84aed2362229c79df10f968ac2",9.917710196779964],[8252,"947fc155ec39af04afad9ca610ed5d58e9fc7adcd3b418478c92c6122be6a5c9",9.917710196779964],[9545,"ffa878131882c4c4de6311971d771d98d6f5325a1ce06ca2260ed4e09b086cc1",10.052724077328646],[12394,"939e28b812114c84d52caaeda73cfed94b80823fd2369702a82be9c89228a8ae",9.917710196779964],[6236,"7000ed0c05788993533a538883034e7429d5680554868c2f1c4a7ad4e0ce7ed7",9.917710196779964],[8018,"075b42ff94364d6c5b165f328ee07bc806bc13180ea516522f813b6631d46fcb",9.317957166392093],[5376,"a2535557ab656da17d5802e8450da2d318485175bc334d4cf592d9c70079fbdc",18.03202328966521],[7723,"ef6aa71efc8de532307203a93470c6711f14d571265c5aac16332577faf557cd",9.917710196779964],[11198,"473b318243e24a41a62a9bb116768573201d46aad7ed3ea80c41ffc37bf8afb6",9.917710196779964],[1947,"effcc81353af7116a17a5fefa32d0faa38ef7a8db4b6200bd490082eb0065af3",9.647446457990116],[16943,"5b4db11d048521147b833eef17b881a6cb5b6a437aff72a5e029cce167494653",9.317957166392093],[10748,"d03cd0fd23212099689a0b07869c46c81e2ac3d06a7f07fda16fd98fc28cb2b9",9.917710196779964],[5804,"cefc9a1608e734615664e941a1725a48cdf6ee87b5fdddd50682b9d1ee5b60da",9.917710196779964],[710,"c0de47d6631763185fc6323b75c2c3ce41112186632c0df718111a97496b28fb",9.917710196779964],[11098,"8c006cd36fb968be55c2c4d9401cd842149d6c95fcf795db67f119bbdbe942b7",9.917710196779964],[12112,"fea27a34f1905862f9659561b7e8877a3fc411d3223e2c484002db83e613a9b0",9.917710196779964],[19210,"f78007424dd75baf611d7afba5bd15ec4413dd57c3eb9b206310ffb1e73a6f18",27.86570743405276],[17098,"5d290063ded01c2c59ce16247ac5080659bd3096415d78fa25914a3b174f0250",15.18324607329843],[13479,"d4fcbed517a09e9dec45891e6dc6359f9eeccbecb0a68d9b8aa2c2d2a3f94fa0",9.317957166392093],[307,"c875800acab546cf3ffb0374fd2fa1c5c85c87d42dfd1ceac18d2c9cead5eefd",9.917710196779964],[19192,"1743a42935a5db32ad50b533785c240dece62cda07265f75e5669420b1cbd618",9.317957166392093],[18951,"1f29a306b65dec80398e66b9ef656833dd274998f4f1fd4b99f30bac4edb0d22",24.596858638743456],[7333,"cab5cc27dcbf81a99c0756a3bd61a2cc6c8ed37992f5fa6583ccecde20b3d6cf",9.917710196779964],[4098,"5ffcae574b82067025a36d69b4e99ec5c2e7f98250e9d6318589f66f0e3013e5",9.917710196779964],[9116,"59c5b53f2d6366c8c3fccea4f2689882ca325cabfc9dbaddaa98abdc4a8e0cc4",9.917710196779964],[17839,"8826e30850a7fdb75ceff4796d482b8db8775ef7394af6cb0e903352e9a87d40",9.317957166392093],[7485,"1243692a0921a61b2da14fc590f7b68f6c859cfce2a802030c7bec74069ecdce",9.917710196779964],[16162,"a4f7f68768116de1567b5a1597fd71466d6d9aefed59c7511d5f144931f1c664",9.317957166392093],[14699,"7e88a02fd73ed226acfb826870bd03426f6accfc9539762dd2529405a6fad984",9.317957166392093],[7208,"e1c71be09797d05b761b812587eb63b2ab5d848bddb0a4ee01eec2984aeaa7d0",9.917710196779964],[16881,"5be4c9fcc8de89d9a7eb26c31b6a7125b46f388a154d4ad2e470394c837a9254",9.317957166392093],[16612,"d33c8d3238456c92586c0644308e96c450f75b3c4c8189b2a5aeb5f5c6c29a5a",9.317957166392093],[10217,"5c7f452df61261fbd2c24bd7e5ff1ebae8d661bf37d99f62169330b5dcb3dabc",9.917710196779964],[19189,"91ebf5ce028995819f3f4f94143451792492681d36049d6365838beb7d2cf818",9.317957166392093],[16847,"978fb7e1aa69c7e2750ef7771ebc8f7061cbd09a8b326dcce2c51297c7a35555",19.13214990138067],[16307,"10d0e1bbdebac61f1bafd356caa7444aab66932842a8ea303036e89a8549fd60",9.986586521514212],[6641,"bba74b4ae38fa66df9f73c999ea4b57b121868208aaf01411e64f58f8f1762d4",9.917710196779964],[18040,"15ee34c14b9d3beea1ddbe1ab7bd7356765a1f3f5e8c280bff2554833e93743c",9.317957166392093],[13865,"da934957fd039d464902beb2c9fe5ef64412b517e28a8155677675b54c6a0098",9.647446457990116],[7393,"c3ff8c0470c8f707ead233df72613aee9f26e05c9b224ef5f75b1dd94e0077cf",9.917710196779964],[8419,"118806461e568091b5d9d0e36b733b69a422b9c07431db27b35f8cf8f66c80c8",9.917710196779964],[9897,"016309fea61a4823773a6e98a3615d139dae74ab54f7e5135d23afe8630df0be",9.317957166392093],[6712,"1f48841d51c2ee69ab10b79dbaef5bb4b6ca32b4511ad2381a65029eb3e9ded3",9.917710196779964],[19198,"1fc5baa41e2caf1542f418dbfb476ceff282601db101f535db404f89ac60bc18",9.317957166392093],[9436,"c5cca3bac37532a98064567466fc0dcbda5a82105a4644f7fff1ae480a9d1ac2",9.317957166392093],[9937,"47f33a8d2028501b43883b4053f2bac09452a44b48d5d94b2ac1580b538dbbbe",9.917710196779964],[17073,"bd185a3b90a1b549627d8a2649d090a1e963a1694406c392451d746fe8727e50",9.317957166392093],[4471,"842a9dada9c47b04464271aa54635cef34751ee8d4306bb550f84ac9b9b898e2",9.317957166392093],[9053,"c737e9edf4708b0e9c4532695f506559569572aff478eb807d8cd0270c3871c4",9.317957166392093],[1622,"380a99b8ff80194da5ad3ab7bf3aa84351f0b09c4b2c360732582f7835c670f5",9.917710196779964],[11205,"696bff858ce4d4677b5fee9c6a34fb9fb95f5ec48d1158bbf0457104546ba5b6",9.647446457990116],[13112,"4f3550f8740ab3743e21b63707b92ddbec83403a08f59f9e92c300b9ae90c5a8",9.317957166392093],[4616,"e4a7e6bc176ed9458fd1b7307de7277618985a8153605d0c047f7512cf9d7fe1",9.917710196779964],[14363,"cdfed43c89810c10429313325864a756a4947eb8e5d1d51d790beb63432f2a8c",9.317957166392093],[2309,"0bf25b64df981bcef4c6f82124a08b5cd102a61059874b188085b6f9abc8f9f0",9.917710196779964],[15371,"f73772f04cfc4acd0a06930012183278779f812bbec16dcdf555a8b5bee3e876",19],[14305,"c1c91102f8546e6a90e86e2f15732e3c5d9e1bac55dec28bff907ce1fbed728d",9.317957166392093],[12644,"00dad53e233a810b18c28adbc77ec964c1cf5126e0304449d7cbbb48287afbac",9.917710196779964],[1373,"75b842d79ad337c7db568283fe7d423cdc7b1302c7389a40c6354df26c8fe9f6",9.917710196779964],[8744,"bb7ccaf8aa8fd6aae614479b0ab2fdb7bdf46ca63feb0e3a6f0ac4cfa79e6ec6",9.317957166392093],[14271,"0e16357514fa8c969e81c73ef7a852426c00def29dc31b850858d8174d847e8e",9.317957166392093],[17321,"2f694b77fea727f4ecbc37b77d627383aa79242481a97d1243aae370fc39794b",9.317957166392093],[15582,"5957620f4e8dd32fd6c79ac34d5f9a7273d4b1f85a4f35d66d57039112e9ca71",9.317957166392093],[10453,"c3041c9b4b989a22f8a8a908d860d149833bd909d1c684df372e484b494d66bb",9.917710196779964],[13265,"153ee18814aa2aa3ef35d526fe9671d719b34a2720803121af9ede10727d5ba5",9.317957166392093],[13178,"d4e20db460720e9bbc8f418dcf9d4466e788db33cd2fcb1b3f5f2285b18469a7",10.052724077328646],[17772,"0d2858d0df470bab653e6ad537baac225df45f2d597902584dd7597d5b15dc41",9.317957166392093],[3369,"83abbbc9246cc1b80fe2081a728ad0c346162e1a728f98025ee54b33493deae9",9.917710196779964],[19389,"9a7c21c6385de89ee22aa4111cb451a961a1f5429ff97042ab2958487fff3912",9.647446457990116],[10167,"17d39fb7b6f99d642ad074756e813baa0f525fa16d87ede9acf7b69cfa024ebd",9.917710196779964],[19616,"015cf5e2a6d03eb65a137177dc15210c42256e9b111d2b2825c08e0e5bc24109",9.317957166392093],[10635,"97e8e189cd08a71338a9932a6e0fc443f6e8230584a479a173c9a2e32c0f74ba",9.917710196779964],[13783,"dc7921dde289a5ec1ce0885f21b9ec685ef9340810a20cc49e6115258009b299",9.317957166392093],[12796,"3e9d68a05fb49b503d56b585af5de6d3345851bd0899eb4213cc98ec17adf0ab",9.917710196779964],[867,"bca08b4bce3445b1c9677c44532779574501ab3b8ff23b29e04565323ead1efa",9.917710196779964],[19344,"6b8a68f53a4491c2f80ed17446862b62ba73f30170e61fcc7e80f10e4981bc13",9.317957166392093],[14909,"36ce7d3eb469d8e554de76e9b96912ec875749f46dc0216c9ddf6a1e181dca80",9.317957166392093],[5456,"510a1ff85d08323946484eb31a7d252c751d0d1720893be8736dff86352174dc",9.917710196779964],[6132,"b9d3b991708d7a8ad49be4cd88145bae3cd7f956f129463e08f2e617096440d8",9.917710196779964],[14206,"494686fbe3ea2fc861710dc6fadb9476c37baf719dc607370599437c530a1a90",10.052724077328646],[19314,"3093c31a98e0e92faeca5e3410674c73e35d84242d506d2f14eb3c0cf1b87c14",9.317957166392093],[1100,"8b65f24d904f6c9bd04044e8bfcf356b19e9851f8ba78b31859fef47052d94f8",9.317957166392093],[13683,"2af93e6c74fbb19708e5859b2ee1226e02303645ad05f1a47f918b465307989b",10.052724077328646],[16915,"7703caa15b5badb6b1dcf188815d561de31a8db7f640f411f4cd7131f86fcb53",9.317957166392093],[9302,"15612bfaf846cf6b3d64b5c846903a2b3a6a838caffc579e4dc4688b5422d1c2",9.317957166392093],[2138,"47423f0d937d6261d1723c61dc513d4eaa6b573def3ddc3f1967efa82f2e03f2",9.917710196779964],[17443,"17bef9b8786e104b969590c5a7317dbb607d94fde09dee2c67c86250bc25cf48",9.647446457990116],[3576,"595aeeed1c9296d0a29009dbe0b94d0a78f0cb3fd4564bb78b30f767694c76e8",9.917710196779964],[3188,"8ea2ef07585d202b2d8c194b093a067e97951ee86e9815d1425d57c61c1c19eb",9.917710196779964],[3614,"1245333af09c60ec6987fef1d5fcab0cb78f66d13e771915e8b97105f1d624e8",9.917710196779964],[10386,"1e40a864b5317a882fcdb5a56e8b8b018030ff00216055d2e8bbb3fc3d44e3bb",9.917710196779964],[10107,"fb6c57b8422fa6090446ce0639041cbd74e66f6724713c729cb21dc9769ca7bd",9.917710196779964],[7799,"8f21f51d38567c29b958bd58a43d1305fddf2871245cf2c7a239aedeb43acdcc",9.917710196779964],[9416,"3932c2da8905de739e9fbad20eee745db1a656e742b5936a975c2f8ed5c532c2",9.917710196779964],[17634,"62853d2494daf1543152ef0beba80330fb91ff9dd0e67504009ad75128619144",17],[15610,"784a5954058d2dfc91643e35805ad254273daeaa6aee29ee2a9d51a454883f71",9.317957166392093],[19776,"9e11237929196cfa0be71c30b172e95490c61466c1ce8af4fa86d40dc3d79a03",9.317957166392093],[15688,"9c8a2a80c1102faf2e9f71aa73dee1b43da8036e75e958361c5318db7e3aaf6f",9.317957166392093],[2144,"d6e226a26df9382f4876b159b9f984b70d38f8f3dbc095d4afd03a06abd0f6f1",9.917710196779964],[3445,"c47c2b3dc4316399b80fc2df907205a1bd0e740f0315858a4f0b2c07402b68e9",9.317957166392093],[14131,"7c26417bc7e2bd352a5b9920c893cdb53babacd11f4df66346fc851dede6e091",9.317957166392093],[19235,"1b6c7850ef63d0ce36837b88d2f4ec470ac41a9b1beefeff3f137ddb52e66717",9.317957166392093],[6285,"0df5e64167a7bd57bb126aca11f2b21b34fc1704469c02e8605978624b652ad7",9.317957166392093],[1534,"cfb70e1f18f3dc079a0d1d1a2e5b641a6d6693612b568b6b341342133a06e9f5",9.317957166392093],[18244,"136bc983b66d07d0a0aeb5c4f25e3455d794cc3e5c242f4d50d9e40fd9b41b37",9.317957166392093],[6447,"a4c1a7147405a4505dab725886e597c30a730903ded94a4e80a5e0988975ebd5",9.917710196779964],[10843,"189d35d0508c3e794d2e5c275cf51bb97761d7c318362ead87bac531180809b9",9.317957166392093],[613,"bf285ed391d223e3bf5bd1d1f8cf1d851b5b81d17cac2f234b33c1e6d160d4fb",9.917710196779964],[14352,"616ba1441e80e74cbed9f771a41d4a33d3057b12d381d59c2f9c62593172518c",9.317957166392093],[2723,"b9adaec286f618ba557ade58e46954828f376ded4dbe3e78f63468e71ac142ee",9.917710196779964],[14548,"feba5d11b6b6afd993216f28e3f6d54139140a1735f50294a21039dd99cd2b88",9.317957166392093],[13553,"74942182d42ba74d3004b092363d3c4b70dcbf2a6932e39abb844b572d69af9e",9.317957166392093],[1294,"be302016ce678c475e3ca5624d3226487ed35648e56d8e3b9a801eb4c97f67f7",9.917710196779964],[12654,"8b683d3a5fff739190b2cd06f6bab6928559b89dd1b4406e87470f011661eaac",19.066666666666666],[6336,"e06593530e666caa20ffc6c4a51314f5dfe3c398f3b8457bd14956b76cdcc1d6",9.917710196779964],[1926,"e567216935ab45b3697b98c41d565f57a1426e7a3d6e39f9ea4df2e329a683f3",9.917710196779964],[4934,"e6e2d45ee9b900b0e77b140364785b4cc4d378d13c30e74a4d8410f063b59cdf",9.917710196779964],[7235,"ca38efe825a149cfdd0ea5d6d69adc26ced9b7dbe98192b1fbfab9b5281d7ad0",9.317957166392093],[5056,"a4d7c038b57abf4c89e3c8cc545fa519d89427a89c9a86fb016e50ed7e70cdde",9.917710196779964],[14310,"fd8cf0b8ab6c760925892d83147a8da5da00df00ea13a1b030f985235cc5638d",9.325398714591763],[4005,"e1f894390cbe9e517be35af819bf6eb49c3af1146445734940e2bbec9dfbb0e5",9.917710196779964],[1900,"61167b725c8dedc8d9a5bae1ccd1a17986af15562f91fc9f3975c42b9feb9ff3",9.917710196779964],[3372,"e8c95e310c5faa54dfa85b8e0d4fce9dd5095bce8e8352f136b745e6821ce2e9",10.052724077328646],[13484,"1a63fa3c56f0c5c24c575a3e4e556c6782ed595ddad7b54f5908650eee4f38a0",15.003322259136212],[2215,"de47d0fa8d96dfa3385853b4c7013477a19b0e288393cc45a771f405bf9168f1",9.917710196779964],[12353,"3fd44faddfd82b32986f98f5c77b821fad5915f4313ed982a1240950c00ee5ae",9.917710196779964],[17308,"073c0bf0cdbf973417a0e3c25cd208c3f462e5b3d49dfe367c7ccb8272cace4b",26.03713527851459],[7703,"6bee8182522dfc4317ddf213d29af78117a9c2b7510c011eba5590cd0cc487cd",9.317957166392093],[13329,"be60e51765a7d098365cecbd430cd8b6596580f36ecd39a2c7fa91258c1910a4",9.317957166392093],[18569,"50e08db85264f9be0826b4d2558a58456c25e361da59d05bd58821f0fa5ff02f",9.317957166392093],[8877,"8697e4b9a221ffe71cc961649feeeaf8f69f28f334351a1a391cc4c449f093c5",9.317957166392093],[9444,"c05390420192db313e35a0ed69288446872eff211eb055417ab25c61ef680dc2",9.917710196779964],[12680,"6207e6940f50020006093fa7a15fc205d72fe5bc08d1bfcd9e398caf658ab8ac",9.917710196779964],[153,"ed13caa6fd9c98401b92a99140d0878fb33970b5c018dbc09bde666503fff4fe",9.917710196779964],[18323,"0a39bd934ff393d9bdb02affb3ea4815feba73e117db238d039180afa7976b35",9.317957166392093],[16251,"46f5fa2cf60597c9a21b5b4811b290ffaef91a6f40ffc3ffdf9de0751e544d62",9.317957166392093],[5608,"ce81f088dc916390785c293c26ecb0439303e9ef25b7d2ec0271484ed7ef9cdb",9.317957166392093],[14784,"7cfcf28b952a26f71e798bb7e3db231d179afcad57e9247638fd53b705dc2e83",9.317957166392093],[17630,"cc968020681a25834e8790b456781cdf82640d09dc2472b60d2a31f72719a244",9.647446457990116],[1739,"5448745b7ed7a082d33d68e8af77df455fcf0b0d8d324b577d05d1fe3caaa8f4",9.917710196779964],[2972,"baf3207332f97481f6e591c63d83d330402aa53f7b844bcab95ac4476ede7eec",9.917710196779964],[15716,"fbc579cea6a811613b8ee57cd57404b4469cbc184192efaa3a57128402f6246f",10.052724077328646],[14926,"953d468cab28ddee59796ac6d16bac9f54c92f50315c1bcfdb488fc0a8e66d80",9.317957166392093],[10411,"8c124a39f1224ea00c833e98908aba964920d210d2be2b91a9a9be80c6c4b7bb",9.317957166392093],[3901,"08a4811d8907ea507ef041a0f1aafd8159516cc9828db3682e8882ef97935ae6",9.917710196779964],[9997,"7fbf205b2a914968e5a3a4b6898f102f20263e54413cbb82261b831d08165abe",9.917710196779964],[6124,"8688d316e1eb6d77d78998285f419720c9906935198e43109b5c5294d5fa49d8",9.317957166392093],[3873,"a0e2a22e299fc9521aa6b2f38467645b3389b9686d1adaaad1ddaa7de0f48ce6",9.917710196779964],[13052,"025577d2c803b6fb84750d408b6c1f5f495da597f0b646fd148543875ad843aa",9.917710196779964],[9916,"2e6b607e4d018ff0985dde5bcc996489007d740fe2e727b75be97a365db4dfbe",9.917710196779964],[13960,"3d15650ad21414ff6d3f3aa185a7a94c394f545c8b76ca5d9403f73c4daad295",10.040927694406548],[7558,"fd69b59243d9d3cd242aa1f46a873de21b02331ef38cb936c5f5450e195375ce",9.317957166392093],[2564,"5be13afcf66fffec559a2ca83b96acd4f5be1f5af961474f0966f1b693097eef",9.917710196779964],[2978,"7c3a5c2ce2a0231417c07540acda16624ed53338bd3cef01f524a42e99b469ec",9.917710196779964],[9868,"e0dc8d6bdcb9cb8f954b0441b48ccc2cf7949e00f9e0d1c14133581231e51ebf",9.917710196779964],[16398,"aabab91fec84f0fd25e87362a5022255787630fe4e29806915b356f40b51265f",30.284005979073243],[4071,"2f092d8145488652fb7906d66c774df3722f9c61b54f16024759558094fe46e5",9.317957166392093],[8126,"b2d12da099f3d94f6f7933341d17b6e0e257fc17325344b8fa4df7ac6ad795ca",9.917710196779964],[15874,"00d4e809a4826688db71a856e06c5185fec8c5adf89b8683ac650a92ec81836b",9.317957166392093],[2865,"1b8b3775d1a06190586fd6f5e7d1b3daf0a7e35c60472961100f7660eb7050ed",9.917710196779964],[11272,"04df2b05fafcecf375906b809fb4f08a3d6fa3eec1bf23bb97dc3dd6b6d337b6",9.917710196779964],[18274,"21e472b114c1a3e7d922331f7d47de73addb6db1da199569aeadbb19da395b36",37.93594306049822],[17726,"cecf0a7818b05992db45e98091b97c1fa3ab9aafdf9dec04d84a4c7086e2af42",9.317957166392093],[16319,"508c505f94f632f14cd741c3bf38f4b39f7aafa6992e57f58bede3fc0473a260",9.317957166392093],[4374,"b79ad28cf81c5e157d670e485337a904af1f2bf756a181b0f7c8b1109ea43fe3",9.917710196779964],[10096,"ce53c870d566d7384064b5a4f70ea7dce5c63a69917a4b81fe9ebd39f4bdbdbd",9.917710196779964],[9559,"7b19ac74e771bc98770b78da6bed4eb218bb7ae99df9ab35698963eb69b245c1",9.917710196779964],[10868,"8b59bfc0ba9aa6a0cee7896ee2af28e8db0c13d19ce204277049e0ad8598d1b8",9.764397905759163],[13535,"ad050b89a56085e24e313fbba7b855fc24398bbd86dc1a92d9d2895122f5129f",9.317957166392093],[14534,"9f268d10f54d8cfef2d0ab5576ea82809d08422c13648a91f7c94f8b74178b88",9.317957166392093],[14238,"de00b7fec75663f275478b3f155fba1f949ef1c76c30edd76a314ad1b8e8468f",9.317957166392093],[4326,"bd2fc9fd9fa421bce8e637cea1766fb4d9465dcf8857fbc20f3b559c84bc97e3",9.917710196779964],[15899,"41da289ca5f450fdf1c6a6dcc791fa6d8f62b1eb1ea229fcb0e83ab318de0e6b",9.317957166392093],[14337,"e742691f03fa47d2b2b200dd513d7c2d0db9c2da9c483c3e5392bff15492908c",9.317957166392093],[4312,"564394ae296530a2207cfa4e1d64f9081cea00631b8eb603f0238d216b3ab2e3",9.917710196779964],[14732,"334241f5ee10ccf76992030957639fd9bcfe30fcf2b6c788fe8abae4171d3884",9.317957166392093],[18698,"7d2a9335674372220b147d9aeb767c819ecd3a18212898795ed2405e71785e2a",10.052724077328646],[258,"84dc31513f287df66f295d7121917aaaf35550752b7d39e521170da397573bfe",9.917710196779964],[18957,"de3d5672e4514438be9eed50dd3160b1e3abef10054e68d7d845eb5b4bb4df21",9.317957166392093],[3287,"89f48ed79793a6a39af6898049d76c1d3394d5f4d8d1b25f614a7eeda0567eea",9.317957166392093],[12742,"a05b0e19c7a4f372301f597044a7e4494884d3b43a9f82dc49caa86f912b49ac",9.917710196779964],[10846,"8e404701949de0ddd9de95de95b4bc8a57e61f667cdcb295415cda517f9306b9",9.917710196779964],[3294,"f325daf2e4c1c3c8d2dc3d367749c9c86732c5072615339a58bbba29f3af6eea",9.917710196779964],[17657,"89f96f1ae9ef422752d30bbbcad2c2bf489f18c8eec7d1123de4f97c5cad0344",9.317957166392093],[19250,"9b15dfe513ff465430687752206a25446a34cc9092f64b9aa954abbb3873b316",9.317957166392093],[111,"6403f66143ffc6b108475f392d3180b7eafaef20aa51b93fa1be63f93ee053ff",9.317957166392093],[16582,"98499ac143d150749781897186b39b3032ac2183e1f0134700fd71206fd76c5b",9.317957166392093],[19313,"3f12dca810a21a298e069d757564a442a0691cdf1045bb07fe2d25f29ec37c14",9.317957166392093],[1194,"face8e747295689bab894dcb6676097e00619f70a7439d27bf05eda87cba09f8",9.917710196779964],[11063,"bb99f119d632e95437431540beecf2601bf56fe1770056faf292c729c32393b7",9.917710196779964],[3564,"44e5c6f6cca64fe3d550c740a9e01513a92dbf182a450d11609c964bce167ee8",9.917710196779964],[1494,"eaef4a4232d4c96f75ad21948ef6f3d999a0b6ff995a1c25721be09f888829f6",9.647446457990116],[10895,"61d7f0e4ad1bbb6b402e70fca2b0f43f8769b65e54e7ccfc4593057617a5b4b8",9.917710196779964],[5965,"ef4398db03b53dd96ab6caf459950a69613d287cb7a3dc1c2d4f3cb3730b52d9",9.917710196779964],[12497,"374f6a5cb850a3f0583c688a147cc731bcfb3440bd903f769354cf1005f1f8ad",9.317957166392093],[5472,"1fc369e251575fac15bd012ca19e1a5161078328b5f31c982f11301fe74961dc",9.317957166392093],[16962,"ba31cdb091bfbf67c981a06b00673678de1532dc4336725978a9d8e4eb8ce552",10.052724077328646],[12774,"2970329387b5327495d6ad0823f209a5f6f7cae94a4f6ffe682d610f89a817ac",9.917710196779964],[19111,"9f9bc971d1ba6da21e3d665df3935329e5f78959fd657d4d5ca3faea29e8dd1b",9.317957166392093],[13692,"4d4fb8e7ffad49f67f1b3b324e822089961ae32bb8168b9093a96ab54edd5c9b",9.317957166392093],[11347,"d350c023622d779943d877c80d03080cf0a9018ccb4e00e8ee79481a461fb0b5",9.917710196779964],[2650,"e5f5ddf0148c796db91e4f3cd845ac4948355efad8ab8309107b78162a1ad9ee",9.917710196779964],[15068,"2f21e2aed8de259296759783865894e62bf3ce48a29124d27d571ab928523b7d",9.317957166392093],[130,"27657be2c3360cf4a1793186518c17e1dffcedf5eedd8e604985db2e60ec1fff",9.917710196779964],[5709,"9f94be085dd2eb7b8f5c259f1786a75bf678104e53e54f17fa82127735e001db",9.917710196779964],[7884,"6d000d9681155f3080814e6cc3f9c909cef95aa2423726a9c96f5e799c2c62cc",9.917710196779964],[8644,"fc92c1c6dab196565752e963da197a6d7157ad07511eb3ceb33f757f5a4e1cc7",9.917710196779964],[18983,"f3caf7673221adaf4033f93b84f7e9116fce8742e69fdb6cf92d878f5ac41621",16.97872340425532],[5171,"0dc93dd586db95e973d2e4086d78687b28ff0e7c0ec46cbf03edf2015f9625de",9.317957166392093],[10050,"56c731754f4fd34682a7fad492052c976819f6a686b6a1236edf6e779b630abe",14.188948306595366],[9796,"eb5dd7d9af300ddf3163d830ac7ae1b36df360132bac0b8666bb4e3c3d5eadbf",9.917710196779964],[13814,"0940a0deb5b58713062371f6524620a71d2fbc094e94165e1ad15162e16f2799",9.317957166392093],[14578,"bfdf7a1798e991c0c0b05c98a9d6d83987a04b270a3f165155bdd5dfb5e88587",34.963585434173666],[17592,"f50bad1ea44f8aab2d81083229fc420b9a1f7ca52a8b3ee2429fabcdcca45145",9.317957166392093],[19792,"fad10f7eb2931ee475fe2b42ec03f2da3d0b05b5e37d490b71e5febbb52fd502",10.033508207818581],[16703,"13b3cf86eb779a5ba10e9f17d0303f57f593f7f4bfcd279e883f524a1ef67358",9.647446457990116],[7241,"d5d7595b47d6d75449798f734ce999b0f75547b8850ff53899e7ab14bff870d0",9.917710196779964],[18114,"a41f08110eb994c5cc5cc0612f8cd682a0cdfe05948ed4d69a64f1ea0541923a",9.647446457990116],[11653,"695a08bf533d5b2c4f38e89ee94c997ad30c557cfe061482891c4e58d5bd93b3",18.116630669546435],[1323,"b9604992394993fc83f11c4ea045cf2b3f08fb26c74ef767fa76e9d5f11f44f7",9.917710196779964],[11937,"31cf5a63e25c365962ce6af01c0b97bba292da5de4908e72d56f8c783f00bfb1",27.902268760907504],[11643,"32ab642801fcfcc83ee24d15d6403a635ab51a5cebec98f39fbb7e2ca49ba4b3",30.604982206405694],[5226,"f50bf5ed7df879d78305ed5a3f7f10e08efdd417c82f8fca03392de14e9fd0dd",10.052724077328646],[2207,"873a2a6277027e4d3e0816b950fb16414377171978a7f334b1173efc742c7af1",9.917710196779964],[722,"aab1e1d3bba69491e6aff11a95cdb9325ecb958ce9c0ae1b6b05100163c110fb",9.917710196779964],[18796,"f15ee00353b87118da5a59754a4a4be401f1ef4254cd4a4a5f1700fee9880127",9.317957166392093],[1402,"bf9cdcfe153ad15b4c5dc164dcfc39fc6df6f5ed8ddd8adbbe7e0f83eaeeccf6",9.317957166392093],[5416,"56b6577ec023a8c29576c5b649cf6b534a1cc8338b3dba69b60eaf058626b7dc",9.317957166392093],[5922,"f0f37e082981a59b97edad4cde02bc7ade6483403d2cf2b031c2a1f927498bd9",9.317957166392093],[17921,"e0d1353ad9b37eeae33de09139e9be6db68a3eacd58c2eea4c59d0ef35e9d63e",10.052724077328646],[7360,"7e436a3c1895e6cbcc64e4c03ce42eed930ee7184c04d9ba7d281cb36cd9a8cf",9.917710196779964],[5077,"66ec9bebdc65395d898faff2ec90df6b333e96dc042e0240f59ff2c79bfdb1de",9.917710196779964],[13962,"8133aeeb237286bcee4711fed1d34a4fb1d49a165174772b1c6acac022d5ca95",9.317957166392093],[11789,"cde0f4041fd73d1a6f9c2162e3722964fcb8d1d8b9654c27b0c7ccbede00cab2",9.917710196779964],[2534,"8b719875a3b3930485a8f3f1a566c9713347a8684334192e3dfdc145809298ef",9.917710196779964],[6812,"96458235b914b417747f251111dfb9f801ac6279d81d3c10aa999a46f6a133d3",9.917710196779964],[2235,"b7d347762b18642e8244532209893a6e376d5666b2311ce99d34530117d050f1",9.317957166392093],[69,"d73c2fbc08edfe09ac85a2b709bd0d60d97e2a4859fda816e133ac14dc8189ff",9.917710196779964],[6687,"43b397f08cd33da741ccc19409d2ee929e021131b5613b27c9b83789b69d0cd4",9.917710196779964],[19705,"dbbffc4253f3e4cf14f501918a0f0ebdb014148e9859f2186e47fb614f75a906",9.317957166392093],[3224,"6c5ccc15ae2527b46fbd3a089411e9096e92092c8e1942d627dabd34f410e7ea",9.917710196779964],[9167,"534f26f3200e2c8dec167bf30c78bad539a9087ba3a0866dad5578ae6c50bac3",9.917710196779964],[15277,"27f4b9b75c0e673c699e905c67101f27ff4ace9634dba794b0f236e5cb6fcf78",9.317957166392093],[13402,"a95482d5833bd0d482b67dc91eb96c5f56a399b8d2b7ee57a5e48559c9ee31a2",37.19371727748691],[5767,"29abc4ddb7ab820ffc7a7694ce483b0b1cfe160437aa0357eec3a708f38bacda",9.917710196779964],[8866,"7d3cd0990948655c977e484664ab4ae526499f326a0396cc8bc9c78f1e86a5c5",9.917710196779964],[14288,"73ea3e5d6f23838ab0256646648de1b9d8fb66b8188c6a846028b9bc2f54ed8d",9.647446457990116],[13485,"f0f088d130734d65fc66adf7613793373256d8f518122a8c4eef5b62569736a0",9.317957166392093],[4175,"a2240c9ac35cbb037fc15e6fd0facd2f4539693eeee6f09cc96115c040b49de4",9.917710196779964],[16960,"41b642b3deb5170a1b1861575368fda2fc23a01b43c3c05252d935659e1ff352",9.317957166392093],[17343,"c7cb9058a8c81523bb7de9854c050e2562fe9e7dbfa35e81d0d68d3e211b004b",9.647446457990116],[13670,"00496060fab4b1540af357ddb7ee97c73e53fdae3c95abddbd3d398f52dedd9b",9.317957166392093],[5999,"3c3a7d19ed6457a4a123253112e913b40921dada32cd9b1bce417d2847eb10d9",9.917710196779964],[2332,"8623479fe16e7643bb970be2a5764bdf4e02cb3cd5e3e109810a849ed2f7d5f0",9.317957166392093],[13790,"72cced8e4b562ea92ba78b86ca751cef2c44689a004102bcdc4183b869288f99",9.647446457990116],[17384,"82d9ef49db22fc7c79c525ddb96cd69865744d6764556ef1c99a7a0393e7214a",44.40499306518724],[18443,"3c02d8c267db430256ea69d1a15b8eab45a2bbae831e717099d35f703447d332",9.317957166392093],[15851,"08fd91471d36287a3a6308cedbdbac4ddf4cf85ac59892e35c3d85dcf554246c",9.317957166392093],[1910,"b3e1d0643665866650f03fff261f32399d2bc8d6bfcfe0795f8f98ca65b493f3",9.917710196779964],[1681,"e4983f5d4ad0b1d90a36005f5d1fc59c034a60cb45d67febdd7df8eeeb7909f5",9.917710196779964],[6984,"a8e4c7b26d94bc69a603deb7832cf9168ef053092df9624aa61659b3a05d17d2",9.497326203208557],[16855,"a29ec7f5f9334fcbb1681bb914ff5ebfa75f74b11ff8cacde2e12b7b83083355",10.052724077328646],[12600,"cf632160d6ca4913ea7e5babde8df20467d66ac595e3cf2703025e9be05e43ad",9.917710196779964],[11041,"1037d8cdf6fe838c80597878bdcc040ed61b0e9ce67c225c262389f5ccc1c9b7",9.317957166392093],[8604,"01f9626a8d41298dbfd4df47e31d386357d551721ec4e5d2e0c5fee9d9c16bc7",19.228318584070795],[3561,"65c7a63df12bce0306916db12543a97071078925d7e3de0175c4dbe693dc87e8",9.917710196779964],[1653,"1c0ffcc5b293ad5e626f401e7cf523beb24014b012256518e2f9030fe7bc3bf5",9.917710196779964],[18684,"e2905e4816c4b0119fe2c1e3c366ee4dd06953f61f5b57e1bad4e93678b50c2b",9.317957166392093],[19510,"3f00ac3b326f7f141720f677f98145fc41d3faa896f00967c44bbd983011ff0d",10.052724077328646],[15516,"2f8dad519f1097d2cc88ce1940e71039b402ba2a2b1e3859792dee668585bb73",9.317957166392093],[15117,"f12e885425c5bb57c5f3fccd93946760d1afca7b45f4dbe66a0d22d01215537c",9.647446457990116],[7198,"7009c99abec60258d243f6002e6bdb3bd5abd949b990c6c7df9615f1a4d6bad0",9.917710196779964],[13475,"a52635b432bdeec941e0c86e924ce1d0512d0d17396b1df499fbfcd03cd873a0",9.317957166392093],[6326,"fdfc42e045876ca32600b5dc40eea2ca2e07b08df2d217e9eeba6816c8f8cdd6",9.917710196779964],[14979,"12d9c268daae0b668a217c008c0c4e6f70e0cdb5c695fedcc75d470cdd5c037f",9.317957166392093],[452,"cf6933be01e9132fca8a818a12a85dffd2a8d4dbf883178d6d91bd8972f707fd",9.917710196779964],[8657,"0ee329bd91898a93d02815fe0ddeafb4ed5c417f359593b324754be3cd3dfbc6",9.917710196779964],[718,"afdcb2cbf648b595c5abab7b22b95c564326b044998e459a0d87e596b69715fb",9.917710196779964],[12583,"f965ffd2dd4545ab0f9752ef84988858fc75754d029a608abd376f413f6462ad",9.917710196779964],[10977,"1cabdc1c0fb0dbd7af4ebe37d91aaadb0ca980be6f97a5ebafe1ee63e76c2fb8",9.917710196779964],[1,"ef203e58e600c0ec9d0a3212e6ae761f719c8193f8afd3bf809f89d4d8e6ffff",9.917710196779964],[5019,"77f283930cf4a9d63f2cf3b96138ee1c0a940af3c948e2c0beb5b1aa7a830cdf",9.917710196779964],[406,"1dc202b919553668f34994c02032e091679ddbd6b6d4c798101b2a4668b84dfd",9.917710196779964],[7877,"ee0c532de6b9e65fb3ff724160cb20f1f1780dfe1262523f305a48ae85c66acc",9.917710196779964],[10164,"fe29661305ba97c0eb9959bc4ca3df23e55c88c7c897039541a0fce4d81d50bd",9.917710196779964],[15944,"c29ba44471739775d1976f90954e87223265e34b152f7a4948bddbad3151116a",10.012515644555695],[8243,"c1cebca4ece81eb316a2449d36b3d6eed9a2f25bec4e0402a5a895846703aec9",9.917710196779964],[3205,"220e6f5537fdf822924a50d3f13c9c02766ff5ce89bfb4c7d074d33c22e500eb",9.317957166392093],[858,"550f37296c685835087c3b3403df6981fc7ca6c0ed8302450c80fdbf1dfe2bfa",19.796387520525453],[10774,"37e6108d89c17a0dbd66cc7af63514165050becdfe03b6602b4a9968c25977b9",9.917710196779964],[17439,"94c0ac10536d41cc24acce969136a2dffda7207e1fd685af1caf8b361eeee648",9.317957166392093],[706,"1e29f338c76640003245161b94e70569beadc9d58e2d6fbcf8aed527795b2efb",9.917710196779964],[2472,"735b1692103f5dee458295d30dba3bcf272bc96738956b20ba5b26c4581b0cf0",9.917710196779964],[9710,"16dc652b868cc31e8d670400da31044aeb1aa5be6329a10c14cdc7c4fcbe4cc0",9.917710196779964],[9520,"0bb68ffb737a7190e3db8dfa70120e6a2f81418459de7cd445f06202340f90c1",9.317957166392093],[8930,"4b8e8af97bc813a9cc08be248ec73ae06da68970f32da1d81101d15260604ec5",9.917710196779964],[18820,"4f3e4b050c84c647a9bd23a0c34a6a20aef18b259e07a39f4b824dc096bc0f26",9.317957166392093],[4364,"e3b313e29654f171a754d63c9d9f20fe3f0bfdf94ea6a0de8d7f6a9cfd5d52e3",9.917710196779964],[386,"b8245a1441f29fe997305f01645ba93543e5f6974b9da9c7e2b8dbd779a672fd",9.317957166392093],[14939,"8c94dc695b4ce6b0ebe8ee59662dfaff30a2f4f9a5331a72cee68fcece7a0f80",9.317957166392093],[16652,"dbd07fb3a362be1e9e4c9dcd133ee7021a0baf3664b40a1eb65aaf98a0f9bf59",9.317957166392093],[4335,"10a64f8e11085bb7d3eb902a6e527127bcb83fc4e50e5f30c0f3c4a543658ae3",22.736318407960198],[17411,"e716232afe301b49afcc1cef18de7afe339af2acb74b72ff92e40239876b9c49",9.317957166392093],[2047,"3414ebd04362525b9e2c9abb52987fd7244042b058ad7e1e06245806bef8a5f2",9.917710196779964],[12312,"fa966e87db961498e1723565142651b28a3842576fb8db2a69b652b5104f29af",9.917710196779964],[18657,"fb2a428c3f0b47cae990fa40cd35b4f1ab78eea7f797d255059978279e16652c",15.003322259136212],[12451,"38ed7af1911a9297c21d032a1060416cba4e4c8cf2e53b2159fe6354b45a48ae",9.917710196779964],[17420,"b043f66fdd5280ef20e16840f216f0e18a7b9a269eec8ce878231c3d55db6149",9.317957166392093],[12985,"c9ac466e9124e15255d5d9119e31591d508b48ae964273b544e8d4fd735cb2aa",9.917710196779964],[18884,"ae26e46a1ce5921449630998af5398e4677c62a1370991a75137b7fbee9ae023",10.052724077328646],[9879,"b691514d4da3f1d31b11a17bb4543da7dd0205f56d67843b33dbabbb64fd15bf",9.917710196779964],[2873,"8f5a53a21cd49b1f23033952afa7a00be0cf5f9a9c9150f20ff01a29b22046ed",9.917710196779964],[3558,"7d9e1858229c915251ea5dd8bc40b792e5cad9bc42039fd8da8cdfd43f9488e8",9.917710196779964],[6974,"44df9b93a8d9f7f85e6eeec933923cbcf4ac98880f73be4c7c1d6cf8a2b922d2",9.917710196779964],[6859,"57f6fc3bd5ddaa222e25f80fc5f875c3c5132990051191a7afeb481944aeeed2",9.917710196779964],[2607,"6605253a46aa46b7d8e9c4357afc58bae585faa13e4d25b9d927959f72ce1cef",9.917710196779964],[6088,"d4df0fa4b5fff04a5f4ec43265e52b1f8e29d2519454b9a33f7b78e56edf73d8",9.317957166392093],[293,"2cfb19cb65f2d5314b874011c2774fbfef8c57149eb53ab573dc241e361d01fe",9.917710196779964],[9180,"4226accfad9645e22edd01eeca49f36c1354c28bf4d7ca6cc7ac1f37180d9dc3",9.917710196779964],[17463,"ecb2077727b7f43ddaff94af6a3f466b1509c690438818f3838b0b1339968b48",9.317957166392093],[12082,"81062d9456d229c961966d7938bf7557199adee29000f455fd54caf91676d2b0",9.917710196779964],[8732,"2341e78dd8c4fcf913a8e592eff19cad568454a5c3405c75d9d4d023397383c6",9.917710196779964],[15086,"dca20fadf07964db05e2b62d39de10e189f7a679bedcde4819e923d2c137ed7c",9.88558352402746],[4870,"ca6e6e9b330dd3e59132065bbde164937a934eae3058523962aa6547176104e0",9.917710196779964],[1234,"b737e6e82a115a1434e89c93a755e0ede54881625bfae45b3f0c2c4dc903ccf7",9.917710196779964],[573,"a6a2d8c8fafac2eac6037f8c6a226e65de24303864712a941a71080109bd1afc",9.917710196779964],[499,"86a95dccd0e779b7a0dd5173d304c4ad4c8d0e910c37a5387a834de6cef2aefc",9.317957166392093],[1384,"3ad33a6da69f3276c52c3ca60c9d0f748d49e3f46a9cdc2e74a63113bd1bdaf6",27.148342059336823],[1054,"7a70e76d2b199e28d3560899a17ac4adcdaf7c69c41cd71d7982afd13925ecf8",9.917710196779964],[4535,"166a277ca54108551ac82cf46fd4cfac249fa7a89fb2901699faed1fb10423e2",9.317957166392093],[11048,"708c0588c7261860e8d37acae4d5cd37ab6ba397e3d1b47e897d8e0f03c0b7b7",9.917710196779964],[3543,"6ac8be59ebee20edd3db19cfb929f675d006b31e1409d172ad4f811138e7a5e8",9.917710196779964],[4916,"5d90cb8083700e5c32f2bf15c45867ee7156ce91309f5e1863c6f4057615c8df",9.917710196779964],[9147,"5861e855bfae91c0e5f614a538c880c44f359264c675bd89fdabf7c64f07d5c3",9.917710196779964],[10772,"046c60d5cf9ed571bbb4f2009b40eae87a23c1328338ed006a179197964a7ab9",9.317957166392093],[8575,"41d28ced8d0a3b3587c69982c1da3e179cda51e2a98b2160689e5964b27597c7",9.917710196779964],[4344,"a784a523140c9479d5049cc24fa8b6e5ac75f66eb608c6cd759ae03d10be73e3",9.917710196779964],[12519,"10c00a753f756ce45862ed57f97e35c4ca3f7d69761f55df40c2bab7adf8d6ad",9.917710196779964],[3559,"d98788650150d1de4771124cd5e6e59f507d05d37af059ff9b6736d3831f88e8",9.917710196779964],[4619,"4b8cb740bd448cb29df582c635599b13ec14cda8f48e1b1a62930b050c297de1",19],[19659,"fcd457ce2003ad617050965355e7cefe5b12f31c1c1e1a25d15931f66727ce07",9.647446457990116],[4703,"9f1e43d18b0f286841b693acfcce188b7724605414fd2999bbd1f2016914fce0",9.917710196779964],[4263,"ec9bcdd0ce883b3d5db4b827703dc52606e55d7e991750455e8c3252c5a504e4",9.917710196779964],[17293,"9f1c1c6dfc2bb870fc91046d42915b5b8081b258018f4373cf2007042735594c",9.317957166392093],[19769,"7831fb664d675e053ebd2f0c601c9aeb341d1eba50e71082784ef7887db6b403",9.317957166392093],[10852,"39230977ec84d632d0c3ba2de56a30773868acb798b2b55791c0eeb678d2feb8",9.917710196779964],[12266,"e7e6da5bf7f4a7c4b30c8672ff8286b184f1af933ebd783ecabbd6a57e7193af",9.917710196779964],[15575,"6e732fa61b3a1bf992cbfa8a927333da44de36f542c2650ecd1b88be9b901372",9.647446457990116],[19219,"5be23bd031a19446449c9a0329d981e5e105333408e9efe93650f3e6ee000318",27.90465380249716],[9131,"abab830448ab9874c08b5356b3e2d656250321e70bc91884a3baf211334feec3",9.317957166392093],[19837,"629d724e8360cbbc9a7d03a1e965eadab6672826bc1cb550e673a105e18d4801",9.754437869822485],[12984,"436d0abaead3d77a25231d885def7f2f84ca09c47e70b14d63256bdcf256b4aa",9.917710196779964],[6820,"86d9b68bbc71f18dadf2d1fbe9ba870777f2416650f52f2ca569c13fd0b32ad3",9.917710196779964],[5274,"f135f577c32ee0d0d619a2a52fb8689fd42df8cd9583f13588ed40c21bb58ddd",9.917710196779964],[3198,"b4c38740a974a7782b1099dc7acb9f8727c735191ca397b8541f47d320610feb",9.317957166392093],[7055,"0f5c557b0bbf10b6c0618713ebf1221ea6af7e9934722bf1e9cfeb900e2ca0d1",9.917710196779964],[17295,"1da0fba09686cef818a2d04c4728b1de2d343ab707d9b886b29b8136e02b454c",9.317957166392093],[1668,"95d937bf6f279a5ba125ee4713f55ba1d5ed0ebdb8fad293f0c4f67fe3df21f5",9.917710196779964],[15070,"16a0066c57dbd991028a67c2b1a87a7bb6198df3b2d95cc9545d44ebd0b7337d",9.317957166392093],[11864,"d9fd1796150ae4f0686c3b9b890953c9fd8b6429a5f3b436e090be0f56ed49b2",26.108183079056865],[5946,"9555544d72bf60f70cf2e5c5d6ee662a9d34634440fec35822d6d251d2006dd9",9.647446457990116],[17339,"6cc705a2da987bc8a9dfa01a70859c75b8f798b7c3d88a6ba561450b7955264b",19.100884955752214],[8868,"cab7c4aa3f5598490a8f6123d67e18916714a8e08f60c980e348ad9101fca0c5",9.917710196779964],[17618,"877b2aa8dee92879ea02762d9936dbc63f0dc5d6e6ae440ee9b3fd185a03db44",28.743362831858406],[3668,"bfbd454f0ed7b8a7b449d6881ae64eaaf0eb6c275019dbedfa69266e6858d3e7",9.917710196779964],[18404,"4503e26fd0b32b40941b578679081ba08eec99bda48317625f11f6683c7c5333",9.619607843137254],[11603,"5649a2172bf14c50e6921beb675c6b4646192c8b368e31df66b62e6c3a42e5b3",9.917710196779964],[10346,"53b40d38ed89a0f23f6aa5ee4e8b0b800dfb966aab41178052229cb9f46d0dbc",9.917710196779964],[8510,"0a08801e76ef990e21d74b59058a3f2517faac7992a4c6e1f6fef9ae7b3dfcc7",9.917710196779964],[12269,"ce61c7ef0923ca157b9c2eea73bfb2339d62d8befe6dae9c15c3c570ffc786af",9.917710196779964],[12060,"6f0c2113a7c9157b38616e3c65bb95667312bb62236f2686e919c9edf3e0efb0",9.317957166392093],[3506,"e7f75fd991934951e7d80182e5bd8df2aa3f3de0b0bf3c0cf658f67b04d9f2e8",9.917710196779964],[1488,"3cb7f7508a531c1aaf041a5e234043f102f95cd469392ab86b1a2650094435f6",9.917710196779964],[5992,"6402bc3ccaf19439c5f97c869b4f07cfe9d6724e0ccd0efd2000fd9ba90d20d9",9.917710196779964],[16243,"08938b2abd26615731693b6e813bf3b992c428346a05ee969ee4c1f1cd0da462",38],[8671,"dc74dfcad7ec7f1d49e6447ecf0a8572673362346be7ccf7db5fd8ccb913dbc6",9.917710196779964],[14239,"a4ae4314deb07b1ba97d9eda988c8dc231f1709e36689f90afb776257e1a408f",9.317957166392093],[8817,"2299bb7bf344daef179e3aeca0ac82873863f5d5a120d89bbb6ec13cfa0dffc5",9.317957166392093],[9768,"5113ee001d7a964789a4aa9934df46ed80a7c4b873f63d6bd875fbfbfdd4dcbf",9.317957166392093],[576,"a2959ad715ec3c1d26be97a0735c308c8a9b8f780dde53c18b46f89ede0818fc",9.917710196779964],[16777,"1cfd429f0c5bee47ef57d1da2b1c6804dc3c97e25ac3b9c3ea1fea94e082e456",9.317957166392093],[4151,"bef9385486480e3e22ca14c4315f458af20e20102574e85938972f30e045b9e4",9.917710196779964],[14229,"57ff8113161f90cc0485546818ecc29bc5666a883f0d91b2c4de5444df2a788f",9.317957166392093],[12925,"9f278e945196406db9de50fee81a1ef74033e67c09100cbfd624f84d86f21fab",9.917710196779964],[8200,"d286989cca63cbf560e241ed985dd9e87d63c6b8123b3eb868a2e6824660f9c9",9.317957166392093],[7535,"9d994f47acb4582f7dc1a792c6435cebb8a3b437f976ed187a6a40d1843296ce",9.917710196779964],[1244,"ac0f9e469cf903221f4ea2772e349287b663e5907d705c30265d25a4d0bcbaf7",9.917710196779964],[6037,"042474c461e81eac4f4d38e2dbd006011f7f86e5823439512e239f824243d2d8",9.917710196779964],[5575,"16f2bbeac1daa05c03922c8a78260f207a48e1981314b4549323a853a1dbc5db",9.917710196779964],[15540,"0d754810c6a8c8c9e6b8278a44deb7593b6625ef6402236ca940ffadbb0b2a73",9.317957166392093],[13847,"fa0ebf4dd0a44162f7e7e364d90c6e4e393b1b2074cecb028333c0f5ee797098",9.317957166392093],[3907,"05d551426282f908e1822df3d62432de69a3f1a90c6bf0281d48575bf1d450e6",9.917710196779964],[14818,"262f75a243d8d4cea86c99bc092dada7061de1570d2ff7b4472849fa18986d82",9.317957166392093],[15379,"9f28952007de49edd74b98d2148f1f7fee8d9c44c0b5f2c0a6e0fce796e8ca76",16.036613272311214],[6913,"7c8eb294bc72c7fe164be15b18480c85ad9248ac936ef34ee385e00512907dd2",9.317957166392093],[9968,"e31cfce018f88f6a84f49d1c2a87e85cbfc7e32e5d4013f645b37e51438383be",9.917710196779964],[539,"a8184124eeb781dfa6cf9efbcbe3a049532355a2ccc6f64cba93e05220195bfc",9.917710196779964],[7380,"da74c42abaa25ec98a3d77704fba9ae60262e018cfab0a7b4df0bfca29708dcf",9.917710196779964],[11259,"873b65cdfa714939de0829f679a1ea5ffaa78ea4f12327cbbc7b11658b1b4cb6",28.863961813842483],[17039,"d3dc12742f903e9796b9c36055fd072b5a349fb9dd202243580f2bb561bd3251",9.317957166392093],[19169,"576d98e182b2bcbcf4d73a146183b3702213cf7b5868c2a25627a018f1f3c819",9.317957166392093],[5684,"20c38f61a08ecde9b3423484016a6a5e70f11e0a3f7c0d6070e3210a3f5125db",9.917710196779964],[7935,"abeb5e73e363728fcae00c2113ec5e3aa02b9ae0d39760f76a49ffb94c26f6cb",9.917710196779964],[15811,"ba5e856d14945bcae07a32208351ea3ff4e206587d2e1051c662040583bb2e6d",9.647446457990116],[15196,"7ecb845c80edc512895016e965bf16ef9bab0e6ba56dd2593079fb609ec5947a",9.317957166392093],[16482,"77ba32ec15f5d85fabfc501ed61e012fe28d87b856ed1a9f068738830ba29b5d",9.51504424778761],[3856,"df6b71d71de9c7018568bb4b9acdbe8317d9ba4c176a6ea30d770d3911e69fe6",9.917710196779964],[10692,"ef65e53e7c1d26a04b6de63c70be9c242d283ed419e2b2617bbd76a8dfcc0bba",9.317957166392093],[9257,"73fc71d686012cbc586e4cb876e457e8d215a3d57515e23cb7197ebdb8d517c3",9.917710196779964],[15824,"36ace94dedc734f1f9b633c781c93457da97dfe341fc7e04d8a7d4a87ac0e96c",9.317957166392093],[4693,"e79164f4f65530c72759b577c0fadd736b3920c2fa4ed1a7b46b8196bd040ce1",9.317957166392093],[15008,"ee0ad441fc1ea807d8407c586bb9203e80b5fa4054cde04c527eca59e76b267e",9.317957166392093],[122,"479a5eaa5b5b7a1a7024c8ad792860dd963310de2c839d92d4542e231e883dff",9.917710196779964],[16598,"69e9259b556a57aa1912102c9fab9ebb299d77b53359095c526f01e42382ef5a",9.345291479820627],[10075,"058d5ddd0546007bfc8c6d27fdb8c027a1ad84746daa3a8c41ed6799e9cddcbd",9.917710196779964],[17910,"b85da6806f5a635efed5ddcdced99231c4ad802fd0a879fd1ca22894d2e6123f",9.317957166392093],[5714,"a49df2e01acd720bf67573cc161309dbcde5b3387bfe2f78bc6893ce0b06ffda",9.917710196779964],[14284,"f35995f5cd7ceb45f1f59af1c95dd2e3645d93fe0b67df1f168b5e50ea1c088e",39.13879003558719],[14313,"3e5bad73cf86d53f155506b80d68fce18850c4c286bd9662e84069da239c498d",10.052724077328646],[14132,"10bc200bde80b0efa8682bd4869698824d0bb9da126d2551ca329f3f70e2dc91",9.317957166392093],[12737,"109af6d7b9dfe9922586fbb809db24040a2b4db6bd8d73e669dbde4d0af257ac",9.917710196779964],[5616,"f528db39e7dd268a79378702509bc44c8d478f988d9ee33413abd1644eb091db",9.917710196779964],[15106,"4cb534963aec3ce98ca013e13beb33526c92b3010717978305afe435e970747c",9.317957166392093],[6671,"f3b0848c96a56c44208e771cf7b412234f5dc19f7efdc3ffb91d74f408b32bd4",9.917710196779964],[14064,"f0d5e54c4083b926e2f5e7b5362f13f89fc9acc4539d38b90b884998cb035493",9.317957166392093],[15518,"4c2459568593d615543e214207f301d6f425ebf7124fedae000274164026ad73",9.317957166392093],[18813,"fe036d261f3d48e98c85fd0495af05c49793a4736835ad75b1fc71d8366d3d26",9.317957166392093],[16638,"6ebf152f3aca7bd88af3382ec2c614a9e178b6db96373a3ff9c36c32d097155a",9.317957166392093],[18521,"14630fad9d641c9f60bb139668c6b103d868f66db094fd46af00cb0587350531",28.89883616830797],[8138,"a5fa711d465a033d218587b5e54017bcf8016c1ab66f8c1d9457cd1dc5f673ca",9.317957166392093],[11283,"2abb5e22bdeaef94d4f40c7288ea7f4c94a8c74b418780d651092594d4cd26b6",9.917710196779964],[6408,"cf2a7e2583f2cd59f1f71b854e9b7577b815df29712e63a471618bc7b44848d6",9.917710196779964],[15594,"239510e899f37b573025c14ee94099f61b3c7586cce6168ea0744e845a1b7771",9.317957166392093],[14420,"79ad87a779adf8ab5bec543e284783f80642032b3101d681ec42698fd48fec8a",18.09625668449198],[145,"e702d427c21ef3e7dc252e7adadcddbce1f9dbb3d15255f2e3c6d4dd0dc901ff",9.917710196779964],[1885,"7bd01f45122cb1e7258b298c00d7b8f094c8e66a619ea0010f1f2b8f1174b3f3",9.317957166392093],[17606,"d76984e871acc532451ab7989fdc3bd2672cb626ac3f9cab0323c613ae03fa44",9.317957166392093],[2700,"75afa61f63fea96dbd3986156c8691f457b6b5504afc65aa81034c61c3fe77ee",9.317957166392093],[8998,"ba766373cc13692b0a7e51890edeebc26aee78c6a59b920811a83eaf91d4ccc4",9.917710196779964],[12622,"371b76de8921148584755dc35b0fc35bbedf1449e119ab203b3f07bbeb3a21ad",9.917710196779964],[7702,"caca9b03af3d82668c5bc52ef5d6a1365684f075b38c7a8ce0da71c2477588cd",9.917710196779964],[19367,"398c1f5c4b250ca1429c019d98824790952e49d74507dabe80fbfae204662b13",19.032702237521516],[9105,"5ac3fbe241232449825899c06a073a2889004f0cd290c85ddd47d59a4fd723c4",9.917710196779964],[16349,"dcc1a8996088296345f0fe572b8fa62647a3ffcfced1e9c0c2f1fc2850f21e60",9.317957166392093],[7998,"b36cdf0fb7299e914c8cebf626709378d8764d1fc067698e3007699f334d86cb",9.917710196779964],[12609,"565e7e37e76ac0bb2d1c34e6a3fc8b08a92cf78cfb60c73e866276a670b335ad",9.917710196779964],[13157,"8d8aa548b7cb9feeddabffff207d45c601fa042d2495260769a0693e5bffd5a7",9.317957166392093],[6497,"b8c05143c50427e5c623e2cc74e7b7dd7b9e791e9b9148c201f5a156779e7fd5",9.917710196779964],[2768,"aa2b825ae38c403d5dad8ca1da066cc192b9dab44e370084031c661884d9f9ed",9.917710196779964],[5647,"c01fd7e53f255628bf530797287cbe521d7fda6bcf136d1a3083f2d6d5dd58db",9.917710196779964],[10238,"c294ef4dc97a86f6e2ffc6c5427400ea60ec2f767dfe8bf1d5dd9fa04394c3bc",9.917710196779964],[14952,"4b12e756b7a937ad0ece7f3c1fc84287f1637a070489dd1b5237daa1f289b37f",18.51923076923077],[5357,"e19f2c0a5d2f32bb4d6d79cbdb5ca558cff7e56fb452b34f26c9ee00928019dd",9.917710196779964],[10946,"492067b1a5dc380fe03f3c2b0c2d494d75ad450e54fca961ced0e0df769b69b8",9.317957166392093],[789,"a72475e7e4a5a08cb1beaa708391e6c3491cb93b6177eaa644a52d2adeac96fa",9.917710196779964],[9144,"b8af66f1eaba163e3769cdeecb9263caf2c4066a51d5f71573359d2a2864d8c3",9.917710196779964],[4073,"f08e763baea1fa3de973b0c82a069c88336f5e003edcf999cb334f06c92c41e5",9.917710196779964],[8837,"83227540a5cc95ba50390f40e34250d3453e5d04adab6813fd82b9122575d8c5",9.917710196779964],[16478,"8423d97482218cbfe7ca6e228d6ab91f02f0dd1bdfcf3a870698e2d6c754b35d",9.317957166392093],[14380,"b03579d7d1548fca81575121ed466f0987019a0c57564f5555998248a7e7c18b",9.647446457990116],[1718,"e681f8ae2737761783c81c509ee7c7417cc0625335cbfa1f978ffd44639eccf4",9.917710196779964],[8824,"a0b264584f9de975718687bfbd5c2841d1714e8652e2db4c6f4cb64c55b0f1c5",9.917710196779964],[5627,"053851c102ba7f2ee57ba059850cd694c7f065520628ee025549abdb2eb87edb",9.317957166392093],[10586,"25b6ba41d538b8a46970e6353a0442e211f075b6b71851d68a2840718a65b5ba",9.917710196779964],[8749,"9d55c3b450d01b026122aa138e061a60754358311cf08fb62b611581841262c6",9.917710196779964],[8204,"2409658f608cdbfcbae944abd8e9c3889628c236367ae90c01adffebe6abf3c9",9.917710196779964],[9618,"2ac0d9738b0f62b363a7356c518299afc24f41cf1d0052585b749b622614ebc0",9.917710196779964],[1503,"52ccbb34fc84b7d64e4bffc775a5abc3e9a3ed38be3281bc7d5bc40c4b9319f6",9.917710196779964],[10966,"cd0ef357f8ea39285c8656608b2002f3b5776f1aa575c0b39609cf24e62f3cb8",9.317957166392093],[13316,"1c8c86fcd811460bfe29a81028c18f8b9b04bd9ab1681575e3c596f545124ea4",59.05759162303665],[14539,"befb7c094758ee1fe341129b3ba6c97c246979f3ad238b474f06b1ba3fbf7988",10.052724077328646],[17328,"9a539391a26c71477515f1f0f7b06a5eece910e28da6584bd04d4eb8a4044a4b",9.317957166392093],[18025,"54707c8b507af1100ad4265b71af2d30229aebbe4ee7a82e804ee096db41c63c",24],[6224,"a183b56bf52a8bf14d4aaa5c5a4ec500f68f560b2fe32ee83d7f8022b14896d7",9.917710196779964],[5431,"22906fc28fa1b79df09fd7ba4cee726ca3de36072978c78501b4736b661999dc",9.917710196779964],[6785,"573bd85efb6141bce850a0ecb5cfc3b26ad64e7c1f4bbafd84952cb3426862d3",9.917710196779964],[13586,"f1cfe2d992992f0a3854ff4cfca9582e9e55f7e35f9f2785d1bd3e97ffb4c79d",9.317957166392093],[7910,"61fb65e6da673fbcc0f095c547f8bd27933a43fdbb229159a8c1921a65332bcc",9.917710196779964],[440,"96a24c68c5cdc742a4fe11547d1f58cdfbfa563804c8668edbeb32c2b64c1afd",9.917710196779964],[16854,"6599ad5f8fedd65643d589596b39c6638f1818c72eef21986c8ce281758e3355",9.317957166392093],[13943,"e828d313e3a94eef22891b86da7d2c4bf3f22f090925cf83102acf75a06d2996",25.53823088455772],[5912,"5411d8b944fb7c2f1c9a02f1bccc8e47f5645261ea8b1a0b1da8eb4731189ad9",9.917710196779964],[18573,"314cff803ed3225464b31cb88234c90b28038ba42f8110dad1ea4229dd6b9b2f",9.317957166392093],[11633,"f7978f4e6a5f9da35f1136cc80f51ddaab4bdb586ba0f22b5caad135aa68b2b3",9.917710196779964],[9461,"a11cd61a6021b3ad4221ba0116511297ccc063de5920d0ab6796717c1954f6c1",10.052724077328646],[16904,"4509b21646f08605a930f3ed36ec09f87cf3781e67c8a8e657925e909a261154",28.19221967963387],[7649,"b0a325101e6a1b0346d470ec22d4ab5bff28691fa7f1700f84d2affe5b85e8cd",9.917710196779964],[5733,"836d939b1bb94deefc960f6778cfa1325c708ac1999c23e4fd1315273bffdbda",9.917710196779964],[12933,"04c763457a146bc2f9042c07737cd5c9aad92a6a038c33e86aabbc80bf4605ab",9.917710196779964],[16840,"7699a299ff1b19a8c7252f0fcc664009f86131d3955685598dcb739e9f4d7e55",43.533568904593636],[4565,"5e4c164472927b93995cadbeb65f48eb8d44e58af09866471e932d2f98bae3e1",9.647446457990116],[5153,"38fae800188c3296a23a4f847bdfa9e7bba42b2ac899f0d7a92089c246bd47de",9.917710196779964],[16469,"e7c778dbc059097cd25f632d0e7248f8a9f1d1d74ed355da132ae5e927ffe75d",9.317957166392093],[16821,"a95e5652f2df8ef3d5fe3ac8073edd7c0fa43aa968480bee8b082020957cd955",9.317957166392093],[11861,"7c21d999fe643ef2102c574866ae3e511a0fc36ec6592a5f37ef14d098504ab2",9.917710196779964],[15762,"faf15230b0108a543828bab6f8e2e3226aaf9808db5bb8f2142be2395b23266e",9.317957166392093],[5589,"d3ddc5f76fb5f8e845121e281702cb33844eee5cf51d97a5c3d1b56e882bafdb",9.917710196779964],[10614,"98e8dcd8813615fb36e9564ab2ef4e91d305875c63c75435443df39b565f95ba",9.917710196779964],[19408,"d32d2e0f2cf33b0fa7ab9af4da0f9e6b6c45781003acee9404492ad369a73811",9.317957166392093],[13058,"dc36b898ca14d1754ce21b08866e3b606f8012dd951c76d1778ce08d2baa3caa",9.917710196779964],[16599,"83dfc5d47acd6ac2a753213ff4068cbb5c617a296c164ebef88ee727c58fdd5a",9.317957166392093],[8682,"d05458962c2a5f506ffeff62fcc496b0ec36ac6504e7dc3dbce810f8c760cac6",9.917710196779964],[5129,"99ee8c0d6edd07ae556859f57174b7fc3881eebc096a8f77889143e8d3b86dde",9.317957166392093],[8168,"b80686a6b82c26b015fb05e62a8528cff0a61ef7fb98d297926120fc73d22dca",9.317957166392093],[17692,"75b79ec55fa4864545533047d971fa965457d1dfcbf5dcfd6c3cc40d1f906243",9.317957166392093],[2486,"fac8721cea27595a505ec4b689cad6f8db12e28453faf308b6e1cd168114f2ef",9.917710196779964],[4394,"334aeaf2a3bcfad0d4cb8bdeb39c2005604fed6152d8e49b6b93ccd4d3301ee3",18.11332312404288],[13628,"3c5fcae30bff087128cdd404c6aa916b380c735925a986f29edfbc315961ca9c",9.317957166392093],[5705,"b1664abaacab7ed584c65a5dd9dad01580c08f9cf6b04b9b461429e4cbbf04db",19.614973262032084],[9387,"0f5888d57901d93cb230721653b7a74fd4aed1d7cddf57f92d5ac7a993095ac2",9.917710196779964],[16230,"64429f097681a1fabac0a437af64b46447ba5498dde0544327db16da0d541063",9.317957166392093],[567,"85489d25e1724d10401126c3d5d63eec6ce99e900b1db3774299076baa2228fc",9.917710196779964],[2939,"0b2164f2973a4699da0356c24d4e23cb26f2a54cef17d74cab296fa1ffb0bfec",9.917710196779964],[18226,"51c6a54e711d4d0e47d24cb5754d9266592d7077603cb9532b233df3dc547437",9.317957166392093],[10141,"5c7c6c36b7e46bc5ef731aafdc4b98b721634cdc6d1ca74c1dbac13ccd3670bd",9.917710196779964],[7205,"57d86470c44a19c8dafccd2f1b6141f80b4a94f26df0616d170f678383a5acd0",9.917710196779964],[7875,"5ffdb978c0f1a11e6123b531c36cd719ebff42cfa9bcfb2090715bf7b1a06ccc",9.917710196779964],[13606,"1142d71ec50b1e55e7dd5e0876d4570b1e7bc1c14825a8cd422901170d374f9d",26.091872791519435],[14797,"9317cf94fb351f78b5559b6254e0d90927aaa411f0b1cafdd606d829caafff82",9.317957166392093],[15436,"81f4a3557b4e525d8db16da5a01930d8b4005289a68c884b76e1162488f76d75",9.317957166392093],[7133,"8c1dc91535589148454f6a6f9c49917bd789a749cc04becbd9aa424d9aa01cd1",9.317957166392093],[17902,"6f028c5b706d76809465a7a922e9b9c5a6771f66234f4b71efe181124be0263f",41.102473498233216],[5584,"d91d9b1c740b2a3286f6b4727567dfb683808dac0bd622d4280cc4d9ecccb6db",9.917710196779964],[4546,"ed24ee2d8d5401d443bc2968967a44be497a66da0ee18c7ef90cf53718c10be2",9.917710196779964],[1516,"dea9c8a7ca351970e52f1d55caae797463566da4c447c5eec116b40d53adfff5",9.917710196779964],[14616,"50399cc4b2cc078edd8907ace9549f1d97a5316a7ce30a0c5384d44b47b2bf86",9.317957166392093],[1166,"a731f6b9f6d9785d48b16a1ce3818474d3dc237423f68b228e2f872870052df8",9.917710196779964],[15571,"d69af85d13edbc4530dda66535eb89b6b08e4daac7866fc4a73018faefd33e72",9.317957166392093],[16454,"f32ef64c538bdc2776dff02ef814807f25c025f0838e5d1a046de781e339235e",9.344947735191637],[17981,"b717912afa70cee4b34fc0d6f4e620dd6713d564ddd002f1cc5fff43009a863d",9.317957166392093],[6357,"2b08b0096b5229d5e4d98232ce0dda7ecd827ff76e1dd7d2ddd141e2a38aa5d6",9.917710196779964],[13338,"823ded5a075062ba014e47b7f01f9bd13f5f84e2513076fa7139fa39fc75eca3",9.317957166392093],[2856,"bcd1ec8f51d059d27f0164417e437e3331090a645fc11744be8d6b8ecc1b58ed",9.917710196779964],[7596,"b0a01aaa56165a844eb3f60432dda3e8d458b0a6950d5d829c90b542f3e431ce",9.917710196779964],[5585,"801c84f205199382f8ffe930b58686b3beae5601ed12427332f81357a49db6db",9.917710196779964],[2724,"23de6a0de155231153c1d8c956e9e185adac5b0424a3c14c4fd425bbd5fe3fee",9.917710196779964],[967,"16bf61cb0aa182ce1228ea2ee522e33fdfec59be6692796ce084c8662cec65f9",9.917710196779964],[10665,"b200ee9854c2b3e3e160a0b05011e1e589cd81d1b50fb1ce63983987820941ba",9.917710196779964],[19655,"3fca22ca3dd572b8dbbefc5ae63fffb7ce0f589c4c47f52667454840f92fea07",9.317957166392093],[11743,"f4e7afddcdd3ff59f896f924d96941fd565df9fb2e1e20f6a1f236495f910bb3",9.917710196779964],[10053,"355ae80be2bc68ce4ff7f5abe253d70d61091ad9232a4f67e8b631d46d9e09be",9.317957166392093],[6280,"114d5605a6221103ebc3436d11d873c6c1e19231dd5a60a087398365d28435d7",9.917710196779964],[12969,"506067557ac5e0d5fb5fe692065faaf11dd10bf59d8e03d42682b358d211c5aa",9.917710196779964],[5266,"aac597a7c5d58a91e4b1183f9e0b104a5843e5aa37081a9d9885f913c3aa95dd",9.317957166392093],[6775,"332ffa28878e5330fb87236cc11357074ec314b3ef3a05d8fcf25f6a0afa72d3",9.317957166392093],[12956,"a766ecf3614e61dda03a4c671465084e0ada905ee81a78c10a3d84bfd5f1dbaa",9.917710196779964],[4247,"47d22b3f10a88fcefc5a95c3dec45c01d174862375a3db1314d3c0b8a4fd23e4",9.917710196779964],[5444,"aefd878fc7f6664d2980431e745385c984ba7d4e7d4a560b28fbb73a4e4f82dc",9.917710196779964],[11055,"d1ac5c9393d0b96b59e10f00d776649ebde75477b77d68d21ee71d05b83ca1b7",19.215686274509803],[17801,"43682406114d723c38293457f0f8e824592640bf9a3f4ee91e644fdf60894641",9.317957166392093],[7770,"9a60573f2b1a3b6eddee3feb03b6f34a6d90bb37dfb2059b2e7f4deeccca02cd",9.647446457990116],[4045,"0cde55c54989b8e83ff77f9e77e5799b4c938029152e2c68dfbdb9ae62c075e5",9.917710196779964],[5335,"8b628bcd3722f5b4937c414327270544fe0259fa3437dffede75efe1d34334dd",9.917710196779964],[6752,"8a09c51577f2c00f58ed8d4f9d9beaf29aa23b087d1bfa4f3f061a4bda5392d3",9.917710196779964],[5059,"0a676022e87bc397876d1db06a94e13be44656ab0aea214ffe1b6a497fc0c9de",9.917710196779964],[18804,"22ea467dd40d8d7ddc60c88cbb5f021d606329ff4fabe623a0ba147d5f10d526",9.317957166392093],[14571,"8b93e0149d9dee8e23d4fa416748683faad71d369575eb503931ce1dd7b3b187",9.53899480069324],[5439,"897f4860cb8f6c0943b6d7f8c7088f537ed6a718f615819080e3ffef35c689dc",9.917710196779964],[7388,"702d87596cddf26bea116d71353ec0a368b7e206fd0bdb7700fec848a5857fcf",9.917710196779964],[17203,"2d03e64596dad1515b41620bc9319a75e3f745f59245e0ca4f60e188720abb4d",9.317957166392093],[7689,"8489cc74b6a6680424e56a9cb847db2bed1e9d53c878e2f141d99c010ec89dcd",9.917710196779964],[16008,"a6f826c59ff89834bf8f5c5e332eed22a61ba1a0df80517b9d6eca83eec04668",9.317957166392093],[19530,"e3a49df038719310c0399afce85e8dbddd1dc4a741e97079989d8607dee46f0d",9.317957166392093],[9872,"e485c5b6f54f4cce904490e6614c9d21562c0d62f6b26a10f97c31c9acab1bbf",9.917710196779964],[5894,"7c7a7275c0815f99832444db780eb9b3bec9c897cef60f0ee2e0c9ecabffbad9",9.917710196779964],[12433,"c1c6247689e5dbae44046846c46ec653edd219c8a59c49fe8f3d0ccd6d925eae",9.917710196779964],[9421,"729d8f6c3af6edd987ebac2c98e9599075175ec6e2533d7f34c938cdc2be2ec2",9.917710196779964],[15427,"10455804cd3635f4abe1c102d8dc333a17231a80713d40815288a12dc912b575",9.317957166392093],[19858,"e01d323c9d181502cd33a9e1163c5c600267bdbd83cb3de466e7d699c55f8900",9.647446457990116],[16718,"63346b255880782a0a9cb72a0b4d14a29c36974134d5e6012423290ce4082858",9.317957166392093],[9739,"fa38c9bf9bd513522613c06bef10ed691f0526627638a5be35028a9bde0b0cc0",9.917710196779964],[12097,"990c48c2cd13d66520759e519c214eb94f4d5cec97363b800230a45cac2fbab0",9.917710196779964],[4632,"09cf2436b134acaa06be149820a1d1b60f52a3daa13b173faf5aa40bce276de1",9.917710196779964],[4480,"474e6c0932257e660bb22d82c47bad36238cc16151d250b74d5685ac0b0a88e2",9.917710196779964],[14599,"9951841f8594cd90e300b20ab5dffd571102ce0a122e0b93bfca96cae49f2287",9.317957166392093],[4525,"bf4a1564be09512d80bad301302b12ea90e4bc3c3a4a9afed8f38201ab4830e2",9.917710196779964],[18990,"93dc5e78c8a3b48888c5b045653f2751742926143a142e795c5d1d15d011f520",23.90625],[639,"a1c7c447f05ba693de98db053b761064558d2b310591e381b798948d0328a3fb",9.917710196779964],[2821,"8b1e31d84bd139c8a82e4f01cea24f4e481c74617eda2fc2cbdfb997dd698aed",9.917710196779964],[11265,"5b9569f466b3235ad13ecbe03d32a1f3adcd6f624ef08b32070dd51e27cc40b6",9.917710196779964],[18629,"47e69dc03a00d62d1fefc331082b03dd9830622ac22d1d2d51b6b4ea8558a02d",9.317957166392093],[6579,"7887c57c7b96ab9ba84cf34e1ad5be2742a049112f5a601f857d7cbbaef3cbd4",9.917710196779964],[2503,"a9797a1646a11bc8e87f27ea96faa459565db98b5ff53cadce5642a916fed5ef",9.917710196779964],[11707,"f1081a778fde628d2da4870366603082f3746ca86a82aeefea167dbe974543b3",9.917710196779964],[3025,"5d885bb9b219d1e0fbfcd0bded68766d4efa4d0562d5087820e792d75c501dec",9.917710196779964],[1315,"080266afdb55c2dfd483d48e647f553de96fd13c0ad92b74dfe28e57d93b52f7",9.917710196779964],[17838,"a2086355f2a6ec92dff5b5cd6eb0432053190761ac2eab4d9e71d74c0b537f40",9.317957166392093],[8202,"2285fc919c14e10c91ec9d6b152adc196bc91042ddbd94c32bf91c8c17a6f6c9",9.917710196779964],[2105,"7af5cca2407b49b17866995cd284a57d090ea992d9a743a80c438353162833f2",9.917710196779964],[13911,"79b750681eb0040687d670b923587bdc8bb63826068ca9b2ce6f06cbe7d4d196",9.317957166392093],[11727,"53fc5fff432392300c0a3e9cfa6f9c1c33e2bc11baaa0c1a6893180a07341db3",9.917710196779964],[1695,"56d3c343ef31e925d0f5bb89f1f3deb244d023376ffc5727d8e80cfab83af6f4",9.917710196779964],[16809,"4801137db7cc9617b0236291a6663c2282642a680f76de91526903d3d60a0d56",10.052724077328646],[12093,"9b1efb2d6a06ce5481b81c2f2457df3bba5fffb9654759139cf8c3442e86bdb0",9.917710196779964],[8873,"ed800e3c0be57a1e424aadea8fc9b78dbc5c86c9de499d0a3490443168879bc5",9.917710196779964],[4369,"c45bd75f387e600fbc983b7583272ed7a866f000830caec639befe73f5bf4ae3",9.917710196779964],[18505,"e483a4e16058889d19aae5c3dfcb365a1afc258c2db9035625345c5428165031",9.647446457990116],[9731,"86f9a4ccdca93f03c2c9dad6cfb504585b08b67ac1a826dfaa4d1e8daa7517c0",19.22994652406417],[9337,"dd18289243f04fe969890b570196d01e99b6bb11d4175dbd0eeed3943d3da7c2",9.917710196779964],[13871,"7c61704818df171d3d50cee0046188c932df0e4ce9d258aa4d1a836a4f99d697",9.317957166392093],[4891,"80432742d80cdb293d6b607c6fe5e14b9ddaf607358d32701e2f7f830ffce2df",9.917710196779964],[13627,"a893390d87622636d24b37ee588eb62462eff26df630d3bd7537ddf62257d39c",9.317957166392093],[9364,"272c6051de154e2dbb354309c3413481ee5fca3c8ee9f388fcdc67d4bc8979c2",9.917710196779964],[9586,"73b2bea5b42e7e50431bd33448f2bdbc680645e38a3aa57bc0dc5ab437ec14c1",9.917710196779964],[15917,"e8bab7d1ae599f66c45b148324d44472f767d9d3b433eab33188667638d4bc6a",16.056140350877193],[14223,"98e1295ecead447d81c2a714d71a53219f6f6b5073372ab5dee8ac811dae978f",9.326968973747016],[3242,"b8190c86fc7d7f52ecc78963fa9fcbe32a2f2e3d4cbeff5add7cb9c94ee3b4ea",9.317957166392093],[103,"31752bf6199cb6d27ebea711d044424014535d366590259b3a7c28feb3965bff",9.917710196779964],[777,"97f707f8337616c05dce33289017c29a2e5b81c4e8859b46951eb7748c66b2fa",9.917710196779964],[15890,"fe5f6296b8298c7d4c685d5af0b51ca822207254963fc388185b70e87ebb386b",9.317957166392093],[4996,"60df50082268e971a9a8072c5967d342b2d825a7f2ffe5072e4f71e2e6d837df",9.917710196779964],[4336,"93b46fcaf2d8693b766ecc0c16f19d4e76e82c96c1248d9dddbb1ca5d40689e3",9.917710196779964],[10992,"eb86bc50a73965f765af9fa3650c2b79864f6056533ffdd77c34349ee72b08b8",9.917710196779964],[623,"ba915f31ea8ab04c0980322c82d79edfa9dd951bb01e5de72aa62e75a1c2c5fb",9.317957166392093],[13966,"2ec409f2a8c7b725172d2d3b46f48f3013ad3dd65742ed6d363ae9114e25a595",9.317957166392093],[3738,"2ad4c9f9d967dbf938f3d4d2899031a9f85ad1a43344190ebeceb8db6df456e7",9.317957166392093],[14744,"f8c3c4b020e27228f26b546a1f75b9aee17b064ee7dfb1e2a637e6f027bafa83",9.317957166392093],[13631,"a5c4599196d9b004bea6d1ded3b71da043c4ff3fc41b480e80d85f50c847ae9c",9.317957166392093],[12739,"e9aedb857862af3eed42e2798c49894f3283d83d5bc3b2e3563d55f3ef1751ac",21.711229946524064],[19470,"91406df85caadbada49538c1366afb380ad29465a1b24fb3773d7e72635b6f0f",9.317957166392093],[6542,"94ae235981aee6aa122f2d1368e16e5c31846af2bab2c7b4484d6008eb5011d5",9.317957166392093],[4944,"23146fc0c2a780d9a7afeb741c4781bcabb6f3f83ffdab66383898f8f3178fdf",9.917710196779964],[8976,"1e448ee9469c715a8fd3771568899390d8de8f671d3ca7b134c0479ada73f9c4",9.917710196779964],[473,"fac6d0556b0fa1a2627330add5a45c745833b31538e56fb0de10740e3d42d4fc",9.317957166392093],[2115,"9d97d5e90803a277d6579ca790b89671242372c2d2e1ce66152798a0cc9422f2",9.917710196779964],[5179,"96470aaeefc62d8ef22c1ef7f709c7cf0df73937104c906af5c5ad99413216de",9.647446457990116],[18459,"32cfcdfbc353194c27cf96e21e7f1bebcfac5f48202acd4f83571c7a69ba6832",9.317957166392093],[18563,"d45dd5124899057c97cff90b9e813c37076b9eec31f728fa732e67cf49e52830",9.317957166392093],[7390,"e9e220da26535d5a7a01608ad4279ae938ab4c41038537d2d752b5284a947ccf",9.917710196779964],[9164,"adee059d57c10501df17394916a2928053702d02e6c87bf646d72e0ff387bec3",50.77031802120141],[8553,"a1f9cbc2fee1436ec138a7e74c34fbc3801986ae041480e3b2f112d84dc5b3c7",9.917710196779964],[12418,"a581dafe572465abc67ca67bce531ae6f3ba7daff7c99e02c808dd407a2879ae",9.317957166392093],[3100,"691e63acd7d248383a9b212a5e69893c8bc6a456b6197abb6d6939543cb5a3eb",9.917710196779964],[2811,"66dcad20c63ada5ff087021e4f2444bd32db9dab2bbded1b6db522b9aee997ed",9.317957166392093],[7626,"60dc51627d155bde752361621fae4998ffa8f1f5e66fd88e0f7ec60af2770ece",15.003322259136212],[694,"d9eb973505e2d5fda322a5cad22c570e57ee046835622850016540accea346fb",9.317957166392093],[19709,"cb715a141f70bbf9af01401a259ab0e0193f3e043542d3f089f913fcdec97f06",9.317957166392093],[12571,"f8369e97bf07f367797f8015803f52e7b02d9b2e6a4602fc4f07969b802671ad",9.917710196779964],[3977,"2292dcce54ac55d609cd6604cf37dd33d4b1a5cbbf230a96de44e1345dd2e5e5",9.917710196779964],[5579,"ab4d1051fd66f1bd0063417a3ed129c0aacc7f94619c779d8a317ec2e65fbcdb",9.917710196779964],[13672,"9ed49a34e030c9d50731caa4fa866a453050149911023464b006f92b314bd39b",9.317957166392093],[14690,"6e4267393f14b26c94b742b73e37fc5744049ec33a1b64e6bdc30df245490a85",9.317957166392093],[19460,"c3eda8747a1bc9b365c4cac98a970af99ab41c0eed5d6e3f6b65e8110379a20f",9.317957166392093],[18143,"deeb753caa43210009b74459d2b5a016d03643561b45098b650e92abb750db39",9.317957166392093],[19216,"047250754cf7dbeb4a8e8573180fc75c84fc48867f45ec181b28b9bbd34e1d18",9.497326203208557],[3505,"8aac41235409974203f48d0c69bbe961fcc130caa69c7a28377c8b1a42c4f5e8",9.917710196779964],[17140,"4b40edcd3822072f3295032359ada9db18f594138b7f86d4d977c107ba8c4f4f",9.317957166392093],[6210,"85242060ea0da290fe4e6f242640dbae9932fbb5373899a4f06c777ab9e8afd7",9.917710196779964],[13853,"809a08d9fe5db3b9446b147d394231c4f4f97d076a283c34b1ec4baa3c285498",9.317957166392093],[17680,"6e4decd3e59028c132d507fcde52795182c46269257494aadb7a85a9b10d8d43",9.317957166392093],[17337,"b1b58a781ee56bbbe9b01ef46aa5ecf0629f23fa2d78d32750ae990e3ef2294b",9.317957166392093],[10077,"35b7c4c8eaa7a9794955897be296671f9b2f712cb7e037fa21aba91fc9c6d6bd",26.574610244988865],[387,"a8796cfe8c4979f6cc44e775357137b74bb53c7063fa4ba37c945111c16972fd",9.917710196779964],[11129,"f8d8f3a4af85ea81d7928c9f6b0f56de7ec0d451f9c63649999db82b4c1c1cb7",9.917710196779964],[979,"c8f7f8abfb8b7df012718c5bc035b36208f9f2912f2445148adc2aefb02d53f9",9.317957166392093],[16185,"e915e237c41d23416185349d83f2bc16bfcaf0d8e57326bda1644872e44d4264",9.317957166392093],[6923,"8c5599caaaf6ca56835b7b14c0725b374915b3b7b10b6e5b2abe9dbd231f75d2",9.917710196779964],[16208,"64bb4b9087bc4c3d000d9eda384db90de957258a74a9cbc39add554d8053a763",9.317957166392093],[17183,"756263fa1a4e0fdd6d3977d348177e7603690d0c109830ff99b2dd34b3822a4e",9.647446457990116],[13147,"5db464b19138c95b1a963e9d1c0f3391e1bfeacf7699f5fc701c2aa4a95009a8",10.052724077328646],[16259,"270ea650b24a833d8f787702fb6916429637e1d156410dfbbebbf5079d1d2862",9.317957166392093],[19373,"1a455e87593f13fe35dccc224fd3477c66e3f1e818ca45350d7cb335d6c3df12",25.312036508841985],[2341,"46c67039492f8d223ca99ca42d8728e9cf260e0246951c709714101e5fdac8f0",9.917710196779964],[3884,"ee63b8dd264e759b793b3d40afe3053a6510609d72cfea9872713f46e53278e6",9.317957166392093],[3774,"1e10d1664410faa532500013c0d0fe0e88d491f7980bbeca3a2779ca839b22e7",9.917710196779964],[16030,"88a3db1de65007b56dfacdb23bb0929d1dce13177fc84bc5abc58b29b7e9e567",9.647446457990116],[4881,"097ab6ec01890815a9db6b7ea7e1173cbced761db83b3d3fade173e43b46f1df",9.917710196779964],[10968,"49519798395a4f2debc712ec02d3e65687b1f8a10f43d60ea4fa413c3ca03ab8",9.917710196779964],[11995,"10fe1bf2252c85a85317b3beb08ccd5837f7ddfd59b4bec81f1bc03a5b9f5db1",9.317957166392093],[158,"d69b7682ddd3f96449b4be5729e997fd247264ac7eca7bf3ae784b6ff6faeffe",9.917710196779964],[4594,"cac95f9d39fedce10da9685401c58429722e8910b6c8b780548b47d81d78a4e1",26.09252669039146],[11615,"fbf21833fe95d3ad92e0dfa7a0782aa38d1f72a5392e733f3835527f9040d0b3",10.052724077328646],[10883,"d8a4d527887e7e172faa7e2a0eaca28144183649bcb06b02efc7a0e9676fc1b8",9.317957166392093],[7530,"9961af7a99100c13ae4484605139ff6652518dc5a007f8c78fda4ee153d997ce",9.317957166392093],[13806,"aef1d41da56b922a6adfbdf5925ffae8495f42adccd596398af2c9f5eaea4199",9.317957166392093],[14390,"955ab34b7d1a5cd474e2a8c5f88c4e8360ea96743ce5ab5030366a549fcc638b",9.317957166392093],[10873,"4b212c8ed03147f6153213d7ac87cf7d7f3dddf743b91d3a2594accf1e03cdb8",9.317957166392093],[14468,"6dce684a15d4626ec4efd296291fd9f550bfd8fc49e1757bdf6c8433096bee89",10.028818443804035],[18361,"9de866a85f8b70892a84b696a033dee57b05c7d6531be63fe80b047ba9537d34",38.02017291066282],[3166,"3113e4fccc1aabb4b38106ae3c56edc152619a1782e402063fcfd75a922e47eb",9.317957166392093],[10872,"58058d75e04ab537fe05a9b0bb2c802046b080669c82865bd1920573a993cdb8",10.052724077328646],[7270,"e1823cb9b15ee6f12d421f3e337c7da864dfd6012b6750e03790517f55ed34d0",9.317957166392093],[17351,"8eef571f2bb3c159c41747d0a8e44a2a44f796668a410f930070fc06a0add84a",10.052724077328646],[19789,"324773a85f912d5099485b996392b9796609ea646f3a6b2e13995c94f1b50203",26.00780234070221],[7014,"7abd851fad80c3e2fd35cf2f2f3a06b20ce83f38fea10fd4b7d4299a1d7ce9d1",9.917710196779964],[12710,"dc2382edbf8756f874f2c29a2108f4e0c44433798d25d968c014cfd63dbc85ac",9.917710196779964],[18456,"f91780a93cd923d5bb654c646b8393a13e38efedad58e2f5208f18247bc46f32",9.317957166392093],[8806,"e6f1025f885de76555dc4c9d9c9596d425fd45cdb32c64c0fad0347abad809c6",9.917710196779964],[14375,"0a53a3e63c09b764ebea1771f1f240b6ef50a36f8a4bf54e6c494e711d8ad98b",9.317957166392093],[4601,"469073c2657c4ae247b7246589d951538e0e8c78b5bec475473341e8e8789de1",9.917710196779964],[15708,"2b6a8d9511af0f8925b023a2fbde17a78e4924ff84cf243fde7275653e0b566f",9.317957166392093],[10040,"e5223e5a844d306927560366d7cd2b34049750c555dfa3190031479784b317be",9.317957166392093],[15566,"52d0451822c5950be973cc045326bbf63716a48beeac58f542e41c2cbbf65c72",28.702222222222222],[2008,"b80038a47e2cccd6ec2ef089566fcfe5a9a714e860ab7d416c579649da29f9f2",9.917710196779964],[973,"3a73a9d4ddf7badd6981e30e74fac1a882054ddafdfba2800153b8a813d85bf9",9.917710196779964],[9832,"e5475f642d3e05aa02dec0e0f86a7d2bec60b3af084089b8c730d518762b66bf",9.647446457990116],[4564,"3654c8dde74038dfb57a8460cb9f1ca1ad2bfe99172da23d710c7f84af4ae5e1",9.917710196779964],[4687,"157957744ad24be875841ec4c8bb0f56eaf01fb79dbbfeb0239ce8bb305f14e1",9.317957166392093],[17284,"fcf3e454ad453fc08bfc838045aa757cf50e92b61ffd2402ce1b9d884fe7804c",9.317957166392093],[210,"063d741cb07ee2b293a11ae05a1409cfc33235bb46fbfdfa88e5e9109aed8efe",9.917710196779964],[10922,"7479dda6216b923af76be0e578d53b53a8a2734bdb6659d91eee54f2fb768bb8",9.917710196779964],[15793,"0173324747769ad0dc6eeaea770ced5043ed5e3b04ab940ba56c84d0c2f17b6d",9.317957166392093],[10242,"730526477e1ead85d50a3022b5a3a96cb07890a90d7eeadea4a0cf8de9f3bfbc",9.317957166392093],[12976,"53ec5c6b78c686032ce58caad6d21a21fc230dccdeee073e54f40840ec00beaa",9.917710196779964],[7204,"778676584da30533ada169079d97cbd46a75bd0a7c6a6b294cd1a64c639faed0",9.917710196779964],[9551,"e7255e5b2d7b38e2c75c000c44b9fee0cf717d0013d7becf89672455404863c1",9.917710196779964],[1290,"f5a101db62e324d6fee5584dac832a5533d81e3cbd85fec292ff4679a5396ff7",9.917710196779964],[9390,"4f8b33ffa93affef3782839b0823be69ccebe7a55d32d8f6df30ee5d4d2f53c2",9.917710196779964],[9491,"e1a2fe19db6f313469336550bc6903d4ddf653ceeeb93a4a068cd79eeb09b9c1",9.917710196779964],[9558,"7cb4b139d648ec34209bc113c16633c938aed9e52aa28da7f3b09c31b7f845c1",9.917710196779964],[8509,"ab3ebec7365a0adba4dca0b01f9d3d4cb0a3272929ed9ddca4f17c0cd353fcc7",9.917710196779964],[12349,"edee0c81a25bcb0286cc132c1ac210a4f12b1d039b0bb950fd922708fd0ce7ae",9.317957166392093],[7114,"5c926269ab0901e3808409bf3334538d50ffd0ae73911a1d5522df9cb5da43d1",9.917710196779964],[13106,"5ca142e9de8d9e30c981ecbc1f2e5b3dc4f153f34c2aa6941e404c6fc8d7efa8",9.317957166392093],[4375,"e909cdd4c0b0de170a9b732bb1d6df076314f830bee6971239d0d74dfff43ee3",9.917710196779964],[8253,"e22be637329dbb6bc59026aab5ae3913fc72ff8025a788b013fb6b02e2bfa4c9",9.917710196779964],[12330,"60bc828ab71aa7867618036adb47b67577367089ade789eaa6688b3bbed506af",9.917710196779964],[18422,"8538f94bfd73b021bb70519793f9115c8875d25b733c69339599d4cd04072333",10],[11434,"1270aa7ae64754c0995aafe3ecf733b0064bb0f5bd10ded6de3a11ef32c910b5",9.917710196779964],[8246,"8aa60cd9742fbe1d06d5d23869f7cbae4f9ba9c9f121d53e409b27b89e29abc9",9.317957166392093],[7538,"ff22a9d447d6ca6948476410e718c845ce48be1cd4bd700856c71bd0e54895ce",9.917710196779964],[2637,"37a384747325d14a51f2895bafe47f7acd54ff2c481a949c36f73a22cb11efee",9.647446457990116],[3464,"3f37618f5b05dcd0a4671111dadab5817ae3c96ebfaf60df02c15cdb876d47e9",9.917710196779964],[430,"06131b28a645d7d9e969c05db6c4e16ced33ff061eef72b03623d207b99828fd",9.917710196779964],[7063,"84aa2f8145d90fa22ceb708e0b90c175ae0920874a7028d1b9ba139c89d296d1",9.317957166392093],[10182,"d0773bfa8afbe80d613ff47f1347363726e3b36aefd878dfa249a3d1ea8122bd",9.917710196779964],[14106,"43c72443c45c5afeeae652e6519383d0e7e5e5a349cc418c6dc59914f9816992",9.317957166392093],[13859,"76f9a2955dadffb7d905823a710a3862fa4dd4e81448f7b0653f13bdc0223b98",9.317957166392093],[4545,"66856724acaeacc8710b5a7261c8f1e78140f0af04f17e021e5d3b0c996e11e2",9.917710196779964],[12491,"d0a298b04791662f2fc58244c3906143d0cf8e3356de719ccbdf51728fa102ae",9.917710196779964],[6620,"e13627484e7acab0d0d1b2f6db4e597baec2108116c57db844ca251d0c3f82d4",9.917710196779964],[8264,"4ea136620e5d471bfc69f20a071c23eb9259447c0857a95178a5f476cf3595c9",9.917710196779964],[13333,"3fb04be9b4cf412f67ab6f0c54fe3965fce6ef30d333ea95166c735275edfaa3",9.317957166392093],[4740,"19be43cea45b6188cf2dcd3a1ce1aa6c6b30706f867598f9a8a6f5456881b3e0",9.317957166392093],[3625,"1320e28b7818e5428e607fd9b46a94f520361bb2625d2d8e9e97fb580ace13e8",9.317957166392093],[8655,"2bf808a70cb6b8bb7c6daacc5a358b6e9188678aa7ef99f512e07ad79b1801c7",9.317957166392093],[8849,"b2186331c181356a79a70677b74dc1f1b8dc8c125179e536796fd7a75e6ac9c5",10.0355871886121],[15768,"983e971a50cda44010c8e083b27a3760016f7d940fe603d3c05f3f20b662fc6d",9.317957166392093],[5916,"0b39a2c8720e06d0f0ca851dd89f9ff587179f2e041c40901aa38911980998d9",9.317957166392093],[287,"adb81e9b69a540802b9251ce096a0907e8ca4f75d465fef16c8515145faf07fe",9.317957166392093],[16557,"45e56456aab34fce519ba4af789c610a289a690d0dd738a56075fe46ef08f15b",28.089456869009584],[1045,"5267f12bbb3604ec33286b9cf36e642cdf274bb169862c4f4d2f2c4ab50101f9",9.917710196779964],[16159,"c91f6dfc7d6856067321aacf66a4b0796629a05ba163fe63a465e9a41c82cd64",9.317957166392093],[540,"744c7d7cef1e5793919418b5225f325c32549fddd6957a02069aca12f66658fc",9.917710196779964],[7370,"9ec0571c90f1fb035f5b469c3b18e3adbec46b04a602ed5414930e2153bb92cf",9.917710196779964],[1163,"790deb082b2070b79f325e367c400f7984bc5163919a86cc20520ce84fc92ef8",9.917710196779964],[143,"24101a8af6e6962d68fb1e59dca64c5985eef2575c78e5666ef7ffd3d5eb07ff",9.917710196779964],[11316,"9dcd7d29d887b8fc1e1193ba6f778da78db4541d1f5c7b3c4a1c15495fa5e1b5",9.317957166392093],[7259,"f558596bad4cb7d433134aec3a3c0aaabcd4997f6deb1e87764e96ecea8747d0",9.917710196779964],[15774,"f9373ad657facbe1e96e58d4c31cae7cd7893e3bcf7388d9db05ab323770d76d",9.317957166392093],[12155,"b52d07bbd0cd4e70eb60aacc1ff92aadeb0ec6a222cdeeb4e945f79b8c1451b0",9.917710196779964],[1178,"0c711ac16267e0d108b5f4814fa67475fd121510d724bcf56133bc35253e23f8",9.917710196779964],[13989,"d8a3d3bde469724f057a62157c2acb4fcf4744c7494cbc9d73dfdc7b55f53095",18.032374100719423],[4390,"7b1b38e9680c3a1ca0b3a849437348cdf8b2deba59a5cf0edaf00ca7002123e3",9.917710196779964],[4114,"8d003fc5460bd44a1bb06a045ae6d6a0101b1e909d67525a9df724f72131f4e4",9.917710196779964],[17697,"836881afa8ad514613b7263c653bd7fdbfaa9866aa1f7a40e2ca30a06b814843",9.317957166392093],[19575,"0a223d0891f222f3c023daecb00daaebd19d0a08b5ea424c014f28699e4b5e0b",9.751351351351351],[4380,"ebabc74744366d303edc96ddbb01eebe6095e09440e5117827bf71a9b9ea34e3",9.647446457990116],[14032,"914be8a44e982542add374559fbc6eb98cb431c1d4819a2ea70f33f668c90294",9.317957166392093],[12637,"401ff376c4e8ad921db3ec4173bf384982fff1f4d604a75aa5d8d2b596d706ad",9.917710196779964],[13443,"8da82e8c146b2213da5de5bf9bf6bd324f8170945fd00f781d0519e320063da1",9.317957166392093],[5581,"f0c9c9f4ac639996ac305b53e9f52719ead7ea01793c27b7fa87657f8a0bb9db",9.917710196779964],[15720,"dddd9b0f8d08cda0cbc6b042ad8754b09b2f458f80c1ba51daf29894c6600d6f",10.052724077328646],[1773,"c2d6c2266aeb410d88a13a8d6a0186de7494639bda97cf154056c8fe99076df4",9.317957166392093],[7497,"4e27313cb721e3a4df5910fe959cea6e6cdc55330d3c14e7956758dd1d68c4ce",9.917710196779964],[16000,"ea120f45d79e3f16732b86058b05f9fa882d0ed0cbb32764db5f926fd62c7b68",9.317957166392093],[1061,"a093a775f916b3fadb25a7bfe988c4e09d554539d8dd1bdba1b3871fb36ddaf8",9.317957166392093],[10011,"3800ad77c183bd27e826b3ee739f6f879683becfdb4a7e6adbfa0b2b77ef41be",14.188948306595366],[9869,"0f8d915185b24b39ea6bda316fb20140fc985eae415f475048e1445f8c8b1dbf",9.917710196779964],[12448,"d221894076cf8739b71a0b36be939da2d4b2e16415997d002244600ba4394bae",9.917710196779964],[6295,"fa487140e3ffa2e23274be67d2c64a49eac1a3ef6fda635aa81cba33778b13d7",9.317957166392093],[1964,"2c983444b9c58b32dfb2ba57f52f361c153576804caa04defd91d68ce95d42f3",10.052724077328646],[6865,"3c6d41b148bde3c13022b318a093d63be1b3d64d2d48299e5ea7a8901a6dd9d2",9.917710196779964],[7412,"ccc63422c7e3c118165e30b150819466c53940ba0299b27b84a8ce4953924ecf",9.917710196779964],[4101,"9bee0ff02493a53a6c62b57e038e1de0a476f2cc0153ae192bd92288b47d10e5",9.317957166392093],[11062,"33e929d9f8bf3e5385b219ba124ff296e28343a1fd99c988f3bfa92308e695b7",9.917710196779964],[17479,"ed3204b4471da20bdaa498cbe04840f64db92140a11bac5ea7a169399f041f48",9.317957166392093],[3603,"4d6875c795093174b50f902590f534d11e60716d5180d929d5fb364be4e032e8",9.917710196779964],[9353,"ccd35c767c383475591b56df87575bb9ccaa0e6368e896cdf948cc64aef391c2",9.917710196779964],[11474,"d537ae03a8da16bd892b06f75aedc0598ca0e34092d4b130417a3d31c193b0b4",9.317957166392093],[2626,"e1c3b5a1d91bd7cea7eb04eb1302e697e633f0616a8c64fc2715540ce04d08ef",9.917710196779964],[5750,"f3441d85a15eba12c0303aacb25e48cfd2d8ea5005d47c202537b2f0a3f0c7da",9.917710196779964],[13451,"c0476acd964ee5de4ced7b07aab4d7ba2955f16c0f26dfeb0efe7cc8901503a1",26.091872791519435],[12947,"194d191b47d177e105735facc8f7e3f11eb2665543a5ea3c839811a7d775f0aa",9.917710196779964],[389,"557a47a7fdb88f1d7fd6e1ab7152a9ae6c3ab12ae3b682dd79a8ba795d046ffd",27.268022181146026],[6993,"5e357a2ea7f3b79b044a060c0209647d041d47e015dd481ce1276575e9680bd2",9.917710196779964],[12768,"7f268c9ee6712d040adf4f05fb1ed9e4af140406537eb8e7c6f406c451d11eac",10.052724077328646],[11284,"efa815f76c2552cfeb5d5a496a1b375e62ae637f79bb3a2b00e9644f7c6c25b6",9.917710196779964],[12721,"cd1887f9b4ba41274522a202425cd51826e65a239933b30936af3ae6a17f76ac",9.317957166392093],[16393,"923e330f3d567fe103a3cb380b1350a2e5f9bab11875f072d40415d01c7a2d5f",9.317957166392093],[18750,"35b4071a41a33bc7b8cf11d23601a328fe61dda2c604aac36f646658a4619828",9.317957166392093],[7654,"0798bc03602b5adfd6864c20de6a486427b2e86e240b008ea82ea1dcaa5adecd",9.917710196779964],[6332,"3d4b60383c8cb8ef66f5d4c063973aa0eda1629b2b0ec7244fd2cafb348dc7d6",22.278026905829595],[1710,"4a96e3400a88cd48d09bf957437a42b285acf002b9ba76b6c7550418d92bdbf4",9.317957166392093],[17473,"762f1af32a28b353eb1ed7da9ef69c01369fb1497d0f6f649ea2f44c5d8a3248",17.073593073593074],[8555,"cdc824140943ac498fe5dbf71c8d7c7f915b92510dbfe0b31ceac8a11009b1c7",9.917710196779964],[416,"9cd35e0b6d557e968db41eaa3e7b7f75751f4986c478b629a2a551f3c0a845fd",9.917710196779964],[5995,"65329368216565cd3b88b4b49dec4c75600d9f7a5d38fa25819e4ddef7b818d9",9.317957166392093],[12339,"c94c02a0f7e919501113ddc0ddb93791c7e301a5fb229bbd7cae3399bc91f1ae",9.917710196779964],[7442,"6c1f7b7b4cf75cb6fad3f3310f2bf1a3eca44bed4d95e31a4c2998f448211fcf",9.917710196779964],[13457,"6c107f9828dccfd67c9bb9e86e56f41be81bca6b415d87589730cea3b172eda0",31.52797558494405],[19031,"0d1315bcd872922373341f547613c30057878912bf10fd497ed8fc925d7b931f",9.317957166392093],[14852,"d258f8fd8bc76c81e601a173138a2bae46ec91a10395049a23ec0a12129eca81",9.317957166392093],[5447,"f95e9986f0526fd0ee3fc8302027b0d391a6c4b42c8f3163bebd2aa5cd507edc",9.317957166392093],[8163,"d1e31f6fc3c8084a2a5c7086ab027167b43ce9bd06dd6e3f4a2071a80dd53fca",9.317957166392093],[1985,"cde2ce5a95697340de53f769f43c8301461d249f15d4cb24ab7a835a88a818f3",9.917710196779964],[8250,"605be24a464f6da431a7f004a8f1435a2d50284b7a1dc80f547a00b9726aa7c9",9.317957166392093],[13626,"75c3c8fb0a731a0abcb988ceb7814cdc457dda19410a739e8a8970a3ba92d39c",9.317957166392093],[1732,"2c3cca3013eca3b6164a8f45701ed634bf217a5da8f92c69d2afe7976531b7f4",9.917710196779964],[7244,"6ecbd57075b87bd8f594a5b93b4b9821db3132128f95e6e1554e0939d8b96bd0",9.917710196779964],[5319,"72b108402160a4ce8e5ed75af07e6aa8018701701b0a948b94994e44a8284bdd",9.917710196779964],[14673,"08890e7e3b06101f690b41e0a152e59334ec1ab262b8ee93a864921c9e056085",32.90619469026549],[6382,"9c1657ba5b928caef4b94ebc3b59a17b32c51a461700dbac448df6599efe70d6",9.647446457990116],[14581,"244271a3ce3d8fa596e9e871eaf2268f99d8ef7c9e9ea346618a5db2e3c57887",9.317957166392093],[7887,"9edadfc5cc50819f3f707ad30e713c5b7e8565d6d8fbf9d3cd4bdd67200c5acc",9.917710196779964],[8549,"b4d868e41416b098db8895e397dfbc1a99100060af1b5cd4bd7445daa689bec7",9.317957166392093],[13941,"bdcf325f9907be9b5f55d1da4b3b81a84ee742d9305f39cec7f8acacfc1d2e96",9.317957166392093],[12596,"f7eed697b3e19154977754563eb1ac6657934ca70ae614ef9957c125ab764aad",9.917710196779964],[8991,"46736b7ddf736fd7ec45dc171eef106cafd91787b08712dafd73ed680ad8d1c4",9.917710196779964],[15191,"1cdc614ed168724296fc236709d415dc9228bb20120b7f89cf6fcfe269ccb47a",9.497326203208557],[3075,"fac9c5511263b0c7917b4cb195d00065d1c175981acfe1211337f7abfc00d0eb",9.647446457990116],[13939,"eb4bff3b5a85b79a7a6a7633ae8f2774e56f7810a7727bb3be82d5a5e8c43596",9.317957166392093],[10673,"10f052642d65e605b3ef7d48b3b861365be21e15426e94667029d82091c437ba",9.317957166392093],[575,"dd280f786230cc9bca42a95f7041cefd37d9ff7a8b81d2f42492474c064a19fc",9.317957166392093],[7296,"92371b6bd9a9228c09d87afaa1bdd42f238cd96990581d58fc91e108673819d0",9.917710196779964],[14692,"88896a7f7afff118b8a6866de053622515bc55a62509913a8afb4a69c6d30885",9.317957166392093],[14145,"2dc4756ff9a9d4b9e4877d74ae1384058d834a7001ffbb368e1ee1c5365ca691",9.317957166392093],[18396,"2c7cc1c30efa2283c0ef51eb302a8576aa047b9516ac64e501a5cf9eda987d33",9.647446457990116],[961,"943f5a6af2d67e9a747fd7f57470c040b177376b7dc5f68b5c23f0bc41706df9",9.917710196779964],[9969,"5e884dd1914ec12ec94a072d182048a62e9730fe0f353cf4e888574ce45881be",9.917710196779964],[18113,"bd03c1617881d5f2d36baefbd78b604528eb90eddc7ca42b73122260b1509c3a",9.317957166392093],[1346,"673c6fd4467bc9e4599138cbb64c17fb80d8bf85abc98c736c4947d266f017f7",9.917710196779964],[2673,"f0c46b06f223c966d19213d90fa460d0ece654efb229376e5e9c78ebc77badee",9.917710196779964],[9920,"7b324152270a0bfa33cf1cba92670fd7fdc887790c4ca3abfc850414c092d6be",9.917710196779964],[7553,"fc44cb15a9aba3c6008e203c7a3abf54988d93a1448213dae7278e30388779ce",9.917710196779964],[3295,"836a2e505a95bf298dee0847c1f1e7a8922bf72c7a7776e462829824d98a6eea",9.917710196779964],[14251,"31169852b1eadf66923b45aa28098db329277400397efb7f23dfa918da53f48e",9.317957166392093],[6339,"2e8a44105b3e32ff600df3831fa454d1d4f9b8e3978f1e0fd1c7478907a8bcd6",9.917710196779964],[16834,"4832e68a2258e6b1e0a1335b6ed4390eb8d515f13c4617688539cef64666a355",9.317957166392093],[9944,"87c41ffef37388ad96e09923114cad22910e99eff86845f89d8fa7233136a9be",9.917710196779964],[3663,"1f7dac1fb83aa6cda5c71884b2505a35f64ce71f840bb4607f8e4f1bb659d8e7",9.917710196779964],[12321,"9c30dd59411536700aa5a7875e71913c5a1584bef74a8bb57538f5bb486a14af",9.317957166392093],[13049,"8f197a953fcc257272eea4b8ac5e1dcfe744b1486ce0ea952e854a1e254a45aa",9.917710196779964],[13582,"981f0c685cf12b6a0ef89ed1379629855a702a4b5d3c24f6863523fe5968da9d",9.317957166392093],[12001,"c2d90aa9ac42f5cafef342ac4952f2d7ebaa9d0e9c413e674640f6be87684db1",9.917710196779964],[4500,"e52a19ce55e337affd11b9a0714e9662bc8d9cd685d2b62173c6bdd4fa0668e2",9.497326203208557],[8432,"be4421f9f23ad3fc92a6d63c5b09d62c227b28e478a4e4d3e5d2e8fa932271c8",9.917710196779964],[5741,"740cb9e871ad6e0023132abdf98372d5b31c9e6c4678d19c7f5675685df6d1da",9.917710196779964],[645,"9cc3e5f40426f643d24a9f859833bf5a40456bc8ca3012f84df71d3cae109efb",9.917710196779964],[16364,"96204ff29e8afb92af71fd11c70bf5efa0f12a10dd5854cbc2836544e69ccd5f",19],[4969,"8cf10e82eb92fa3bf26be69be0c820d352329bca40a142374d946249c40366df",9.917710196779964],[18872,"937085446a933913cc055bb7268f2fdcfdd9e44e3aeb7d446b5ae2f1cfc25124",14.074866310160427],[15570,"3305220589eb96e009e2f8610ee58aa7d61d206bc12eb86820933e047be43e72",12.01410105757932],[6800,"a53f6c3a30651b09e76796c9f75666c8f13450feb48ca11cc61776b717f746d3",9.917710196779964],[19304,"a502a0236137178a83e383dfa9f58143ca04187d320e3d93ce05c22d2837d414",9.317957166392093],[12747,"f1ab8ec956d9d5413d7698e9e661b67e8b92918b0397270f92f0d15353d643ac",9.317957166392093],[9476,"cb53cf90e37f6be7f0026d87acb8c6ee1589fe09060819446a8cd8380ab2d7c1",9.917710196779964],[13048,"dde4dab45508e7ec8992783e7dcb5d66a0abb3c7a7ea09bd5e2c291c83b447aa",19.09375],[18841,"213fd267c985296019bcccaf8be48d17e01686c4a342d0b06a911d5b2cb16825",16.40421052631579],[17613,"f00af316188be9e25e2dafa6e41c60bf3650a27aae4071b4117081353c34ee44",9.647446457990116],[16183,"25b0535bdce40cf2f5764ae9c9ea9ebc8ab5a5997c94aedc6c30f8e393104e64",10.052724077328646],[8973,"f4a19f9d0240280d37fa0c501de0c60cecd8a3ef4a65c7d874ffbdbcf983fcc4",9.917710196779964],[19810,"a32f214354e996a3ba60d4ed91019d5c79266dad12f2b98c25975deed6b14702",9.647446457990116],[10963,"24cb5db8a282b7d12f82d8a61981bd333a14537577608d53615894c5f4ee3fb8",9.317957166392093],[2861,"4e1399cc7374c05c0202da7ce9cb62ae1a5bcc8acd1b850ecddf45809bcb56ed",31.043630017452006],[6095,"b0e4a68461a0e7349d4cbbd621ee2e7dff02376300a1940b0352424d35986dd8",9.917710196779964],[17986,"3ee8913a59532d7facfadad89ca1fda152cc4858363a5803be03eca99928733d",19],[5473,"43aceec8a9d665a8a541da12b21ed9bd5d1d357f2ef452537df9084bec2061dc",42.36397748592871],[10952,"d6083a3768070d813efaaf2c1a021042f4b55d83e256382f25fac0a1e4f053b8",9.917710196779964],[14549,"0a3941cc4369b91a066ebe1738dce7abf9e41b3b373b47c2dc9d337564692688",9.31958762886598],[751,"343cf6df442fb9648a809a54b935844248fc1e9f56642fa55ae962f7da3de0fa",9.917710196779964],[2413,"d3fcac674bfee51fcbc669020b63c357ecddef4d5263f5035c10ff64abea5ff0",9.917710196779964],[13015,"06f1ddf4ab3bdc903c45cac75ed861550856cf356b11af20e9d89140dc137caa",9.917710196779964],[4719,"de967c57995a0c2f5b1e0aa6d6351c8a9ae826d1bf8e85ac18f6c7e3736cebe0",9.917710196779964],[9303,"7be70abaf461e3a96da3976e94b5f560f78d882e68e27cd978bd0f23b26fd0c2",9.917710196779964],[62,"a1890bba99258b40d1d0962b0cf791b3df35aef628fac777bcea22c6c4bd91ff",9.917710196779964],[12010,"98d928ffa7616dbd97f8f3f1a7b4e8cc6e80734bb08743667d5d83fa67a642b1",9.917710196779964],[2682,"d88ee7ef088e84b8d41d7a3e695650285822b8370ce7e253d398ad92b8f29aee",9.917710196779964],[5151,"2242bd72443c13f20dab74e90e62a93eeeb060f1b15ac329bc247fc369be48de",9.917710196779964],[1886,"f8f34e89a923c40bc43b320f8677c424d2fc04a5bb53fd6df94abdad9fb3b0f3",9.317957166392093],[16931,"cc5e09ba45fb4ee5c8a0421402443b57a7d2be23b365036b89990b7f2da47653",9.317957166392093],[2903,"4aa4de3aeb7ef1511ca29415ca01f832a8a2b1dcb8f689794aae963838311aed",9.917710196779964],[10811,"849e5894324d14ae146e39bbbbd97a113e7c41c901025d2a5b8ccb5aacd335b9",9.917710196779964],[3740,"89f48c01ad47eb05ac046c16f6f840ba8949f7e8a0e30da8022e94035d444de7",9.317957166392093],[4974,"842ea1a4d7b5f73467e3dabcccbafff45e22b192619f2e0e6992296034e95adf",9.917710196779964],[19007,"0cbf632e8e87825fff3048a25e9952fce55dde016e877d8d838b6054baf34b20",34.026415094339626],[915,"47c29d8b10c1209392f77f834c90a789efa197c08833c975e8fc0df79887b9f9",9.917710196779964],[2943,"71461a13e78a1ec070bc76fac1a82f822b76444717e9979951b0d488797eb9ec",9.917710196779964],[19264,"3d64743d07077312355817fbc5ba039c68f799c6132698453f40897ab3b32016",28.19047619047619],[18674,"3e9d295cee6f2c59cae667607bb8efc5ec2a444bdfe62cf53df3e572d8bf922b",16.04359673024523],[2421,"a5b5333bd9be3ac942899ba9ffde855cffc14ab9ec6a2eec134ebec5f21456f0",9.917710196779964],[4541,"7d52987dadd8fa1cbad205dc63372d0c866b3936d8103251f44cf791c5ee17e2",9.917710196779964],[16535,"fce22b2249da8543e6a8eb21d9ad87b6245f9c4da896722f3e808b127f33655c",10.052724077328646],[16523,"d0c8686a365578d829b57ee6b535a30c9521afa0a1e8cf38163a0716f656995c",9.317957166392093],[15142,"03f3c5232127a12bed2e2a59b08a754f5c5aa2ef6725c93a1bac187f171cb57b",9.317957166392093],[4050,"ee0d2ab507e99ec404bb959f0175f72f00ee03384bc493f32b84b23aedc571e5",9.317957166392093],[680,"5c43eeec5d627c5615dd7f702232688bd2444789a4191c44f7133c95edb862fb",9.917710196779964],[16466,"ff6f66acb288a6ab89631023f0a2d1546ed1cf837cc7dcd59076663c7fb6f25d",9.317957166392093],[16027,"028188e0e2cd74f06b508478091fc7bc75f849bcc28f99afa3be84ce1b6cf267",11.10477235326385],[7471,"de91fd206cc759e6727cb9f8720d22d5d4a0fdb374e5d073e9e9c14bc431e1ce",9.917710196779964],[2530,"4197fe0ec6383171456a868cbcaac86fc118208934d2c6ec0d4381c86eb49eef",38.98932384341637],[9759,"fbf0109cb990435b9315997e0727dec725506491d620323834bd7c2e8995f5bf",9.917710196779964],[19272,"4c067593fc2445b5fde4acceea2afc8bab9a922adbd5403ad51bb69251a7e115",9.565217391304348],[14381,"fc1595fa80414e7d47ba1e9b1944aebc70ff256a9244a513e9febac143f6bc8b",25.97245179063361],[17226,"cc9df64957bcd9c69aa861bd674d38f3d914e098ce5452864e4c6ecbffc2604d",9.317957166392093],[565,"570aa307b5f0d2d1b7366f8c8c96050aaf4873fe4ac462517239847097372dfc",9.386666666666667],[15829,"53177f5715c4b1ea1e20ac5631e6518c2ff088ffc953ca45fc6c0ba9e992ca6c",9.317957166392093],[10908,"284dd2303164ce564b5521bdef0b186be6e414852d3bb442e8a08e16a06f9db8",9.917710196779964],[3427,"fc0e8ec203835176494d1e27eac9050d104ea7e1709af2b562aca51ec2637ee9",9.917710196779964],[15530,"10a5899e80818d582d664ba4ccd572fd3624dcba3d0a464f3899dfbd4bf65b73",9.317957166392093],[9354,"2e8245858f5a2fd9660c0b67bdd631a0e424fd2f9bc456b0580a7d9229b491c2",9.317957166392093],[5786,"66ce638ac01f8eac4c38defba52e4f3cfb0e7142bbb6fb2394859efa3b5b7fda",10],[19838,"973d1b10e5b4e1d607d0de6b59057f42dab1174e68a72867fcd5738ff4023201",9.647446457990116],[16374,"4b3db96a75c377674dda754c194ea2d1d8f322520ad46af4a376a1663f36995f",9.317957166392093],[3677,"f4f3351c13177f3f8e1d4b0629e1c39ef2121b346cb848baa10c3706ec0ac1e7",9.917710196779964],[8891,"b0302163f29f3d49958163bf0d741e6a68684d446e0930d5edff1478c39879c5",9.917710196779964],[14971,"16b4930e787f93bd6df62a807ee77dd7bdee93d3e89ac200a0268781d989337f",10.052724077328646],[17939,"dfa90167bb2ef367604a9d67ba655e0282e36279ff52f6c6dc8e9352035d753e",9.647446457990116],[17573,"7d1824e3c21b8189e04eab0264b876108db53156a67c73f211d2af10f17ed145",9.317957166392093],[3027,"5e21a4d20a51bbd382454e8abab083f6588a86164333922b5708d0b4f9531cec",9.647446457990116],[19685,"22d1ecbd46a0dd00f792f55277e890784f569680a7c8856e038f764e72642a07",17.048710601719197],[5708,"8f2891460e5e0c49c17489834437e06038eb722b0423ae374732562c3f6d02db",9.647446457990116],[16116,"53b201dfe625fc699e0c799271a4d8bc520d46d9ccd645b1a0d63cebf355a765",10],[15441,"ebb1eacd00cc2c046e51a30b8da59ecc6ce3a244310f0fa9c84e1f53ac3b5875",9.647446457990116],[13357,"000b57b42217d2bbaf7c6b90ae48a817daac0aae0221a9aa58e4d697652d59a3",9.317957166392093],[150,"1bd75f009ac485ac170fa918d3a1d86defa4f6be979807075dab76753397f8fe",9.917710196779964],[6672,"499cb38a209e5530f06dacbfa08cee2017c041752ca03e3c2c1f3b308d652bd4",9.317957166392093],[11150,"54477730dddefe08ddcd386a34c9af80c1ff80bd8a08cf4c2b6828403aa1f6b6",9.917710196779964],[3718,"68e1eecfd8cfb28d0bcf41a659a359e30e98c088aa7c1273cad94a77e6517de7",9.317957166392093],[7085,"e620fcf764945d89a4bd2bb3c043e9537ed306e5d77d233408f2e5e0d3e26fd1",9.917710196779964],[6878,"49d504a23be76830ea20f0b9f7d027870514ff248b7b875ac9c2bda16e84c1d2",9.917710196779964],[12090,"d885c165fa54492eeb0a8c3332e6e5487fa944226cf770f0e772fba7b257c3b0",9.317957166392093],[17576,"b9e2d5ccfe4fa2049e96d3ea46a07c5d26879277f70c9d0dcfea327bad93c645",9.317957166392093],[1509,"afeadd3ca0490079dd0e3c5d1f61464734be84afd7392f18bc3fdec88a5210f6",9.917710196779964],[16693,"9416ef580be575127cdef6a030d096b03b72cbb53527f298217c91e640d5ac58",9.317957166392093],[780,"47cdf1e2de52c6c3f723b6c2dfbd95aa3267d9443b34a10244458e8fa9b5a4fa",9.917710196779964],[1760,"de55666431ff8ba56f90b8fe8e8b2869a7643ff55cb9c803a76efe607c1e8af4",9.917710196779964],[18781,"860a9ce4d1fa0d3998e901c5b7873c9fa4fdeea9103483b51efb2e3064b4a627",10.052724077328646],[6951,"2fd59f710a2f07de4b5157ed16bb4efb2b884037a49605ad7d2c473bd1e540d2",9.917710196779964],[4067,"81c1f28dd359417d81b8118b5b7d3635d05e685c996a57f0299e2acd27d84fe5",9.917710196779964],[7927,"36d940594bd8d01dbbdb8f262fe387f25658281933ea31869b1caa6a6bf90ecc",9.917710196779964],[1345,"637da8029d894ec8c0469936d5e565dcc17908da75f78772919a3875955f1cf7",9.917710196779964],[7449,"fe54515853f19aa29edc15ff2a12e9db7f337bc9c04c79f05e7daff1cc8916cf",9.917710196779964],[11817,"b528e94d7459f38f9cff07bf61e59fc3076650b3b4fb3261e783ec17c1c098b2",9.917710196779964],[14373,"91a39c57b727040fab60a2fea6e5e3b15484fcb0921c1196e3071b1aede4e38b",9.317957166392093],[1548,"c3def995791fdf634ca16a5838450a90636a556a224321efc4e18c204a8bd9f5",9.917710196779964],[12007,"9cb7ff39cfd68e93169e7d0f94a885e7072e24d0164491ed92f34355641646b1",9.917710196779964],[12308,"7f5b2d4a1c9772fc4f04ae5f2915d96576f8f6f72cf50337195f68ac61fb2eaf",9.917710196779964],[15167,"a03aac252086ca49d25b195fb37c8b7662ac005004f89ccf92701477eb67227b",9.317957166392093],[11155,"dab461dc5e0c98f24acef633665236a08c82836c4c465e1a9bc17f97e975efb6",9.917710196779964],[5551,"9432db7539c43b95578d5d37c81ae21e019d4b067d8b3d2e744ddc0e639bf1db",9.917710196779964],[7925,"e698f0fa5f950e89ff86694b6194c961ed517fe1f4f64059c3ce4b8220f411cc",9.917710196779964],[1852,"edf2ce228902536059f23f70c76107cda1fb0fa00aa5e987fab25987d4eaecf3",9.917710196779964],[10724,"55d564b5b7d37c90ac12b0f6169ad6ad02ce4011837c48b217f9f320028ed5b9",9.317957166392093],[12883,"ba523184e7c7a7a6f3a7dc53be7851212eb063e98a78d5168bc25a6046b160ab",9.917710196779964],[11717,"7e527b501df7f6d56b2872db634cf25299ecfd203e6a9004d1425799ace834b3",9.917710196779964],[18519,"69634fd4d38e126f8836f0ac463733c32eb0942d91528e902a49db17451f1131",9.317957166392093],[7794,"3b98c4b199e87ac920851718ed1295e5425af0f21390ed49eaead5ec0df8d8cc",9.917710196779964],[10197,"7df5e359d4cfd78a8eb51df97bff2210ad946413c89f27cb9d644ad0260206bd",9.917710196779964],[617,"a7bb06112c80550bd285cb45f3c20453f9b2ef2b851da307c62b89313f31d0fb",9.917710196779964],[8217,"6dff841a773a2ef1ebab98f256c488da7851cf753bf907c27d25c71060d0dac9",9.917710196779964],[13762,"07a7582c1b60e5a47a19bbcfe34241a71174def9c42d38c5aa42cf897799189a",9.317957166392093],[1591,"6573db0cbde15e84317807404e23c9e1c8ee351a325c117312b9e5be44f398f5",9.917710196779964],[3864,"dbcb0b19cc1abbac05c1907123592cbaa7d0fb67520d55a6c29a999f779395e6",9.917710196779964],[18194,"daca17b752728b47f5fba3a3f5556dd06691d381575a24ba1351413d2adf5438",9.317957166392093],[15110,"84fa738a6e8bfe1e390967f5639340cc7435dbfac1b2fcbd2c02ad02a081617c",17.013545816733068],[6262,"041097940836909ca6a2e011990d77a21ed2a9305e760f85236478cca0ba53d7",9.917710196779964],[5878,"80cdc60a4e93fc874a8fb1e9dba1465c340f94b5b19a6c350a2c7796004fced9",9.317957166392093],[19848,"cdb4d8e0f0624799d80b34b5e26e5c543a26b04f4c561e37cfe265631b4ee800",9.665960176250767],[19032,"2744191165caf99eb82eafe9f68e5a2e471fcf5c724ba5f05108ed5fef36871f",9.317957166392093],[6021,"dd99966940d533969e966b0d5deb487d3761c5cd7d5726a83157da9b017ef0d8",9.917710196779964],[1226,"699f68bbad688bfdd3745439d8f38e008165c309bc067f008c7c3e8409d1d9f7",9.917710196779964],[4852,"30137f63fa58a5244ae5a8cf97b82a6bcd404a23d94ba5b8285363e1ac7a23e0",9.917710196779964],[17160,"34e0832aba198210c53b22b1a6f7aa720c0cb5a55c25b7b2eb8a3c1cc100d24e",9.317957166392093],[3207,"dda65ae988b4d064b4e2ce62eefef01f008ec34b9e1345c0bfe042f56855feea",9.917710196779964],[350,"75aca8f67c39a477889dcbdcdeb828a73a0a6141460bbff0a645168b3011b9fd",9.317957166392093],[13285,"443f0072d6a408a20a6fb99ca02105e21d678859c6c5a03c8b63c8c3b9f7d7a4",9.317957166392093],[1436,"5529cafefa2d38cbf1d87a5f3b14cc56da16a353838e99a302505f1d431499f6",9.917710196779964],[16832,"50845ec3e32381e70f380f24eb2c8e10ceae7b6f3b94eba1c89cd35a499ea655",9.317957166392093],[8032,"c799f18f2e08771fb945778dea38f85b202f331d3416ea425540349c66d75bcb",9.917710196779964],[17060,"b6bf4f5979febf31fa7f2e462f1cae59a1dfd6f503ab60407039de2c49ebd650",9.317957166392093],[10542,"d8c21aaa708e4449fc2279d898a406bdc43cc9a855dd71f30b86acbe4015f3ba",9.317957166392093],[7234,"e341b5a2fb6013a7c9ee1a774a6483524b5278bc17322b842da2124960997ad0",9.917710196779964],[18948,"d434e39ae4e9ff4f101488c8dba830d24591c89b7d731c9f246aaaf606033222",9.317957166392093],[10038,"88ef9efac2235ba2af6f5af9e4bf532722631142b7fda0fe6767ef5d353f18be",9.917710196779964],[10154,"c68b4625569acaf4f81e4aa6efd84d547dacae9598bcc3480b8411ac70925ebd",9.917710196779964],[4333,"ac9f8745dfea88d147f493eb850a2f5d4a0c70ac0e26793afc35db3d09278ce3",9.917710196779964],[15402,"e96301455ad0f1da46be9b439d2a4e9c225d2ffba3b669a38d1fd4739bc24476",9.317957166392093],[3766,"ea54d37929ee19aec452c30f0838db7c66ca01e2e43d14b679364f23a96b2ce7",9.917710196779964],[10160,"8c5dc4471292193f58d574bb3ff17f3801bd0ac7e9b0c2dbec86b3ea682e5abd",9.917710196779964],[1819,"c8a85a3fec1f420d5f5b3a6188faa7aea5dd045b5dcf554fc438cc0a37c720f4",9.317957166392093],[2558,"de03e60d1b68461a555b95ae34073cc6cc8023e46cf8b36db3b73acadbd57fef",9.317957166392093],[17747,"f5ae46ec0279d10e61ac57d0f5f01f7bdea24f993baba07eb6b119721e983742",9.317957166392093],[1800,"8432c7b1dd71dd660aa5941def7f9ec7aa2219deb57d361c93611b5bd4ed40f4",9.917710196779964],[4194,"2155d00c25fa99f07d74518f876fee5d1e489bef3df50ee71e899fabe06a76e4",9.917710196779964],[11079,"27c2248fe0777c15f881948f5b7dfd6f1a0187e9c88e7ac3936a19ade92468b7",9.917710196779964],[8475,"9394fb36be59315853f9ce96a1d6283ff0bc3a2b97fda39781fcb0b5979d2cc8",9.317957166392093],[6531,"7d1f6f4df2c2355420899a06fe07cb511dce91e504ed0b585ec0282e3e7e36d5",9.917710196779964],[10283,"44780920f4b5924cc8ecc68337e679fc207085c547b8948750f6bc5dfd6b81bc",9.917710196779964],[16979,"ddcd1ae02f0ecc523216591025f3e1acdb6302a2f2e438edf56c144f3a5f8252",9.317957166392093],[4097,"a5a4b03a7eda144d5eb8070e677901c8dfaae73dcdc880be1c3e8bdb70b113e5",9.917710196779964],[15819,"ecaa0ff092f8441ab05694bb409ccb9f713fa13c55bd0f0aac76a67f2f64ff6c",9.317957166392093],[12652,"17a51fa5e62d83147b33133d9aef2b66b17aa6e53be3ad7b546f350060b5ebac",9.317957166392093],[10189,"e833165c99667ff806cf226825fcd3cbfbec88489b0d27f3a6b3e3edfe2314bd",9.917710196779964],[4961,"79b40600a117bf34a1b2d335dee957aafad0f55e5824a33f357480ea26067cdf",9.647446457990116],[8006,"ea13907f18bb22f9440ae7b7a097d5d82dcde67f9381657c11fa8e05713f7ecb",9.317957166392093],[10981,"91b5319a844f1e8da3615fe83fa2239538105a253743393efc0c15c575b929b8",9.917710196779964],[18702,"65511f338d74dcee088420996b75dfa84cdbc0927c758d46f36212a6decf3c2a",9.317957166392093],[17050,"ed4f2801b016a981893570740a42ab73a49cfeaeb42a6c9edf1cec5dd6091851",9.317957166392093],[7955,"8bfd1f9bc193a09ff7260acff36a906403248dbc42e379f93d29baf7ce8bdccb",9.917710196779964],[9261,"59c0f342d33e8ec96b544d3b454cd40ca28ee7287eac4fb45bf7f236a33213c3",9.917710196779964],[3761,"355270a6dc46ec1cfb678b786e9f82ae4689cb359190a2514e7bb53d3b3b2ee7",35.893048128342244],[15633,"ecd8dc1c8b21b23140ea03df0ef16055c2ab1d2e10522d2a7d83b605547bac70",9.317957166392093],[477,"06b87e414af9fcdb14c29d37b46c140b7664f5cb80bd24e54b69a5972f96cefc",9.917710196779964],[4452,"9539f6cf16b655802881564729c1f50e2604b00d3265800988f651e0f130b9e2",9.917710196779964],[2952,"85fdd764042cf635aca6cec550cc52ce32a1a5bf07203b166c5f005d6c5da2ec",9.917710196779964],[2818,"3817b8e175fcd3401bfc6c94c46ed2e3c1fecaae7ae80c18aa9735bb32cd8ded",9.917710196779964],[18765,"37752abbd253c2745f3a6403249f6d47cfd456bbc36a2fa2a7cf8c64a33c1e28",9.317957166392093],[12772,"c8e941427a77328b667ed206562e71e86a10764d748d3b425b0d0d71e4f31bac",9.317957166392093],[6238,"a49aa9dc22eefe4a507f9110266eec945d2470b90f5ef51fe6003c222d087bd7",9.917710196779964],[2451,"d6923d295b9f73aab9ca5eb9ae40face5fc3a32cbfa6643f057418a837ca30f0",9.917710196779964],[15771,"1bc94d1cb7fecd65b4d44b48f92dca5464b17425d33d6bc2964abe48f5bbeb6d",9.647446457990116],[4520,"b7f00e8e13c5b5cd91efa2cb3443c2567a47b2e131e21e762562a81ca3e839e2",9.917710196779964],[11749,"9f421aaa0d49d96f2a7182049adc1b142b150a252dfd3840fc505eb0b47e02b3",36.99270072992701],[18527,"de54987d79b3edd02457baef9b2f467d118daabf455480d431a30feb6eade630",9.317957166392093],[12811,"9465a752d187e5d6577057e8989f2a7f99b62674451ba8b3d1af38011e27deab",9.917710196779964],[1581,"c52040d29f4e5dd4c5f87f5ff6b1d2f671961fe653e0b950b65c1932624ca6f5",9.917710196779964],[12168,"0ccac5fdc3a495e59ddfae4376db2cee2e49340abf94a5a129a9e82645d73fb0",9.317957166392093],[12924,"7bc0fc59a6a307621fe7b05b516ba044643274c141f1a277e25bb65884ea20ab",9.917710196779964],[7577,"1cd98458100f836a2837d25292b380f88952bc03cac0e9e6070840f9e5e353ce",9.917710196779964],[19621,"1afa69c43669df5bf74db77038d47018a26560f50f8b1093f1093db554cef608",9.317957166392093],[18012,"e45da29463bf5b5b5e37c0992eb784eddf0a348e336c8eac2b4bd4eb4f76fb3c",9.317957166392093],[4093,"b0b3fdd6a48111c2c6d853d800e292698d1c1a7e262333d0b9e4bb798e9b1ce5",9.317957166392093],[19076,"38487d20b0696804c889def268444c6e83476f0eca15a83c1ea9bc191597c11d",9.317957166392093],[11552,"708625c80464882f372472f15a8ee74d29510e61e8bd7bd8b839fd38b96d3db4",9.317957166392093],[11772,"6ddc28735731ffa4064678e0143e2044e89a2ee06da04354d340d3cc6465dfb2",9.917710196779964],[17190,"7e08560c9eb419c55aae464b2156b719ea60a6d401ed2e89c16600f019adf94d",9.317957166392093],[18107,"8005343f80f66e06d758ec0e5b6abc38b278ba260ba472785d2573ef3b3cbe3a",9.317957166392093],[10309,"08e4e891e1d0055d995245c8a3941a34f698a124a26a007c702b216286d54cbc",9.317957166392093],[9673,"69b822d621a0387757ccc343f0f64572ddc99675e883951bbeaa919e9bd991c0",9.917710196779964],[11282,"9eb0b908b73ef27b5d6d4da00c52fc299285f74f4bef5b8b2a8fc09e0af127b6",9.317957166392093],[4527,"691dab22e15ed5604c862ee17be96ad5ce0c3dee8ab0a71785b4462df2632fe2",9.917710196779964],[7505,"0b79c4fcaa1f97d8f2eb8de17ec2adcbeb8cfe1bc16718b86c7b55c0184db9ce",9.917710196779964],[18931,"b3bf2b5c6cc0ac30be6111e4fbe29ff8f722d5dd5e2cc8124729c94a2b867e22",9.405895691609977],[6846,"5fb0c5b9eef69bab0d1e1e9615abcdacd7a5638bcf4210ae6955bdf0c477fed2",9.317957166392093],[13842,"05ebd68bfaf41856a1aa19dacd5d09ea1508c333444d9f907547243ba12c8398",9.317957166392093],[18907,"ec76d52a8d2763dcc99821850c95b9abe07318c8758718bf4164935185791f23",20.292792792792792],[19146,"59006bf732a4e87c1dbb41118076d023a208a457ceffbc58741cd87a8d629a1a",9.317957166392093],[16823,"8a9787f147297b64f73c057731fc307537a7e1f4ba103650871bf950d176cf55",9.317957166392093],[18470,"98cea56c631e1f87ec979eb4014bdfbb358780d73d6b9e088a2671ba53e63632",19],[14176,"dafbb6a8add1a4c2a3489901aedc4250e0d8b6fd18fb2331870f553864cbe590",9.317957166392093],[19847,"e9e951f669eacc7ca9f80f1fae2ca2fb9137cfb018eccafb0e5f5f681998ee00",10.034187455573232],[13771,"09a7ab0c7a3a10b86883a39fc169dae6ef71762675f928e6a1c4abc31742ed99",9.317957166392093],[18842,"48b767cfe6a20a4eeb2c4095cac882ed9b13e5ea3428519183221d288cb55e25",9.317957166392093],[15707,"91888fd09752c691d506de8764398b8cbce1b02a3f1b089138ea9fc909d95b6f",9.647446457990116],[15053,"31afc2953efb9b760e90007e259ee754ef728f806c04d7da2ef94f21c718787d",9.317957166392093],[3517,"7fcd75784a76b0cf691027a4705272b67c74c8c115f22993aa5b406a6030dfe8",9.317957166392093],[9774,"574f822816c97e499720850e1d20616fa819f51d1796bd2421d1cb83095dd4bf",9.917710196779964],[12156,"460ea88a42fbe29394d19dcc9d5a0319f1b574902c17cc509827e32336b34eb0",9.917710196779964],[1415,"8e584cf290e018d823caecaf959dde6f15c68bda61482e3548fdf9f5756bb9f6",9.917710196779964],[12982,"1f3707b69dbeb8f8199eae040bd6464ca2730d1163c42714c6ddb3d94251b6aa",9.317957166392093],[17522,"0d8449c04e357010d3ca6736464fae486aa04d3613985fc848c4fb9a0ff51947",32.15384615384615],[19382,"b08d7acd4bc33f19b628c9981851280a9daf85a43a28a4a406dbcec8d5478f12",9.317957166392093],[17827,"5cee47c42775869d13ab9eba2ced6ed22c1c30e838bdb25c7308ef7c9c6ebf40",9.317957166392093],[7679,"7755cf9b1b968ccce1d934fbac181f08d06c9eb096bf44f5717edc4b71bfb5cd",9.317957166392093],[9639,"90a3bf2b4c8516613d1f4d0ba921ac38d2cce85c45c58ccaa5ab14952709c8c0",9.917710196779964],[15860,"debb97fae01d62bd81a63f1d6b4821e24d43944e146174f417939060e7a1fa6b",9.317957166392093],[9314,"3861864089826ed72c4158a7d4d9142e69e6e86431490fbae20a034609bcc5c2",9.917710196779964],[1227,"0c3d9b3873feb370d666317d4708cd743ac9a299a2d34a842306f83bf757d8f7",9.917710196779964],[1895,"0c10de7126bceeadce8d430fdd2d4e20d5655d8eda4930758d90159c375ca3f3",9.917710196779964],[5574,"c3034981e26812cbdd04d7b2b07c1c128157abaff46f732bf25b1ea01113c6db",9.917710196779964],[2606,"06215bf4bd48ec7efaf88203eb993e65f3cd43b8c837ff585cca9dc956a91fef",9.917710196779964],[8777,"093e07e7c80f19366f0118c0167ce8636287962e7a0c7731985130141b4332c6",9.917710196779964],[9379,"235a917f882b1e2376e66507675657855e15235ef40ee5cf55835985d47061c2",9.647446457990116],[655,"7cbf9f1840ca2fad2691d54379bbb595cf60e533aa0e8d2ec8bc4f3641d18bfb",9.317957166392093],[6874,"4983e6aea52fea33183e3929e98108d85f3011af94743b9f9fd42650f413c8d2",9.917710196779964],[3685,"e86d4a3e83f054f224143b482412a000bfe0ab99cec3c4532041c9fa3134b4e7",9.647446457990116],[13035,"99875b0570bfe80d7eef35d8fe6a42a832ebe6b953ca1d322aa58444be8361aa",18.100558659217878],[19385,"55f3a7148d32ba3ea661cdcb690bb10aae12b20ce29110fe4096f02393b58512",9.317957166392093],[9263,"68d2df4fb18940e127d73b423c44d5bd4d6f95eb850061df135d07512b3f10c3",9.917710196779964],[16541,"6f3c035691bd85ebf449d18ab90eb78d4bcb1248c196c564de5bef85c419515c",9.317957166392093],[16372,"5b41150059eccfd9bff1d70e0cc3700aa76ce24ff08728562f6bbd596cf79d5f",9.317957166392093],[10823,"8aff3457bf020621c341edd3f626bc6432bd5466f84164119f7856fbf72526b9",9.917710196779964],[5816,"266c6d3273ddc0ed31549b6833c6e1cff704666ddf012cdd5ba0888664794bda",9.917710196779964],[15327,"e7259e5ccebc58f9b8d24ee5ee1febcb50e97f4b8ef7f39bc360874d897fd277",9.317957166392093],[19726,"7081cfc35d8b668f5ef98df39d306a161c12d864b279cd1fbeac15e833cfd405",9.317957166392093],[5329,"e8e28086390849bcb73af79b66623d598e87ba892364e238be2f5fa7fb4442dd",9.317957166392093],[18985,"fe24087ca958afaa2a97c6f0259df98ec74a41d6853336233bcbf309a4aa0821",9.317957166392093],[7138,"726c604868d966534e5760793893733ce35a775d4f4c3a63cdb8fe584f751ad1",9.917710196779964],[9125,"14cce54ab7ccc64a92d6e195a12c6b9c9157d2e59e92939988789afb5511fec3",9.917710196779964],[2340,"2ebbb82b9bba0916e5b01a77e4e206a3d18acbdb143c698b89b239506460caf0",9.647446457990116],[11787,"97a3a06b230a0fc52ae2cbcb98cd702437ca7e33f3f03507a604a697c84acbb2",9.917710196779964],[8876,"9d4e6f0ade00e4d55358d0f19338d080aba6e26950f7d3f0ea29b9a075cd95c5",9.317957166392093],[18506,"8a8ef09609532fbf71e04b866fd63c7a34c4b839f01ba331f28a3f3d28d54b31",25.831050228310502],[19771,"e024cddc3735fe7d0ea9841d70f9cf451c5bf76275b5e8e77d51c87119faa303",9.354679802955665],[12858,"f14b4f328acf19efc31c9827242ed9dd937a5be5fe380808eb591b78879d84ab",9.917710196779964],[5124,"6e390062a3f522550ff763fb2f3cc210806676e2fa5dc705f1079fc0f19e75de",9.917710196779964],[11433,"96afca7b8538d0a34a88c4fd67ee506ba30d78f1765613839909b8b10ccc12b5",9.917710196779964],[15115,"088989373100b5d84df81c6d09f3df0c689956077bfeba4cabef890a8290587c",9.317957166392093],[10755,"e380f6d4e761c8860fa6af79ca41efe55c83c5101e457720e34cc97d00b4a3b9",9.917710196779964],[19490,"9944b37da11f30c03a0febf9d819bd9fbd435a66aa7e5dfd7e45fdc5b3fab60e",9.317957166392093],[13063,"be86df7c5fae4ff5a81bd40560bc0769231cd3166c616ac79905fbc73a2b36aa",9.647446457990116],[4023,"5f274527abe957f7b8870e56c0a8ef351dbee1f4aa6e6d8185b61ea19e909ce5",9.917710196779964],[3398,"51ff519b6e6349558d583e1eb91ba0da14dfb6de38c9bce3e13016b4638bb0e9",9.917710196779964],[9419,"af4a32cf2d9952a498f2fc40c70d3c5e9e636c40623875cf5e2101d1dc3b2fc2",9.917710196779964],[7109,"b47501011f6352aa8131901cc8b32ed324cb3e0aae3822871ef78d9e2b904ad1",9.917710196779964],[16028,"eff5c53f30baf10ff470664a7c45e59b0ea8626df557fe9de4a3a5abc70cf167",9.317957166392093],[3225,"72b388ea588ab4ad365e0dbc603848f696e3bf18ec4efa5ca870e3b3d6dde6ea",9.917710196779964],[5166,"c0497507c945f74caf5bd6a28334e71578c73fc851bc5d7d1dd0354f49e82cde",9.317957166392093],[8570,"81b61cf0154805e14ba727604024073ef5b6b834f0178fdb78499ff30a989cc7",9.317957166392093],[17729,"464684a9c8aef7ef93f223a4e5af97de4aae37443bc5765e532249a27338a242",25.947932618683],[8737,"66ed3361462c3931486b7f387609a0cb20bd295be5e76a5eda953125d9467ac6",9.917710196779964],[7674,"f0b065abf74031db70dc70add48ea4c83e870fe9d496fce2d275da7c4f54c1cd",9.317957166392093],[18473,"9d4ff8fe740310e78c46825d554d3ef7b60de710d2836242329a37ea04c30e32",252.01380897583428],[9534,"2ddc16a9a51dceb6927719014efa651221dc62b1546ee47cbeb297ef381579c1",9.917710196779964],[4873,"e5abf83f28cbc902f7860761b9323398dfcb88ddcb60ea7e853227bf5eaf01e0",9.472566371681417],[5561,"5757090adc8ceffd30661881fea17912db1ed4b4c80529940caa403d3017d9db",9.317957166392093],[13841,"0caef7c6ca36ba512e5d5e5d29a97df0478aff9388aa04ae2470c25367428798",9.317957166392093],[6513,"3c5adbc4ada8cd81737396d86b518a97bc777023eb3e726da1afa9c0e65e52d5",9.647446457990116],[8935,"50d1ffec8481a95bf34feb5150791a844429a83e69a947a159708e823da247c5",23.582766439909296],[12784,"6e99c1ce78647b0664c2e17ff0f8e4c55b3e8af030b405595cfc16cf24bf03ac",9.917710196779964],[13044,"73ed91af0733ac129d7eb5b613ec6035c9fca8656ac8c2e037e7d6cee4d74baa",9.917710196779964],[17313,"2de86a1fb0b07f0e1b164d7257ddc77bec7f3c68563fcd35397ce21918a2a74b",18.08],[17609,"a3623667309b08565422d59f80f2e9e25240f2c6a02d9a2d5ec01bbed6eef444",9.317957166392093],[12845,"75a8c23f37b40f83cc1bdca7300af9edaa4025cb5ecb90e31e1b6e49d13ea2ab",9.317957166392093],[16721,"b6f8cae602c0c303ba97f8fbd1423abe873225a8484bff28dbe291468b060e58",10.052724077328646],[2051,"f601e9711beeca5e0c605a7172021c9fe314d2143c52e345e6297aaefc559ef2",9.317957166392093],[18211,"fadeeaed1dfb649bb4afacafce5ea0d9b740978b631182e59b5a53f3fe16d137",9.317957166392093],[7639,"0bdfcaeddd60e0e05d34830eeecf456ca1e4081159fc1429dca78ec63791f3cd",9.917710196779964],[4432,"d9463c2ce789a9b55ec8df952c46032cc1df8e3b31ea62a13ad55005fd46dde2",9.317957166392093],[18865,"f639752211f6e273a310007d852a4412403411afa1ddb8412e9ea3418ff18324",9.317957166392093],[6172,"67f822f76bbc1f5c5f486395f82c4c8f64d7f0b906f005d6ddb48f4915e5f6d7",9.917710196779964],[1519,"d537dc608c0518af82dcff27889775b3b35690824d6939ffdc9068fc344bfdf5",9.917710196779964],[11929,"cbfdc6538d9f457afe2e7708ef3390be91891397999d8935c41cb06f299cd3b1",9.917710196779964],[8256,"770deaa03bc26b5f7cabb75d8ce43faa7563931ba7500f7b210fd241ee479dc9",9.917710196779964],[12961,"fb32660218666ece4496e47cf275c9a909af585fa3f9ff777454a7cb8775d2aa",9.917710196779964],[14339,"59738a2ba1c5473ff852e8e5377bf78df3acc1eab3ce7cadca0ea790d26e8c8c",14],[6539,"0f6f4ca421c4f241d50f8e7cce592221656a530149c90c86a391a90b53971bd5",9.523809523809524],[7839,"5c92d179a5132eb1e1e2263e3c16c993f7e5767398d39e60e48abe503bb58ecc",9.917710196779964],[7646,"22fc8d32850011416f7bf03ecb5ea910d3d2d8175f2b34c8df6f677254e6e9cd",9.647446457990116],[4018,"e28999d148f8565711e46bf37d87ab5a05c064ffb29cc0c7c3e39934a411a4e5",9.917710196779964],[9918,"df43e5a98e7d90b7a935c37b9deee2c9337910f91aae11841ef63ef904f0dabe",9.917710196779964],[1117,"040adc2977a17a41b1133be730e61029ae55d92f41dcd808c93de99409a97af8",9.917710196779964],[12171,"d416bd8002872df00d3f6f35eba15af7ed4e4c2fa4b8bb6510d7c17492df3db0",9.317957166392093],[1594,"3018dc0782922f7477bd2d08fa6726268274d842f0ddf0d9061d15d4606a95f5",9.917710196779964],[15072,"671589337a417070cccc4a4c099adccdd84a418e657b3a5dc64b5255b27d297d",9.647446457990116],[5586,"614805b46dcdadeabc6cefb388b1174d1ebe51df9b5ca91dba4e6ed5a36cb5db",9.917710196779964],[3925,"315104309bc1de2949971b0bdaff9c606789e2b3a9d40a88c145a577e75a2fe6",9.917710196779964],[13282,"d71e408cf7aac112792edc16709fd8e5b2a6fd62aac213a87e536565cc3fffa4",46.35240274599543],[3694,"7883b38225106228b90718a07a8120ae9fb680522b6d32d67a7caafa67229fe7",9.917710196779964],[2434,"5ba1d8ad9eecd0ef31fa60f1caf50dc980b13e53622179f3396405e545343ff0",9.917710196779964],[4926,"47deeba65d510c1c6eaaea217a42cd2ca41424f259327b4d9fa7857ca67daedf",9.917710196779964],[6137,"d88fca35a5f1362a65ef3d635214f5a47383ba1fd4cdf441e099418c44a83bd8",9.917710196779964],[10666,"514aa0385f30ad556a67c8c4843f15b1a86783bb1d66b9bcc428cae1d3763fba",28.12556053811659],[15577,"75d544055f555925fec1ea01606ecb62abf3970a453ad698c9db3e9b38920f72",9.317957166392093],[6823,"edbec539e9dff2b4a2d3be9c07b3bc3ef8cdf8728e88c4fc9f69bde4a2561cd3",9.917710196779964],[13187,"e262f260a2c169a6f84d0190de7bf28129979748c266277d0e82aaf140023aa7",9.317957166392093],[18835,"2efcc7314bf1399f38d12230ea65975bacb652f1ca071a0db5f55db29fb58425",34.7773851590106],[12593,"271f9b06adef67968b457ea3e32b9b3abd8bec84124434f2ad520fcc7af94ead",9.917710196779964],[15907,"9c9ef03eceed3589cb1606edeacf947ee4cc7f5632408ebe992328a1a75ee86a",9.317957166392093],[13827,"2064f6094aa2cd8a8716232ff72ed9b8dd3b06fa4c2d4600278f599a8b4dde98",9.317957166392093],[9663,"260d31fc3d49449669af6424b768d5c20b98a24118cf74a0e5c48df5a37a9dc0",9.317957166392093],[19498,"f9f6a9e987fe3d10fa22bb3f0cfc2c154bfa93095350c0fe5088d9e80889610e",9.647446457990116],[11331,"98316d7822d70a2cb2dacd59d71aa3c77ff1aa5b2f36dc30548ea30554abc6b5",9.917710196779964],[11181,"65182f7519cd3703893462472be536653dc9fedc3646b3001b3b94a40fb5cfb6",9.917710196779964],[16914,"aab0f6ca4b90aa7a27f67de5f3113c4a527cc2adb96d1896ed8bad085aefcf53",9.317957166392093],[8157,"f6a4ddc39c7b2951ac0244af565e08d081eed8d203edb954bc427320836a51ca",9.917710196779964],[3230,"5d9b1e39aaa556b85be2f1f5ef57c32ec579ca99510412b091822b507b1fd6ea",9.917710196779964],[12257,"e4d26fd11dd67ab03d37e4508515169ad77e330a1ec5ed9214ec2fff9bafa5af",9.917710196779964],[8196,"7d58ffe8b4f3999698cd0a1867871fa56ed7cc64529b827e305099d7df0502ca",9.317957166392093],[18471,"9df26167da11c82659c058b3f36a8b4d2c3b3fb34a44a7f7eb49b07d0a7a3632",9.647446457990116],[9707,"cbcb694fff8af6b67f0230fc9dc21fd1312109320fe2ad567ece9029d0c74fc0",9.917710196779964],[14320,"883f0f7dad8553667790971f1b10c16eaaad1b6e5bc6b270ecad81c2724a2b8d",9.317957166392093],[841,"a403fab893fec9ba9db21a8eadfb89f9c7397ea6db45f4abf7e0b05365f648fa",9.917710196779964],[19566,"c6734dfab739ad391f2b1f0b1f05b8557b1a75c57112ecfded428d0714bef50b",9.317957166392093],[1111,"ac3affe876bf385f8e7c8b9f21ea15eee49bf141667b2ffa68cd1401b2b683f8",9.917710196779964],[11202,"7d972da349fef5a70b12183cdae26e272c620980f80300447fdb2043d07eacb6",9.917710196779964],[55,"512b889c62be0dda13c3d06ac909425330c69c78f7f57d08edab12d9ec539bff",9.917710196779964],[5499,"817a53d9f2ce7803825812cc14b266783fb783353f7b6dd4eab94f62bb1d3adc",9.917710196779964],[19004,"4eb51154ca6bb8f44a274896c3b058a54f6c552d11ac824816d6b4dd244c7020",20.620644312952006],[17539,"b977dad9823da28ba0b1a0fa8a20be4e849ccd14b88c9a54b07a587ae4f0c146",9.647446457990116],[7803,"ea2a92c3a72ed284e6988b0826f5c48e48bdea6023b6f2a4896dc573c853c2cc",9.917710196779964],[3894,"616bf5407cc415789b8e564fafcb65a8bf500fce6011db3aef6ef3bfba8863e6",21.842931937172775],[3507,"a6c30fb20881d2d6ad33d15787a41b5810be4549d6556bf2a6259d1f3d95f1e8",9.917710196779964],[10200,"86c3c112b59323e0de4304ea60a146ead4e9aa2c79f5bc2f999ed510794504bd",9.917710196779964],[10043,"d7e6549f2f11ff56abc870b4c0545b27d85b9e46da7ea22327a2d96de36f14be",9.917710196779964],[527,"2c02c111ff3ec3dd3dbf191d2541b8f377477603a096f97d080879d075a57dfc",9.317957166392093],[579,"cbdf887fc0d0c9423cfc7e34c1183438bc24f77a3b59f93f246662dbbc4714fc",9.917710196779964],[7118,"9b1002f0d721e786eb1103a286c0b0e5fc8d7e5a8ee223d60e67dfc1a04c38d1",9.917710196779964],[3786,"feb01b20d235bc6fcd31f2918831aea318ed6d388756193270034c5bee5d08e7",9.917710196779964],[15662,"7bae2552f40af7b2addc54f0b9f8a9f81c8774144b3ece39ed85232faded2370",9.317957166392093],[19441,"22f13c71cf2fdedd95b12b7a6ec72ffda2ca294e27e04555f8b2fa5c2d280f10",19.80295566502463],[10744,"45030087f0b645acc4b0ea7d4e92c9cf475e5fee54a6c098ffce4bcf4ac6b9b9",9.917710196779964],[1499,"1d7b64d053e20351ecb352b2035cde5e4eec74e6860ed75b1b123782a76a21f6",9.917710196779964],[4679,"5ef10d0206cb53c1af20c8c7ba6d323694f0929f4254dd59d4177c81c2251de1",9.917710196779964],[10706,"4a618febffa513fa01df2f067cf3646d3c6d65b104301972a29d9b363187f9b9",9.917710196779964],[13845,"baeffc980d3443151d05edbf98dd911f24b7bb4768b7749619001b8beacf7398",9.647446457990116],[6160,"06a0ad336eb245815a23b141380e15c00a501313cba9e61a9b886f4d58b116d8",9.317957166392093],[3577,"155314f609c74a00565b6abb63d5a6d6bfe5466eb804bb2df12afd382ae873e8",9.917710196779964],[15658,"13446d8397dd4fad6c43211a1e9d8d069bf1b45a175bb83e18e65b25bc692e70",9.317957166392093],[3808,"c007b408d75c6cac67cf92636d5bff11e497f211d977cec0100e033684cee7e6",9.917710196779964],[3995,"1d0d853799e1349a208e760433a8ddfbb43c5415ac73d023ada19305776cc3e5",9.917710196779964],[15065,"c65572d10a128c8ef8959661702acdb0a0e013fd8e94e02f1963dfacae244d7d",37.58222222222222],[19285,"68f45b6aeabc90652c65025f369f7232960b93dc333874946505695f87ce4415",10.052724077328646],[5110,"ca70e92d2f519137668fddcfeb2163ffd89474395340fe1f63085134ab0684de",9.917710196779964],[14248,"01f4b791d3875ad2cebffe06f8d2d1706d873d76edd7f3f755e0162b9954fc8e",25.40463458110517],[11927,"34fe3bf65bf5eb4117a0463c0ae908d6fe59d825c598f439eb96c61551ced8b1",9.917710196779964],[15265,"4344eaae8fdd3cbbf7097a0ec0a87e92b670d5c4aa672227ec842a1e3b181379",9.647446457990116],[11904,"1eeebb2c3f86def3a5f2ad449d66dc9ae7df2dfabd29aea77bd81ffd34b600b2",9.917710196779964],[1606,"10aad421af72bb603b1cefb00d6f74822668fee849222f9e02ec61445e6587f5",9.917710196779964],[18139,"d1371617fe92099e090fb7212a23dee274a978bc634c8fc7516561eb01e0ee39",28.376681614349774],[8387,"a35e4d5314a58f9386718fd51448abcda2cd8a7523297b7f28a5ad01ac76b5c8",9.917710196779964],[9153,"ac0559e57b5fe0447a5d6e871ecb60fc7b6210b396af41042ebb6b3885abccc3",9.917710196779964],[17180,"0860e58f56928ef32c6bd788938c063de8b3d1598812d109750de11d67893d4e",9.317957166392093],[6260,"a715aecee71250a25258306426db6fc1993dbea4518cdd79375fb61174a55ad7",9.917710196779964],[14140,"b31c1ef20e3ea95cd9b36018581c53dde9f9836c82b2aff30155f1ce7ef6af91",9.317957166392093],[6250,"2561a1944a5a2cb450970d5b31c4eefe443bd727d2491343c629e6880ba064d7",10.068649885583524],[16542,"c5257714cdcbf962daabe272215a947d0009917e0d634b3733ae44feae193e5c",9.317957166392093],[8048,"5950725f45cdbc4a80ee472a66e59feac0d3c77a247ad6615d1d95a1248d35cb",9.317957166392093],[2441,"736b0dc33593374d28ad338cbf4c49a53b9eb8ffaf2d92cf8c4cb80cb9c438f0",9.917710196779964],[4306,"8feb6e5b475f6b176398c4452111667c4e1242f6ee81c2127715091be992b5e3",9.917710196779964],[17017,"99ad9e13662fc027c7757ecca6afba240c1f23cc6f64b114f5e54781b395af51",35.883805374001454],[14590,"1148a1a1ab9d4b9d50ab66a3a811732c5d05866f198fdeb90a451f4020104f87",10.052724077328646],[10036,"bc1702eb4802ecdead44fbb6d70989923ab40fdb38d195e2bcb43f91649e19be",9.917710196779964],[6892,"d1f33a5ce3bad8eedc17103fd9649106c6e64650ce6b557bcc2721303ffba9d2",9.317957166392093],[8183,"7bcf13a4bf3336d4171c7d75ef02db2cbd148a885616f8cca33c28c65d9018ca",9.917710196779964],[8566,"af9355bfb9fa5fe58da926bc01dfc29e51fb0da411479c6607160587a44ca2c7",9.917710196779964],[2784,"8acc0a85a16dbd9e427328a87bfee9edbfd71cc05cd1bcf794a060ff22cbdbed",9.317957166392093],[6946,"89914bb63fca9284c4dc67fbb712e710918a75f0020a8caefa1c7d9bcd004cd2",9.317957166392093],[2988,"415c035cf10ce73b3e05b6e157e4d3d27e99ec3cf67c14f2730e8c868dcf5bec",9.917710196779964],[15892,"63964abf5ad5efb2c441cb570b3c875d1d5b49afc766038715ec20ec2df52d6b",9.317957166392093],[19303,"df0aea0d587631c9920a4127c52229ccbe3e0877e34e8ae7ce9ee9f3f300da14",9.317957166392093],[885,"87152489a44aa7a7fb117d38ffe3f9887c1444b5ba53b14f04204e7cafe7fff9",9.917710196779964],[16236,"77bb7cf1220e06429a421aab990e4ce9a22b6d344009a89ec658698d67c9ed62",9.317957166392093],[6194,"21e4a187c743c9406ff81fe47e7b8be36373b2eeedfda2d00a74ff0d316cd1d7",9.917710196779964],[14629,"31171449983e1ba654089bfcde8600e96caaf01a17f520d0e7b94795f2cb6f86",19.228318584070795],[18642,"28f60702ebc66df82d419281a5a660269dc0c55113526a462d53e77e52831e2d",15.003322259136212],[12744,"95f05361d0ec1d53c9c5659f2f253f42ac9b3a16b41833c95292ee5200bd45ac",37.99791449426486],[9236,"dc745f3e0af26c9ccc1480e094a9f7565a22fd2072c9c18b9e963c6c897633c3",9.917710196779964],[13303,"cfa2c65e1adccff985854da99456de4792654edf3bf92560a59c2d31b1e77ca4",9.317957166392093],[14090,"dc2c8f6586934efc239b60bd1d559c8d33269a583d94331895b2cfd6762cd392",9.317957166392093],[941,"d1632e59f92f43d7e603046194fc9a317767af2b79b5d6313831200ed3d68af9",9.917710196779964],[2443,"34f1b74acc38f528e028f16a70404f4aa548b52a80582602394ef934798636f0",9.917710196779964],[13070,"8964b4545fe5e141a6bd9342a0e506192c8e4d869e4bd5011ffaecd61a7a2daa",9.917710196779964],[1956,"d2dbb18aaf042be8e96d3b0c81e1319ee3b676d1b0f7d99683aaeba70c9d53f3",9.917710196779964],[15260,"332f76ee799893cef35193617c3f946b15fa19e081a7f1b71980384dc9553d79",9.317957166392093],[14006,"3bb575a5fa2539bfc6f5dd110d365941aa20966c9427d9dfa23d9918145ca394",9.317957166392093],[19249,"8d6452403406dc0dee7aa1f645c2299c003ab5ca387a68bcd062e0405abae516",9.317957166392093],[11116,"d7d96688f7e158c1a68070e22334627447433791d8c3cc661f7c67b2f96d26b7",25.967914438502675],[18708,"60a388cb6c48b2c6369add5c2c6129a704365ac73d3bd900ca28091c9e3afb29",9.317957166392093],[1012,"e73fa686a262a9580493ee0ebd4a8f7eb488f429974c1523dc888a4b869120f9",9.917710196779964],[16142,"cc372df07be4ea68033f67c427d2c41dab8cbe3fe2888916fa344f25b1203165",17.80415430267062],[8547,"b17fe3f71f7a1ff9642e0c71fa9b681e847f34afc47276a96b6a0941df64c1c7",9.917710196779964],[6338,"1dbd80dde4c7ea5108bf574d8b7b002300c7d05eed61b86d8c3d8770fcbcbdd6",9.317957166392093],[5465,"188abcfeb9ad387abbd9008f196e2924b84dec945a3d10faa1ae6b1a59346adc",9.917710196779964],[7704,"25405b9169754df3abb3320b9e06b1ad1da06bb21d6d17208efd4bb67d9082cd",9.917710196779964],[231,"c84cb82dc459ff3ac97e6201a40252605bf9cad0abea1a54415289ec55c972fe",9.917710196779964],[15976,"463b10501ff4f56601f5da29212ba365f32a1365e044adff02868d8511442769",9.317957166392093],[11312,"b5af24d4cf2a52e22ee81dc91791f6e722ca4d57a5671fbcf45709505228eab5",9.917710196779964],[9658,"f3125c5a05adc7327a0f316e4722694e0b1613cb3df1c0b8a89b05c13fafa6c0",9.917710196779964],[12227,"865cc8af64c876b84dbdea350cefc3212c344aecbd83e6ab23c26f469ac4e0af",9.917710196779964],[14142,"72be8562ae05b07d600bf5666a9258e642ecf209c1486439b7c63d7e6e7cae91",26.138053097345132],[9307,"8a67bb0af1b38641add26797d4802862af1a644cf75d60971b7fbe1424e2cdc2",9.917710196779964],[1701,"1aa9b843e92c2a6bc580dcb0b76206caddc880f47258d68da8b7617b0d02ecf4",9.317957166392093],[14202,"546d6ac5ecb3a0540d14a2e9b4ab923f99ba042ba378e6ed640909e917fe2890",36.948306595365416],[3060,"d798ca5243154baa428388f0286208e48bcbf8de0fc07af84a85147a4e9de7eb",9.317957166392093],[11169,"75f07377108790f41a1d5997c7af555e4e6e3215bb52f51de05c9acfd805e2b6",9.317957166392093],[9600,"be9341a328e8c9e6568b0099393bcf0459bb57861a4111552ccd0f55817b06c1",9.317957166392093],[11414,"9fee42ca6c31a6e192ea0f51bb10c6ba7f8b3ff08043bbb8ab8082e6a1ae41b5",9.917710196779964],[6580,"54446ffc4fb1ff3fdea3b327786ac7110c9f22043dcdbaabcbd5efff41bccbd4",9.317957166392093],[13077,"fb568252a0aa9e44e88d7a9758d0ad8d3a6433ed15537ef6d9b49c28170b03aa",9.317957166392093],[10857,"2fb3505fe663ed4056b9fe78e891be503d0567b90a7f7ead426ca113d19ce9b8",9.917710196779964],[18414,"ce736478ebcc06776abd4425caf1fad3ee076a33e040f96d3d292cd9f0b13533",9.317957166392093],[11160,"da1f5dca68a8bbb3a13a7faac1221e1c61fcf9182f87d5f4d645f92564dbebb6",9.917710196779964],[14312,"ad8cf97426e518cf744d6799c91f00632d4273a9101826b3885d69a94e7f528d",9.317957166392093],[8581,"8802588dae70850e47ec575cb9e349a1de5f560cfbc9e0e8470a4da4d9358ec7",9.917710196779964],[6439,"5a87d8a5b576b643c5a2de74162eaf37227280a40262caf24f0f7daa5e7ff9d5",9.317957166392093],[3542,"f88c428a0c03b1679082de99b2ee2be83e5313ddd9b161f5155bcea6f402aae8",9.317957166392093],[8124,"a750b235e5d4a4fde5e81fa0dce27db206b0927ce4b14ae841a799c1bf039aca",9.917710196779964],[6381,"b01c72c040d0f558ed77f7e2285397651013ba5029245b03b060d072bf0a71d6",9.917710196779964],[16042,"8bbf1747065813d8a514e90fdfc2f546e6b2728539ef8c9197cf0edab9d08867",9.317957166392093],[15715,"9f35e4a30ac2b7a71bf2797e78a150641727470610c9f0efac4fb3f80aca256f",9.317957166392093],[5803,"214de3c928e41770bf082a0422cbb7eecd9806f9f8c2dc6bc9e629b29de460da",9.917710196779964],[4103,"5a35f6f3a2ff8233aea06cb7731257603c1abfb8ae4e48da868e38226b4d0ee5",9.917710196779964],[144,"8123a3b4e778e954b77d2c4115fd36be9e538202c255e0711cc40906124f03ff",9.917710196779964],[6186,"f2f4947f0beac0458151fc2c75f658c6f4421ad5e120f754c07cb5f8d022e0d7",9.917710196779964],[2719,"faf770bf95734da416bbf48eb83efbd6db8e8aa2e391a073988b48aea4584dee",9.917710196779964],[4659,"2af443c3a7468a30076c0c611136f5262732848306713eb9bdd11e2397863be1",9.317957166392093],[4011,"b49e48654cf4c054ab474bfe61f83b2b537c62fe953690ec40d518e32f22ace5",9.917710196779964],[6321,"d575c5f441fa5666f7e156eb4906a7a3f46d64e6996c005ccd76df1ffa74dbd6",9.917710196779964],[17668,"46dcdc91e27b093fab4090f95a3606050f51acd9e560b3a7de40a8b038f8c243",9.317957166392093],[16508,"9b5f97594405175ef988c25adf63dcb65f6b52ee727cf72b710b86a36a51105d",9.317957166392093],[6496,"fde0558cf08e32732dee6a51d99e39c97c83af42945d540d123e04d2571684d5",9.917710196779964],[2944,"983e686418dfe7a9eb8fb6260d0102954c009c3e22b044bd5532ea81800db8ec",9.647446457990116],[11321,"bff77f65490f7902a55024e2080ba52ad22f392609014a1ac086384a7e5cdab5",9.917710196779964],[7170,"29e896cabadab099ea3aed23df7500908f369453630c3c1b3e875bada4a3e3d0",9.917710196779964],[10221,"ac2d76dc8e293ed09152dc3ff33dc6950864ac70482858059a4fe645181bd3bc",9.917710196779964],[17785,"6d254c09f66c7751b6bab5d0ea7acbe07637e5b8eb495b821679e58b77f29a41",9.317957166392093],[13637,"6724878232289fac2766047588787409d26436fabe853cdab04294a7eec28d9c",9.317957166392093],[15595,"aa36b646df8d67ba7b76a2c5cc75aa1c2ebfb44e8ae3f37ffbf6d225da227371",9.317957166392093],[4168,"2cfbc46ea98666dc623e0095669b7329a8b41c084135a59578ff90261217a5e4",9.917710196779964],[4828,"9c36abc8bb61ca217b0e6a16ff8a91d9d997f75e5c182f072654f7fcea593ee0",9.917710196779964],[17028,"360087d460ac0fd3e7feb354ac669ecf1426ab54622a000a48bb7aad611c6951",9.317957166392093],[18330,"6c363dbd16690fd2b5676655c229b5b362f2bb3a9cfc0d250b1b267b10214835",19.155807365439095],[10303,"6bf093ebe6e34ee5d789331371954ffe245c0739680eea5deabdb71bac7c57bc",9.917710196779964],[11004,"144e3864598ffe7ac6c21f9945c0ebcff21f99a268d22bd90242e2ef2a25f4b7",9.917710196779964],[2955,"22ccef10f5c846c1ffa6f1d865fe8987ed0b5555ffc7fe090555d360f8eb9aec",9.917710196779964],[3733,"3430364e74867090c1c87cfc0db0ee29e75987febf09a50d77d6a9f660f75ee7",9.917710196779964],[2226,"123f769c3baa58fba93ef6088512307b94901be0e77351bb3397ce463dc75df1",9.917710196779964],[10951,"77353a260f1b3b9275e4e25d8a5a203db89de42a46c6ea1d0c746bab9d7454b8",9.917710196779964],[4829,"8ef0f6cf91cf9215c4260e9b4121915253ed985216302b2664d7ee82aca13de0",9.917710196779964],[13031,"35e55f08e9a5d53b6036aec477424bb9968a2f98affd50a8e1af82c1e83a65aa",9.917710196779964],[8713,"17fe9833ebcbba7cd867f2f57f53ad011adb5d79343319aeb48ae9154db599c6",9.917710196779964],[14108,"0b94c2e2f3fba1e24d8965c828ddfba8e1cb4932d825f3cd8ea33d7538526492",9.317957166392093],[6982,"211f9ba2bf510731d4f847eb3f51148806ea02c67b250770b680ea920c0819d2",9.917710196779964],[16019,"8485724f54dd445f68af647938c6e0f121ba99b888ed0592f341732b80b90f68",14.199081163859113],[5697,"86db77ba6bca579c752b1d83495a0d17223b7d086adba522d8f741d1794411db",9.917710196779964],[5386,"7219c17c27ec39c9d25b33020e675ebf8e2a8aabc4b6f7e9140659a03e99e9dc",9.497326203208557],[12388,"2c9ce320da102780b429badac8ecd736dd1edceaa6a3ea7e9b253b42916bb6ae",9.917710196779964],[19824,"ab8a41aa644258ce9d7cef1f6ce19a17c9c9d938c8f197bfd6ff9244e2c2bf01",9.317957166392093],[10790,"752747e09d50f6f6c3e948dbe63b289c7a1abd902910085c2bbe0149f8e15ab9",9.317957166392093],[10412,"0241d140bce94bf629d0aed186fc43f2833e4f58bc9984f36a5a61033b49b7bb",9.917710196779964],[6384,"900e754a60dd6f52fbb6d8f34ec28947a34fb5b7acf0c2f5f7194fb0a2ae6bd6",9.917710196779964],[11612,"91bc7be9926b2546cdf16997324ca4aa5bf23385fc7a1a6d911363b0429dd2b3",9.917710196779964],[14782,"3c7437666d7dea540f46ba4b28699da653c950decf4114d31baf3c9c406e3583",9.317957166392093],[13027,"e40e10cc5cc4e231b71b9d1c2cfe1ec9044bfeda824195ca79f38be383f168aa",9.917710196779964],[4274,"230792610cbda5eb6ebd2f51f7bc3cee20bccfe52c6b674af187843dfe9eeee3",9.917710196779964],[4771,"57e5e99536e460625e5fd918569e335d4aa4fba799ad3d6235a89ee104268be0",9.917710196779964],[18582,"f4ebcae7019ce4c8f19bafe32a2bb4ebe902f0c047d4d38391d1c134a913562f",10.052724077328646],[2049,"3d948b3dc7eb3d97f087c7573c2b97764b611b14ed25fb7382c8fdd4f9cba0f2",9.917710196779964],[15457,"ac9e214c3c7dc910a6ac89dfa6642a90cc05c2c89817304a6e40a16a89b50975",9.317957166392093],[5745,"5adf4e56efcaeb36afea45059e98669349edb44cf888951abd183c7a24aecdda",9.917710196779964],[8193,"49d100d55f45d1c49658741766a88ef6d6b181302c8f0be313f4d9f08a2408ca",9.317957166392093],[6764,"0b73be2bf827627b58411ebbcc44bdcc6fbd9d20e169d6116d4402d11c5382d3",9.917710196779964],[17782,"e42600b521b42d0ddb5e7ac4209465ff312f7801163d83b2ae46f495e430b441",9.317957166392093],[3986,"e62021bcc9df5f19ea4ead0b3f58f662143141bf5f93edc609b049c4c4efcae5",9.917710196779964],[6832,"afede8553d186f69fb3666f193c7a06dc73480e0e4b3f460aaebae250eba0bd3",9.317957166392093],[7737,"d5d06f4f8d4d58f92e9a85d6155be5d6a4003ebd2da8165022ccdc472ded42cd",9.917710196779964],[8110,"7245c28f091f50466f3deb8b7b34263a659c913ddecb57ef3892ff59de6cb1ca",9.917710196779964],[11860,"9a37fc5b26bf564e319e6fb041d4b9430ad0541dc6ff6da7e4e6cc9c88a64eb2",10.052724077328646],[14858,"9cbdc73d50569ee2607da68c4a42d28cba893ccaafd61e9c84287da958c59e81",9.317957166392093],[4608,"532ed2976414383ce7dc86a41c3c6dbe4ef98b2ce5399c421f247808434f96e1",9.917710196779964],[15803,"ece5f265ebff4907910d435f6b7a4ce9cfb7b53f4dd975bda3b9375921154b6d",9.317957166392093],[14077,"7b81a0ad636639385625f988567b04719a8ef6656dd91a09eb02263db9e91593",28.09964412811388],[13377,"65d076980b093ad731ae5c98589f5c6fc04527e36d0d402a71f65f7a8f1fd6a2",9.317957166392093],[1888,"b983ca7fe09c6ce27a37188a5ee6f420017b5e6f00bab4367efbf483a827acf3",9.317957166392093],[14715,"a136ca52722cb9b27befe8d632f598f83bf8dd2107f8dea41e1a61301a999684",9.317957166392093],[1915,"c3ad87e6f14a682f555ad1e2208eac0892ac3903542cab5a1450cc5affed92f3",9.917710196779964],[6954,"bb0cea154e1d027067c77eaf314e83e8ce9dddacba098fb1008ab5049c3f3ed2",9.917710196779964],[18483,"c19b714a369c77498498abd2481ba0793abde4fe18e5769e82ad7efd6b33ca31",35.830388692579504],[6472,"4d9111759f9b058fc18fa8b56a3b7542a917214381459d0f113f3054e6eea7d5",9.917710196779964],[7681,"5e1752e2b6efbc8cca63dca8b7c4c613336a4ab632891ce64d52b25da160b2cd",9.917710196779964],[6174,"a8edf836d748a2a0cedc4f9c9ee77f3f2acfd48765ee3d398217ed9a6ea0f6d7",9.917710196779964],[17421,"8d237d116365547b539c94fdcd61fb8b327138f88b4a2fd8100997b254db6049",9.317957166392093],[9557,"192808f0d3ebd2bf687796dc9a7fef41e7671e7b66b1bc1afdd374cfe1c748c1",9.917710196779964],[11120,"7b212f9c932e1bcbd8910175e720d987493262a1aa0f1dd7cf0aa88a466323b7",9.317957166392093],[402,"88ac3b4baec33b9f1455ae4125203648e4ec93006de58ad7b9c44ae5903b53fd",9.917710196779964],[19864,"d531e9f0bc9293e30b5021f169c3e4fa0899611f8c3cd0e996359056f3c65e00",26.929503916449086],[14277,"172ad52b98bb38926147b27660b2c007e0c3a9eb39cca74dca68f8a6fe794b8e",9.317957166392093],[6007,"b8d89d6ef5e9b3c160f8e1f55a4f5a4983d1e4efc38cd9e3cda82b56197f08d9",9.647446457990116],[11092,"d29c8424fb072588986f681189a561a80919b56fa2c48d249838716574ae4bb7",9.917710196779964],[917,"55727b75c6fd8f54d3ab222e3835883fc69638de328fdad49b4f6d2069d0b5f9",9.917710196779964],[2850,"9a8cc72e00015aeeaade84ab05d8da2adccd076c89e52753f49acd04aa555eed",9.317957166392093],[12633,"9f0f71ed0d879d449e729bac72b5509867b9bc5bc863efb8c5a682a46fef0bad",9.917710196779964],[11368,"1e562fdbdbeadb0a79d20f32a71fb0231a2eb594d9ee5ff338681d86c3e093b5",9.917710196779964],[5941,"536669f42a36eebb0a9d4646af4f1709c643a7b5a623c5b66819df72b9f66ed9",9.917710196779964],[17334,"d7c39f215b899174f8dcee9718abc1ad9fbec777037f1ea5716b6f700bd7394b",9.317957166392093],[10310,"699c51b96fccf19fa7f732f11bbf4c4dd78d24ea8ecc56a7a88a5dde13974cbc",9.317957166392093],[4725,"8dbdc656d1804bbdc29278e46dc7d63b67593a71e3f7803d4661a9156200dee0",9.917710196779964],[16255,"baf9f67b426695f4f3bb3b64d17531b14cfbb246d6175d4a03f2a510153f3b62",9.317957166392093],[3168,"35f39b2dbd5cda614f803b6b6e749821832421cf30e7e90019ad06268c943eeb",9.317957166392093],[18270,"f9c1fac4be49d66764e0fce9b6db143b63be97cd1bbbfcda6f8eb7360ee07336",9.317957166392093],[19006,"cdc40e78c5cb4622a14f05a809967b35169577abdc7abebdf8301d196a6e5c20",15.073529411764707],[3000,"dbeb3c7b74dada09f442f13e2fba7b6f6707b037a832ce58f1f77568da1b47ec",9.917710196779964],[865,"8c7e816e2de84e04f6861575002d21de34001acce05885fb082e2d7545c91ffa",9.917710196779964],[11733,"db674e51f26adbdde25e58b3475879d2d469ebde09a6b2a0d029d48a175a16b3",9.917710196779964],[16235,"548e87ea9eb725aa9e58a3b661bafaed6732a4b3c1fac800c08ccfd139f1ed62",9.317957166392093],[16603,"92ccd0a6a3eacc97ccd3366ec4aed15948238ba0508ccb16cc992e11d7f8c85a",16.17081850533808],[9496,"feacf2481ac05cc7e2ab29c07cfefeff079f9ab8c173431870ce029a0225b5c1",9.917710196779964],[5689,"4f60c29a956924a92cfb9324f80dd902bc08b90d0860b9986cf8e31db0371adb",9.317957166392093],[6793,"9e92d879bf8397627ecd9996316c46646b9ba708118e3a30c719650d7cb456d3",9.917710196779964],[4708,"23083c54cb97d3553720309042b795abc53d7272d157365a6baf51ebaab8f6e0",9.917710196779964],[15225,"39941de6e2e66583bc83cb74e1dd0ddbb1b71191a2ba2adf98fff844ad1bfc79",9.317957166392093],[7136,"c1937282aa9de49ad966d97223a9773a0d9599908eb3532929751fe403201bd1",9.317957166392093],[6153,"a21cd6ca6d0e337f7700565c967b429bc668ab8f15e0a8ffbe5f63d1e62922d8",9.917710196779964],[17243,"93891e333ecdf08fb6f4ee6d1077613ba17d6975d854e344b05c5ab3844f104d",9.317957166392093],[5529,"b87ac79393a29c9d5b4e88a6249e8852a10d4fd0e9d504006e602197c1950bdc",9.317957166392093],[2736,"6b32f10c70d883cbb68c4dd28031f1688cdc2332362b6b15ad8a8db1565530ee",9.317957166392093],[12081,"de15d81bb3fc5a16e9d0000a64ebd15bf9fe8c85734ee08a7579ddd24eb8d3b0",35.830388692579504],[3659,"0468e3046aa8745e3157f4b2fd953239ff2da9a7905bd2171c0d3c2ced72e0e7",9.317957166392093],[4423,"c26124ff0773aa93615ea176339176cbb2eca7ceafdec403e35f603658e4f0e2",9.317957166392093],[5081,"fde679dd1a4369f1c079ae8b1ef76b81ec1b07ee02fe2a80990d9a792a91adde",9.917710196779964],[8892,"d107d272cf051e81634a913dad3432092a236b0fc76a6f1a721649eb0cd078c5",9.917710196779964],[8453,"788385af53e48f07cf93b6a6aaabf7c0cbf13c67e05dd0a7026e5dbc17dd4ec8",9.917710196779964],[15519,"d99a793a14013c40f214453bec0f8f479447f00fa8136425fdc2238470e79873",9.317957166392093],[18738,"55d3b8c33dddcb3e84b1b7fa6d90a92ba33486b4fbb9234bf8a2231863cb1e29",9.317957166392093],[15015,"7543888485b15af7527be610a1f82f8e27172cc821ea0d3d9b795a15a2d70d7e",10.052724077328646],[2109,"272644ae26b92e5b1acfc969cd3f39cfb99311ac3f8e18c9e7f4f5c32ba82af2",9.917710196779964],[8284,"eea97dd893843a216441c369e75b4e6b6ac8ffd67447cd0634af5851672c6ec9",9.917710196779964],[11893,"4273c064805cfe0be0380b8e9ee42d16817ee98efef2ef69d514b24b645e11b2",25],[18961,"fca19c07a4f6f501cb2065ffa47819371d6df7b142d81010427891c190b4bd21",25],[480,"26868bceeed7890714b40147cabd62d2ab8eda30c596c581470db8ebd556c6fc",9.917710196779964],[4145,"75da11045d53c3b00920bcdebe891a1fa72a763d8a7c545333a320f46becc2e4",9.917710196779964],[10212,"2ca158583890ad9b729d2a14f085de11b37c94407201392443d5731b05e4e5bc",9.917710196779964],[2634,"b5b94b8c24e94c8f28f0f9396f24aba5da729850af6203e74650c7dd857ff3ee",9.317957166392093],[16370,"01e37c39d09f5a0530e9531dae8d2455488e56945746a8e6acd2a3d92202a35f",10.029773988361077],[9829,"3ca975b00ae6145db4672a1061d0b877249dad0f92ee93b51b8262f207796dbf",9.917710196779964],[13041,"da349d30f2ab5ca9210c29250ab04f2cf65a6fdf8a2aaf21050a59f3e3cc4daa",9.917710196779964],[1127,"818b6c97b23e7cc4ca94e03b6338c9c8dd1e29b52ac167c30d885f20bd986bf8",9.917710196779964],[14788,"d61a3ec8e874879fd130a8cea884e15a5c58bf74c70ff22ae40d45ad00112783",9.317957166392093],[4328,"e99b2214de0bbfbc0b654e22fa641fb368024e93e0d555dc0f582be6ccae96e3",9.317957166392093],[2691,"07a21b269d8a37226dc1a99d11e6353690c34e3014a3d8e328144cc0025487ee",9.917710196779964],[14702,"5e5bc633a5bf663e36bcab65e1ba4a092f74759b5027df70004cfe2b5a92d284",9.38219895287958],[1038,"c3e404a1bbad270cd4cdf23f09a449510e93ec707eff5e267145e2c72bed0bf9",9.917710196779964],[18094,"6268ca1e0f7a3485ef3da074daebdafd907be746a0cc687d4b04215b7df7113b",26.138053097345132],[7958,"8f74ca1200596dd25620bb92b6d65fe328c92c3a1dc5e220feaae9897409dacb",9.917710196779964],[2888,"8984bc8d88d8a9d6da457d390849f5db446c44f0324d8fbba33fabe2718433ed",9.317957166392093],[3634,"5a0822459cb525fd24b81050132a8e11fe0fd81b6f552bce246d8777cf7307e8",9.917710196779964],[12957,"37878493bf50f5b04b4bb6a1b1b11e2cd14dd868f5d55bd4ad89a6d27160d9aa",9.317957166392093],[17419,"0c85b0a153f9b052ba54088966fd49612851c2a5c45b83c1fdc660e82c386849",10.052724077328646],[1684,"a9e964c1a68589629527fc32ff1cbd1582f628f640273696650276c2fe4005f5",9.917710196779964],[1182,"36260c874bb99bff33257ca0d0fe20d8b9c3375112b1b4c9e0fb74ff54ff1ff8",9.317957166392093],[6033,"b8bae11e61f15bbcf77820212bf657e3814a11f2a7529f48d9c27005c361dad8",9.917710196779964],[3438,"bb019f57b8580a7933ddd7bdac334403cf6c928d9eb9675bd9e92fb6aab370e9",9.917710196779964],[7116,"13b51b461c38611e43568e8c5e2d878ad3accf59675d576e2dd37327790141d1",9.917710196779964],[15067,"0974e535df12cbb1f58f2cf54a6ba461995e1014692821fe7b9f353b2d06427d",9.317957166392093],[15240,"ab2e4cab0d695cccc082f4ed9399700f5105b6590990889548ce0985b93aa379",9.317957166392093],[18140,"2e28057d1841c40a3cd45e5d936f3751ab796863056e60bf768e6a8d7650e739",9.317957166392093],[4847,"fcca149f4255bef36f8ac009d65cf58ac4accf8f4d639cbb7da2594bb47629e0",9.917710196779964],[11933,"649794b45790f55334384e585181f6693eaf9affd0e1c47409b5ea01e8e7cab1",9.917710196779964],[15572,"9fe23167038c9b659b8b1fc3ee837b357d7767afa47f3e06fd807a4206463772",9.317957166392093],[4514,"9a117afc102764377c203212e69f8d59dc3f30ec83ab49d15f11aa6e2da845e2",9.917710196779964],[10468,"6b2b9c556da8da450ec20d110804e3cd308d5e029fe64079bcdcf762205c52bb",9.917710196779964],[8828,"133ca6e4e6ec59ed7b69e9ba74877090ecead1bf9684cff59f30e41b6893ecc5",9.917710196779964],[8306,"2e3cd1b812571077930e53443730347cafab0046e5312d9c54962729cbf948c9",9.317957166392093],[6733,"9baafe0eb16b7e2daf596ecdd5f7acd5d4a01a6beaa8be8572a4edc75793b7d3",9.917710196779964],[1257,"66a269f616ce45ea820923e39e4f1d84bae97882d04c7eae9d25466cfcf49bf7",9.917710196779964],[4179,"f7389973fa7ba5e1f656031627b4a01e7d002f759f5225e77ecfae649ddb91e4",9.917710196779964],[13100,"449922755d01697dc8a982e2522b8c25fb891aa92e3ea6b0ec9ed83261cb43a9",9.317957166392093],[8808,"12eb152d2a5c81d5486e8d63c13c715ce706a83579ffb121cfce6fdf584608c6",9.917710196779964],[12877,"8b184c3eee3520c3208e5c2c5a995070e433048720d8bf424fd16101810c6aab",9.917710196779964],[7106,"48ebeee86312e935c72e5317195b3eb9d9301a60a0bbf7d1ef2fa7e13eb94bd1",9.917710196779964],[561,"231bb5519d5d6bc0c3d3d090a3ebcd01da6396d071f33a80a461a256b84732fc",9.917710196779964],[15127,"f3d71463af4f76c0ddb14c9710e7f31e0385e16e77bfcf0a8500bcba45c9277c",9.317957166392093],[13823,"2586a90634cfba28d48acbf5dbb67b49a2f84eb9af236fc6a90f92f04ceaef98",34.83420593368238],[960,"b266cb9670e7848b05bc523197fe8db13dc4e30ada4585385f976573911371f9",9.917710196779964],[9437,"a82ee7b7d25fec39ec2a8c0d109d8ce0803256e1eb10c7a40f99a051a24719c2",9.317957166392093],[13880,"ee75ba171ae8c4ea5a1628927f00093b97046d8e8c06a4eb27bbe9f1a22d9c97",9.317957166392093],[44,"bb644f821705fdff3fcd782a590cf5543b0a67755ec16832693e60d6700bbbff",9.917710196779964],[11457,"7abcfef5482641e4d258be9c5fa64f36aa1b78cb4202150d4edb1094a24edfb4",9.917710196779964],[762,"ccb21606015f4863b5faa6756666dde0b0256a425a3e82b268a10cd066accdfa",9.917710196779964],[11281,"a744595b12a1caf04b0aef909f69457cc2fbe1b3c5319e502227a23f96452bb6",39.824858757062145],[15190,"971054dbb071b18fd078af7ef808d82321f4ba6fdb19c8f84f09a5c38310b87a",9.317957166392093],[6556,"6851cc9c4ad402160139e4675cd652766d5bda05bd9181b174790b3ce59ffbd4",9.917710196779964],[12464,"78d192241c8731eee7a3e5f2fa59fce8e7a05c8a8c05a9511f9bb719ae5236ae",9.917710196779964],[9690,"92d9319e29dfcb08468b0c271b4575e607bab8f9ca070914b2f25fc2373476c0",9.317957166392093],[16577,"f6c8c0eea0ab1d688a0f3e85372913fcd18c0833754d5c8217ad288a7c5a925b",9.317957166392093],[16909,"6152c5e9b1bf6f957a6c21dcf3ebe634e05265e73aad7d302d622bf54d16e753",9.317957166392093],[4963,"2e516bb673c338de130f1ce0585682199263f7b0a548619f2031e302e0ec77df",9.917710196779964],[9450,"1f4ac250433f85dfdb52663d99ff1e581400216119cf9ce7d901478b699203c2",9.917710196779964],[11348,"165443920cb310e0c12763201f5bc97bde1a4bfbd789cb9fdfab0876db94aeb5",9.317957166392093],[5462,"893a852e273defc9143975bd223d59177877093402b40977266a31b7c0af6bdc",9.317957166392093],[11677,"968f453b8c8922a6ea9b9618907a7bba1de5e9b1d5b18e431e9a530c645572b3",9.317957166392093],[9065,"02af0e2f236350007f06e8e48080640e35728a64566b8a50062e078bb9135ec4",9.317957166392093],[1158,"012d8d918de6c57af0188fd9d91f132dbdcf6b22d852a182e9f91e65278342f8",9.917710196779964],[5887,"cd20d1aace5242b669ed7af8dc6ce52b1eca83c4ca4f0a62dd51458f2bf5c0d9",18.730713245997087],[4935,"e5a70e0e0d50065bb3d25f42cfce1a38f8a3d9fcf799a8a06f8f30fe0c569cdf",9.917710196779964],[3924,"826c86cec0c60ef5cb2315be4776f88f51c0de731647fa7299832ace002a30e6",9.917710196779964],[15741,"39c263c5316779cbdec6d0aadf5d7df9b9c7ac2bd08013764a2d6a024672936e",9.317957166392093],[11460,"10297d1d9fb3bc0fac36d44f110c9bc4b8b9e2c5a0e13accd0ecd4e8b8d1dbb4",9.917710196779964],[11193,"5fc8f9302204eb1d12da89d87103d2d65cc3df6f87c36095aa184d5e7d66b5b6",9.917710196779964],[3658,"c7207485323005bd961a264d05f17b6ea57dba4bfa51466d46f8f38ec96fe1e7",9.317957166392093],[5881,"603d325b62c195999f9e91ae7d4c089b578ab71bda564c4281803e73ad37ccd9",9.917710196779964],[2132,"086d7566c91811f005aef46d060cef641926f4a258f2d8c50c3fb1b61a5308f2",9.917710196779964],[5504,"5179c8a9d1b9eb87236c19d490e34a34a625b13f03335d2a75e957edd5e230dc",9.917710196779964],[5813,"e8c4869aaf2123d399318390cd18425132e4c0487da0f148e9ba6efd89794fda",9.317957166392093],[19209,"d95dc15224cbfc88a0ec80715bb0003ad31e8815ad8bf8f7336fa8b04fbb7418",9.317957166392093],[15967,"e36bbead198689f89dff5ab4c34b8894c8faa5cede9171a04541484ba9ac7169",9.647446457990116],[7024,"74b5160ab5ac78ae27f4a01d454f7cb2ea9dfcf69176bbe6555474780147dcd1",9.917710196779964],[19512,"b8be3892923b7ff180e59679c0e9a2655c9993f05185d712477528d554c0ef0d",9.317957166392093],[11156,"01db347b0905f5c26747653e598fabbe5fc104b59942e7a21e15d81f54b7eeb6",9.917710196779964],[32,"1c01e451a3d3b549b03b09b41353ee2cb6dc6c768f8869cbaf60bb2f5f0fd5ff",9.917710196779964],[7508,"a952b123ecd491fca5b7c0fe4c8a1e073e6c9480ddc69242dfe60bf08ea9b5ce",9.647446457990116],[19182,"d83d58b8f58d35fd0853b889285731ba7af6467d9ba73af90a4d4010cbd03b19",9.317957166392093],[7402,"f43b660d46018497b444c4b8cd0b3e1bd93f37682dbe514d79ddfad486396acf",9.917710196779964],[9631,"a10cc4c286c64d747a0c131b522c23690b36e7adbc81c45f8413af030eebd8c0",9.917710196779964],[14838,"bf47e3385b33c35b44222640c469d99317c9fe55a545b41fc4c80591977b2f82",10.052724077328646],[18928,"3d5875ac9910eb8e58acf07a02a6319602c9d567a9a44bd6f87b2ab382539b22",9.317957166392093],[11206,"e0f67ff415940b4402912f96d400b165004ac9beff8a0a9d2502ee93438ca4b6",9.917710196779964],[19094,"222914edb48938e10338f69e92aa6e386a0801e502dd141634db482f821eef1c",25.13368983957219],[6283,"cdbff04f6fbc934338aa02efeee7a0c134040821a299f0bdeb70fb93386f2ed7",9.317957166392093],[8396,"1707b994b5bf2627eb275b95ecbf5b4888353f62e47b4e24d7b06af2c5b49cc8",9.317957166392093],[17683,"1364f22578c77e5b777152b673f2d826068a8550de79476bdaeb19efc1747d43",27.86761229314421],[17944,"7d95c08bb5e554cf7755c323076397ae554c82b4f33e6267e48480609b3d553e",9.317957166392093],[19627,"5134f70bc3c03d762479d14d610867546cda15faaaeb5e43e6009001b97d8508",9.317957166392093],[6142,"d2bf3ce9ec8564110ff93b7e8ec1a5d5e4185c71a65e41fc86b678cf5e5835d8",9.317957166392093],[248,"f2597aa44c801f6755acbaf0acbb190f9a73082e04ce335215229ef77b0850fe",9.917710196779964],[12040,"496589830002ac4e346eaeaad2308c38aefe70ca6b692ca8d93034fdce2a0db1",9.317957166392093],[211,"5f5450fb7f44e2e04681d6000a25eec0f32e2dbbf2af25b357cc27e32ab68efe",9.317957166392093],[17259,"877bb4850602421191f1545bdfe4c61e46878b31a59fb1a89d9cbcca5e60eb4c",9.317957166392093],[6792,"7e436d98ac1f0863a37bcb2222fa3ca1fe2386e906e005144d05796a0e7d58d3",9.917710196779964],[3816,"9092f4c4052d9d5f1b9aec4aa3027e5c66371a445091458e5876e17440a3dee6",29.189448441247002],[7695,"e3ae895dc3a367531485c7ec29db68ff3a3e5b51826da61f36b33ace9bc294cd",9.317957166392093],[15478,"32be5f054c66fbf0a23632b312720d06c843593f640d427c1502acc4ad558674",9.317957166392093],[3606,"8f4c0cd85f6eb7c9d45493e4f07dc27b4f0658ef44c4d1a9a71c9e82953d2ee8",9.917710196779964],[4462,"3ecf660a477cd1976a86000f1c27aadadcbf7427d06d6c86f6f415413d4fa6e2",9.917710196779964],[9368,"b01b38b21fa695dc58aa457e20e478c00e1b2c2cbb7ef5837109f77456b36ac2",9.647446457990116],[13854,"10003166365ef7e321c9ae6816f76c087f8dd0ad69078d60c0657c7ff0cb4d98",9.317957166392093],[1989,"d54243c8afc81f66b804c5bbf55184908caf2116971a4c2d6de4c218416d11f3",9.917710196779964],[11327,"f0fb5e562c42c501f9b4a6db4ac0bcc73c9b4618aa3b6c6e0d3fa4251ac3d2b5",9.917710196779964],[3440,"70297d93638137741b49ecfde297248157d9624d3946996fb1f2f812aa196ee9",9.917710196779964],[1727,"fadc75ad5d6fa79ba802b735953d4c6b977c38bf64ed717e30aca80552b5bff4",9.917710196779964],[12234,"6ecca189a47c4e73127c2c89582e740e530b81a14328143a8451f1675f94caaf",9.917710196779964],[11668,"f3ca42189fa805827c2ac6dbd9d61a75beed974ad352fdbc025fba2e85de78b3",9.917710196779964],[1958,"beff3f0358a6305b13a59c8b2370b6004f7eadbe2bf8a6c9bb26b19396104df3",9.317957166392093],[7214,"1995bf82b173706771be22490fe59ad3d3ceeea1a1a1f98e402a88f905bc99d0",9.917710196779964],[4165,"f31dee5be9c244884076e7cedeced4498eb21537e834cd71fc84248dac31a7e4",9.917710196779964],[13825,"a3bd8aa38d864b1bee2b0332307a0d69fdc67c65329a615174f0b57a47c5ea98",9.317957166392093],[2910,"1374e1a885605713f3ba1cc7fd937068af4aae56ca7a3413bf89e2379f170aed",9.917710196779964],[9184,"8ff47f4f1b3c0030e493c0bc7eef8d903f8c9ee39e53166d9e876d2e9e2a98c3",25],[18547,"c16f1ea9e3a811259602d1314aabff768cd4d5a9c9b9ff2e4656a6ae96a28830",9.317957166392093],[7385,"842c34b81f609bf3acbf2b0c1dc563d94d6bec1bc124a885e6411b44e85782cf",9.917710196779964],[4929,"4f92a9bd03c4e65c90294a7ad7c44f68070582271d150518db785c1623c0a9df",9.917710196779964],[5001,"2e3535180a185214c9c0eeb7a632b6096332de92084800c06174a065fb0f2cdf",9.647446457990116],[16371,"845df5a612507b921203bd917bd0b24966f03b4f3d430a9b3824083e9b76a05f",15.079646017699115],[13928,"b89b7cd6faba1ad83313e953146b98241996e7774247c3452ae8879341ec5c96",10.052724077328646],[11900,"7cd58ddba6ce6a9b2271f65bb95663cd07f9643c38531ee1078716b1b2100ab2",9.317957166392093],[2154,"228f78d37531a19ce31ab9cfeda8334d7572dd68f663cc2e8b235e88b340e0f1",9.317957166392093],[14286,"44e5edf2bce151989b11e13f62f1decdf656e408762e795f312d998eb93efa8d",9.317957166392093],[1203,"e20ca2a797ef3900393551a9d9e958f59eca72d80bb381d52817749796fd00f8",9.917710196779964],[17136,"7dcdf91051a9ac3cc15603c92292a45cea9ff52ea58a80897d9250d3b0f9574f",9.317957166392093],[10455,"7fbfd56755f44734243fd4bd9fe7dc1afe6c47f8ec38601d712f545051b664bb",9.917710196779964],[14756,"b4bc1e8a96bad158e1eeecfc2853bea08ca3c545d97666ae5b377d959eeec883",25.1811697574893],[16283,"1f0c542c4763592a9eb7438f5322b8d1483f97427ab91f8c0ef09a71fdd69261",32.726003490401396],[5212,"8ebcf27a370bced6606a7e54149828eaa46ffbf79c11ab08aa3463589b25eadd",9.647446457990116],[672,"2adeb461433e01d6d0f0f0ed33b1489efa16fb73421ccc7f0adcba9e4b236cfb",9.917710196779964],[14338,"c503da2f4a9b27d4386bf7dc812de5edf08d5fc3ff24619317ace6a60e748e8c",9.317957166392093],[11936,"9be56fd7cb068ec62772173de0ae9e9f43ea13058eae0e240e3ac7b5acc8c1b1",9.917710196779964],[16630,"9f330ac539e52ac57b2b492052dd9b47b317a395bcaa191254b9374626682a5a",9.317957166392093],[11360,"0cadfb8d047fe8ce5b3043060a661a8e7e77460b0e796b0bff3de1ba37f49bb5",9.917710196779964],[6276,"aec703289ca50bf03cbb6bbfb81f256832413eb8b9974aa376c5cbcfbed03dd7",9.317957166392093],[18100,"b13835bfda33445e258a82a9f5cdef3f9dae5b0b0c5d48e963e29ad3b9c4e83a",9.317957166392093],[7441,"4206b085e87df6bb33799d9e8a228add92f0f8c9f2584568fb3eb9d0b5c121cf",9.317957166392093],[15285,"03909f3132736b3b4def39aef223adbe36da539f5cbd1e4f8cc1ea827790a778",19.20142602495544],[6448,"323de14fa9ae412af986baa181071b0daff91acc46de96f3c642c4baa845e9d5",9.317957166392093],[8049,"018e51e66ebea58ffc6e3d8eb7a1fc5b52414455ea3e3133ed43b97d2f702ecb",25.614035087719298],[2825,"1df525ac14f96195ad2e680c5606a8fdc52aa782de518a56b24178fea70187ed",9.917710196779964],[15150,"e23fe256f4fe3b70c720e1a440cc4f0d86916a418100381de5f054dd0b77897b",14],[17184,"e753411c669d474a27da7b8c8e9e4c97392b70e2b80728d41fd1166e8014294e",9.317957166392093],[1549,"582712df480dbb3b0e15768a7400a2221f0ad33267593aa774ca659f3776d6f5",9.317957166392093],[7548,"d825f2a149100ca3c390eb4ba22ec004f4a69aea4d6ee54ef0cd30a56c138ace",9.917710196779964],[3895,"4e4d814b6cd73d23f1193fcd5244cc1fa90aae6895815cebe0a8e7b4c17363e6",9.917710196779964],[5434,"91b16ae61fa2d9defcd0817bcf9a16e959b8be69b8b998b581acd7d05a9892dc",9.917710196779964],[12902,"b1d242d1605e42a9eeefcc7ff172b340c00f01364b492653d95797004c2b4dab",9.917710196779964],[17451,"50b437a6ff1cfc05576526716e7d72617abf97d8fd99d9f0212c843ed498aa48",10.033508207818581],[7853,"fbabc6dde1c4cadb712bc304712244454c499df50c1f3dea1a8e84687f8f7ecc",9.917710196779964],[13919,"ff53b34b8843b30e906f32631480816fecbc634fe527964c3fbc90b27cd68996",9.317957166392093],[17686,"1c3d3d90febeb444d00529e6d43e8cb8f33cc7adade1d3af9b5aee8b2bca7243",9.317957166392093],[2279,"ca35eac4fc76b69c4cce3dfed9458c51ba9d6a4e724998fe600b361d52c61bf1",9.917710196779964],[11187,"ea01a7cc7706329208d22468711d5712c9d682f656ae5d139971f7a4564bc4b6",9.917710196779964],[8996,"2f439b2b9e62909e3a4c63e7ef6a10e924d151437ec7fe159589c88d1b2ecfc4",9.917710196779964],[3835,"1d178a3e8ea993f21ff3ba04371f6deecfa7c2cbec3275f446bddbcfb5c7cde6",9.917710196779964],[15357,"2ed7dae8511f8d282f1bdbd5b1528d45c6bacb6d456d1bfb2647621d19a94077",9.317957166392093],[14650,"ae821ef178e0d364a570d4efd9f3154e4d720139bdf9c470c1dbde005740e385",9.317957166392093],[3421,"84e3f9fb77c0512011df78a4f0932cdd74d49ffb68a595454b3c55027c9285e9",9.317957166392093],[8753,"99ae4fe3a99e9e11625a6988f52fdba61eb1df8683a97adc083c11acf64f58c6",9.917710196779964],[7931,"09640524a5f4137fa28a40430e08a9711daccc3d0780ac156dfb2ce9ae8d06cc",9.917710196779964],[1066,"10b0ef8c3a7ba46373486ad66abc09fc82df1b41a554afbc2ce3c4646cb6d2f8",9.917710196779964],[13605,"43a94fea2f01c16fdfe8aebc3bc51d30bf4370fe9ca134b24ff7e9bb6d10559d",20.102564102564102],[13882,"d1e4e1da90eadd2c8359bca756f82d20fccab427a1baacdad9a03b7ba3a17e97",9.647446457990116],[12207,"2c2b1b7cb59ca29b91ee749a48c07da0ccc6b129e122db60ec74b13cdd9109b0",9.317957166392093],[10894,"43aa328a0fb1d81c6bc97c980092fcdc65b8679214e859f0e7a3bd197e56b5b8",9.917710196779964],[19293,"d808cdf803ca05b99c8e3260784878ae529182e1a5117ef6f0adf22e83b80715",9.317957166392093],[7602,"bdba70a88c484fa355ee5a8c0ebe7e68d1759f15e2c8137d268078e4b1632cce",9.917710196779964],[14876,"4f5f490d1d8bd285c5e0f06f22c311cc8be21b638479fb0d71fed944ef7d4581",9.317957166392093],[15203,"824f4da1b868d9f411a5d4bc545e14d810b3c169983e842603519d9e80f4747a",9.317957166392093],[2869,"3882d9fd9770ce9eddc839f3378ca6d0b0e940e7f4fc117e3b71cbe819c64bed",9.317957166392093],[17699,"3f67d01bc538ebb249f81cc57e4f75cabb5d6b3c07ab7921a7e7a8ab700f3343",9.317957166392093],[18372,"c5fe5723967d3a30411ae7a8491d553d25d54603a98eb28887e4ea170b534234",16.06476592749032],[1673,"4804e6ac600172b3c37d15dff172cbe43849df4cd29cdeccc61a89c8e04c1af5",9.917710196779964],[15200,"76fddc5c086ad84d4cbe387af3daaa2c84df1c42f337afd5e15a122498cc847a",9.368983957219251],[11124,"56f69a2d3067da75e3624130264e363a9870ad5f7534855ae61226c53b1320b7",9.917710196779964],[6164,"ba3635b53b0884c56f5db47a11da229a1164fe3c748148d26eccd366d1e70fd8",9.917710196779964],[17836,"092bdbdcd2af6c80d983565a09f0e5c584ddcac95644f6840cd678ca4c7b8b40",16.07111111111111],[8919,"1c7d29b9684fe67313e1cced0a64150a1e673ba480ea90f9730846663c355ac5",9.917710196779964],[673,"c2102b540a5b9cc6ea6ba865c6bd1b0dccf5f753234e2825017f71909afb66fb",9.917710196779964],[19473,"f62e678c2ded74b187885c8d5490984c98c7b07c9cda4f1d99cfdaba0d25590f",33.7674177097821],[2001,"7c96dbc344bb307acfef0b765ecd281b049b47635643de369064c3681dfd05f3",9.317957166392093],[5392,"e5dcfea833465649d460825284c7643a921b7308005805789a451a53fe53e1dc",9.317957166392093],[17879,"74222d63f21c86acef776eaf19e88ce50611b3b7f5bf81536e0909af3ae0b23f",10.052724077328646],[4990,"7a9ff6a578ba32f928302efca0a5df41600c70f4a890863ff9d67d2536ed3edf",9.317957166392093],[13043,"0e25d55502d9b4f43d16c9374ed4d61000176cf4bfd8a6ea03d0399816024caa",9.317957166392093],[3299,"68a104c33871acae2c9809807fc372c846864fa66100ce2fdf762983e11367ea",9.917710196779964],[7363,"27c4ef4d2c1fb977b20d4f29d960986d9fbc3f38883c41800f91fc65788da4cf",9.917710196779964],[8340,"6a35c8ac69e8cbe5f7acd2252095d48adf3c35f93362f04b4de23ccd2ef511c9",9.917710196779964],[12828,"258f4501268f1e1a93ec0fe0db9ffb981a40c14b1921b1716e39b2f39473c3ab",9.917710196779964],[3478,"529d1b26b50d9440d491eb7afe954ad00956c5d2895a7397576f6b552b6a30e9",9.317957166392093],[5536,"facd1ba877fb337fe7e67c72c56ee525241ab430c334006490ad9d5bf048ffdb",15.0873440285205],[4397,"15e04a67074e7f271389a489efcbc0c21bae43ee81905cd49e79567b9cdf19e3",9.917710196779964],[12841,"dc28c85185dfc4beb9a79b585e7292909c491f23fbfbe8b08e2526defdecaaab",9.917710196779964],[11080,"0a4f9ac8d8a9c39ec01f09a048ed2e13efbdc9aa105813e1f21dcd8b1bb365b7",9.917710196779964],[15667,"d2f41f3087591ef4e45be4323e35e25eac79f0c1ca4f3c39419f9a8d92181270",9.317957166392093],[12043,"41b3b78ba9c7423b5a2ab282675e166aacd2e2844171b665c97999e4ae2c08b1",9.917710196779964],[17553,"271dffab7f37c710bccfc9187f0161aa76384240063b2afb2fe77b6d0b7d6446",9.317957166392093],[11909,"5b6f6542293934d80d1cb364de42d7a4ea578117c57f3731f515698ed565f5b1",9.917710196779964],[14359,"78693ab41ba3dbc880a9156f15b79230946d50c80250650854a09cf3bee03d8c",9.317957166392093],[5827,"138eb99fd875baf9f5c51f18a6d45623b6896dc5bf51ffc9052ea77812832cda",9.917710196779964],[14487,"576bc76237c9e88a3327340cc5635c80cc015832240c5d434fbb257599a07c89",9.647446457990116],[1846,"0e58acadde88e27202e79c975b1e5e733284457108f82e0dd00259328d1ff1f3",9.317957166392093],[3828,"287754278cddba8d47d89a299af36360b8dbfe58c1c5a5d8cbc6e3d807e4d6e6",9.917710196779964],[1699,"c1717ac8784f870b4e1a896748bf3bfabd705beb3fcedd651d7bc3d3d645eef4",9.917710196779964],[16225,"de465d7abb898142244c29c52851f429c0cd5d3e7e3ea57210e22ca16f733363",9.317957166392093],[7184,"3338d6a940028cb32d09a4e2d119005fb1754f60121bb4579b6c62766d8eccd0",9.317957166392093],[17847,"a5310ddedc24662045bd61ef2292dcf212734aefb77fdde0b27d4c0bfe354240",10.052724077328646],[12180,"77df412c2ce45a2ff01f98a5577a061f4fb5aa79a6d2474b094dc6dc1cdc33b0",9.917710196779964],[13635,"7c67d3d24bc756d754ebdd8dd4c6d918254f06f695aae291045ea2b90644979c",9.317957166392093],[8319,"8f8fbfd292f59619463d66ba62ac29c597901a88d21c20e5b8b33332ae9f37c9",9.917710196779964],[3422,"8985c46d438ebd8b25400b1ac3782be1bca3bed09822427a046e6df2253b84e9",9.917710196779964],[1883,"31835be091a5d6de6597018cc5a02502c062cdbc8269507c3198bece22c0baf3",9.917710196779964],[4478,"685d53dc7ad945093629fa2a8cc3f7a40a8523000ce02a3496a60ff132308be2",9.917710196779964],[13510,"7fa4ff8192fc9e19e61cec56991bdf814e9771f0bccabcbb6c9f14898d72979f",9.317957166392093],[10443,"3e745b17c4ac25fe1d72dd63e713e67dd568e7dca1389003893aab9bb3ba78bb",9.917710196779964],[3138,"abbeb5f4ac657443f6411694cafac7a66e6f5da5f48a62373f8fd21bc25570eb",9.317957166392093],[11165,"02af62456aea8e63e82ad9fbfe01d4d91db1100de886a91d13146775cfe7e5b6",9.917710196779964],[7176,"bc0bf599006c67f99812506dfe96c2d18204af148db1d17d94e3b8a4d75adad0",9.917710196779964],[7506,"11bf463cf29275257255cd3675fe8a1dc4db97901219f120a8a1b7bb824fb6ce",9.917710196779964],[124,"5299fa3ee36242dd9d8cc8656bc566d20042ed3c1864052eeede82d91bd138ff",9.917710196779964],[11204,"23194cb704ce0ab0eac34e1b00b7d5f814107d7595c9ab35b81321db2c2da8b6",9.317957166392093],[3967,"aa3a27b2ab1f79d7247a0ddcbcaa81b9d5b630a9feb345581d9e3e1548c7eee5",27.90088495575221],[11614,"ecb8446baaa57f9c5f1f07539cec1f46dd53a423e53f916d64784354d3fbd0b3",9.917710196779964],[4738,"d09d4632f6ec3f649a22714d6e445653984ee4489d2e19cb2dec1561442bb7e0",9.917710196779964],[8073,"da79b86d4bbd0fa0437c0be09f9ae9215487f7ab602beaa5d1b2fb25f35af2ca",9.917710196779964],[9351,"a2701580f65ec969836d70e62990270793796694e461e0bc3f23caae9de293c2",9.317957166392093],[6279,"199e0b67a1ddbdbc95fe882abb460b24771a88f31ab2454736d5bfbd4a0c3ad7",9.917710196779964],[9336,"32c5c16cf22dfc962ea8d6fb280cfb72c54b4859406f4bda0881ed2f122ea9c2",9.917710196779964],[18120,"7fe1400e3771dab43fd84c5fbb53d53d09d0a699f0a3f5a1a46ba4f004d36e3a",9.647446457990116],[14749,"b68aefbe1fb0250d8ee582c9bbbc10e3a8793c0d70eeb2079eeba96025dfee83",38.72],[1872,"84aa6e41d02a55fadab9264c4b1d12d1a48c2a5335c756f3d7125d12563accf3",9.917710196779964],[12293,"ed33a5b34ed4330d8da359ea0d83564344fd880904b96463bf6984b8f47a4baf",9.917710196779964],[167,"a8c0375e635d95ec00c62478950240930389aad310f54957276b86cc545fdcfe",9.917710196779964],[9598,"870920a0471ca6f447af326f14a94c3686d2b69970754584f4c39d9a062a08c1",9.317957166392093],[4056,"5598d0fc23cc05859257835054ec0e0cbbf838b9f69391aa28200c0aebd763e5",9.917710196779964],[10015,"33605afde3a8271703106a1b7e3a904725adae34e73377596adde96fe1ef3bbe",9.917710196779964],[1619,"b3019fd60f897f72a046ca410329664813b2f339d48edd87bcf28e9ae6b973f5",20.31205673758865],[16918,"4ff239864f85e6c65583c2dec05b77ad673d59202be746aa6cd772c05ad8c553",78.27788649706459],[18182,"7f09276cb6dea5b6b073337d4a27e489fbc975e5e82f0d6a6fdf87ec98719e38",9.317957166392093],[15556,"828967ce9c20897af0e3175bcf2bbbc0d383ba1b8124a15ed04ac4c8a292b072",10.052724077328646],[14510,"017fa653822752c3d7cb817ccb6d4c7422c7c1e6c4adbbb3c8cb39ed95acef88",9.317957166392093],[13268,"9503182d7592c9c0a95a08e20104ce1d6d70067c3c75f45ccd27e73cc29f4fa5",9.317957166392093],[686,"425b28dca9c7a11f0bab3e2ecb889bf2733454e1c68c65b15437a42d15b955fb",9.317957166392093],[2355,"122fc36778af248188fdcbd49f5e6bc27fa35c5462ad297273e08f689983b7f0",9.917710196779964],[8532,"c12cc21a4a040ec7958f526ab0fa25b80a2475015fdafb240bd2be4c0ea8d0c7",9.917710196779964],[11803,"e015072ea6bac3fcce8994c79320fa1e18084d92564a52dbb7e98e59ef2bb0b2",9.917710196779964],[7909,"9ad705886a5e46aa4306a08e3b6cc6db5dec8d3488c0bdc9c8d42eb910702ecc",9.317957166392093],[19024,"340bff02df68d4aabc1998e61d0a6b05e7dc33bf2dede13f0739ad6a35c8c71f",9.647446457990116],[10482,"1bfaa6c4d1eadda7aef50ab81f9183f8d6eb4929b1a69406e3dda2f26f7a43bb",9.917710196779964],[21,"7e2b30570f87a90cd949ff072185913c0084858e93e64ae67fd141c9b010e4ff",9.917710196779964],[18817,"7d3d7d8fb98c4024227e0dc92f5ccadaa456a2ec1aeeebb6fa0ec25b68452c26",10.095238095238095],[11968,"b7e9387c43b656efa858608ebd9d8bb5d55b99b990915a7d1eba59edbab785b1",9.917710196779964],[6221,"e2c2177dc2c2db4760c4e763ddc6c48dc74e9fd5da80773c2fa61dd1ae8d9ad7",9.472566371681417],[17861,"8f7c982f35380ba04d0104d83cb2dcde5da364c6d6209462f48867ffc1baf63f",24.727777777777778],[13745,"ffc389d4a0fb8a9750fbade85e6600d95578453d631e36cfbbe183b9f7a98c9a",9.317957166392093],[4869,"169c0fab4b55c5c855d3f628df5fcef474f94cac4ef766f8c91f569a5f9204e0",9.917710196779964],[13965,"1500fa935de1680a0e3ffeec96d86fc01bad76b05f6720bf6f7f354ad72caa95",9.317957166392093],[12724,"f79fdcd62bce1fd37811b0dcdf48b7516ec1f42e1a6bd7838b34164534b16cac",9.317957166392093],[10552,"a62a8f0979f59bf8df0e6c9dc91e8178cc1399340bbf3ac6ee9282a88d8febba",9.317957166392093],[19047,"785938429ccbc4e6821a3e847a0907167a5117046daf4953a7c137ed8a65dc1e",9.317957166392093],[6546,"075b59a0f148a498a859b601f6a8b63b987ff6f9e5b41c61d500cfd0ecb90bd5",133.89121338912133],[1571,"54930d122042cf1810952cc5bd64ca57f8da964d3cc574fe5a2be6a7c579b0f5",9.917710196779964],[9526,"4c3d34b1d52162d3a6fa7ed7b767cadc6a24fd60604c3d238534e1c73c6787c1",9.917710196779964],[1367,"9996588c17938c761f419c6b7866883e149a9497a5617d926f3a08d98114f6f6",9.917710196779964],[12559,"17ef376cc7ee462d7006458f9dafff841fb01296063336ce1a31e7077aa597ad",9.317957166392093],[17079,"be794e902d41b7fc165d240b94bbc9789d2ba6f2a7a526d2bfb761e014d25850",9.317957166392093],[17688,"81605b4d0c687bb65a2367ff96fb9231d610ec368b04e5bf97c1b60538156e43",9.317957166392093],[11325,"075f4b1263c37e95e9a071768abd146a4a49bca840608f55a36acde76db9d5b5",9.317957166392093],[18687,"f6a3b7ddd7889068ca5178388a2c81540791ba5d0eac8330dab4da9e0ccecc2a",14.993318485523385],[18493,"2731b88928390ee4a10d88f0404503e4e7e844ab6461dd0086779cb1eeb08631",30.26710712600283],[11293,"22b765bf9bc20a33b44aeb2b9a90949569ff5a28f62f4590d2c54cc807df13b6",41.30769230769231],[11788,"325b7a67155894da68ad5b6c6b04d1cedae0627809328faea3b44c3850fecab2",9.917710196779964],[1399,"e3eefeb5eab4f9bc95757c71c5dee464002dd2379b33ff68f28267620298cff6",9.917710196779964],[2848,"50b4b9f764a841f498f821e5d6b219afdfccbcdd55efa504a2c63ff9bcb560ed",9.917710196779964],[1880,"59b873ca1521112a35716f603bfad1d4cbe6850e78e7dcdd513cfffabd5bc3f3",9.917710196779964],[12880,"425153e6ef7a47aad0e6597b2a2d733cf3cd035cfa0daeb59caacb5236ef67ab",10.052724077328646],[9115,"d1958de0dd5c6c16d628d8a735a469a8be43a5c01cdda463e799bc0099f70cc4",9.917710196779964],[6086,"be674e6082501b09880d517bcd7f4de9d7ab9603ee16e572090f121e2ded79d8",9.917710196779964],[17821,"9e22d32e282b22ac041d88522b935144b29060f29c8b7d338de56581cc3ade40",9.317957166392093],[14162,"fc60a496cb74c99c6b1825632ecc6a4bf77dc4f58cb9f66436bad8f30be13191",10.052724077328646],[17409,"977a6b971b1204ead878ec84b1c7719f1028cbbc2a7a36af476c663b8260a049",9.647446457990116],[10592,"103258f40d343d3c5a8c057876b56721966ed61e994b06eda4e8239ca408aeba",9.917710196779964],[6905,"42bcf5cb6dac6a1d58ebd20fe62a0bc5b0ba187893c927f4a5ea6876a37f8fd2",9.917710196779964],[14268,"06f579afaf58e2fe5fafc44d81578680f10e4952e5086dc71e18f810fa22918e",9.647446457990116],[10168,"46e0f87507f5b7671e50d8592c53f7c9a4085ba39beee5728bd5a37eced14cbd",9.317957166392093],[2890,"ccd91a6d84a1e4761377d03ce3d2f1aab2a6a06d924bcf4f5fb3d962a26531ed",9.917710196779964],[13725,"6aa3ca917a20ff35e771bc4c6acf7cacbc0582ca0e89f685b57c0bf4ce25e59a",9.317957166392093],[2200,"7b488645689db4ec85918b6af831a133f91bb055c615241d8b07e532ef3689f1",9.317957166392093],[9979,"48865d396e6c8cb141edc2c2e21ff4f657d1134803fd725a1e278efb935374be",9.917710196779964],[7088,"96538fe7861dc7dd3eb3bb558329b77ea24ec2f3ed2bbf90893de3561cf96dd1",9.917710196779964],[3627,"0de998ef7fccb0880ec7a63779dee5aae6f97e26a23457127c3f2070fe0313e8",9.917710196779964],[19716,"737585aa5fd6dc4b0959a0a4c9957375817bcb5200c17ac4670d93db8b283806",9.317957166392093],[14453,"776554bc0f8761aea7502e1a345aedd9c245456b4782156bd51a918ef4382a8a",9.317957166392093],[13286,"6f74e29c2842149232cff74d2d28d0c0b880c31632f39317c47e0db1d77bd3a4",9.317957166392093],[17693,"d0e56917dc21e53e022829732d14f241644ea37e0477e9d92f87bf7d2b0e5143",9.317957166392093],[4167,"21217c0eb9deb5fb6675b916dcadb985b8eaa44bae40900705327e03ac37a6e4",9.917710196779964],[11783,"df091a7d1a31be221edb13b497291fe8003e2cfb32c83bf874f2727659e4d0b2",9.917710196779964],[17615,"981bf56cf872ae152e33e708acee53aa9d97e349065b77d83c919358f27fe844",9.317957166392093],[4892,"e05eae3f224b08dd746738890b4204fef8e293ce5643f4bde7e0f99c81e5e1df",26.138053097345132],[15845,"978d680bff9b8e092f955503766354ffc73e7a619b733c1bd960bc7225bf676c",36.80861244019139],[10877,"a2e3a20519ba461f3c6c71bfcc483c4627e3599d41d2f4c31817177e10c4c9b8",9.917710196779964],[9815,"2fdbc415928df5453e0b9c19c3631a9f403baea1e197949caabbb208da468abf",9.917710196779964],[5235,"a47a501f96ab48793f189aadf88c6df3c1ad43849c21707e217ddb67d776c7dd",9.917710196779964],[6585,"e93f352c568f8246d9c3e67fabb6c0fac9988cea70d409f43b42f3309107bed4",9.917710196779964],[18135,"4792e0975f4569f0fb1b474436d615680815495d73f34e740d4a9f5f85c1043a",9.317957166392093],[3496,"27e835d6a1984fbb02796f4728de40b3f306dda19c84507beaa987d4caec02e9",9.917710196779964],[3134,"496dce41a155d94e90c237b47121bbb293899d315a2d0f1e5080148a97ad74eb",9.917710196779964],[3862,"e0d66f070c29ce6859944241cc9a55b5e6944e968f7063e3d49c593a639e98e6",9.917710196779964],[13569,"601d7bcec6161d256c4aa10d4f735b75469a1ff9fb60a84d143e11992ee53a9e",10.052724077328646],[16448,"9991e893f75e14667ff4059c4fd15d057aba08e28c0ca394496885a42fe1435e",9.317957166392093],[6511,"06a1fc115cfbab0a46ea51d5a0b1c307cf640da4a4842e685b5bd7a16f8255d5",9.917710196779964],[835,"faabb82e8481e03313bdc3d45757b33422616f746513aacec390f06f197f50fa",9.917710196779964],[16831,"0f1898c3087293160c9fe04b167ee2397c1726337f122586bb689296037aaa55",10.052724077328646],[11375,"808ee11d893b6df068215587db885b31bc6816bc8670e62a011490dcc9308eb5",9.917710196779964],[3,"9f38df37b99d42a3976a142caa6e3f2297d025c3bdebf1c75780a47c1d8bfcff",9.317957166392093],[6077,"0a476fb0d83564397ee4e1300d4c7ca22cd1d7e571a149f153388e8025d48bd8",9.917710196779964],[14972,"328b5b5c383488d05c2ee1e89a947d11a31430d209b88f078677d95ea821327f",9.647446457990116],[12728,"ab1f54626aa98c4b00a9f0c1c286fb9384ebefcc6777fcf661ff6b44907868ac",9.917710196779964],[16712,"5ae0ab33b3275624b3ae816787c07ebbc5cca7f3b68d908e6d75949946d24958",16.056140350877193],[3201,"be2aa1c305899be11aed3d227c9a38cc8ce66280acbb7cfcc9e4bcd27fcd0deb",9.917710196779964],[9309,"0cb87f8ba1c37623b05d0b39e8935baac81347373d42645fd65a86bc9cfdccc2",9.917710196779964],[2458,"a3c3d9a62f3a846f60cfa87d7b6479197dd4bfcae75b36c69edcb90309c423f0",9.317957166392093],[4479,"8e313db2779c90790952ef7bfb2de2f29a16c8fe5024055573d5f3dfb71c8be2",9.317957166392093],[682,"11f4f3accfa28d9e1228d00fa2173c24972263c8d9b3d9e83c2c250f264e5dfb",9.917710196779964],[12827,"d03b0c9941bc1fcaa60844414220d2ec5a8cdaa529b922f140fb5f59c01ac9ab",9.917710196779964],[4351,"6961c28fb58354e389a781c00df02f66ae8ae8b4aecf0a09c81c78510c2069e3",9.917710196779964],[2339,"6a83b792b180c8c4f2bd9b43aa3c8bb191393db80f7c05c8fac71dc9a595cbf0",9.917710196779964],[4688,"0771bd1d5310e4c08bb377d2acc562fc513e3ece01b6dd2f93878d535e5111e1",9.317957166392093],[11399,"a656550c5f6422c1167ef195ce592f42e4d1e03bdc6b18fd8f899dcd9ce657b5",9.756272401433693],[17820,"c4912eb5fe51dc5dbf8b5456fd05c3823ae942e74d2961d9ac34eb2eabfae140",10.052724077328646],[3443,"04af9962bc19247382f6ea82ee1f58517b045858627be818f8ce423fc9496be9",17.09090909090909],[7381,"c38bd90a7ba85dceabb5f609b64f287728efd2575a310a9b12bdea2325298ccf",9.317957166392093],[16886,"86476860e838707ad66610e5933bd3db0a2ff13aab023b01d00c5381ecef8654",9.647446457990116],[14543,"9376889507c73d7c2e0ad937fd62768e1649ee221ecf6bc1e826b95442a34988",9.317957166392093],[11742,"b3241e204606574b7d231cff74b13e5c83504a8b478410bfad2ef7b198340db3",9.917710196779964],[17673,"f5c7333a633563ddf6fb156bcacb7b7d03d930964b4e561a7873da82ba80b043",9.317957166392093],[12350,"bdae862cc140a25efdaf8f723387c1ea9501a157f7dbf74694c1b6f7ddb1e6ae",9.917710196779964],[9202,"844855f25687c898181aa70868f17e0c6feb91a1c05d724e8ca6684b7ba16cc3",9.917710196779964],[14670,"a287437b0077343f14c10448214f0b4d9a67afe2b7ce725c926ba85e916d6985",9.317957166392093],[17574,"0b834178f645d868f8f648b1485b9d54aa2ccffb3f496b08ed6670a4f4b5cc45",9.317957166392093],[9532,"fb41a63b4ec440ebd81a64733e2a6af37d35b91ad434c46d1b92168a060a7bc1",9.317957166392093],[13519,"9e0bd3d55c6ddb078f30c12274016ff576cc246267ccb0c1530552ccaff9669f",9.317957166392093],[7242,"13d073359ebcc98b1a9f299ecdd4bfbe20d0e1d11e6bed369d6a7c539bbb6ed0",9.917710196779964],[4457,"6f5b33a7c2ea41058b8a7257b605cd262f8b4c30480501fbf45410aaa5f4abe2",9.917710196779964],[14775,"0d39acc26a03dbad6a7d5bc825fdf042e28a906e53d91c10be342af326516983",9.317957166392093],[6602,"ada3d350527adaf2248a3a4f15ff140415dabb405086dc7c030910a3abd3a2d4",9.917710196779964],[1192,"a54d05553f8cf987a8c671a8ed5a75ab39a3f1feafcb8a0507c621318cbb10f8",9.917710196779964],[17814,"0b3969cca1efc8c2d3b1633b8e745b39838c5f15943050581e981e81459f0541",9.317957166392093],[19280,"e882faf569bb4c5d54ef8f59207b46ae19b114d371304071364bc488c2e57115",9.317957166392093],[12601,"7abbf60a54ee276fae9434ba7d47647e5ac2546fb0265674f9a65bc2bb4343ad",9.917710196779964],[17489,"98a25ce5231e7a2bd0c58b03a70a60d846e997fd49a76f19d8a055b7b88ad447",9.647446457990116],[10789,"8573eaecb6808e74474d23489412aba40ef8b66c31bd4710a31c9303326a5db9",9.917710196779964],[914,"a15d15b6b49fcfa1fe7faf4a3d4ac9745db3b664f3cfea038a8e7357ec40bbf9",39.13780918727915],[17373,"2869685c8ef9030cb6e76b484ee8049ec927fb9e3c2e85e3984667ed12cb654a",9.317957166392093],[7320,"43ecd37ce8d5fc513da913e7ccab13345c8e495612e951009e7bc34c1fe8f0cf",9.917710196779964],[9423,"ba368600dd69f6e0cb1e43463960a21a52fba1c4a007746d9d4acc6a3e8f2dc2",33.842293906810035],[2465,"271c22e47b204b993da49077b3f0bdbc04600333934fc75a2d5322cc547114f0",9.917710196779964],[7667,"e0cd0994f3a4b3e1be4f32f9add072949b60de03f895f63effd36d8670b8cecd",9.317957166392093],[1086,"259dcb7413f0a557ea2230bc10fa6c50959c0d9b345ebebdc405920e65a4a9f8",9.917710196779964],[19207,"88d2c08604a86a6d155ece37ba5fef03172bc24cc5dae14d2682ad19a34f7a18",9.317957166392093],[6151,"5f965d4142aa09de5952bce810a82d042e91d6dd0bd73174830dff96049324d8",9.917710196779964],[10179,"18a7bcc1fc3578b3e6201a3b4d63616f7da3a06b54ac0e2108a50bba8ddb2abd",9.917710196779964],[19256,"6b3337710a9ba2b2fa1f85b882abb0857f0ae88cb5d483b331d77f10746c6716",16.975265017667844],[6635,"bb2acb305aad5a04da0819e688c316e836d9a15b25df589f3afacd42bdf16fd4",9.917710196779964],[7788,"4f575693904261b62b3a2ad059785e3b9b3342d5c57335299381cddbdc92e3cc",9.317957166392093],[13988,"586b407b570f4a70251b57dae817ce06140d04264b764c14d3d48cff88b43195",9.317957166392093],[14256,"7d2973c8560307a07b0b077169bf7495fff3841af68bd9a1790f60b95f10c88e",9.317957166392093],[2925,"943e4a717ec94c0912c23bfb2cc06bd39089b1107ca081599fd4bc9dedf3deec",9.917710196779964],[18154,"fc1b781452ff809cb03e460f8cb27faecc51bd730355a1e62dd779bb3a203f39",9.317957166392093],[16198,"5d2102279c2c6fd65874970322916f5d7ee507ff205549591b32d907b2610764",9.317957166392093],[11273,"652fa5808132038b41483db8f96d8adf4cb3c8cc0a80ee54d679593fa2bb37b6",26.090592334494772],[18183,"4d1b4638a66e10160fd070a974544b626b336bbd82da1773630d0bcfb1fb9538",9.317957166392093],[9521,"f89bb5bc0022f68c0d4f64eff3008753e0e69deec784a8579c3d199283338fc1",9.317957166392093],[12416,"ded23f7713c505ac98f48a049976eef3dd513203ed642fabc6658dabb5307dae",9.917710196779964],[15084,"0cd34c54b93f4fe1f019d31849b3e5d0b370f38503d0dbdb255528a0e159fa7c",9.317957166392093],[14188,"797f691ff4b4668e0b3a6cbb55474be03446305ad5ffff545a1171d2a211a690",9.317957166392093],[16266,"b4e64287c9d8857ab943ab6a969d9afd373ecc79b15299c837cb972a862ef461",9.317957166392093],[14576,"c06abff5a61fd462a365dc82557a45c076357323a5014b69e2df5b6f521a8987",26.062350119904078],[8730,"e47e250a7d387de20b032cd49cbaeb995af95e8b4d814c352146b902050785c6",9.317957166392093],[2425,"88e7f0e94ef8a78096d2b35f6c7373142d75f7a316d6e4b378b742cd5ce251f0",9.647446457990116],[12803,"a99c0147b50e44c028ab223c444d960d4e1c8f5557fa34d41b56e41b4ae8e7ab",9.917710196779964],[11203,"84bf96628a0e62e2395d0d0358caf1dba796bfc37e705b0d0f6a9a90c14da8b6",10.013531799729364],[16895,"4361cfe0306a3b1c5f19e7c4aa0cb6d32a99542d8e6e7322d8c3cc9ac6865054",9.317957166392093],[11452,"9da2a14b148df39976ddad7d2a2e4975d77d2ab37fbed82b38dcfe53486becb4",9.317957166392093],[6640,"efd2eeec72fa6f595a25d2ece5d365f98cb24f20db0c850887742b1dd62062d4",9.317957166392093],[15469,"be83a6908138f7aed984d3b1a205a4f115c05ef5e453b618389c8eafa42bce74",16],[13074,"fbc9583f58fb8e3c35cddb5ef99d9ff25afd0b8d0d2702a630a3cb575f681aaa",21.654135338345863],[13172,"6424093b9304b308360043423c8df6ba029d2109fc5dc3d1c309b4b3be5d8aa7",27.07125307125307],[15725,"dbaccedf96f29d70d0de69b4126d4db395291cab49b57a66bd8b91353de0f96e",9.317957166392093],[1397,"a830dad94ff278fa67dd4404485b09e9256b72463fc7fec56e40f68b94f4d0f6",18.57963446475196],[1687,"f14f98985c6e4ca924022275c5bef850525e3c2cca5710ce74541988b75102f5",9.917710196779964],[3888,"fc422fc2a6708852e645726eaf293dc9fc5e4fbb6dad722aa83a2427a8cf6de6",9.917710196779964],[14295,"106afbad1baa6182106b76a08291d4bb5247475d59c9e0daf9a971ac3865c38d",9.317957166392093],[19477,"5efad0f4c8a4e7cc860ea0807b91a63b3c70f9c973e5093dbf77c40d1fad3c0f",9.647446457990116],[1538,"c2059f21b4b77487ca32843b3fd3fc49bb122a74bf45505b9fd4836a3c77e6f5",9.317957166392093],[7604,"afd58fc9abda9bd01980e7b8e2f57a1e2b7f32029e6b4f226e2f266947b02bce",9.917710196779964],[13280,"f2ceb6064a23860eb3d374c0283c09837778fb324055cc6bffddd90f577a05a5",9.317957166392093],[15778,"abdb4c4ec05d94de74411bf95797b030b435cac1e6be7cfbdb5f52320372c06d",39.13879003558719],[12352,"db062fffe7fd81096b9a3c06e83a320614b44927761e3216b1cb47e0c958e5ae",9.917710196779964],[15224,"1e101e6ba694281803bea50909e1465bb85a994b554cbcabe54d7ec5aa9e017a",9.317957166392093],[18448,"26724d13b2b4b99063dbb7f665552c7c64166ea52a4f9ff86d85830563acad32",9.317957166392093],[15028,"5105ea75407750456794efbc51076c53253b49238adc599762604e542346dc7d",9.317957166392093],[18888,"93e0667c1970cbf2aa7169a2519a3c8d64fbf2fe6174ffeffc7ff9c03546cf23",9.317957166392093],[19545,"b0bcf1ba15fcc9354826368c9930078620787b3f89677b1893df08a09f2ce90c",9.317957166392093],[2477,"157e419877c4c9d2b03fc3114320bbdddffde717a98a484d3273325318ae04f0",9.917710196779964],[6674,"cc13f90c1f363194bb758556061e2b5ae90458437be33e8d6486f9f0c97028d4",9.917710196779964],[2542,"c9cffca9e3f64c4abcde77b16611f0f13121b4ec88e49169e37f85841f1a92ef",9.917710196779964],[13250,"5f736c2db69721c1952b7ff57c05c30cac73351c51e1a09b41da0aa4b04fd0a5",9.846153846153847],[16242,"4715cf6b1be682e10a9b28584bdaff47bc1b40ad9ba3d0d849a95034bd47aa62",9.317957166392093],[339,"f80735817f73ac72638b292d0fe795a9a64808b2bbcf8e72ad6868d9e6fcc5fd",9.917710196779964],[18087,"2c9692531a4c232fbd538c8659644b0bf25ab094369911fe99757f62c513503b",9.459854014598541],[15158,"6fa7b1786e67dff481d18bbf28cd2731395a3f4bb8e1dd6ef487a4c457d0507b",9.317957166392093],[946,"a3ba087d3f4505cefba7f3d0aceb291bb222e48c185a768e76c425c20e9e84f9",9.917710196779964],[12530,"5dc5d47216df7a1914a6ba0354d180207c4cb54ef0846927469f4a3f59b7b8ad",9.917710196779964],[13420,"f7c11bf7ba9cd7021e96afc8b59b279552dbf600046e57733912c5b499f1f5a1",9.317957166392093],[6842,"6abac24cc37961976994992a4177343e68c7edfb848641847afd767b2c8e01d3",9.472566371681417],[4940,"83f4e1c086966863871acca568deb84712dd9fd21b5ed9d91f70fd772b2395df",9.917710196779964],[15961,"45293ea426ff60ecf8e9c12a715e1e971e96ea4570c507c9f0d8d38d93b38e69",9.317957166392093],[14232,"0890816b93a44a1847d3f7ba57e1523ad8b5751ea6bd00719f27688b5c0e698f",37.93594306049822],[5299,"ad23bc493b1491e2118627a62fde7945848cdf885677b97abe1eccbfc05866dd",9.917710196779964],[19751,"9a9579e42708c588e958cbcad837b797b636f98be6fa3bcb367ac336467faf04",9.317957166392093],[8533,"bbb021a170cb29d76e43c806b587dd2a7b55086b41ab698c4e3817bdf92cd0c7",9.917710196779964],[4770,"4524af49b9c109f412cef225e0cbf139d04701fd7a9becef6f065a90f05e8be0",9.917710196779964],[18555,"810440daf0e8b4fc10b5f696086890d838079b7762e900c7e4d07dbeb2245a30",9.317957166392093],[4715,"09261dc0f968505552c5c12814a28c01674422ea241e7a28384bf596c27cf1e0",9.917710196779964],[15960,"7790e9b393116bbfe7eafb814c4af880c6abfae1e30da8a00ba11969544fb869",10.052724077328646],[4384,"70b079844c39f53a6ce56817185ede2fdcb3813713b6b5e2adc286b33f9c2ae3",12.013387876534027],[1617,"5b7076983698848fb3dcd5864a614bed7bfcb34872a6ce87504610f705a175f5",9.917710196779964],[11575,"40c801fda5baead79f2f947eb5da97b78fdfe9b429194d09336ad34d8e3b18b4",9.317957166392093],[8745,"617f628224c6bd99b7d32b732bf295eb5a1ef7132fe57713c0d00a3bf7f669c6",9.917710196779964],[497,"de12723a7419a86e2cf5f2a0650b129e869c87f12d7f2c74de2475930f9ab2fc",9.917710196779964],[9482,"0cd18ada8f5787d6f579803f5b042964731a927751d6f4a263318b80387dcbc1",9.917710196779964],[5554,"f1edd25936be9ba7796329d59cb844e0ed580888a4c29b41ce24d258b10be8db",9.917710196779964],[19291,"20e27c9e676262854b6a0ac463f69b6b0956e9db6a959d0362662627f0f20e15",9.647446457990116],[14538,"7340551c465e0542ecdf4d9ca6b4110cae3b33e30643c0e536041b8292537f88",9.647446457990116],[13523,"588f70f4c764b28a78c37ca8f0496f63fbad7f6d76610ed2c80312778927559f",9.317957166392093],[1357,"646c2033c943c79f8edf1feef89c0e679a0998357316db1b47c572dbb744fef6",9.917710196779964],[3900,"90f6205bfd3841f1fec9aa5a253672d5cb694915d62e7e2351d8f36621975ae6",9.917710196779964],[19197,"3384de65b9e4ffeb56ee99a7cdea3568f51c6ac5caa3bb8a4d3c4ee4b648bd18",28.09964412811388],[8175,"54f62f148e9dbe54d040dc122a1876c55ad0e3ec6e2c36ff7cf67600e5c924ca",9.917710196779964],[19603,"49e5f6ced7e6c05e9f3955d1f567d89cf77bd5c82f33b4faf4b2c3956b5c010a",25],[3193,"ed1783aa0ace20f02c4804031d2b869d30c8dab05a1ee437fd745040438916eb",9.917710196779964],[536,"e8a1db792152e1f3b86459f2b5b0cec181cfe04ea411a17816ec4dfe28565efc",9.917710196779964],[18347,"4583a6371e9b3a8a0f2c18d7a9c04abcc1b84ef4c198ea5e387ff346a7bdd534",9.317957166392093],[8569,"d0f3db06d1c6bab5701c1a9f67909ab33540fccd057330b9df19715e8ef19dc7",9.917710196779964],[791,"76f2c4438a3732d98eebbcaac428a9e84d557a52eacaad29a941036a2d9295fa",9.317957166392093],[6703,"4eb607719bfbdc95cf68263612354cc3a6c3067dc4a28206bf167cb153fcf0d3",9.317957166392093],[10012,"d56013898b43c861fb53f036c94b02b1e5c6e7524df2d7c37381a40ce10a41be",9.917710196779964],[2263,"be92501721327277f71e69bd950cbf746b8c8af6bc031dedfce7fb7fa72630f1",9.317957166392093],[2201,"28aab29238bb68f5e64f5c6eac76d8a2d76f445964794c891c7b6b4d78fa86f1",9.917710196779964],[2411,"9268493202908b93f079091f68f7397b8e5c027a5d751f2d1b4b070a5e9960f0",9.317957166392093],[12903,"40ef83a24dba3b6dc64365343b3d629594804edbd06329d4dc42e729e8514bab",9.917710196779964],[995,"2195b60259009db02428afe6bfaadcee0ae32e12856a0c40f73ba24336d542f9",9.917710196779964],[3338,"544c4113b0d4d7ab62632eb56c320d2d20296d080e8b8699fa1247b3aa9216ea",9.917710196779964],[15752,"2c513f365cd87b1e5a5cd8a46140bd1628c7f0150d1c2058da1cec611981566e",9.317957166392093],[14397,"37b0469b41887bf1bfee3305c79b34ef97f1675074716f767b2638e1c2604e8b",26.091872791519435],[16882,"890805abc6ac4ab68b0ec7bfea014db3566fa5b252bb637abd38276a01b88c54",9.317957166392093],[15453,"4ee6704b549a4a56b8214c2ca791b775e24cc72659d65bf23f0f929e7e811475",9.317957166392093],[3453,"dc85d044f5506b70b2ebb7af3ef5d054d521a681fe59df4f0b9005959a4058e9",9.917710196779964],[4548,"36b0d1894d02d6eed767750b85586a9e2a6ab8f1a3d0d2289a0728e9e6e805e2",9.317957166392093],[17819,"02a94c7110150d2bc17ceaad84e16c5f555d1759808e50c73589e54fac6ce340",9.317957166392093],[19308,"a06cf666241199b7934985e07f364c1a2501d71221b574434d2f1b293628a214",9.500303951367782],[13777,"9d57b04d029a5e5e67c97e0dfb9385a1accf2f1d1ea2d75a99526d77b1d0d799",9.317957166392093],[1948,"33bc17bd4c304d0d75c4d258e4650011282e5f71940bccaf92fd85c982cd59f3",9.917710196779964],[6810,"8936e828f350418c9a0e7691b8f95206993fe9650666a9d73ff176983fdb35d3",9.6],[14963,"eec1e47bc72b4d368a14ecbf792fc99d78e128b5153cffb8af6dbc7d44965d7f",40.71301247771836],[17513,"766b361bdf75930f503a900059f261831755720857939dc653e4c84768753c47",9.317957166392093],[5760,"3420595fc3f46d8512e04c70f94924d6a8bfb3b358f62b420a9ae978cc7db6da",9.623651508944421],[3516,"f547d02fb118066a24f5730c93de7668c1ebad156d7f25f2577d33394991dfe8",9.317957166392093],[6004,"a70384729d224b85461f0ce1068bb1a158b8b81fb57745b8886b2e90d7e50bd9",9.317957166392093],[19793,"2efda2ba360e0a524e2f8acd65367e868aa96318c8e168e0b8fad664993dca02",9.985857670497452],[12378,"f87a595657260d8a7addafb149597cc7e9ca3661a75c6e15c5e02feab1f2c4ae",9.917710196779964],[2152,"baa3ff1bbb4c2351dee052409222aa365468b822b44e55c37f741b8c33b1e3f1",9.917710196779964],[19143,"0e3a01773858675b0c0956df49031d9a780e95237f014a3e2df39dc3394bb31a",10.052724077328646],[13758,"559d29ed26316fcfbfa6a01023b5dcd3967861fda9688c0e1fb55533dc7a2c9a",9.317957166392093],[1734,"1b13aaf50f1a9b42d9aa3fc2ba4753105a185d9303f985ba479ab2878627b2f4",9.917710196779964],[18279,"180d8dcd056c91727d69adbd96c9173cfc62790777f26825a1cfc7d6f29e4136",9.317957166392093],[8280,"f2b3ad0c24597dc3b105657f3c98a354f8844e4a99c558e89d432f59925978c9",9.917710196779964],[4864,"9aed35962ccce8de16ba02d09b9bd747e519383911256b90fc4619d2a2dd08e0",9.917710196779964],[10478,"db69d1a3758223b2d90833b644791ba052ddb7b8c0670e2900e4aa4ed24348bb",14],[16681,"eaa275aee247de757f3039b763377806a8b625d7df4d7d1ee244c43d0365fa58",9.317957166392093],[7343,"7151996019cd794d91a5f031cf2b4a67fca74747d2afee46760dbce8fc03c0cf",9.917710196779964],[8210,"be330b3b79200540d54515ee19a54fad3864e70e08fca5636e99274fd98beac9",9.917710196779964],[18871,"7025ea897994aea627748bba87cb07b55f97665b72196cf77197241ea7b85324",37.936094674556216],[19185,"d68ad8e9b8078238b3ccb93141026a53506d60209e44351176b3b28188ab3319",209.45454545454547],[14896,"f17d7cf317216e7b2ccf9fb13145009fd7408e0a8f0b6ce013d0eb7ff03cf080",9.647446457990116],[5556,"8e24a1b0eb7664bbadddb4eba818d07cf8e6719eb707a412791f0f4eaa5ae5db",9.917710196779964],[13398,"687814f5e71b772326a852db6458e537fd40075b2b20699015a50ffac06755a2",9.317957166392093],[14093,"874dfeddf09731a96d796c355c2a4a94b6cb459b6d2a46e1f74cd3e50392ba92",9.317957166392093],[14466,"e2478171877b146dc816c1b71c29ebf53116ff7f9cf86870193583e35171f989",9.317957166392093],[6060,"42055abfdb5616ec290d8171d872f65654f0c6e12b2fb869e2c2c957ca4db6d8",9.317957166392093],[5513,"18d4e4bbb626e7faa9b27e2547095de1be72486d2e31af4650f42fc19edb26dc",9.917710196779964],[1383,"cc6ef79b195758b403a5b3fecd2f8889d77c244eb6a695261f7e8319de39daf6",9.317957166392093],[7585,"cdf726f5c90801fb0c6cf5d1d8f4ce977fa58c4445d9542bcc2c6dc0604a46ce",9.917710196779964],[11315,"4c24938ba7820ffb60f4b43281c59b098e7a620397fff7f0d66aa0144764e4b5",9.917710196779964],[11394,"d73be1ad51874090599ee653e8324088e7b385b380fb9c114f040323847a64b5",9.317957166392093],[7256,"74c706619edfb02ac898051b910c4806d8b07c1dc2957dca75f07b81c49656d0",9.917710196779964],[17695,"0b1aab4444d7c85abd0420a1430193669e567a40991effbf79da258b3bb44f43",9.317957166392093],[3809,"9d35d5c18ff03c07b090e6804428a4f96cd5ddb905e4a2af407c5ebc75bee7e6",16.00182565038795],[2204,"42245cddafc452aec052e4f5871e64a1d22a5f9237a9144c217a03bd66db84f1",9.917710196779964],[15494,"fc69db47102fd8b1c3002d9e896ad2c7257e7aa3d57569592e18f342cd532c74",40.977777777777774],[4818,"6ed541d75bdd450d4b02b9d7247fd516b56212361e9d537ce30cb795b61d52e0",9.917710196779964],[16099,"66cb563335ca8b483a235c5ff0700c92a66bb56b42f7df09409a6750155f2966",25.401769911504424],[7218,"f73cd31d82f1ae436f697d631db4816888fa28e2619af4b8b304737965c48fd0",9.917710196779964],[8637,"e86a7f831b93b54a7fb49a7eefd5f8cff1806f8a7db2acec90b7206de20d2dc7",9.317957166392093],[4181,"e80370bd16c01d7a9ca79c16b83566cd9d2b6ab26bb64b1babb4c38138898de4",9.917710196779964],[5092,"4b1d2c2017b804cf2343ec9251aac40a9a4198b76cd1cc893872eac18a729fde",9.917710196779964],[10472,"4072dccd1013034bf188a279748013f09ed52e4d4e601e34ef7e45ea15184ebb",9.917710196779964],[4430,"f73e0a546887e7e4d90c8b2ef4323e04e95031b4348c22013d771ded5510dee2",9.917710196779964],[11066,"8b6501a946da29d7cbba99eeafc50d3ed52fbda295bf75206ac6be0229d490b7",9.917710196779964],[3624,"b3a225f28d00ee4ff49608c66ed456b3a307d486c5eea304b1c5ff297a6915e8",9.917710196779964],[9227,"d367293f18052ba771f6b65f8e414382422c0b442c24fbba75ee490d29fc50c3",9.917710196779964],[806,"b1ad027bbc81a1a3c5298564ef877632d6566098cdde0746b0b271c97b6082fa",9.917710196779964],[11477,"b247c95977fefaadb0df31bccde0cf7de01b8542a6cd2088ec6283f4dd8dadb4",9.917710196779964],[14776,"af076b37ffd88c0c0c0b837274dd81a81dc660e9250a4566ddbeddfddc6a6183",9.317957166392093],[93,"9bc3d757032cc3903fc9822ca43894128ce57c2efc2294a0b923679af7846aff",9.917710196779964],[2382,"a2eef1e8796a6e88f7972588a82936ca351e2cac44c8750d427d26d37dba8df0",9.917710196779964],[3665,"2ffeb1d67657b7268a105dd6458d08515bbce54ce6f050afdbff53d2dc09d6e7",31.577538551061973],[6099,"012812f3bb6278fc1dee0e53f3704dcd6baa73a75ea5dd279bc35a3901f36ad8",9.317957166392093],[5402,"7e035f100d7b0f83c7b7c642afcecbab26660c6cb54daa916d974a402512cedc",9.917710196779964],[1965,"27ac055c67eb4d2c083b6bb376805c6b79114249bf6a4944cb4308cda51842f3",9.917710196779964],[18121,"d1bb47b402bc7bb22d917de0076397679b50d7a0e69b84d03fa29f7530826c3a",9.317957166392093],[11430,"9a9097dd01b73acc204a8d61171d85511173d650a8e293757ba45105a8b71db5",9.917710196779964],[2840,"1fcd23cb90b287631f1a8da384737ff8d3d56c49c52b8bfca29ca1a676d568ed",9.917710196779964],[15749,"bc042fccaa85f154ed62cd88f6e983729389742afa0cbf179da71304ce3a6f6e",9.317957166392093],[6488,"526999b1bc371fc29f0aee788e0d659cb0a91a6297d728e8d26ab37a8ee490d5",9.317957166392093],[8272,"9fd125e9d84b2d7548ee35d7f1a68330de3dcc1e0f7d3998fcc7d91dafdb82c9",15.91459074733096],[3899,"ce183d8395d982916e6e1e9a3601c20318d2870c85474e5a0e561495cbae5ae6",9.917710196779964],[14892,"a374f9a0e8925e91e40b270bbb1ccb3be2cc88d606bb5dc869b5568b970e0181",16],[9317,"967ca2bc82e84f6a5d8176d711e932ad6cbd9458b215584a367e1cd401cfc3c2",9.917710196779964],[18673,"5aa46ae0ed5c36b46a369a3f270bd61d40b5316476708bb9f91b3fb1e0cca82b",9.647446457990116],[9823,"94ac4eebe50046b0466eb2f3ee6afffb05269739a218a636b586a055eb627ebf",9.917710196779964],[6816,"03607be079ea2a1fec45b70cdbbf5257f893a968295427e85860ff70c9bc2fd3",9.917710196779964],[2754,"16e811e983dd983bfe77bd938ed9e5bf0cd4dce4956ed733ee239c7cc8bb14ee",9.917710196779964],[6393,"da17cf71ced488b0dfb75e42e790e7b23c41fd2f1e8ebee86d65ccb6a91461d6",9.917710196779964],[9447,"0351d20485e31717b27751b94170ce4fcc820d4906b1ed197bfbb8bd261708c2",9.917710196779964],[3760,"76fc91e7bf2ad40ba43b745c1a2e667b22e2c292af69b19c79d6cfa6b86c2fe7",9.917710196779964],[3970,"43ffb427b9a58c8885e7afd0948214be2e09578e1af6cea77279aef7dc7aeae5",9.917710196779964],[4853,"62c9033e14aa1e3866c1ea6fa6415b8e3ef4262f6d4f77a20abf832321231fe0",9.917710196779964],[12052,"0be3b34a9e83a6aabe1fdcb1d7743e331b0e46ca9c0e056a6d3cc0e1a2cbf8b0",9.917710196779964],[10510,"f557f30c01ff4b296f864693cd2100e7acbfb09e0b2efa103429346f4f671dbb",9.917710196779964],[8894,"c2f79fe180ea42ae7164a1a698028525e35d2142ad422f7a9b6356fc8db877c5",9.917710196779964],[5809,"ab3188b735800cc35681f14bb4d565c32e611acdd1af6911b0333138d0d954da",9.917710196779964],[17590,"c545474d081b17a37b7fd9da57c4320547b75f7af3eacff300f6ef6449536345",206.6106032906764],[2461,"02178d12cf2e49fb910a4d47249a6776f56797d7d5ecd072e29f425742811ff0",9.917710196779964],[1752,"cd4cbf6032fc444def1c55825a7165a2ac35ff6da3b084f7842223a9c64599f4",39.20855614973262],[13273,"736e54c8eacd9db338be828dec1ecd4d3ba52594591cf94b8e1601cfec682ba5",9.317957166392093],[10763,"261ed340d66959ba85539bccbc54867fb5c8a8186cc51fe1e7d545a81e4693b9",9.997888067581837],[5475,"4147ff6da0fcdc81774eb0a28afaee795a64b55ffdca47a48ad57a5222975ddc",9.917710196779964],[11126,"332e243b6daa1921dabc9ecec0f52b45858149f708db99bf9ef938b3b7441eb7",9.917710196779964],[14878,"5921a0e881b8c84dc77ceb82cdc711755d1a30d89d4a5d7f72bcde3033fd3681",9.317957166392093],[9256,"11194255a97b9a4bd479f7e63cd29589d47ad3ebbd0290c1c2df191accc518c3",9.917710196779964],[5829,"989874c3f7c7d1766b6eefa12e3f725329dfc721ba645f97918e0614a22f29da",9.917710196779964],[3839,"29dca55aca2df45e9424257b0093f08277d76439390dee44d6b833ff6860cbe6",9.917710196779964],[14235,"97a03bdabae48dfab241813b76332457d2c61b1f6cc65f61520f710ab7f7608f",10.052724077328646],[2448,"28227a59c9d2738f28cdef20694dd96d658c7056ca43ccdd8ddf82bfca6534f0",9.917710196779964],[16377,"c221308ea659edf480a17493aae76e82b8291289845a4c665ef22f397c6e8f5f",9.317957166392093],[6333,"cfaf11474873b5e0ba03a387dc0cb847220535922a01791a272118a645f0c3d6",9.917710196779964],[19100,"ac9d1dfa9ed767c92f1d2b659852be5435414929f95582ccf85fa5a93c12c11c",9.317957166392093],[4714,"6ddd37f76bd242fc1652f372b140b2d8386617daedebde0e523e6b53419ff1e0",9.917710196779964],[19492,"6886f1f38f84a58417379f6a28348d6df5bf8644ef7758b88d7b3b14830c990e",9.317957166392093],[16674,"2d5df9cafdcb4d5cccfdce272c424041097b00b71cdf72be962c89a3d25f3f59",30.90024673951357],[6927,"a8d38e45e6c1255a782af078096e75cb0eb241d7e2a213292b64a5831fc973d2",9.917710196779964],[2417,"65b87a3975b4203f93780bfaf603d49a4c40128d1769be4cc6b53d9b346e5af0",9.917710196779964],[19334,"7d8c4f2f261e6a5b85b9c3b43a93573a5f0040e9323b47f29191110448331814",30.297777777777778],[8666,"9b8ef07bb84116d6c690aca01ec68815f295c599c23520eb175cc33382e0e2c6",9.317957166392093],[9497,"0bfda7c5c7c5322f35a52b7d1761ce01c01269f33f0b1a7b588ba13c8defb1c1",9.917710196779964],[15023,"123310247be90992883f92ad0cef7dd29e1c9310a89c7089527d7454af4cf17d",9.317957166392093],[10239,"a925fe31c3ea0090547c75019336d2e4e698436b7dcd12c19720fa0aa78bc2bc",9.917710196779964],[11896,"924d1c286913c8f229218fa0a78866d2c7f9fc7b16ee3c92ef2abbf040d30fb2",9.917710196779964],[7288,"befa3270b8b75165257174903cb4b992b8fb3341f2304470383e9f6b175826d0",10.052724077328646],[16689,"e6240b9727e7c94d0402b8dd023a6b3c700d4370c78065b39c94d03e9fd1cd58",9.317957166392093],[2879,"ec1a566f057a075a1ff66266aaf200076c2feb14a6fdcb773b5f4b3da5ea3fed",9.917710196779964],[5463,"98337574905f60c24bda0b74e5fbb44df8dd32137d53b4a9613e7cb3d8446bdc",9.917710196779964],[7514,"de1efea852ed59e40b75490210fa0970daf627af9b96a132352c231352a3adce",9.917710196779964],[11621,"ca054d4aeb093c72802686bc00c32d0f4d43c8cb49d24678007fce263b54c4b3",9.917710196779964],[12387,"65a7b71741a61fe96066d623b1fedd9cd16e09b3a7d5a62c11fe1196a13db8ae",9.917710196779964],[14770,"128bcc0686bcc91f159c891b6b6fd9283f281ea7fc74c88e9ce4a53efbd57e83",9.317957166392093],[17225,"945339d090c355bb01f1145e4e028119588d42be31ab6bf366e3182451c4634d",10.052724077328646],[2435,"40c414891a0c175989e707159dfd3c03e57cb218ad02b0eaeb3d1737a6b03ef0",9.917710196779964],[572,"68fa1b599ad0f0cb5eee86a2e604278f76c08355cbecb24ee9735ab8fddf1ffc",9.917710196779964],[8954,"2bbc48d0358c1dd484b458e7b5e26bb7e75f35ec0ec3670a8afae28b1cda16c5",9.917710196779964],[11357,"b9c9d9c6f5721e68a285a62b93468dde51e6e27c4f1a7cd3ea5619a06c779eb5",9.917710196779964],[14580,"c6c5c6a7b474dbb545e22dd9228dad2225eb0edeffbee2a552dd39b2d8a67d87",9.317957166392093],[2656,"9bb5034b50c5d1b2e250a65add1e3bcc4248f721184dea6d9662f25fdb9bd3ee",9.917710196779964],[2015,"38825c80a152aa549afd23af2ff43ab19bda8f0b257c2fc1d32250cf002ee9f2",9.917710196779964],[2697,"fae7e2c5cee679a7fca2e005ba5ec82a05b9b7d2852b7d68448c46db41837dee",9.317957166392093],[3720,"3d311a37b2d36a0b75b0bece77619d6131ba47ef19b5fc4b19dc7db2b55176e7",9.317957166392093],[12992,"312d0a8aa9293353b33bdd91e09bc6024f2e1b5025b89dbe685dd5eeb7bcacaa",9.917710196779964],[10825,"16dd579b3a19bdef56d21d26161b1b94112e78d25fcf01f61190be5fd98524b9",10.052724077328646],[120,"743b1f7344fb7ebd1abe08fa52b4942d866a4b6338f101ef134ea1255d9c42ff",9.917710196779964],[15136,"6a7239cc8ed0498b40b5f00c660e8dbeaf36994ef24812d8cce8f6272a5ff07b",9.654681381274475],[13767,"61ee477a91b271720308908b7d70492010fe6f84494643d89fda2c5c6600099a",10.052724077328646],[7383,"e7d0c70dc06ddfa9d0c57aae67773c8c2211f0a5973241a5d321b937f36088cf",9.917710196779964],[699,"b8d1ca9b68c8de5d7841665de589bbbab8a5f367356da84de62a60158f1f40fb",9.917710196779964],[17057,"67c49f1a27eba5cf27d2048c992b8b7b64c595bc6a15579f84b13bbf2b9fef50",10.052724077328646],[12063,"c990b101ce67c06568a3e92c76a80db344f9ea61203fddaf733a75eb70cee8b0",9.917710196779964],[6309,"0bd9c7e8e5d989c42bac739722fe447d188562f2a4c2eceb01f0006dd524f0d6",9.917710196779964],[18007,"39b23ca945d6a9944f6549fd727fc404957e5a4fe49ad5f968d6176c22cb133d",73.19778188539742],[5569,"6ecd1cf155da702bbb7cd6426b566b150b443a9bc50829e1200d4a702885cfdb",9.917710196779964],[9123,"964ab72fb8a25e3f7dfe3623d98deb1f1d0e82f6a2be8f88844124efcd8fffc3",9.917710196779964],[17128,"5e5e09f5fbdfa65c033ee78c21bad65010f1d8455d35c347c1500f532ed86e4f",9.317957166392093],[11918,"dfaf49e0b0f71f8b7fcd9773054df4f0f3751ad0c176dc96702abcc7f8ece5b1",9.917710196779964],[7246,"b4be06b7b6e1071c57e4801dfd2662f2da697d9948405ce9c1ce1f0618fd66d0",9.917710196779964],[6811,"62be37483d13716ebae3f7dc2814dc543c95111b781411a57823d05a900034d3",9.917710196779964],[13731,"d2a49e5c85203a39e70c01643987872f8b2de5d61df57dc50bc4b118c8edcc9a",9.317957166392093],[940,"cd28edcfe3e2edb6bca6b876c97329b2b0afbb01e3ca1d01a206629d49fc8cf9",9.917710196779964],[11729,"305aa1370c534e3cb5a65c970776f71383a9f88efa911b480668e107440e19b3",9.917710196779964],[18210,"7ed09e4bc6c7c0837b5b12c16e889b5862da915071656c74ee075d80f282d837",9.317957166392093],[10690,"5d363d21a8c693646966493359150f43eabd1be1217102068c23aec5109613ba",9.917710196779964],[11695,"ffb8923e61f69842f084904d408a155b8fdb298e9055de4aca6f4f1d2fb553b3",9.917710196779964],[16233,"51bc1628d6531e6bdf0bebf6a6547b8c0c8b0ab9a615aa9bc4e31fe869eff662",9.317957166392093],[15366,"ad9d5656df4d0da1ca7ca99c16d6bc3d3e962bc9a8d2b911a518edffbe140577",9.317957166392093],[5837,"9b23e6d0185453fd85c9ebee06a2d7bf6f48c37dce949c960e1d6550695019da",9.917710196779964],[17291,"9836e8d0efa38c4e0a59f5d044b522df47cb5daeb5614fec928abe45fc26644c",9.317957166392093],[7783,"5dcfbb594c89a798a8def86ea6d4909c5af6ec8832d34c41b4a768f3e04eebcc",9.917710196779964],[7854,"cfede7ef7e132aa5ea1f1062abc8cc0e22b94bb902ac84822d7cc18abba17dcc",9.917710196779964],[4227,"58e87106324ed75abf75dc81049bc5a31db4f1900fe849c4f1e661615f113fe4",10],[2946,"141d6801675b607850fea899d5eb97dc046337dd53d8105d31a0e1682b90b7ec",9.917710196779964],[2065,"7cf3742a83eeca36b9089d14d8ce42668c9ad22b3723597f070d3127d19975f2",9.917710196779964],[1858,"dfd1c0580fc3e8e9dc1b02b8417178fe47e7e8e5d8be74f7e9bc32ca608de2f3",9.317957166392093],[16203,"22658e6d30788a72d5ea9c8ecf157768578ba4251d6d5dccc15813187f6be163",9.317957166392093],[18375,"510cfecda327d7a9cd02ecc1013af8177a33a8e563f353c710513e3eb31f3334",9.317957166392093],[373,"858c070eab6f7b809b9187fe29e969e738658d64d0bc68653c5562ded1588efd",9.917710196779964],[2246,"a1cba7fa1ee92ab2ee759aafb455edf4ad3c87db7b28b46e1c8b869bf1ef45f1",9.917710196779964],[19599,"dc136d3682d5196d099c0b0f7c55623a0f0dfdd0001b55912f2e16b5776c100a",10.052724077328646],[19609,"000bb9244b045dc42e1e7a34beef6d9275ab5637f8341be4a23dba46697c8d09",9.317957166392093],[6689,"a5d7488702c7ddc2e505cd2beba6bb8f3c88d6924e5491a6779601e02dfb06d4",9.917710196779964],[16048,"7cbb72e74618ffd1b62745531511486a08835672a3b1cc65636261f893757567",15.94306049822064],[3783,"b9a923b212a2ede645e61686ee30eb7a41bb7ea6e0fe6dcf4f43a5298ccd0ee7",9.317957166392093],[1378,"57f5294a922dbfdb1a4be6e3a718df1f71e7b1c9cb0a8208f8d450676c48e3f6",9.917710196779964],[9179,"42c73d72d79d3b07e74842749628e9e43758e790dde550a90e999d03bac29dc3",9.917710196779964],[6473,"4abf0b4cdd819a8c34b6fa6d263bf019eebabf8bc4de6e0fdda3d1155c66a2d5",9.647446457990116],[3514,"a152e55fd9e9ac2fbb83a9def9f5c0cd015e7fd37415fef2369ea5a08bbde5e8",9.917710196779964],[16502,"d54161e6049a6bd4301db5a5f96a438c0ed4622c941c20e3a1d768991b6a2c5d",10.052724077328646],[18362,"d3e714aabdb3ea730d560fd86d3c1b0aab2bd3b509b33cb4c9b174b3ea877534",9.317957166392093],[5914,"74b7b0be67e4fa588aa1d273f863e4c7244b84af5cf1b1670210f46b6cd698d9",9.317957166392093],[19343,"dd93493a3e8e1ec87e8ef3223eb4765ed789a9c4505da9084d886d60971bc813",9.317957166392093],[2905,"a9a20c4e7fdbe10ffa80e8952c61375c3c1075ab8f5be6ce6fb8696c205017ed",9.917710196779964],[6145,"25f0796db918d7c7958d76a25354db552cb6625646a65ffb2e18a9cc6a1c2bd8",9.317957166392093],[192,"21eccc0df556fc504425282cc1bf5a435c492f25b05386e0f2f7d9152814bcfe",9.364928909952607],[277,"9f442bdf0b82e45f19a02da8cf34d2fd530a7434491a9eb3ebaab0f789a918fe",9.917710196779964],[14303,"8276ebf506ed125102bbfcbff9f9c7ebde427d3540ddaacba23bf2e71a89768d",27.796363636363637],[9247,"e3480409642e55b588618ffa45a4f46088711ffd75b33c52fc933c537f3b23c3",9.917710196779964],[8484,"099f008a98f949d4231e8b351e2d87e7151891982a40da46ed3ca6dcd20e1cc8",9.917710196779964],[8557,"98a32cba82c38eed267140e8630199595080686bdb16866c0e8a43257f17b0c7",9.317957166392093],[5044,"ab557fd4a92e6e3ab963f2d8dfd57627ff0363d1f9702a0b5b6a44e6d0bbeede",9.917710196779964],[2895,"55d994a25fcade595571d3f21beb29aed0724b2679b26fbbc67add5c45ea2bed",9.917710196779964],[11741,"b593173964a5bb76f0db08a0c426f0f296f44e2044b97fad48a88988b4d50db3",9.917710196779964],[3270,"d295a24be5bba33dfb31aa19a6cd83c4024a4543efe5a835f399480982d591ea",9.917710196779964],[4231,"4ac168797572fa2237cb09554be7310685c7f295fecb0cbd0f403cc6029b32e4",9.917710196779964],[11555,"8c6aa7a55a0af177a19976ec97d48ac12d73d5ab4209fc82f1ba4556b87332b4",28.111910471622704],[10776,"0f4649551f996102ed33808431d803bbdbdbf0a9482e8e3b1f087575268b73b9",9.917710196779964],[3286,"15692f2674c796335ecbf3602b313b4fe5f35aabe12fd268d825842e896e7eea",9.917710196779964],[6718,"5796f42850e269e3edde68a695fc7833c0f04f050899d1fee1e5b4b346c4d3d3",9.917710196779964],[9814,"9827aca5ff3487bbd5ded4b9d6f0b89288fff661e12b04134745abf9a91a8bbf",9.917710196779964],[14512,"ab6511769073d04020d6885b7d9e27e1723cb5d18c2b7c344263ddfa4e7fe288",10.028741985407915],[19038,"66ff17d690347742f0a452242980dc3af94c346e513abd06e12ca4ac36f5581f",18.201680672268907],[11038,"0b9de60d1f8e54120142bf83d559cfe8b803ad3f0d705381a7ef20b524b7cab7",9.317957166392093],[12042,"888981eeacd0247837b604cafab1a73025193a113aaff299de719e9fcf4609b1",9.917710196779964],[4555,"a0ef9f91cbe841baee84c639bde428a1ace277e05756685c849dc3ed671af0e1",9.917710196779964],[3183,"3e8c55ddfe1e7395bba65fd43ac8b2b149861ce442f2a01dff22c927191c21eb",9.917710196779964],[8748,"907ba9413324ad2303834883e320b5ffa97fce2dfac0bbd7e5c893faa25c67c6",9.917710196779964],[3687,"b8da57568c936ab9eabb85a0ae3800122890dd0674e319386ea727080892b2e7",9.917710196779964],[10400,"21262c7ef05195c4d3912e57c8b23b6c26a49c947ca438ea00cf2b03ce64cbbb",9.317957166392093],[8965,"4c6477d9dc90c5b695cdfdcd54e19b3bc99198870dbf9a84cd5129d6b6ce0bc5",9.917710196779964],[10657,"cf1cce6e78b2a8a1ec154d606b24b271bbea0bfb5f79d705cd6a4c16469c4fba",9.317957166392093],[12729,"c73d52abc20cf3a5e7bfaf75be82319e4c4a0660eafefbe2c0ceb05ece8467ac",9.917710196779964],[3051,"0598f045dfa840ffbd9326463391ef1d66c6f03aad9ef7dee6e357e9cbdffaeb",9.917710196779964],[12668,"28a5f3a04f4097fd38ae398c69f6b4cc1662a095dccd1a736c7d03601744d0ac",9.917710196779964],[1853,"200b3bef45e565a0e62d98d9af8268e279d6f58a4c8453145ba869f34369ecf3",9.917710196779964],[12939,"988236a3f3a9dd0d2224a05bc5e5af6f6c8b603e1526f8072d28f19299affeaa",9.317957166392093],[13395,"e5049aad3224c3aceddd494852770de2a94b1c68583e9b93ab30762e7a6c61a2",9.317957166392093],[9677,"0d43a583877b28bba48ab6bd1a810add05026eb117e0dfc0dfe1b0f1d8f68ac0",9.917710196779964],[7922,"886c33b0d1c38451bf5f0fa3fbed7ca065613853b7332d4076c50ec2046917cc",19.964412811387902],[524,"db049d495c03cc9df148b8ee1bf35cd168ec538c578785c7da34b007c7d47efc",40.64262295081967],[3647,"3c0b462b3e3d85c94932784c8fd5def3b8286fff179ff749b398ba22f755f9e7",9.917710196779964],[2202,"afb56f6cde97c9f638109bbbd4a9f9a5992b6d84db1ee6abb95472284aae85f1",9.317957166392093],[17947,"4a4b0ad31e126cceb0a40fe55847fbdac8d5bcb7455071076c8f258165fb4e3e",9.317957166392093],[13657,"0ee2ecb654849606a4e6298f9b19f4a0cf1ba6512198e1a18151a5b5dcdc149c",9.317957166392093],[1823,"c67a2c2b362a018e477eda41629f10ddac6e80485632bec5947fcb07879016f4",10.022779043280183],[2924,"33b8f2cb33d32d41c17e2d8b6bd028ba88572d3a7c80132114f48cb81b07e8ec",9.917710196779964],[7758,"604f5b27595ef999378c35ebfc5c991b7ea1f661aedcf440dbb2e669dc7f13cd",9.917710196779964],[14137,"d432d2133dd529db9ffc9eea1191e8f1adf63f631f3104dbd01aad58c556c391",9.317957166392093],[7317,"da9502c15c2a7119276452ce61cb6d43986c72cd7189b9b4cd54fbf9036bf7cf",9.647446457990116],[19596,"64f501d7f132a46e65a60b2e2ae02ad86d90eb5bdd2c4851397439d7081f420a",9.317957166392093],[3972,"c9f323bb12faea5d380007b958300e35d0c7a518a3bf9452b8cd54c8860ce8e5",9.917710196779964],[8505,"37c6ec13de912f02e952a1037541e7dacb5949b572f823453bff93b941ddfec7",9.917710196779964],[1486,"ef0bdc8ab265929d3c4355809a99214a4ea09922f0017a692ed698086dfc36f6",9.917710196779964],[12801,"8dbf6f69627dee623418b943667cdd86e086712ef907798d098ef6917080ecab",9.917710196779964],[12790,"f688474322f394687a356e8c946bf86797f463690109dccd7dc201d727a6f8ab",9.917710196779964],[18587,"fddf595deb9e8bf4cf59bee9cbcf710734b67b898f9acb5f6d032db57989392f",14.188034188034187],[14220,"25a524cc255a3148182e48218cda6e3c20e15581c07a5927085c21d792c8a98f",9.317957166392093],[5267,"e414c01ceb41f1a917dbe1e723d73ea2fc06ca37741b504ee13b9de22eff94dd",9.917710196779964],[9223,"0828247fdcdde10511e52f3225187c25a74631406e366034342ad17b4f1e53c3",9.917710196779964],[16562,"efc4b0574e6249ce3fbc67e22faa3b966f26720a94ef09ded96297950ed7da5b",11.048175182481751],[12362,"537af3b090fb554269e1e9fedcdb018ceee6ebcf8f6a656c4613964f4262d6ae",9.317957166392093],[798,"d8a2db0b5aba8dcc0aa0c33b4d7771b5d58ee282c6e24d36bf052ab1d69b8bfa",9.917710196779964],[13705,"b449566d5ebea9ec2323e727ccd9ad6f5f22b6a43b0af5f2d22af7b588d33d9b",10.00349040139616],[19755,"46e5f5e1d9e7ce6a5227168b38b98873c47ca42fcec762940b4053b817748504",9.317957166392093],[3254,"959d7074b9f600ea6d66ada01ee28ef7ff845053370fb4663a479d3c3415a5ea",9.917710196779964],[1843,"6891805333b94a64f4eca1d8cd912786fa015eaa12c63b852f5e3cc265a1f3f3",9.917710196779964],[6026,"c106f09ea3850ad1940aaac7658ebf810abc90d799d723ee35716a40f78ce2d8",39.20855614973262],[6308,"c901b48e7d23875142001f93d204995a5a50b12d18848a091dad80a7cb26f1d6",9.647446457990116],[726,"c35c7e16275c543776bd69d61cf3ad7a9d8f06fb0c6d48abbcffc6845b260afb",9.917710196779964],[11947,"16b047541f2d9e1560dd765b1c97684cf1f5cffd7fab2d0d61355d9cfe0aa9b1",9.437070938215102],[6392,"f7157a9468300ab07b2256269a5c974cedff4261ddad798df1e8e03b8ae161d6",9.917710196779964],[3768,"eb1493ef529370d333bf037388e7a3f18b15dac9d9806af93273adc0d37c29e7",9.917710196779964],[15056,"ba29040c4341c39cbd321a204380c298f64f116ba670464b7dc588fda3c46e7d",9.317957166392093],[11366,"594c2173dd6a361b1b7b3f7e4a592df5f2c919408f42cd19054730a7da5399b5",9.917710196779964],[19037,"31bfcdc52c451a865678cf0c5e04f36d518b80f585b0ab9a347257eb62fc611f",28],[1733,"10d0dd35c929c121a761923a1b7ef52be01dc1e2df272eb4a9ea4e38d33db2f4",9.917710196779964],[18567,"d7c6859aaa3a3e3595b7981fbe3483c11b9e7e8ac19d081aec37f2705afbfb2f",9.317957166392093],[13232,"25e4818059acd4b2e502fbae2de0754b38f986d1cb244809da596b5bafaf44a6",17.99859254046446],[7793,"b201a0305637a873168a16ac7dade43582f3f04ad8f271dc6a89c5a1167dd9cc",9.917710196779964],[8311,"402ec4169b44aa445390f6e3ebedd60f6308a367138639818cee0471d24b41c9",9.917710196779964],[8498,"d4ff458cecb11d8da7115c5108e3e99516df755645a7d9621d0d84b6cb5808c8",9.317957166392093],[13738,"02e3b41930b6d396b7e276e727882db08af378b4f764779df93c4c3ce392b69a",9.317957166392093],[6935,"0b9520e3497a3d86d6d015eb2b3bf82935fde90c93e9a7602ceab3840c6967d2",9.917710196779964],[119,"1db8180254d922ac2af2329750e85f39bb4d08adc9c272c90b8dc5edca8743ff",9.917710196779964],[15011,"79d6c6ca4eb6f16fc2c170701fdb2ba62976825a61024164fdd512ad47351c7e",14.188948306595366],[11655,"5bcb76e2c7fbb132d42c05f2b4cd280ea7572ea2ced4c653361487b037d990b3",9.917710196779964],[4786,"3c28bfd079ee964d6a9084eb1fa96509108525cc17bbbd6c35ad8482117480e0",9.317957166392093],[671,"a4f718128e1517fb4d0bf53b101a44dc41eb321af7522cefc7edcb5a4e966dfb",9.917710196779964],[15798,"65c037a84e7259ccb570a478d8237798bb187b97fc399d80a418c7236438636d",9.317957166392093],[12624,"6a79757797e5b18edf03391e3d171fb996552b76c727ecfecdce8722c4a21ead",9.917710196779964],[8739,"d3447eced93515b15eb0cb5f9c26b968e0a98c4b632181b173047812d38677c6",9.917710196779964],[16073,"550bba2210907642504dcd8b10421719ce43b4d6288f38b0e8a7e37bc341c166",9.317957166392093],[6877,"ad9819c9989eace3dd6af41eb42f01d27cf51058998158d81b63bf5c5f45c4d2",9.917710196779964],[14231,"f10eed4db81b246689212670be8141ebc9cd6433df13b26b6b1e1f18ae34718f",9.985072827911031],[7135,"c249506ed783057be601d9be40aaa41931ace1abb0db5e001582c7471c491bd1",9.317957166392093],[12520,"cadbb8907db5681d48bbad9c53cefa3c5068c59e8270a1db95dbd39107a9d5ad",9.917710196779964],[11012,"66083da8f9d950963892a26c873710c9c3e795303ea17c10556fc23aab8cecb7",9.917710196779964],[17245,"c67509bccf41c20be4f66b739a9e27326da1f3812bb71b15dc940fa60a5b0d4d",9.317957166392093],[12306,"3451d95e1942d0385b8e4cee8031bbab23264f30aa33fbf7d1715d4c806330af",9.317957166392093],[1576,"12e2acf7ff91c54a8fbce9b666e78c65795a7804c56802828ace166d86e7abf5",9.317957166392093],[18610,"f4875b5c64af36bf162887f78e60f2516f19486cbbdeb7575b0f86eca4bb5a2e",20.07168458781362],[13607,"132ab20264465aca8cfa9ee6fbe1a08f7533360714fdcb8231925490ed7f4a9d",26.124401913875598],[13483,"55eabcd38f2e7c8231ecee6094f6d0a2757fdb212844028b9e955741739e3ca0",38.87414187643021],[9007,"582fd2a557e555607059646de3d40e8c0edc4f4e175dbab521ad8dda8beebfc4",9.917710196779964],[1017,"0541ea1d2f04ab5ff832d936a0fb0631ced33cb16e3148f09786b3752b2e1ff9",9.917710196779964],[15218,"f7b34293d6ba53686d49ae3e11822312e60aedd00da7709ec387e282090d1f7a",9.317957166392093],[19168,"e8f10ca3de011d355ea91196b63d348f57cd53f2a61a48d2ef9a204d5d0fde19",9.317957166392093],[18441,"554aa03fbdce1b9e2be06c284cb531f22a3530ac7132e25e7db38255a260d632",9.317957166392093],[11943,"cc70efad125045dfd2b6dd1cd52f8111ed73718f8e181b60b2db60c2369eb3b1",9.917710196779964],[587,"60b65e5eb9ef0eef3ebc623b8ecad19a532d2ad48a410521fe3fc070393301fc",9.917710196779964],[17663,"e0b2f305158481f8c0478fe8482e2a5b4d5c52cee963fbbf801ac8e45e20de43",9.317957166392093],[3955,"1f33e32a91d96ed38a56c078a4115e434b22eea8fe4e737391eea87ad81ff9e5",9.917710196779964],[15859,"6cc555ab78afa572c5f336b7ea98cdab42c8b5b77647125dcc7be2a26d16fd6b",10],[9857,"9cb2c3d84b683bfef9710e51e3412b4999fd863c2e9f5c9b31c641be9a563cbf",9.946524064171124],[12834,"8fe1e8a310f100b45782a2d7d43b15afb7bd2b29bb5f3f4de870e3fcc5feb6ab",9.917710196779964],[5193,"9d292ece3a7d05513377b2f37c5b28c8ef8e6fc77632c08f1f431191fcb606de",9.317957166392093],[16175,"6db7db9422b3824cd0aadb51e2df86a2f4687861c9e0c96d9a7cc1dcb6c77c64",9.317957166392093],[11503,"f3d1165bf7e10d95b35b6e72d146106102f3cecc3f9b732ae36653a3be6f7cb4",9.917710196779964],[2401,"5a07336a2ce67175b9202d01868aa4e8b0c3017d1f2979e8e0e00229dd0c79f0",9.917710196779964],[18786,"ff96eab4a7dd3413b1d628d5c0a426ab1d765ef3b4381ab5591f40c955798627",9.317957166392093],[15118,"d5ade69103b72f3c1a38baa7dc35a3755e60c5ac3aa76b4dc86d5d171eca517c",9.317957166392093],[8491,"fcf731ea5009a23e526789835932d2d2adfd1df46f7736971ef0050de27b11c8",9.917710196779964],[6536,"ae543056ce4c39227af2617fd24154c96b5bbb4e56c364f8db4f45e19bfa25d5",9.917710196779964],[19320,"7e015ba1aea2a33f2f54701a3b362644858e1349f979b937eadac1042f0b5214",9.647446457990116],[13099,"696c2de1064afe9fc8670d768c81f25c2af0f4629386c27133221bb1e0ac52a9",9.65680473372781],[3285,"be65c09bf91fbfba95c1dda7f98f5f37ccc2e3459520332199ad11310c4280ea",9.917710196779964],[13917,"5275a9fd4cbba881fdd78875d9188df8b49e7fa4916fd07c35edcbc88318a796",9.317957166392093],[5800,"85f375e813c81b0ba3b1b2e193eb574542a62b36a41ba07b07e65271f8f76eda",9.317957166392093],[9755,"f0002a9c752fa5452ba7ae6fd3c3796ac008f479f7b5f4fd45ed7c7ce565f9bf",9.917710196779964],[948,"73b8b973d28fa7e14bc6af87b7c32c1d60b4c76b9ffb84386f2350b04d3b83f9",9.917710196779964],[16690,"362b47ba04669e1a88670eb0bc33cb172726e08a615f7334dde59c8e413eba58",9.317957166392093],[6050,"2ce52428e3458fb0a50828002882f5201bdf3eafa4eef9e9fc12de54ef47c0d8",9.917710196779964],[18988,"b1012c22c4d6d638ec9b5df68b9446193eae4a78afd2cce6112126e7b2b6f920",9.317957166392093],[7939,"aae1254360d01a42d6ffda5eadce7ff74c3c80b5c197336f1f0a4a75008bf2cb",9.317957166392093],[10934,"4ebd1676c0b13bbe4e9fa6c18a812bfcd537b5b266cda0bb07cca072df857ab8",25.60096153846154],[9389,"ef59338b5e1c98d8f64fe804ee48e3e4f27ddb4e1930dcdc5aae6bd99f2c57c2",9.917710196779964],[15947,"02fc55e82026116eadb6c154c4d3809c6d4e879d395585b7dabc8d5d3038fd69",9.317957166392093],[16719,"c16bad1edb37460b5baf45cc6f1f11c765bc0f969f875b02032e454e8bd41d58",9.317957166392093],[8122,"ba45c63386823818991a906e7a118e9a63a7c0db44cb0def1ead35d79a3e9cca",9.917710196779964],[17708,"938071b631d6feac7f685f56be568d4127913a555ed0b33dffb3f006e6c71643",9.317957166392093],[638,"73e425cb2e4513709dfaee8bdd54bd6309375efd168d4350bc2610f1e71ca9fb",9.917710196779964],[11869,"18dc19425c8bba04e48b7c3c8d110d868dd0cdf776b2c41dc4a84e4cf36242b2",9.917710196779964],[1605,"4fc38672eafe362b70cf78d9f84e8aec0e946970d4d325995e71380f1e7387f5",9.317957166392093],[12211,"e7dd63ba1c22667eb1c5d17178ae625a8d794250263673dde861677727e005b0",9.317957166392093],[3359,"ddd05c22c943195eb236b75ce05340cd6422da94920f0737c0350c9f5660fae9",9.317957166392093],[5451,"83227105c8ea18421802df345c90673d7aeea6808ddf8e22f555b4659c7a79dc",9.917710196779964],[12047,"247877c2aa924774633e1260a5b3b151e5c5ff6288f3d4072915ce7a335700b1",9.917710196779964],[164,"774213ebcb5c21275d026b1453df6c3a48def2c8a39f5eec74afa8d50730e7fe",9.647446457990116],[1428,"6b3b11a8f473df7159fe96f915181193e76586ec10335a66c083c0a9495ea8f6",9.917710196779964],[6267,"f93b2f610781824e61bd1c83269062d7aed2e136a380e83e7ea33cadd74f4bd7",9.917710196779964],[6638,"2ec47c46e95bd43bdd7cc72656d0280a863fd4a0da40d9f05e0ab9f7058d68d4",9.917710196779964],[10046,"9d4771f01b13ef5a8a8b982fee4e9431494452af1969fcf7f0070a32dcdf13be",9.917710196779964],[3579,"a49d849adb2e4fe5fabc7d26c5ddd0690d4150f9f367acc82cd2d928058271e8",9.917710196779964],[13632,"35836eff5ab72cb1ea6035150269b68087fafec36d2e0a8250a7f60b4f4fa69c",9.317957166392093],[175,"0ee16fcf2ba3c50d631eacedd7db223f0af9e8cbb8dfd91bb02fc028566ed4fe",9.917710196779964],[19405,"2ada6a65270f7c87bdcd4fc99e0bc7a3ca77aacfaa885d3ead90a4cd2aec4711",9.317957166392093],[15144,"c11c6089da18cddfe6435547811c54374563d5516d3052813b74b90dbc81a37b",9.317957166392093],[9241,"b9bbb3b7abb61c1fffff9e95bc98779e8c1596fd9e877994a6871831cd632cc3",9.917710196779964],[12876,"763bb49a290d175faa1762faf8a1a492cc934cb8e7d174b1840f5fe7b5496bab",9.917710196779964],[3521,"ca90f37c28da088438f4e441c9f0b9914d9d9800d94be351c3da85c2c7acd5e8",9.317957166392093],[12398,"cca671ea6923ba385cb4a229178099aeb17d416e3bace27e54c7b08141919fae",9.917710196779964],[6952,"34fa0276b381447d77f36ce8ce2e9c5b00df4733223405db7048449b7f033fd2",9.917710196779964],[10402,"3d095a0d2ba3ab4bbe92ed91357e9e19b97f7e45b2cad79cc2cd42c4a510c7bb",15.94319526627219],[9974,"70be1f0989c30d768f74506512463269a1838c34931f48a550f5c0aa0d5c7abe",9.917710196779964],[9903,"ee92c85e4a8380e1d84134a684a8e3661a92cef5d340cb441e85845ae8e2ebbe",9.917710196779964],[4028,"d9e30b3e6dafe33699ada7db2b54e8195a63bd6d6063ccd90bf7b3a01fec93e5",9.317957166392093],[3424,"4eb953b19bb97b94b307a8b2a228a6212e808de9567bae686b1adf8d86da7fe9",9.317957166392093],[88,"77094634d9b1fb42ff2bf13cf52e223bd0f171086ce3cb63aafa5f8bf07f6dff",9.917710196779964],[17109,"ba4df45b410fd1d988ceec544174f22ff97b31a3efa7be1388ab6a978917cb4f",10.052724077328646],[4359,"3dc667e0d480632b48d129eddf6dee26e1ca5b0acc68eacce75d705730625be3",9.917710196779964],[17631,"236dc9f97ff3b74285e5b7a0920d9311ea06a39f1d12c2f80f10dfa3fcf59c44",27.558333333333334],[7647,"2eb17a765c74d2d93123b6cc8c491e4c09d561e50c7ded15c96fdf9f13d0e9cd",9.917710196779964],[1151,"55854e0edfd31381b52a783761c545586b0852aada0b21d105a73d4776d14ff8",9.917710196779964],[16595,"cc3dfc427e769652bc55bcdeabcf155997c3150f3ea1c71b01d7c3dcad77ff5a",26.863741339491916],[2628,"30df1f962179fbf1a1f7a6132ae8ea3ef96e3b7f84aa727cf53f61a4b0ec02ef",9.917710196779964],[14521,"12c6b948230c0a150965391d0f9cd551e711881235b9d01ca0594cebbb57c488",9.317957166392093],[7533,"1efc3ca6da749bc910b567d3136152488b2e742a0a0f2271d0eb95e9a59c96ce",9.917710196779964],[8302,"93019d23fce2ad3e25aedf3678e9a450443757ba770cea7b7e7cf8ac25ce52c9",9.317957166392093],[4365,"aa4727e5f26b0aaeb55bdfa7c11c7e0fbb4fa9beedf994b93c8a66d14cae4ee3",9.917710196779964],[6415,"21af0ccb44da96e8b6f9651226b18bced2214ce8e4cf051017bc3d78634e3ad6",9.917710196779964],[3699,"e881c6c81d49972e2b93270fe0582deb1e7f51c0dd2a4634502f8c1b661299e7",9.917710196779964],[15818,"ec9b59185765c621059ebbc9ce94509c6680fc1698b835cb6c2cf89e1293096d",9.317957166392093],[1723,"df5604ebc001e4c57bba576b10de33326e9ff05516381ae7433704dfa8cac7f4",9.317957166392093],[13026,"7dbd861de6d49b41c8c123656b00143a344b486213b5a52d3339e9a3f72d6daa",9.917710196779964],[2931,"8d43bd243fc804b2540747d18ac4ceee5d24e581372b4f578f0fd1e7e0afd4ec",9.317957166392093],[7053,"9fafc866d4ffe92f8baed5e8ff114b8479e99cd42a4701ddc5576843c4cca5d1",9.917710196779964],[18304,"e9771ef5bb8d018e577b5c308e70aa565114d63ff0cfaf1db373f31b7ee3c435",9.317957166392093],[3974,"1fb90777bbcda1a58a932e5171823e00d6144ab31e8a725bf68907d708c0e6e5",9.317957166392093],[1746,"cb2c63448bb3e56efcaf24fed6827a6e84bfc5fe766d6842758f3110dc32a3f4",27.900178253119428],[17621,"cd1e244ed3ed1b61ed0f1c462b4bd46cc1fcdfa9bb8fa60fc237a8a4ae02d744",9.317957166392093],[2938,"d01fbba8279fd1f4817560cbd110b3467b7bd3c2bfe4e8bcb3941ab51d72c1ec",9.917710196779964],[13734,"e620a5868892403a85d35af77047ba5b3aa7e9b7125a8d9d414085d22990ca9a",9.317957166392093],[9904,"84a68c4fbb5dd2c63d3554aff2cc46dc3d2a413b361dfbeb124789659208ebbe",9.917710196779964],[4111,"8ea72461cf74da944914ea2fb9f43493426548b149c4a1cb82a2b5b8f486f7e4",9.917710196779964],[5419,"eeb7e617b24b4b921f192dc6ee7cab61d49c7e22b3d5a99e648a9fa7f8abafdc",9.917710196779964],[1515,"621dd238913988acd78d633da24c44f00d8f7f71ea8e6f0024536dd04cd000f6",9.917710196779964],[357,"5328a42b7e982d8b54f7e3558a6d96ac0dadbbbec7b53b9d8666c5315c2ab4fd",9.917710196779964],[3110,"a965f59c9f463f54c02a8d98de280a4d7a8a051fa447c23ecde922902b2699eb",9.317957166392093],[7991,"c405e813f85cca1d3975a6d3dbef4466a74084bb8c846aa03a4ee0704b4993cb",9.317957166392093],[11878,"7a5e47aa7da2d83bdf97c45de7886dac0b14f043b866722e0ac4670d8aaa32b2",9.917710196779964],[14627,"86b1c6dfb2ff2e15fc903cd2d6914c46ed7aee59925d7878e0064397bcd57a86",9.317957166392093],[14766,"af56b9b4b63640dcd1dbee2d0f056541e8204ce6f0a7a761fb9e0d1b34e59783",9.317957166392093],[469,"97ccb74da378e2338db62db4d60727a1c8e032ad0267b2d91a3a04beb192d8fc",9.917710196779964],[15617,"b2f40d83ed24040a91a2b355986d1f86e30c52f0614289ff8651b4a6369b0c71",9.317957166392093],[1738,"426f0271daf55f718ff80e46f4cdf83829050db7bb748ca1db135b8a8f8ea9f4",9.317957166392093],[6520,"172e4f3adb1c1f3c5623b2ef0a748c0ef7dae8ab8846fa95ca50017f9f6d45d5",9.917710196779964],[14216,"79d52e06b6544d101496383a3cb343c4550f816eb499d86ad826c03581e3bd8f",255.38020086083213],[17666,"e5fac9ac9d5cc316ac15ea42367333a4870c4639fdf2a85af455e1b382cbd643",9.317957166392093],[19668,"3ce3e99c0e76c024dce96fc16a8c9e2183db0d679d01ffe5a73fa94feb3b9007",9.317957166392093],[3870,"5349472ec06fff2938594e68283fab20992eb53f3bdae8a4b0b37969ae988ee6",9.917710196779964],[19670,"2c4179a77ad847c5aeaf2fdd1516f21703b4c903cd43f8f612f751ec00d98d07",25],[13986,"80ff145856701007b151c88da0ef3caff58ca0ef1e405e4a9f8a8dc391cf3c95",9.317957166392093],[10114,"e554d9aa04c565716df518f80b8f369ccde4b307bbefc1b15b015ded71939bbd",9.917710196779964],[16561,"c47e1dc2551dfff6c54745ef839c90e6274cdfc0721f8723b72e2f2c4723df5b",9.317957166392093],[6032,"92be754ceb573d8187c92f962d877c90e9b82aa295a5cd737f0572af57b4dad8",9.317957166392093],[6284,"2bef2d0e11d0f08a11a1cf0267e0ef59f9e1207bf967915e85ed56add80d2ed7",9.917710196779964],[15085,"2487c28f671853391fa819474bcef0c408a5c643933dea93d4747cced88df27c",9.317957166392093],[12389,"7bf5fdd0d028a1fbaf70ae1dca04af6ce77d0c2f3ddbff28eef1e2890e62b4ae",9.317957166392093],[8187,"4ef9c3ccfbf536677eda98745e6029efa3191d45efd208d16981710baed813ca",9.917710196779964],[7057,"1c4a4164c724006de31fa6a8f54c1fabe80bdd65391857423c2d5f16b93e9dd1",9.917710196779964],[14408,"c3274549a3603d1770fdce2dcb20cee1ad0943fa7516b7473f38a99632be288b",9.317957166392093],[13335,"6c172e6123aafbc0633ffb072ecd63efc2ea3cfeaf3dd2f4acc05858c3d4f9a3",9.317957166392093],[1130,"6f73c4d9f65d2e82d9b24889eb51555ba9799369393007d98c6e4986606d67f8",9.917710196779964],[4362,"c07b738c143d94082795b17e1720ef907a72128bc608e97850105e94985f56e3",9.317957166392093],[18711,"fc898d1fa8b305893a070e7a2ff41d7c53dcbd0c3adc5ebda7f9c49eaa98dc29",9.317957166392093],[11616,"b0a6da695651b7828a5318fc977b59e2497233b4f27ec625bc53978376dccbb3",9.317957166392093],[6753,"6fb79b5a277b30a5fdfa050c566989935232f44cbd5445630ba90672bf3592d3",9.917710196779964],[8195,"23734243801d500283f15ef8651f817e024dc30da909029ff552e20a379b02ca",9.917710196779964],[6059,"3f026062be82e2b019a973758bc4cde9e1c721983505d38220bc70d7c34eb6d8",9.917710196779964],[2347,"6ff66deb2049a5ac885e31542a3f8a36ef3e8f542c0ac27ae1f0d842ea7dc1f0",9.917710196779964],[16109,"5ca3c17e92a25fa23a3a239010a7292cec385675e6b8e53e157b8e7efe07d365",9.317957166392093],[8615,"bacef0c79fa63ead9ff0eb0019d6cd584ad8a8e5d30c981684656b2a05e854c7",9.917710196779964],[19866,"59c0a488bf816d6976d2691a1fa43271efb9e768b5ba850b48c91979dbc24800",9.317957166392093],[6082,"ff07662a5393e00381df4c0ab6941c54d4c1d3f48dceb62dd2c243c13ea17fd8",9.317957166392093],[7908,"5d7b8374af6e32e05635658433b8309015fae3f04e1681568fcfe5e1b5e72fcc",9.317957166392093],[15408,"ab38556bf7816e7195294e0f9f2b312753cd89a0bf280a0b6bf2a4d6ea5e0e76",9.317957166392093],[3217,"62a5f7ab099b17a5e1f1fcd8782445e673c68e9552d0b5b5e7e9dc0ffd03f5ea",9.917710196779964],[10807,"4bf14cc7a049ac0c4e4d051324740c48e85cbaddae9ea36095267b2ee9cd42b9",9.917710196779964],[4633,"3777b512f87b1f18b73765841be4bcd97a95f606c8d4706d6bfa9e9db4486be1",9.317957166392093],[4361,"20b6e662f1c1b8ed5eebfef385d2f13862ced99bff9cc944ade78f18759a56e3",9.917710196779964],[509,"6853ccf1339f894041a9d483ab2b490ae9ce3acb31b2f1b89d215798e2dc9efc",9.317957166392093],[4980,"372b6bfe61ba24fae5e240e9bf86565f0565cc17a4152c21a1b60f0ec05d51df",9.917710196779964],[2643,"fbef29938fa8aef923e95dbbd602be58cb42ef96074cd1e8e01c2c46f9e1e1ee",9.917710196779964],[16399,"ab639b92678c2236f4774595e8509f08a7294466f9c20fc46326df89e069255f",9.317957166392093],[604,"be4f451deb0e70e67058316305b5ceb997af0ecff3bdca7f424d60878e13e8fb",9.917710196779964],[13723,"d3d6ef2c57eee4ddf91c7f705bf4c50ffbd5686ef97c17f4262123aa4c17e99a",9.317957166392093],[6612,"aa00002ba820e826125e0ab287bf86435b3618095b4f20a9d6c8a697ac2e90d4",10],[14942,"7ab90d5813eed8000afa1015bf37a2ff7077357b501887590b5eb09c36e7fd7f",25],[5903,"34b31da2cb2568f1a74d03a3e24e17fcc7bee82aa1c000bc4b3a68e70d8bafd9",9.917710196779964],[17316,"856e31f66751d0b2066366131a56c8b9334cd5832cc53d1f929ec36a4d0a994b",9.317957166392093],[5526,"c28cbd6c7ae77282c2f080d42af2e3eb0119f832757243c6e637848912280fdc",9.317957166392093],[12746,"d04641b0227e1bb2f47aa188c2fd600859af6c356538efde8ec1e94a8a6744ac",9.917710196779964],[16386,"3ea125f3d382d36620dba554008cb670b87faf024ac27d4152c5aa37ee645b5f",15.003322259136212],[15116,"e23ed0036c464b46cf62d2be9b56615f424f5cd6e9b4a24ca6e1c081597d577c",9.317957166392093],[18148,"49746e7466f34551dc69666df0db6eefdeb3022726ee0ee9b57c884be86d7a39",9.317957166392093],[10693,"dc4e2d5313dd71bdf79511c9d1dabe4ff794741c87892b45a80f4f92feb60aba",9.917710196779964],[17966,"5cce0cb66b167c65f03cd701244051eecb3aa9fee4b03bf5c24d8e9859a6d03d",14.864253393665159],[9402,"b5ef7cbea417291988b93835885872c5521f7cb84c23167b8e50397c23b844c2",9.917710196779964],[2381,"657e136c45bb1ecfe76e64164b42ae057d25d4ec633f4f44b0bffaebaf768ff0",9.917710196779964],[7692,"8b818b833eab3fc9d3b576f17880a547295091b753e6cfd864e2aa597d9c9acd",9.917710196779964],[16003,"cd5bee60699870f9e5d2651b35fe3b193005e1ec8fa960f7b6df18c16a496f68",9.317957166392093],[16495,"b5a7ecba16a4f13cf2c876e2ed58d75d92d37dac41d2a8af3c7e5f62a848525d",9.317957166392093],[16727,"b7453e7c509acfb5be1bfee2dd526069bdc9228cc9538ed6c9e0aeb6d6d0e457",9.317957166392093],[12062,"77237673e7fc9c457ff8eb15010da94bd3275cf8dd421a6746c28f549000eeb0",9.317957166392093],[18716,"9382cc71fed46bdd2092a03d26c861731fd2f624f66090897f5a533836b6c129",28.09964412811388],[1267,"15a6e55b69980a26aea35615d5d74cc8af1af5c7e2e0aec25f3e4b214f3090f7",9.317957166392093],[17474,"45e0f0c7b7be84f2452d622c0391f90d4bddfac417b0e41ba5d903fe2adb3148",19.532327586206897],[11013,"44515131d9fd812f6b3f8711aae44edb4194e18218f1a70cb627905012a3eab7",9.317957166392093],[2482,"2fa5b58380c4ce1832e5fa61ac56da041d060eb6e5aac6e3d9819ed04bebf6ef",28.187082405345212],[8074,"002f4339f4895e9db138fae13af6515ad0a2119df8905936315b12f6e07cf1ca",9.317957166392093],[11447,"b00b3bf16c28b820c44dc99f54851fef03cfe1db669a8f8fcf4ee50834d8f5b4",9.917710196779964],[5239,"3d1f3a37aac0629edf42580a84a0148d82636c55ac3f7d306480b765a72fc0dd",9.917710196779964],[10535,"e294128e357a9e7c1f110bc0d422a6f60a65e80d6f9c21fb413f83b670d2f8ba",9.317957166392093],[12326,"fd3eb231942dadd6f6ace4358a7d19190c6a1da2f6b757ef0cc13de3599d0daf",9.317957166392093],[5925,"145bc5e7500b8f6bf5ff63f85189ea9511b16b7384a0edd5aa06fe7576b987d9",9.317957166392093],[8294,"b880dcb4ef51456434c0be7d25622cd1374961fa239684baf421d1b731d25ac9",9.917710196779964],[1049,"7275c3c66c44819ccfbc00584615ad72e02b8273091a4498cc61b8ab6942f5f8",9.317957166392093],[14199,"c5b47631ead8c7ca750cdfdbcc3940ad366cc986f0f1ca286ddfe5d32b864090",9.317957166392093],[16912,"336054982f54ae17b2d8c79c935709080626061a6d262e96133f1d68eeabd553",9.317957166392093],[10083,"0c39b317633b1cb73826a867dcc905af8cf9ea4dc951f8abc40d8c620ea9cfbd",32.78872983412861],[2344,"3e3708b0de00e533053c79adf1b60c273f264044a81baf4a3f84d2611b19c5f0",9.317957166392093],[11280,"8e453c986b34b31cf70d35e20ced271f07247c95dd530758ccfae56794ba2bb6",9.917710196779964],[3612,"abcc53591003a035bd097918c52df4efa6737b5bc4bfffb4e24f9a33c5ea26e8",9.917710196779964],[16621,"212ad58cfe1cbcfd8b9c6ada41283d8f515a2f1bf4ce5457cc6af569f6886a5a",9.317957166392093],[10909,"73094e76bb678244e930a3798e6601b8c33072fdc0511f8f4a6f2b0498ea9cb8",9.917710196779964],[5736,"8666d077e585910370628897c7a13c4c98f3b708ff0bc00180a520db7d42d7da",9.917710196779964],[6977,"a9a0ffb94a764f5258dea077514e3182e9f831a123c72ab3b357ae9f596620d2",9.317957166392093],[4705,"05da750c489ccfb1864f8474e1a5f42820ff62c33ef26f0041e6730a920cf8e0",9.647446457990116],[7943,"8b4c52fffdb95bb93e839134d0c6b6f15523d82d2497a5250aaf199d7a24efcb",9.917710196779964],[10214,"440d97c3277f127ebb66ff2b075fd30e157a3285d6ed29069da2ac996eabe0bc",9.917710196779964],[10098,"1797a49d5270fd7661ba1a01490d617af766fc15cb57c2f5c768c1766548b9bd",9.317957166392093],[7484,"78111a277df781c1a26d4af11170a3a7892eadf45da6a5ee381ffeef3db0cfce",26.13903743315508],[8358,"dd762dea2587a97ea0971d338c3b6fc3c65b1bdfc5c7c0ccf2f307f1b839ebc8",9.917710196779964],[5847,"268e194df80f289ff61a00cda9449702d409911bfcb9a4036559db41bd6c06da",9.317957166392093],[6896,"5d8a729175becaf165a1e48ce38bb82d61c1d9a0496e085f43f40b238378a3d2",9.317957166392093],[14078,"12c81059a61518c02b73b47f16dc4640d2cf04b0dfd905b38c75a919a6ae0e93",9.317957166392093],[13883,"3eb90312aee8dff7f7d40531e7441d6137c05af6719707b13e89e306862c5f97",9.317957166392093],[5143,"ef21ca39e51bbaacdb469532f608de928a05a5679cf3cbaaa51d713771bb58de",9.917710196779964],[15579,"f57906c2bbed87a91a5e08cea5715bc8968778452d82603c29cfd83dea6fe471",9.317957166392093],[4272,"9a97684ee71187dccb57c2b93b3fbb4e9ca193c692a8db8c1dd7399282a5f0e3",9.917710196779964],[19818,"6442c99ac9b073058c286b51fc1e7ac2bb4115f16a9680b9bf41aeecb408f301",45.10313216195569],[15411,"b937e4b6b5253991be8730952c4b0b08b176f4bcd92d163e7435bc0c46770576",9.317957166392093],[4717,"f486d5ea0491f42a3f339e580f0d8e0fa0d2338cb2f4d59c41d6a8cf5971efe0",28.097560975609756],[14208,"179f4512a22261d494b88b2f35592e547e0af4aaa788e835f1cb57f3c2d31190",9.317957166392093],[17064,"a5a8708b427cd36ae11cb99e19c5606ae68b9480d952ff922d9ff1c98b4aca50",9.317957166392093],[17898,"766e6bdad62c4ed39ec0556c519c3d3e737fcaae589d9d88b23d27735ae5323f",40.69230769230769],[9628,"e2cf2fb3aa8b430a4dfa72d751a634d24263c2715e8adf0a6db88d2ce088dac0",9.917710196779964],[16120,"e145f933f2571f2d2d427f73984b0bbbeefb1ee9ee320be093b581be807e8f65",9.317957166392093],[5977,"8356a012a8e525e1a78148476f5236b13e98a942eb1781e03f61f0599ab33ad9",9.917710196779964],[4112,"4ea37baaad02f3ca13cb3f789deea50541cece89b1b61c8d300742acfbcbf5e4",15.003322259136212],[8595,"bd79f1ea69053adcda1072212bf91a58532043f48f3bd154ac76d7e2482b7ac7",9.917710196779964],[12946,"0cb208b14707e291cdcdb8a81d80e9373b145ee6e6c31e61efc50d9caafdf4aa",9.917710196779964],[13263,"746551e6d6d53ac8fa04a7617b529d8564a7afc495d4ef15319cdc71c21763a5",9.317957166392093],[13096,"3617238f1847a82f7bae44dce044660da198021354693a2190cfebaf83fe76a9",9.317957166392093],[10295,"b7eff4d18e51102ec88063a03969b77119005cb5ab101b01991004105b8c65bc",9.317957166392093],[17441,"d47f00abc5639c23295ab20319bb1367cf4ecce50c2b3dfe0cb3534d2479db48",9.317957166392093],[11513,"354b7a0525a7d76d4007cea14c1bd22bf207659eb5c2acbd5b12ef761ba96eb4",9.317957166392093],[19783,"24e1e5461bc3c170cc0b15c82663f0ff574672642de3146b11e9852d2b895303",9.317957166392093],[18435,"ce01c8148fc733cac134294fab97bf80dacda3d6bbdf4d07688e37a6a9f4ef32",9.361256544502618],[13452,"154e44e0bf8680ef0762f974e5d2754ff475d1e2d42ba7712a946e4124c802a1",9.317957166392093],[2453,"2f51e8aa7bf06978d9e151e5c46dbb89bee4e04dbe4c91bf654ddaed90c92df0",9.917710196779964],[10298,"3fba249526939317ac3dbaea0c693d27d05ea63c7408dffbc3504f62795a62bc",9.917710196779964],[8740,"daf51a33949ac8f50e21d6590d0b869a81d798287ab3ae8a56a256f0853274c6",9.917710196779964],[18042,"b656fc370b0ff4bedf3b7388da2dc6e3dea34e242b1eeac322dd1c880a59713c",9.317957166392093],[9025,"18001301a177fdf6a34211129cec801c4b1414662dc411e1ab2466fff32ea0c4",9.917710196779964],[16350,"6d1c69ad8c86438557c7e5875c716e6636320c3451d36a2bb8b1b6adc7651460",9.317957166392093],[17709,"bf1415d6d6e630d2a8f7f03d9097dbd00b5fc2fc2b452606e3edcf5d405e1643",9.317957166392093],[5982,"a5ec4214b5221852a6a28306435a407b32950dba36444fe1dcf77730bfde31d9",9.317957166392093],[10815,"145406237ddc6b040d6a62579b019974a71666e2c949de0c2548debc818033b9",9.317957166392093],[18577,"a9c52fdfe5e92904e9289ac69917039e44b85f200f46aad7371c74a6aaea792f",9.317957166392093],[7980,"364ca3462128a209b7b77146b7a6122384d87d28a4f8ee8a275b935f650faccb",9.317957166392093],[8647,"27dd0f122e0ad868af6bbec0c58a0f2208210c4e30ce21ba74caf2b04e9a13c7",9.917710196779964],[10830,"2b8a5f100fa03325050307589be8d92da690844f8fabcb6828dea76562c01ab9",9.917710196779964],[14054,"0134dd7e51884620e67c72185af8fad3f01eea2e32704adb901d0d78401e9293",9.317957166392093],[4551,"f1a9e5618e1503ee3da1c0ca0f6dcf45c59f2e7acc9a7851c870c6e9bdaffbe1",9.917710196779964],[6430,"427412983983a1a30bbe4fd2314a91dede36606bf155b2a4014ed59b383e11d6",9.917710196779964],[17660,"fc45e1934c3c5cbcbaa566e6373b6c8d5ce3ac09f8dc9f3ec6e97fa9960fee43",9.317957166392093],[11422,"5870bbf662bd8205fb1d28ccc1856504d3b303454ee3edb8bb65a120c40c2db5",9.917710196779964],[4425,"7ec10f882363a884fea21c3b1509439804ce5d232e8cca349ef58a1198abeae2",9.317957166392093],[18056,"9e02519cbfb91ebd2eed27ae0439da9ca161e67e150923c650cdeb818883173c",9.317957166392093],[3667,"f36ad766480104dcf06bae1e706379596a09832bf94230ded9d90020df28d5e7",9.917710196779964],[10048,"06e077d1f1633b277eda85b1ab1bbc9e5b4e88294796402aa6ce1f4e7d910bbe",9.917710196779964],[3943,"388e4c536cafa9ce2d51098cafe29ce0621dac4da0fde6a077dbe3ece13307e6",10.0355871886121],[2028,"b378e891dc0a4e5c5dbc366f364a4a3a261e760dea855bd2b9b1cd57d583c8f2",9.917710196779964],[1387,"f4de7a5d4bcbab8d7c5d036d59b1c145fbefcf704a808fb8fde81d75f691d8f6",11.050228310502282],[8092,"533f47e40df18ea992e36055f07a0ee3f32edcf925437b9ca56790fb790ed3ca",9.917710196779964],[472,"adb04d89f1cb0e661bd52d71916b5683a1cabfa1e35052e5a871678edc4dd4fc",9.917710196779964],[681,"5109759c4477b056af17d0155a1d204d426f5f2180fee4fbf2fb409ad3a75efb",9.917710196779964],[2104,"a57ebf90ad4afe4938d3d8a072671a757ba7c95c7be341c6be64e6ed7c9535f2",9.317957166392093],[5997,"1f9eea80f31b8d8a06987eaf019a261cdccd59e788e7db4bd236cbfc789e17d9",9.917710196779964],[14888,"36287e863e9de3cf5c9adfeb34c75392c4cac178f68c7acbb1fc4942437b0481",10.049586776859504],[8085,"c830daf5b78236e6371d5cdb5547521fccf5f805808b620683eb25932b99e3ca",9.917710196779964],[9044,"8b88b0235b9fb0b41a35109ded5dafdb8ce2d74725c256b6f0433c93603381c4",9.917710196779964],[16566,"f7c63f50e1e6c7fd71ed3e62a1e10149984d2831670669bd788af0dc4ae1c75b",9.317957166392093],[2519,"306aa4d3b886576591a110bd50411b5b980fed5c634400201109577fb9fbaeef",9.917710196779964],[19488,"76f4f9b853a0275d55ccc3d8dcd272596b193b6c27fef0f8077442d6c625cd0e",9.317957166392093],[16784,"bf85e6b63299a906fb1ccebf7bcfa28e3372616723b462fc2090dd621b8dba56",10.052724077328646],[15528,"ba287dfd30813085717f02a5af0f189c863e200c0ce4b45c1af5e6ba2f956073",9.317957166392093],[1558,"9950c6edef513a7c05158ab9777014c58588fd3adc4b044571e1a4920151c5f5",9.917710196779964],[5885,"3dfcf020849f6395e37374919d0b1af61cda330ca6cd455ce9c38d41c567c4d9",9.917710196779964],[11047,"b43cb9e4c28c934c14779a89631502f641c66e3aa43d134af9bfe52fad9fb8b7",9.917710196779964],[9449,"702a726c7e910fc9e590013d775aaefb3057853c4cf12795545aebb72a9303c2",9.917710196779964],[2729,"0d905026d5dbe88bf25d3c9d3195fd68a0a32917baa528d20baed896cf013dee",9.917710196779964],[17014,"cd3c4c700939446dd370b28299fe3a002a2041091e6f5703e0416ff014a7bf51",9.317957166392093],[8629,"9321ca476ddbb9f8387f1446150e73db9b27f8a0b1bf184c8e0737f4bcc340c7",9.917710196779964],[5038,"765063ca59f508ddeeb602b5f8b8d5dd864973b5bff1d6997e7f54782b36f5de",9.317957166392093],[19177,"34a4cc3f318f635a8d9296468a77cce93adbb469b054245fce23f1103e2b6319",28.187082405345212],[14518,"0b7e5d60afa78b23b07c3443142eb11875abaea0df9962b52c76180623ccca88",9.317957166392093],[19551,"76e987b8dd3870c29660c4a322f4043b727cc60c57c5291885716a64eccd930c",9.317957166392093],[3296,"8c6b0136cf92075111cde3b6162ee928f317717eb15bf4323f680d26ca706dea",9.317957166392093],[18641,"8569f78b1514f91a4db6dd218a52fc86f345ff20422a161adcc70891a39c1e2d",26.173719376391983],[16873,"b0d8fc958778362e422c50898bbe3725539cbc8b94b20e9e78f05f38af64cc54",25.98780487804878],[758,"95c36fd29c8cc53f393b3d9f9c10f5afdd7b4661dbdaf97a9672a6cd24e2d1fa",9.317957166392093],[1524,"5a68e1a6cb30aadd54714e84cdb96e38495bab3786e5ff2a63aa14e493a1f6f5",9.917710196779964],[16964,"6970181103accdbc0d31550a9574a32db63163315d423ec0913aa362d85bda52",10.052724077328646],[15492,"28add1afb9ef7c31ff49901b225ce80485863b8001f3cac28e11908372603f74",9.317957166392093],[656,"1a4d5a6af14140f75e3584c146136cd66fa59c44722ef0bd339eb79459b687fb",9.917710196779964],[13507,"65953bdcdfe7792a1a66c9ea1689fa3d7f708bed355aeb535273aa9bbb3ca19f",9.317957166392093],[15684,"ef50bf9af9387ae704bd6eb727195d49c5406b5c8ca7b80f59309f1de8bfc06f",9.317957166392093],[14711,"9528d198699ad43ac2f01c8117077e85bbddb78009e3046482c58f2dc1d8ab84",9.997888067581837],[19398,"3ad0e0ac6ee4511ad5356be2389ee8fb2c93c8a7e6a4b15e03ff7b5a1263c811",9.317957166392093],[7867,"f59b4b475b550857ebd84a672221801eb89ca95eacb75640b8ebc4b200ef72cc",10.052724077328646],[14304,"2a8c5e7ea81750947b892b205bfcf26461167210e2c9650175557265693e758d",9.317957166392093],[1961,"e72802a6742858ecc8a210a212970d5e4589441ea1d3c1e396da580b9ad746f3",9.317957166392093],[2525,"5f1d09520f3588020a32fda07a500335f0b2539a529faeb649913e275f6ba4ef",9.917710196779964],[15389,"d2af0ec7973d3ab95581025152bab1c3881b5e435337384ba52c482dbd017776",36.992136025504784],[11820,"f36520ddfb4e32859be255a74e3ef78aba5a435c5861e3e8ab50aad6fb1392b2",9.317957166392093],[13508,"4cdcfee3afe49c9bcee51bd23bf68f6a06e1256853e28ade35a54cc67c6b9f9f",9.317957166392093],[9079,"ed40705daaf8d86c4cf461b1128c0da80a66186a4c29c916c87b7bc8146348c4",9.917710196779964],[15799,"87532039a4710c2ca5fa6f90040fd0c389b5433ae877f762d9771685e165626d",9.317957166392093],[3003,"2387d9cb9eae5e2ac0e6fcd214f15cf1f50e603b81413a25daa5bb185c6042ec",9.917710196779964],[4883,"de5256ce474f788c138239a02ecc1608007e3d4b92f09cf5b8e3f87c558beddf",9.917710196779964],[13267,"3d59899eed107bd40d89993a5f300660f1aff20b504ebd36a3f8ff0b481952a5",9.317957166392093],[19433,"a6fdc509fbdee822366b3abb703c09e095b06e3826cf586a47907b9d5bc06210",9.317957166392093],[12561,"9d07d4d5830607b63aaa6c4d2680190ed74913bdd7e0c152c5f9f3b8370095ad",9.917710196779964],[15729,"0f162825fc8793f4060ad1b4a9ab33009425a128d8b288649b0f5ac09d1df26e",75.55555555555556],[13121,"bbd839f46f60556025f9c05ef0315b5e8a033204a6166478c8b94714b3bc95a8",9.317957166392093],[10032,"2e9ef40ff97eb09d0c67168e9d88fa586145ceaad5e8a3d519619719555b21be",9.917710196779964],[11118,"4ef9bcab55227acfa250c16cba25c019e26beda108945882c9ece6b6896425b7",9.917710196779964],[7236,"60177de75524391626aff50443c44af22be4cb9fc5adc12cafb00c69c4ed79d0",9.917710196779964],[13530,"d64a39c32bf06fe68c8ece2705222dcb2972a85982b4c0c42a3c32d3fb57319f",9.317957166392093],[278,"05b4e5a12a25addb0e07fcddd98aab0f99f3db2f3107e206eb5d7e2793b013fe",9.549738219895287],[7017,"6f1c40d05522ac833ed669e2335ecb4a69e90ea8636b02bad33722a6b39de3d1",9.917710196779964],[6197,"e18571299378aa4a73744a10f7d5ac8941fccb344bfe99d53cdf5890a8aac8d7",9.917710196779964],[13472,"8c66e295b8f5eba8c22cff49dfe7ef8425f047a9dbd3db5b7d72573ea6df95a0",9.317957166392093],[3594,"22b7ff4c0d3b1ecd1517ed2f6ca02c0b42b07fd07aec8dc9911c7ea58e2d56e8",9.317957166392093],[1562,"81bade95968a723b05dcc19a75dadde891a51d6706ece1d1e6e971d817eebef5",9.917710196779964],[14404,"1713e76aabf8f7339ec6dbc3569b18cb5134b6fe0d8324c7ac44e0c92974348b",9.317957166392093],[9883,"ba286bf9f1d3a30e51c771c505784340a964a319c92d91d0547a3cca60a10cbf",9.317957166392093],[6720,"4bb835deeaed2cd7bd352497e3efcbf4acfdeff98caea6291d5bd3204036d2d3",9.917710196779964],[1067,"9b82126e3724f9d612da7ce0787c9cb4ca6a6288a37f0e8a82b4f94853bdd1f8",9.317957166392093],[11880,"df38b097ad95875ea531834c8e483b106f0bf6a1faae1b156ab3a62aeeb62db2",9.917710196779964],[1431,"db2bb21dc1ed67778a375c7d76a13038de27445e268e2702c66d497dea57a3f6",9.317957166392093],[17570,"3d15b11e617dd9b04c4537ff8b7b9ae03a09ec911e47228624f608c07c03e045",9.317957166392093],[3758,"a243fe56c49fea328cd6cbf9ba14e395e73e472edf64978cde4f3d77dc0834e7",9.917710196779964],[2489,"1299aed962d3b870b42141cd53fa465510b3581e6e8d33ac7d8f628f2287eaef",9.317957166392093],[15564,"d32445a7c92202902f5ae5c99bd83e53b207f9a9483c043c140863f5e0d86472",16.798623063683305],[85,"e00a74ed79c7ee03181243a336ba506dfa7651c43a579b69ec92216b036271ff",9.917710196779964],[4006,"f51b95d019dbf3fa735524fee412bcea3c33787222976b54e8daa3b884bcb0e5",9.917710196779964],[19141,"af4bfbd27bd39b4eafa494731fa2865a6f9c98da5c0bc81d183a9ea7bed7db1a",9.317957166392093],[6170,"f79c5cff4bc8c22dd2cd2a5b9bcaa46bbe98634cc03b15c8bf98a857b58900d8",9.917710196779964],[15731,"d363acc17456e9df13105eac0ed43762a241b687ae293f377f8ce6af7ad5e66e",9.317957166392093],[16713,"de9dd49cf500587a5d7c27c52397ac80b8c6882439a22d0cd171c6f92d744558",9.317957166392093],[8075,"009a1751f91665e23f54f576ef93fd040b04c1998d780f6cf860637ce2ebeeca",9.917710196779964],[6477,"28fab6b9bef7aeff8fdd82b04827ead40dddcd8d6fc6957ecfdc9f39b1329dd5",9.917710196779964],[12873,"b1f10de8528df5e85e4fa710a42b1e3177ef84c329f1fa1a964e197609206fab",9.317957166392093],[1929,"4bbf219d7e1ec29513a2f293a5b8e0884a980661ed14d42035e35ca268ce80f3",9.917710196779964],[18133,"6a462c535dc3a64c03fb951375158eae06371671fe9692b2069766348c06183a",9.317957166392093],[4906,"62b3079ed029c7ed1147a0e6950058bce55a7f0f691ad01c1afd7cc10323d3df",9.317957166392093],[6314,"adf68e4b566c28afed14ea96eab77c1e5607ce40dc0813416d03cb5926dae8d6",9.917710196779964],[18264,"87c8f3901548f47220544156367c46fb594cd4ab38a144da61b4cf47c484aa36",9.317957166392093],[8298,"97cd5412e47ac4f13f84699547e666316b30f5c605a10dd8c008894228a956c9",9.917710196779964],[10354,"454be10733edbca9fdb49cb9ad1095bfb202244473dc33546b8dece08cc005bc",9.917710196779964],[14440,"a0f8967b715d11d5c695e83fb3121edb424b1465078414bdea551a6ced06698a",9.317957166392093],[14561,"afe851ec72177dd5aa3f74c9f58c834085f17e21e75dc78f77c828c6fea5d787",9.317957166392093],[7398,"a3b634e5cbd441e563a7efc3c6a1f2a18b407797cea63f10b470946eb54f6ecf",9.917710196779964],[13585,"a963cb0a25ff24a0b368430b03279addcb74dd879fd4a8b7ebce7c364fd4c79d",9.317957166392093],[12482,"64d91f02a682d24726d65926ced976d5a8b317a65e96a997b9d8bc2d57290aae",9.317957166392093],[19420,"6c8d87bd82cbd1f1a7beacba5f848c3704bb43dbd5a800f2b76af04a099acd10",9.317957166392093],[18797,"e8d08baf0aa80ff9eb8e9e8f7baba70125a94c421814cd0482429edf0884f626",9.317957166392093],[8119,"352f9f32de1e50e3e1ab06b9187fa4d8a9237f48dd3ebcc8205055da1d65a0ca",9.317957166392093],[12273,"fcf1af158604ba0e83c825de904ee1b275eb1c8b6be16da880981890c2d27daf",9.917710196779964],[925,"6d662ace7a75fd79661eab3eec3cd9e63bf1d1894b97c7b7f5fbb14f8d30a9f9",9.917710196779964],[1794,"9a5ee5c994b2c0abe6c8ba7180e42b213c7c4df8a34cea2e333acc69e79146f4",9.317957166392093],[17058,"7a573b985325e7ddf409cef16e6c1c1aa2434e557d3c48795b8ed67824a5ed50",9.647446457990116],[1787,"3efc762e364b79ab7a0b2d652bd641f0669ea9397f74d438212d2edd66af52f4",9.917710196779964],[6235,"fae6f603c8a833091caad45592191b4c863059f0890c5742b9fccb088d927fd7",9.917710196779964],[16520,"cf56c244972305d27627e2ed38c094a5743519f4eebd84140f03ca57f77ba85c",184.43693693693695],[17457,"4f84a3f2b9ddeb36effd5d2fbac97b087c0b0305478b8670538bdb12b95aa048",10.034527113939475],[3670,"a47ac819b096c4e406a0329669389f3d3348c62738c3252431f2a474fe9ccde7",9.917710196779964],[15074,"96a6b80075856a996ec7def03bedc68fc24c39c0bc8384e7219afebf36d7267d",9.317957166392093],[5948,"a23aae226b81b167c08a483c49c8610fecc2ff7984e9aeaa3f91aa3309226bd9",16.96969696969697],[3143,"19e8d0dba8b39a845ed99c6de308a3f3fc777a4593059eac198727915ff36ceb",9.317957166392093],[8556,"07b7979954d9e30c9c5cef11837f273d0078770929b29f58a8644d11d99db0c7",9.917710196779964],[582,"0b1bd511568bd716ee38b721d62c6c28989561de28496e9e68e0a68d1c1b09fc",9.917710196779964],[13076,"171cc57d686e506d7abcc4e70cbbb9c29bf7068ce8bbbbae3b620f7d7a3403aa",9.317957166392093],[16543,"fcb8f5a4d6956c167eb66c01a35771f465b77a3ce0191478ab9ccb5db9c13b5c",9.317957166392093],[14900,"1d027ee50bf81e6684743ec18bcd80599fc12faf6b833086fbae34a8cb56e080",9.317957166392093],[2328,"21cd66b590854c06a64f0481d1634f30d24c893a097ca2d4b5eed0b9493cddf0",9.917710196779964],[8257,"90d2e946ad4ff34c3dcc472ce875c28ff62ac12492d8a5458e09b77a8ff39bc9",9.917710196779964],[10867,"9ebe8a449f42da4e732fbcb11f74656d2185eba7dfff63dc2b821da48f7cd2b8",9.317957166392093],[4267,"e4b3feaf5a1f0e04f516556ab0c81f322c2c17845a4ca70d010fce893a75fee3",9.917710196779964],[10612,"13f3baa05ad1f9e5b24405738d54e972fc35fb3e5eedef4b1d985f2cd23496ba",9.917710196779964],[4834,"bcd3e473c2e444f903c7c8f85b66c37df20d4cb3ccae310e2f2dd7831c6138e0",9.917710196779964],[10624,"f2c8fd7b5ee32b5ae773ea792ba24bd0af12e8773e16f371b0eacece80e588ba",9.917710196779964],[15039,"514979fb3a3c67e077eb65dd5038d148cf7078ed21c5cd94b011a3a43a41b87d",10.052724077328646],[441,"ea852cf0b4d12fbcfc7785a3d74de1473fb59c04641349fc10882287820a1afd",9.917710196779964],[6136,"a71a70d15045b3f3d53ecc2d6e6b084693459160aba806e468fd5028d01d3dd8",9.917710196779964],[18492,"f73fe94809622ab90fdcda3c7c8056f8f77f5099403f50494221d1db87768931",9.317957166392093],[10379,"76ebf1d0b9fbf56a8d8fdfa3be191d727ea1e1bf6f89cd5ada324c596f72ebbb",9.917710196779964],[13785,"b312e1323da1700b596ad137c467f459cc9b655263bc24e7fe19e0332f68a999",9.647446457990116],[16723,"be71554e24da80aaba212c41134bb79a3f5d050cb55ff277eb6c4322bf480558",26.09252669039146],[10556,"1a4b858a725e38aac4ee48ec0f1e8f6faab5b64e67abc724efb10b225358e6ba",9.317957166392093],[4779,"f5197f5abe76042b81eb4059acec3816fa4d996f57ffd1e9e27147b4b36a85e0",9.317957166392093],[19328,"6caafee46b53ef3d12a300d7b465e4fac696b3ead4f79963b30d09716f872914",9.317957166392093],[9329,"6843cf9137f805edda26604af661375329e632f35693fc75672b5645e4f9b6c2",9.917710196779964],[17389,"2c0e98a0d5c995129678541b33fda7e4211b4efcf02d4ae7168ce83e8fd5fb49",9.317957166392093],[12119,"c1df9a43ac24601c2a08f73d6248429fec9bc33edd84d88105f645f0bf3ba0b0",9.647446457990116],[10484,"467507987e5afd824e53b74e0508840da784debe4352030d3eac147ff71a42bb",9.917710196779964],[14519,"d2851374efc2fa5265632e9f476082b1aee5d97749ca5b2906e35aa55930ca88",9.317957166392093],[5961,"a62f33fb90a365c31358629d4545ecf256d5332fb80e63216046dcf2958358d9",9.917710196779964],[15336,"f619728d6717d139a9e2b8108a37ac7af0a556486ae005fbd2a64478aab6a777",9.317957166392093],[3365,"99fb3c680c7361e7dd8c3f85233f4a641131a058d3544f316c6706db507bf3e9",9.917710196779964],[13921,"ef73fc46461275d05410161bb65a64fca9cbf4f759a4808a50330ae426728196",9.317957166392093],[9831,"976663e80fc1eb7ddb44112d84725e0079344ff49a0836653950e1f6bc326abf",9.917710196779964],[15578,"bfcdf365d13001b90e0e23208089c86233b53915832d7c5dc0efc5be2d09f871",9.317957166392093],[1602,"2ba666f069fe611e3268660110e1debe064ac5149525cf0bbc0f313d7e2c89f5",9.317957166392093],[4618,"6f2908b8f4760c952f6b28b0f4a957d1522ac854cd7eb572ba7540a020807ee1",9.317957166392093],[19084,"6d5b799b47099a8a64010c166e6625f32b7325c7df01dd1dedb9848aae0e6c1d",9.497326203208557],[16673,"b444bf314119ba1dfaba8273deda1de6f11384c8c7f9417313919cc8286a4159",9.317957166392093],[19133,"cabc8650931ad76d616f9e9c364684d72f58f35e2ca6f842f52ba1f202550d1b",9.756272401433693],[16181,"097ff06a127c400266c638ca6449fec4ec9ced3a3b4f987336275145f9576264",9.317957166392093],[6495,"22e85cc2dc96b63b9c49fc031522d807eb77fce1ca59cdb7690ebf3befa684d5",9.317957166392093],[13394,"eb816fc09ce40710e3d20a39234c3410c72981d6047d7b6dfd9e44942f156da2",9.317957166392093],[10030,"ca6b1ec1a7ca350d177322b50cc2b084674d86ed5d394e71c022c116681a23be",15.915194346289752],[4656,"8e9f344771333cef35eec63a1dbfec4ebe90711f3ef0ffa6c7d87cdf45ab42e1",9.917710196779964],[15959,"1e8716d034bdf75de19909d87b4107904c89902e249dbeaaedab11e3b69fbc69",25.403141361256544],[17765,"f642be964d283d18df522d81ef1806471cdc1b3481a40df8e8078be2bea0f341",10.052724077328646],[107,"981c3e4af8a4cc0f113a6194f442f3ec8142a7d73085c5f406428a3e30fe55ff",9.917710196779964],[14293,"ef516ecbdfd2e23944e65c4d670d2fb2525711cd2f0704d3e89875f8608dd28d",25],[10870,"96d3d5f4e826949caf9e8686675669b00ff0eda5eb35923852b8da695892d1b8",9.917710196779964],[15198,"cfa7ebd54ce719e40c866b18613b2599420d7673b5b676556143b2010041907a",34.838938053097344],[3333,"942aba7767afc3598201f82ee0de3784a64f75acacca14ba6f975ad8dd6f21ea",9.917710196779964],[18510,"a63ae36cbf8063e7beff5a549916a23922fe92f167a0c5d17278908b67d74031",9.317957166392093],[15485,"44ede340e2e2a7b4c5049fd776a8eebb52a19b6982ee28883bbcc292f6cf6f74",23.069486404833835],[16796,"45e84acf841be90faf96e3bd02e44f4fc4cfa9686eb169a4f8e437d716526856",9.317957166392093],[5144,"1662511d3a01a48caae739e47e5d0d9b803ca4493ff78b0ad14414ac063957de",9.317957166392093],[1181,"cdafdf1891855c8299e1961de0a911d919143c4f47f02ce54faac5fb15ec20f8",9.317957166392093],[16736,"8d6cce1135fe2788671ffe354465bd4e8382bd014fae90de014e1758a915a157",9.317957166392093],[16504,"82b8fd861c6d1e5f0906736217b19ecb932aebe866f67e3c6821f5a4b7cd285d",9.317957166392093],[18249,"765eb237444bb190230528f3113333b1499858fd6ffbc6bbfcb9dc0745f90037",9.317957166392093],[4434,"58995ae771bc9c66e3e56884dba9b09d07bc6f8937b3e7cd3f7d1f97e55adbe2",9.917710196779964],[6085,"94d6d7b5e7c539911bc49f0d87522f8054c23ce87a50c6ffa214a44441b77ad8",9.917710196779964],[1968,"5881ce18934042260a38b6372e54b6edfaab276750015545885be34ba89937f3",9.917710196779964],[19091,"fa063fc9f3f7c6ee599154b0cf878bb212a385e5125b546c00121d19c3dd011d",33.144525547445255],[8961,"b012219bcfa81243bc6a11b291bbb549a8dcc26a16d93f309aa0ddcc54cf0dc5",9.917710196779964],[19457,"a014c2c1a773d08d03f28d812f27506d15f1fd1ce45b387a881fc40745b6ad0f",9.317957166392093],[7215,"97956ad75cd84c099de857d5fa3c0e738900dcadb69a94f8bcd7671456e195d0",9.917710196779964],[8295,"1a96d10a97217f8b959a04ded94ba2c95a81fce5ef7d65315fc8a9f71b975ac9",9.317957166392093],[3824,"32401147d7ad7ac65c4f9895ff5b0091ac944158a512e4d0829afb894eebd9e6",9.917710196779964],[11318,"2e4cfff81b2e1341974a8abc4229577ab1e413281bdbeab3c60f66e730b1deb5",9.917710196779964],[16944,"cc88f4c5070cc02f013adc774c5139bd0b16050938185a19becc499ad9bc4353",15],[3717,"b7b8ca5a451a2f12642d8430aadd561609a9230d1d2568601d74cb9b85397ee7",9.917710196779964],[9021,"e8bfd6ebdd085ad6e4b0b2c5714d899f0015ff980e1e1501c95774d28a11a5c4",9.317957166392093],[6423,"82595a4f8b6d831c69f2daa0bf78d7891b351b10e1ec393d480eb5136d0120d6",9.917710196779964],[18313,"93b687d4c5866e7c8a674c8b9c83ea3c1eb941845c71c22409581898f4a08f35",9.317957166392093],[2964,"ebb3a3e37f43952544e9c382eb33065f2673b7bea67b7a01eca9e558a22689ec",9.917710196779964],[16531,"049bce6cbfbb4522cd799791583de42886f8763621b1c7b4e94582bfd27c6f5c",9.317957166392093],[6315,"4ffa2f687f1be77ba633ce0646f2a52c7ce29a901138c7b231868d5ae38de8d6",9.917710196779964],[15451,"b91a018e6ba238ff2886140c87514d3b367571b73e4c1abc3777f3d7960c1f75",9.317957166392093],[5802,"01dc957fb520f0ade912243e89f1777619a1b909fea0edb8f1c30077712e63da",9.917710196779964],[10090,"1b94497848ecbd3e16be6ab7c6dbc7f730c45ea3e462d2103d0bbe664b9ec7bd",9.917710196779964],[13964,"b76f880390efc8d2d0c43ff6851cbbe8907fae584c8a5d7fb24f319c053db095",16.92391304347826],[5938,"e5ed3ab5db1354abe7b85bbcdbc1b04b16f11cf7ce3158571ed1a5f71d8075d9",19.0727969348659],[1799,"a66a94792b3c33b87711ac482b715bbfe7eef74c8286b3d3c96e231b1ece43f4",9.317957166392093],[14456,"28cea429d8446768bdf1ec124805c4c134dc9360cd9edf6a7654fe797849198a",38.2140221402214],[8031,"d5c52cdeee7247f17b78dbd6423bafd14d35c676c8d97d30a281bfabee2f5ccb",9.917710196779964],[9301,"e63a3b6296478e5deb069fd840a2a6d6169918557b49acca36cfc345ac4cd1c2",9.917710196779964],[4068,"81f090bfd3c2ec65e9de5f3867a6d860c8ca12e160b0becc404ba9b320754be5",9.917710196779964],[13614,"e2dab0436d1300912c12ef40169142c55ba936a94ef724df89baff8185b2119d",9.317957166392093],[16121,"de38efd91ae729f183886faaf49fa18580233f0437e03b2609bfb0f13f0f8265",9.317957166392093],[19595,"8ad35a529f39d54b6654d7df6af3f25fc59319d83885adcc2ab2ed4b8c44540a",9.317957166392093],[1541,"a739698e215c2e34614f84e6e4ecaad958f19b898c71dfcb00d2852b4cdde4f5",9.317957166392093],[149,"9abece57a4f1013a946c2affcf70e51b7830d5f8d14b0f7bdf5a726975c7fbfe",9.917710196779964],[12616,"17f5a7ace8e7ec71a8cdce1a6d4964cd750aae41bd4e52a4174199f059ff25ad",9.917710196779964],[12239,"808dc08e2589c6885e94d8e1b0fa86ef875884fcffb28f3fecabec6ab0b7bdaf",9.317957166392093],[2177,"9d6d179def2664760a9033ccdb160d66314c942b76357f16d35b154ac568baf1",26.13612565445026],[17530,"99d609b8b5cc951c883097076e86788e1f32af65bf99339739d392858e0de646",9.317957166392093],[5088,"65731154d8f3631d398cf66f78ba36ad1164edeb3d4bcc5c25c3e37e6d22a6de",9.917710196779964],[11875,"bb648508316287f49588e45c4fb9ecee61f85af831c056888b72f5b97f063cb2",9.917710196779964],[17454,"f54b4fef317175a0abc70ba042849531ce393bb0792ec1a24a80f0a8bf3fa548",30.62162162162162],[12835,"e95aa28bac931264b94b9634a9722bf40e801793053b9c74b23d23d2c2a8b6ab",9.917710196779964],[19190,"0b908f1a7fdbc3e64ffa781ceac93ec9ae01645191708c5fe6f6f5eb58daf718",9.317957166392093],[16618,"03c6fd60b7f7651e8d9449644ba7edc4079e2e3329a56b610f4cf784030c7e5a",9.317957166392093],[11338,"a4dd6a415ecfe883823c7bfa78008bb03b615f8b2e0b114c0811f6f7f5f5b6b5",9.917710196779964],[4258,"b15b43d4302ffba2d5f54ace48bb3e55aabdbf10f22f3eaf96a661f40b4009e4",9.317957166392093],[9193,"8c79cc7234f679a6bfe39d7c0eb211deb0c57c8e9324f6bd6e205f4e32ee83c3",9.917710196779964],[14300,"07d7bf7d66e568422eb3495ceb5819cb0c2738ae2e7bfc450842ecd6d2c98d8d",9.317957166392093],[1106,"64a384c9f305303527374cbdc1e8b1687740ace2ad6f4997e26cffd8345a87f8",9.917710196779964],[17793,"e6a709ee7034b8c9323d4458ecc3a9b571895af472bd51dfbb80ad871e267641",9.317957166392093],[5638,"18f956a5359663cce1a1c4519613c870833969790baad8019da2a540b45068db",9.317957166392093],[7209,"ede377734eec64629cb471a4a9c7b58c2665e16e16af085acfb925a88232a5d0",9.917710196779964],[2669,"b97ae6e9b5b5446c41c6ebe879332e7c321ef3ce0d096d5b9f606b6be333b2ee",9.917710196779964],[18946,"caa1e709b744852558f78e7a8951722e922677910bd10e6fd08226a3d27c4c22",9.317957166392093],[7856,"4c45615d4734ebd4499dd3933dd8e7935e7ae699b6567e4de2661f490bcf7ccc",9.917710196779964],[5029,"55360ebc59739780a68599b00bfc6cc506293919fb34a36203a66e37715dfede",9.917710196779964],[2730,"de7332110f496477fabdaada7081666608f609ae1cb1e6f874c6853c01bc3bee",9.317957166392093],[3495,"64e4355808d884be3edb124e1381f7b1ecd2845025b00bb7bd3e096b511003e9",9.917710196779964],[8317,"6f9800abb7c4c78200bf59b1c48bdea7b71852432eca88b7172aa893b6ae38c9",9.917710196779964],[2916,"d819ffb108d909b6ceeeb87abab64da3c461c5bed1387098fc093ec626a1f8ec",9.917710196779964],[12454,"f9e03ed2e0aa213e2f8407af897ec934e37c4cf6ee7c47727c991c99682542ae",9.917710196779964],[19350,"2f36a274a113ae130cd11d4b36143c3209b94e5d500677eac6b7403145b89513",9.317957166392093],[4972,"5c55aa0521b356308a8ecf9a8fcc8d0d80dadcbf0c51bb29b0f6b22a38375edf",9.917710196779964],[10611,"3ea5a9923485bacc81e50b6aecb517fb5c7f23f5ddf8126426918ec9f21b97ba",9.917710196779964],[1704,"1136598b54bb4f3d39cf0eb0471cb03b26686aa39ed05d0e582a26b0028ce9f4",9.917710196779964],[13223,"6557c8700ce8dad64f14dd714a55214a97a6d5d5b087c38516da4940b00972a6",9.317957166392093],[679,"df5ddc7a17fab51b358f2ba87d942608061e2f278d3bb8ac83bc0178201563fb",9.917710196779964],[18858,"0d4ab43a9e6821696fff55c6cc6a01757d13fad483a7dc8a2d5654f19ff0c624",9.317957166392093],[17242,"a6f3645cc94c250c25208175d7a091a9043e13f0b27d2a8152571491d239144d",9.317957166392093],[11210,"922d2a08c1882cc54773264037edd35adf85c4be86753df30cc5336179d6a0b6",9.317957166392093],[7359,"1f07ad775f3c31a5f3662ed8d1cfc48ef74a9db79d9a663a5175a22ce4c4a9cf",9.917710196779964],[214,"75b7dc6ee6f2e823a554894e43bad2e8277a7df6d4674edc209223720be58afe",9.317957166392093],[6298,"c7aa7f9bf53baddfd0e30f8132225a8863f4a4706c060f5675f159e9bc260cd7",9.917710196779964],[6350,"d03e497bea7c5755670de1778df571d58324f69703457deb6e251b3fb1d5aad6",9.917710196779964],[2380,"70cf024d605a55a60bce1cb437b2e5e1e18c7f78f9addb33267fe4dff8e58ff0",9.917710196779964],[18036,"19a1499f54da73d2a0826e987a3b08c09a9a49a75548ec5906a2ae5aebb3a13c",9.317957166392093],[15044,"012f75e0d0ccc3e6f165cd0b15dbf0d9e2d158f3afa348de6293e7a6b6caab7d",9.647446457990116],[15018,"e4204c400e85faa0e14dd4e5f7036876b2a09b81d4a9353e6c3eb27d7a99047e",9.317957166392093],[14088,"4fd29322f139b19f811445cbee63bc0fd2481690682a9cb3d785eaa00dd5df92",16.973782771535582],[19600,"3e1318059c7793a3c8e72f990f0328e3c65b3e087bca3c81e4994919aa7e0d0a",9.317957166392093],[12153,"d18458613c1cfab0380c5b7c6f066c16ac4fd53c2841986f94446521479c51b0",9.917710196779964],[15719,"b41870d65c441e39d30c724a9321cad0fb0a11c036f9633e3cf9a1ff2b7b1e6f",9.317957166392093],[968,"aa10823f36cb8250273af9237218afad76d91982fd8f662e0764cc06ce7e64f9",9.917710196779964],[14540,"4fc69a8f1d0fa0503d4b596d9070a4c8eddec8638807270d5748292a70795788",9.317957166392093],[11583,"f7c971d4c34dfaab6a8bbfbf89710c53c724d0895d804abb14646ae10105fcb3",9.917710196779964],[6795,"525f9fc36405829a42f3d907e9311b580891798b714fe07af7765408956f4ad3",9.647446457990116],[7005,"e68539ca17ef5f917a48062accfe35d83dfd3ea6f3b718137c4bb4471cb2f6d1",9.317957166392093],[17159,"5164015e9ccbd56c419d4b477d0060e3b582b7a28f8388273dc49ae6e136d24e",9.317957166392093],[16098,"2135d051130b0a2e26ede68dc204c36e7e244279e57eba595b29706f066e2b66",16.17081850533808],[15421,"25df81eeeec235b703ec8929a23de5899267c60029453307387f94694950e875",9.317957166392093],[9300,"5bac8b1274c10c1b0878ec279016a645656b790bf5ed48cd64d0b1a0d947d4c2",9.917710196779964],[6898,"8621d2bff787ab4a11b7886978f64456e1fdd42c957d418482c7f7beceeaa2d2",9.917710196779964],[13441,"812231237477d274593b7ebeaf376af4cde7ef859fa6293623488b68116c48a1",9.317957166392093],[4059,"f8db81cc7f03a5ac3548d45073ced4af7e96c48e4ae76f120397d61259e45ee5",9.917710196779964],[19549,"56f8b7d9520c8f424d848827203b459338f5757e934f693e99fec0e450d3a80c",10.052724077328646],[8664,"633e57afd46ca4404b029f1c5d04eb14dbca3e82428c547604bfa3636d1eebc6",9.917710196779964],[19323,"7d2b6464836fbd29af8deea7e3d1583c0467027a123fa2d03cc2caab90e74c14",9.317957166392093],[14021,"9ac6f1bf910c6a85ee163062c2632ce07fb78b5437356a8b7f4ffb7283085094",36.948306595365416],[9754,"568accc5e1eeb6b10526c41d865511225dc999c3909cfa845f063b1a0b61fabf",9.317957166392093],[870,"9f9caef86033f5ace76c53ce2ae27773cbc0a99eecf88367f84d7cfe49d817fa",9.917710196779964],[18745,"4fe400413f17b2036bbed03d388f950b4ac2a7a18233507982a16dfcc35fdf28",9.317957166392093],[1296,"9689e05093398dde24314388d03338736e578121e506b4648df523a05b0467f7",9.917710196779964],[5440,"17fb131c054898199a1fced4fee32dac311e018dbd92c7230918bd3db2fa88dc",9.317957166392093],[6582,"698b14a7ab6a9b1860bb8f9f23d596fe3bbae54ad6b59bc1f79a587f3a3cc6d4",9.317957166392093],[83,"6f32c41a17c01db32c66319e9f6691e67fca17d10504475015aa6d14442976ff",9.317957166392093],[16188,"2121304c75bfbe573d307d95fa52c262e26cd0da3ce1595dd83708c33e1e2c64",9.317957166392093],[16192,"97c9ca1bd96c63a76f9149ebf98627c203c5e0b8521aca9ae8b5257c24ea2264",26.79150579150579],[9209,"996d48d62e1a8a39333521b96d23cb0b75dae8e328b4188c3ea4ff6c7c9963c3",9.917710196779964],[4027,"ab0d75fd619057f27ebf6aae2d35438d5ab915c4e4d11c501c8a79384e3795e5",9.917710196779964],[14412,"d290bcc62ce56728e31f6bab49c34aa1d176bf7e0b5691380fd2c73fa53e268b",9.317957166392093],[11518,"66f0f5a57913c8bda6720fe6d2b7082f2daef98d491713adf7c3d93fdb7268b4",9.917710196779964],[9369,"8e9146be3073a34f1b0d93f64c4e6b95c058171c82fe7b65e33eb1ce60e468c2",27.72192513368984],[2405,"92ac47eff7a7a775e5bebc53a117988327de8aa31c87feb1523e64fc1d4872f0",9.917710196779964],[5649,"04c4888e0046f454c09a9f8ed4010cf0f7779c3869e7612375e7a3748b8557db",9.917710196779964],[4833,"53a1c25b9532a9cfd9f7a578c7b126e749d161377509bb1fe85390079c323ae0",9.917710196779964],[6706,"873ce2e2d9ed8934e81a87136645dd3f7089b49dafacbbc68dfe0bb7eb87e9d3",9.317957166392093],[7790,"5efe5d35067e4c407d5a33cbf2fc286d908c80be44fcf982cf6197b0f9e2e2cc",9.917710196779964],[14000,"6e0c3076be4105c41b593d2625180d8b008a355fd9d24bc3b0c280e890c8e394",9.317957166392093],[10020,"56921caabc1cd3af1baa196610da9e1513de16f1b17af3d3c433fa6aa25c35be",9.647446457990116],[11763,"b678dfbb3c722105d632705d3563b99a8f72a592d95f37d20ea1c7be44a9e8b2",9.647446457990116],[13365,"6de05e1429117254315a5fcce89a693365711c679921fde4fff2b8ca6f8131a3",25],[6304,"617357e93c7804b56e62f7a0259465975775ebd8f9119f92172da5c47b0dffd6",9.917710196779964],[11798,"e4b9a3068f0aaa7e318d90eb44c561ee1797f3daf1b4ed560af8684e673eb8b2",9.317957166392093],[11534,"ed8c56076dd99d2773d200babc7994477c174cd81cf4fc5ba22abdf0829152b4",9.917710196779964],[9686,"fd4b4ffebfb5df0ff5f10f34e3ad0f14a0f5e853a7f315ead9df2c23dd1c7bc0",9.917710196779964],[12731,"f9d8788d27f114eff5a576885570358494c79e99debd4323f079ada3228d63ac",9.917710196779964],[6490,"ac281da8ae7b7e6ae21148629a0287996820c49d6d9ca8cb11e90f2f2b038dd5",9.917710196779964],[2474,"71e2f104ce80e837b3565bfcf9b63b23b05197e57111a404b44741a8018a0af0",9.917710196779964],[13727,"85e88ded2f7b0ff1a78062e99d98d17aa7f54a2f89e2a9cb4ba90e082a1dde9a",9.317957166392093],[8235,"a8958cc1f321ab51e075916881c675e72bbc336e68d3a87993af9eee7528bac9",9.917710196779964],[11344,"a3d3ad24077a2501e3c9de8ade5bd1390165f41b937b7ab7de7e73076831b3b5",9.917710196779964],[17632,"3c429564a512f7ab0e723415eb0404be97925bfcf0e0d1ae7a6a9a7790549744",9.647446457990116],[18005,"d0c7bc320842bf23d7216efe4cae9f62f384a5eaffa8ea89c2518980b6e22c3d",10.032925682031985],[553,"6af0d1bc1429a6fcca3e2f0295e25ca8309421271bedf8b0f613b14803a83efc",9.917710196779964],[14459,"e099f23f81e036232d59b2d25af813b2855401baf6908828eb0ce983ceef128a",9.317957166392093],[13869,"9521203fd6c50d6ce636983957b5c9723f7e2e71ade074dd974e57ee6da9eb97",75.21936459909229],[6909,"e3ab3478d325af220577b013b15d9c049792d8ed5fa75a9cefeaed3b53428ad2",9.917710196779964],[7502,"78e9efd85526d4ff7c3cb2acb5afe7f43b5aa77b66721c6143417f83bacebcce",9.917710196779964],[3280,"d89fc1a05a237feef02dc917dc57b80215221d610c37989ae29a65f0fff284ea",9.917710196779964],[9682,"07837910885ebe4dd2e3a1ea25acf6f3edeba12102d24e32e55c9d032c9881c0",9.917710196779964],[15179,"05d7704657ce7d2409980840cf454d7ce2d4161a7564be0adf326ecb3fc6fe7a",9.647446457990116],[10007,"bd1eeca2a55171e00948b12d889a0c36b8947569e5faf69e6b785947145f4abe",9.917710196779964],[15271,"583d1c8ca941171bda909f2a69547f8e8fe32e58aeff62b5be73c188d4f2f978",9.317957166392093],[10659,"a16627ea9babc41f3aa965d9fc0deca22ebc9d0fe466e3f1acf087ad85ca4bba",9.917710196779964],[7128,"149e254104a43e0a6a416c11daac1321a9fe3bdae05bf1db53aad9ea488421d1",9.917710196779964],[6835,"b7a020eb1e1f626c80b78d8b49762c9230859b06e5f420ab88451245029307d3",9.917710196779964],[6782,"88ca3c62f4f4ba41d2ff349d4625a89b32425c8cdc0a960949fe5d25c9ab64d3",9.917710196779964],[10340,"350bae35e1b947d3fbdf9c3f280bf17c185f06d3dbcc82d69169ab8f074c15bc",18.20689655172414],[10255,"a045f1ff7fe5dcf0a382461fdc84f371a55972b527286cef9d1c088e3d06aabc",9.917710196779964],[17455,"b37d723372557cdea1d708e76e2d771849a0668229cd0a40f40c75552f88a448",9.317957166392093],[15935,"68b992ab01f03078c52cbbfa90381ed2cb6559e927ad71ba82dd689e645e516a",9.317957166392093],[8345,"f6e1105e286e50d4e8806adf956c1874add7dce42715dd38580b058c273f07c9",9.917710196779964],[5478,"6e058da23a8eefce53c8f5d7b399b728c993ff1c1c5b3c9b817a024834f15adc",9.917710196779964],[18359,"c8f5faebe054e0b1f5417be6e8cc94516012624261294e39cf08fb8ad8898f34",38.72791519434629],[10520,"7808fb8c9b9a732a82309148fb384ebe605d7d08e8ea63b92f98c099a5dc13bb",31.036203722642668],[9627,"9453a44563b6bb3706757f96370ba3ae0d9a89ad60b214cd33ec203afec2dcc0",9.317957166392093],[14555,"a698ad45d305d1962972491d81e7541c37140ff576a0cca6e3b4f802c519f287",26.11764705882353],[13793,"775e112948e1bdee9bbe305a54aaa05945bbbf2f7c9242337d6861db4b638299",9.317957166392093],[11700,"c56cbcb6eb00d7891d58912ffd5ac07495b45f65c87428a7d6db63cc765b50b3",9.917710196779964],[3433,"e68e19e8af1f6547822464424fc9605c912922351b85c9f659e96b2d15b576e9",9.917710196779964],[6180,"f2a068f5e0781a55e010e5c4fc1e938c8e286f3b6ad8fe9c3bd1945a9779edd7",9.317957166392093],[7291,"27b83ce52efa3937a6d12a4d9f308da4a3c25635ae8a84f18041f1fef26f21d0",9.917710196779964],[2940,"90810bf3ccc46fc00828d142b5890eb6587f9eec807ae11a7db85f27c142bcec",9.917710196779964],[9251,"a8e94c4d3d452e9bc780b1acdcc9556a86dd0fc7b201418347bdc1d13b6820c3",9.317957166392093],[11544,"33c50a601809ef6e84b03de59e660df62da277283d67382d2be63d68d2e744b4",9.917710196779964],[8056,"83a9dc9b86bdf58090c0eede66eb43065c027f99caefdc55ca7441876b6e1ccb",9.917710196779964],[16596,"bc751c6c2e4e11f8e7387243f6cee6992780161ef1abc4bd58fff0b70051fb5a",9.647446457990116],[19028,"35bb0b8cb31e32e8b9bf797983455bcc816db1f2307c6b5ec91607bd1908ab1f",9.85781990521327],[9274,"2bb7ef0e946f8f039589eb2d09516519cf4c9d5ec7c7390e291926b0e42cfac2",9.917710196779964],[12083,"4cdce46ed892606c58c9d9ea86b6f7b4beb455d30378148dc8962cea1f32d2b0",9.917710196779964],[1119,"0d6020b65b0965a9a3df44a77ec6896032afa462f44982b753b67a67a9b679f8",9.917710196779964],[18647,"6b0710a0fab17f5e62fc776c6bbbe162fac03af93671e321d0a2e77a2304c52c",37.092957746478874],[11163,"6c9e01aae168653b502cc453862e5c5df01dbc9078207ab188ef8ebed8c0e8b6",9.917710196779964],[14357,"65e14555c72232fa577ade888a2152244e3187d59df831eea335c90ff802428c",9.317957166392093],[17503,"72a5995cd4b32ba2d522cd6ab49f71e54dd0d915778a188f81a70b43614b6e47",9.317957166392093],[10893,"6df0e631f95ed49ead171c01cc76f1a68bbd2904f8cf803cf82720453308b6b8",10.052724077328646],[15604,"680908b9abbfd344a6c20575bc083dcc9ffa737f1385a183ef48faad6e185271",9.317957166392093],[18131,"e50e11cba9f19a9b8224478eb97f4c8dc4397443b57c04b876c9bf2f2637283a",10.052724077328646],[2238,"25a928f6ba7cd609bbaa8f4cbf369198e7aaf75eabe3d37ea1d090c9d52c50f1",9.917710196779964],[12815,"d045a5cbe9e9fe007cb352e26e855a8ec59cbee8cf2a7b582b7de678adabd8ab",9.917710196779964],[4953,"d9f079885f97b7f64bc2ea679ed5a3891709399e7d4e9e4f7b5cc7e9bff986df",9.917710196779964],[1340,"1b4c31253f8794128e391c9c4b5bdd274899caf2f3da9eec5a45d05d6cb825f7",9.917710196779964],[5991,"ee9a2b5fe154cc7e7e5423cf6c4a8f3c6c588d739e07e5a2bedabaac890e20d9",9.317957166392093],[15340,"0398175f3e9f9e30edb2a250f7b30d898976b7274c8c7ab88bc83342e5ae9277",9.317957166392093],[16975,"b21d0cc81db4e2b3c29fb3f4644533828acf895ffd8e7b0fccef49b236649752",9.317957166392093],[18973,"89bf3d0f600d71814ee469362e5bfc97234d975d7628802e1fec615a3beb7421",9.317957166392093],[8380,"64b68aa1488430ae9bdd530045c9cd07b62f78113eff5e9af775937555b2c0c8",9.317957166392093],[9374,"69374f849814b36840724b7216c08f8df1eb7785ba6f27eb289055eca5c465c2",9.917710196779964],[15423,"904b65106f2403d610877fcdc8fb9143b8ccc9ed77ea46742a956a17edfacc75",29.32959326788219],[2198,"2a4f5321492bd21e73e2a879242490f18b082d62eb2da3ac69b2c92382d589f1",9.917710196779964],[4813,"cee1a3089ba499c500bd4df2c5649b6100f62b27687713e91fc1564862c255e0",9.917710196779964],[8164,"fe70564e242b003c18e79b232d9f7d294e56fcdfd58e08f585af71d05fac3fca",9.917710196779964],[8401,"8ff570b76d5c4d12f39f768cac64ba50f014198f6c24033d8e126f26e21498c8",9.917710196779964],[12360,"9e65a14363764a694f78c8cc156bb35b0d539b9817a02814e210712ab4cdddae",9.917710196779964],[1535,"b5375b6ff7fce41f7f12d6df973032da0313a7a4fe66877ab49433810af9e8f5",9.917710196779964],[11121,"243085cf47d8762364d6f8ce1181f1df103794a42f18cd8035c388146c5520b7",9.917710196779964],[15126,"31d53bd66f670077c5589b5052709174c1d4a9c8d0cfc4501fc2399a8797297c",9.317957166392093],[2070,"1b88cb966b5103bdb0cf9c5e86820222e6f2d14344e8e351575363d9ad4c72f2",9.917710196779964],[15488,"60b9dfdf3bd716bb906118c5df7733a4da635ffdf07d7228d3f03508d3015074",10.052724077328646],[6625,"7ab00b207a5be110c0537b2b2e70d502c22f7db5bf0ef823afe708a283ba7cd4",9.917710196779964],[1287,"2acfc0edb20240d87b66a8438bb9ce9e35d2d1aff14aa01e34db73b4909874f7",9.917710196779964],[18022,"8e95ed18e88544a14c12d4fb92bd9d0d55027848d510096bee6952369ed3da3c",9.317957166392093],[12846,"9efe41e2156936b47c2f6b512e2903da7254858c4db7ce5003aa2bcdfe31a2ab",9.917710196779964],[2260,"2249fcbcc5a2a28e43c89f8eec89f20672e82ac1cda01c5d880f2e6ed36c33f1",9.917710196779964],[9590,"a9d73618d7037e32130d46f1a1f6f58fd0c91144257890547ea7edf379350fc1",9.917710196779964],[14615,"fd0195d45f4bf441b92b974b5163407da940d98eb3ca4ce7386d35ad929dc286",9.317957166392093],[16682,"84cb43dcb60ccaa426ed028165cd455f08bc418e2e2e5dc974d2d148f657f758",17.005309734513276],[3043,"eb03cae02b2eb04a8135810d923df4701cb95f4a65d6ca926dfcf2c63c4807ec",9.317957166392093],[11028,"9b2998d2b06002540803a0eff13888e58cd03a67f4b79cf48a2e67fd172ed9b7",9.917710196779964],[17899,"d8bc14e70b15f7ce10aaf6ecd9c634b1a9afc354ff31a524ca8e74e54de2323f",9.317957166392093],[3463,"9a6d342a3b71fe7bf841ca854d070a04bcc4a239846ada669a7e8868d76249e9",9.917710196779964],[13803,"1c62ceca20257e5e39fca09ea709d98d53e5897d4feeb64f56500080c7ab4c99",9.317957166392093],[3574,"0522f041393218a885e4ae36747254a9b379b5fc66888fc98a78eabca18477e8",9.917710196779964],[4144,"24020ca076b55433894481226c5b1ca1543af9c84b2ca7ea0ad45a503408c5e4",9.917710196779964],[13673,"de7c4f9025d80028ba4a9be3fbfce0c3a7c03e07fd59a71f8a9beb377ed8cd9b",9.317957166392093],[13701,"6d712c02c46d661d792dd81038dd33ee812cebf275554d097f63e3d7bd02469b",9.361256544502618],[2711,"a3959445cd4cfa8f76f4bfa76c2a30b6bb7bd14e22f6e00603123f2c27d063ee",9.917710196779964],[2835,"2b1fb74ac9e75420c37029083b30185b39ce5c384723594f1e85391782376fed",9.353846153846154],[7358,"dfba4514a2622699f98af6e0c071b997a26a4fed04194f422bb7ccd01710aacf",9.317957166392093],[8362,"44673c9752f0969e1678697aedba07e0e79495ba5f066f5ef35ef0f37f00e3c8",9.917710196779964],[3628,"5923c9285e1f885673a32e0f9da8bfe03b91186c11a69cb174ac240c035e12e8",9.917710196779964],[17063,"e0fd8d48aafda219f6bd8a2c41c2c1f565fc750a9a5145f3eab3acf1691bcd50",9.317957166392093],[498,"65db65163fffcbb2ca07d976f90a85fb5c601618a63fd19bd02704f1de8fb1fc",9.917710196779964],[800,"8f24d044944db2d06bc62b3752119bdc409c20a03dbc0b53cbd7851a8a9488fa",9.917710196779964],[3313,"91deea6285cb6b5614d4ab6a146dae89892c4876d3d40e3b6b1151759eb949ea",18.130434782608695],[11475,"6c4e5373eb026bd71ad7bde0f978322e6229986ad673405f092212056e35afb4",9.917710196779964],[9409,"a3b434b22aa6285939764d36ee5d64592389741212e7d022d88955b9ba553fc2",10.004566905160603],[10522,"177d1e0eae418599d86a6b865ae938bd216fb4bacfa06233871ba5f3cafc0ebb",9.317957166392093],[8742,"556214adccd4381fcb45edf82d0861370e19022d2533ffd509bb9bc1785c72c6",9.917710196779964],[10336,"7a805cf540003206d0cec72553208b9bfd76c59305f15d977001ee631b081dbc",9.917710196779964],[2613,"0b3242f48fede8f3b2e38fbfe6676ca7a1785d8fe922febe37e4f7344b7311ef",9.917710196779964],[7701,"f17b004889a16534848049c178d462e86d63b4fa8b28d0c3182f2c9e79b588cd",9.917710196779964],[9359,"00fa1528f4ab2b46a941420f5bd677837e443948e83bc3787ffe8457802a84c2",9.917710196779964],[8833,"bf3ac075e204402e095e898e156c9de23eb31361c65e8219fd6d1337e575e7c5",9.917710196779964],[14846,"f362c867adbda074c53a9e25425c29a961f34be32a857bb2b795bed1d9f20082",9.317957166392093],[2595,"88aeb6e298905c0823f99386fc2bc1c00ab9b49b2df6286ac75f9ffca7bd2eef",9.317957166392093],[152,"722a7ec2ef655504a4449fd6c65d2379f4c7862ef1ca2f0fd3d4fb806c01f7fe",9.917710196779964],[2013,"c8970be4335fa74b806f0926f281154de0880521d70fff1313b4b81a82e5eef2",9.917710196779964],[14402,"d271af8c7458534f9b8825046362ddf16f2e5591fc66ebfd7d37f00d379c368b",9.317957166392093],[12472,"b89010bf5ef521a20e89ebaf03a00a153edc30b2e71529c197cd63de415f26ae",9.917710196779964],[206,"b413652041f5d181f9cd7c4b4c04f1a57d95dfd1d52d9c4d2605efd71f4b96fe",9.317957166392093],[5364,"8ff405eb0b4a1104830e179b499579d0a67bb406baefb101747ecb255c220ddd",9.647446457990116],[10073,"164335ac82f5f5ccfaadb752a071ad4a0ecb873210e036115236c1aae4bae3bd",9.917710196779964],[7373,"332b4d77597d420f92f8cb44bd17048fdf04dd0cdedb414c4e0df3cdd62d91cf",9.917710196779964],[12871,"77984e40bfb30d35abdf33cc394827d49813c4890987ea8d5b3e40115dc56fab",9.917710196779964],[16118,"2a2bb6e09fe3a1976542b953488e6808792522e82ddec7f2881403911c409d65",9.317957166392093],[332,"64a95b1142b4820b5cbbcafda14734d6e2a0155208518561d419bbec7fa6d0fd",9.917710196779964],[15852,"bd09a91af1c5222085ecf6822e6cc6f908c8d3b27b4437b656ed35d6e88e1f6c",9.317957166392093],[13104,"5550cbeeedb36db0d14fa57469f460d6785482d1082623742b335bad89511fa9",9.317957166392093],[17176,"4bee050694ecb91e1dad51db6645ef766bc781bb7af94df1fcf5dc117b7a4d4e",31.652173913043477],[13378,"24f63f194c5a9e2def6701c096001b8eec85364e6fd44aa3ff3e49348e92cfa2",9.647446457990116],[2980,"95e61500978f1baa85535f39312be60062d6e5a4cb714d9b696666f1abae65ec",9.917710196779964],[2312,"f9b09fb06fc61440559ff2103a51183823a4efbcaeedefeb288dabbfdda8f3f0",39.20855614973262],[1711,"11ac3a7532991321ff781087c3b1f62479f9397b2ab5ef0b554fcd9e1b6cd7f4",9.917710196779964],[3695,"38d8a4c52e48293991c497a372751290cb5892a31a9291269266463fb4fb9ce7",9.917710196779964],[15417,"09f97c8518e4d4a941d6b4a8cbea6fcfd798f70fc1d9ed750ed39252a374fb75",9.317957166392093],[4592,"c6dc05a9884aa455ed918a7ace51ef7394f15dde3785fee2ef3086f71672a6e1",9.317957166392093],[17498,"ce99dc297c3f9ccaabadce211a9d05ebd5434a953389e317b5c4142cc4f5a547",28],[13651,"968745850c2217ab8d6ba6bf3db3095f1cb29192a5382108caf301afa9af399c",9.317957166392093],[19411,"5b7d763289491de0d8f62534156c7ef7d3c61637a10ae6a15112125b35952b11",9.317957166392093],[19044,"7219f2a52e858adf28be8ace2b675ea65df3af3a8a38e81e31a236038ae20e1f",9.317957166392093],[1578,"dd43afb9504229561b30cde0d0a9940f183b95f80e0a86825b3a3ac2e56aa9f5",24.931506849315067],[8810,"c8eaf3c7661e423d24cc9cc5b6340e482571c2fbee619e2405eee00873e406c6",9.917710196779964],[18740,"f13d01fff5698d45e3d909bfeeac6f8192c88f0ff6fdeee17129af5e65440129",9.317957166392093],[298,"bfdb8957e4c9009d1120eb428c725ce4fd377bf4bc573343f6587f5643fffbfd",9.917710196779964],[2303,"7135edabb5f346bd8a2629bb456df22bf2255df6a7c2d9e588c1fce5650702f1",9.917710196779964],[11765,"9905ef51c1a763db59ec02d57139ce05756361121d7471a3e4b61cf83e30e8b2",9.317957166392093],[6590,"04bca1ee120b2e643e99a1ef1de39748f5f0c46b3b9f49358c40a9b7192fb8d4",9.917710196779964],[6510,"604184f66d357ebd013db2e902d7cbb8648c4e39c521b094a3b9e249bc575bd5",9.317957166392093],[5957,"17a915a6f6410978c83be29769989db64981d466801d133b5a3bb3ef3a9f5dd9",9.917710196779964],[19533,"77784ce85e23572440376d33b7e84b1affad1f1f351fd98690134eabce38570d",9.317957166392093],[4159,"c4796aad4a83d568f18f6791d5b4fce481bbdb3e9fcd761e9749cc7c2874ace4",9.917710196779964],[7092,"2ca93efc33cfb43c44f48830af5cf3fd4669c8d79752d0402d9cf10beb3360d1",9.317957166392093],[3874,"6ea41b88f44b2dca6b52e4775167580cca3f5f369e9e711a9253bf467cf18be6",9.917710196779964],[6760,"7fb82fa576af0d157f1e15c5ac026ae2589aa813e25a10bf9c3c4a0409ab84d3",9.917710196779964],[15425,"3de993dca62099f92d995425479f785c6c9d228dc10b3fc6ad01f24be05cbd75",9.317957166392093],[15506,"936f90b80b8ed8d6d0f176023a1a612cc78d06d09f26d57448d069165886fa73",9.400063755180108],[8613,"ec255db334e823a5ad5c7d25247b6dc48cf3ac567a567a2501d26705514455c7",9.397642257991386],[8694,"42d76412aab24e8a97683171e4a71c99254afa2318d905262f4ad2bbc213bac6",9.917710196779964],[15812,"c3c662592a0be0e9c303f64256eacb4f9a5711ba40761b0ac7f4227783552a6d",9.317957166392093],[6873,"4c9bc67a2fd883b17e6100fb5576d6cef1f07c8b57e9b5eb0a31b724b7e8cad2",9.917710196779964],[13787,"9b7b223b54b60a6b31ac8dc24ae7041ede96f4a264fd5f06e45a73630213a799",9.317957166392093],[8789,"905f7964abdd8fb6bef715b6c5300cbdce31dccfe990d1190b317c45014823c6",9.317957166392093],[618,"1ae5b343007cc6d113deae279fcd1c66b057ee591560512a799de50a2ddbccfb",9.317957166392093],[9462,"77c5655529e3fa1c41c0cd3d0b6cbd48fdfcc6a7c2c9f55509319f251f3df6c1",10.022779043280183],[16201,"16cddee91805c1eb3b9a324c07f31ccf78c265e9f767a72296e35b17e796f963",9.317957166392093],[5787,"ef7046a3873b1a72ce355e9b6b25a6b73fa5697958b8d4b7c069a6019d537eda",9.317957166392093],[19859,"1747a630d2af89c1e7627c45e968e9e305da27c3eaec7a37a9cccad9ee408800",9.317957166392093],[9566,"1ec396eb9e38fef781dcde08bd03d5e4d0ee168ac7814a434f17db7ff92d32c1",9.917710196779964],[19060,"adac5e4d3f9b2e0e42e6e7de2746b95ef1b8854ba2738c8ffd0dea6621a5611e",9.317957166392093],[8384,"b20695861934946412c170d0777730740e8d261bb1148b94d541bef8203bbbc8",9.917710196779964],[7273,"3c6a2d892edba246a28971a6ff4eb7d6821105fb258e6c999357e946a8c830d0",9.317957166392093],[2578,"1d61cf43d9a6f3bb8d6210cdf6f5da882b95892fda674783f43d8b26006653ef",9.917710196779964],[14743,"92a1c7da14a5266c6c27006be7de2c7f316450b04822330737040b51e1680084",9.317957166392093],[368,"de9089b40b1fdd8bcaf874fc816b15304c1dcf5cab364ce9bc998982eb8ea1fd",9.917710196779964],[10026,"c7e732427425aa25aa214dea0bd9073821a515886e1c51dad11c4e4b78f229be",9.647446457990116],[4251,"fa975e18cc03902165d7e9b2f0d439842ab1d1107adeff5443bd90357da71ce4",9.917710196779964],[11850,"2bad1a3ed63f644d9c9eeb63f665ccfb11a557993a552851abbc2cac2c925eb2",9.317957166392093],[2586,"773aa9521328913244a9488b701a90ffc65031247733a6413ddf326deebe40ef",9.917710196779964],[18033,"1f8d40416a6d508d6dda760f4918dd3dbea0433e4f98690d6036fe497013b63c",9.317957166392093],[12259,"683772b35adf43c51965d283152f7636eba0d331496990a65f54a0041989a2af",9.917710196779964],[15344,"c5ee540eeb41708aa55e44831084c7debfd517fba752671d79a5635d3c847477",9.317957166392093],[19188,"d0ec76766fcfe2ff707df46a427eb965bdcee53bce8eb6f98ed645f3ea171319",9.317957166392093],[14987,"6eed15c0403223d740e2196b6bf43e7f7106d44d2218828c479985e1e743cf7e",15.961722488038278],[5789,"86b320a9a9c7895c27fb7933cbdd3a19b6ce3afccf2cf200c9e9ea3b3bdc7bda",9.917710196779964],[16827,"2e2fd07e2b8387862ab8a5b923837c96debc8b091beb6293c362df0420ccbd55",9.317957166392093],[13969,"7a90b926aa96c40fccc58ee624f28150a5773b33fd7e72be5b745c68d48ca495",9.317957166392093],[6573,"88f674a2d31cb4ea8c9a778a559b9d79cbce6f490894616ea05e8315a59fe2d4",9.317957166392093],[2584,"102bf46d2f2614140699fd0b34095f41004310703d70c58064140234aaea43ef",9.917710196779964],[19517,"b8708e6ca4767b2a947500a6a94dbd78e92953e28150543d03f5798ef8acdb0d",9.647446457990116],[11845,"f8a0e5649eae6c0f8a2c02d89c95dec051f30ece2d16ebeb69ba3f12a4d96cb2",9.917710196779964],[13987,"f0cbde94aec093e4eb6ce8e4fa8d25dc09508d79345b3e245aff478d2b113595",9.317957166392093],[11580,"f913159559890e5bf6e8d7a3a5e62a67c4e1b0a1d8fc9e4d1e9907f974c900b4",9.917710196779964],[6120,"8a2befcffa87e837d6aea99b2d3c35fdf5c8e6a5327dbc522b0a8469d1e54cd8",9.917710196779964],[6507,"691d33821c5c6e7a0d2c11120113d4d286bcdea12eeecfad743b00e184c865d5",9.317957166392093],[4728,"7b4bad18ecd72d1a8917756edec37745a06ea64bb03397320b2be65ac70cd5e0",9.917710196779964],[14158,"d614d331fcf1ff82c4b078c352e6405f1b02b5e81d07e88d424350b7bd654191",21.05],[11806,"ff24e8b9b346c8654610d71af4d4c1433b3e8e292ea8a51656ae12c7f7a0abb2",9.917710196779964],[10806,"8ce69ba57902c132b5f98509012231d34a3420dd4f650b3e65d51f24f13b43b9",9.917710196779964],[4649,"95d3a5438e5220cb329ab31b2474de3f2ea5f73f050583324ff1317e485d52e1",9.917710196779964],[10956,"564bc4dfd6fb28fd3ecaf57bcff72678e6861fd7ed9e71843a635b6771114eb8",9.917710196779964],[15479,"59a3bcab233a232e283fa502befc85839417be43e698b7436b4cb1f1c60e8574",9.317957166392093],[11739,"618651ee39a1c6eb7ea38490bcb4ed7c6fa84f58a23210665915c0c3f21612b3",9.317957166392093],[1725,"61073ed0d23de8f4e92cc0406b1270bdbfec36bfa9ffba0dc37c36def038c6f4",9.917710196779964],[468,"55ca018c5aa7c298749c961c63db94ea271c97bb201007d67cb6746aef63ddfc",9.917710196779964],[5467,"239dd76544c9c8b71181e081ecb7b5319695d7f6aa5d82c314cda826343869dc",9.317957166392093],[17509,"79cdb884ae1ad5a8fe2b5b6e1dd062d09af2de0b815655dc6e43640576d34847",9.317957166392093],[4039,"63e26b4c024c76a640fdb622e9cab02b8948e4556e1afba289c31e0628c37fe5",10.052724077328646],[10420,"8e9b3808e781fcb68aa2c3b2f1cf7387d0a243ef5aa74dafc25b9e37051dadbb",9.917710196779964],[12209,"e11b16975df72e2986a4ef2570999f593461136bcc6c3f0ebaaca297bdac06b0",9.917710196779964],[9460,"7844b5300bdaed93c96c80db174543409034c3989d262c31b9b7fbaf27eff6c1",9.917710196779964],[864,"3431adc9aa9cff079f177457002fb8b78313640d5249d74f9e30b42883f320fa",9.917710196779964],[16431,"42c227b47ea107e193ea65d76decb0f68f6e5cde8d0ba4fbe460d8b4855a805e",9.317957166392093],[10113,"fe5001d16ef9899b78695f5a1ef1e8fbfa5cd31903decf04d44229a5a4cb9cbd",9.917710196779964],[18607,"ff5b21367dcad1a1983b33037b005e2aeced26d65a5b333337d8daefaea46e2e",9.317957166392093],[769,"7d166191a15f497bfc65eca5f13392cedd2ea82b748b43df49404d89c360befa",9.917710196779964],[1132,"b31b1670844b5b74738228061e9f5804ebc24d8a1708ffb861270ecc5c5f66f8",9.917710196779964],[5400,"8ec83b782dbc9562d8b9a6875b75411be83b54b0f5a2ef03cad4a5a19038d0dc",9.497392881432782],[3713,"fe9b26dd2ab0292b547ab456fb875ad0c8517b8ddcbc1b3b37948b946e7d83e7",9.917710196779964],[15415,"60016e614c3a9ecdfd59c93961b5501d997402805abd4d582ea5935acc80fe75",9.317957166392093],[17815,"74757d2b3ff91bdc8954ed800fbad98a9f7d6bfb40aae776ac736d31c4e30141",9.317957166392093],[10267,"d045b547ec10e5a864cc4bede51ed44bf20857cdfd159194f0b437c364f79bbc",9.917710196779964],[12863,"fab1acc11055ef3369c5f62e086d4e7af34e2d933fff321f8dc4ffab71127cab",9.917710196779964],[19554,"f0c2547823aaa18cc831ac8ef07de9a750b3dfa947b9ce5580220f05a60e790c",9.317957166392093],[16942,"a7ad812c82c1d2353b5f0686dbfdd2ccd554547a8d43f20cba74be04fa9a4753",10.052724077328646],[16164,"46eef2fd855942c07bfbfc1460dd760e525b18dea020ca06318ef6ba13dec464",9.317957166392093],[2203,"ebc10a642b345bb5ac104ec93e616b3c635556be504e27352e79a3aaf2f584f1",9.917710196779964],[18779,"470094a71ea214d0d779ded806d1a5089f7f70920f3a8cb756dfafbd61b4ce27",9.647446457990116],[6128,"b09ecb885d5ceb3d0c50ea4dd22893e2d716bfbc263ea1d77b3d165491be43d8",9.917710196779964],[634,"0cc228fac12ec245cd9d34aaa2d5cf0c0fd38cf21c2980b776d422054b1daffb",45.2017937219731],[10203,"88d2b25f5c2efd61968a92006bf8d748f20e1e0e4016bdacc35489782896fabc",9.917710196779964],[12866,"24822407d7bd53e56c960ad11dadab5153fcd838fbf13fcba7f459602c0877ab",9.917710196779964],[17122,"f7054b7052ceaafd36afbf89d104b9d58fb5df7cb3981a7fa741204fab26914f",45.20423600605144],[14393,"dfd0815db26146d0d1862667b80e23f418d12660ce27ebe6d868c1fb7efc5c8b",9.317957166392093],[17232,"f4723f7d39764d276a5c806342729025ff60db82a9775010a24266d7d9a6424d",9.317957166392093],[13791,"f573f3efde79d601805f595419bd8329a1fc0255744e239f23df878f554c8999",9.317957166392093],[5480,"fc560d30faeb71dbd0fff49624515f77a6c0f32cd5fc43dcea23cee57c6450dc",9.917710196779964],[9766,"4a9609b9179904d8d355e3924eb7516c042fce53bb536e8a1d977e0740b4dfbf",9.917710196779964],[6661,"a0fbd62b0e3e6c80b3fa570f6103d79829b5f20ba2b0e2f3ffa04bb963f43ed4",9.917710196779964],[5928,"34e5dfa0bc7be8b8ada2e17836aff01a67a82d1ac6fd37bec852b2d36dfc85d9",9.917710196779964],[6444,"20709ce8b058c1fa5678494a4dc436d3a4074aaafc2482b9cd65a2ab28a8eed5",9.917710196779964],[18277,"e7654164ea113ca3506c4d61eb9ef70af74690f0507e734c0f0f9ae376fc4d36",9.317957166392093],[11868,"e057f9a925a9283def4f57f5998e5993730df75f2805d271b396f12db1bf43b2",9.917710196779964],[4122,"8fe7f9ab1472257e914a88c4a668046075070003b0d99332ea96bc48a755eae4",9.917710196779964],[15511,"c50c3271171259b795eca9a66bd8d204775f44f4b22ddf84930f01b97bcae373",9.317957166392093],[14025,"1a003a1289f0cb8d5cfcc6d41a735ca6450a7d8d7080626ac52af3bbba503794",9.317957166392093],[11985,"16b7a8faf0c7a0e4474b7d2bd91d6174e20404e4d6f5fbd59ed07c720b9a6ab1",9.917710196779964],[12797,"14d1e6e27c217bba0f834e6967f258b0bdbf3934527a405c9613ff4f07f4efab",9.917710196779964],[5009,"53593d8b7b885c72234650d8ffdc21987fa584e4abf93b2357e2b1c3bd751bdf",9.917710196779964],[2119,"541d5cb63b7804d4f3971213571a888003b2300d628494683187ece21a191ff2",9.317957166392093],[13568,"e14b9348ebe3fdae97626e516deeafa7bca32458373f0f8178e95f274ba1469e",9.317957166392093],[11911,"2d096bfb549fe94429ee2930eef1b54f229d3df85b8d96388778988866f7efb1",9.917710196779964],[3173,"f2e572badf024c355dc70e7d9106e565b58f7c12a0021aaf16fe16544c8631eb",9.317957166392093],[17111,"3efa37754cc59210d6b0d8dddc6edb8be98799ebc8c62ca4e07028c03f31c34f",26.13903743315508],[12603,"596098012bf310b33045425bd262e6a365865fea1ad2a04edfd9fb1873653cad",9.917710196779964],[14386,"d1ad024df8ba963b0b242502f3db088cfc4028ad4affaffd747f195379b8928b",9.317957166392093],[16902,"581e4f0057469bf97623c1ed21e0aaecf9eaf75309c34b39c7545f0aaffa1f54",9.317957166392093],[10158,"72dea1029cfaba2c385e24af25f546e1ebc378ac5b7a89b75be6514bb6d55abd",9.917710196779964],[14197,"d9eee2c3ade74c0743e48c9b1a0c5209b6006b3fd1aa9d57cc57fb6b70134c90",9.317957166392093],[16351,"abedae6e68169c404e61b6ad449575368c843d6303a2b704718df7a272590c60",9.317957166392093],[2222,"85e8a5fbca41bc0cccfe1a31b94deb84f2029df394acc133e39d1745cdfe5ff1",9.317957166392093],[8721,"a939e47c24b8ae1120a1bfbd8916561749087e2f1f7507b59faf96d41bd08ec6",9.917710196779964],[4089,"221647c31afa74a3c57f991c2390dd4ce30b02e0949ec8546f25f12c893123e5",9.917710196779964],[11541,"6aff1f1d62e3542978b1a8ebce6ab780c2e9c1a82d6673477120425fecb846b4",9.317957166392093],[1904,"ac53006377d6d85b8b6ed9c84d296466fd40c5f92d141ab79324f152a5d299f3",9.317957166392093],[18206,"4eea7d7f73720fed1fec766ba49233cbeb864294d9769be8b7dec81d8ba4e337",19.13550600343053],[8378,"a5352da898d82dfb96f02c1c491e617c32d69c6b09e9432c04e14c73ba3bcbc8",9.917710196779964],[2497,"ec14b5d880fbc89547c92ae79787205a46a78d11ee5a742cfcaac37c1bc4dcef",9.917710196779964],[7546,"00cbac125c7c997bec79ecfb05ebecd4a21d2032da6a55088fd11a6991f28cce",9.917710196779964],[13577,"4b0d0fe9d8aa1a6b6468d5802acfd18e1d01e2ddc935c825d8d9ce6190fbf79d",9.317957166392093],[489,"e99066ab98ba53150b7e5007b38e2d62b076dce6279e47f74018e2d7472dbafc",9.917710196779964],[16898,"8f867170cdd08f25b93c1069763b19ff9660b579fb8d9803f1e35e40bf423b54",9.317957166392093],[14321,"f76307588a304d27626f72cabd92788ccfe16d8861d647f48bece246a708168d",9.317957166392093],[14411,"208e2ced4cfe72224726f52f6f728033a0acfbfa233bae2c7709d362ad85278b",12.064171122994653],[8191,"e11ac9a7abf7ee4c3656ab2ebd729547673b1f3dad61c225235aa3a1a5f70dca",9.917710196779964],[340,"b4b1efcaeab722a397cb023fb85a31df76a34c13fdf2533dbd7167f574f9c3fd",9.317957166392093],[16387,"1098299cbe8aec52e5a0df563ef9cf77dd750c29d2e1c41ea318c48d250a545f",9.317957166392093],[7451,"b6a6637a3aa1900b30f5f7edd4b4cb8619968c6eedac2b338efbe76555cd12cf",9.917710196779964],[18454,"7e24185da4de20df0b558214943d9c1e6a4baedc7287556ff5913d54a27d7f32",9.317957166392093],[19560,"71761f86033367b2c1a8e6f81e17ba0ddf441bf847960d8526b255c8bdd04a0c",9.317957166392093],[6166,"cfc95194954bb62a42761b575bf08d816c7fb6a441425eef4f08b6198e220dd8",9.317957166392093],[18241,"73844ebbed6e5908ed435669085868fb2fdf2beaabdfe9765a69b7983fd01f37",10.042313117066291],[6261,"24ce1498baa20f74eefeb04faf85fe7880d059d998f3533f6648ec6bdd2456d7",9.917710196779964],[18165,"c7b4d3bfbf69d95c6c2eeaca3ce49f04a26523c3152bf0cd2c02c4b1f2d70b39",9.317957166392093],[3109,"8f9dc33e5472167d7828b50a71525592017be295f151a09e1d3b7ea8cc4e9beb",20.009128251939753],[16748,"4df7f3da14e1d3e193056043edd68fa63bbbae68103df4c7a8a1a6c213ec8057",9.361256544502618],[10008,"622af142a09bb9ae73dd3b53b3e248d43ce7de763718a3c45ce5980bef6a48be",9.317957166392093],[3645,"2769ce9ad4cf3adfe162ce7b9b816a4676ad86a3425229c6957f2d245a68fae7",9.917710196779964],[1354,"0b5db3a8eab4f5b62231a53dbeb9cf0605b657a0fe92c460032eb8fc0df707f7",9.917710196779964],[4132,"71c0a0393582365d184e62dbf6724800d23003512e855725642d45641c1adce4",9.917710196779964],[16196,"ac5b0aaf6b44ca6ad776209bb0bae1fb8dc27b40f9a49815a959785ade441264",9.317957166392093],[17710,"91417ae4698ebdca6e98f658224c127042c36501c9c64027f5fbe040ab860743",9.317957166392093],[14259,"7f988dcf4176ee7c6a0c850ac323120fb965f427d2b34fcbd44acd06d2d3af8e",9.317957166392093],[10694,"10d81077180fcc922bec26188ee9ef6694b64e504bb8614dc6f06187693c0aba",9.917710196779964],[16660,"35417b217319e1caab45f97fcbf4376e3e73f782cff13f70d8c7fa4175687e59",9.446518076143755],[2392,"a91b955420393b2e4f903e8ca5193217887983c7fe0b9df16ae591816c2786f0",9.917710196779964],[13744,"070d06d528547d70d8185ce2fe33c9773e746bc9211e9d41660f4653412c8d9a",19],[2870,"e7d4b4e8a144254d6af345a011c7e442d40c4fe4f078b01bcacc4b0c76ed4aed",9.317957166392093],[970,"1cfaa777974ff5c61674481359f98e223318c8701315d8b57deea475b7ab61f9",9.317957166392093],[15103,"b2813c4552553e0ef98d5d81b4ef22e81e30871b75b76df2579a4a9fed258b7c",9.317957166392093],[15231,"13a024c12e9f7fdad6b25a517b358e21a6d274bd18896fee9cc7af2917a5d379",9.317957166392093],[17135,"3fbb90d836803e3b3900120c0f9e2c9a86ed4259edb2727ac6368d6ad109584f",9.317957166392093],[911,"3a2d9f7cf1165113d8507926a2ada22184b8471a7f2cc874a19d9c6f768abdf9",9.317957166392093],[5367,"7090128be8a8a24e8484d0814ba41b3037539d1fe0c9f47f7cc34108bbab0cdd",9.917710196779964],[10869,"d929061baa0b8861e771a457c5606d5435cc61349e2a9d3d1143c5553693d1b8",9.917710196779964],[15732,"3513f8fde4e271336d9596ea1a9a6d6d38bbd0e9e57f3c4ab10174a8852bde6e",9.317957166392093],[17329,"811e9d8a78b89177508cf18644c0b80e73ce10f5b488b650e0f8f4c54efe434b",9.317957166392093],[17072,"4e4f0f54d2e72bd6569cbec3766bfb974eec2bf1c4ab265d5d119e2fdcdc8a50",9.317957166392093],[16571,"e745bcf072bee6d54fc3dfe9c1d93b0fdaaf61802f791fd408833e26c864bc5b",9.317957166392093],[7581,"3120a0da24db2ff1299b8cb4771a4330d004689dcdee002beacdab85416d4ace",9.917710196779964],[16807,"dcef9e9d5bed7cf8708b711477bef796fd2fea760c32de3795224b98d3ce0e56",20.19704433497537],[8462,"561dfcfd00fea4574fea14e294ff02d4ae261a9498ef9d75f33154341c673fc8",9.917710196779964],[4416,"b87c248986db1d04ad26ffff8bb936c92158e41eb7c55ee4dcb306b627d1f7e2",9.917710196779964],[3178,"c88cabcb497b429e8f065984d62a41fb76cffbd54bf560e2b83c9fb6136e29eb",9.317957166392093],[4235,"6b6e521f151f7c136e204ad270f92f87d97a5bbd6d4296d01f5d5bd8ce9131e4",9.317957166392093],[5479,"24f3799769abf5f779b5534c6b77436c09c839d6190ab7b8965c01a1d74254dc",9.917710196779964],[11371,"7f3e2f7392ba10a0ef5bcd2ad05d43505b3589b4d8f56ba0b0b057246f0192b5",9.917710196779964],[16738,"f62cb108d7cd089bad27bff2c31ef80e3ad00f5e0bf87720bf1dd809a5bd9c57",9.317957166392093],[19523,"461537cf1795866b3d07381b56e5c1c21b9f760bf582ea51e5add558f039b00d",9.317957166392093],[1875,"3274d07d28c04b07ae78a23ed2acf06e427fe66a892ec9992c3f460e923fc9f3",37.39153439153439],[7722,"c962f49da51fa3d60f2afd9784a5f42c4fd9b0c6fda28969becd9987243258cd",9.317957166392093],[19453,"dcf0ab2f4d835721bd336fa6ac0972e8b6eca556697c0960017e8643bad4d80f",9.317957166392093],[7377,"eff039267d94e2bef37afd6830b584c91f73cf4cb51f11bc582810013dbb8ecf",9.917710196779964],[5107,"e649c7bf017bf7eea8c9a931782c621da315f455c6a63efc000a80cfba4e87de",9.317957166392093],[12854,"96ac0519a09c4f3ce1c8253130d0fe5c2525c5ae5054a466bed1b61adda38aab",9.917710196779964],[13297,"21bdd032c6e2098c36c2d5d94735bd43ee85d1ba827dbb134b49b608466698a4",9.317957166392093],[16443,"acdd43b5d97f3c029331d9a0fb198ef9966755339bb14a5beaa628c7f0b5525e",9.317957166392093],[3528,"513be431e7060529ebddc8ea272cec3030f903060ca311afe4d67fef02b2c4e8",9.917710196779964],[7685,"082d386fee80f9288bb20e85dd2d8d8835d5cc6b1ba73fd10a08a9f4d2ffabcd",9.917710196779964],[15424,"768d08d3affeaa8dd08d29f5afbb53bc858cf6f51f33e506a21037ada844c175",9.317957166392093],[7405,"e1156bf6b184da25a273b2b438e257f763b285a1709f668efdba27ddb7c765cf",9.917710196779964],[620,"e61890600bf963827389e3ad2bdda00acb432a4979bc08967474c5d3dc47ccfb",9.917710196779964],[19257,"dbe93212aa432cef24e270f6305c95b6c5297eb4209e2733c7c4b80e5bbe6616",10.052724077328646],[9472,"971cdf2a7fed002a8951d962a7ed83ee4b6f8cab44205284324b9470cc66e4c1",9.917710196779964],[2996,"b4f44723af59dd853a65542a71659efe5b369fde9b70e6aa79df2308b5384aec",9.317957166392093],[2281,"1633a2170f956e9658ea54f27f11ef518403d34a04b6d89821df8e6110bd1af1",9.317957166392093],[19795,"3cefe9adc8a50ba9bf69183ec4ba9c05a3989809b69ede46dcbac65c9c5eaa02",16.787185354691076],[4825,"64da5d8b98f11aff67b2de8458fe18a72c2d9f1b34041aad8c00c95edc5541e0",9.917710196779964],[7885,"65d54d4ab2c7e60df0387819219d72ba6985c65db5055218496e0eba972562cc",9.917710196779964],[5157,"6aa36f004a6e8166c8342f37d7c4033200b93944161de8483b02f43ac8553dde",9.317957166392093],[3074,"bcfb0554c8043ef497971003c09c5ce007208bf25fd8e651bf963a86298cd1eb",9.317957166392093],[1780,"b3be531be7ba08f339147fbe4ddce378b66c7c8d37adac73a2c355c8b7d159f4",9.917710196779964],[15384,"ba9693c1f1c13f9d4ce29e6ca7e8266d3721548f5f5cdf1a63c7109d2c019a76",10.052724077328646],[7318,"3dc7597731824178ad2bb86d240c4f72f545ac0b4ea70334745163b3642cf7cf",9.317957166392093],[19355,"6d2468c31aa3b0361c1a8e372adaf24aafcb6bd54dacbaffe2207eaef87d7013",15.830388692579506],[14960,"a05d892b45d4b307ce490646fcb74c07ea396d3bd2b4b15a5d8c88c19b3a767f",9.317957166392093],[13616,"d03c489060dbbd1b37dd019fe211522a81d95b723da67897f536962fa3640d9d",9.317957166392093],[17691,"e5b9cc2002d1c0e1c9adeb292e3f7168bbc72536c9cb0dd5718a80a65eb16243",10.052724077328646],[902,"5956204ff5b75314936ef673ef39bed62ca942d8d621a93c71999e56d350d3f9",9.917710196779964],[5184,"a31c348b590cb4e0fc31371fbf888425970d4b5180721f867cf9ef93d47012de",9.917710196779964],[16877,"3790b83c53866363f3f5dec4010953360385c3ebf4f487bc36dbc8cd71e1b254",9.997888067581837],[6184,"fbb581c6c0060464d5588ce6704160356532d5e94bb0e602d2e899659103ead7",9.917710196779964],[13085,"24be8d7036584cd93999ee96b637f50e65d8607f39cdd0a11fa68a00bad4d0a9",9.317957166392093],[8473,"12c8c629d7dd984154c67b1c6f32d74b7ea5d94b84b8d00a3882de42dc872fc8",9.917710196779964],[19214,"df5f74c86eb48b9406ee6fc548c3f12d4934d7e5824ca2653056902e5ef03518",10.052724077328646],[611,"1606cb0ba3647eb7689adb7363860019ed0f75aed71f6df459ff645cf338d8fb",9.98764317945158],[11810,"69a8446d243af9968ac24508bb09c23abeee9c0a83a02c755d92a3d85891a6b2",9.917710196779964],[1976,"7d5a0ac2bef8008da7ca7e458583f8372cc8113c09142ea688ffb84733c425f3",9.917710196779964],[17414,"e1f8d495f5431a10f549937289e032b3b44c69a7df5201ecfcf7c25d8a4c8b49",17.005347593582886],[1730,"ad26b6a9a95f04144e5b03e4ec4b7aa193890138ed0f64c8fb6bfbb2ade4b9f4",9.917710196779964],[2495,"7b2c6b060e2330ce5a16e05cac596b451baf9e569ae78b240fa42e6efba3e1ef",9.917710196779964],[2141,"63a4695a2b9c4a0218b0d220b2e11abbef995c634ee301aa10ec8aaa9f9efdf1",9.317957166392093],[7330,"5d7b317e817203284e06ce5abec40a67803418f34559a04dc404b919b2b4d8cf",9.317957166392093],[14943,"6329ac5b119ded02837f0afd43181997e6bec553c9f589e8a8bf6dc7e641ed7f",9.317957166392093],[11269,"e45d595bf747ab98d84fff3c1069db91d76fd76d24369ad1000dc4576fac3ab6",9.917710196779964],[15133,"e14a5861c9487f3c568ccc51526f4ed2abd893f4cea018eb45643f70f5fffa7b",9.317957166392093],[14101,"2eecfa31ea551657423c52295292475d66133cf9d0966d34da448d88ff638b92",9.317957166392093],[12867,"eb7bd6df65479ee6a2986e3a749c70019e10ae04a178f61e601a46e58fe875ab",9.317957166392093],[9575,"d540e06e0cae77e26b212e57df116045360182761610c02f92705d2de16829c1",9.917710196779964],[16088,"c5fd9004868ffefe12e6c018e72c066ce4783676147ca1daad47e687f9e58766",9.317957166392093],[2284,"1ca4190b29cda641f4be7e156265f8ae8b7c51aecf186a6f465a3fd4463b17f1",21.71964461994077],[18273,"344359b8af1afab544bb035e9291012225ee604627850e1b8ddeedb180bf5e36",9.317957166392093],[4959,"b66a55897f785311f315b05c2ef85e309dbaaabc385c9b3314927724f33a7ddf",50],[12096,"14d8444d35468ce423276bde87a6ac059767c89231aa6b551fe126ff534bbab0",9.917710196779964],[766,"b39bc586672e6a387936a764d462d4e2ac8a131a33534c76b81e434c3ad0c5fa",9.917710196779964],[361,"58ab9f89f6bcca0a9a9dfc98be64a155216b84f15b952c7b77c41d4c94ccaafd",9.917710196779964],[9609,"a0dacee14368a5b707926fb8e7404e340eae692130f2ca625971609cc6abfbc0",9.917710196779964],[5083,"a57b0ee98eaae7ea126441f37bbc4fb9554b91b4110c3ea5d2e9a4724924aade",9.647446457990116],[11393,"4678a5d90bab7ada0f43e51bf8651d5c587fff0b6f431b75043e2b3df53565b5",9.917710196779964],[11172,"8c7206292d7bff67f4978a187339ff341464e4743d250202dd2efb7246d2deb6",9.917710196779964],[7108,"03cd2242a254dc1880bc386eb2125eab7b885cf51a78b62e4b847644b7b64ad1",9.917710196779964],[7519,"701530591673dfca995db8ea0d713c5b41e7520562726f7de4ee8eb18228a8ce",9.917710196779964],[12175,"ff6d6950853ab528066c8b84ea7faadccd8aec158269e5c34b84fb5c1ab738b0",9.917710196779964],[2410,"4011cfaa767e5e75f3097f4dfa6b4f29f12c141164ca5e9e1406dc9443d360f0",9.917710196779964],[18691,"77141dce7ba2e1f93b5faac13c0742dde2be274bbcefd6f95b75eb5078e79f2a",9.647446457990116],[928,"00b585755c06b30e3c4dbc4ae69c68f3da4cdf420f83b0f2199f907d80a5a4f9",9.917710196779964],[17224,"b8c1bf522b8262d609806ee7a9d88b8d2137f37bc4f2065a49fe13152fb3684d",9.317957166392093],[16375,"a74a4aded3b9b90981cd620fb1b00bc90668797a7f312137cbd6f5d56a2e925f",9.317957166392093],[3059,"e1fd49e7eabb70ec6ffc710a9d53bf838827c67d8db1dd89c7a0ed1e9c29edeb",9.317957166392093],[2432,"f1e09cd4628c3df91d9b5644e175cd2c646745ae31af907b0f1fa06fe13e41f0",26.173719376391983],[10986,"4033661b4abd59e272f29530c3606495444c0109713cd23d381e1d88914f13b8",9.317957166392093],[12970,"0a9a70145b85556f681772563671b076c501cdcb3b59abdd9f93c00c2a94c1aa",9.917710196779964],[6376,"7373fb7f07e63c3515f3a31c16892400f4bdf8389ce6bd1e986598d9ca2876d6",9.317957166392093],[14033,"e82da01d098912a612aadcf5786345310cb39e63855bc0f19d4985da5a980294",9.317957166392093],[16633,"bc52e649451fd4b31aa922c5a44aa7b5e495b022d868376a93c39a2ad235255a",9.317957166392093],[6189,"77352b34068ea644d5fda83e7c7725bacaf3078894059b618ddac09f1e04dbd7",9.917710196779964],[8061,"78fce97cc198d252ba503e6f11645158b43f942d0ab952aeee74e23846d409cb",9.997888067581837],[6997,"b060d9fcf091a66d233cc5b14382fbc17ca8109e66ed0449b8e52227768706d2",9.917710196779964],[455,"5a5448ab0fcb03a8bbdabb74734aa644252484b3f3573c40b554312c8d8f03fd",9.917710196779964],[16773,"13072fe6797073c22939c9b15a96c7db4a355b576483bd51455cb7ac33b6f756",9.647446457990116],[11496,"c87529fcd7918d4399eec91187e60bff0a052b69a01f82dc7c33e126ceb08bb4",9.917710196779964],[6305,"4498ab7c738a497043625127c5643b50f5a24392b480c856fdcd89b77ccefed6",9.317957166392093],[3762,"2f9375ef3b394443c2d1bf68f0000d098a450eb98919d4e1425b938d87752de7",9.917710196779964],[10404,"942a554a78649cb7f32dd58ed7b5a451f7f1fc84cc23924dafb9611c1361c6bb",9.317957166392093],[17444,"470536feebe9d642d8c65f8651cc9bbec10d1058cdd966fcabf8817bda47ce48",37.14527503526093],[14809,"174bbf4b86fd03a2e4e3e01be3baa3c8b60bd932c42a96e6532d879b50229582",9.317957166392093],[1526,"27964a5fce79ba52459d9862339a899c1f1befcd75c9994ece15b2f2a5b5f3f5",9.917710196779964],[10401,"f952331151692a58230cc451a8a92c4381f8a7d7ea9858623a43b536c8c4c9bb",9.917710196779964],[12914,"1797eef5ebe86db02a93e6f4e88b1525eb0a2103b38c732c45959518e8df38ab",9.917710196779964],[7843,"0d9e5559f71ab5f52265ea22ff34c6084bad411fbcb1599c94793e0aeea78bcc",9.917710196779964],[4266,"4b588200a3ac870854e4689d17f02e6744c9bb1db02288d2d2c54b9fe7aafee3",9.317957166392093],[7941,"edc7f41ffd97094f244706f4c326902197e64a763e4953ad393ae45e64a6f1cb",9.917710196779964],[15779,"1c5ee79b4ae416655f8b7e7a3b094313b93ad1300d0662af36183b717703c06d",10.014641288433381],[6296,"5a395836b895eb88208aad9d911e5020c33b56e2f6891125f89b23e6ba9a12d7",9.917710196779964],[1986,"2c2cab02bd40d4d38e3cf2f8b2612546c22d722ba8820c26decb50b7b1df13f3",9.917710196779964],[2334,"d9f7e925008b6884c7ace4314d0ddb88c4b7f63366ddd0822a89c106f342d4f0",9.317957166392093],[17091,"7979d70d669258ff4bbb23c79afaee297e783010ad56cb19d045bf9240de1350",9.317957166392093],[2970,"50fccc932e62c99489b18de49e057d4dbce092e4ff926cfce2362cf8134480ec",9.917710196779964],[3644,"679ce0c65eb35b15f3a39e7d75ac2e5d4d14948a7cb14d5ca0275024a973fee7",9.917710196779964],[1237,"192da5d099dff092ca73a8e2b58a38bb1ca4159586178da4a66879e01eb2c7f7",9.917710196779964],[3569,"ddd759d8694e1f744b9ecd7ea53551a21aea5d0555e731824a36404451237be8",17.16883116883117],[16184,"d3470426b64d63a6cd61f6fe555b59e03230f2b441189464a434400e1ccf4564",9.317957166392093],[19852,"9c4496cf09dd53ae8834b7b0610675a93a1a931e6d9dd838cb83b95b0748c000",9.317957166392093],[11778,"9c4e44d55d3fb545b2086f1037b79d44de4a6d44d15be826e05c74ff8593dab2",9.317957166392093],[14450,"758e411118b5ad6c9ea3ebdec387f89963c512b82871de2e0d221aad0598448a",9.368983957219251],[11856,"d87241a849860d2446d690b5b95ee56ccec6737fbe8b8df1272995e95a5f54b2",9.917710196779964],[14394,"7ba9362ba158a39bad3c60dc2cd576a395d9a443e2a344847b8f770b757d588b",9.317957166392093],[18559,"310a6a618fd75f592bc956803098ee9e75631152660e066db877acbf0e2a3d30",9.317957166392093],[18588,"d2a55945ab1f04a308a3e4f16fc385af3c3a8d88d8e868f76f3f65b4038d352f",9.317957166392093],[11379,"6f324283bd0ae2f56cabfa69562b86d9112f157ecbc48ccaed75528713d587b5",9.917710196779964],[6246,"7e37d28bcc48584547a2a6cad008ac48beada13a1741cf6f15f87f9684086ed7",9.917710196779964],[12850,"b9c2d9a3d96151a6dbc5a0d8c96ac644909a9767b54c9770249c595a3e2b93ab",9.917710196779964],[14120,"47e6a4b91523c50e260d95f9e2f875842e47cab7cce11174ce5001b0e12e1792",30.166371681415928],[5344,"77a66d2a723f8f8e63ff3b13167d8349b9471eaec11e8a9fa0f2d253ea672fdd",9.917710196779964],[15909,"902991c597f0c803c4fba9ca09b80bbe0e783a2e27e3ba2050e3851bd6abd36a",9.317957166392093],[2760,"d4208ec49f96c803fca16bebcc72d7dc0b54527c294352df9bf2e567d3820aee",9.317957166392093],[16533,"93abf314d71bc04105ded5769c885dc53d702d5d2145dcfc05a631d1b98b6b5c",9.317957166392093],[7894,"71f45d79271f459ec3addf7cdd84efadd5af3422658ce0dc3f0845f0be1448cc",9.917710196779964],[12977,"3e22a369903b3757aeb25c1c4906fdf6a533d9c825364cc55906930fa876bdaa",26.03713527851459],[10672,"edf99a919c47960ce72cd16937f85e556053db713a217d96a13ee0a47f2d38ba",9.917710196779964],[16113,"8fcb87233243fb85713528307f93788bba0264f5936c61fb4928bd9642acba65",17.16883116883117],[12715,"8567da7368c70e1f648a7c223b7a7c2830d403aa78a3ae61c9dfd2d5fb717fac",9.917710196779964],[7043,"9885b3dd51995ca005855e49bbc8a51c8150d0ada93dbe0b4781a458ae7eb3d1",9.917710196779964],[17069,"e532f8622df2622ddb50f8b79b9cec0805e1ac82fcd1f89c8f1e9b979684ba50",9.317957166392093],[5706,"55407e90d075ef67d7dd5f74f5d4bb08a67ef52bbe9ebc2102f870e1bf9504db",9.317957166392093],[10289,"0bd4cd0919bd49b61dcaf3e82dfb30ae8ed5065cf2d46c4d51c5d0d659d073bc",9.317957166392093],[4729,"ba5bbdbee5dd8b4cb9f24a5a1ece9f66bf1e5b329c5a953fd4df15b941e9d3e0",9.317957166392093],[7065,"9e81346ea9935ef64f6a09a65bd5a48501e6c3b7139ca729c2082194feae8ed1",9.917710196779964],[22,"5c2b86b3ed94fb70e1246331acee5998cb2ad8766b433812f13cdfc8079be3ff",9.317957166392093],[11224,"ebb6f233fa5468b71a8af27e74031452bb86af922f94ef4942d1127ab9fc8bb6",10.052724077328646],[7641,"c245aa889f01339db6488a618ab6eef7f55c5987f4f07f3715e3b3f2132bf0cd",9.917710196779964],[18590,"b6b4b64a583126dd5504364bb9a82c94cbb287ae2e92644276d2278656152a2f",19.066666666666666],[3772,"a943b1588b1ad75d0d2a4b44daa22dae0b99cbeafe5043ca297940816b0d23e7",9.917710196779964],[14480,"689b56ad7695634f00721567e2921e24d94229a98e01127fff31c8d7fd8c9989",9.317957166392093],[635,"64941baa140845f8815ef8bb0efe4fbc54a70fa7cf564d295c0a6a2874b3abfb",9.917710196779964],[19330,"3a909e08c53b591231a8736ce11564cc990081fb928646cf49d591e56aed2714",9.71386430678466],[3753,"2f05b13a4e8fb008ebf83a838f7529d07e60cb4a47d5910f70397457fd443ce7",9.917710196779964],[7988,"1b5ecd107e64b6e4b90fe9057b9af9cfa326dba91cd77ec763b6d35e949a98cb",9.317957166392093],[5046,"b4cd0611382c4bbf0988daed2bf4850f36df92a32003f850dadef4d32cd2e6de",10.052724077328646],[7122,"87b468c766526500e3b7c4c4c386343d478c6700d954bb0f96e445fef90c30d1",9.917710196779964],[5436,"fc733c7a699ddcf9e8849e0d23bbd6a4d5929faf40f320d904c6a3c94e1a8fdc",25],[16238,"ff710a29d8cc4fa0bb9e79d98ce6a15aee65ff4fc28f068b170d9c981896cf62",10.052724077328646],[6023,"ff4ae06e625e7e8dcf2e8bee9b4cebc7eca102f848655e16919166fc1764edd8",9.917710196779964],[4042,"3532a78047d52d00904ce09ceac7716112edfab6288e5ca4333ba527fced7be5",9.317957166392093],[4321,"c7b9c928e0ce70798c44cb9023f7edb5f27bd266bd3d61ffb79ee46d2fff9fe3",9.917710196779964],[9249,"e3687889ce752ee5510d5bb0b62dd1ef781ce4e12454883b787d76afaf7822c3",9.917710196779964],[531,"c9b9d159b2e0a18b9d75e85ee96e6edf5a2c6a27f9ff1cd25d831c712d0c79fc",9.917710196779964],[2755,"3f918d4943c7ac58a53fa3c2c8e11d7b3218d5cea056026ebda32653117f10ee",9.917710196779964],[5300,"63ecefcbb82a9387976b85d71a5c5bdc1d6d612015a84b3ab8f6da63732c64dd",9.317957166392093],[2973,"0d59c503f9ef466d6167abed25e6578c084770a5cc5aba593825d86efe6c7dec",17.429473684210528],[10344,"50a63ea5cd69f19527d3d390be91d93c1a298b7a615eda9f4655a35f855411bc",9.917710196779964],[1592,"292423b3d972fb88ea07d39bdb1e6ba6b9580805beb5eaa97ae6f0e1ac9596f5",9.317957166392093],[18137,"4191139394244c7ba9cedb33bb5fe0933c4997ac7ccb3b6d6a88be304c1afe39",9.317957166392093],[4243,"a77e16e58e4645674fc4c36cf0371e1347ea0d9764d96b9de731e05261562ae4",9.917710196779964],[18332,"5b101395688efb9414731110f092c6193ab800140484d7faac08d50caf6a3e35",9.317957166392093],[9231,"e50b79af53bb21132e709057c2fc21a58650ade4d3cd9e34e760369b386939c3",33.78010471204188],[7739,"64aec422bbd925a67889bdd46ff701fe275e28c56cc8d0dc2692b3d220803ccd",9.317957166392093],[16124,"03a7ca3e674366d28a4d48e7a28738e9a626f306ef5121945f95df6fbcdb7565",9.317957166392093],[5186,"8a3006df34676b88af058d9094604c48522a41a17abd65a5f26dbacf801311de",9.317957166392093],[9946,"ab10536e0cb11d64be9aa11b8ec572ebb6f8fc822e9168b8678aa07caf00a7be",9.917710196779964],[7568,"8cade9fcc35f90a220907eb396fbf0543eee3a3e8a6e2231792a57996d4863ce",9.917710196779964],[6198,"ea4ba596201366667c77b5261300225c85c41652bece4f01a49c33fcd2dcc5d7",9.917710196779964],[574,"7746125673bbf9e719cae53840a134676370266843bf80862060ceb26fe019fc",9.317957166392093],[3467,"da055aa891ad56ef485c8276ff0211af3ee6acc7dc171a42c19bccdaa88743e9",9.917710196779964],[6493,"85fc143824a11a1f8d69063431b13b5f729a2e767cf31e78a2744c3241bc8ad5",9.917710196779964],[15317,"0a4ff63593aa19327e8ad852bed3691d1aadf5d8a30fe6f1fedd3f94594c0278",9.317957166392093],[8240,"22f269785115d939edcee4a14e26b55e6f6978a5ca8e90cab2dd89f7386eb0c9",9.917710196779964],[3374,"2ba7cd1c6c7777137fb61fc12d5f4c9b39b34a30ab60afb07755c9fc1ee6dfe9",9.917710196779964],[8887,"e6ec87a86da66f0285a62167f925dcbe217b53b153252fc5e9717b4d855084c5",9.917710196779964],[484,"c261a02f98b8a0607b121bb6b3a8218de573f9fe739fcac16c6cd33a367fbefc",9.917710196779964],[7477,"fd9006963128cc3c6036ebcb1c9b98ec3f2339f367791b6ff8c1dc4d2cd8dbce",9.917710196779964],[2780,"2173ad6a286851c7207f5a693436811fe3663aff3c345506ead871a53b1ae5ed",9.917710196779964],[276,"0829c0813b28a71f91295f53e9e072840b474443275392aeafce61e81c2a1afe",9.317957166392093],[19479,"43c220b8eb579a0ea8037b19742bf4cc859f45d7b25be44d805a87ca38c6350f",9.317957166392093],[9287,"016f898eb26e79bc3f32a0ca14f830ad52b61f1fd98e506c96cd3f5909e9e6c2",9.917710196779964],[8855,"310c2795b758a79726e289297266064393557b0bf20b5ab8d36091cd9641bec5",9.317957166392093],[15294,"c206260973aa8a6da2d6ab5827524a40b31d6f8bcff77ba672c0adda7cc29878",9.647446457990116],[9706,"319fdcb18c06e6f1ec56b7d23d6f5922d212f14c832174309a7c2f6da69f54c0",9.917710196779964],[2852,"ac69f2723fa3ca24bbf44dd12059e2244bc383fac8aa5ffa4977940f4cba5bed",9.917710196779964],[9722,"c24f2669dd35cae84747e3f1d0d7c19a2a878af3bd44cb1c810405e4285634c0",9.917710196779964],[4718,"7a0640c7c1f4532876c4b487431d4becda537e1878559cd399833974d054eee0",9.317957166392093],[4025,"17f74e9140e8dd1c016d4364b8eb7e98deabdb3be6bde038f790e00f95b097e5",9.317957166392093],[5359,"e62219337f7c471c484783cf264709ab04dfd71475e554fd713f1e4526bf16dd",9.917710196779964],[10307,"aa23021d29cc6b90e13f6e1774da8d38269e11a02942b26080aaa6ab70f04ebc",9.917710196779964],[16574,"65ba434986babfc38bc41d72e957630050ddd9ebe48f726ad33e5cd20d5a9d5b",9.773123909249565],[6724,"46d2057f143fba1eca46bb7a19a2bed9b494771a1a7dede9f1858bee2ef8cad3",9.917710196779964],[8001,"cbc54a188e4dcc5ca16158695c7acd3e47165aa80fad1892eb947130d17e85cb",9.317957166392093],[11706,"8dd0ee2c1413e7d1cbfdd5bcd729c7d43519df733561fa52530cdde5f7da43b3",9.917710196779964],[10837,"535407996edcb22fdf78305e12742f5f0c796be1bacdc3ede8773b1cbfef13b9",9.917710196779964],[14414,"65ab6a51d05c20b355e04678aaa5e9d8bbf2fcaf132d2366981b99b46163228b",9.317957166392093],[91,"96084ad56eaeef26b4565b88b5e2877c151dc1b9045500b311086919e4c86bff",9.917710196779964],[13029,"3da4bdb895d34d42e9b7ce04ea5d60119d838a243443165b175bcff8c2f365aa",9.917710196779964],[19763,"8ddbf4fa5b627e76c5921b26177f36e21c95406d8cacb60907413d7b5450ed03",9.647446457990116],[4875,"ad839d91a405575093bf0121ac8649156f0b0e84757c4f77dbe6a35b68bf00e0",9.917710196779964],[15420,"71200d8c7527db911c75fbc7b656c82ea701e7bce66522f3e967e02cbaafe975",9.317957166392093],[15237,"c305e4b59e8754f349de9001534df2882394e1e1d3854beb85ecb698a55dbe79",9.317957166392093],[10142,"619be8fc800f0896b7a25e36c68d5ca78b1215e49e3b53c0e56b2790b2596ebd",16.155844155844157],[3212,"50571919557eb65187bcb26d4826356768c31053134c2967ee16ff187127f8ea",9.317957166392093],[19055,"bdfed747cf4580a8dc89ab8db7ba87d3a7b288efef08f71e2d97da887d27a01e",9.317957166392093],[15181,"dc77618e6bc27d52b009b8abbe970098a1a614f1c7de3e91f03c1887d6d6f07a",9.317957166392093],[1334,"8e6392e88954b0c07a8bf332c190b30e509066a5b9e5079c9394c9867f682bf7",9.917710196779964],[2269,"06ad1f99190ac56f86aa3af06b476f99c66613683f3bb7feda1c1a17727827f1",9.917710196779964],[1449,"49ddaa402626472b8cbe4dac248bf9769ebef1899ab0a58b08533fa9601280f6",9.917710196779964],[10953,"6f4fb5b2b8cc305244ff195ee8fd629cca74811863c704ed94af8718484151b8",9.917710196779964],[10947,"1668645c08bb79a952be7b20d36e6bff969a3016528426c01f28e3c3e64a66b8",9.917710196779964],[889,"edc8d3410201be8d1c2275a10127101510596982f22196782073e1bbea48fcf9",9.917710196779964],[12783,"479d005bd8c7d307b3ec3cc5ae8e5dc072fb86de6c0d0a0391aa514c4dda04ac",9.917710196779964],[14163,"cd6f2109f56c283b675fe2773061e44b963f7293fb751a2cd0d9c47e8bac2f91",9.317957166392093],[6534,"7c06a71c1260ee915e73ed9152990ce9c13da90e2ded442f3ed480965b1e2cd5",9.917710196779964],[8089,"9073683e50854a673cb2ca8eb4059431a8669b96c36c2467c375b8dc3893d3ca",9.917710196779964],[16876,"4b48897e65ae9a3fb6108f7ab8918c18e492d0f1351e41f7788bac906c5fb654",9.317957166392093],[15954,"b009035d0b83a90ee1c693a333251ac705a6ebf64a10d0357142d61147f8e469",10.016260162601625],[14840,"a62745e3799b318c4aa5f494fd4e06fe4fea29f4dc9120119c1f501368502582",19.2],[14097,"d427efe28d0600fd355da9957890320a9e5f24079a98646197c94ccf3c9a9a92",14.188948306595366],[12920,"b47bbeb9be684efcba7e84f65ae74ee2043f19e1a6a2961a096de317e04c29ab",9.917710196779964],[1511,"49be06fef9240b9313d3574a2bad98a7acdd72a01401f4f9de28f5622d9d0cf6",9.917710196779964],[18766,"14f5166b54e8c63345b33df9d758c9d7e4ae841986099f2b3641023873841928",9.984905660377358],[5535,"7c6b157f65c7955ded2565296ba60aef5b2f7748a5081c4fc678f077fc4201dc",9.917710196779964],[12432,"37f2c2e3ef36c64bc9726e03827e6dd4a938180858be9ebc6c825123343c5fae",9.317957166392093],[19377,"138f193195984aafb8baf4302b77ccc8d88f3b7656f592f5108f616f5a63b012",9.647446457990116],[16623,"20de6ed38b16544d473bbec96d3d91a37a9ec66c4106670301ea151221ec545a",9.647446457990116],[2277,"d450f2410770c65fbbed2cd59e849a02838bf96ea79487eb3caa658a88161ff1",9.917710196779964],[14598,"6d024784ea694f1f1526d9d223728531300323ac336c6afc31dbdf6d7cb72a87",9.317957166392093],[11696,"89caf3e73e1f26118e2608aacff2c28aff18b4688bf927404d506a5531df52b3",9.917710196779964],[3020,"0dca1fb6264dad521feb37380bd245620025ccce38245c4c9ce9890da44b21ec",9.317957166392093],[9235,"df09f091201dd9d491ac2b659cfa9966ddd8593c18d10eb6d9587367f57d33c3",9.647446457990116],[8314,"f52d4c8b15d3778218dc8c56add25367c673144764e4eb6fbcca5d560a6b3cc9",9.317957166392093],[5654,"9697dc5668b2c9c9eb3142e134e0bda3103f7ad16d04eefc345387a20d834cdb",9.317957166392093],[18263,"3c2756bce6308c2df3ca7216210ae033f1e78bbed2ce96b0e31b37fbf53ab036",9.317957166392093],[1371,"ff4081ab83c0f4825a5a410697bbe13fa6981bcb1215b1d0d9db80ec1ff4ebf6",9.917710196779964],[7526,"20a70c140ea60ada40b33169d9a01f14b2e1e827e92342f76f352b47173c9cce",9.317957166392093],[18202,"5b7f7fda14867714440f05c467ec613f9fae8fd1909310ae8d7580178cce1638",9.317957166392093],[1270,"0a15f916c30d3a2813d7a6b3bcf0ff7edff234b758c15b6694548da8900b8df7",9.917710196779964],[11128,"021f83ebdf0af45f53b92784bf1f3deb1c313fdc2570aa59e5888694839e1cb7",9.917710196779964],[16122,"6d2726999457831a70656ac9b7c468140442b22e504f9c2d2612ad02254f8165",9.317957166392093],[12272,"60599fd2530b93fdb0f6a8b5f8334dcc84201a5b049ffc345af3a41e198f80af",9.917710196779964],[5494,"8e0f463516a8055c6980a9984399f3ca56bd4da4acefb50266d81d7f606842dc",9.917710196779964],[3938,"31943763876708fc89505693c050e6039dc8c6d587e1f599fd7d7c80195716e6",9.917710196779964],[866,"4bcb17f55edd1ce2e54a61dc9bedb53c20e5529f1e8be754df4aafc1045a1ffa",9.917710196779964],[5115,"16477e2ec341fe21a8274b4d236b7a49c0204255ad811e210c15e4d308877bde",9.917710196779964],[8516,"8e3483de61e9d4a65fd1e864baf04a7ab755d83f320f79e5272677d144bff4c7",9.917710196779964],[3840,"c29a5d3608da7d94a0da89030d31b10e410db82b593c15baa10e6dfe61d6c8e6",28.097560975609756],[8550,"47079b86f5c9907af77c1fc2c2489b1ce80d54e1988e15fef588ab8065e1bcc7",9.722983257229833],[10524,"64c278e3b13a081c591e6740859f4d332ff3d90437772b3f9fb49f70b9a903bb",9.317957166392093],[9873,"9702e65e492fd38f0703ab140380c22d087953f2d64bb4de9c233838fc961abf",9.317957166392093],[14410,"a7548d70aafc898f17e01163946433152fa9209d23c65ce5a291c3b2a9b1278b",9.317957166392093],[15157,"1f04250b62c3d58a663164b18a6440a3b89359def00378b0e3c2b52d77be557b",9.317957166392093],[7334,"d627fe8d52303fb91a099a814bb16031b39d4b2e55bf233518a3df2dce65d5cf",9.917710196779964],[12955,"7623f5ec0a6a848d4e19e6e4bef0d831cf86ac86beace6df33ac91d22f02dcaa",9.917710196779964],[6452,"c5f9ea75476d1b716bd4890187fff5290a719717f114e6e3e683bf1b7cfce2d5",9.917710196779964],[15069,"dfc7fb7a32271b9d858bbcf8cd60cc61482732b78927c04f318610336db1377d",35.91236878137837],[11127,"52fbe6481c4c09db331190cb01ceec7dac3bd18910d64677e73bcc8c4d6a1db7",9.917710196779964],[8143,"4c5f12a4a2ff47fbb1668544746c804dc9bd35dafd0d7abba13f26cf0e6469ca",9.917710196779964],[8416,"13dfa62e441017e78b7347ef646ba5e511736cf2fb56697bf58c57ee770d87c8",9.917710196779964],[2131,"65a3fb6f6ffc0d2f2fa37c9de71da102429521291a7d3cc8948a8fee77d909f2",9.917710196779964],[1273,"76af9ba363387e7d2d6d13305e6a6ab53df01f0cb9c5ecd962114785fd9787f7",9.917710196779964],[19260,"0180f47f94e251c8c4ea99bf9b2b06c63050088a80fb69b74ec3b8166b4f4316",22.896860986547086],[6639,"28cfe5e8f27cc0a04e96a10c786fe78a375427828c3751d129dcccd5afdc62d4",9.917710196779964],[163,"38b351a186ca046785842a89e5af8e80455f752186c3b1c3c41aee86cdabeafe",9.917710196779964],[6854,"5e0d6a705601828f02825922679793aa630066c52ca7a486027fdd758e70f4d2",9.917710196779964],[14915,"cde008cce4badc590d5fb7d657d5edf1c6e995f4613c3cd2a0fcbedd0833a480",9.317957166392093],[652,"8669c8ab44098fc5338ad231b9ca34a443901934c010208600bf475921438ffb",9.917710196779964],[16470,"a0931dec0cfbfb2b10461fbb8fd9f493a117cd95b0b5bca7b132466a1e82e25d",9.317957166392093],[7921,"e842177886f69ff735c42a4fb5fda3692890406a0c2399fe079648464bbc17cc",9.917710196779964],[12641,"db2df84d30e3c0d475926acd296186432c1973c5ad84cea20701d9a139c4fdac",9.917710196779964],[11334,"088cdee64d8ab0374f459ee94ec8dacbae6250fd9d89ab3c197d756636bfbcb5",9.917710196779964],[6702,"a943741f58d60c15bd88dae21de89b8ac9e7196cbc7c5d9f513ded716c9af6d3",9.917710196779964],[102,"34b2de002fee74fb91617aef42fea461444822dd7798ca83689ab01e2a8d5cff",9.917710196779964],[1347,"95d3c91b0fa94d92c0e0b97795a2475b86cb8186a97c87053b25184effe016f7",10.052724077328646],[3257,"c4b1fc1382fc6f822695b525f8a06ac57beecde4b5e9708462ad4a3598cea1ea",9.917710196779964],[13195,"442d0f89edeba2297b391c817afb7f76fa6833557939f160b552180564affca6",9.317957166392093],[2573,"31055a11a044e7bdbea3297d9955a250b12d845ff4f4f3d3016fa2e8a84b65ef",9.917710196779964],[16397,"bee417248f654540b0c819b453ba108cb44b77767dad2a73a4e1ec1495ee265f",9.317957166392093],[15005,"92054813a87a00fc7417a688ebbcc329c11859a69218d5643707b0b448bf417e",9.317957166392093],[9635,"1543ac0b2fbe012fb6059f0a732e9de8fe425964cb5354b6cf403e643271d3c0",9.917710196779964],[4730,"7a91723b4a18c72f3ef8f65d2de75165b830867e8f009a9e94d851790de0d3e0",9.917710196779964],[8883,"7527d2496dda610e45b92152f5a234e291177c02f0c876de092c05e05e458dc5",9.317957166392093],[1423,"fb4b7e41ab3e0160db3d683ae23adb1362c8e38f6acb258e7522cbc7f4ccb2f6",88.54166666666667],[10816,"32c436fcee07a472d3328062b88fdccc79b35d6aa338743ef38e3089911332b9",9.917710196779964],[13931,"2c2832a9054c4742237f8fbe30292ef18b41d9a8c0cc4f2d8992954d64ab5596",9.317957166392093],[10623,"ea0e45f6cca29c07eceddb5a77d94442a67ec90d53444fad0a995ef916088bba",9.317957166392093],[9349,"9de12e2fa8b9b11e51f0ca2038c484f5cc59ed85efa62169e632d34963ee95c2",9.917710196779964],[5763,"8ceb053700e9da00dc47985330d5d2734603fd719a3b0d565296a8a73964b3da",19.11319394376352],[2744,"fbce8f062ca68979c6af9500030df7c74a366dcc35a60a4773a6258b569527ee",9.917710196779964],[12837,"6119798d816b0c004934ca428843a65ddea1d4a6815a2e5ae30956cd0777b5ab",9.917710196779964],[16123,"9a05409c9756c62de39922fd9e62ce78a8c0a000d51dd227e4bd079b64147b65",9.317957166392093],[19238,"2857fd90f03d1cc9c8790166e980eb1fc3b3f221d935e94f478d53ad89374d17",14.188034188034187],[684,"45e3185cdd3738b3c8f64ee3087f7b41da936ac4a13e4daefc4720a098b459fb",9.917710196779964],[14002,"3b76f3f7ddc1db92f7c22227f746321b1f1affb8191eb4df126e095ec33dc694",9.317957166392093],[9689,"b0437a5788c54a5d97159350d1a9683b1e0d580b68435b98cfdc6e9d6d8a77c0",9.917710196779964],[7643,"09ae8eea67490061b7285412f89e80b30b9f5a9eeb4cccc6738edabde93deecd",9.917710196779964],[17816,"d22885afb6a1228b820377008f96fb950ac1f1a9e9b65274ea5bcb7b86070041",10],[11392,"105d76b48f7f665c5135b787e9481678356b19f6c772bee1fd870655293368b5",9.317957166392093],[1355,"1c74b50b2063aacefc012afb95f735841d679aa3b0b639d941223aa82d1b07f7",9.917710196779964],[14119,"e62a6c0b9a32fb3356cc813557b3cfb91c98285aa52b9e043c6e5ed953b91b92",9.317957166392093],[1870,"2a98fdb46b4ae3aa723c54c36d6e5fdba2b05c67209ec068e255657c2ab2cdf3",9.917710196779964],[15363,"bc9a013fe40e073d3b2cba8752d5d7339be533d1485ea69e4957d66ef1d61677",9.647446457990116],[8478,"966d6284c29c75562095b2645de9523b6b42095fc84735e995c1b9886f8228c8",9.917710196779964],[15747,"7d66855e9b4be513b656dc80271bbb0f3fbd31eb49ee6b263568077248a9776e",9.317957166392093],[16987,"57d360d29db459fd9b13d397ae0609a173853257411bc15df6b25751e4534c52",9.317957166392093],[1147,"ab85c45bdcd96bbd78cfc27298a65fc3489fbbc7b987578b42ff2550451f53f8",9.917710196779964],[2774,"815dc53ea419670216e93bd80b06317c24da393758a1e5662a6afeb3d1faf3ed",9.917710196779964],[3069,"d616fdf3fb9f58f584050c9a9e2dc69526ebfdd485df98162648dbe1504fdfeb",9.317957166392093],[12642,"3a7c1cf14f51a90a7d7de565e6766ff795c6c92153b203daa027bb65db5dfdac",9.917710196779964],[10630,"8b6b1a391f6bb0c75b7c88819e1432528763efeda0c7174ce1f9adfc9a6b7fba",9.317957166392093],[14060,"c2ddf12a683f6d875672992200e31f24585fcede0fe6612b0f2160af55596b93",9.317957166392093],[15100,"3ffb979644c41598b4ee7db2c08190e867bfc111b5200ed7631d5a216241957c",10.052724077328646],[5656,"16a91f288334f7e12fc2aa69c0bd2d8983b64a2b52a1d037b87c9e9b027b48db",9.917710196779964],[12630,"69749294599fc6416b38a4bc6b5d6afc01b2593971a19f36f99c4d5ba4e414ad",9.917710196779964],[739,"44391240f697c5c98fe653dc8839f26499b78597a88dfe26818e46c005ebfdfa",9.317957166392093],[7312,"12c372a7ad7f9081c72e6deb4af4b331975c0e589001eef9530e23727bb5fccf",9.917710196779964],[19386,"ac251fe94d5c73ebe254843c3fd53f4a9e1b053497526c23d9c987445e5c5112",9.647446457990116],[10937,"ed65f8192a61f23ed4d49081f6df55598620771fd4b88d45b5f44506658677b8",9.917710196779964],[6440,"8ba932ec5faa8e778217fdd560483c11b0397f91f67a88d54027223fd06af7d5",9.917710196779964],[19873,"9e99fb0c3a4e028b6e9100438775f18a4ff03558d8a58282d43c06290cf50500",9.317957166392093],[10481,"79e645ba73d05b138c72f6799b71493c0e329773614b6fe9a3f28da0c5a443bb",9.917710196779964],[1466,"4b55e1c5d9e442265ebfb800845a04ba82ea5d214f8b545b47b783e4cb9061f6",9.917710196779964],[13235,"763287fe5ead7779cc06f4b76cc36bd95c358da98bfd72d7772ed384cc902fa6",19.796387520525453],[14253,"235be4a7d7fe1f3104c9187d15c3da23fcc93e127b2a8ca0008cb4c83a26e38e",9.428571428571429],[5285,"4dea11ebba2a315061ad6e5d2e1762673b016f99662a7f798f392e69637f7ddd",9.917710196779964],[16211,"4221acbde7cbb07fed7f52a6fcb09f459236514dc0ce869b6efe664a69ab9c63",27.850267379679146],[8507,"8fd75292554c311c46bc0077965d8a0866c9b380c156722165c40c86c13afdc7",30.71174377224199],[15230,"4fed5b52cf4a5809e9359838bbac9cf6534b5278796486d0dfe708bcf169d679",9.317957166392093],[14787,"5ee27a19e0b86ae0f258db72663774455fdeead922e9e36542cc4f2079852a83",9.317957166392093],[6726,"8eae36fe239db2d24b2f9db258d555eec2be5da55b2031db326dae25d48cc9d3",9.917710196779964],[14946,"dd5856de47406d7922e6c7a05ad09f677fd28b3d93643a014f8b131b7a3fe87f",9.317957166392093],[19093,"890025de81e0fcdffa6382164e8bcbf16b5b53f1b9360bae91de639b4c53f41c",137.34553775743706],[4087,"47e397fca519b5c2949f682d0dbe6b6a5fd3e143a46175bf87dd120a5afc27e5",9.917710196779964],[7146,"6129fdd27d0ee2b76cedc050423e60f83468ec8b1243d271358f5cfb8e9209d1",9.317957166392093],[6399,"4a4518fdd5f89c04ac87ba571e539d50b017c3438a1b197c6351dd09213a5bd6",9.917710196779964],[8684,"df4c14dbbe08656531ad2d0dc6067c04a67ee42926b80a8e59e6d3f3abe1c7c6",9.317957166392093],[5010,"6aea62ceb2d061216170ddc8a3fa938e9e6fe8cd524ab102f89a4f2adb331bdf",10.052724077328646],[12031,"4b99e9f0f4d2abecb4913453f12fac23854f7ad338ff45bef3e5b4730a2f17b1",9.317957166392093],[7539,"cb528d1e6e2534a2da7d302ce51e2bd7d70847dae71a62b77140e1fbba2a91ce",9.917710196779964],[1543,"b01ec4096d2dcf6c45db803a30b6127cc7f61677195291aaef85a12fa934e2f5",9.317957166392093],[11928,"028b7eac287e297222576511548a1faa2b2d0e4d8e15d3d141520b846053d5b1",9.917710196779964],[11188,"9d3a8e962cbacb57a93b0fed56a3cc9dc5d3c9073d4793a8b34296adcee0beb6",9.917710196779964],[18386,"523dedef7de144a50d3b57a4e3cc22c9a0ffb254c50a90ebfd09314111a7c233",9.317957166392093],[15033,"02751cf5bbc6982969c814d1579b32e889f452a337c155fbda05fb913debc87d",17.760351529491295],[12260,"769e5ee86a4c206f7a98888367fedfe8686c2e8b4858e5f26a2f22db0040a2af",9.917710196779964],[12141,"56c48a80c04619f20d68db207d6976cfc8123e493a41e89bcbe50453e87365b0",9.917710196779964],[6636,"a6e45f6f0873717642faa8f90aecd0d812b1ae81f4533a40be0691914d226fd4",9.917710196779964],[12636,"5b7b46a803d44449f4562bf7c2f939a4c35c980494d833ad6123b63ab4b10aad",9.917710196779964],[82,"251e6a25eefb85f9f094f796a9676751e61aebf6b43c443488f97f6daab077ff",19.115384615384617],[6057,"a5fe225a4bf71335d4cf3c57076b01fbf54426db88f3c9bd4148155abdbdbad8",9.917710196779964],[3288,"915698b3141a308c47d4a7eb187ced0e3100d6f85ee2430594c6262066667bea",9.917710196779964],[10311,"ea6694619fd4757628da77f3a714d2728ac185feb390e612f4e15796827e43bc",9.317957166392093],[1022,"7d727503b430e452b4b8879a0c1743c702eea69c33b79eae8ac8b81b63551af9",9.917710196779964],[5648,"eee0b2eb5dcb2c44a78bced438ca5fcf75bf49468502b90ecd341ef17a8957db",9.917710196779964],[17397,"8e2ca90c691d4856c2dcd802b4e49e6da93c25cfb3e60605b2c484a02e1ad149",9.647446457990116],[3703,"c0b9a49ddd460968a75265601b0080b204c09860e688d204b0991cf396cf94e7",9.317957166392093],[1857,"382ad7adb1e2c01193adffb4c22845998795ed3cb42f3564ebe0620f4f8be5f3",9.917710196779964],[2842,"b171b2deaa7ea4911b9b6db084dfe63cc350a77893e77b3d4a1a2bb9a33a64ed",9.917710196779964],[2445,"472d31f8f53a076d2b6cd0569eb2f0b6aa14e58f3f2975f026e51686efdc35f0",9.917710196779964],[13448,"13b6f10ab4402f345b24c6d6e8884fc5c75a8c9f5f9da480c7c6db1fe76715a1",22.066869300911854],[6069,"6e7e58d540b391c036403548f4eb49e7ab162d7962f45d00f483972dc5179ed8",9.917710196779964],[19552,"5d00c57924a531de05fe1c475e2df20276cce074f751f7ec5728f27e03f97d0c",9.647446457990116],[6966,"744710738abd48bb95ddeca536428f94b7b152f5517ddbc1ab4eecc873362fd2",9.917710196779964],[15109,"367ee94ceccd8f22c31bd496319d98f5513d19b60efe56fa002f6c631917637c",9.317957166392093],[2023,"8fec6a7d36c879eeb861c3d39ba582690a1bfe509a8bef94074b14f2faa4cef2",9.917710196779964],[12242,"4e5fad6a329ea97973483b9bef4c0b8ed75030c81ca6f8f72979ef64871bbbaf",9.917710196779964],[5089,"b8150a7a90d210491ed6db171c66e528813e67ae9c6e6461ddc0b813a72ea4de",9.917710196779964],[14297,"8b27cc92013ccdce92af4a4a3f605e2401b61ef19abc139fd02a34c8f4d4b88d",9.317957166392093],[5964,"d0dba0c3116b67c226bb6f417f3984de08f6b60949eabceb6b0b369ddb1c53d9",9.317957166392093],[6713,"d4ea05c679e4d259db1b55ab64c8133a6ddfed8dc00c2e8dbb2418cbb421d9d3",9.917710196779964],[19823,"b3da5d2f12667e5d169a9fed67670241966597b55609ac71b0fa789250f2c601",9.317957166392093],[17961,"cd954f539cf4b33851e3bc6d57146f69476c4f802b5a849ea1657d3093d1ed3d",9.317957166392093],[16270,"542492f847d4ba4861999111892639fa110b8b57e5793ee78e70f7d756e5c661",9.317957166392093],[15121,"494eaab5966b8adc4cb5bc1bd1c544dc751a780c37b2922b74394e27afe5457c",9.317957166392093],[10191,"b8306f684de30bd77c777cca27ba6d51ced82f23c565488543f267dd94920fbd",9.917710196779964],[19284,"9712d40714517b473798d8795e51231af991d3ed567152880a9c9f47565a4615",9.317957166392093],[8057,"fb93574ca01137bda4df06442276651035b0ffa0f157d00ffb47ad44efa916cb",10.052724077328646],[12587,"c218c5a7a4d74be88915fa636ed984063d863657a622e59d09152fab5dbb56ad",9.647446457990116],[19215,"e2d4025169f815c78de44b255de1dcc450635a54e42a7360339c42e9733c2018",10.052724077328646],[534,"bf74533419c876537c8770a3b53670e48afe2420306fe23a1270c2a651666dfc",9.917710196779964],[6464,"0db023da991de761d8ef6db9026b637386de30a3a5195e4825fbbce998f9b6d5",9.917710196779964],[1937,"95f0394df1d2fb4ba5f9155bb6669e27f6ead5c4bcc0233115596393b19870f3",9.917710196779964],[17130,"cbb0da41f1198d5eaccd905faea19aa80913b2de22a2d4c3d1f26ea280f8684f",208.15196743554952],[10791,"62d1c710fdaa655dea4658671c2ea74536bf03ee202328cb4a5f274a2cba58b9",9.917710196779964],[15724,"d8455a58b3d44acd0410342d2ff45fbb512d36eb8db03c045905c0e27248fb6e",9.317957166392093],[2979,"7e4fb32819c19a752e6269a29c199f77a67f7d541692adac90786c6996bc67ec",9.917710196779964],[13693,"efd96f50c9de303a32acbdc91e3eb33e056bc1153dcdcaab675ce8163da5579b",9.317957166392093],[5593,"643c3fae97196d440a5dcb8dea704bc5ea70324ae6c171061d42d7540f89abdb",10.052724077328646],[8098,"ec6e8cc818222248476e34b27fb994c03129ce8f245018a4f8db9a900c91c6ca",9.917710196779964],[13495,"d0961959584f8d00400255d5cf3e9a8c71e596bb546d6adc05547493b138e89f",9.317957166392093],[10364,"e08c92b920df9809f3267479f66ca68744edcdca2c91b77c0da434518dbef9bb",9.917710196779964],[2054,"01b014e276bc80ac23435aa945379f8bb45a3eaaff3121c84b039039be6896f2",9.917710196779964],[16728,"04e617a9e0334917b643eb084b07955616b878438994eb0ea4cd0a9ab2a0e457",9.317957166392093],[18220,"d1570b060f3f27551d8cd700ec3785c96a9697c6be86a2dbce4cd80cb25aa437",9.317957166392093],[3229,"ae4620cea1c472940b7daee502a1f57e26f1f68468bb373c1abc40c382a7dbea",9.317957166392093],[14323,"634b0884abdeace92409719ef7a4efb67f0af04e80090688c41d17deaf0af58c",19.20142602495544],[19674,"7b5d6e450b631ce4e7e7efb4c49cfa941f4c4d0a5b16a403c280d4c6f5de7507",9.317957166392093],[4446,"909f9dfe31bd27ce2845f49bc7ab37b7e18379f8d469365365e863231816c4e2",9.917710196779964],[12382,"dbcebd1e87b82387b55d2158816122912c1d8cf3795bb5c3bc0b8c711a36c1ae",9.317957166392093],[15748,"b79709d6434ae816065b743a85602c2d4db3aa800c3c5dae16fd294f8de6756e",9.846153846153847],[6744,"3dbd468449f28dbd9556959edb681fe66931ac1ecdddc74529aafd5f501da2d3",9.917710196779964],[616,"0e7e59ab98a9f33a2be68f3659c649bd2e94cb86c9a28c7ea9f754671811d1fb",9.917710196779964],[9069,"a37bc6b0fdce84e91dd1f7979f1c6e4064bb13d084825afe6ed578ffd1af57c4",9.917710196779964],[2693,"81534adc9219f735084a7248551d0e15fc6d50ec19813edefae59d2a017684ee",9.917710196779964],[8926,"6ff066629b8908893ca663bad3f5146416870289c57bbb29938759c3f23754c5",9.917710196779964],[17342,"6460807632bfdd2aa272add4628e54e14c03534a50be64cff385453e3528094b",25],[11146,"f184a64eb8f2887c511781e0293bbe1044080113cb289141761bf2f91189fdb6",9.917710196779964],[2161,"a6a55968a035f28268d6e2643f36164325454f4025a87ff9e65c096402bbd7f1",9.917710196779964],[11329,"fb8060d0da9b629aa5d90dac27cd2ac1b54762439c393ad4f67fd76dc8aaccb5",9.917710196779964],[5994,"073e13e9dcee3c1f897bea7979675517f20d9bca1c6b6c773da6228ea3081ed9",9.317957166392093],[4166,"a36a633b2d54be2f588a70bec56505811b6b4f75e959ac80417fd7c1410ba7e4",9.917710196779964],[18840,"df60e8888a24b0f90b8092ce90b01c3ae6c1329d30027135304f3cf9fdf96b25",19],[3919,"4e8dbcd751980b30636a3eb68f596e81fbd254a290ab6fbcbda1ad65f3013ae6",9.917710196779964],[13558,"af90698f0ae5fa591e8bc35bd1e0f50a6a20f557064d0446187148ce0d20919e",9.317957166392093],[14335,"c21b147413676433d299d145479983c37d6ee8b18b726df85697d1e192fb958c",46.24424778761062],[14917,"263292cb365c7082507efd40026e0c913b56c5074ff462e243c1e16e5f839480",9.549738219895287],[1864,"c12d8200f24dffc6ebf3ac13c4b6379375dab5265eb4816e6ebe5a0e8318d7f3",9.647446457990116],[14634,"0578821c0b4609f53f613091a9b077a03574d1b5de7d227a958a316bdd6e4f86",9.317957166392093],[6112,"7eafc2708804d30c196e50b55c2e8f0e5a5e5c9aef734aa430b9c4de43fc5bd8",9.472566371681417],[4921,"901990c33fddcc067f86105b5c8ac06956a997ed903755b8a43359d29db2b9df",9.917710196779964],[12822,"391b2bda14a0a5f68cf83ac63539f09e18b5bbc4c4699ad276fe1a954e36d2ab",9.917710196779964],[3933,"0fb32e6c93c38589d71501eb0f0372c45ed0689377d6cef7fae80c2d438728e6",15.003322259136212],[3523,"d6e8ea9f0f6534478c873be4d1ceca51d0bae91caa0d1d4b9c440b1b37b8cfe8",9.917710196779964],[19380,"5060bfb2393e9835a25d2bfb3a6ebbc192bb79041c3fa17eea00720864a79612",16.161458333333332],[15205,"e784b1c29f0ba3db1b6262d73fbd28128289cf05a610debe4f885fb056e8697a",9.317957166392093],[5040,"d5bd3025dab159ee9486053db0d7d2bed99fca12bd5db810ecacdfd0aa60f2de",9.917710196779964],[8916,"1e14ad250b1725e77f2874ed231275e18f036dd309041fca50d54b61be855dc5",9.317957166392093],[1530,"1e5528c6e206fbd0a5f735fbf873c7b6c00f9c394962e1f04ed6c3521cc5eff5",9.917710196779964],[2867,"6741bf8ceafb38cad55b2d08f4e900394992d0c3604f73f6594afdf3ed7e4ced",9.917710196779964],[17833,"061d0c2f04609478376d9b255e4b57c03072e12b86caaac96b210a4ed4579840",31.05169340463458],[16204,"24082a094f0d4de539b502dd8dc32acb2806467056b668083e382dbb15d2d663",9.317957166392093],[9205,"ba1bcf3e2f1aa0179fc776877b929fef48202a5c6d549133959df48c8e6266c3",9.917710196779964],[12162,"fc279e035511140639b5b65cb3b318b3054cd06b9b1784423f9a5d5d7b4e48b0",9.917710196779964],[4554,"b798882c356f9a6cd7bb3df7bf4e9097adf875a442de53d33a5b31fa09bff0e1",9.917710196779964],[571,"e405585d5e40779d6b35edd4e15f32cd76c581e3eed02176b6f38103443120fc",9.917710196779964],[18029,"dd8b86370ebf5a7c76ad0cec66ad1dd79aacdab08880a23744b91ca39876ba3c",9.317957166392093],[13353,"e98bc417164943f1217bb1b487458af151c25d94028e91e22148740c34816ca3",15.858407079646017],[18307,"ea286caaa5b666a346db82c93fd9ab1a32de5858f34bda5589586f4446aeba35",9.647446457990116],[3960,"a3b0feaf504481103a5ab00cbf93681b9ad32c6abdff1566b18de59819ddf6e5",28.100840336134453],[11938,"7996a2b2f0e972b2a9673644c31144e64e90bfe3bbfc942a0d502e8bfc10bdb1",9.917710196779964],[18136,"86eb8010fb41793023dfcede1bd61dffee91692e5155c7cdd6a07f46753e013a",10.052724077328646],[8835,"104c4327f7c57428f48435748d92a4b0f35fb0d7d915e0cd2e1ee68a4d16e4c5",9.917710196779964],[18924,"2587d91aa79286521f46e6d367d8cfd3ddc0cb1fff5b03bfdb06d3c69f38b022",9.317957166392093],[14997,"73336234dbf6b2e95f9bde8c7fdffad2441350821ef21a56eff773011bbc927e",9.317957166392093],[1330,"053511aff2d6f1a895b76cb204f884122d040c323d91c5f1a28ea7152bb93bf7",9.917710196779964],[12505,"4505a9307ff06c569bc2362ed34b2ee6641cea75e3ad551a735ed14e9975edad",9.917710196779964],[15737,"5452b0988a1b3a91cb6fbbbe693fdd4080e911daa5be5e6901bd79e4efafad6e",9.647446457990116],[15843,"77db77634d51085a8caae3dd1ed3c1aaf9ac0377d7e3107ded15027217306f6c",25.94061374083737],[3565,"caf19a65b6c3df41f790d5fa087667d1e901afd150cc4f81a356b1e161237de8",9.917710196779964],[11412,"38ed9e63a4030f85692800c4c5abbfce89879467a78d427409aa4567d61149b5",9.917710196779964],[4510,"a66f6a62da8de01b027a00e41e1027b90596bb5fdcc375e6be2062be7c8549e2",9.917710196779964],[17344,"18c1034460f3430f5e7011ffaf0ea0e24bc8ea67a93b7378b57f90110977f94a",9.317957166392093],[323,"0551a4eb5614abee4bd69263de7a968adf7f4e50eac12a28de052647729edcfd",9.917710196779964],[15290,"bbb5131e3f9d639263db1aadd8b209b57d17aefeb6e50c34d6f37f9795579e78",9.317957166392093],[17326,"b1ff9b34b20218eae3bb6e9e944a77aa8e3d9e9c369d5ca9b6cbecc880fe544b",30.851063829787233],[19593,"9dd7fb54dd5084e1df36371745dec630e9c7fc70c16ba6b404bc3c8c04b1690a",9.317957166392093],[16825,"ecd420599de9d2c9a2f9afbd8b4a37d0f5845c7aa4d13eaa882a05db3b45c355",9.317957166392093],[14890,"096a40099fd37b0af55e939efb4e24029702009966b6fb16589c892128f90181",25],[17605,"f541d890bc48553487137336cc106209d1c666a06d1af0482927b8e03339fc44",9.317957166392093],[11637,"c51b776636126b6063ff3d44112b26a7f9eb999588d8d330ac4e754404f5abb3",9.917710196779964],[8708,"009e7b664467de3283527c5783b4fe873a28bef5246a21400d0196f3ec94a2c6",20.07662835249042],[2681,"5e4ad37132fc75a1603156a1dde2b7d9f7f5d36bd2c5bd05ea5227f6da569fee",9.917710196779964],[13119,"9cd8c53ac8f71326d0794bfe0cb2d5b8d073ae37f3d3095783d583b1ced89fa8",9.317957166392093],[2601,"f6d9b5b98ff70831ca3385a85cad5815d5aed9a9b93229513fa67054085123ef",19.192825112107624],[19186,"20c106ad9f27b17bd39cac690d292d1930f0346946681177f7b414aae9582b19",35.35828877005348],[14042,"a50b0c554bf3443943bcfbe0d31c23ba309dcb0ef1bb8c2f20fa4a2de65fd393",9.317957166392093],[8293,"4816a24128992fa21a05f2bf80aaf64c8c9c8ace68ca8b4e221bd2b095805ec9",9.917710196779964],[5988,"f86ca5ad18e9ea60bb5809e65b80b1d46215f098abb2b36f643c203f654529d9",9.317957166392093],[15763,"2f8fbb36b0e26ce29af59538fca3e10eda278ca9dc46c03b8c025220f52f216e",9.317957166392093],[8947,"6b34d269150d561d2888d0bb9f15ee6929dbf4e8ff12ff60ebf7bc33addb21c5",9.317957166392093],[8601,"f835bcc9906e5f237cd8b44ba74c66c7c1a97a3e2b0b374caa3727a174ac6dc7",9.917710196779964],[2625,"7ee1dad4920123d28d9f1e73b7ad7af9d080c2b8aa02fc67ac1d6810cf6908ef",9.917710196779964],[18245,"0cf7aa07ecff0eedcd19ec4b74384981e6edbf81f3d560cf8c9e63ed3ff51937",9.317957166392093],[10973,"c5ddc7a0c3fe2fa4b153ccf62e4f6d4ab0c2bd5ba0fc59d8b77eb40c372d33b8",9.917710196779964],[14873,"5513d25a9d985ea4470fd2f5dd9b19907ed89c59345721cd6e4fca6b54e55681",9.317957166392093],[16232,"955594dc2b847001f4847284df35961db73deac5eeec84865e5742510bddf962",9.317957166392093],[19073,"803ee4626c861954eb0e3b499dc6818fefb2d2d3b5bf7849b1127f4e083bc51d",9.317957166392093],[1420,"78c7b90c2f723005c5c4049b34c78990fd8669a297603faf433cef275066b5f6",9.917710196779964],[18863,"c36c46b5948a3ee38cc73fe0d6cbb53c7b3412bd51c194fd9c6f307c3f139e24",28.097560975609756],[7180,"d2df3868b7a1f1f701163fb2ff93438498296aa2f9e60e15dddc8f1f60bed3d0",9.917710196779964],[9501,"68f067b3c27a2b741c8a71178457218e36a0362336a196b201f0c9b77111b0c1",9.917710196779964],[19529,"5464dfc06fa21de103ddb6aef7680fca7ba28267e5364653fb1955e2df737f0d",9.647446457990116],[13668,"d32b9f8b706bd279103a6b82980064bab70fa1cd00e978925dc6697d1e57f19b",9.317957166392093],[6729,"2167c42821cac5024f07f6992518a14c205734bd7890b5967106814c65bcbfd3",9.917710196779964],[2804,"2557530ce53120cd9db1f128187c3896039ef6632db36e3312aa7f5e402faced",9.317957166392093],[15640,"9eb153cc2043a81dfe954d6bdf08171a1fbae0c9b02df32bde5b096f938c8770",9.317957166392093],[5691,"3b439881ac1bee6002f16d35deec3dffbc9adfd93a1367067bae682f5f3f19db",9.635658914728682],[6705,"58d602645fa6bb617cebd8a2b1bc9640fde2fee014bf811fa9dfbd612d55ecd3",9.917710196779964],[11027,"3064958cb6d49b1253f6818c361bb5c4476031ff4a283deb8a537ff1892cdab7",9.917710196779964],[11999,"30e3925d9ae793fb2fb2174c2d4ba4f1e4196359c270b336791b6bfdb73353b1",9.317957166392093],[9031,"ade9c7e03406b970878ea8b777f524e727da2e194b9820192ae920d11bf096c4",9.917710196779964],[19546,"59c33965325cc0dff574aeabec347fe893b553ba6945a0b8da650f6d69a6d40c",9.317957166392093],[17719,"e1e2d9f4e129dcbf1d7fca01e9010d85f68e169ceabd1e612cc7117ae660cf42",27.014099216710182],[14452,"0bd742ae537c30860d091968c573d9bf9598133c41b1f2c37bf9ae3b0fea308a",10.052724077328646],[10752,"1bd0d939eab3e936a173a752fbb64ef344379dc494c999a89b6a7f2cf7fea7b9",9.917710196779964],[18502,"9fbbfe737ab1048bd477a07aeb3defc34a7ff6101d299d21d3b6e4285dea6031",9.424083769633508],[13277,"d9cb747a3004c311f68eb373c02fbe2c28909e689fa0acb080b1c98b78611fa5",9.317957166392093],[18849,"44e5b710adf71710a3e8aaccaef1e7cae2814ca22ad25bfaed5325dd649d1925",27.706806282722514],[16883,"c4397af88ceb3670cd500aabcf91a35fa1e5177ba5ae9a3ad6845d78e4a58b54",9.317957166392093],[932,"e372136debc33756b48ce926e703adfb76d1240a6bc1cc90379fad19e76f9ff9",9.917710196779964],[14511,"27cc0ff29bb0f1d7ad42bf2c7b42dc2ceb7937d268e1f69b9b485a0ff16feb88",9.317957166392093],[17775,"d5aae7b0501a9fe99a9286cd2040f421ab7bad2e4dbf45cd040c3a34ae24d341",9.317957166392093],[15867,"ec1dd6bdcd70166f5e586ce92dcf5170b16b0d5376972a0a545001f0de95bd6b",9.317957166392093],[2554,"85bdd226c4a8941c9f6112ca3269ab02246ebd52d01b5764533fc96427aa83ef",9.917710196779964],[16055,"19637460fecaf369c004c32998e3e85b3e52a92830172376e00038485caa4767",9.317957166392093],[19796,"412859f19076d7072915f2897875104ff8783ae68372b5e24bbf958a82b6a702",10],[9730,"fcf65eb32c3928149067f7e690bc2608c68fc98e8a9b8ef0047b702760dd1ac0",9.917710196779964],[17756,"05434e3ce5657e50933af088f01b3a9a5646441322a794971e5a2036a5821d42",10.052724077328646],[731,"d98834e8afc02c16aae3f9fe758c0334163621e54e2c01fc545aeb33d96c03fb",9.917710196779964],[13914,"3ee19840af8c3fbd4391e585b2706690a284c549fff60c719b413b3e578eb496",9.317957166392093],[12370,"08e4ef103c64110183b4094e5afd8ccbdef1f30ee953631d247313a50f48d0ae",9.917710196779964],[5041,"538374aaf40fa7c75b06df84170e966ec2d35f5c0e7720d7f48ce1099452f0de",9.917710196779964],[11317,"76a32959924fc2401a7e80342f24f767efc11f062df02b989a8de303afc7e0b5",9.317957166392093],[2005,"6820a036d486590afcd9ee52623ec50b7a8ff15184519a90c2301331b14800f3",9.317957166392093],[12140,"9913fa3581feb781e84a4e249da026c0830ed7fc3fee99b7a93ce501270467b0",14.188034188034187],[15318,"b4eb9fb717ab7e7d14d15aa8310269a5f1a95a5d736ee9a7531e97c607b5f377",9.317957166392093],[1047,"966c11b770944e7c6e7eb89930f39749551e65e1a6224b6b858b439e94f2f5f8",9.317957166392093],[12289,"7cb79a4993b2575c4580fbb13d1f1c2a64b463ada82ce0d149427db0079a55af",9.917710196779964],[10155,"5702a3cac6f43d2bbd413c019bb38c7eacbab1bd905b7a24cbfdae0d120f5ebd",9.917710196779964],[17856,"a627c8e3a5f6aa2e2332882567899d3fe504dfa41488bd308fd1f586333c1940",9.317957166392093],[9214,"91208450b9a1c7e73d34642ca5bebc7ad6ac9cc83db49298f6a51467869561c3",9.317957166392093],[13469,"c9befa48d8e2193617f1c50175ab629772008625fe7ad349f7bf20f3fe0aaaa0",18.20689655172414],[17934,"95ddf8ea3840bb01c0be1b3ec8b81c86359c0f8dafc505889e99fba9c01b923e",9.317957166392093],[6061,"2341f7e7b55462fb1372e29de52979ff68cbd240d0ca546cf56e60f2f277afd8",21.217568947906027],[3904,"f78ba28f5785cc455d93552eeb2321badcf3ea16264260e43fbbfea3844959e6",9.917710196779964],[7460,"4a1ae4ef483f6ec309b86999035d950de7f4fb6293c9efff5048cf53f83f03cf",9.917710196779964],[5283,"c8426029760594c872677fca29aeb01f4338dda9f4571274b2da301c6a7681dd",9.917710196779964],[4155,"433e54ab05dc2ebec982a60cd8288a92999be9796ee575e1bf4e242f7ce5b0e4",9.917710196779964],[7275,"4e77766e1fa8f62a94e6f1596c12f473f52e2250682c99b6385538a666472ed0",9.917710196779964],[9536,"91b29c4c7c64fe65bbe539a185195963451f60195c9e4bb1fe11ebed3e0376c1",9.917710196779964],[9485,"ec52c1419105b4201cbe59a9a8eb94d8f018ca073b7fe872fe57ce57d274c7c1",9.917710196779964],[96,"17af2c439ddad436d86a023b078eda6b46f1f662deeb7fb98d63b432300865ff",9.317957166392093],[17018,"4ae937bc30c148571870ec9cb63de668e41ce4ef9c9317d116a21e0943759e51",21.842931937172775],[6776,"7022c9337376c8d31f96624d930537fe16ad294011b743ab60800cc8556171d3",9.917710196779964],[8743,"c8d69107183410ce9ebe1f32c7d8a24a8020b83fed18d3f21a7216afa16070c6",10.052724077328646],[5840,"13baeb9a67353746b3e7b8d705d4eb25a9397c1be9d2e4e44f79ef4f23a70fda",9.917710196779964],[11987,"37d21ba35c375dbe411dfcfa5d0bfda107e10eba336fabacde9d8d09dda464b1",9.917710196779964],[16499,"efdeedefd4b01f3b108859d27cde03fb3d5a20c7c9aa7dae841768ee7e33485d",9.317957166392093],[16864,"b2b8ab159193e025a70c06ecc94d6efe828fceb350fbeed0c877c236e052fa54",20.106951871657753],[19279,"4a3f53a30b4e2297a619e8106ed9ffb9f4317ec15778d8ab04549c691b94a015",9.738819320214668],[17890,"e55a6096effe46d6767d4bf55714e885835c5b4a32eb2bcdf66f437a3df0733f",9.317957166392093],[475,"908839ef43840636db70e718c519621f1d7ec7cdf9d8f7ad42740f09cdaed3fc",9.917710196779964],[7551,"1753bae957bc6ee96d6f59b561b890291adbdd79fb82ed52885d28ead8dd81ce",9.917710196779964],[7276,"371441ec496032fb656027b79df051af31989084663a981a91a54e70f02f2dd0",9.917710196779964],[530,"a6cfbcfcdb02d94b871490c51678437caf41114b115e873b5c66f1a44fe77bfc",9.917710196779964],[8850,"db508c64ba47dee69e705bc7bbf9f72317a2b9b66e557d367252008829e5c5c5",9.317957166392093],[4755,"2efcacfe67c5bf88c2576169e12b9f80f273a37dc9db651a70ac60028b639be0",9.317957166392093],[17985,"a11cbd646a24357cb6a24f66f6e71f67496ec89649d5a266e81c149ff2e7773d",10.014641288433381],[7016,"5ea02ebf3b2a199cb79279413dc49a1203bea513cb6833da3b1000504d1ce5d1",9.917710196779964],[8704,"b238ffe412ef480fb665e358830c4e0601d62d0ae6d3795cd57d1853e66cadc6",9.917710196779964],[19348,"aef4632e0d56e7dd4ef827182f927433db63bacaf8ca05ef4bad4a4c2dd79b13",30.167420814479637],[11209,"d869a64522141e1e35a0a7d27d9b006e52430b67968a0a86a55fabcd3098a1b6",22.0297699594046],[14008,"97363a26aa63da51a51e78e20cca30a0a21540dd19a25c5389d253a07a0d9694",9.317957166392093],[14930,"4cc5aab08e230c076303936757029e5a12bb3194fe03a8cea412a8f1f3934780",9.317957166392093],[3971,"44e98aa983289189017de34542b21fd72cf94ab5426ffa4a2594aecb4f81e8e5",9.917710196779964],[11750,"922eb2f51fbfc270803ef65cf8fb2e0eee42f39eb0a6f3f5a86279de7a6900b3",9.917710196779964],[14611,"b39e05090e4d38de11da181356f35a36b182081c6af5809b6287cb15f882e686",9.317957166392093],[19532,"08a2fd0fe895ba56c4995654d0c4ae8d329e09fcb16775022ae07b781d6d600d",9.647446457990116],[9535,"26f862539772dcd27f193ba45223f0aec4a8c8983aa7bc9ad625bd3e282f78c1",9.917710196779964],[6617,"2aebfeb125e3d821c4e3753f129f582d76c5ad46cd715fa6ad248c0f1a3e84d4",9.917710196779964],[6412,"ec753975d31ca8be67789ddb5c85b42fcd8b5bbd0961f2d873a1678eefb542d6",9.917710196779964],[17645,"0d3cc782988de21d8ceea3f953297cc54ce5cd1e23275ee25392124c660d5544",9.317957166392093],[7933,"4da9b859bc58b5de733504dcba5e2c695431b36bea8859a2bc6785665daffdcb",9.917710196779964],[18710,"90b657e6c246923cdef3beb2cc896e295ef7bda292fd8df2d2a43b4c5484dd29",9.500303951367782],[826,"0121f21bd4aaea4fcf18a1a2badd57fe333a0c982693f7760592820c87f15bfa",9.917710196779964],[1638,"b9caa7f8785b3daf4bd9e5fa782aebc57a626c7d5a9934e17b63e8b34b375ff5",9.917710196779964],[6957,"227731ae7a06ce106c6a39f9830b8f0f7aa4f42c52fa8ad9ecfe1d6f355639d2",9.917710196779964],[5487,"90616085900370cb69227c2ef4221fa314c48605e3d4b0c5180bf1b645344cdc",9.917710196779964],[18106,"66a36b235db773f46f630bd9713afb7fc420024286ff7d0cebe9a8deac5ac33a",28.899115044247786],[16483,"5b3074920f8e991fb3ed82d0904ef3899e40db16ced9228a5081e29c0712935d",15],[8775,"a80b478e220d1f10176be742a6ec6cb136485d5c3ad3fc528436d1e781c135c6",9.917710196779964],[17475,"253f9754d25ff27c9f2285883d10eda1aae2b427586e19d21b9ecf9a9ab22a48",24.396815967684446],[8918,"ff5aa71e1bc173875352bfb7afe929314b23c9d2cda37f67818b0059c8be5bc5",9.917710196779964],[9988,"00c1b1919abd40e89e0c5018cabd765b8300911ca5d2ebb06d08c1b5658a62be",9.917710196779964],[13990,"5291f12fa80ac003667ac56288343e971a9dff66c936779dc615d9da1cb22d95",23.62224554039874],[2491,"f872fe69be4cc4eae7d95cae37aad80e77591cab843c1c965370df49960ee9ef",9.917710196779964],[12166,"dfa95f4736a0128f4c90307e53622877e0aaefcbb462bc164fab1563e66a41b0",9.917710196779964],[3376,"1f4f09c8b02f15ed47a6def4a12adf4793d6e2e14d9e7cdca0ccd78bdec2dce9",9.917710196779964],[6413,"3b7ac72a1c9ff315ba1547bc65cdc95140f35936820b93251ad250afc3a941d6",9.917710196779964],[12779,"4e0ec7d0e165a6ce9bec4b53cf5ef818c02a80f0196343b5d1a1015c98d10eac",9.917710196779964],[13220,"8fecb97b2114f9e16ee9debfdb54eb49cb3c4923882739080827130e628882a6",9.317957166392093],[7515,"d3c6b4362ca9004b5ff68f8072ca496206a0e89bdf92ec451a6b2427aa6eadce",9.917710196779964],[7726,"08263d1975a7d6d82ffba8ae42c34b4a098a231b5639b2c81d7d87fa000352cd",9.917710196779964],[790,"e731c02ae01d4634c043090ccc00721bf30dfe1f18540caadce98ec6b6c995fa",9.917710196779964],[10009,"b4e80ed7b925b3141c001be83877827da6eab1d701a1bb34d9c5b0a5ca2344be",9.317957166392093],[3981,"0e279b2bac2350fbcc8457cca7418803491d78ea7d78eaf84398eda8a1d5d9e5",9.754010695187166],[18942,"a9cb538493299137bfe317bf31882c0cb5845a914a7e8e1c1583fc64052d5622",9.705383824033705],[892,"f3a7daa530ede5eeff36490d0cd3d07134bb7882b1bd7310a46c0b18671ffaf9",9.917710196779964],[2807,"b577abc99ff2e93838307eb27d75054e8bd0414bbd27f2d28cd6ca6bca74a0ed",9.917710196779964],[19406,"e359a3bc274abeb52053ac68e5d37a21f4e3c96862f86d5a75f30e8203ec4211",11.027199737833852],[9593,"255b9903e4e5acb7c0458904464d5351adee0c0af68b0946f0f93bff13270bc1",9.917710196779964],[5429,"1c000f1f9b2f7dfe156b7fb7cca53382b5edc29f2ffeff138b1f046fdb209adc",9.917710196779964],[12714,"7ada6ba6349eb4b9be5a251136cd56cff2cacb38cf7699f229c5324e050d83ac",9.917710196779964],[16427,"491c761df1f3320740e9d268ba05d1dd505f24e237bb45d454e47402f15f975e",10.052724077328646],[437,"bd01ec247c14340a0fba14cdde13d20bd8bf507875313ab200200d6e6dd120fd",9.917710196779964],[12483,"ae947669fa21c83039518397d97ee261b092f68522ad706e50f61e0b7e7f09ae",9.317957166392093],[10180,"a1596450cf376152ca7e54449c51abab021d39dd26dd1024386f9e25a07229bd",9.917710196779964],[13114,"22499f5905dd2ab7d51294919b36eee15fe4d321ef884a160899c7898b99c2a8",9.317957166392093],[8136,"fd91d53dd06d4cefa8d985d45f925d897fbf35b83058692ab61164afdf8177ca",9.317957166392093],[517,"be30d4adf0dc6ead658b379e8b8cf044f6d6f9d9c7acde16f17143e24e0795fc",26.115555555555556],[18358,"6f8709f1d5f9dcd7ad52f5e4976677712cb35295855808f10c2de060d6029334",9.317957166392093],[12620,"e3b4b935c4bd8fb813c6bcfb2834a7666ce62885dfd67341517d4ec6994922ad",9.917710196779964],[663,"42ec5f89a1b16f2cd21336555fadc20924a9fdfee9fff2dd0f2b8a3b9c4e80fb",9.317957166392093],[13851,"5ad05cf9b30033601a21b8f1c6e5b1bc77792f0a3b200b6ea7b8d9c2ad306898",9.317957166392093],[2140,"7cd40c1994ff58156c07419fbc8ca154a9338580120fa5800f6c51516079fef1",9.917710196779964],[10235,"e772531281cfa3363e77b9093050fa1cf2833c72bb78c3d2c15f56bc157dc5bc",9.317957166392093],[7105,"67c1fef094e39dc8379f66ffb60fa3b177a8f9110473a29c5770c96c79c94bd1",9.917710196779964],[3736,"68883c815b613fbb0b9b9985808114b2f061785e9f4a306a50f354163a505ae7",9.917710196779964],[12440,"82c50382f701855bb5b4ce92a263e112911c857fa24ba1559cd1992d482054ae",9.917710196779964],[8421,"c3ffe9471c0007225fed55d4a79d88359f1c81f1d0ff35e48801d8e28b997bc8",9.917710196779964],[856,"52c5c11184da0abe528f8d80512c6d48366b0595cd25427e3d6c0b06388c2cfa",9.917710196779964],[15180,"07fd19b36c2da3cdb17cd3c24fcb7ef5291ecdb9d9eb6592c4935fca5184fb7a",9.317957166392093],[17134,"c62cc6d01935fd07f6f76d02a092f6798b8ed9a63fa5cf0168f37ffb01f15b4f",10],[18065,"4f676cec5cc45c77747a75a750613b75ccd22b63550f207a02cca184b9a2e83b",9.317957166392093],[12371,"c2b0c7bf347197a49ee41c5adccc6b1cc3f278eccd84f8313887c025e25bcfae",9.917710196779964],[3090,"cea6e49c0680565d7cea0669b6969ad2382c8c1d1cbd09fb239cd7ef990db5eb",9.917710196779964],[6474,"ad62669350ae9bf9bd755702e7f760416bc14ea32a6c5cd55bbf7578dfdfa1d5",9.917710196779964],[1554,"46a65a6be3d40ce6c22aae42e4bc1e41bffaf59da165b1e9ff7c87bd8d41cef5",9.317957166392093],[11424,"72d5878f49e26bb4801fd567a21f24bc1fb85eadf53ab2ff1ccd9d368cee2bb5",9.917710196779964],[8534,"3b0ff0416178d390f65d64329da3663e09b8acddb479b4efc05f04943f92cfc7",9.917710196779964],[1547,"1e0889c3bbf893a98559f771fbf0b2e7ee03d3088bb9c01204cf466df41ddaf5",9.317957166392093],[18549,"edca8113ac68094a22b942fc8eea1a85d2deba0447c501a40472d780c0257a30",9.317957166392093],[9168,"222b2514ed8e840a3f8841e5a8f161b90571d1098fd13f038f9495ad72cfb9c3",9.917710196779964],[16526,"6437fa9687885fd4780f4bd443af4bdc4b453a9ca59385b5a3500d67e9808d5c",9.317957166392093],[5414,"06db38ef1eaf603a356a17f291b020b2bc5b1b5dc391781848d9702c73e3badc",9.917710196779964],[16817,"a7f0b1d3698aff06a3e3e35f4534c4672bd3903e8fa3b398b0f78ddad78ce255",9.317957166392093],[8674,"7c3f73f414cbd556fdb22d8f5ca02a8022b33f12a89216eea8067ba3f68bd8c6",9.917710196779964],[13623,"e57a76adb0fc702fabcc597a1a7a1d56b667b559a51d2e0a96574e17a684df9c",9.317957166392093],[10467,"396c45d87190afc15c0899ea5b4c10e7acdfa21ed3d32b6bca35b82fa05054bb",9.917710196779964],[10117,"4839306dbe51d79d34fab0e74bde5de9c82d8007240ff46e1a8af82b706e96bd",9.917710196779964],[9030,"f1871e55054f60047a269b7a3fd35e2a150cd3f72af9e1d5123024cea9ef9bc4",9.917710196779964],[16049,"3b693884345aa6c691bde458deea74e835eddcd00e899d612494c91ff1ca7167",9.317957166392093],[16649,"27bd129f07278b2dd34a011c3f8c196fe8d8828d6f2ba59622c4c72b8e45cc59",9.317957166392093],[13543,"26c69ab8a807176b6fbfccdbe5c9879446e8da7eb7a78cfa12eb2018dec9df9e",37.047872340425535],[14901,"9fe9fb268fffed360594d587fddc8c5fbd72abf1aab66558cdce233f715cd980",9.317957166392093],[4795,"31bde144cae852a2d234883c58a8b7ef359118d488b05b6db12e60a1598e6ce0",27.85053380782918],[4180,"24b88df061be7d1f9d9b86048b112cf1901290f3435fd42d5efd8fef888690e4",18.130434782608695],[13097,"3be683a00debb142e64d8bd06524a6128a8954d8701fc55a1bc50ba89d3962a9",9.317957166392093],[11605,"80d9c9fd8f1d87053ebea2cd8c90cc6b52c961e3c02dd98483bbba00500de3b3",9.917710196779964],[11291,"41a8f57440cfa88fd3860cfc8ea41d2e2b7e183cf47433099913923f44ad17b6",9.917710196779964],[12018,"89ece2d2669d94322c8e75ca7c96bc2982d94cd4493a73852b92079956d037b1",9.317957166392093],[3029,"3ae36985731834d0e1e61d8bef234b6a3fa19f82838ad124979551a0f62e1cec",9.917710196779964],[14436,"6cb962eaeaf5ee66f9805de3ee1c5428c296fec3edfd966d6801c1de8bf0908a",9.317957166392093],[11917,"33bc4b96092c166542d2cb4e4cbc32c9db461efd335d7e1c114eeb80d61fe7b1",9.917710196779964],[17486,"686d0a35200744a60dcec34a52c124e1f56fb537451c59ff79d40ba9e101e247",9.317957166392093],[4285,"054924c98c09f5d3fce5fef7ab9810e347e328439dbcd632afc7d49af5d0dbe3",9.917710196779964],[4785,"9f2ab6ac92385c99dbf75c40e5ad5afeb16156ed9ac056af2b52760359cb80e0",9.317957166392093],[19507,"eb74b113c91ee036607d7023035be6e480ea6f9eb700059255c8771ddc35100e",18.031496062992126],[19222,"1f4d054e602978b45c558ea9a9bd58f219b3b2c3d828599b53bc5caf37d9e217",9.317957166392093],[409,"4bb03b7462408031242ed75ad4d72996d67d566463960c1bef79922079584bfd",9.917710196779964],[6926,"89efac600eafdac53d71b09884f25d0cecd867e5c11a07e102620adae5dc73d2",9.917710196779964],[7042,"92ed6a0e497daed07cbca5f86b0e179932ae324ac7a700f86c00fc23da8db3d1",9.917710196779964],[15242,"906eaa6b53d11f8ec845580f62763585f726c988f9d68a5c58b1547533129479",9.317957166392093],[2011,"5cded5cf7cfc3e2f5fcf4bdfcaad84f54f07bcd4ec6ff986d77cb99aa154f5f2",9.917710196779964],[8715,"192a640cd2bac8da871ec6a61cc156e150d22cf17acbcfa16053dba3fe2899c6",9.917710196779964],[6682,"bbb06033bf311b6a6843afd2195adeba6473acff878cdb2c30a2a4c21f1017d4",9.917710196779964],[12638,"552e749d3f89065215920b347c3db6066e4b6b7671736976f9989e5c6c4206ad",10.052724077328646],[8038,"fdaaf58361872e531a376584f4bec85f7c61beecd8ae3216f0cb5fb43e8c4fcb",9.917710196779964],[6401,"fc2640feeb9429c8ee3163abec5eac4d9f460651a1bbe7a4b18ef4413c7158d6",9.917710196779964],[9407,"b630e3a5bc3673e30d28fe4f52cbbee5de0571ed74e31a540a065d10c8fe3fc2",9.917710196779964],[4670,"cb22369f91498ee5120c7316ec24035bd049561de8334e21fdf1aa7f46512de1",9.917710196779964],[19315,"d8588bd5b45907a341a8f65216f50ffeb90fc2eb2ecc5abeb6638ecded817c14",9.317957166392093],[15945,"2762c13620663c3c776dff1be9ff805a0423875d3bde335f028b3dd6d48f0b6a",9.317957166392093],[3539,"9f81c7c72034d365bdae420129cf0b191d8bafde4a465de0d566b3f96bbdb2e8",9.917710196779964],[5824,"06956185c45eb4695098584445a1a1e30c75ea012456710cbb42ddebb60d36da",9.317957166392093],[19535,"56ac20225b2883c1b7a1faa013367da5c09b05e496e4180525f19c45f2c94d0d",9.317957166392093],[10408,"00c16ea4e50993a464c1d584f1d9701d8b0bf407f89e574a30a20938e8fdbbbb",9.917710196779964],[17241,"de26fc0ef3599e5909e45c9f15dcc435e491858a6654c258265ff1b41c09154d",9.317957166392093],[4671,"5e014c2f0acb00c25be5d2f0c8e554a422044615cf3d0804509b3b4bdf092ae1",9.917710196779964],[11589,"9f6b1901ee95c364fe4f03e7d2522641a0079b787bfb890f2a23f22a095ff6b3",9.317957166392093],[17430,"ef7592d5d7b78098d0255f53387e0d7cc2b598caa2f3151133c45e185ee32249",9.317957166392093],[16318,"88ca29495b0458671d42ce708aee6ae24efcebc6e3525eea195d57c51e1aa360",10],[1691,"85468e3c42e33f3d698861198d107bc621090a50c08161d0a7add5880f97fbf4",9.917710196779964],[19383,"c6b880fe6a6ed91eb430054a86750a8455178bb1e3056ee7ef50a8f3664e8a12",9.317957166392093],[3399,"844902d1b8a222370f33f6545224b10d06627b8f2f8930c66a6f0fd478e9aee9",9.317957166392093],[10498,"ce8399d1551c4d2cbc3076d2f33df3f4914e0ee9c14fa130fab6a447fdeb2dbb",9.917710196779964],[5057,"56689fa46122a351884342a98f4d4664db6a8714b7fc75190f9c44ab289dcbde",9.647446457990116],[1114,"d5d017228663072b93b519dc9cf57f63408f1176a796d3938b51e83a89297df8",9.917710196779964],[1006,"66a9e0fffc6d81e8aa69a5822aa3a87cc741552645c243a37592872019202cf9",9.917710196779964],[5495,"2ddf649f83b9cac9a8c5608f247ec66d8e9d9059288e1b37ae2fc8bcf50142dc",9.917710196779964],[9399,"9636c64fcc21a6e29a2cdc7bfc7fc603b1f406b5b83c5e82bed76e30b9c846c2",9.317957166392093],[399,"cc2511f3bfebfb029c5d8722338993a9f1140abc592ccc3a8126c4fd40495bfd",9.917710196779964],[12966,"2d909d657c99fc8b820faac53602f0d17fb63da782ab3b76440a5117dc54c8aa",9.917710196779964],[8593,"f0ad29a99e8a2e2e97ce09ed0b359f493c0e35a5a09690accee7338c35327bc7",9.317957166392093],[10285,"9fa8ac8bc9ac44ad4c093eaf9f717487f639ac957a0218b2c78740e7bbd17abc",9.917710196779964],[13391,"449fd13d34c21ed8e82b2298cd910aa0012e645a021a7fb07d6f09e8964187a2",9.317957166392093],[2915,"bfbd664cc8235dc576f07ac01b8d60bb95be7e42126d0ade33ac2d82cf80fbec",9.917710196779964],[10232,"0196fc7c995d733ab0f945d169db25518ab72f1067611069876ded11d82bc7bc",9.317957166392093],[6041,"3c934a46de59fb158468f232a42aaf5d58da1f0924e13712f050a8d3be41cfd8",9.917710196779964],[14894,"569025121865e262302ac8f748559324025e53591b5540aae94a0d997bf5f680",9.317957166392093],[104,"804128c73bbea362a7dd809d8eb7221f5d7a4984d7536f9c2e9e077391a859ff",9.917710196779964],[115,"15b8eec0dcf16cd3e9d528c2dc2545e6c1cd902ad8e984d0f01eb9ecfc1149ff",9.917710196779964],[15309,"aa95948b2c082639970e8410060b9ca9cea8e8c8424d0792c96ce92dd7503078",9.317957166392093],[2620,"928bac9e1b28322fe982faccb9e530ddf7f22babab05dc17f46e77ffc3220eef",9.917710196779964],[16532,"17f5aa06c8afa25d847523b339827de40df469f8b7b9fd418caf4da0900d6d5c",9.317957166392093],[13439,"8b6079a1524bf833be87d3186edc00aa1ecd3c1b84aadaeb5770b50b305178a1",27.07663197729423],[12937,"f6b40954c824e8d9ad3a50470010f9a424c2931e5b2228cd068bae087af400ab",9.917710196779964],[692,"902add10c46abfde8c4ca8ae398e8be05a307f6a9b5ea0824409b87968e847fb",9.917710196779964],[7795,"ebc19482da38b1c7f9aae421f20a0a0b4f0372ea5e7c3165d240f6fff5f4d8cc",9.317957166392093],[17170,"9c259513ea772dde554a725fbc2cf1b8332e9faddc1a31256d3388e8af217a4e",9.317957166392093],[10369,"2115d75ecd6b94fe2ad2cc80c670c65838a7cb60edd3c15de995638c311ef4bb",9.917710196779964],[14165,"b0f694d86a1f9adc3b5c49a6cefdced1d7198345ce86d819c7cefae596091c91",9.317957166392093],[8368,"b0a76e2682962dc8a75c726217fa958cde8a7df430daa27f6d5f7e54da1bd5c8",9.917710196779964],[9955,"1dc31fd6893871ad1217c7dd2b00e3a286b728a901c5f3a6a940de0522e49abe",9.917710196779964],[2743,"045ff70eea0b1febd74d2dac269390fa0d50287f7b6e8c4e8448c339dd6c29ee",9.917710196779964],[5134,"9f65e06e7b8acf59853074dc3e6505b684d977cdb6ba1285c6f22b172d7d68de",9.917710196779964],[17179,"98a5a8014ef2205b850885446f07c6e1417f5a4c28ec3a253bf901f4d6823e4e",9.647446457990116],[9616,"0578423c61eed928b60c65a3a50c03d3745ff4cec6ab6938f2c6ba95a062ecc0",9.917710196779964],[16074,"33679b38c2240e27f3ba4fdfd8da0d985cc987af187baa8373cef2d7b981ba66",9.317957166392093],[1307,"1bcd32cd2322fb0737b0fb745295e6c9544c61f7b4e552401f2798391b9657f7",9.917710196779964],[13766,"43cc8e241db240b33e9c853eb0284e2ec103f2a3002bfdc9e3ff7d7958fa0c9a",9.317957166392093],[14751,"e3552ca4e517f4a8c8206bc67b66a1e19871bc5fb689d40313573f88ad15e683",10.052724077328646],[12086,"c86a579440dbdbf5767fa54da201f599ccaf925d7c7a9031d4e880a6380ad0b0",9.917710196779964],[17818,"bd48ac0cce6a95d9741dc23c450fc707e6c4c8d375354bf1a02e12aebe41e640",9.647446457990116],[18349,"e9d4b08e589bbfe7f917091cc6671824083bd61cf29415f850299982d721cf34",9.317957166392093],[4461,"7952c662c9eb4fee76249e9f7e7372c0841b98d39eeea70d178b7fcbfe58a7e2",9.917710196779964],[24,"3ad69a8071fba91f060342829defd74eabc1809423f518ce2f8a6ecaae43dfff",9.917710196779964],[15480,"07c36cdb6d5c3e96900756e6620ffffd6259587cc9e4ac000139cdf8ffe68474",21.115551694178976],[18789,"0e8fa6d6d039098ca46db32f0959d1360f3d7d7f33370877c2464606f71e5f27",9.997888067581837],[17715,"6a5558cd874ca1dfdb67388eebfdbbfdc59baa7f19d2981f2eea5cde3013ed42",14],[6750,"ca905c2380a5234fe6c662697fd62483618e880f149147111f9cd9d0170c96d3",9.917710196779964],[2438,"cc82c497378dd6daf50d144d4e518fede38b6f2f8f60dc30cd58a75f00ae3cf0",9.917710196779964],[9250,"042315efae42244d3c2559b4e5a9c4e065314845b3a5c9e2e0cd18dd7cc921c3",26.091872791519435],[16161,"3b975ec3c19d21e2f73cb16d4eaa1e6cd5fb080a017ea48c51208743ae83ca64",10.052724077328646],[16320,"1c1b621bfb7edfe0c0a8be9ab69f255434d44644fe4a1e8d29c3d70295bea160",9.647446457990116],[14999,"3960fbc2e3ada958d783acacde160a3fc3aa28dc4823b922664f3726730b907e",9.317957166392093],[3033,"f136e9d80655d572b2a07108df082e7f9c617a6302b0a4babb8614217fb814ec",9.917710196779964],[18336,"5ab47e8a12baf611345deb3be9937d87286712f7f98f999fa85726f5d6302435",9.317957166392093],[8902,"99370ea7497f8aab01d53db868e39405b956de4eee578b135da390f20c4572c5",9.917710196779964],[11356,"c44ed012a22aa621f3e57efeefeb7fd99848ee873535e8492d046082bcd19eb5",9.917710196779964],[8831,"257cab32f35acf51fd2a4d11819f1dc2760973865a08c3a65f6a73ad0ec8eac5",9.917710196779964],[11859,"835b6a131629e830404ece598f9e2701aefd42d780d0867d7cf4875deeb652b2",9.917710196779964],[11678,"9f442c86778001120047a6256ce58f4d25864152300c38ffe6ee0ea1c61e72b3",9.917710196779964],[15050,"ec24dd737e8d61caa8e405b071f465c0e2de40efe44af2097d1da7303196867d",9.317957166392093],[13467,"f3fecdd45359035d5b9c281f24fc4cafe0088cde9a408a20766f3d673ba7b8a0",9.317957166392093],[12441,"2e56687f18bee150b89bcaa54f02302d077003d79bdf6a121fa3625d42c853ae",9.917710196779964],[9393,"e72048bd3b947922254601c35e2d0297aa234796f6ba5c6279407976bb4b4fc2",9.917710196779964],[17347,"e612776306ec7c09fecf6462e18c7972cd70e72e09bca7ab36ad90bb58e8f14a",9.317957166392093],[6742,"b0f3f918c643fbf448beb1d7cdebaed58e3a6c4492575e19d4ecd9849ad1a5d3",9.317957166392093],[4200,"87dd56877a196db2818fee9a2611606c191d41578c6238065309848cb45c6be4",9.917710196779964],[12964,"6e5025347a626d388f01f13238b306b38fed40bf01a51aa826b121efd76ccaaa",9.917710196779964],[15809,"ae7ea3f08c5bd3588ee4fc9e8b577987f453d156122b279a4c12a14f7d9a346d",9.424083769633508],[2535,"e002e4609487e60181bc7c0b690b1e1a14649995f97cdf997e42a8173cc197ef",9.917710196779964],[7744,"32b3fa013fceb7ad29eea88c05229dda1edfc66ca333faae225073070f8530cd",9.917710196779964],[18399,"d5c119f76fd97ae695c98c43639827ea2b306d6506893394553ae684c5d97233",9.317957166392093],[18955,"6b7689a4c00762c1a9b88eb0d7168539292efef02c07a2acdfe6c5c2a987e721",9.317957166392093],[9962,"188050862c674b59edec25635c7e59853b8239dd75e21e3c38764af366a689be",9.317957166392093],[8425,"04be7da0c11309e19e119dec0fc9bc2bf7f3c5a60aff2ca1ea7d9e1a01b177c8",26.076923076923077],[4851,"e5235fcedb0711b490b4903f4b53e653bba97273ca4c449d56e81144516424e0",9.917710196779964],[7415,"0e77a62283eeef2437eb60078e5c49ea5be76922beef9e3b69ffd36538214acf",9.317957166392093],[3030,"3a19330d932b57e03aad7975451e87eee31a240b349202c25793269821cd1aec",10.052724077328646],[871,"51afd56dbe782902b939c160fb4a26e59f8e5ad8b0edee01636a1e9a1c2d17fa",9.917710196779964],[9850,"3c4e5cf9ff8667a1acb271d4a90ab137f994ef8486d80d653fbe1e19c3574ebf",9.317957166392093],[14407,"316795e2fafd2fabdae49d0bf259f77a19df405c519a4b4673a5f460e2122d8b",9.317957166392093],[9985,"70b7cfd3709d47098a39a2cfdd89e6264cc35d202e7fe4fa0ebb86f8ae106dbe",9.917710196779964],[9691,"b9b0a2b2087c8058b19267f33d716c2ce2637a75340a91d0b472a64d362876c0",9.917710196779964],[9335,"c5279ce4cdd72bd9de40caa56bb2c87487349fa1584d0b1a3c3343ad68e6abc2",10.052724077328646],[19110,"fd90c6327db8fb7db7c62be05dc3b7e178325c1aa3082fc29e4aa9f85031e01b",25.941043083900226],[10390,"1e441bf2485a18b866dd6fa87d183a889345728877a8e3cc3e7b0b33ee4bdebb",9.917710196779964],[16286,"14fa40a97af0b9ab5a1479166b53b5d927ec5e77b6e1556e25e3ed0198698861",9.317957166392093],[624,"6e1f8195a804d5f01d682e306e7ac5073177d329d18d4812a2d079f7b1f1c1fb",9.917710196779964],[4572,"f4b281c0b547c992323aef037dc7d70d2f77df602a704c26ed2831f99d57d0e1",19],[11020,"5aa7892f5a031f1d0571bba2ba12e0fddcb123e532ab8154f46138fb2f71e0b7",9.917710196779964],[12274,"3b6a307c41e4b32ef6c5915eceb6fa4e1520d86f880e1bfabb7180a51ab572af",9.317957166392093],[95,"a5909906e7c00caff3c93c7754270cba4839510e6f0c8ca2c1662941a73266ff",9.917710196779964],[10094,"06c1fb5873f06456fe994734c244abc8072694521f728c2fc9d7cfdeb476c3bd",9.317957166392093],[19459,"fea37c6d9b0ae332aacd9360410d881a94385155ef99bc61a5996a08eebda60f",9.317957166392093],[14624,"28472f3fa4a3b5d5653ad5a6ed2fd2f4cc7aa9a959980e77541413364cbb7c86",9.317957166392093],[2881,"201782baf8d9ebe94ecf1b771781c8bb5f0bb7452c82b9d20416a9aa70623ded",9.317957166392093],[4381,"4915f41cb60b3c77fbc354ca72d38fce3e459a07795271add4e7f6ef96ed31e3",9.317957166392093],[6195,"bef2f3c3f827e64a05bbb3dea2fd075d6f3b2195284d6f78b0f9a25afc39d0d7",9.917710196779964],[241,"5cfdf31fc5befa9b6fb5482706c1b9f9538d7b59e66ea986232ed08dcaae5dfe",9.917710196779964],[12357,"550c9fd801be26b0c8a360cc7bf5e85acd289e9d6c95bfa845a60034a610e2ae",9.917710196779964],[8559,"ceb783b0e851aa04dafb0aa73c5720e9afa5b5bdbe5f9c3b917d826c3aa2a8c7",9.317957166392093],[15445,"c982dfe0b5789e9b276911da14b6c7206d21715a2bdbf216dcac580d26f13e75",9.647446457990116],[2130,"efbf1a8b1b0728cc6e413f29f73b909ba92f2302f7b1d9047aa08e9412260af2",9.317957166392093],[4973,"33355111525672abf1d3e35b4a56a56b2f9683a83407a3df630ae889911c5edf",9.317957166392093],[1693,"f22d2d047d55876260d347c235482748eb3ec449bd2f5c899031e3779d62f9f4",9.317957166392093],[599,"e8a5cdfdc1f83f5cb729bd244fd62f050de9e8489ce4b8946ff7a11ffbbfebfb",9.917710196779964],[11211,"020c5011bdacd29a31482a9fbf7c4b12dc951010634764b372c73e8e2d52a0b6",9.917710196779964],[8981,"f388020eec1a3884ef81e9bcc882b3df2f0f55c081cf40e4656a2d2fa858eec4",9.917710196779964],[11962,"66e7ac14864b0daae84ffa2cb1cad3322080d69a2cbb34f4edac788d1c8f93b1",9.317957166392093],[1311,"21f291fcc0f737dfb2c24f195c16652c76178f4ba6d1e750e2afaea30c6154f7",9.917710196779964],[16206,"e6e1ef4ae7787d675ef1a9f319eeacd4fd057e4c7f858b7523205d71a8fac763",9.317957166392093],[16013,"9f4cc53dd9732932dd8468b6eaa43b4ae18a402a90f20ccbd206a7df34402968",9.317957166392093],[19228,"8a6df20ef50c83cb5109e6fdbe7c62d93a94ce9f4c12e03a6ccaec3c34d5b817",9.317957166392093],[3675,"6852e617f1a5e2acb68a8547b0e7f059ad570ddb15ef56061877f1069349c4e7",9.917710196779964],[17722,"b882434a0177cda6ec975580104d1cec84f144380589de3141e082235bf7bc42",10.052724077328646],[1874,"bd3888e36ab0e110b80d5d6ecb9018817d9e480c467a0bbb1de9265bd094c9f3",9.917710196779964],[15652,"f64eb11129faf389f1cc160eaa4ab6706b965870b23c73b36531b5fa46114d70",9.317957166392093],[5098,"deea314172aca1870683ee5069dc3384ad7c4bb51ce0fbe71489496dc93397de",9.317957166392093],[283,"e1a49e9a1a221a591e826f9b06c51a2566df7d9e195f5e43fc6e3f94f7660efe",9.917710196779964],[13525,"e9029bb8c8804fe3d97a6e0c51ba68236b8e6cc62c6d0502d88aadcfee404c9f",9.317957166392093],[2698,"8932db10f03ff0239f335037e6a1e065a674e637acd2cf2c1085a09877fd7aee",9.917710196779964],[8165,"c914078ce36328f30cae066454ef109f1115f6c86ca805a1ef7302ffec4e37ca",9.917710196779964],[5895,"6a7f3a13153036f275f7c375abc508e7ddd3ed0cefaa2a2d9825b9e7f52bbad9",9.917710196779964],[3145,"c075786e5731de7ecd23272e25abb3ecb0d9df2d539551bb2b07f861c74966eb",9.917710196779964],[19778,"6093423b998c971f3b7441527a945c6f1f03836db7e007d6db2b0ec0ac7a8d03",9.317957166392093],[10573,"311abbc049c038dc17658a5903174e2cfca5682c7645e9f86459ea76f238c5ba",9.917710196779964],[18017,"49a526b5a68297caaef95a6028372e5f086feb79e7614789814910e10f65e93c",9.647446457990116],[13755,"2264bb68ea59c0454826a26a60f1f501550fb34d5582a410b6c478934227499a",26.13903743315508],[4161,"38c936be591b33b94e78043a19cc88aff4818e75762aca6e1161546e884faae4",9.917710196779964],[17213,"1288221f69e275538a8c11493603b6248a2204f7e28dd5b056c65fcdd980934d",9.317957166392093],[443,"c6aa2b9aab2c0e4a36836698a1e81cf14d4480e37639b4588a1f694050fc17fd",9.917710196779964],[18904,"9994ae91cbfca955f6a74eb7195209150fc02adcdd79c0035cbeb0494bec6823",9.317957166392093],[18736,"f92c896f64cf44d85974bee205294a83fe34124a779487362d7aab3665f32c29",9.647446457990116],[12959,"c41f6f7144bf37d8b5022bbbb4f7d989e4c680a56f1bb8b610be84f8b4fbd5aa",9.917710196779964],[7708,"ed3df52b6e31965845f04e2eb0609b8877e1b67970e36be5c0d1011de8b17ccd",9.317957166392093],[7031,"4682f4500a3440bfe95ac9a267cd01f4929eacbaf8ec51bf605e7d6f5fb5ced1",9.917710196779964],[6836,"8f4b02d282c027003df2a07058b8af4224d1628db2e1eb86025a583cf22e06d3",9.917710196779964],[6929,"a272fc205c5e7bd6bcf5296757743ca06caed0107f59c5568f8e3ec0a5fd72d2",9.917710196779964],[9582,"b7ccb0797a3a2d88ea4fa6ffb86819b552a09b34de31c0130bf244b0353a1dc1",9.917710196779964],[14193,"eab2de8421b0182e410ff8b4add855ff3981a2a91064a8feb459f58c78496d90",10.052724077328646],[17453,"0113a2c3411b0edf4f46f5638f8846f75ac1fbab0671e27c92b7993fbdd4a648",9.647446457990116],[17582,"c3dda171e15d19cd5d8b6f74d50bf0e2771d033888f7192ce29bb29b5659ad45",28.19221967963387],[3460,"5457b7f3319154ddb04d12e141b2317c15337099f8747fa967f2cf1402554fe9",9.917710196779964],[11207,"e29a475b64cb3738206fb9be97ff4a6e96330a2e37d9f0ad661a3ba72075a3b6",9.917710196779964],[2551,"d99e6deb8b4901046f06b4eac5befb66d477b336f0e4e1ba3f08f5a37cf887ef",9.917710196779964],[1020,"f196c5ba1f6bedb108538f313e2593230a010b64e91d0db20b6905caa87f1af9",9.917710196779964],[6048,"c42a71007a3ee51642cb2faea3c1cdfdc031f6a6976c2ddb2b68f440a09ec7d8",33.42226310947562],[4066,"89fa1d840809699be9e5b0eac74cd435acbc609c8903ca05faa203b1508550e5",9.917710196779964],[1089,"bf0524039a362c3f9f06c58241e98a8ebd6530d3f5a4908402b5907bf1f2a5f8",9.917710196779964],[9149,"23375ef55e773e34aa1d72d760b3c586adc6c03850ab917d359e4fe8381ad2c3",9.317957166392093],[887,"1bf9114e167b9e3f1c1d61f061268c825d1e5ccc892c27153200563582bafdf9",9.917710196779964],[19513,"496b188b946a6406564a73c07abbafb16a2cb5d2fe7ac3faa73fd4db9d6de60d",17.14031180400891],[3023,"3f9cfada1670976169244378dda1a19e7115a17fbc1aaba840fd347ddc9e1fec",9.317957166392093],[12597,"a067e8edcf243fbacefed70a2bf5dd0e0e5b26143f0dbc48b48a7722e7b149ad",9.317957166392093],[4553,"329dbafd03ee6ab474d312506bb59dd5ad114169d31b52fc304db83efe6ef3e1",9.917710196779964],[13547,"cdbace6e2e3b83a99419a676de7a5ab1ec3414aea505196b8b2799f6e821d19e",9.317957166392093],[3390,"8a19d284c8784c886ed2f77a14c8a8097447217b2feef14b17a64ee6e3fbc4e9",9.917710196779964],[18596,"310337070b2f32d4472cb75b0fed6588f4a8ba95288fb7c4da98f9051d62ec2e",9.647446457990116],[17393,"7854065c29a60445f024fe3a01831ca9c224e1bcd5761f37e063ec743182ea49",9.317957166392093],[9864,"607c9311367bc11b6bd0fd76491ec573f23d76ce17a18093a9a3bec5b24628bf",9.917710196779964],[87,"9b519a5660cf1da118b4b3d8b5cc201fcc76221c8570489da669f87454e16eff",9.317957166392093],[1908,"537a68286c155bfa8ea6f29b9134b8f26b60f5769ec444103fa5071a9e4996f3",9.917710196779964],[7107,"87caf2f78fac3b57c9d90453d647967ee7c5df7fc6aa0071cb79bef325fe4ad1",9.917710196779964],[7041,"f15d744ac8b016908c36dd57bec97587b5bef2eea2ec4c002f2cf12f9c18b5d1",9.917710196779964],[1508,"73feae2c54562b4ad93d02d09bf208d96e8d68ed6e0edff482b80d4b883c11f6",9.917710196779964],[10368,"f3d7a2eb8baaf5e74d37b32fc8bd07b7c5b6422fa32bf1cc0022b2a12a83f4bb",9.917710196779964],[5974,"cc63f3713208fad351e845be6a5dd272409931418498330ab1dcafa004e041d9",9.917710196779964],[7249,"a556cee7b83bc1d049937c91d3bd5605fbb537c3501eb0bdbe62723c1d6561d0",9.917710196779964],[17300,"10ae34b1d694a9928f9d31706a447ce79c434b18aa3d7b7ca8431afb6d25054c",9.317957166392093],[13955,"65c24f8dae5a34c071ffa62563b9dcd91b6e8359b5657ed542acb205d88ddd95",15.017421602787456],[18126,"1c17625d167bbcf3ea2bf71fa217f9ff63f1db8e234bc06501724473d62e503a",9.317957166392093],[17907,"7be64e9496041853b22543e3a2483cb29f565bc30ee6b449ef6282f4cf6b1a3f",9.317957166392093],[19496,"36ee75e4e6bf756e496ed328d8c71bf23237a069fd86692fca7496e7c910650e",37.832614322691974],[11294,"175642242c5888fc38354aff575d5966c8d9f332402f88333adb0332b63313b6",9.917710196779964],[4880,"2c51c82e24a88dc16b904641ea80d083a6d68611a876200e38ec003cb9c1f1df",9.317957166392093],[179,"4d41d6e5e6ad235e2f610a1444f8eba6b10a4535c1c8dee00cd08ac85996cbfe",9.317957166392093],[18982,"640850bafe4f95de71a25bd2130b896bd156c2417213a4ed5fbe4f3118841821",9.317957166392093],[9714,"7bbfbbc65b7c97846e76206b27099aadb962b5c32fd4bc9de4ad449e5ac142c0",25],[19584,"764b561ac0b45e13cd00842b8b51c0556ecaa80e77b848649c9896f1369fd90a",9.317957166392093],[8590,"40f7f0e80e136470030142c17bd6a06fa74ad8b5a40473a70df182fe1eea7ec7",9.917710196779964],[2156,"be776b24a54d6b9e40f4a2b9b772dfe7f6013527e8699e1d8a1b2eb3c708dcf1",9.917710196779964],[5250,"1c5d8d525f1645d3a9f6870b8e14569a2fefb08708e3e42cbd8dc8fbf849b4dd",9.917710196779964],[11171,"09e182418ea7f16ecfb335b64b2452655958e76c39a451c35aeb217d1fd5deb6",9.917710196779964],[9794,"5adeac9a100bb0a906910b35ad5238a57c1a15326d4f5119188d7a63d7ecb2bf",9.917710196779964],[19322,"1b026f46563e7a187cf0fe47fb1347349a99984977c5fa1c13270484e8854e14",9.317957166392093],[8370,"00450e77cc39372bae6876f6da715bc6dfa1f62b7b78bdf64bf691a5884bd4c8",9.917710196779964],[19494,"7b05ccf3cc8a657d631d94291ef64ebacbf69336c82d3efb0547b1ec0932880e",9.317957166392093],[15381,"e674c6c02eaf73216a39d8ca06561b44fbb95d8944d0a02e2b86b6db200ac776",9.317957166392093],[6540,"5d12c5160ba1675002fe7b1598d4a422bcd9fc05ced3271d43d340a030b119d5",9.317957166392093],[11064,"e086d4f1f89649924b705c06249851176bfcbcce9d36f26d50bb3f61c5d992b7",9.317957166392093],[11288,"159035136e8b611939f8bc2c223f4a12d8b97ff08dd388e7615c5ca16ecd1eb6",9.917710196779964],[15900,"87795305b9573505e9ed5a7eb24d8a8e8dffd9b54df3708b6fa2ad35b3f9096b",16],[10250,"177a0408e96bed55c2c8bfe727b2c6677667b7edf1a5d1f89143c653e840b5bc",9.917710196779964],[13209,"77af4e1ef7626ef69e78a4b3292454e82bb9218013a06e6fb93e49274110bda6",9.317957166392093],[13506,"b47fc52bb016167dd2edd10b0883daac27a64662c90367c895f9a9831868a49f",9.317957166392093],[16850,"e1a94f0ea00130a647ad5581123b5fb1052c241954b1c6c39efd5e6ee2e64355",19],[9074,"f22ef7cd6d165dd2785421d81555c984fa688e8d4a4f22b350b7f420c46a4fc4",9.317957166392093],[1859,"7fe465ed88e47711ab759addda1ae0cd46f892b41d71b8c765a56ad25aefe0f3",9.317957166392093],[18460,"47a69bbca9e0dc938241acf10a6e0139617bd0bebb748f78bf7fa14c0a1e6832",9.317957166392093],[8103,"acce3fb67b28e6a5cb18de3a0ec59a1f1b404c71411c65055e74ce2f99f1bdca",9.917710196779964],[6864,"b208e8743f346bfd736c69a95cf554d320fc8431d42352866097e0e8d5acdbd2",9.917710196779964],[6924,"66c3efd2954cdffed6db148aea8d6d15ac3a2bee439e36913a0f9936e4cf74d2",9.917710196779964],[4429,"e32acffe1212ce3fea67cb5db813ab58bff98e1aad35f93ccb681d69e333e0e2",10.046511627906977],[2802,"beb02c64fb084fa9fdc581537acc1510e5c1b8a6934aaf61929b7df311b8b0ed",9.917710196779964],[14613,"3036e639cec422e7cccdac0ac33b914e929739341a00d8fe008440c74a56d086",9.317957166392093],[16016,"0c4600092c770a0c4ac1492befc415303279b6efbb05ac72399b5128bf111868",9.317957166392093],[212,"e5a16efa4f23cde376333b148ca336084d7fff0929433ac19100a8832e828efe",9.917710196779964],[1056,"8ae542cfdb53f1987f63669893827192507f418de593ec58a6bd5b5cc08bdff8",10.052724077328646],[12373,"6e0b50ef0c8c018ee5ea11ccd449107735dede144fbb617cb2806cd4deeccdae",9.917710196779964],[13704,"926032a7a43ea04bda2f4f3daf397eb2fc92e4ce9f667db87bc06f003dcc3e9b",9.317957166392093],[1283,"a0ed0691b93f2082487e74baa788288bd5d00c22e2ac5a58561bf2574f9a78f7",9.917710196779964],[6553,"fea3c23e0fe283947776edff97271aa355cd7a1a2e63e6949aa4fe1ff0b4fdd4",9.917710196779964],[16153,"2b624990a8ff3e009a588d6c9de187a96ba532b81018c89277afa7c84443f464",9.317957166392093],[9500,"128338b6bff378a4c78486c1e8c9e87741cd6b85f3ab93ec513688f8e415b0c1",9.917710196779964],[195,"ce88011eadf060b9e7d6c9defc7edd95f610b4cac3858af6cf646a10daf2b5fe",9.917710196779964],[2213,"0c4c4a4fd15748a0fb584a613a0d9d7e8091a6e6968edf7ad3f0d24d3c4a6bf1",9.917710196779964],[8327,"f105f40a9d2d5e2427e42baa79d20b92717a4759198558bdf2a2b324894424c9",9.917710196779964],[7087,"78995087a516dd2f285243a7f998702f77bb3f21666ab7906a157924d5d86ed1",9.917710196779964],[763,"5cf24864b71c8ec4f1f87ff6a791ba15d6195715d0a6d11e547096c8dfd9ccfa",9.917710196779964],[12201,"779da70406764181e642cf769ab80a14ee6e0149a94ce7f83ad058be739810b0",9.317957166392093],[11978,"ad89881550f1c16c9a0adfd2ed4c0a46e18c61f2d45b70b8a8f4091bb87870b1",9.917710196779964],[3485,"172e197b0bf7242bd614f9de56b86c5caaad87c16e7a26902c78918527a81de9",9.317957166392093],[15648,"51dac90c9b6c54836e03e011422f63b7f13aaca8e0748f0d2121c2b8c9005f70",12.0473061760841],[2556,"dea258a7ca65e0cbf04a114c5e691c3e2093b597325ad34cf7a414e388a581ef",9.917710196779964],[11390,"1f3c4672dd385eeee72fc60743c150f9642498a4c3f87dfb234302ab6fe76bb5",9.317957166392093],[3292,"3b6bdf8ac6e8fac58b4a8caa5706d6b10f6b74580b8f5bfb9a33625b280373ea",9.917710196779964],[15292,"38379c720cfd11f683e1ad10dc9d97307c01e66ae028bc64e0e7dd5ce0f89a78",9.317957166392093],[18427,"fb38e2432078f4065135f7cd553f2109421722358d8752c24535f2f0f5680b33",9.317957166392093],[11040,"12a0594f01d097f9fe40b4a6353e030c73ae49f5b3b8711096bf6ece5704cab7",9.917710196779964],[2317,"6d68f438f308da46dfaff532f68df3810de7532fb17a470c1bb306df9450edf0",9.917710196779964],[15639,"4e340e04d0725ebb03d41db3e8fade268be8a50c3c6d4782a1dd62c3e9748970",9.317957166392093],[15043,"0d0f4ede151a99e6fba4ca99a0a0aa89b7126e96ce500d93945058c5f558af7d",19],[18771,"b963a546150245f561e9662ebd68a31ade1f3c0d91e6938c84ebc42cd08f0a28",9.317957166392093],[11095,"61fb4f82db18fd2b28d370dc419c9e03bc45d62a57beabbdbfd4177824c548b7",9.917710196779964],[3883,"15953e60c6962fadfd3788a76fb89d8a10c3cf4073d9daa9a075605c1b8979e6",9.317957166392093],[3450,"bde5be8c9d3cd7f7813ee87bf0651a74b0187aac81cb30149392fe209aa45de9",9.917710196779964],[5133,"3c71b3b4f008170dd77ff22886f6c605e5c89c3288fc0749467b4196aea268de",9.917710196779964],[2763,"ca33a0992256b228278095c8198fb7c6f866e81e0912b573c8be50fe439d06ee",9.917710196779964],[8154,"6c3097f71cfe2f5c75b0270b47cfb9ee8c1dd41a38168a9267772e26107653ca",9.917710196779964],[17041,"8e79681f32ac2f2122310575647dac086448ee2f6c19c000b3c83483674c2c51",9.317957166392093],[1280,"a5fef465d145a1b892a50efd41cf145eee16cafe23ecd93202b5ee7f12827df7",9.917710196779964],[10844,"0e9a7a6ad2f03b99ea798236706a72944c090ff3f31c767d8c7f98ba4ad307b9",9.917710196779964],[2576,"d29096f00bad7029b9394bd9266b0921bafc39446acc1db5d08432a3959a57ef",9.917710196779964],[2571,"bd69b0a62769fc8ab1448fdf70b6eb915ccbe42ae7a65c0ab29befcaeb8367ef",9.917710196779964],[9176,"cff340ac46183e95d500a07d2f0fb7bfc91c2821866d77c4e3dcfbcd513aa9c3",9.917710196779964],[19860,"9e23156f38294003f02c0f184b58d0e6c4fc7e97ec683cae6be839c306fb8600",9.317957166392093],[9567,"e9c5f189abda769c84455784b1a8ec8f7c79629cbd97a9774b4c904c61e631c1",9.917710196779964],[13812,"cc4454a1d755e0d83f0a0687fc756c6ed3882d1a135ebe11fe2e9b219dff2a99",9.317957166392093],[2798,"7d99bae5fcbe460fabf49319f8cd4e0252a49ba9cd8fcdcddaad27bf621db6ed",9.917710196779964],[2506,"7b2cb9116e2706ab54a6669454ca174826fcaf5eda9ea92d4ad974ba1fd0cdef",9.917710196779964],[9787,"7321c60fc4ec5998a1509ad0897ffcbb4b55a2b045620effb02a5482e0fac0bf",9.917710196779964],[60,"a0d45eaa9a5670b487a31a49fcb8a012c571cfa05a471410e6aff2a3140f95ff",9.917710196779964],[13244,"c089a34ca12ff59eb63e478feedfb45b8841bae936a37f9dd3ef6409d501f5a5",9.317957166392093],[4984,"901ce300710cc6592a6f3edf2fbb744f3498d2c90a3cb3c1e7bcbe0e122549df",9.917710196779964],[10353,"95c7f8a5193c58ab0efb7a37f5bedf98ab662cad7f948f4ddd6011370a2407bc",9.317957166392093],[19426,"e44e2fe52b842b15b57f84c290e92abf5f81972f8a1f679d77d494ea89119910",10.052724077328646],[4002,"0333b82860c2603ab3d51f21232eff52a9de02ff21d62fa814231a949705b6e5",9.917710196779964],[9828,"96dc2e6156acf284ce8e31cf6f7ddf98cfd1559dedd1248a3d85eaed7b746ebf",9.917710196779964],[16874,"e0c1e9e2be0907f51b5059823635268e230e611c0648264f8b17de8ab2f2c954",9.317957166392093],[1637,"b3f96f8d891d08eff5d6d30aaefab3da105b3e6b1d6c08676e698a84862c61f5",9.317957166392093],[13801,"7bb7c7eb207b5cd7e3082db66a8f321ab745b735fd0ac65342edd075711c5699",9.317957166392093],[3239,"58bb29120f3a00d2b097a97fab64832ced2dbdc84173bf16aa60d8acfd0ec0ea",9.917710196779964],[4826,"ae99d6d63fa0aac3173fb7357c6c4124f78e8abd9867c42c6dec7c5492fb3fe0",9.917710196779964],[4799,"a87e30c85c767b9723081acb0c2b40d475e9d5864a62548d13f80f76136e61e0",9.917710196779964],[10444,"f1bc205fe8b104583c0d628361646f9ff43c6ac406c7a90b7210678e2d3672bb",9.647446457990116],[451,"1a237ff916cec064ca109eb69250673dca84fab0c8e7f0beb7a70405257e0ffd",9.917710196779964],[14043,"a948fb997b6f16c64dce6b3072f492c2b35991ff458805f00b5f44b56f49d393",9.317957166392093],[4379,"e5cbe1995f0f4d1d689e1ca58a44a8cf0fc23bfe9fc7e6f65d82015c566d35e3",9.317957166392093],[12547,"6f5c8375c333f891a6daa3219bbc886dd2ef505e1f68ad7c1aae7864633fa4ad",9.917710196779964],[8271,"12a80f68ebe82a09a790356594ade0f56aee87fd5bff23be3767a5662ce483c9",9.917710196779964],[18052,"366e6714c7419e12c3e83bb6f6ec0300c82b5c5a0a3dc2d134bfb6a41c90263c",9.317957166392093],[1379,"25bf50cbdf4786f9a757eddb78b5931f5ba345d1e22c51b99f157d375635e3f6",9.917710196779964],[3055,"4058b07869a8cfb662d24ece75b6b030a6a326b307bcade7aa10af4e8c6af3eb",9.917710196779964],[17071,"46af8666fbb6d6cc01ba70e2a1b6009b52c1eb2a92c73ddd24e89dd2269a9f50",9.317957166392093],[4311,"831a3c466546aede43e0be2108142f94af59c55c7ead1cb3edcc0bc7a9a9b2e3",9.917710196779964],[3754,"9a9a91113a0b74e31a94fff3c59cfd684a2def76fd3c13c5597aeb9dacbe3be7",9.317957166392093],[18886,"8d4bf81954d155ff71f6efbd45f3657d5cb44b5b2bbfa1c1993b6a06f7b6d723",9.317957166392093],[4641,"99524f481d30184d5676d0c00abf83febfa86934fea263875d0d38e82d4d5ee1",9.917710196779964],[2739,"d0a62f3bb35065d52e141a4570620111647ca9e3c56f653e05fb36207d602dee",9.424083769633508],[17231,"199bb8a75197dcc4d2e8ef37825e92fd3ba2e1d8e8b20a956cfcdc59775b4a4d",10.052724077328646],[316,"889b4e0260bc3906c882e0e8caff8c01df3c8f350b3826640d7331da05ace7fd",9.917710196779964],[13225,"3b8b7390162188cd4d789fda04e7ad9264c371f5e3e0c86f8fffe34e470b65a6",9.317957166392093],[11363,"a6e0a5824a1e51cf851c020b07862afb9a8d3ef578b0c422769c0a0ac2fa9ab5",9.317957166392093],[15466,"8620c798f90e20d8db2771cb8c758cc66e7974f86bd584336a6b712cec73d974",19.154929577464788],[5455,"99b25be49bdf57b2a6358d1a876770f9e3f023c027bcd566fa55b96f861a75dc",9.917710196779964],[7445,"8535f2aa88622bee1417790121626037f51229a40d4b43571fd5324e10321dcf",9.917710196779964],[12104,"0880c553d235ccf48d0aaabe4ab661008147f66e0b593211bcb5f529afa7b0b0",9.917710196779964],[2721,"11bdf942f0a706dc5564ac7ce369a03849957ed85e1b434181fd6db5777f48ee",10.052724077328646],[18310,"a6889ebb5659ab6b4f50432294876f972f3b5a17c86b85a65eb9aaa684c9b735",9.317957166392093],[19619,"3eadc7abe25c604ab29f3a7ee989a5ff217216894a21469b671ff841adbb0909",9.693363844393593],[18004,"4f932be9d7bafc2e52a27d68e9f35655eaefdd43866cf560bc2a5b35a4de363d",14],[18151,"3a2ec0764fca18df8bfa358bd3a82ce4dbc7a33a834c394a70d7d431d7c55539",9.317957166392093],[13186,"7aa9e48168dec5b76086b3539cd28862670b6c37ce68f30e33f40abb43e743a7",9.317957166392093],[5861,"b4b9224ae2d17092afa951b8e56ef43c061b1eda29c6f0d5790699108315e4d9",9.917710196779964],[15623,"1d59bfbe474ccd173e68faa4e0c5c120508f332782defb986f0f4b25edceda70",10.052724077328646],[5,"abfa42f4e6b196449b9743b5ec47e4c959f011a0bc0a7193f9d0b1668974faff",9.917710196779964],[876,"664d87f44bc6e85f5d3c13bad4ee1300973c47b2fe036bea69c46d9b026510fa",9.917710196779964],[760,"708504e3e4e7dc54a1bdedaf01d7ab70e134498bd628706c83e971129213d0fa",9.917710196779964],[11512,"08489286cbbd4ca0125055371fe821762ca64a1cb2cbf159659b4605e6b370b4",9.317957166392093],[5271,"c1ed511be2ff2372aebbf1e5f772a79b6560fc0462576113af80194cc4da91dd",9.917710196779964],[5849,"13aed8836ba137967e0a52f8cd52e848407f13c51caba4c22dbc4370f4cefed9",9.917710196779964],[5466,"89dc8d0cde27c8e8d64fc37687c4ac305a75a5348666475790a6924b6d6269dc",9.917710196779964],[1478,"8936809e848255c892a5c044180fc40cce3903fe33a62a572a8facc4e12247f6",9.917710196779964],[2796,"b70d9e3d57128fa5556de1ae414f8963ae38f1f6d13fc3314cec2e6af534bbed",9.917710196779964],[9212,"ef467faad81fb5a9c7589f45c720df794c2ee9d7f7473ca2c866d4779c6c62c3",9.317957166392093],[13315,"c4d8d36e7eb3079c71e99916164a858a5b51df69e05328b130a35f47686750a4",9.317957166392093],[17593,"3d5fedef020196c79de30953fe72513177ef571df5e2461ca34142da26225045",9.317957166392093],[16842,"5d734e8e716798aa3d11cb7da19d89d24fbf6eec56f426a9da8e1e580be76a55",9.317957166392093],[1891,"07763475b49bb440b2d85c684cf29d38876c088a0c9cf5b6118cfe1302dda6f3",9.917710196779964],[7965,"d3fcc1e00641b1ffe0edde3a1366a0ea3068a5a60eb9e1cc4a8121b3c04bcacb",9.729977116704806],[10405,"c5de667d4c9e33ae50bfe97cf56bee0231d48a996851691e57f7d0a11075c5bb",9.917710196779964],[14655,"c4bd88181530bbf602a0ba7f2d6e59332f9e123c891f6a8514216a351d11cc85",35.830388692579504],[9945,"3c2b5e2f1cea213ff92e908cb31807512c006c9fa84d92ca30f4b5bc8d29a7be",9.917710196779964],[14633,"6851cdd524eb6f15d50d046c2199d50ff04b7d3aaeac7e2819f62eba459e5586",9.511868533171029],[4676,"78acdfdf8e91d1fd36067fe98f6c71d2465a16df94befaeee5b65f9b036624e1",9.917710196779964],[15709,"333bef523b6d2965ff186bd9b4d86072b66782e5b6a5fcc2ae3a1254c916406f",9.317957166392093],[17299,"8304859820c28e4e00f1931393fc8a2ee99447c250db548ca8c98bb20adc094c",9.317957166392093],[3297,"842a4b1626fc16174162cefd516e8b73e71247a844b703e238230a3e41556bea",9.917710196779964],[12962,"ecfee29aaa2d7b85995fba139d34c20f9a923e421ebd55187bdee5c39815cdaa",9.917710196779964],[3546,"9d2000c38201711baa5280c3e313312f24c4b8a85cbbd72b2edcb9f19877a1e8",9.917710196779964],[2815,"f9b0f0fda3a17b69be8dfcbe9e562d7354967674b9fa4731e08b3c3d51aa94ed",9.917710196779964],[16699,"386828734275c9d8c52678573fb5c3670e4b21e9b4bfa95178738f5ba2427b58",9.317957166392093],[4444,"512ff899ec86cc3fcdf9fddd139399b4c7b5e865c34073c617f90d678642c9e2",25.136612021857925],[6220,"55ff7c96069f9a4a04fb74c2725463906c0db9fdbcff8c27abc9d77a904e9bd7",9.917710196779964],[3951,"befb8b7da6ddc5706e8e372cee7c48b118a6da1dbf58ab2a8e8697d80e4701e6",9.317957166392093],[6749,"2f7faebd8979432192553bf5d62fd34d800c1d78f178af22dd0b2f6258f396d3",9.917710196779964],[1960,"ea2018092fec54fd1ccf58a3f0b1f74d1a6775494a366c181d15748bd8e148f3",9.917710196779964],[1031,"039300f38534451454da20b5c84fe8b6419143a5cefbb76fed7a2f3a758911f9",9.317957166392093],[12495,"ecf0bbdf44067022ef589c80b5defcca2fc8ad123b401645fb0964b916a4fbad",9.917710196779964],[7550,"037b99638b6612c235603f8759f57e57e44ee0863d7b703080b92c54c5bf82ce",9.317957166392093],[4349,"34628302417f83c55feb4daf5f3bdc21575d8784814a6db94be26cdddf526be3",9.647446457990116],[18954,"51f049908a8471afa8006b52f62b57f50bad4d322e037ef1fc4f7d2f983df721",9.317957166392093],[7103,"4587317cd7714925af6aad7635f4c48971e45f9d8b170bb208718398e8b851d1",9.317957166392093],[14298,"489d245e2d8e7b95459ef0d038385ea42bd730c4fe8e079781f0e5734192a58d",28.187082405345212],[6460,"01e6e7ab25528928ec4dbc8544e7a98c29944dfdbdacf85662a60b7f1b01d4d5",9.917710196779964],[2765,"83b7d4b70a25ec99384aed58fbf4bd5981116ef400b6fcf4a86a82ccb2a8faed",9.917710196779964],[15520,"2099ba91fb6a4c78decce9f2e311be50ecbc09907ccf8d19650939e3a2839273",9.317957166392093],[3626,"2c661767f60745c833447457f4c5348d791fa711456f4bee338025fa9d2713e8",9.917710196779964],[2045,"b1313971c3b6e607afb429e2df02a7a6502ac57e3e5e370535d192fbdd95a9f2",9.917710196779964],[8929,"8a05990db9e7dc879b2e1254453a067cfd885d29cf65a59928f41e0f15b54fc5",9.917710196779964],[19126,"51a47ed6dd06ff75e2695c3e61e9b7f72f004a553ca444c1ac4a45e998993f1b",9.317957166392093],[1665,"df1500ec11512796ec113231ff872844c89b260ce73d5fab504ba38af9e227f5",9.917710196779964],[2058,"61b9776696d8e74dbfebb746c6c262b4f10d6752447aeb77c5a56b5824118af2",9.917710196779964],[2400,"903d2006a213dcd844e33ac3b62fdcce4b4f1e3745a5a5b4cae34af7256d7df0",9.917710196779964],[14156,"04ae830bc38a7886ae9624dc446b6ca644a835d8afb56decd797c1b3798c5391",19.386547085201794],[12136,"f0deb361d14830b808adcf90b94ffb9b253c24c28ddb594480bb199fea7171b0",9.917710196779964],[337,"5b0a0959d91384a3bb645d9401c326edb6053bb46300e33798a1cc52c369c8fd",10.052724077328646],[16420,"64ed6374a7edb96732294ee78c02c0300b8401d5f270a3873c2ccd1e308bb15e",10.052724077328646],[5303,"6d2f361a201e5b040c237affa46ce2313df0b940d3c5f8f62d1033d52cb160dd",9.317957166392093],[7636,"05ed831668496581f6d8a5566a1ed83677f321e6d2be74d813c3c3cbc142fbcd",9.317957166392093],[13697,"62c7bf787d111bac0557db4f3a14a3697bef5da7b80628fcc0380c303a29529b",9.317957166392093],[7598,"575bbb95ff63d3889f863d9f901d402d7fa97bf453ab2737f579edbd0b1d30ce",10.052724077328646],[3902,"6cc9918c0ce55beb2321f4b17d515f7f94fb40dab61a35350471496883115ae6",9.317957166392093],[3917,"218b7cf9a9e7b4943b0eb11e7d38963953aff7ab1589af2496e007b0e5b73be6",9.917710196779964],[15012,"8c773cfe853fad0a70da425a5c1c7ee2c2d70859de2f70869b5740166cf71b7e",9.317957166392093],[8134,"c5c1d2e2711d8b6929fc62d15b9a162359db548ad5a177a593c981ee89ac7cca",9.917710196779964],[8489,"98e34d66e5f33fee9bdc183053c4513091f427b38459b9b0e94977c0416912c8",9.917710196779964],[6378,"d85150fe3852ca640de7d9fbc16ecc64f6524afe0ddb8e5b5d3f5c67c4c074d6",9.317957166392093],[16276,"e5c38738bd9ad527e1f385db368a0ddbb7d49b731dabf5907e8a6218b0d9b561",9.317957166392093],[3661,"eda8ce055834e1dd83809d3b7e118e306950e4111a676eb74552c2b976dbdee7",9.720823798627002],[7009,"b5c5aa2f5ad1fd797388ea67d824308103ac3fbfac4e8676b63d9223de5cf2d1",9.917710196779964],[1641,"916e57f3861b8e6fc95d3985a84a876b9dff4202ff290d91d18b25b6cf665cf5",9.917710196779964],[7185,"054a1835b7c3724b77dad0ff229e25140eb73a5014cbda0935e9ba272d17ccd0",9.317957166392093],[15440,"d48174e0c000e6b216de877395400fdc9a3dfb5eef860bd873c7a5b64bd35875",9.317957166392093],[16493,"5361117b92702ec2a95197841ca4924e15957d1eb0ba1081a235da3d97ce5e5d",9.317957166392093],[5196,"9b6df63fe3db8084149ea3df81ea077f79b971881b076d855a884cca66bbffdd",9.317957166392093],[12084,"b8685dda935bc907fe0bc6522f186a0ad04331428b280df7063d68427a30d2b0",22.85610859728507],[5545,"d277ee43878099ad57a14ce973b51fe2b892e5866e0b4707c6ad5631c909f7db",9.917710196779964],[12449,"52129ea8959a33a85a7e7c42acd2d80dce7ce828335de5e33b4c5c4f259b49ae",9.917710196779964],[16102,"07b45256a09c40292880845d4370f612808849f2414dacc132b44529145e0c66",9.317957166392093],[13690,"2e69380a8ecf62beb71f947f38b247130f409bec56aeb21e5a7303d22e2e649b",9.317957166392093],[6855,"f094433146b6acc091fca31abec1e706044f4e9599ae4a8b65c87e62b7dff3d2",9.917710196779964],[5519,"464ffd04fef2aab09d514ddba78cb35ac4944db6bd6572960141fda385eb20dc",9.917710196779964],[3790,"3161764aa216210d5fa495672c4f54601007120717563718811527138e7b04e7",30.558303886925795],[10474,"04f2bf73903bd5cf22c551787d32f48a398caee4760b85aa09f01631e1ec4bbb",9.917710196779964],[8483,"568ce61bdb9368a48c3c350dd8887414585a1dfbdab873571acdfb64e7c51dc8",9.917710196779964],[68,"32caaf404cc502254f94eaaea3e1b62aa804ed5feffa0e0430443b52b66c8bff",28.124444444444446],[11983,"2c145c1e4a2a5262cd89255bc13cd0df53dfb635e62a7225d5446cb92d316db1",9.317957166392093],[12075,"0a35f6f7e04c4639a4e72e776c8e755ef9676a6a019ebe083c5723c5f590d7b0",9.647446457990116],[514,"83a365ee50e729560ebdb33074de493434adb47507b5e56eb5ed97fc163597fc",9.917710196779964],[6411,"6ec81878d6c71e9c186731eb0fb69e6a3093472039e6d07ae9a298f56c1343d6",9.872340425531915],[893,"689e08306ac215e124bf6468c82c5690f0d7fb0c6d4278c407079dcfdd6ff8f9",9.917710196779964],[16722,"5c27ac614ccf54d385bb89f2caec93ad38f7d53bdb293387303e3bb298920958",9.317957166392093],[11807,"a86fc5a3e2356fa82b14b45f1919eb0e76d9a8bea9d791eff3fe419121cbaab2",9.317957166392093],[16720,"8ab1afb36b56326558cfbdec0f6a1a7ca4378851baf5a756361a5362762b0f58",9.997888067581837],[10671,"a65979279a343b60174b3e8746912d7f3b44cc637068b81d221d14517c1339ba",9.917710196779964],[5956,"f17570b698da0152c5d1d9c2a68303b42e2324c3366cb5f36338e12830fd62d9",9.317957166392093],[10054,"d31fd00dd640d5d651b9dc98d91753e9e48f091dd1d68ddea1b5a37bda1309be",9.917710196779964],[12542,"5db45bc797bdf24046db8a8c8f1cb38a307d47b69ad851cadbc144a837faabad",9.917710196779964],[16887,"422c2158a0493a636ec95943a6e1e4cd1108407c14818d8cc6f2cfada4e28054",9.317957166392093],[7277,"f3cd65206b6fb9f0bbbdb15aa3bec69f046db4343920526ffbf2cb37ceb22cd0",9.917710196779964],[16956,"fbee9e2dbd754c3b0175f3a190e2c53fc86bfc4220875abe3dc945a51c010a53",73.19778188539742],[7045,"f8772ad6f1406373f29fad816d9cee6cbba8be0f70a95becb1b324631a5ab1d1",9.647446457990116],[6130,"5260ad24bea2474ea0d5811a7aaee6a8ccbc065725ec4c30459713e8317942d8",9.317957166392093],[17092,"7e603e9e720e199a9b7edfdd8ea4355c001f2b829b74f9ccc66881f4cc121250",10.052724077328646],[14795,"33d58f2f9d5cc4e7ce96d4c96e06a72ba512c53ef790cad86527dfae9b810983",10.052724077328646],[17368,"2c644774e6c3af82803748ef56ebafeeec1bb39eb56040f326a362dccbd5884a",9.317957166392093],[17744,"22b8716874941f9b41197434a15df737734b69d8536c790faed58fda896b4e42",9.317957166392093],[12278,"e8ccd51993d3f01b18795c9eef76ff214b9bacd971fae5a301a2be00ddc26aaf",9.917710196779964],[10687,"8bf3f64ec3e4da49f72029473dea83960a7f6168a97693a10f9ce2a78e9221ba",9.917710196779964],[15971,"9a9561c5896cc140e9c8e72cbcbed84d21116d73d823b5d5022bd94da82a5f69",27.302570863546475],[10853,"cd7fbc4757f528240edb0d6e2ff42a4b6fb6d5fe1979df02d765380c5005feb8",9.317957166392093],[7134,"8f75b1346c19a8f5563acbe2efb3a9fe5e7d763d16f8a1da2900647ff72b1cd1",9.917710196779964],[19534,"24bb4a607aaa0818d79dca8b8ef2e75e2d1c68cf1c73bee3a0079ed04ea1520d",9.317957166392093],[3926,"d59c0224a47ba8a8c62d82b7f9649a8774c781c64a6bf984ab083974e1d22de6",9.917710196779964],[5854,"e0822aa2326f5cc668f6b36d0be41d0765551443656caabdf619b9063d58f8d9",9.917710196779964],[12758,"9a50ba9a3083e7e5af1696326be835c0b6ea35dfa14cf3b8cfd124b63e0a2eac",9.917710196779964],[17718,"96388fbb91ea6a6affecd4a6d8a9dd53334ff412aa43af0fd0fec70b883cd342",9.647446457990116],[2857,"097a730e2010ee29aab7453eaca43b31e662c602d0011cb1f1c544fff71658ed",9.917710196779964],[8678,"ec84666f59878815de77268a14eb3515daf6440d9482305a686437e384ead4c6",9.917710196779964],[11256,"025308dd0225631bfb67ca29724045d00c0a76dab55f6d0ebc071062523c50b6",9.917710196779964],[12674,"bf9075000030ba388cc801d0efafc59d912165f9bb9c74e485b0aada5c31c5ac",9.317957166392093],[4737,"d93b22afa047480946328b3f882d430cc783cbce50468fe4346e2c58fc91bae0",9.917710196779964],[13093,"d3fba4fb2d65ebc86dc0d4912f326206b51039c661bb687d0d3416365e8ca1a9",9.317957166392093],[13392,"a49523778d6396d7a5e92bee6b9ba1d8e5db736e14689b3eb981ad060c7b84a2",9.317957166392093],[7734,"b10708ec88c07a2af901cd37aa0b032eebaf8c61f45c87c59c1060c6f66a44cd",9.917710196779964],[13003,"23b92ba218c3c4a978559a009a8203798fe2dc08bb02de3591661bcfedf596aa",9.397642257991386],[9669,"8576af7ecd69510981f62efc29e755d95dea0e059811742ac547c140f9fe95c0",9.917710196779964],[7424,"df3335281c6152775abc5ce5567fdb8c120ac2eaf47c94b76c976be600563acf",9.917710196779964],[9110,"8aafd697b4bfbb8eecb1952c0761b6978b8caa8659cc84f86ea6e784a28a15c4",9.917710196779964],[7683,"736ba3b5a377fbeb15f185c3ea34fce236097ebd15aec9fe65a756962697b1cd",19.198031980319804],[2500,"35d8514004d9e1f327578b13805930d44c97f98918aa201c17d0413c3dc6d8ef",9.317957166392093],[12997,"ffc9a28160357bc09b577545bc174fb9c2c60c90f3be6a227f09b3e3bb499aaa",9.917710196779964],[19690,"b55cd9d6823b8dcd2d8c9a38c1d1dcb46437cb645d13ef9d9d0ca4d01fd11607",10.052724077328646],[12221,"5596ab4b7c684c324d520129f5bd3f107c2dfc86074597cc1f276cfe3370f0af",9.917710196779964],[15319,"aee38756fa70cc645702c760b9fa6f1b66714f7d469c08cdd8be260e0aaeef77",19.225352112676056],[14531,"d6d39abf1813c39dc9e900f0e1777191dc43d64517f32fcfc5810d9cf9449788",9.317957166392093],[14497,"97ef271a3dd467a4aa48bf33219ee50ba5f4534d61b279c2437d538ed8765389",9.647446457990116],[16263,"9f8e7188fe1abcb5f549e95e50ecd55934fb6282d0b78270f6223782ac281d62",9.317957166392093],[8410,"f75383a5a7b0b063f57e278a45414525d664dee3124bc3f88cea1c909a968dc8",9.917710196779964],[4932,"9188213449d3a19686b3c4364ddc0e6491e14b5fb5762eaa9f330d5920ada2df",9.917710196779964],[1248,"9a4d4140eec874014231990eca5518fde5b6d8b9fee2e001b6d24b74d8f1b1f7",9.917710196779964],[9756,"34f0239d2d87acdb38d78bbbdc0583d4d3176e629c023cfba9fc6f723f1ff9bf",9.917710196779964],[4330,"d27d31a19673360343b50c78f78d7f9289982cd20973911df973c3897b5292e3",9.317957166392093],[12058,"217cd00efa451ff2027dfa9fed945f208f23bb7605f95d8658ddeb6f616ef0b0",9.917710196779964],[2040,"cdfb1159ebff15f37ddf2ed4a29d676d695ac4fc3648c930a94d387a3eddb4f2",9.917710196779964],[8999,"164483ace61ca56f8c8a2ee040f7772bd6f704c671fb60ff856d9145dafdcac4",9.917710196779964],[11867,"88df8808df8db8b34c85044ba627d4352f08468c2831d467d62d23d54dff46b2",9.317957166392093],[18643,"5989a8a6e3637af5f3ad3b1f6bddca26a4c2ab4b251e6e44c999ebf5d5890c2d",27.317073170731707],[1389,"9be87376b343876a0066b9c5bcc24961dc6b6a11bd795996888737067e09d7f6",9.917710196779964],[4016,"c98162ad9961f8d7201a200996c3bb833da03394d3a47dbcdd3caeb7d768a4e5",9.917710196779964],[16257,"c7c6254c292d05b31126b402b2e34ee2d6bc6e526f76e550ea775eeaf9cd3062",9.317957166392093],[16216,"90ab13776a95257b394b2824a74cbd20aac55abf029a5cc395c58eca2de67963",9.647446457990116],[16869,"c8ba45b1874c8c477c53fcf29b5b151d69b0d80877391d5f7e0927b52116d054",9.317957166392093],[14882,"de97dfea9d14aea57ada8ffc1345d2efe7655f27cbdfd158c16417cd9bb51e81",9.317957166392093],[5045,"0811328140d30238af72d203f79da4793baa3212ecb36ea277626120c9d9e9de",9.917710196779964],[4536,"0067a577f6803b084760371acec75b2f58d84a834aa59c5af0f999562e1221e2",9.917710196779964],[19515,"2fa76de1925473d46abb401f304689065efe834bd5824d8436b1a4258773e00d",10.00131535679053],[18672,"6bc6c0668d7ba9a35c6facc0ea799ef46aa9d6d5392adbb29f867a01927cb42b",9.317957166392093],[12335,"21956e787470d4d63e2386340f5b5c656a05baa2d65b5e04646a3ec9df1b00af",9.317957166392093],[12671,"83168072fc2dedc1b78baeba09fc4099ea9b1c152c9c618d421cd57b741ec9ac",9.917710196779964],[8964,"6fb6098edafa85e521c429434bea73823499d23e76c874ec57e32ada13730dc5",9.917710196779964],[5875,"1c83f80565d30e5315ac27750aee480367810379df9b36cefbb0675cd680d3d9",9.917710196779964],[15342,"ae9f14ee14208418c8916b5057f966d45136594a195f2eb5d2dd665394918377",9.317957166392093],[554,"d82822c6ae3a1641c11c0708c047a453f5ee0679a4ec5f125fe6b80ea9953efc",9.917710196779964],[10396,"76515455a1026690b07a6df48e200a8cbd8ec6c9ea92dea7c1e0f6c52927d0bb",9.317957166392093],[4758,"9a610a65ecd12106bf0dd25f1466be3b39ca47dd6fb34157f394a74bdbb394e0",9.317957166392093],[1164,"11cd246bf6f26f12fb9096fe4d0e9e734260f57c83f4eb1260c2f67b175c2df8",9.317957166392093],[19828,"3b53afe38e3b22f03bcf01bd7b940e27be5011e12321795796628cb760a09801",43.95744680851064],[10529,"442c59b72ca7c08f42a68608c6dc64fb8d9eb00c1882ed521d2ebaffccc2ffba",9.317957166392093],[10861,"9618c9db70bca1469f66cfa2966b2a83005b1957b9ba4a2822cf8c821dafe1b8",9.317957166392093],[17052,"f74be15aeae686cedc35f0396dcb8bd73487f630a220b9a0392798faed990d51",9.317957166392093],[4807,"2c9fa28b104bf63c2564525a0640e96832f5d7edf72e53bc34a6da683d2b5ae0",9.917710196779964],[10076,"3af19f2b81bbb9b151a03a3404c69caca622f821451d5244540486a6140bd9bd",9.317957166392093],[16445,"ba35bb15fe5b51cf1c916fae52c7f00ea6fef603d5a4fd518fda1cbddbc04c5e",10.052724077328646],[13018,"f308ca72c82e15c4290ac4548e4b5fa00a9553d6b53924f36d35ea1141b075aa",9.917710196779964],[18790,"7929668ec73114897ed74cd891b00c7f003da5840f26203607a148168fa54327",9.317957166392093],[3197,"6115a4b9a9440695a3b39e54d61e6f058004e7489e7e4e9d230010a9943111eb",37.39153439153439],[11471,"2627821a6b0a0dcabfa5e24571b0e443ef6da2e4861db1b57c0d0cd31c25bfb4",9.917710196779964],[10446,"d057b27cccfcfdeb2fe9dba1e3b2fa2895b4aafcd8ee7c4d53083db674c170bb",9.917710196779964],[10329,"fcf2813fd4362127306324b829ad031e6fd8fe986fc18cb842aeee3c10bc26bc",9.917710196779964],[8159,"9c0852ae32766a7ac18cf838fad915d446fa4781df7b21b652f9c5b218c747ca",9.917710196779964],[16149,"06b59f36846244064311444d78450cbc0fdc0ac7cc571615574ceb1c817e1365",9.317957166392093],[11328,"620fd4938f34dc586b87ab0b84851facb9c5045e222338e74ffce3e136adcfb5",9.317957166392093],[10773,"0f452a1626fb1532c8d726db402ff9540249487ebec309d6f7ffe86f452179b9",9.917710196779964],[5588,"ca6e4abf092e39f92509ef32af9d6239a4c55a1b03ade1863b0fb9500196afdb",9.917710196779964],[816,"926bca04e92f65ddce4277fb16591b988002065094712e2c3698ba87dea870fa",9.917710196779964],[5798,"83be1ac9b78e5e97dde9583f7168fed89aadca2c26c3836e739447ea0c7072da",9.917710196779964],[10626,"08930b7aa1956554d9041a979150d9894ef2c8c3dc3ccb170abc226f7f3685ba",9.317957166392093],[7845,"f9ab1a0d55bf7587ad7e1100d5786d2a4a0211d55afabe5746964b23050587cc",27.139573070607554],[16594,"09dd02e525b79e13addc943f3dea10407fb901c62f1ef583ebb2979c1366045b",9.317957166392093],[8944,"ab035034c90cfb77024c4232f7cfee6820dd6b56a4f3cb97bad87701c7fb25c5",9.317957166392093],[10137,"2b02abe9ea054bdaa664d4974c1f1f60928f1e3f283dc9b0d454a745ee1d76bd",9.917710196779964],[18081,"ac2f826d694bb8ffb0f79bd0e25d05ced0af2ae00bd6db6c2728293d7130813b",148.90330552981155],[10021,"3f5aaaff80ccf3fe5a2959cb0a0f4196997bef6a09e87398b5ced73a909234be",9.917710196779964],[19868,"857aa80220def100bf270a799093613c2150c8a978d360c05431c8f409e53b00",9.317957166392093],[10494,"2a1991496af3797119bc5ae709a93229a6caed1b921a34cc060629ed7a3033bb",9.917710196779964],[17766,"2f08948f542b3c3a9107f92d3fcaef56f7191294664f582fee475f5510def241",30.894063627418827],[17845,"4c3da7b490612666d50d927cd80fc6164460327bfbe003d632e71c6f847b5040",9.317957166392093],[13320,"81e6e794943529c7baf184afc07988f4d44d853676d40302f6b194f3689339a4",9.317957166392093],[15210,"f4d0fe199870d0b7df3b33b7ed4240b7c59f9a8a58b5e5b0a1bb7a64cff44d7a",9.317957166392093],[17677,"fabece26506fa8b5df40d36ad37803404bdc0420df27b38c997f71be04f1a043",9.317957166392093],[14052,"a80bd959ce19ef468587c67db49c57fc918b489acc9174c753979f310647ab93",10.052724077328646],[9958,"a8caa63c1a5ac7116bb6d1a905cda4bf1ead24966ac1f8e1a16485729c0c93be",9.917710196779964],[10106,"af13cda6f74309c0956cb9ee6a0475202101284f7db9fd2b4bbab9b47336aabd",9.317957166392093],[20,"51eee43f4e618afdabc3b4756cb49e4f774d16dbb9d032579027fd25c219e4ff",9.917710196779964],[4772,"d1635c1d1ac669dad3bb4b179fffdf7e146e6a170bc72cabc190b7594dbd8ae0",9.917710196779964],[14341,"8e62acdd6fc026f06418c0809575e7d959a9421008f98b560f44466cee28808c",9.317957166392093],[4578,"da952c235257b92d66bbd87a27b35d88806965066b597a41dd79dd468d4ac4e1",9.317957166392093],[14209,"26e7b1f20d3935f1ac305c82d5c4eab26180e75ee2757e7cb9b83a6858b80e90",9.317957166392093],[13561,"fe572677f6b86ea14f944e264603f9ce6bf7325b354384f3b6d65de25b54779e",10.052724077328646],[12780,"4be3b268d06aefa27fe93de4bf1a76be1879e7bc1ff40169fc28ef2036390cac",9.917710196779964],[8070,"265a997600dbcc774af2851a86948476530cf3ecdb9a602b1d9913b3e3e9f7ca",9.917710196779964],[13020,"559733e4f6e752d6b3a5468543a758efe0c8d6380509ac75677bad39bcfa71aa",9.317957166392093],[687,"0b7ee2ee26a311dabadb1986c75d689fb728a37e245b706479d18df57e5a55fb",9.917710196779964],[7300,"06b18a3f0ea8af4418aa32bfcc3fe7299111b42e7b0d56081297807603ea12d0",10.052724077328646],[538,"09a30e1dd7c89edc749d964f190ed8d161795099c93631391788583c26b65cfc",9.917710196779964],[6595,"98c05d96c8d5175b2501306970d451d1eb9935ddd286fd61c59e5db7c5deafd4",9.917710196779964],[454,"7595f63e6ccec884d520415865c88e1bec638ac0de5cb8f7d0e2dcf478a003fd",9.917710196779964],[7313,"ede0671e8053a8ca6d39aa3a4734a71b14008754c53776c5349c8abdf247fccf",9.917710196779964],[12833,"608741cb2165b735fb738aeeb5606993e36e6a5b8e405d1a28fe58f34b6bb7ab",9.917710196779964],[13241,"5a4ee70a52d5929343062806c366e1dff687639d7c276658a481e73ae76e13a6",9.317957166392093],[14325,"f67987e7b75d087687a9e8a917af5ee80c9f2a10431da7d33735286466beee8c",9.647446457990116],[8851,"8bf67766e2603c43761e776c08b3ba17ecff3929697547956ba7f2418cd7c5c5",9.917710196779964],[486,"1d877b343aef8a241a8bc4f0beff4af6d53c38fa7e09d37f027d29f3eb8fbcfc",9.917710196779964],[12842,"42c060dec5e0e71652af393c5cf98174ae8aa6a653989b1a5999d52758d9a9ab",25.338046840477244],[2875,"ba977b15181eaed74393cb49a8916162f4298bd0a188fa7debbc3c21712c43ed",9.917710196779964],[11377,"a10ddc2c7414df90deee63f8aad98841dc922cf973caa36a90d39209fc1d8bb5",9.317957166392093],[11093,"f83587c50f25a9a4cbaf64774547ff0f9b57c3c6cb5c13314d0d8b733b894bb7",9.917710196779964],[11547,"2fb9f54d9c4664282860623dbcb539a652cb3381567e51716edbfb2c7f1f40b4",9.917710196779964],[6533,"e9fccfe4a040fd3baccee4390d7af06cd115f8dfdad4038994d31c81c1052dd5",9.317957166392093],[3167,"d0211a1768345cc382812fb3b47caac0fe5580a37ed8fd328a61fca30d4f40eb",9.317957166392093],[18776,"300ca191bd1ce00b18a8774ff78d413759ee0ca6fb76833e0cfb25aa8264d827",9.317957166392093],[8912,"25092955ae3c8471f39f7d8961c64a5c82a40a24e7fb7f323cca319ad1ff61c5",9.917710196779964],[19173,"86ff517de4251c791d654eb3b3b3ba0aad3f90e0314e5e5b8272639ee0f2ab19",9.317957166392093],[4049,"f87ad32307526095d293d9ad96a8f68f0abaa7593f7c257cc610e36028ee72e5",9.917710196779964],[735,"fa12193a44101e41dbe2c8061fbc2d60762f83bfff30f4ffcec06f7a53ec01fb",9.917710196779964],[7851,"e8b35677d489b606c0c9df478fa7538d0244f475daf4c84f42c63b210e7381cc",9.917710196779964],[12301,"41e81a225816c37058edf4bd1997e8e8b34b708a4e8db433a3aa3d5c53fe34af",9.917710196779964],[14911,"36765d7ccb86576cb1b44600709d66b3a7736151f8dbde5d045744eff2eac780",9.317957166392093],[177,"4cab8161db66e2e3f114932a385ba4836d9fcebbf97e7d441e734955ed40d2fe",9.317957166392093],[5141,"a56aad2171ba6beb6fac205531a2c97c167cbc35cbd56ebd152568a4f34a59de",9.317957166392093],[4156,"9733b3fd107f52eec49e6539ba6472e8aa4bddcf93e053fbd9d17ed4e1d1aee4",9.917710196779964],[18050,"a4c98e3f116f1061c557066702c54af0cd019c9984a00e806a7843cae14c2a3c",9.317957166392093],[16158,"159474f0481e07063d4ba907b063a5d5efd3bf6707e0762e5a57b827f3e6ce64",9.317957166392093],[14653,"529127c3458bbf87c22fcdf693adc23c708b982993d63bfc88fe282cb429d485",9.317957166392093],[13840,"6f246d1786ce1e4876fa271ec375851a1b70728890cbd3b767aa2c46a4118898",9.317957166392093],[11876,"b9963a2f75dfabfe05eaa3f521e06139264b1bda7f620d2b400e403a3f7a36b2",9.317957166392093],[2022,"c3bc9b71396981583c5460400ab054bc6b6ae6f1e3a18519358e98557bf4cef2",9.917710196779964],[18124,"2d8f9f69b2b8db02ef92791658f3afb20dcad86ebf9550d8897a11763a6d603a",21.949656750572082],[3306,"f8777fc042b2b84f7b57156ffbae0a3c88c8cb019420c5bc7c4abb06050d57ea",9.917710196779964],[3339,"9359800a60c4b61a609aaeae31decc5a3e12c28d1d96bf3672aac9df8c4516ea",9.317957166392093],[12769,"b33237e79c639a95f3ba13cad5cbf819f1d4bf4879dd06f516e21ece72b31eac",9.917710196779964],[12655,"84d57d927aaf5b188a69375f0c1c87b3d870656babfb7468de51c9917ba1e9ac",9.917710196779964],[7556,"cc07560fbfa53f3fcb186ed96db577c79fec6fff08793f251ccabb1a91b076ce",9.917710196779964],[6605,"c7e8fb2bbe1bc13fc9f76ca13c74e883e2a0f5daa436eb0371ab2ae214db9ed4",9.917710196779964],[16801,"8452610ed4cbe755a0d33850b08e80a6a49ce652825fd5b7ddfe671bfeb04456",9.317957166392093],[5950,"a0d6cdff73fc0c73663f213574289192bf2d975f2bb59fe3b5aac72afa7f6ad9",9.317957166392093],[14177,"41784fee38bd2685742d677ca80585957bb8436bfdf7e681eb0292a40b4bdf90",9.317957166392093],[1631,"9559f6469ad0317dca06c37b397426ec889b58210b39e4f4057ff5d550ae6af5",9.917710196779964],[10216,"754360263e3293c2e4325e92b5549f55f650c8adfc110f40b0b41a11240de0bc",9.917710196779964],[8180,"8b3b457fd2b4bc281de22d8a457b197f1a93581a731f7dcf4379b241554b1cca",9.917710196779964],[9779,"aaa8069b2ed0000fb6e16719d79d97f08b1827ed9bc5ba1e2eff1c9bc30bd0bf",9.917710196779964],[2471,"7e7bd37fa9ce8ab6ce7698177a1e9c6f08184d2c910161933f87edac240e0ff0",9.317957166392093],[5685,"a649997d05123ddf3c84df142622b1bf8368efe89fc11fc47e3906743aa923db",9.917710196779964],[5723,"39b21952c8e82272fe211660d564eeb09e036c94707ee65a027bf99df1bfe6da",9.917710196779964],[12395,"06087bc213762c92742289ab59fd4507e8063887797aaa0959d31d972b80a5ae",10.081996434937611],[6035,"d0c2dbe5b14cbebc30c720ccb999266c36f5cb620814267c525edcaeba64d4d8",9.917710196779964],[13219,"843193ba0b787917cd6f4ec06b3d3cdf414c29c2fe4f1be0b75692a2bf4785a6",9.317957166392093],[8239,"448c0b2b47f11e3b4dd7ae9e405e99f6515322607d3829d69a9110134accb5c9",9.917710196779964],[6297,"3951f131e7c37a239d750051589e7e2aa43f9c97a226fd9b93573cf8c5140fd7",9.917710196779964],[1993,"077cd54d5ce07aec894fd63f99dabbac0c45eb920b8641945290704055570ff3",9.917710196779964],[19638,"119e4c8db4d1831f4b0873c47e3205f6bda8b54880ba0c341c64fe466e1a4808",9.317957166392093],[14681,"3601d4638b4ac1d80cec4dcdc42791e8af04c180c7f20b33be511ee70e783d85",9.317957166392093],[734,"8137141e7604e628893cae86bd51769694ab9f30a926f4bdef6ebd4a2b1e02fb",9.917710196779964],[19520,"0be72753cb86008343bf8b918ddf4cc3fe857b896aef3d698f329c1c7b60c90d",40.44090909090909],[42,"4482d97d071d4696348157cf91b70a5c612ee36aa2fe177ce686dcaa0b5dbbff",9.917710196779964],[12805,"3b6ee00ea12b1b6a34c29f1e67e90595194c98f340c8891d4397d9e3b446e3ab",9.917710196779964],[13134,"3215281dd0d93e04095eab647a94cac7ad20c85fc963487938e3867c2fe948a8",9.317957166392093],[10052,"9f2d5e6cefb6267d0ce539c8baea9abd669db1945cd0d37ca75f58fd34ce09be",9.917710196779964],[11623,"d56099e8508259a025c7c5a9fd7197810be8d086444af5eee4a6abfcff93c1b3",9.917710196779964],[5893,"919370143dc0fee3e8c251266a00c9dacaad85cd1ff35be49086af6bb73dbbd9",9.917710196779964],[10593,"2141401d58ed5139996d4c3e472f0ff65b67b906df8546c347e38f0cc0ffadba",9.317957166392093],[463,"63e544d742e3db40826102ca6f80d8d5d2025a461c2ca374e19f287e233de6fc",9.917710196779964],[5489,"e16c5c05873b4bae8faf559ac51370fd946523502563e9247373742481bc46dc",9.317957166392093],[19346,"b6666a8751b3c6f72ffd86f968c7f61bafc5ba7cacc4d9db24a1bf59d101a813",25],[12905,"11f7373da34942a1a3c25599dce8d408b7aee1abdf3900048f883485d2d248ab",9.431064572425829],[11504,"4e87d03a290583f2262c3eaae6ee33280e6f1348480bc6d514f0f86423937bb4",9.317957166392093],[3928,"876a77642539ff083cb0cd9a571875f895856767790a70910652dd6f18c42ae6",9.317957166392093],[12818,"5759b041f8a1c4186b0c76a73e1b2211f9b60014108893d573fd256c6d12d6ab",9.917710196779964],[10737,"492fbd5202bfcdc461f2cd5de3bdd7bca59eae3b7706b39e06b52fa9fc26c2b9",9.917710196779964],[10912,"046c98342ebfa13f9836693a130a6edc3852e4a021795ca6412a49222c169cb8",9.647446457990116],[9788,"676977a1fa6731e6626dd2bfa86623dbe0128c89bbe3b25f36b99aeeb00ebfbf",9.917710196779964],[15620,"311e5270ef04813e189897aa00f93e63e03812166a1d8d7a556b9eae6a59fb70",9.317957166392093],[11685,"1b48b2c1592d3d7f81691f967d7e447134750024ff145d8e44e1a705926165b3",19],[6087,"18d24c5ac742d133b449bf4871df7ef695d40d6a7545222835a868bdb35f76d8",9.917710196779964],[16714,"0549c84bc21e6976b438f09ed30db95fdd211937caf474906de39fe452b53958",9.317957166392093],[990,"b586101025e045a5bd130a731de999abf543d333f07adfd850b23719d3a746f9",9.917710196779964],[3301,"84881811b81b86f3f34c0ad4e9b2c7b81c65d7e0f9d3a40c1af93b3e9d8565ea",9.917710196779964],[11957,"0fc3ab9432e238c48ef9549b2f7128b22d94d4212cbd650eeae20544bbde9bb1",9.917710196779964],[10562,"b745f4c6ee721b448af8447c87474337fd3a7b2327cb8fee3fe8d951e70ad6ba",9.917710196779964],[7659,"7edfbd7181b03bcad226136a72f6abd68a5e00361e5ce4582d8037519512d8cd",26.031901840490796],[2143,"b1c238f6a4a1a5658117dd00ab10847db03ab356994210d214cb36f8ace5f6f1",9.917710196779964],[1482,"d735cdac794f838d062a82029b511aa946015ffe6ec666b57d6a05211a383df6",9.917710196779964],[13372,"f122478fd4ded88aa3b319306030382ad8dbe8da29247271ff52d41698da05a3",9.317957166392093],[7444,"f095b398e2367b44c04e16ce0e8d64fe3a8877f2884f84bcf324c634edb61dcf",9.317957166392093],[6185,"d318bf75ef89c560e83a39fe5036c6da29c8568c473bee2b14ef1df03cc0e4d7",9.917710196779964],[6738,"d4d3de10bfb66fc2aae4956bc22f0d50227e12df5e3b15b86a56896f8262aad3",10.052724077328646],[1213,"c051d66ab17cb44edbe97429d19544a81f03e4faed579400afef3309b1e8eef7",9.917710196779964],[80,"53c5eed4531b2f3da8c6e47cc9690bb6a1d506c6e7a6c5a2410b004ef33779ff",9.917710196779964],[18028,"cbf5aa79ce87b18cf46ea89fba7734fd48056e3c99470aae32e0c04b122ebb3c",9.317957166392093],[19064,"43b386d72a98efcf32e47ce46a14dff5758f85fb88ac59e88247e92b50741d1e",9.317957166392093],[2993,"481931f103b5fc41b0f085ffa9c12164e727cc904f4410df65b22d847daf54ec",9.917710196779964],[16004,"ceb2664c9388ea45c69f9ae61041aeb31f23d8e168b53effabffcbc0236b5e68",9.317957166392093],[15714,"8fbc646c9d638555885bf726fd3e5678634adbb0e00204a81251aff99bbe2a6f",9.317957166392093],[7177,"c7a34632dcb3b7823ca7437dbd5a87f59ec23cf99033138d88e16bd21128dad0",9.317957166392093],[16068,"f4ce5fa7b5c314b3011a12c7d79624730292b44c73c843a739b956656734f066",28.06746987951807],[16295,"5297e3168eb93d697d77eb6962e7c2707cc9c3c6cf879c38145d0eab76d53f61",9.317957166392093],[5880,"ab800139e3d3b6f3fe3d32cd3ebb5f961c185826071fd7670e592d19da1fcdd9",9.917710196779964],[19213,"4bc38c4a93d1446786594ea05682640e6e9fbe21c0cd357395da3040e7d05b18",9.317957166392093],[9808,"930d1ceae5c53fc9c29441972a0a48d96e847bf306b36cd9cdda304c920697bf",35.85822196397444],[19631,"0c810d200e525b4060a4eb67f2d3cc69d16ae814d04e6a44c5613d8678646108",19.16846846846847],[17950,"401305e234dd1b336692f18fbe3321a7fa5f0a5f242eb97790e6cc773604463e",19.100884955752214],[14643,"8ef38c05c63dc69ff95e47c37319f120e1043c7accc11e21a4df3c597b4a0b86",28.124444444444446],[17016,"8234b2ebac190d8135874857eed3056672a86a614cf816ba91132e48b6a4b851",9.647446457990116],[3630,"7aa4dbc1e4e0203b03a1fa9977188951022b61bb945e2aeb8d3e3e074c9d0ce8",9.917710196779964],[9987,"aef78239231b9743030e5011365dad3487f711eb2301f2359d85a1e4363567be",9.917710196779964],[9400,"2dcace3f321ab1f27c1c9f8fd46a83725f0b244f2440a73411ffd336d94846c2",9.317957166392093],[16867,"08596d4043e6f743595375c1dfdd045c144075a38ecc2509b5c85bb8508fd654",10.32],[7622,"f2628c2b701d4755c30f0a08bf329f723084587b620ce8fd0a2d635ddae515ce",9.317957166392093],[11564,"a9355a10688d0e9b3daa8943f2cfb26218de0013c19886aac1ea77b1158726b4",9.317957166392093],[8220,"d96341acbf0e26132b627a699f919d72561c390aa68774006d67ad57e44ccfc9",9.917710196779964],[19565,"60d90489ab5c45bf7ccf63a7a3d51d20acefef618bd1c252bb63838c2d31190c",9.317957166392093],[2353,"e823b5c51895828243fe7552575f5ca164a97ad2481069e273c52df9fc78b9f0",9.917710196779964],[14932,"1230de14ba41c69f307e217d0072dbde6741026126f218f384ba887143ea2280",20.064308681672024],[15510,"7fd62f8f8fe25df93ac4a5fc54eef90a1616312b8d22799c0b1e8690d620ed73",9.317957166392093],[17445,"e63d327504d8c4b011b863b99cc72f4f5d87e85800d72b828fcbe846b884cb48",9.647446457990116],[8764,"001a9535a3917f09928bb9ff1f8b23fd640e18281430fc23ecf26206e88542c6",9.917710196779964],[16763,"b8924e505d46b65b8a984bd5cfd735d16c8fdb930f60ba6a813f97bd75d22157",9.317957166392093],[5320,"35f23514282381d3b2acb9d7ba710d6911fa6a912ebc70ab6388a1ed2ee94add",9.917710196779964],[16247,"ec968cbd2f7a8963dcd140ede4baac378ad30489a55d81692626e64cee968162",9.317957166392093],[18494,"8ee9d38b6ffdf509d93956fce93aaed9755fd8c63d34d66808cb820c301f8531",9.647446457990116],[1217,"f9c3e41bb2a4d2dd3997e8c39557a3f0d7e74dfa465091fb5c0b88f3fc33e7f7",9.917710196779964],[12057,"0950004719df2bc173e49d885dca0afae77e6facc2c7a7d49019d659405af1b0",9.917710196779964],[16573,"48b94707cca592eb226c8dc70fbb9475fc972ef6be4ccfdc93de8e340877a35b",25],[10049,"7d52f36a1ae529c41b5386386768b81939bfde5ce1e3ab11a5934b385b780bbe",9.917710196779964],[13349,"7d35876ccd1aa20c56f6521232bf8e5a546085e6c34065489390acfd1a3e87a3",9.317957166392093],[14217,"fece33ba798f6a559cbd4a1d20f5bff8f08d818e8f9ca729f68857c090cbb88f",17.964444444444446],[17289,"239865e6c448b2afeb4517c18b003b2c77d6501e63ea985121c7295592f6674c",9.317957166392093],[7207,"9fd5b97ce8fcbfd2aad6eedc80c1b76965bae41fd7d2ba4120ae7c42ebf3a8d0",9.317957166392093],[18618,"d3c3645581bbf320a07d5b562ea25d4feaeb3a33f6beea440072b3a5ae1c392e",9.317957166392093],[18062,"31e10a9e1d156d5445b8170ce8ef371bd8e9cf81551296d61738ebc6e3f1f53b",9.317957166392093],[7164,"895af03a8a99ee518a2f3f34981959d9244aa04874fdbb9897f449002b64edd0",9.917710196779964],[6710,"1e6842b6a68a5581dcbbfd65d0ced892c4a55256b0387bd522ea09213156e1d3",9.917710196779964],[9620,"b1f8ef4194e1d14bc4e6a13d6a34c38b204ee58aa30c9da163d5d4f7adf7e9c0",9.917710196779964],[11008,"69ebd5b20cfecf57e3f88624228d7dec560951d0e337e403299efd0a0b57f1b7",9.917710196779964],[3036,"4c98deb445e532f8788f5f4423d1fd72a4bbad54e822e7c4d77116fa1b1012ec",10.052724077328646],[5528,"fc7ed1b59ff309d49ba2b17ab7a611c411f101282660afb6473bf761e3380cdc",9.917710196779964],[12106,"a087dd94eb220b1ca49dca5c4b0d11fe3121252b7b18b7b84725b5db8f26adb0",9.917710196779964],[8106,"956d5f0d472af234e71d7fc146765c91857a37efa5ecdfe455efe2310796b9ca",9.917710196779964],[7050,"d8caea9980350e3d41bdc3a2e2991aea371354747aa2de4d0f2b0b2b1648add1",9.917710196779964],[12975,"9320d37f51bafed0df35c4beecfb549928c2d64b36f8bff8926598a7284abeaa",10.052724077328646],[8064,"73525035abc2cb7214909b0ab2cabbb97ba85537aed3ca92e002ed26945404cb",9.917710196779964],[4493,"819dfae6640ceee285e4dfc1df6e82a17c9f7023b391736cbe318e9b55e473e2",9.917710196779964],[9588,"007daf0ea10394ea69dcd446d913d22568a28e874e8d421e9fb952530d2410c1",9.917710196779964],[17506,"f53f51095d4c84be377576ed7af719b89df7dd92a05cc6fb35388b9ab5895a47",9.317957166392093],[7384,"be8669b6f9e2cfc38b9b37c9bd96edce045de686779184dab0895819ac6582cf",9.917710196779964],[12570,"3252ef3d1390136db229729e518159c068b039551076e24cb980f7022d2b74ad",9.917710196779964],[16997,"5123216cc6c5b34745c1bb8bdbfb8dbe2b76d7935ce279862608f6aa27840e52",9.317957166392093],[11657,"9cfde9d4fc2e9ce27d2b63dcce5433572b911721b943d1745724a0f4536f8eb3",9.917710196779964],[1104,"751181f823bca2975397e57109a0d834ff66279c518116e9628af06fde3788f8",9.917710196779964],[15253,"1124953e2ab7957342e7fb28e41e0f92c753a76abf33ff6259adde263ce06179",9.317957166392093],[16128,"9ba924cba0dcfe149365d2a6188ea060a3a11cfc18e685e7856e85517c7a6e65",301.60427807486633],[985,"bcc8da5025e64125366a8a992b94a0654e6240e5663386c34b337a15dcbb4df9",12.064171122994653],[8017,"b9125d9e6b3d0c5e1420d31ddeba5e6c9cbb4cc43ea34e8f0031fe0d350471cb",9.917710196779964],[5596,"33d447385a1a591177403fc064eba0b8875f73a56e471687d4a67c53290ca8db",9.917710196779964],[15568,"926420d39811619052c6b64f264e537773d79af4ebf26dc9fa7ef780a2945772",9.317957166392093],[4440,"0cd47f11bf34df93d2a5bf405edd8b5789dfacb7a641300224befd23f640d2e2",26.062052505966587],[5552,"0ec3193127867ae6edceb858e9584d3d9867c73aed82a7cc6a40b18dfedcf0db",9.917710196779964],[4096,"681538cd647bd2198980d2545a6ef2dd8302e2e64f80a853c60509c0c3a815e5",9.317957166392093],[15241,"cf1db71b42066f727e8497b08d666f5f270968c7f819d7de0e899d7ff9c99579",9.317957166392093],[3268,"ed5391b3da0c85f960e79d2ae5092f0560e9da99a461476eddbe92a80db792ea",9.917710196779964],[8008,"08859f0cf32bca1a467c2150e7bc0b333d76e4b08709a1d4eb33a522727b79cb",9.917710196779964],[16838,"70c84df03f5b8cac3566a7890636ecc9e86ee197bc0ab492a196624c388f8b55",9.317957166392093],[17620,"e8deeab5db39800a9342c2340766025082a0dea1844a073778e9f43cf53bd744",9.317957166392093],[18491,"df3c44e30f1f5fa10b0f0037be7d28b35c3f0acb6f329a62f458403902b99531",9.647446457990116],[17857,"e1adec68f1b798a3876d4ebba852931cc7b6f1d03c0f6d0b6ff44edc637e1340",25.968141592920354],[17139,"754f78b8a1d9e8e7aa4f7b3cc7dc02901726721c941b9fbc79d782d8814e504f",9.317957166392093],[2776,"cd3868f87da50a4942f630bd796607d61b7beaf5a9cef7782268dd87b13ef2ed",9.917710196779964],[17633,"d4cd8191ec3da2639d87a46d8c3bacbca6944106230c7d67e24d107341ee9244",10.052724077328646],[5611,"ae74716c77153d896f91f7b8d950286ed6f9b6a10cc19022b5149d2c3f3b9bdb",9.917710196779964],[17438,"863e49f033891481a60d49dc6dbdd755ac4932f3c11816ab0f623e2537eae848",9.317957166392093],[4724,"f115d664589f6b6d93b4d219022961499df1e61633fe00d4bba1ca363921e5e0",9.917710196779964],[5726,"640cbd23f24ffdb7b5d779bdc43e62e99603f43ae6ae1dd49a62c5226271e5da",9.317957166392093],[3589,"1ef6d3f8cbe12e6661ead52842c1a9c33e761ec0eb2e57ceaaf403b125d05fe8",9.917710196779964],[3429,"14eeb2ac834ac163ca44a3e31e4e863dc5a546694e9581cd59ab02b5bcb47de9",9.917710196779964],[7658,"66da089431c80ef1ee126896e17cb4ae2a9e43158c075a09939beb653ad6d8cd",9.917710196779964],[4125,"4b37656d46f8c66b0eaf2d4efdad906e93fe84f5b4bbbec091a850013613e3e4",9.317957166392093],[19469,"a6334e09da800d98ade0c5f580564b05ac060c7edbb9354d34d396c31c50760f",9.317957166392093],[13976,"339e2c6784856d78a524c3edc07bc5a24bdffefb80f3b1a9db171b11fb958595",10.052724077328646],[6108,"b25a04a53e23e22ec59dafda5e1d596eae1f32cde1d6462398593bb947a661d8",9.317957166392093],[17611,"d4fe5106316b2f8fcbba2c2eda8c9b4822c5b6a1dcd99ef32663758d1b8bf044",9.317957166392093],[12826,"44a755bae4bd2d038abf95e4c042472726bd1ab78c8ea3d1e4a84e27f859cbab",9.917710196779964],[5990,"1fe94cef254ba775eef4e692b6269e05d95866304bb4b0c49cedbaf1f30124d9",9.917710196779964],[19651,"7719be5521965612165fc7c5f27fbfa146d4d3f9f599ad4f76ad3b9f3a0c0f08",9.317957166392093],[12456,"550f3af3df80d00458e0249912f28c0b3fe6f2dc830eab3daf5d2b87353d3fae",9.917710196779964],[10365,"82f0ae4110ae796dc06e096fbfcaf6efc7d3f51fcf5fd4dd695b1ae963edf7bb",9.917710196779964],[7940,"1b9254de12ff4c33163f5144079d95aab68474e5d6c11946b228948fad1df2cb",9.317957166392093],[9119,"4fca8cc016aac168361071cf9555590a21403bf72486f532e1335b18ca4d08c4",9.917710196779964],[15464,"33ba69131e408d7e022add5907c62037078f7c7b79adc9a9a01b6aa08ccae374",9.317957166392093],[17528,"57f549d54b7c0d03ade8b81c02bd1a1391404f3d51c7b46f94e4dc744dd4f246",10.028818443804035],[17462,"07625e96f563de6566e773bf7b0942e6665859cb7eaf219daaf6c817f1458e48",9.317957166392093],[5183,"6b2dcfaedd8ab838e1e5809963498d98af61e16f85e65084a035f1b12cd512de",9.917710196779964],[12078,"b3839794c42ec469929595fd2b34bf37f304e3ecabe88e290366fb34d753d4b0",9.917710196779964],[4262,"bc1548d262c2d4f697994e758c7bfe9f69bdd817346e70106138f873f70106e4",9.917710196779964],[9334,"36e8b9b90048f73ca91e7d647aef5c4c3726c98b4927b4e8ef60d8d90c90b2c2",9.917710196779964],[8843,"30db15836855c3524adc0f00036890b05733521b5cb702007865bf2744c1d1c5",9.917710196779964],[3249,"6f46e3ea719c5943ecad60eaccc3a95955b606420971286a52a391644121a9ea",10.051282051282051],[17832,"d38c0263fc8f13ab12e1fa3dba0a9a92babfeddfe9a5b9e30811a1b039fb9c40",9.317957166392093],[6663,"ea971d302d76e6b9f8ae3cd5845f90a98c14c1e24f6c097c37c46b0ee0633ad4",17.140983606557377],[14842,"3e6a146a31553980b1e038d5135d8051cd3b0d5d597da89992d101a2fc291782",9.647446457990116],[15475,"0e24f9136a2748d8d570fab3ce1753e2e7b8ced3f1f09290b27caaaf44d89474",9.997888067581837],[796,"173204971bc45582d3f9f706f8748fc8d6ce536fe51af6eed56caab6c9ea8efa",9.917710196779964],[15295,"a0d5c3fe7e93bcfd4789277b62c16bb2595c4feec6381de446c6de5a360f9778",9.317957166392093],[9991,"f7fe124b76d3e61c0c45d4cb8978a51bc6961d5e2d52ac07787f2eab3e2262be",9.917710196779964],[7523,"0138db5acc416af9ab2307d8ead4c327d8f2a0f4fa9ea40cd53c410908209fce",9.917710196779964],[2911,"6214af3c43e8fcd5b5a08c216e00a54f24f563f1c118dbf8005ba8e0dc1902ed",9.317957166392093],[9047,"d9f63c049d8aec18e6a15bef88458d3203856c9bb6805c61fc86f088281d7ac4",25.40463458110517],[12167,"bfb6ee17b91c57e1e8d1cc11a29004ec0a82e512cc9f1cf2946905826d4c40b0",9.917710196779964],[7199,"800f33113311cadbe0b13a344b6594a8d297e658e9c120219efaf293ff28bad0",9.917710196779964],[11910,"61d87843ee903290fb9a4425093fff7ada47724961ada0ea18d49d2e4a51f0b1",9.917710196779964],[12888,"859d173b1637c264e1da89cbfd8a1911fcbcc2ae6872003075d00c0f17515aab",9.647446457990116],[3728,"01a8b72f6479721fa9d82e39c323f2e5e0bf782d4b35b09e1dca1a7836576ae7",9.917710196779964],[10647,"1e10975eff89fd890b8d3f7d1325f4f99c22efc6fe64ac9813019179c9d364ba",9.917710196779964],[19412,"8cad27b8f759d605f947bd93d14acb54c746971a9a3da3ec6f305608a4502311",9.8989898989899],[15968,"56b45d67e10a760e3c48307d5773f07bc4d33efcbb981ced82c06ee3693d6b69",36.948306595365416],[160,"6181e7f2d9629a1e5fe0939432669daebcd273efff9e47c513e5c56aee61eefe",9.917710196779964],[12983,"fd4b53da4ca8a76fa2b541b3a1a2d88944f257f1fea20c01edd5194214b6b5aa",9.917710196779964],[12369,"3108f27a84689a8deba57099f681b26d91fe962df71e532086faa3890d83d0ae",9.917710196779964],[6328,"16ab65badca8a19f5f768428494e85c66bda29f446e0fb56f0532c1026bfc9d6",9.917710196779964],[17035,"329038764fcdc1a0d855757a5f1c9e1c29905b5544271a437cc2a8a2b8413e51",9.317957166392093],[6134,"2216a5286dd0b6e39f0198db647f41e3b9a0998adef2c0277359699cc4a63dd8",9.317957166392093],[7112,"6063c0624ff52ce07015d1b4b59442134b9bafd660a3dc49afd1a6622a9c46d1",9.917710196779964],[16845,"b7c12ee261ff3547c7fd1d9af1c474f3ca6a82a2d9555a162c64831d36b75d55",9.317957166392093],[5280,"e4933a2132c450ac29d308b2d246f9875cb05a7dc1cbc51c7106a0f776bd86dd",9.917710196779964],[3750,"10b27ecf6159f006685ab23d86a5691f69ef6411ac373954c32781868c5940e7",9.917710196779964],[10997,"9b0b7780669ec1a28ae82b51b9b773ca2ad0ac1a576cf4706375183d7f0a00b8",9.917710196779964],[10886,"eb556e752c9470c31536762987725714e0229cd08d719ae19cfbd6d1a1f8bcb8",9.917710196779964],[10882,"6f97131bf72458ade79c32dcd6dac17c2751d492975a301618b9c3710ecac1b8",9.917710196779964],[14322,"e6a53dc0e10efeb6be40ee7506cad7f2761f1d028dfbb0e1efc5a6780821fc8c",9.317957166392093],[3189,"b8aa2c3afe5b424e39046dea1d68476c72b57e6ee5054cb0022b75caf4de18eb",9.917710196779964],[14752,"697b512ebbb5d2e8ee3f850b798f58035cdb96553783a24fd98b437ce44be083",9.317957166392093],[15738,"cae4a81f4a7a0a13bfb01fdb50477fac5e70401c6af958fc33c477668588a46e",9.317957166392093],[19833,"f5607e7f5cfa8782f67e86e36742800de91f8dda6d22474a1dccc27885f37301",27.151515151515152],[9060,"52e2d517c79505a0b9aba279c3c2d8d341abd4a38dfdfa523a2050a5e80368c4",9.917710196779964],[2095,"c6156b62e55bb4fa29cc8ec1a8c64b2b3a4731b51e144811ecc97126a3c646f2",9.917710196779964],[7397,"88cb4da3857c57b27811c620a2ae5d0cb8068392318104ad35184dcf29996ecf",9.917710196779964],[7251,"87eadd74d8fd5790f5a0743351906f5038388c4bc5fc110c644a86bb8e7f5dd0",10.052724077328646],[14945,"0c370965a8694aaddc4f3892bc9933ce5450a9c8e05c41b57fae21a184b9e87f",9.317957166392093],[5983,"a4d97d64a8ed2b3104ac32c7a361218437b998093113f19cb695bcdd439d30d9",9.317957166392093],[12120,"6619edad45b8536c877e01f1f35d23adc90deb4c5957c8b30a2c586c5fdd99b0",34.83420593368238],[3855,"10ea0524e5395be298e06e5a0ef76ec4169151fc5d3c08408788681876f5aae6",9.317957166392093],[13337,"e8af1f49cc1b474cd6bcdb6f2e56c98f8c187d333a2c5fbd4ff43739fbfcf0a3",9.317957166392093],[5276,"0b343d2d9c3f79e2432ac128948021ea28c0ea384f9b16739fb41f1eeb218bdd",9.917710196779964],[7289,"dfc5f298d307538859473328561ccfd483067f69fbcea3024eeccaabb89325d0",9.917710196779964],[17399,"5624d8799075c84f0df4041a65d47d131069d84d6fa20496cce8d4dff5a3ca49",28.14242115971516],[1887,"d0451503aae05f341d6095c8cecbf8c7bc088c4f1947147ac91c38982960b0f3",9.317957166392093],[15681,"9a7f523de054b817f750789d0f7fbd5458d2f2465c16a5baff64c7d7ec1ec96f",9.317957166392093],[7576,"421d76809e57e95be511e8df86f3395f7750139aaf998cad7bec3f9e6f9654ce",9.917710196779964],[3315,"81c49f2c61e6b8d7f251cc3f3200a57d7f195178029218db710832a6c5c344ea",9.917710196779964],[14109,"c06be6194e7a4ca80425a83be23655ad6fee538a329a40a3ef7b708cc27e5a92",9.317957166392093],[6251,"8d61b5c149787b7f736256895e4b4c4f14e15b02b184d15c46b4dac6d13f64d7",9.917710196779964],[16391,"61d77c4a555d538d03bedbb8c4b6728309f4ff453b927724951cc0bdda823f5f",9.317957166392093],[18634,"bbc565bac017467ec6d1d554caa92bc8268a40de9e6d664847d3daceea51732d",19.1232],[6657,"d1f2a2c5b82447fcfffaac7c5fc6d7b08bb0ee66eeabd9fff95e5b4009fd47d4",9.317957166392093],[13726,"1aae18c043b96f118512649c356f3a86e18fbed92aa6f3876c1f7f19415de39a",9.317957166392093],[3734,"39316bd6e0a65bfd447c84732ac6a8da925b39062ef2fe2ebbd402bf4edc5de7",9.917710196779964],[6670,"869f9c2ca87d57791085ad6fe0d21385ca3e9f373caa74a3d29485a8279e2cd4",9.917710196779964],[6436,"1beb623817a8989784ca94282ecc6462a274bfea1879e77f5c77b66c98bf01d6",9.317957166392093],[13306,"609ae56f8a523c2197d1edbca7bc86f8bdd35d429b0bfbfafa8ec84201b474a4",9.317957166392093],[16878,"846ed0e6c087053cb7a354d32b631dbad0d93bfdad5ad2a90621c900b030a954",9.317957166392093],[4370,"0567b7859b3fde5a8ae2246218299907d808dd6951e813719ddf1dba01b447e3",9.917710196779964],[12154,"1f84c88021a6ec61bc924f520194c9263ce31ebef24afcd2635a6247626451b0",9.917710196779964],[18677,"2d1632e8fb1e3d18778b33060a2cf43443c811caa4c9a0827d2626312b8f7e2b",9.647446457990116],[12621,"8107175e17503c6f1a1a40a4e5446bb8ce3e80fdcfaf2035d1dd2121d82422ad",9.917710196779964],[16012,"5eb2bf46bd6f685bc6253ddd052424b643dc24d6abdf1eb6eb19c257559e2d68",9.317957166392093],[6229,"c5b1f4a702be687b282b7872dd049838aa57e3a3d20c28fdfc08fe2bdb5f8cd7",9.317957166392093],[6862,"0c8f0f7d0bb4d99a4e1ec63b56f49046904ab0a253f836a6eadd1ee64f51e3d2",9.917710196779964],[453,"94506ec1fc85f020555d5394dd9d8108d0a56a02e4ee08623dc9332e616606fd",18.117427772600188],[13364,"db985a9589931e483583c9843f14a0e8ac7dd49a275a500f2d53505a5c4535a3",9.317957166392093],[5314,"7eb5c881cebec57affad9c7b28edff22289ee5d8a55bc54188891a65917b4edd",9.917710196779964],[13470,"26eae290e0dd2b892d835f64ed1929af57681313bcf2635c3654664968e2a1a0",9.317957166392093],[19253,"8fe6c10d171d736efc93fa67d7c683e1b60c859d844a9dcec4b86f73c6be7816",9.497326203208557],[17281,"970b685834e9c32fd90f955bf8020a72c0edd609aaf1730ed2d54cac3422934c",32.46111111111111],[251,"eacdedf61b6d01a55a7cee095556d6df32dc8fd0f25756169db3500203a64cfe",9.917710196779964],[6389,"92c251b4d7aa7d7110b595e8365f792b842a588904bdd43ab7b1d6bd19a065d6",9.917710196779964],[6748,"3a5d0c9e1327b8607f8ca238fc89c6965c894be8b893fe6258185d0a706d97d3",9.317957166392093],[2459,"71cf24e9e9d0ac782d843f55c6b86123f21ff2b61dbda1caa505de666e7f21f0",9.917710196779964],[19654,"eeb6ffd7acbf96f45dc265eaf5ef9038b09ed1bbc005f76e66e2ddcf3ae00a08",20.194805194805195],[12675,"af5af506ae1de527cfbbbac493136ce753e865b0ed89fc7c9f189fa9b2bbc0ac",9.917710196779964],[9694,"3ac5e8a9ebd68d0e775ec005a2848fe0afc6d5c2d87780c5411c8f28db5571c0",9.917710196779964],[17512,"ad0be81970164eddb3305fefade47ac3a4531f9535551e97e5a5c7eb38274047",10.052724077328646],[5261,"abc6d2190172f997f502136fab4a5d3399665239235fd29e2d46cebdd6349add",9.917710196779964],[14265,"ca17955c32b03644f466c9d3e4f23dbee7d091ab0a8cd1bb52604bac375aa38e",9.633605600933489],[14693,"1ee15b91b9eb52cf537633a7b1da8b36fcbeb4429b6f7bb2b2240c334df9f784",9.317957166392093],[13798,"a34799cb2b7c54b57f19e88019426c0bd0957736692dd46ea62719dc317f7199",15],[13412,"276b90e786f04c2d312e2f39954051412a5616310465ccbad32b556b5b7614a2",9.647446457990116],[13608,"b215f66805c41cbad8e2967af65e4b2f63e95be781489038b07ab7128089459d",9.317957166392093],[2933,"772f655d9510da1ec92d897cf3e425934f397afbc1e785566bb0408dbf6bd0ec",9.917710196779964],[8338,"cb7ab51cd78dd3c833088135335f2bde98fb7ab4f5b43b0be9c60c20f91116c9",9.917710196779964],[17895,"8775870a8f83141529e2d55d0e818638acf4d22d2c28d1e3c4804ab7ec9e403f",22.08450704225352],[7524,"6a19a7c0d6c593f532489cc2e7a1e10479733768903088bc31fea1072f499ece",9.917710196779964],[6572,"8d1e2d4a65e4bbc10c5612139d76852271413ef9aed05c45733f216963dbe3d4",9.317957166392093],[6342,"61a603aa486b59f3fd63545fbd44e003f10be4064bc5a7f02c174028e403b9d6",9.917710196779964],[4105,"c3fbcbe63596f003eaf0ceb2b8e02c7bb81e9b61646a91379217ea6054d40ae5",17.008521303258146],[7816,"70c60ba3dbf40f203a3a6a80498290e47fc339cfa3219c046a6bccef8a5ba6cc",9.917710196779964],[4502,"734c8e77ebfe702af79359dcc2dc7848f94407164507101470958a44bb9659e2",9.917710196779964],[14084,"98f55e59dc9bec5cc5691ceb83470ab564b579cce9be01edf58cbd31e2a1f692",9.647446457990116],[1840,"e2f1569a1cc267a787477ffa301222413bdab7628dc07c16ad7badc19dfef9f3",9.917710196779964],[12952,"7c696c743adaf58da7bffd835291281cca2ba7f6cc702163ed2dde403710e6aa",9.917710196779964],[16692,"1b9353025063e67da36d1703a39a23aed646c264e9958b302652ecbc463baf58",9.317957166392093],[16476,"a7c0077adecfb93ba1fbc737899cc01fcfe38e826b562d6904a0c62022accb5d",9.317957166392093],[5617,"1f8576c9c7c5f8889b9f93a3907240c826bf5113f3cd70517d7a6fe3670a91db",9.917710196779964],[5309,"6b3632fa0b8995010a0fe2779b338b5583ec23cb34327c233b573fef6c1f57dd",9.917710196779964],[2512,"f25010c526800577716d62d9f98de424469b7f968a1a88adbf20796013b9bfef",9.917710196779964],[8844,"4b714ceb4d665518c7d324b0abc0d3f8e0e3114e8803ad5b7503a9e607aad0c5",9.917710196779964],[8429,"12e2e31386f97e4d92fc7769b212222309f92798606988bc752a184cd69b71c8",9.917710196779964],[8626,"ecdf736667a75355abe9d35abc3ccc19fe8461c5efcd3f1474187f30c94e45c7",9.917710196779964],[11266,"cb5926ef724458e1c1d3b9699d8772813fa1d54ed8b61efe106fadcb97813db6",9.917710196779964],[1882,"73733e74bc69f4b38fcb40346c691bbca4aff0e447998cc5e823284446cbbef3",9.917710196779964],[14113,"e5d704e432e1b3d57931cfa76906e357775d24062ee8c78126438f8188cd3f92",10.052724077328646],[13949,"d3cd57587a4269b9a70a3d13a4b944b0f124d98cffa8d1d5c3d2059e2f01f995",9.317957166392093],[6525,"54db2a024d19f4927c45dc76d17a220d2bba0a610c14ab0c6caac276082640d5",9.917710196779964],[14157,"2c5799f472ae75b37ac41ad86fc4e0f7c45612c6c31e9e286b95b62005104c91",9.317957166392093],[1472,"891856a82187015aa8c4e7e805065b06e82b5670c6378cd45f69cd81f90456f6",9.917710196779964],[12300,"531c45b2f1cbf8e224ff3df40bea4a71cb6a8399397c400235217eb1d57b36af",9.917710196779964],[3976,"8c16cd6588258d2968b5c883520d82b4e31e6432bef6460037f9457a5e12e6e5",9.917710196779964],[13722,"8b55ef277024e476227e695d92a7630aa1decb31b4697b381473c0fe2f7eec9a",9.317957166392093],[10475,"4f653d6d70b8564241a8409c8c5e173d12f9346d43bc9631e819b94944a54bbb",9.917710196779964],[19567,"f673a57687b00a1b642dc10935a4bd8f65e534c9f046e57ad5e9606df00ff00b",21.207792207792206],[9415,"a4beb95219cbed53f6b5bfd41cda7f58c9800977203c6965dbde97c2fa0e33c2",9.917710196779964],[1342,"d1661a0031a6d4ee57ef50779da1eacd5a11301de604924638ba8436b83222f7",9.317957166392093],[19142,"b9ef5533d75f4d0c354335f83e9c9f6b9b309cc253b5ef522c48005a27a6d51a",9.317957166392093],[9272,"7e80987a33faddfed5d8ecedbc173477f7664b6a5cade861a42a56ddbc7d02c3",9.917710196779964],[9928,"6a05ae67395c8121696a3dc6438e0c02c08d02dde4f4fff9c42864f42002c7be",9.317957166392093],[7436,"488922d385d22709e8a167034af22c3933a868a8b2a7605ee8de0cb7ce5c27cf",9.317957166392093],[17174,"db403c373adeb308f150eae13b775baa244a7b0842c05f11ce9750bda2f8504e",9.317957166392093],[12886,"b13851cf0a5555cede3ecec97f3247218941a7c5af57e483b0520c9d84fc5dab",9.917710196779964],[2649,"21c6e938ae9550bc7717036b6a97f6cdafe4feb6a69aa3f94e0f09092dbed9ee",9.917710196779964],[3009,"32d48ab26ff33e4dfd77dedad6f548880088c4f1a04afe91e16bb76213d33eec",9.917710196779964],[13354,"1ef4e84ca63ba246ffcac11f7198353c6d8b789f98df516c4caa2661db0a5fa3",9.317957166392093],[12986,"d78ced699f717d78289728e760d96f679dcdcf41c497f66639872798b615b2aa",9.917710196779964],[13081,"c33ac19b658e76bbe7111b6a24499ca7cd87aa0f9a6f5db55fea3ae89d1edfa9",9.647446457990116],[14443,"644d3e55cde56a58f64b48d7d25b0012cdb4faf670a2045628daefa4dd655b8a",9.317957166392093],[18500,"1deead6b5e1ea463e9602442108a52c309c797d8afe63b666281c048f5456731",9.317957166392093],[4368,"0018092a0e7fb4859c4842f3c91958dff55f56608276f9d6c786c5be67f24be3",9.317957166392093],[11586,"1213807afab707f1a835b2b93fca98d8b8df86805772d94bc9ffbfd96c33f8b3",9.917710196779964],[12338,"fea64c0f27a12611d6c4da37ae9c99551b9a80ac6a1b5ae30b6f989b25d1f3ae",9.317957166392093],[4614,"5543f791187dbdeb3904a6819b70b79eb0220702855cd27676ffe19e61c585e1",9.917710196779964],[15993,"152bfdc15c411320af8a7e043fdf52bf2a6e3ef4c9da8a7ac6320bab62089d68",30.879807692307693],[4074,"a7f8633474f03952bb68c6dbaaf2c1f3a063be22209b08205ff2b4446a2041e5",9.317957166392093],[396,"035bd1764d43edd90b5e08c8f0fe10fe121b9563ae9e8a1c61605bfec3ab5ffd",9.917710196779964],[15149,"ef37912248db2734701388eddcfb20740fef469a20e2f17b5fc383ef583e8a7b",9.317957166392093],[5757,"5edec677b455d3a1c66d0180a7333072fa248d7310feeb228b8078b6e1bfbbda",9.917710196779964],[1692,"70e7fff6784e58f15974e0fddf702c8447017401915b9bc175694017ec31fbf4",152.67561983471074],[18117,"4f9096ecec062a9a63481857008583a8174de85a88d157ea7bb50f1735f1813a",9.647446457990116],[3192,"ece618230a52828323ac2121049009b364586f42c03b6fcbc66e761368ba16eb",9.917710196779964],[2998,"d6c19ea5f4787b626b09b70eff9df480b9255f8fa0a684c1595b21b71b4d48ec",9.317957166392093],[16223,"138f527519733b66537076b95691e3095480017b267eb10a4776d9808d704a63",9.317957166392093],[16905,"65756cc637910dff32078400ece68c8dd8f4107e6517db07f8d94711ceca0854",9.317957166392093],[13158,"1e0018fbe2f89884f577275fa7b310a9840e360c6fe521d13a889e1644e0d5a7",9.647446457990116],[9432,"d9d5d16eb335baf6f0e1a9cce2aa848e9ff54f139355a69ec1268215065726c2",27.12],[1936,"fe0234353e7d9178d89c38a05ce590d8b65010acd7aecbe9d3ef1b12097271f3",9.917710196779964],[12684,"7dd0f6e3ea952983812995b30df5ce297a00c515319098a9d466e00c90c4abac",9.917710196779964],[13708,"4b0dc237d7c1ea3cfb3d5065dfc3af97ed3f7447ff7c149b5d91849e388e2f9b",10.052724077328646],[10959,"a0b8d8327f05b4330e2eb05558eb2b9bf6dae563668da80a8f7ee31047e949b8",9.317957166392093],[16009,"5a33ad230b9041f9dac402fbbf9adc8d91060ac8b5bf151da5f541b095d14168",22.246001523229246],[9333,"ae53d9f9e7d435064a337513de0c5c5c32c050db253e13cd62d07f17cea5b3c2",9.917710196779964],[3106,"0cdfb63c9b9f546cfa0dd86305c3e2811ab2afbd7d99be07ce8eae488e0f9deb",9.917710196779964],[9957,"58962d329f8d423f087ca875ac30304be88521d08e7287d9f4d3b5495a1094be",9.917710196779964],[6774,"64002a1801ac4b8ce257b650f064ad28daa1f18c06eb8bede97843df5d0477d3",9.917710196779964],[5305,"359b84021aaef6c76c66534ba7be7a2120b9bee817929812488b197d6fca5ddd",9.917710196779964],[4863,"00cfce60abcf45fc1b007240a616861f8da7af85ce4c279929e0425ea1740ce0",9.917710196779964],[19016,"35c20f54856ba816c70bef73d6707be28354b06986838d67aaacf43da010ed1f",9.647446457990116],[18179,"64ae82d2681a92383bd02b8d97123ea21234b767101ce25d3d71b3680099b238",19.50973172014729],[17846,"216573b8eda3eca66ae4780b9b04caa107e44ec741690160cf297e88cf164940",9.317957166392093],[15355,"7d54882760fb3347305b0e6ac478bb79de6590e577c107e106b891a65e0c4c77",17.26984126984127],[12646,"71807d6fa57820418df09bfe6572a81174d7d9e33dddfa0ea019b274507ef1ac",9.317957166392093],[3854,"851ced7fddbe5bef26839f6d62fe1b0a6d69c372c6d2066a902c9d33b40fb0e6",9.917710196779964],[2901,"61686cadfa63fec313d928a09ef391c96e8cbc7db88ffbb8bb9bd7d3df681ded",9.333333333333334],[5864,"6800233067edd4c471ae7ceb9e294241e0bfac592657e2436d02a107abaadfd9",9.917710196779964],[15536,"46501a7b3a42a0950afd96dd78e9173d147fbf96108359efd97a072ab86f3b73",9.317957166392093],[12486,"a017a9ea42f3a2c34d79a4e32e317844e6d0b520af20b920aa1022da969907ae",9.917710196779964],[5194,"a858dae8f04f0ff35d3456b2c8d7fd58a786b3af58643e41863fe7bbfa9705de",9.917710196779964],[6958,"adee7804da16ab36c9ff09f82f06481394c16400dcb51a0e795d95b8273339d2",9.917710196779964],[18632,"5945c441992a4350b1e77aa93dd1b9e2d31365268e5d87a9f07e509f5eb57f2d",9.317957166392093],[4816,"9d5cd2bf2209547747543a24de900739d6e81230b430d66ad91f1e6e4f0054e0",10.013531799729364],[17207,"5ebc95c286f222b887fa436c38f553c5d4bf7e44a0eea8ad9859aa9d0eb4a14d",15.609756097560975],[10740,"fc394b3822907623d5ae769d8a2087b92cf3b7379171b963311557be5106bcb9",9.917710196779964],[2498,"7fd445c399e742963f93ebfc785fbe75d4b7e9ee5dcff79f00a28fea93aadbef",9.917710196779964],[16277,"1f5ce761f97ef4ab81c5eddc374342b68df80513e5a049c084f7f7d611f9ad61",28],[16806,"943ba664afbe14c3b84e5c8609dbd38e54bd4a0cd71b416e9421390352be0f56",9.317957166392093],[5564,"c511c156e25e68e5e18f2ca6cb25266745c426585e8127bde920b5c1ea02d8db",9.917710196779964],[6524,"bab0dddba213134e3f3f2364255b18fc489b48361cf2d71cc2532227dd7041d5",9.317957166392093],[14224,"3f976188d14c179e9951c27e5cd1ebc0192818b2c479cecce92afa7fe1d1918f",9.317957166392093],[1917,"1df3eb670d63636bf4d72e0b57cb5847c5581dd0e14c338185aedcdb1ad991f3",9.317957166392093],[15866,"e0e3db25db9f35a130b611e4f99d659a98db7b2bb6781ac2e8310569043ec76b",9.997888067581837],[6564,"1186c62c301a515222110b0558bbc9ca99a2d82fab2f02df23957753377feed4",9.317957166392093],[10831,"53d548f749f976c6e5e93d486f33a1169154ce922912a612d4a28a3a43a91ab9",9.917710196779964],[19226,"0a40fe738b94dfa4715e88601a406df5b3bef0728bf5b488b34e8deaf172bd17",9.647446457990116],[5343,"60c677e334a37acc6af61e77ad695c96a7276b085285ec46a971ea9c22f82fdd",9.917710196779964],[2346,"a0428c153c2c79a2ea1c3185d734ff1900de322ce08bb28e9b5965912a44c3f0",9.317957166392093],[7735,"443c1c960c2cfec6c3cfaa0d82b7f66c60db5ccbc6360f268b0f1b2e50fa43cd",9.917710196779964],[5138,"d26aeb6ad8978b34d4a5a1995e15e2b9256c2f35be34ba9c729e99da9a0e5ede",9.917710196779964],[3910,"e5cc9d5c2a5414da90d5daf7f85297e34aaa68666c6030dc6d2bc7b23b2e49e6",9.917710196779964],[19562,"8cceeee0ca774f9c851f9ba3cc0feb2c54c0cc4ccef88f55f41454f565fb310c",9.317957166392093],[525,"cf5c2721cc1beb579f1eea69802a34497b2a5774d2d23344275171de16537efc",9.647446457990116],[14317,"199cc502c73943a261684ed504242b86ad63cc5cea0e0d01e8d5b3c269873b8d",36.119261713203976],[3573,"d3ca6972e26ae777c034ad6592dd40612ec64afdd70fddb1736e33d58eef78e8",9.317957166392093],[9539,"5c84457e4307660743e6a7c187c9519646efc574f63f66ac08640a4b0fb873c1",9.917710196779964],[12954,"cca48e6b4e6e82cdd7b3d4b053eb30217573707b8264143b47ba92670ba3ddaa",9.917710196779964],[15552,"a91781c21660dc4b5982ab625c785d1fe930c5eb8fdbe288cf1ee23ee976c672",9.317957166392093],[19050,"4834b668dc9632a0df702a28da346c87abc7b65e6073bd6f5612f99bd2a3b01e",9.317957166392093],[6830,"af23263f477ef8c8f4f60b782d897812e9c18b1d03e6dd9128707571469310d3",9.917710196779964],[7347,"f5d4fdaf4beecf7d25dbdbad29177d8824db7e104e8fb584a956beb10713b8cf",9.917710196779964],[16951,"24f04fc6d66fdb9255d9714be2b597ef717a6e597de72536a487d33bd3b12453",9.317957166392093],[19639,"951865d40f855e3aa81ead7d51c9dbb404889306943a22235b75b6ff5f6c3e08",12.05911330049261],[13283,"58ca3dfbf81cb43f641f7bca3a666d4560d0169c849c8d93756591f0b9cbf9a4",9.647446457990116],[18554,"cdc6f77aa2a9021db5d1bcf3ac40e3971643f2c0071af2eafdd87e2ad6765c30",9.317957166392093],[7552,"6843be57129bfd07e4ddc027b2a31f516faf6a5f5031cdafa8bd3555e9647ace",9.917710196779964],[11908,"99834ac691d623af8ee36e36f32f702ea935e30527a02bb22963334558a0f7b1",9.317957166392093],[19234,"2100e5d9ff6431d6b27fe099efa7f58ebe96d13f5f950da5b52abe7b5ac36c17",9.317957166392093],[1786,"81484e6a29a16df882fd06574eddd68a825c5088506315e4a803e2ff2f5e54f4",9.317957166392093],[15219,"79919508d86fa67310986e0a2bdb7024b1465a58facbe5afca28b6ed6439117a",45.79245283018868],[8025,"598cf4731f1a460f1417a026590b943d6ff5ed5feb531c778a5f6474235a66cb",9.317957166392093],[11389,"a2cab0b9591efbef5bf9b227bf068e07ae248e0320f18e917d6b5334b6916cb5",9.917710196779964],[9671,"baf33310bdd06fe440bd6e0e619bb449b91e72374cf3092f450a13b8eb5592c0",9.317957166392093],[18504,"cb36e1d4c3b6335366d1f8a160979844f6e35e87d95a6a7a4236470d3a9d5531",18.106090373280942],[2473,"02a556167ae23991191fbae88014167983e594b2c9705c8aa73c9ad24daa0af0",9.917710196779964],[9032,"f1ce8b2f49bfc713157a28c63fea8518cd16de831b93489aa2b11600abb495c4",9.917710196779964],[8983,"9e6fd2a69487beabb73bfd1c7e9b7355066bdb01433a16ee6043631f16b2eac4",9.917710196779964],[11330,"09ae38a6b77c1c2fec9754125e0b05cf1aa9825ad4c8bce5105ab3c12838c7b5",9.317957166392093],[17197,"dc8a4653c5898fe7271a16a51d7ae15d42fb514a95a058cb7e123e5c66dbcf4d",9.997888067581837],[11191,"8a857fbaa7a2d831ce12755e5275d59392504595423dab4b543220445e73b9b6",9.917710196779964],[10856,"60d1ba6e0ed93ca88dbfaebc219fe8d636c2cbaecc5af9e96eeb0c9ad2f1eeb8",9.317957166392093],[19114,"992fe09b4faaebb4f4837d02e04f93736367df8a76520c856eee3e2e47a8cc1b",9.647446457990116],[3098,"c14049bad742790e8df35de5d043b3dbd4586a1ffd93aad9d75c8b80c611a5eb",9.917710196779964],[10564,"7589c81ac9db1bf2cc38e6704a77cfe702a3cb38ec4380bec90df73b9234d1ba",9.917710196779964],[11784,"7346c83558ba1040ad3deb05acd06925eff0d31f8740c3716f88097e9eedcfb2",9.917710196779964],[14072,"5a99694e249628aacd89b535f91c9d4937d904b289829c52efa4bdd9dc774593",9.317957166392093],[1024,"9055ec6257986f5b482f79efbe1fef71ce3fbc3db0e73bf14887eb0cf36f19f9",9.917710196779964],[9757,"47dec26894330264202b8334527c31194a21e85e00eeaecd9842713563a2f8bf",9.917710196779964],[11831,"5b2daaa8467f2bcd8ddb1e63cbd60ef8d020262872ea672926a0abdde57186b2",9.917710196779964],[7431,"2613110d926035432bc3a12c141332640c7cc4dc31e2cb547628e24a5f922ccf",9.917710196779964],[18800,"689e794a57b4d0fdebb2e446fcf93b076e1f10850d94e8232ae055fbab66e726",9.317957166392093],[7741,"a2a07524f7060c1b146e7c3e79ae0ec1585c0fd88b9c3f52e9cd11be494c37cd",9.317957166392093],[6697,"05e7edba127f2f19ef905134f249d9db09e446f1e92fc73aea265dfbac63fbd3",9.917710196779964],[7784,"94477921d7808f81c336aa0bb8e6a07055a8afc028d0f8ea8088bf0d9edbe9cc",9.917710196779964],[8132,"f6d96b52eb75f9b66384b8a127742527310259a05000dcd4e02e1bc5c6f880ca",9.917710196779964],[12094,"914293578041dc5fd2621172c827cce1a415ddcbebb637f476386ce0e91fbcb0",9.317957166392093],[11665,"f2b84f7812e3abdf3577ac8e6249122b055e4552ae0d9f9a49717ed22fa17db3",9.317957166392093],[3599,"43aaf64f063a978ba462e19c49bb06934a9c343189bdf9c8d381000d9ce637e8",9.317957166392093],[13934,"7328a1b35abedd74c096222d27753f1756e584a327ea19fb98622a0c3abb4b96",22.83553875236295],[7721,"1baa730bad13c227740ac0a739278f06659a5c3f5349bb12cf532a304ec163cd",9.317957166392093],[1943,"8f9b9adb9d57f2cedca818b022b5eb0b6b90e138bd9fdb3237609632482b68f3",9.917710196779964],[15258,"600a37e1943605c97eb6091705fb71904fda6b7f14609dfbc5c889778d7b4079",9.317957166392093],[12719,"03cc535c497f136f68473798a3cf7ab4b4934b067176ee244b40e547d37b79ac",9.917710196779964],[6629,"30b62e3fa1e0770605e9828ddf7164a12308d398ef4cf03dbc0af5d6c81c76d4",9.917710196779964],[8636,"8e99f37912cd1ce35c3341704f2ceddd9e0a7f45b8ca24abedcaa5fd551d32c7",9.917710196779964],[8219,"988dba81bf2577a2bf41d654e4f02bdbe11ea7322182e443697098bade69cfc9",9.917710196779964],[12341,"3c53c920b47031d467e4d0c04cb9180963bc55f683e3acd3b124c15db1deefae",9.317957166392093],[12896,"530b294a28f92db5fec22caa8ba94619bb8fed8178e7f949e5793a223f7853ab",9.917710196779964],[13056,"c6ba7972eaf7bb3e94a43762f384a2493f7dc5fae6e77e7b8d5b47d9990140aa",9.917710196779964],[19221,"62a7250ad0738e04741e24ba5b63af3054a8b53c971bb1bf90f7406e1d43fb17",9.317957166392093],[9348,"89c6b4621bb6d092b165e56ef07198297205ba7c793bcc381ddd6b875e0797c2",25.97195253505933],[9972,"9d38aa7278180fe4494df22835db2e4c0db0ce15fb53705939796ba922a47bbe",9.917710196779964],[1023,"651e941acae3f6f8a737702913d2a1b8adcc27daab7ffa8f943431fc772b1af9",9.917710196779964],[5290,"df5ecfc1dfb8e2e6aa3e749eae96d567787129cd55e273d176c9b1bcc89973dd",9.317957166392093],[9644,"24d9cb0f68396558bd4c827714ce468fbe53b50def4ad56a10d3a6afbc8fbdc0",9.917710196779964],[13017,"90550be2f975f480a4c30c76df5406ebfd189b1141d4061e02178458bb9b79aa",9.917710196779964],[4515,"6da77b30aae0c7a488ce6161ba033ff2289b79c3c8ad2d6ebd9ac0eb647942e2",9.917710196779964],[15837,"b0b23f4a6d7e57e7e1c95385344dc97dd60635c196a58875aa9926ad6f06926c",9.317957166392093],[18059,"3dcac1dc7916ce8ea28c21275216929a7971d4c521cae52673ff609decb1033c",9.317957166392093],[950,"d50342cd6dd735ce377f613c4f9706e7f3c0c372c5fa5fb6d675bccff0137cf9",9.917710196779964],[8986,"79f0bba3f2816254b476571671671f64f496edf49f250a43dfa7ba450590dbc4",9.917710196779964],[16581,"bcbd4d5d4c71fd9a81a5dfdf08ed5dc82bdc186d734ff044ced7dd8247e56d5b",9.317957166392093],[1844,"51ec4eab2b0ae4a3813595a58f867575dd359f968f4a14a5cb1744c3aa37f3f3",10.052724077328646],[3064,"db79e507571384a109823402b8977c082ab0918dc14e47e4e71f8d1934e7e2eb",9.917710196779964],[4026,"be97d7d3b531442074af326128a8c0d214996235fe8ce1c749b14327d0c795e5",9.917710196779964],[17626,"515ee9fbf473f34c625379f153188e53a24927dd7e53bbd74b30175cd528b044",9.317957166392093],[5177,"32d5d482535f01035a626344ae9a25bb38a736c97af3c4e4a8a11ebe22761ede",9.917710196779964],[15373,"88ffe099ea966cc9ff31c2ac7bef7016c4bf031a35f129aa2c644f3706c1e176",9.317957166392093],[6783,"793770f5cbdfec2b4266e3d460212c909ed75040f3c6a8abdbd877b94d4664d3",9.917710196779964],[3984,"5beb25792b4389ebd01912ebb21e4ad1c9eb2bd2c005102db3e23afaa1a4cfe5",9.917710196779964],[19865,"5f5b901fcb60859384d0c9cf1c5fb487481ab31a5a203356d9246cce39b44e00",9.317957166392093],[18451,"6980d7e5f8742c084970eb372827cece462fda42282303aedf74e4ea2cfa9432",28.558533145275035],[5724,"accb8d0646248ec7bb60f783437ef87efad34e7e04d97e94eb0a1082adc1e5da",9.917710196779964],[2655,"b68f501ffbb4333c9826d00137b1fc59e92ff095cc576ce111f9dae855add3ee",9.317957166392093],[1559,"69aa4368e63b48fa7f0e6a7c661498c7d3ae00003a7919b821884259592fc5f5",9.917710196779964],[831,"b2cdb73fab08c228d737ec344fc983ebef00fd2f737a06790efa08ba277c58fa",9.741496598639456],[17162,"4c61b268cbfff5335000530a031a2bae761d3b0f73d815aa7089a0a8000bcf4e",9.317957166392093],[13775,"428521167c8d0a758aa5c34d74b3cccdc2532964d243f83a55efb8923df6e099",9.317957166392093],[14729,"2369e71ce8abe7ea68a889bd5f6482e988e273b5520cd8fc360da92c840d6484",9.317957166392093],[14641,"d8d1c7987006c797d6f4b3ca8b55f2d55f6736319389dcd63643bb7633612186",9.317957166392093],[8456,"38f370219169dc01e59118d3746af5ab7da7248b0ae8f1bbb18c4cec21db4ac8",9.917710196779964],[1185,"c5e0bdac663b3d186fbcf23ae917fcf569d5f9c6a609335c7be7326cd0411cf8",9.317957166392093],[1754,"55b81b58ba6d1603f0f94c1034fae4565fb1b4a61dd3c1417eb824c4e5308ff4",9.317957166392093],[13556,"684bc13cb8b47e278fa1a5c8fbb16f6fa9ce33bb259395e616a2cad664f59f9e",9.317957166392093],[17988,"1f7356fd7ec92db2bf9ab8c1e1127c681afe2636a50811e3ee44484f2f32673d",9.317957166392093],[6335,"f3250bbb2935b53a64731c3180c67fba85e1da0da37218ef124f2c5c0c69c2d6",9.317957166392093],[14781,"e16bd017b692a8179921f0f055d04367ac235b048b40b77c14661e9c75be4483",9.578580565480129],[2794,"2b5125751caba332db4f14d2683302ff53591e41cf589eb3c796507157fcc3ed",39.13588850174216],[3956,"4a262ec501f6838826cff51fd627c62b97c01c6f10fada99698e67a319f3f8e5",9.917710196779964],[2769,"f51effeea3f318ecde2023bcea54375e13ebdabb4c8d53d091fa519cce6ff9ed",9.917710196779964],[19807,"724c8306b9b1f303e17c67cd17393e82fdbe000021c67cef746d7fc906f75302",9.338112305854242],[10859,"e7bdbfb23e23b7a6aaf473a5e51018585d1d7451801a44c7a5e061d0a5a4e6b8",9.917710196779964],[15919,"07be8f95c214ec5976b562a589b0db0b0cb7a2ad7f02109718b2ca666719b66a",9.317957166392093],[4579,"3441e7fea38700c2f232f62f9a9fc79152a1cc504d0f97fd7209c217023cc2e1",9.317957166392093],[14808,"2662894377c7285054fdd9e441d2536b5fb5ee5d8fa8d73495c6cb7208e99882",9.317957166392093],[19721,"811c7bf0a0c924faab391b5a96ac9fdcd2dc4532ce8941664ac01b44b754ef05",9.317957166392093],[13940,"6f425f3b1e83c72293f80bdd197cc18af36d6b0e56eca8dc5a66db8526f43096",40.71504424778761],[18548,"272d7327a6aa00b90d4577dc6f20c74e06691bebcdfc0a781cb4b8cae7477e30",9.317957166392093],[16165,"a12dddc5dd664c1c3c6fbd5d1a2636d21fa3ee8d1b197b60328fdf3c8b93a664",9.317957166392093],[5971,"04e464f2a382dfa7e7809b554f703228bca99db48cbcc4a68defab5a641f4bd9",9.917710196779964],[14689,"77fb7c1b62ad80ac1a900c73dbeec3caddae67cedc8975efae89368e79800c85",9.317957166392093],[9696,"1ecf628ae64257e53c5918a62854dfaf103634b61d2d7da780b9f149fb5c6ec0",9.917710196779964],[16313,"0737cb7c466dfeff552a8b91bd5fe868fdc68287b3602cc61455de9bb99bc360",9.317957166392093],[18622,"774f12870f9294801d66da1e1c5534ea06f8963b94c174bb8ff2f1963d6c222e",9.647446457990116],[1201,"9d5b0002ada5f7fb325c78a4641c204fc15a54948efef8bf8dfcb3b74b4601f8",9.917710196779964],[11397,"b8ba9a3f79a1551057ce7e8ceb07367e2917adb6d799fa377f8d1d352aca5fb5",9.647446457990116],[1412,"951151649399e7c5cd59b900593e34aff4fc072021d4cbdc40e3dae55215bff6",9.917710196779964],[1136,"3b8f44ff5460a0d587e29c931d86f658fd6d334e998671e25b76ce72974761f8",9.917710196779964],[9008,"8657a2d85398d79615dfe09b1b453bf7098b0f6fd04ddf460cfa0c747a9dbfc4",9.917710196779964],[19046,"8988947fea2cb6abdce3553a8afde35f130d62586e24ffe1b6f89a5c637fe31e",26.615384615384617],[3413,"46422f32e1b1c44c964d16068872cd7f2935d69291815084ff9f187b4dfc94e9",9.317957166392093],[9203,"7fc4b1eb4c08d98e3ef3889de6db4bdb36de80c356dce6a1958d50aec3c66ac3",9.917710196779964],[860,"a4ff43a016968457321213adff90de4844b636eecb18d8ec9a72c11bc50029fa",9.317957166392093],[19760,"d6f113a8d75176d6eae6ab59a3f312943a5cace9c0f28975accced3d333a3f04",28.899115044247786],[16578,"5d3825591a554282ff8809815269cabf3938ea1c4455d7034b08ede54058815b",9.317957166392093],[17577,"cae7833d8426b93f6650b71f6ad3e606e94faae126c0e8bbd93d34aa9b68c145",9.570744449281671],[5591,"26cafb19726a350dcdb49af405be11bc4f430a238a490f776f53e6bcb03facdb",9.647446457990116],[10515,"e399759e1bd1ccc028b3c73f43fed9809132d7a9ec89e9020f602b9450c417bb",9.917710196779964],[12605,"7a08e02c1ee23947561debe7bae028f548583011dccdb38a1df8f04e99873aad",9.917710196779964],[17355,"6be0dec310b7e9b39679e219e5382fa6ec45fda629ee9f56b4a2faf05811ce4a",9.317957166392093],[19115,"c367a487f1d883860750344e69c17907bbad63e9ba3800c499c8fbc11463cc1b",10.052724077328646],[16917,"c2f1105a4f566b354a7a959232d39040e2f59e44e26743218029e50d22fbc653",9.317957166392093],[14583,"023b324fd16ed7991de5ca10229abeb38cd81aded61f00349bd89b1e2dd97787",9.317957166392093],[17560,"71d2f4785fe92003fe9d0278f49ee7f816f17bdc1cfd96daa5cf11d624105846",9.38219895287958],[15781,"5d7a027e5068b60dbfe2085b7e2be63796889c57aae56963a6e4ba0e102bae6d",9.317957166392093],[16731,"f3931a6ac750087fd33c4f1059108ce23ffbd75f2af4cbfee3c696c007e7ca57",9.317957166392093],[11147,"56c421347f35779a411d28cf0f9a16b50da315050d815989e5335773b406fbb6",9.917710196779964],[6364,"63318c2ca2efed019d74aab078677b0b77a67ec3a9d896cfffd144e7112791d6",9.917710196779964],[2502,"3cc1b1ee0b1f1bd4d7373ea1bdfd964b853edcbe23ebf6e64512963ae69cd7ef",9.917710196779964],[3801,"96ad8a45af94a8f37e2c41411d52cb549108c7638d2768fbcce7b21a477ef6e6",9.917710196779964],[19033,"08644f04efe429ce5f002b7627c4ed890a192fbc694e51c68e2e6d3b9185781f",37.936395759717314],[17817,"57df372f07e39a9b9c1fa1c950d4c37dba0e4866da29e78ae34451f79a52e740",9.317957166392093],[6690,"203ab70f46031739a529c36dd5332639550ddca22bf0b7e3eb23d53290ee02d4",25.897625329815302],[16157,"bbc727c037dd417a46855be53c9cc1e702e06af840b2f9d8ae45ba73a36ccf64",9.317957166392093],[13769,"0db8a6aff5eadda195d31a8765ad3e6afc9bcbc5d9010dda1a669df730fe019a",9.317957166392093],[12727,"890625c231d95213ef60ffdde260380d0c66c728c03447912d75906dc94b69ac",9.917710196779964],[1078,"b47bf6adf6ccae27f240c75d3052f829aa3caa0fc007c4216ad2fa93714bbbf8",9.917710196779964],[13818,"6f85319d43207f97dae73c08a0dd57a4bfd7338d15531c024977966077471f99",9.317957166392093],[4150,"2cd1a630cd6c69d1f13a93c17472e4f63984e45090aa9fcd4ee5af1a2e4db9e4",9.917710196779964],[15964,"bdde519e4a10e500dac28ad35d6c199cc37ca9aeb1804a323b466410c0eb8769",9.317957166392093],[3330,"d7724f8e16d65c4e4dc4895e76e1d1d07244325909c6f92b480df9c35c982eea",9.317957166392093],[16524,"beadf096f2ba93decae3677618b364a9463a799401720e06fbe217ab946d945c",9.317957166392093],[19012,"f931587b1edf90e633cb7e7b125f49d7a005ef27e376c343782405b7d7340b20",28.097560975609756],[8050,"e5ef13089f1a115af42497354e2e203350f66ed07fe8eafd8283b75fd27828cb",9.917710196779964],[6248,"a7094058424fb1fe435c02cd5c7cfba6c0c9459c80a7df1ef18b45a90f0865d7",9.917710196779964],[5026,"29b3b6c5f3fc7af1ab4bd6bf51cd5ef73d845e97148370add06c70848b6b07df",9.917710196779964],[3300,"9f9dbbce3fb3b21ebe21a0c5e09b793625a7c652f7996441b0531cbc90de66ea",9.317957166392093],[16342,"8e9de33dee264ca9c2a08824e5fd70c0c1dfbf476a9ee29b8b15f4e697cf2f60",9.317957166392093],[14449,"0f2b3b2d0f7f4cee9c33f5f2b27e3c923c8bf709f480bfb51d3b7de9f0414e8a",9.317957166392093],[5011,"31249d0ded9759ee54f2098943347299c70b0291553499e6a6757269443c17df",9.917710196779964],[5720,"e7f57abb41449620ca03f79be51783a0c7edb66389b1b97e49e689d9368de9da",9.317957166392093],[6475,"2b643482679f7ce437312c96db558ade6d2989d748cb36e2ae697c0b9ad3a0d5",9.917710196779964],[18069,"19328fb68a3ee46e480e1b58420b3664d026386532fcf255fa295639eae3b43b",9.317957166392093],[8116,"401fdb0a9e84195b0fe5116712d3b41ee4cfe88e4830b562a5b31ac2b50ea8ca",9.917710196779964],[2592,"6f65c0071714a57840bc4d001d1eab256004d56636206f2f445b96b7742b33ef",9.917710196779964],[13496,"fbb8fc09b4164a03e6e627ada11f36b67b5f67ebdce2ee7fbc52148ec8f0e19f",9.317957166392093],[5370,"5cb69c233e3b4549ed6f3b842defb144d6aedc31fc9ed160eb035d1000cf08dd",9.317957166392093],[10887,"8ca29231703d435d2964a936bd31d30c97b2d3695856b565f0b2dce12966bbb8",9.917710196779964],[16140,"cb11a153117a43f9dad9f3b4a00cd571750e79994ee4d3119565a697e7f33765",9.317957166392093],[11248,"131c5686ad8a63a0a28d2f012a5ed2cfaf021c4cd375ee1117e8d8f0afc85bb6",9.917710196779964],[5263,"fcde135a3869ab803b834475340c3a774f411e711500e73793bd809d506698dd",9.917710196779964],[2342,"0550055786de8129f2edfc05de7cf441f4b53643bad7fa94abb6bc584f51c6f0",9.917710196779964],[7575,"b4242f443efdea56d2082156b3451eaab23c02d724fe543d7d823258dbc955ce",9.317957166392093],[2192,"3635b1f6186742b930672e5a0eaa88802f06ace40dbabc2d5d6dc740a9de9af1",9.917710196779964],[16163,"870753b2a09f0bb70a5622a41cdd8d41ff7de7cf583e87f428c32698a8bec664",36.143540669856456],[3281,"f7617a4424d1759e8f5ee87815ce23c6cb1fdadff6edef37a4acf381e5f083ea",9.317957166392093],[18253,"178c1c61ee388afcd3c60b7749ee6df78d5ef6a57805de8e8ef660de77e4fa36",9.317957166392093],[5337,"08b193eb7914c7c5bc38b14e35e6a9f5f5341f9f328e6f5cb94ec3d7a0bf33dd",9.376589215256466],[19790,"281dfb7b2fe8bade80add2d7026c8d7c84566a6efb06421e624c33c4fccff902",9.647446457990116],[17859,"7f821f1f2837d5d584fbc4b00b22512ae8219d5776ff6143b24f41c2f9550740",9.497392881432782],[7129,"a680f951a7436cb3e8c1af6f4e452b57975cdf6889f5522c3fd4cf1ab9b120d1",9.317957166392093],[1938,"aa17b0b77f8efee4f50d91a2e4dc493dc8a3b7d350ac390c5728f3534d3d70f3",9.917710196779964],[8927,"017071e5a79b8a86b854174679b94851ffe000ebd51d63041f6493eb045e50c5",9.917710196779964],[8395,"58087ac49f2be6a482eb8036a3e1818b6e5d798e5c0eb2fc1f836f75827aa0c8",9.917710196779964],[1656,"e7dd6bab9d153a0f35faa587079acc582a0136e1c4340c1190e0c30f5d1039f5",9.317957166392093],[13266,"9a1b2b83a3b76bb393b605ffaf816ea275c7695b3fb0ae31c83fbec5db1554a5",26.11764705882353],[14733,"e13e2b7e82aa22809c3823fe2bf3d5b52fc97c1ef705ce9718dc4b8bafec3784",9.317957166392093],[4395,"9fb25e212babe9f55fe1d1c8a935715903dac57dc83e0948d40186f156a31de3",9.478527607361963],[11561,"e8d0c6990162f80cecc9aef80f57937bcddc643def6dd3f0633c7e95672a2eb4",9.917710196779964],[11620,"39ea21a5f674def5aad27c041839d12232febe08aefaad5713341d88950ac8b3",9.917710196779964],[6391,"38c027f9cf29bb795d8543139f9ac446787a9e441c20e18e49d1dfaec4af63d6",9.647446457990116],[5356,"3cdd8707e83ed25a890373468467863df8b7594dc31b6956004b3775be041bdd",9.917710196779964],[16103,"c3ea54edad24df67db3cfd117794d7ed74f08875c9e6acb4fb9c74f93a700766",19.2],[14765,"2511afdfca5aa7c8bcf775a548ab71e6ea17ad021bbd991720cb228899d09b83",9.647446457990116],[8060,"d461bcb63bed5cdbf093e76600daf87b4e8eabfdbf03d3452ecfd9ede5870dcb",9.917710196779964],[4147,"c24de1b15faaa6c84eceeb85e3808169d42c941c5d05b66b9e7e682704cac0e4",9.317957166392093],[12862,"c9cbae92648c02cf49d3e07e1f0437328a617cd978033ad7f8a17e06e3f07dab",9.917710196779964],[15985,"9d7b81ac726bb03ab79e3fe03267481225e65b6904e05fe8246c089c3c0dc668",9.317957166392093],[1757,"cda859c835dcbb47a065fd61b707d101b9f7fcff3d85513af8613677b5788cf4",16.17081850533808],[11345,"7d47c401bb71b289b3a5a9820c1e191314f78f1ad2ae49074d03ba23590bb3b5",9.917710196779964],[19678,"b16bae83f4c371cd1be6ba3dd3731ee8ab04a3785cc95307f470afb0ea216707",10],[1778,"c3a7bbe51be1e712969d27bc972700aa6d518e849c390dc5dbd6eb3b403465f4",9.917710196779964],[3881,"bc7c13ac2ec717486eced6fbf01765ed7c707242886437d65bd7a3bf763e7ee6",9.917710196779964],[16465,"9f556bc3b11d374d23bba657b65175973ac631c3fc1ddb5c025669b5c357f35d",9.647446457990116],[16402,"80ad50303fdcb938eb1a54bb6ffdab6b91a028631a1a43a13d6b2a22408e155f",9.317957166392093],[15616,"36fcf2a947b36154ff90bd4e9a3231c410f796d25b5dc05036a8034ffbda1371",9.317957166392093],[5749,"d83356c701289e2795d74fd3a00684165adb78a474312422e4e8c2e74d31c8da",9.917710196779964],[19550,"72090fe8080f24a6ff3ac8f51af10c00bfdc5fb9f66d772bb08f6c2e02479e0c",9.317957166392093],[1792,"43e13a23141b72347d57ec6134b509efaf2fb686091f82385a3ca5f2f2b94af4",9.917710196779964],[257,"e3b1e942f98d9c7e89730396b7931d1cf6bd4d01269dc46510eb71d2719c3cfe",9.917710196779964],[18112,"85609156f5bcdc2b41181896344058f1b187a0b930720ae7c6896695b97ea13a",9.317957166392093],[2275,"93f6580fd4afd4dcc30234475a7c617718a8af6b3aa85d75c664544793e420f1",10.052724077328646],[16167,"d0f8ae1588cd5bda6563b302c680389888ebdf806a18ecc13e0282364ad4a264",10.052724077328646],[18991,"a7ef17d077a697b511cea861832f19fa385ad633b490bbdf579d56ccaab7f320",45.960880195599024],[8174,"06f4f70296ec19acc50cde9b538d5ddb8ff0226f3a1d9765cae943847b4425ca",9.917710196779964],[16139,"8d825e10b3d2174941452161e79bfcd673676bb4208f6e8f7b8860e453253d65",9.317957166392093],[1440,"6f026140b47f5a166fcb3228bcaa2088572e971eb4f0ccb5dc9d6fcee62392f6",9.917710196779964],[4228,"7cc7b4fd4217e7ba641ebab673f79601a88481a07a8f87dee828eda6b4a43be4",9.917710196779964],[13344,"8ab04c633d951e9240efd5918d1cb359cdeb99cf5724d28f96789c54f1669ba3",9.317957166392093],[5338,"3378d04ad9f1141250706b6f92d0873998f7679260652677dc728721787633dd",9.917710196779964],[4154,"7db463440b36cef74839edc6d99b85cf04848d178aee557d07de596d5fc0b1e4",9.917710196779964],[15273,"b8fc444f6abf9bdd45af902ac36ebafbb97e78ce599e3d9f1fe72973c692f378",9.317957166392093],[6254,"be8f9d43974a82faaae79ad9aee2b08ee042cb05226b0987b0d30a00803d62d7",9.917710196779964],[4803,"cda97d84f20e00efe9c89af6bc5d438bbf5850114799e21301fa20d0824860e0",9.317957166392093],[608,"48a6c123305960c6ed6fd2f906873effc2e27ec195c49a8bec8d9d6a87fbe3fb",9.917710196779964],[16006,"60400499ebb74e5dd458af4b7cbaa9599f1227a20e16e42e6a0a7dec0d465968",9.647446457990116],[693,"7e0ab38ca8ef1fad164dfae3f7aa798cdfbcdf168a0453cbadebf7cffe9f47fb",9.917710196779964],[1137,"5c74430b2ead065a9f1734937271f1e8d4eb983fa9a7e8d8f94f55b885e860f8",9.917710196779964],[10271,"bdb192ff13a9ecff50c0497c234adc331e24e5185d08008dd40d24682c7b96bc",9.317957166392093],[15750,"83b1b821f24b08b113bd2c2c06b54f345ae2bd14df55c83f02402df8c304586e",9.317957166392093],[7919,"cd6a40c37ef67f4888efda9ea68da956ecb8efc463fcaec246e6fc134f6a18cc",14.147138964577657],[11881,"6c4a4ceee7899e8c8ebe1518bebd99c96c19b45ceb354c8ebdd3816ccd3829b2",9.917710196779964],[15393,"1eeb60d73685d1d04fd160a2346a1c70a079eafdbc0fcf2dcd68f9c42d817076",9.317957166392093],[9878,"e48ec2a895296090f7a5bb84f1e914ea4bed80c5352a272f47b13009fa3417bf",9.917710196779964],[204,"033c1cf57327ab62a3ad092f00c8e46bd5418e8a7fb9b50a97fe1edcb13e98fe",9.917710196779964],[7879,"e33800b75a95ea8c09c05901f04a2a830a49bf2d0805ac11e98235231e6766cc",9.917710196779964],[10753,"035dde4febab242d1a516282d3bdc326ad6ae1fa67d3d65a842b227047baa4b9",9.917710196779964],[7148,"d4e943f146620d2894005379b15639f1c744b4a317cb67e50536516a9d8d08d1",9.917710196779964],[4157,"ca2590fb98f9ac8af4e7a5d9fbe22f180d518124d129d7f456a042f816cdade4",9.317957166392093],[17236,"12312d3788c7d3bcb936943748f8ebb1c882fcdfacb3a35f43cd480638ec294d",9.317957166392093],[74,"7d3fa2c8c4abcc3af834bffb2b13d661205c3cf866394a08a5b5c9107d9a82ff",9.917710196779964],[8685,"04d2365bf3da77b908feb5298574753df61fc366913374f46e66d024265dc6c6",9.917710196779964],[136,"2e4561b0041c848f085238210f403b56c17799f42677a65f4a695fa4fe0216ff",9.317957166392093],[2089,"265283d67fc3154a9bb48ed19ebc959cbf3c531ebe5da9017be8579156ed4bf2",9.917710196779964],[1625,"c7d62e03f8bf280741c463ef43273c49562e1b0adea55a390363d739a9276ff5",9.917710196779964],[13786,"535ac87912d217a30b55fc04d3e0527009fe90497b00c27e2b3234414e49a999",10.034187455573232],[11149,"f64a643f07012627126edd3d7fc3eb98d9b12098521c9f4f031232842f07f8b6",9.917710196779964],[19662,"0846a22e9d063823669e4605b75a6daf13584b70ac4f58eb73b5f9894619bf07",24.66609735269001],[16111,"d51b83ef20ea4c9b6fd6b94f56d80c71da7d37bd3772e17188c066fd48abbf65",9.317957166392093],[17428,"4fd8e8c0f0c0a2ddc37343fb766be60832a20d5871682e5a47c76cb759e92949",9.647446457990116],[7749,"01da9c3965f45f96696761411f20ed88ab17d0c4b0935f2fdfdf205d3b4c25cd",9.917710196779964],[12676,"007ddd8e371259246c4d0c461385d89c7eb9f36f65320b413138a623514dc0ac",9.917710196779964],[2103,"c803500cb061df9749e2f085b3aa5dc97f38133fab729df4b974354c3b5236f2",9.917710196779964],[3878,"c4a19e4d8b0211cbd8d6c13240f5da4e7eaf65c9ebc256d45140ce9eeb0482e6",9.917710196779964],[14824,"1ab06c3c16e242cf3bbd2386fb73ba7fb847b07867ee66c3d139ce5aa3395782",9.61451247165533],[2823,"849b7492ef0821dd477d6e146e56612784b8109b90595414b63ca306fd6389ed",9.917710196779964],[12751,"58b15b732338532ee0a2be0b6c3753e2e67ea278d031f6e0d670ec7f7c003cac",10.052724077328646],[12323,"9b468ccc17e8f4e4e3c672905f36868932651baf13abb97e71a20a6ad72713af",9.317957166392093],[8438,"8532a78d8f49cb7ca16bebfc2ac45d39c6dd404d06789deab1dcbfc3e87467c8",9.317957166392093],[12945,"7579822c46324c8b7e35ee9ec2400addd7004691da758905d6c25240d2def6aa",9.317957166392093],[7562,"d77f39f0a70105a282009bfa12eec7574b0caf4d834327a4d520cc4092d46ace",9.917710196779964],[7228,"8b8ce1a2bc8a01467416074d86e6fdb80410ccd4ba73d70bd8cf10ae54717ed0",9.917710196779964],[2397,"dd46c128603a4e58d4f861c06e3621a1284a5e8a46d264e86ce8540c3e7982f0",9.317957166392093],[11473,"d61e2e969d9ba4632f22425a62f80df7104d3693c3a4cd3f6eef087beb45b5b4",9.917710196779964],[8133,"ec6200d0a5d8cf36039de4cccb9cb193502513d43c28681652adcec6e0d780ca",9.317957166392093],[11505,"2cc6fcde57ece74ca6aa333f34295c3b2c713b582036f7be6c8d22d01a047ab4",9.917710196779964],[18237,"3fc05a7eda27dadacbb72798107ea0a8f9460df1a4f50d632d6722a73e424237",14.090909090909092],[5868,"feafd67de914d3906276be969d1968a9fff0b66954d3e1eda238214275afded9",9.917710196779964],[550,"f1571059d1e58d7dc53f63d7a39f6fce584cef48d714193cd994509db9d94afc",9.317957166392093],[7263,"43a16b3286c46bdfb29c0b607a817cf4c86d216b6596cd25bce426e717d93dd0",9.917710196779964],[439,"c55b0b07e920bf69a423ff06fcb3b0802ca692cec10c9fb2aa3f20bb047a1efd",9.917710196779964],[8651,"c4428465481e6f40abf7e98969a42165720cceeb6c9ac8956e9a1df9d8740cc7",9.317957166392093],[11388,"1c6f77ec79c95f19380f9cfafe9aeac1a7e52320c28c9a48d8a2835fa3976db5",9.917710196779964],[9822,"365ac94b4ca89d44ab3fb827f678a5b3c7074689389cae55a1c0e5ce9bca7ebf",10.052724077328646],[12310,"2d1ed9212795ec8a35a6e0d92689467a2671f2f1d6f9e16f9bfd0197cd922caf",9.917710196779964],[9182,"59ef54f91963fc352dd5bd3b8410fd1426d3031f31d906bd6bad27097a1f9ac3",9.917710196779964],[5457,"a84a517e734c81e2009a2fe5a4599eb6acada3e90f666a6fc6d3f8c3643573dc",10.052724077328646],[2874,"650e6dbf4dd41eedf1d39d3afc732525b980649efb42cbbae9cbd539190145ed",9.917710196779964],[8011,"5302a5df801fcc69dc323b0c94f1d4d2241575ae159bf38d3e45ee9f62f676cb",9.917710196779964],[16065,"20d3aed522573c41e4b665d2dc447215627c3949ec5085a933235b6c61f90f67",56.19512195121951],[10988,"e98bb090f6d7a6160f09983f7a09e5a02b9d348a613a6631f6247bc4ccc511b8",9.917710196779964],[8402,"60a08a4681ca0dc6a55b6ee4c2e28532400e93858d98573c8098494f8e1a97c8",9.917710196779964],[9599,"e78d1ae7752ac00bfcfd8cd45a45047daafb780f58065e149000d3a36a9506c1",9.917710196779964],[3345,"3da1b80d5089e6d851386bcdf79143bd0b98e2ffdeacce24c5e06f06c7a307ea",9.917710196779964],[11602,"880af74a5dafffc62c29968ef68a133feeeb9918f4e75fbfb44daad46180e5b3",9.917710196779964],[14186,"fe7aa0688dcb28a8d6823cf0defdafe78ad16823fcaf2c52be5dec614309ae90",9.317957166392093],[2208,"a0c48a366694aec445719aa7f2dd407812aa3716cd0d992f1c60aa1640f979f1",9.917710196779964],[14012,"84ed83a4d1466b987bd5934d4af3a2fd1e31ba4474c539533efaa866c93c8e94",27.900178253119428],[4353,"14f3868b195f528c7fad73c1811f0bdd5725bbea5f01e6624861357b9d9664e3",9.317957166392093],[9006,"d0e487db45786b66b17e8b0f89f3ada6f3f5e55e40e4b0b42a7dc319c048c2c4",9.917710196779964],[4196,"904526681b1a92252b6953d9e11c495c32ff760f7577e5b78705b813074471e4",9.917710196779964],[19043,"e3ffd4dbd1e70c1db3369c301d472ca8cf38cb6803c87812202efc6f32e5251f",9.647446457990116],[4191,"c4edb71e484f54cc2f16dca121eb5fd27522612cc0bc134841f89ff705e179e4",9.317957166392093],[18518,"32c2683d2ba7a03b7a420d3804d96fe3611536fd4179ba499de990d0a7941231",9.317957166392093],[15567,"c20b9727dccaec84dafc55e3e3801c5bb1ca413e15654d4fd01d329787e55b72",9.317957166392093],[13269,"6f7d193d60a2240faffda6fc8834ec6e015b1646f12cdfff9b0a1cefd0ae4da5",9.317957166392093],[7150,"6f6b20fd093db571f3295cec945d0ed6916831d75e17fc49396d91d228f604d1",9.917710196779964],[4704,"77cf0ef02189da84cb38dc3db80ad1263a401b21a3b00e095432b3d3a042fbe0",9.917710196779964],[3436,"75324807cfd5e243dfbc85931d07a6cc2dfb40a0fa3f791955cf5ed2d02a73e9",9.917710196779964],[19646,"7f2b04bef8e95a44ce9f737ef521be517a84ce613c45505420a61647de792208",9.317957166392093],[1540,"f2ef19ddaf96c1ef061a151f23d986bc9fd0d332893727a637483cc0e7a1e5f5",9.917710196779964],[8276,"6339763e7194518c9037f7d2bb0b2a36b1f76592582bd5f1c0de5cc9e8227ec9",9.917710196779964],[9371,"531018d081f26e6a2f3d8c74f6ec1448a2fbbe9c97c4cfcf5eff537d974168c2",9.917710196779964],[3018,"f3b31d6d1ff4b1cba0b8260446c5077a5d043afd5056328db491df56fd2325ec",9.317957166392093],[265,"7020be3695ace1f4260b89606ca999b7d40a7811795448f93beddb5472f927fe",9.317957166392093],[11285,"a127d86f5aeab6184ff2643310f2859508c4c57467260f6be0c6a62c0e1d21b6",9.917710196779964],[1544,"1c0622e54b1765e536b4d544e4d49bb1d2bbbb44b3bf452d25c56924dc68e0f5",9.917710196779964],[13360,"ab5e24c9405a9d10829cd38a5241b112bfd50c69fbd38863aa1760fcf4b543a3",9.317957166392093],[8292,"f399b4f74857fde89834ec275353b29141b6fe527d2127289139ac7998915ec9",9.317957166392093],[17978,"544525697a3555faffe1f6689d24ccdddc65288121c9db00452b00ffe0a5923d",9.317957166392093],[998,"1b20ff9963559d320ad593383ed9505531bb85b79949c76dfa0647c1af7340f9",26.115555555555556],[9298,"b7454d12366fbb690a0fd14e13e4a5920f783348c7bf8edd98c4dd7673bdd6c2",9.917710196779964],[18311,"2d66f1596a3bb6ed8a2818d22894907d5027343dcda68e454150cb3682eab635",9.360507246376812],[19319,"064392dc29120096ab200de98223a2b22b5a1d42c5e9b467410fb60bc6395d14",9.317957166392093],[4924,"3bf06e8c2ae7595101b0a53de5241a737f13084bd57b074f9f78469593d8b6df",9.917710196779964],[13915,"370feae118a27ac36c2cc7c1270ea30a6e6cf64d2d6cd59ebb5787fd7df3b396",9.317957166392093],[11745,"023056199b6d5c17955633c4e576ca8e968a77b3be8f89d481f57ca424240ab3",9.317957166392093],[3586,"32be49b1b298a57bf1ee5113ff314801b8176abdd71542e713000e56ace265e8",9.917710196779964],[4985,"f2290e6fc13aa269eb89d173c7560b1ec02e03dd5734db5bbedd38bde99648df",9.917710196779964],[17598,"8337577c6adb602d1e4f077b77200961c9ffe4e21ec3aea6cb74e0f4c09e3945",9.317957166392093],[8028,"b1a9282adae63567b378986360a15f0bf4e43f4c2cab09036fe6dc9c0ce45fcb",9.917710196779964],[13117,"cb0d03d72ebe29eedd3a345c5f47a738b536e2090fe2b391da008f8690f3aca8",9.317957166392093],[19632,"e91215885277973c9ca07b3973198e243e66ad33c000808cf77e02fd732f5f08",18.06896551724138],[17426,"72c61bf6c43daeb118031f046c72e8138597b124938c4c18f54962ec13bd3e49",40.16475972540046],[7765,"f602199b0981231c45d5c033c8c53e08de530bbc3668a7ddc6ff99c9d11e0dcd",9.917710196779964],[19784,"36fe21191d333c88b06d04625cae69fd7c57a067d1644d3d0703398ac2994903",9.317957166392093],[15817,"982a0ce80caec69d5c628b0d3a448fa60ec897492f8456395e42c0456e6f0b6d",40.78004535147392],[13082,"e273071b7542d5fc1bb132d11256152aa136be0a0d6712eca118b1e72994dea9",9.317957166392093],[3731,"b504aeee04a5d74bf02e855340065ffda8eca453774454e24b12e6ca14c666e7",9.917710196779964],[2083,"666571fb2cfe341bfac83e3d14f1723c9a6bdbc63b5c9d1f75eb96d7015759f2",9.917710196779964],[2274,"d7620abcbc32490acaea7ec547fa20c0118c3cad6f81099627093afd48e923f1",9.917710196779964],[10821,"d6775d5926e3af249735f8589abaa82b02a48fb3a037e572d18822c2de9729b9",9.317957166392093],[18080,"5fba41913f4076f95918f255a0bdcea349d205426c29a25309d7568e9177843b",9.317957166392093],[17101,"e1810df101efa11c6f2151a2b91124f0ff5d2f278f50f1fbbe457b303b1af84f",9.647446457990116],[11054,"1e100a6622bab405b3d44afef546f23c338815fb68d02aa0d555fadcf3a7a1b7",9.317957166392093],[264,"02b051a02b696ec44cf946fe4bee16c131f3c758cc627aa0482d3ada617b2dfe",9.917710196779964],[12967,"98b5f3746ea72a8bfd7b559c00d44c7b084a4ed7d90ad58ba43c408933cfc7aa",9.917710196779964],[10829,"fff10d5ab624d8610f3931edeee308c05d9cb24097998f0dda2dd49860351cb9",9.917710196779964],[5984,"3476392cbdfbe58bf495b0abb3c406183715412d30420b1ba9f97e5964da2fd9",9.917710196779964],[3028,"c427b5c6692abc439ff8e40c6753d2d76483a47d2d4ac16be618b51587381cec",9.917710196779964],[16288,"64c3098d74bad02712a36c49eabad185e5aff8d258608139a95bfd044a007861",9.317957166392093],[5542,"dd5debd71c961cc7136a1ebc9b4237b22ab9c68020f9a09160707bc08017f8db",9.917710196779964],[4413,"8bb1601df17af48113fa3c9c77414bd6917a09ea137a3f1a1279bb3b1fa5fae2",9.317957166392093],[19741,"3965aee69a57cb4139964be99b100a9a61024f42495c88941365bdc977ab5505",10.052724077328646],[15600,"7063ecfc7bdace6501806ebc9d6ad2fce76d701a1938428738ec0b0976bc6671",9.647446457990116],[15569,"037ae25fb9e66489845bb29f418b938cd657e4a83c49c040e5076405d23f5272",35.387900355871885],[3052,"5eb5d943f18e1dce4f25ffacc85c48ee62d05e36d96cd09cf7e5e5507433faeb",9.917710196779964],[16178,"839a124c15d5d073a7624294e7c309b8c9362a2e9d4baf2fc5d8318339996b64",28.933014354066987],[17331,"fc40e2a078792a101d1b2663f44bcf8117a82cb270b295612d4f76c9cd2e3f4b",9.317957166392093],[5568,"52f5ba0b9700b2ee097ff99e466baf6864c4bfe5c9c4d97cb9080774e58ed1db",9.917710196779964],[11756,"cacb355564ad255904ad9c9f5c9b7cd278bbe22f328016fba1d23d912cf7f3b2",9.917710196779964],[13371,"d88353a2a01cdeb5c7ef19c6d818700cfa05cb92e813620c27c664bf14d709a3",9.317957166392093],[1542,"e12539b9612dbcc4cdc93f240ee6e687c8e91da52672b5eb7bc435b0ab78e2f5",9.917710196779964],[17591,"3aab37132074564edf17159d7becb81e1725cde572222ac59bc88f898e425845",9.317957166392093],[5432,"58b85399e95100e0e3500df1df36c3cd344885f6364d9d02b6ae85122a8c94dc",9.917710196779964],[10343,"6216bbaeb0522c9d9c7138d19e9f98bf4459ec363189b61c7adcfb6eb09713bc",9.917710196779964],[1628,"99a6a3d840da59c8213dd67458adcee75b7d473062dfa2ebc6ffcc6f4e296cf5",9.917710196779964],[5304,"436754de8aa3cf34123eb6fff8fbfc3bbfb489db12b3a611e5bdcd1054315edd",9.917710196779964],[7378,"79da5e5c19f60f51bf75e8119987a8a38d3d0aa1f7b2c07bcdfb292a23a18ecf",9.917710196779964],[8178,"53b156ec45246b369a8d171c6136c37e8bd4dd394892e1b73e758b320d1e1dca",9.317957166392093],[8212,"d72c62a63653f626c47ec71d87fcd328dac34ea1fc38b29d3c46a1aed795e1c9",9.917710196779964],[9615,"4be55c2a455d6173c985aed8010390c7f3a8dd4779d25423b0012ea6ace2ecc0",9.917710196779964],[2829,"119647c65cecc98cb08d2db99c61d2172e8f728fa1ad22e3b9ec0a6a6f2480ed",9.917710196779964],[4470,"4cec26f9caa7a84b64c045c43cb917bb4074f036f3774da326bd9cf413e89be2",9.917710196779964],[19508,"e0ef1244f672c00061268e505378fd551be59cfd898d5477f7b9b2e97e13030e",9.317957166392093],[7237,"ff9abdde20db9510b36880d337aef702d0876532d47c3ed8962a9f86233e76d0",9.917710196779964],[17894,"6553d05f4ecf3e6bbfe2ac55efeeab418aee107280a0a8113c69cb8110d35c3f",12.23873873873874],[13425,"2cae75f876dc2883da5d20910853f42668c9dec4f2208cfe45c5ce2375fbe7a1",9.317957166392093],[2596,"17b90b2c03952c4c31d7f83230af053b8dc82c05f3941ce61e2630dcc4772eef",9.917710196779964],[3886,"69311c32ee55c216fb94bc2cee4bf717c1bd0c9b8077901944165c81e0ef72e6",9.917710196779964],[17575,"3126303edf48eba5bdc45c5663b644b2d15f38cc75c45acdc4c34a935b00c745",9.317957166392093],[14948,"731455d3215330465cb521b7281dfcaa47cc6abf05c7b9efbf9dda2b3302dd7f",20.07662835249042],[516,"139e480c7a21ee41f60ba453dd4fb1dd38c2d8e6fa44c9a7fea237bae34e95fc",9.917710196779964],[9187,"6d41866b60b38929551f83b4ede950b96529953b874704154a180f1d4c3f94c3",9.917710196779964],[1153,"3521d952122b58b66d80ab85a2aba462d93c6a1caba104703fbdf78124bd47f8",9.917710196779964],[10519,"6bdbc0ea3a025129c7fbda6a47e91450f29b4b71a8f9b6342655c35ec6d514bb",9.317957166392093],[3771,"b56fedc4221abff4d195ba3c363eea9e7cc662cf31f3678cddbe89a7c2a523e7",9.317957166392093],[16856,"9c342bf377119262a5042636375de037573ac473b825f10261524be912032b55",9.317957166392093],[19316,"d5e022b441cc2293075faa96c3d9187253ca2179feb32a531980937cc5357514",9.317957166392093],[4329,"0775bf81079953e6cb9390568e359ab0faf1f585ff2cc41bea100e30501b95e3",9.917710196779964],[166,"fb8082d75e130db5b647e80b1380a2113e4d9ea78d986b55ea83bd9e477de0fe",9.917710196779964],[9015,"954bb3884b78f437d12f746f8203a1966ee07ef3bba94cba58fc46f1422aa8c4",9.917710196779964],[7554,"dc0c00ddeb46c89609dd76e63cc52cb7eb62b81ee5a52c4a183d58068e8977ce",9.917710196779964],[11755,"b82259119d185b047590efffbfdf00af2eb0272e7e6e5d51a3d7381cd7d7f5b2",9.917710196779964],[5404,"7afc9d609a901ff88ee39d4df08c851f22f3af76adf54eb30d80cb94775fcadc",9.917710196779964],[3906,"0ba5c45eed2ce2690d5e17bf199bc2bab3ad19c7501f145fa243a083cc5b53e6",9.917710196779964],[3156,"f095f71af92f83e47fbfa8b2567a5531110671eba3abd2678d520154fc8554eb",9.317957166392093],[7698,"bf9669422d734f23a13ba693bff1fb4de199ca8fa238d727351f3ec8bfa68dcd",9.917710196779964],[5127,"4c76e2841ea1b19fe280dab341b63bac64277002e6d20c05c19c437d3e626ede",9.917710196779964],[8241,"738a91498cfd41a85e20e45ae244bd2f8f7a6006461cd45e5229f026c409b0c9",9.917710196779964],[460,"5b98f911c57d91365447670020b5908bebeb8de26556ae06f18f4226ec88ebfc",9.917710196779964],[1973,"2ff57c6ad5ec4b69c9d31a604009f0a27aedb33d8bedab3b977dc95702fa2df3",9.917710196779964],[11216,"68265a0bc9d6d26e5033f0cbb5394ef301f70e2cb19ee0d9fee565c11cc498b6",9.917710196779964],[11056,"5824538d6d738c30e3b2a0e24c18ec750197e8c85d7e0e5694c7a9ed1f279fb7",9.917710196779964],[7163,"88ec96cbe59be965413c324105abb3dbd2a9db165a5ce9dc1890c7780809efd0",9.917710196779964],[15924,"5e2faf2420287443bc77beef4e904c71f6a38938b322d74123da25d0b619a06a",9.317957166392093],[16388,"1307ad748aa8ffc09e572414dcbeb333a82d959e777a5bd7d80633f039f6495f",9.317957166392093],[7097,"7acbaa2dae5b23da2506decc29e3e17fd497b883237052e52a7fef720eff5dd1",9.917710196779964],[8268,"7e01a0dd54ecee0acea68104272648c8836e6fc09691c2e1138a4a87581f85c9",9.317957166392093],[2546,"4a851f2e19996d58c7adadce9bc9007b1a68532653a2934d67676c35681a8eef",9.917710196779964],[13695,"d93477a892a6fcda44e583b7f9c502eabda9d4d126730714ecdc1cdcfbe5539b",9.317957166392093],[3321,"1746b56cb0c0e9f87af3e06d9bf427456fc79dff550c689fde305ea0aaa23aea",9.917710196779964],[184,"9ad52fe7850bccaedf97788faecc78c61095f78922aee36e551e9455b50ec7fe",9.917710196779964],[13716,"187a40e60b835ad9c67d0f48726f4ea3426a8ddedf497f76f3c016a04699079b",22.31578947368421],[15243,"2655ef8869bb53da29dda68a5fe93a3b3f308d7abfb60a709337abfc1e979379",9.317957166392093],[3223,"f2b68b6b88bf5676b6ab62098f371157af5f43ffeb1359b6a8a7a0c35ea2ecea",9.917710196779964],[6257,"8d2bdab00cf9bca9ef4dc5cac475848e0df088e3ab70ba231bdbd5445b535bd7",9.647446457990116],[18667,"70ab26494f50a901172426356921d63faa3406faf7db9e521b1c4c14be37fb2b",9.317957166392093],[16396,"6400927336d1d324c8dcac4e0e2611817f14fe9174245ff84985465256c6275f",9.317957166392093],[18163,"3a70e9a4d121c37a397f05a12485d75ea86bf31fab6f624cce1c70a9e8991439",9.317957166392093],[7311,"fa7195e46e0fc63db24357323154cb9adb084ce553c01bb29604787fc788fecf",9.917710196779964],[16565,"d30470e7b6c15ece6e73691fc744cc59b543cc4fdb7893ba26857655475ecc5b",10.052724077328646],[17571,"4190c87c0d59aa83cde41abdfb471de74300c92b3b68910382b129c598a9dd45",9.317957166392093],[7047,"5525bbd07fed7c01cba7c27ba386a5449296e8def33dfaffe801634cf028b1d1",9.917710196779964],[4991,"40f4e6ea416989bddc9a1d1502117b3bb9987fcd4cf833563db11bf5a0e53edf",9.917710196779964],[12002,"537b7375a74b39c47d4a0b9ddbb30db5d6ba8b0d859bc77de23a31939c3c4db1",9.917710196779964],[12364,"bfcfd51d920c2c1522ffa45f661c452a6f183b59c72864ff3d7c1eb7e363d5ae",9.917710196779964],[3522,"45bcb94976746bc9aadb8045e5b09b3513094966c6b147ff6882b60a2eddcfe8",9.317957166392093],[675,"b7f18cda12d09df7fa79fff88a8853a4b5b9303025de466ca1efcc6179ed65fb",40.02826855123675],[14563,"5a38b4202c8b913c07a7c0aa285ce583746be86e7195eecf6d575479c9afd387",9.317957166392093],[2024,"90f9545d4b68145666a0cde585130e301143e1892fcf6edfea14398909b0cbf2",9.917710196779964],[343,"34bc5d79eabfe363adfcf0b42030acc5d08729f0349d87d22ca608d42a8bc1fd",9.917710196779964],[6398,"4db5e6442b7f666c5c31da3782f443421f0168f41d617fb47ddcb3ecb83a5bd6",9.317957166392093],[13905,"c0bc074d6a30aab99a339972fb422b073092cb31f046851ee15f7f3c583eeb96",9.317957166392093],[6707,"473a02de6c010f09547ca840eea07177a5af63376b0e867eec76dfc159c9e7d3",9.917710196779964],[8727,"3fe40cc287c863a67fb82b50891e78cbdd4b5baeaf9c89a50e555792473e87c6",9.317957166392093],[6882,"bac809be76abd9d2cf591a1c37c4fc50e319e7039bc3c189e685d023c5dcb8d2",9.917710196779964],[12508,"b3272c4c5e02690296266a26909e5d1ee3078c12e5c640f597ee2f0fdb53ebad",9.917710196779964],[5244,"9486407bbe5387522564b9f099c3defb001d6e755bfbc0d33915d9ffbfe4b7dd",9.917710196779964],[2667,"72d6fa6e0e7b6ca9ca48eeaf07bbb6407f4d2f13f869e1ed55dce806d863b9ee",9.917710196779964],[12665,"604a0d8a3d52c524efd06907f4bca5ac2782e55a11d1f6a41c610d4b1489d3ac",9.317957166392093],[1807,"a0bd6bfa9989d70f32baa3f527126daeadb00e086941217825926c7c1a762ef4",12.252121212121212],[19587,"d50e68fb5df5a7873e9a940d92e27d9e63b68d976e66c5c287f3cb2bcc2da00a",9.317957166392093],[7490,"a1835d5b8915a3b1e300e5d11f6405e8d8c1acc57b5b4675481d88eab89bcbce",9.917710196779964],[11456,"a38c47610ac0846b18cea66371cb172433f1ecd44e3134979b03298dbcfee2b4",9.917710196779964],[9656,"caa5a59db2031d8c18d683691a54454dd2e47d51211f5ded94a5dee6aacfa9c0",9.917710196779964],[11666,"ed610fa7b3174d6d62349485c3ae87448b383a7a9a7726e0abc807a135d77cb3",9.917710196779964],[16629,"9d9718955051c7ef3def7c45fca1186a381fb5e0e0908ce0571f11b1f3982e5a",9.647446457990116],[16512,"e5fd23db6031046f0ef2f37e27b376f95b9773e395ada5a2d9ea63d946f3f05c",9.317957166392093],[9667,"23be6d3d624ec4b305a8b9330c22d53ae9b906f521ee937eb7af64e1ab6397c0",9.917710196779964],[1506,"6b7a3cb133733babd2c115436967a037a707ac06d7d685b606840c9171a911f6",16.035555555555554],[6521,"7aeda2384133759a6f7a9d12d5a9a9ea6c12cb37b106798e3a3b4884790645d5",9.917710196779964],[2923,"e91b5853b467e89f960415f8d01ad55d4d595da7e62a11b2c12e651c824ce8ec",9.917710196779964],[19384,"d7e2ac0b2f62082b8a04e006fbd32af064b1bc7c91e20ec31dcd28200ade8812",9.317957166392093],[18171,"293556e79e638f49c2e305cf5a1857af2c70031b65c8cfd39d9363b1ec8fe938",9.317957166392093],[274,"c81a6e6f01eeac7530b8b20bb4e427be397d673ce7ddbc776e2e894cccbf1efe",9.317957166392093],[18939,"74a205982d1cafc02f3432f07dba0a539db2415f5c6bff23b2b36e3e4d076e22",14.931818181818182],[4153,"89592fdf9604bdd7dcdd69d658f9b8867f3b6aa6c0f0909205a5fa2f2308b5e4",9.917710196779964],[2366,"9cd51837eb4293f5d0aca6d333387bc80edaceb994bd20e1bbd8cb140818abf0",9.917710196779964],[13430,"dba0d22a41293fba441f114c4f84f07325a7b185d8b7c7cd5569b14cf4c0d1a1",9.647446457990116],[14551,"85b67326878a24f9fdc3a61e6658d0ff0ec95bb4e83ca85c4ff95f9197f01e88",33.44127708095781],[19624,"44ca8fe08f807f803d9a68700f39f9e35967dc56adbccbdffe77f1a37d57c308",9.647446457990116],[15844,"bd4163be9768f9e4f4fc0b1febc886fec1c490f500ff23e7ada6090862036a6c",9.317957166392093],[16859,"4cd2f449a88813c69a3ada1d858c597efccb3bcedeb679953dab3e381ff72055",9.317957166392093],[10521,"32806768b074d55a96a12e9ab8fbb328b41a9db923087c21a3ab23ada86113bb",9.917710196779964],[7457,"ccc147c9e6e3f34ddc5460b10197858539ce39e38ddcaecd800187895b0308cf",9.917710196779964],[15431,"03378b53351e2ef86d44e173d79871836c44d686808f4241b27b8558f7539e75",9.317957166392093],[6562,"aff01da64fb3686dcef34c8836d4d5bd4975c94a36d5c5f413bf6c95d177efd4",9.917710196779964],[8369,"012abaadffc8ca422d19f16fe5bd1d06756dfd444aeeb92119668128e0fdd4c8",9.917710196779964],[14864,"a747a0eb716ca82a29199934e86ae422186eda268bc4c2d5a8acc8a666417d81",9.317957166392093],[4325,"7eaa56b26d661ba95bb83bc4509343b4393b4ad4bd451aee54240f63c2f09ce3",9.917710196779964],[1829,"f6fecad5d8ef6ce74e797d41ddc6e68e4f62563083c2671f78b174160b4410f4",9.917710196779964],[14116,"55c8f9bf5b667892500abc6fcb68240ff1ca2db0aca107d660f600a228943592",9.317957166392093],[3083,"ff0f98e133ac8ddf4497fab1617893f69c9707491cf5df090a3733484f8ec2eb",9.917710196779964],[17325,"c80fdbc8c91af94d457fff2f5a339305e66f3ede092c9f449fcb1f92ea96644b",9.317957166392093],[19259,"e573bb97a835591493674a8224786f93acbe2cd77aa0ec363a7e847e15b15a16",9.317957166392093],[15894,"d21fd23976ac31ab54de26e0796eb5c78568f5676abc0441a50a9f7060741a6b",9.317957166392093],[12238,"f14ddfed6f7f4b51d389056db134db8c7aea805a8853a3d6124cd18c2cc2bdaf",9.317957166392093],[10173,"537b845a44314ea83e81c6edf41c3caee38df0ae7ba21ee79e5f306756e13abd",9.917710196779964],[4678,"b7d6e0d5d302201e72386e14207afde60422233655aef7df43a2cb42c4781fe1",9.917710196779964],[14387,"6f58d7067b085ead8cbeddb23d2b7cb6277a14f2862b581ab10a24f47c7f908b",14.95187165775401],[7528,"19905dae14b2b8f213d8ea1ea323fb996bdebf2842a53ffcee9b3b3f38b798ce",9.917710196779964],[1365,"69abb2f2dd1c05571ccd97fab522574a19aa2749747a1e8fdf4882062b66f9f6",9.317957166392093],[3746,"642dec5553480366aec04e97fc97e1a8725f07400bdb9a67b814bc60726146e7",27.486486486486488],[8750,"2586559446ff81fd219c2f2a5fe78a2caf08ceee507895c4b916d064687c5dc6",9.917710196779964],[8583,"0e88c47196c6f1426123742a233becbbdc234385b3a3a2f60426737c7a9587c7",9.317957166392093],[18499,"c2178c32e78d66f3c59f6848f425da242d1b12b7d0e178788b2df4a8b3ca6c31",9.317957166392093],[9440,"600ef4c59f1fa3edbf5b6a8ab6324a3d774d60dee0bf45e2e53474c5bdfb13c2",9.317957166392093],[11314,"62a873c851e1882589cb667bb9efb2fd6a540c31b70c3451a3d0eee52ab2e9b5",9.917710196779964],[2272,"5f8e7ade542baf17aa2b5c8dca7c68007496d6ac4624d3646fa9ca8fba9f24f1",9.917710196779964],[15757,"210b059219056bd70bce2c008cf346e4d7711d7aa68ae334b6e65f02ef9c426e",9.317957166392093],[1512,"286fbebf5c393704cf289c6c29da1faad3a3a46fc7737d2b8f62be8fff860bf6",9.917710196779964],[14849,"d994bd8792203bea26e1d4d29a5183244fbffd6b8e9488cfe6cebae7a10ef881",9.317957166392093],[12993,"6e9559655868ef369fa5370952e18e6d84a2165f3fdad5554e5e5674e84da8aa",9.917710196779964],[16416,"d235c5a85f4e40055c3445e730e99fc74e70f7e35324623e7f8fa4e11211c25e",9.317957166392093],[4999,"4b080c7ee1edda15781c0dd688e7ecccdf5b92395b53a3f9047bff1709ae31df",9.997888067581837],[117,"ec45dc6dc8086aaac67b2a1f244a29c59f9689414d8563f7ee3b58aa358d47ff",9.917710196779964],[10508,"4f10a66e766d66ffb516b5da2b12da4ee1f251e5b05cf3f83f332ba43fbc22bb",9.917710196779964],[11143,"0bd83f8529b6c6224bec40dd68aba569f24527b94384e96e63aec84a9e9e01b7",9.917710196779964],[11404,"522d39c1b7ff252ceb12d15afd75c8da745a3faae2c4934175d04958e66452b5",9.917710196779964],[18965,"f7c3b6c85a00002c3ff9e70288c20e1126fee5a10100f517c9128aaf4f4ba421",35.02880658436214],[14996,"3a1825ccd7500585bdebbc4f96520a086eaf738d327250939ac71c76a574967e",9.317957166392093],[11712,"f63292f222554c5e6df9a28a1a69fafc11e98bd700c146ca0383addc27043bb3",9.917710196779964],[5834,"7283e0e53b0a9a8916ed634bddee8e7cc9fd24777eedcf75a332d0f0bc681fda",9.917710196779964],[2142,"5e70e57036601d000f53c892d6397d4bd76ca8b4bb6a7761815d58815579faf1",9.917710196779964],[9103,"dd642c8537ff24c00c6fb6d65d4f13797de987c74e101b8e3098b53aa9e928c4",9.917710196779964],[13061,"d229b4733bc0041994e07197d4e6033a7cf3b82f6e54d67a12b30c5270ac39aa",9.917710196779964],[10392,"694a9f510f1fee40c9b5ecf1f790f35d7237525cbad95a894ea15e279b85d8bb",9.917710196779964],[9275,"ee9e5b2da68d2d37c05acc9b2f4fc65f044791a7afff08ea52ebe224f604f7c2",9.917710196779964],[13487,"5f9e9cd8887a700cf64fc6da4de532f07144affdcad16457817bf7663d852aa0",9.317957166392093],[2992,"188f3ec6b102707be9b526dc99df0b2af919b78d3779f11caf09d443c9d156ec",9.917710196779964],[2708,"367e7c91f411979f20a893d3f806096bbeb15740ab96e299544d88c8de3866ee",15.92434988179669],[17982,"4e308079be7d7599c810e52036c3f549c1e38ab087a9165561b3b185e8917d3d",9.317957166392093],[8691,"13bc81d17e4b3d1859db2e6771249b3222c0b4bcd8e4326635327a779710bcc6",9.917710196779964],[10627,"df7583a963132aaa7855c0b0f7bb16e2f994f6a59c6cf5356cdb2243246184ba",9.917710196779964],[12681,"ebc7be23c18428725e6d42704c400b463ffb07c91a7d6c266c7caabe68b2b5ac",9.917710196779964],[19615,"289b97f93ebf94da985fb4614ad82a859e537c50619fe716b1584d258b264909",9.317957166392093],[11141,"50746a0eeb0d2761d40f9690e5c463b15ef307b7b661df23d5dd7b72d98503b7",9.917710196779964],[6824,"39a41edc9f2b0d29e5b6741182cd53f1292a344e3f22c0ded47ee056ddde1ad3",9.917710196779964],[8036,"e50804e47bae973a08f4eece12f4b5f02557a934930e47194ad2406c195b56cb",9.917710196779964],[16538,"c706261f25cc793ba10a54a45bf755f31b1263b68b47bb1266aef21aeb7b5a5c",9.317957166392093],[17266,"88512db88131b85c4b206df8e78b5d02a43f7bd3597874d6a048d91dec15d54c",9.317957166392093],[7394,"050327d052d807f4551bb8d67c899b3b9982a527fca3708b8ff975f009ed76cf",9.917710196779964],[13410,"44b1fa69786ae62caf71e9f9ca11d65444c088f252fdb4b1e1bde926f51118a2",15.91459074733096],[252,"e8ac99f0c6a703bf8c6e050e0c21f6bd24d91ec2f9d2ec48bcf8decbb4ab4afe",9.917710196779964],[4997,"1df5e25fef9c5fdbe1d9e4daf318c5ff1c0851fe490a14870641bc5f15b733df",9.917710196779964],[11722,"ef79ac2a4dfae38729ab896980866eea7597336a883e326eb063b62d0b0528b3",9.917710196779964],[11498,"026fb3ea7c8edd1175002f548c39a7ddb4562ff824d32e8da8c384671eb488b4",138.68092691622104],[1380,"ecbd2a9aa11c1014f5bb67cefc22f8d6e5d530f889498707b3100730d126e1f6",9.917710196779964],[15760,"2c4ba354f5055f3d6ac99f8fe363c85d334f73519dd6bca1e30df4c7362d386e",9.317957166392093],[17031,"18ece5a99c19c89056c84982af8ea38c9c04d27d655388c44e4a56edbc155c51",9.317957166392093],[16516,"16e221c91e61a19b9a3a0716121eae31f41d94d5d17f528dc1b27c4ff3aae35c",9.317957166392093],[2423,"72d8cea8f7b47b3c2598c4070a1946c00db14f8aa63aea70759578d0153154f0",9.317957166392093],[5253,"53e0c681bafd85c8bf250d3b681e8a45d1222af779e17bce752e133f0b1db1dd",9.917710196779964],[1798,"94f0ee3b5a418af248c22d4fb9cc59e81cbc578892b27205c063356bcbfd44f4",9.917710196779964],[6024,"768236163d8469d2081d3628982bc706fca7cc1aedc21f8ffd74f50e88f1e9d8",9.917710196779964],[17728,"f2a4701385e99156620fa467645c58d34f3c21681147175933b0fdfb1f99a742",28.097560975609756],[1249,"cb793cd3d605b34512f81fc5d25d6169105e7f692bfdcbbc8b28c4d37c4fb1f7",9.917710196779964],[1939,"031c77e167ad54d342de332cb81b6e748ce97721e27d883c498c1fc98b9e6ef3",9.317957166392093],[6805,"b7548716112e64416832aaa6e0c61844190f69b41c76b5953721824735e339d3",9.917710196779964],[6268,"55e24aae8712588ceb5f825cd86f654262a06c465d68f013a839fc3c3cbe4ad7",9.917710196779964],[4558,"e5c853f0b3d336ec655f365cabcf16b0940ecbbe0fb80c78318463041dc0eae1",9.917710196779964],[15040,"da97b663cc209d8d4d001ec19ecbde21469add6df1170aa66abc2a4b05f9b77d",9.317957166392093],[3356,"6c2dc196be96b194200b218cdfd993f6cdd74af14361208ed39251eabe2bfee9",9.917710196779964],[8905,"d774bfb4e55744ffad616072cc1b7b1b81a1d0143410f706db3b5173fc306dc5",9.917710196779964],[19440,"11c080b43f16c5c14fa06f3d3144370c2c3c3cc23282f64b4b329d992dc02410",9.317957166392093],[19082,"7c74d24a92f6405803eb29856be8ecd1014e5bdc1ca9695944e7076121ab891d",16.968325791855204],[667,"1930119ef0b86b75b8ba36d91584b70aca8516b986c299e0e6555d84a69773fb",9.317957166392093],[11261,"b51a67fbb15b9ee471683182497471e479b6e2cab5a539bee10ffb82022a47b6",9.917710196779964],[2457,"14c54ca99f04f2b8483c9f18fffcdf086f5a1ad50b1ad306d3d280bb773e24f0",10.052724077328646],[5701,"87dd4e6e8671655fa70c68157145e86950293e0c15f0feac168b324f9b3f0adb",9.917710196779964],[14470,"0ce4abf3f516799a4efd1973ea5f36a59c340e598ece4e734e4faff4b620df89",9.637172758800602],[6895,"395ba184dd211ede5c2818d3e9c8dcf89a7af20ac1ee5e0ac3d26e683139a8d2",9.917710196779964],[4451,"b1455876736fe74e8d9ecd748313232c307142a85a382804432f523e921cbce2",9.647446457990116],[10438,"986179fd8b23d25319be52f33a6d5890f84db4c72244a371f3e4f45612348bbb",9.917710196779964],[15404,"2a5bb540319157e12a3f4fa0c0961892f4e5072ebc8f2622e341599b2f9d4276",9.317957166392093],[7828,"c3489927fc2851bc8ee619ac1694cde427786ffdb85e7845d09825c3749f97cc",9.917710196779964],[11053,"d64dcc014aa412722644450623dbc6361252a0008e5880a3bbeb4b26cd79a4b7",9.317957166392093],[2075,"03a9f288f858afcbed3a9187c13b53ebef74b4f8ff734bdd9bd018a183b668f2",9.317957166392093],[15249,"948d9473250dae905d2811a4b90f738f58442ea2ebe4f3945e06ab5d1e637479",9.317957166392093],[5703,"f1b6bca0188e06cbf38f5c999abc7dc4b5a67def8aebb8794c5be83082ee08db",9.917710196779964],[12188,"d92ecb5c7c72abb125c4f78aa209fa8ce319f561c97e476657edd86aebd325b0",9.917710196779964],[9465,"80c8dd752a9427c83a1e5c5d5208c2c6a0d39fa259bf991c24a1fc1dac12f0c1",9.317957166392093],[5943,"7b5c3581b2d4d7ff0bfa908c16a23aa1f10caf39214e756e5b84cdf3d8af6dd9",9.317957166392093],[16145,"7b262fc1dfd84fd6fdb757f883c893de5e4a8fd63823f45f542341c847d01b65",19],[10650,"b736d84916ea5033bcbbf1ba25016d3ca6475f3e80c444e8d46d5620055861ba",9.917710196779964],[3404,"f2e294c04313f3dcd6ee636a2a2ba6d1d4f43f83615c039da62c56c5d93eace9",9.917710196779964],[15842,"40963a08b263561302192c39b31f1ad8ce8c1ad7fb45ff36d2d8a0ea4b467e6c",9.317957166392093],[19863,"a9c2a4f2625a8fafe26e4a6984d997fb9cbe20df47d9ce64196eae7dd5d27000",9.317957166392093],[1451,"7cdd1fbd17c44a2d85e50c0dfb009fd58211de4b122a9da15318183506057ff6",9.917710196779964],[18617,"b5392cca4d4c525d2261db220917d7236ab824a4a372bc80b8966b81436b3d2e",9.317957166392093],[4496,"01cbea7392b63249bb1bdc7db9c61222b02801df04eca69e935e3633dc8a6ce2",9.917710196779964],[17604,"14ccb074c2a870b1373713fa2ec48c0a3f066a08c4042b839a3a3259b3abfd44",10],[9411,"4090406e5a16a798f2c425b97f50a948de7b49450510f6c10b433e9cef4e3cc2",45.02173913043478],[18694,"6e906bae476d7c007db9739ec309934d78ce91523d8948968326d31188e2942a",9.647446457990116],[15303,"c7d039c27ff30d0733d493108772da47687b64c307cd44007c0bb3ad0f905578",9.317957166392093],[5313,"b8e0d19d8702b35181640dc0bd9e8bf61bc53ba98cac2d5685c359c6571e4fdd",9.917710196779964],[19449,"f33bf8cef9cc328df0adcc9f8782535a89ef8859ad3ea52db1e06d117b6ee50f",9.317957166392093],[16907,"8b71c37e56fa0f42cfcb945cb1c45cfcb98bb8589dbde6ff6134cc8b78affe53",9.317957166392093],[8889,"20f86490ab67732d30de8babf00225a5b74e369f44135eca0a9ed6b8fbbf7bc5",9.917710196779964],[6273,"586719e2431336adc0033c0f73cb49d5bff636c39f558ff8423e29703e9844d7",9.917710196779964],[11071,"0b3cd45cce8a83b76d34dda3df9afb7195c8b085a2d765c7c10f297d85bf86b7",9.317957166392093],[3227,"8c0bf350543b76bd3a075108def97c3438373124cab1b5549b8186060eade3ea",9.917710196779964],[19626,"46406270b90c084b2937763eef8e0717bb563e6805191d92fc49fa942a8fa008",37.93594306049822],[9422,"2fa4ae1a5275b13f68a0a55e27de2a410af5806794da1b894e5ab61388702ec2",9.317957166392093],[16305,"c27862bd84dc9b1ffab0bbd460d9a9e6897fa8759ea5fadbb1ba87ae17870461",9.317957166392093],[9463,"cac7ad7891fde188fe7a1bbb1f061e8245d1e30b65a888f833dd6a7ce75bf3c1",9.917710196779964],[14175,"331dd355649847449ed334761a6d01ebf8fd73d14f749e07004f195b6b6be690",9.647446457990116],[16172,"406223d3dd71b0a8888a1acfcbdaae33fe3f5434545e09a25b0ac0fb12ff8664",71.301247771836],[7255,"20434b4bf683150bb1cae5dcd1d1d03205c9acb3f5920b28f6d28835a2fb56d0",9.917710196779964],[3251,"008f533062f027ae66b2a83138b686cfbc19043dbfa5003f3603cfaf9cb4a6ea",9.917710196779964],[4684,"bbf3208dbe114d855f6f94342949796717a95a736f04fb2972268905362a1ae1",9.917710196779964],[5674,"b1615aa2fbbac5289f27042a5fe82817882fcd72f21c74b175177ef216882ddb",9.917710196779964],[4937,"ab805a12fef1177b9ab547406eb05baf5c6e8cc7bc5025ad31a5192f351e97df",9.917710196779964],[2145,"8ca998833f42d0d780be1fd90ecd8fa6ff16f773b7a64c81f4f0527d72a3f2f1",9.917710196779964],[5122,"2cb7c1e37d5032fd96fc6ba2b6e3353030b156067ef98cba337fef06341876de",9.917710196779964],[8719,"b9d230b9eb14d3cfa36328b4e9e2df115efcf0f27865e94b70d6059465d690c6",9.917710196779964],[5147,"28c8399e410fa5ab5245331f5a89dce0bcc111f0bc5dbe00e496740bf44d52de",34.26086956521739],[18360,"085fa05b18fd64a1666e86f732ee26ba2545ad1789058f673afe1e672bfe7f34",9.317957166392093],[15646,"074093136a5027773cff49c6056ff1e34f439d8f89165d6be0cb5a5bc1c77070",9.317957166392093],[3990,"d75c19158b90feee7ee97d889a3e632870a10b6a9f577fe5110624e382ffc6e5",9.917710196779964],[14925,"e5adec09cac7cb501fc18d68802f6a3356285cf8f4cd6ceb6ff5d3daa7b77080",9.317957166392093],[4136,"b62ee60564ae8022649deabdc1eecdc368e625a51df0dda1b9fede7f2a07d2e4",9.917710196779964],[1333,"0c68e97a107f0526a949c6c810b4f1acbc502e6da7880def61fd879834db30f7",9.317957166392093],[319,"f4d43a175d806e4215a9fa562470b11cfd9dc12b3600bb1a4b221bc9a87ae5fd",9.317957166392093],[16992,"3cd8d7e31e48d81e5ed058e05338d94f381c99ae573ef96cd9c1dc6044d23952",9.317957166392093],[8232,"39f539b9938ed4d2f72b77b362f2a39f20c6f56b46521801845073c89a2dbcc9",9.917710196779964],[3872,"71d1918b0bf05a3e2891ead63f8e445fe62802819d624404407e5601ca9e8de6",9.917710196779964],[415,"d39a3e8b40a992f73a3ca3c1d7871416b87ff9745d1795c6dd831c9d19fe45fd",9.917710196779964],[15419,"706b55b665527e9e7b3acc1f1e80b28d4f14f2b3046ef2516af9f69d1c5eed75",9.317957166392093],[6852,"e8eb4917f19305aacd17d96609fbc2d88a13f2fc85c10e976ee74879437df8d2",21.057471264367816],[5130,"c2f99b6ee5e28568fe57529db9856c94e1465f445ad03cc944274019f1946cde",9.917710196779964],[19147,"645e1f657cf8896fdec0cc7939472c3fbea24818feba778c0c28b428dc1c981a",9.317957166392093],[16136,"97e4fb82c8d06cf2a4cd65665e4f5ce0b635720fa2f5b49cc35b17c864b94965",9.317957166392093],[15315,"0133bf6442da90887685b4e9cd6e6190b42da9b8cba434b59599a97a16b80478",9.317957166392093],[13246,"97518da2854f4c151fa1956c850b222dc607a638122c5f8360efd590ab2ceaa5",9.647446457990116],[2206,"5ff2b00f5c3f7df1d181d6151a9ba503a0898cc78894677da90e3b438e607bf1",9.917710196779964],[16588,"aa826fd7b9c045932fb833fddcc19183dafa8d37b0098bd639d05e1c564f3b5b",9.317957166392093],[15764,"f393e383c1123e8d9ee438c61409e9ac816a693af77739632575139c21b9186e",33.721254355400696],[2420,"bbbab8c503ba3508c4111c060bf26e641bb3df2b48f479f5482ed2e75e9f56f0",9.647446457990116],[10002,"4b8b0c55715e2d0492d9a0042ef7496302df5c6b9e2a50113b2fb92153a051be",9.917710196779964],[12763,"3542b9c592bd2c71a558644d83fae80f363f69e5ed1e9af4314f1710d55425ac",9.917710196779964],[10818,"30d7d9c71607aad9a8bcaad542953dd4bf32ed84ab2037912bc87acfbe102eb9",9.917710196779964],[5437,"a3f2c730667c849a4444b0456f772f2845cee3d2753fabef14ea175bb06a8bdc",9.317957166392093],[15996,"aa8f3508737a85485052a2b2939705c98f589f72d7059ebce68745b081f29168",30.16042780748663],[11499,"a6aba40d8dd16df3413bf23db68cb04ed75741a285ff122a2c77588c1aae87b4",9.917710196779964],[213,"85cdacaa5d4104ee031a018f6e5fda738e06569c2fff61b5298144fc68278dfe",9.917710196779964],[17491,"6245641e6c248b16298ed80ccc4fd8e81553a4b232dcc039660f07ea44bacb47",9.317957166392093],[4620,"2ca70aa8524a39b8c0bb9ad38616189b5bf15ea2a9999ac72eef447a0f0e7ce1",9.317957166392093],[3133,"e8e16ff081bb3dbc400d732d37e2285052d57a72f0328f81b8bbcd197c3375eb",9.917710196779964],[2117,"f1608c4a97d46f0b683b769239376a00dc7e41885f8028017a3ccb3ddfc91ff2",9.317957166392093],[9574,"134cc4884af0e51d704a3ebc3a6fb90fc5bd681a2735115c7dc7faa6388c29c1",9.317957166392093],[19731,"1685ff49865b54af10b99ee6ee5995b36d435882e19136c1bef3ff803aeab805",9.317957166392093],[16001,"b94e896ea06fcfd6bb6862cefb9c593072dee330f8aa12daa8b26b0742997968",9.317957166392093],[7345,"408b62776ad76882b2ac71cc70b8127f8831d5daecabdb1d793eee22e30cbbcf",9.917710196779964],[16166,"e17ca8d8f6fd5c83015b08c2a7404fd0aad6414d3d096d6b885d0b673363a664",9.317957166392093],[10120,"4d53f4a93a797d9418cbc0c6340e4b7f37c1d2e93b17e77f89445566d46d91bd",9.917710196779964],[5225,"e20e01ae34a90aeded118f31f4a3b8f240131f55cae8881ae5d1bb76baa4d2dd",9.917710196779964],[14501,"40922146b60caf2e123d3e698c43b7d09b3f6ccb2b3d811d67086ac303ba3e89",9.317957166392093],[15147,"a8182c060db9c4cd845f564d9b9b6e3057367a812cfec8d97cc1dde0a17f957b",9.317957166392093],[13174,"3983a92b14218dfbc6024fa6d889f9633fbf814deb11666f6e849a7af26d82a7",9.317957166392093],[13760,"64586509c037916d6963949c567e7b08d6fa9d5961c23e60e935075a29eb1b9a",10.052724077328646],[13013,"7560b37e703f4dc068007054e770f2e23a7354d3a4e3a228c0b7f0192f0c7faa",9.917710196779964],[4603,"5443cbc90e4710c9808660762c626119ed79e78297e45553055f3d87857f9be1",9.917710196779964],[13462,"84838859150339f6656ea43614d9129340f5266a993d41d21e8e810b4093caa0",9.317957166392093],[6150,"9c51b7fc9cdc565ccfc79fc9aa93e5e2fb1da8b114b7922e993e87b3ab4f25d8",9.917710196779964],[3375,"1c9ae98d91a0e0f16420854c92d28e9a6b83aec5f601bc451d4ac84b4951dfe9",9.917710196779964],[2783,"f0677f28a00760044d358a29f6cb12fcb83406aee64d1665536b17b4b643dced",9.917710196779964],[18475,"0a0e87f7c69f489c5ccd47b4003a83037a035f71921b16e6ed49ab200a7b0032",40.70935960591133],[9688,"c99213ae30c6a9182f163d7e44e18b44aedc1981d1de321ae6f229484a1379c0",9.917710196779964],[12602,"3d8111fbebfffc1dc1ba4a5610728350c0ecb0c8c5eb9f21190d07b6b66a41ad",9.317957166392093],[16669,"9b0d48536e9e1a1e1b787d94165b9cde33651c23ea03e3951a6bfa0749744d59",9.317957166392093],[17655,"e63b00f1257a86de519f6a1f2b851c317f952330a3bf78995084bfeeb9260e44",10.052724077328646],[18255,"1e2470c8bbdecadbb1500a366de7f438e3b2a05706d613d5c7472f571765ea36",10.014471780028943],[16428,"9827bceb88161e7bf1a7544a5185e82182e715a64432c2dc7cec7441aa218b5e",9.317957166392093],[11076,"9ead96e88961718390b6eb154a52618eb3c984172e7ab40b4531f741147c79b7",9.344814676151254],[6676,"a19200008c0242666d4d995e905a9547b862466bb8a232e8138604fc11fa25d4",9.917710196779964],[19774,"1b57ace7e7c81386ae6458f9e1159e21ffba0e9ed9f131e2b6e5c23a21c49e03",9.317957166392093],[17976,"16a5f396edb99a1c3b8ea3d1cd1507e4da527c19ab7c610fe5b2ca0f019f973d",9.317957166392093],[16284,"0cd4a0e46b504b4f7680f7a03168dc9c1bb228c0900f4a0ad1d42ffffa049061",9.317957166392093],[325,"a3b9acd6806e24eb1ff8ca902f668615bda66826e443b967fd1b0d07f56bdafd",9.917710196779964],[18731,"aa1a4386999e5a17fc03015750b4c24cf0aa49aee4147a8f5f85f730a1c85329",16.19964349376114],[570,"a78ae68e78d4bbff67a17aec7c9ebe1490b1213de894350e020f5ee69f9b22fc",9.917710196779964],[14928,"6aaeb843b4b226ca7cc985b5677ed21f1ee097ea361599930b1dbfa0ce765c80",9.317957166392093],[346,"3603656a5cc937857d7b291c4e2f17bfbcf179f8f48bcf9024a42d1a7755befd",9.317957166392093],[8397,"b9805490098cd7335ea9dccb7f42c64336cb0b179b28239a6a785dfc42289cc8",9.917710196779964],[15933,"b4401142bfdcd48ae2062fd12b3ab846f03ec8ede47c5d195655a17958355a6a",20.306595365418893],[669,"0e7d899347b0b832d49a6df1eb7826ac77d524ad625fc33f03273fac97856efb",9.917710196779964],[11884,"721b0cf3fb97cba57574e2c62184bb3f8270b8c7a0e5e783bd8b6a2926111eb2",9.317957166392093],[15939,"f29e7f5ba04fe85592254cbc643b84e1f00c004a45b8d8538745e2160c8f2e6a",9.317957166392093],[4894,"45373891b743ccb59c18d6111bfbc4cbd29b95e175b8de6e39b168762c04e1df",9.917710196779964],[3078,"fa66564069a76568c149b2b00ec2a5b1587d2346059b59657f3e4c8feda5caeb",9.917710196779964],[63,"9becf03b0f453de3a05ad1d602f5b0490d0b8a5722611230e43dc2b052b990ff",9.317957166392093],[15356,"4bb9c2effa7ff2d1361d5d14e4684b33357f80422f28621088b826cf8b914977",9.317957166392093],[18678,"914c9915879dc196e70c8cb9f544537cfd9c1e1c9125d54df028548e6b1f5c2b",9.317957166392093],[16522,"087703ecb47629dfc06dee7e93e851e3d38ebe6477fbdf859cd6c43141f6a05c",28],[14986,"85912dd76f8b98e517e03e253519018d791e90e641fc72c2a020149d3d9ed07e",9.317957166392093],[10377,"eb2dd0cc7920550daedb414b214a1552ab5f0cca6083afdd7344bdccbd16f0bb",9.917710196779964],[6159,"67449c9d8c1a767f739bee996289c9d9433215c40ca2a041ed532e6f265818d8",9.317957166392093],[14998,"760204e6da9e93bb08b109903d284461d49208046964c4f6b34806ebe877917e",9.317957166392093],[19365,"0d60e2c8069309b7276d779fe8a34809e63d66178ffc0c6670d0cdcc86043a13",9.647446457990116],[8630,"9379f83e4e4b81622ed5078b125072def52c3bd25a5ef42a11d1041d439d3dc7",9.917710196779964],[1343,"7bc8c89540b872c5daa68636b3c921ceb28df685321d6013e0bc9d61d97321f7",9.917710196779964],[14648,"acbb60111e69af7c00cc1922b523a00df765073e6cef0c28b69118abf564e985",9.317957166392093],[3857,"5fb9e86429aaebcdb4a1d5b94ced90328ca79e45f4050a7eea92060a749b9fe6",9.917710196779964],[2374,"613f80603807687daead5f6836fbd3cc022b1894275f538c2038c4b61891a0f0",9.917710196779964],[16410,"516ce847eeb2a66b3b5956500af97db4e622ec38a5b80c6b9930734998cbef5e",9.317957166392093],[2386,"b888fc49e80f0f20724658009601b4de7d2f00a1ba01524b46483139486f89f0",9.917710196779964],[14558,"e3c194681c013c462d7b2fc74ddb6fbdc7687dccbab1cdd75f4f329532d9e687",9.317957166392093],[18476,"7052bfa420f9b9939419d627be0809821d44731e50a5188209e8c00bea04fd31",9.317957166392093],[18503,"160eaa77b97f660c76c236df72cea2e2ce1d865cf2ba0cfe790f91c2e7895731",9.317957166392093],[1712,"8e8a0d4761bf2cb79dd7d37685b6030a0f681338f95edc93735f52fed581d6f4",9.917710196779964],[3524,"6d8ba47baa45ec0d1fdde28f4cd85aa08916fd88289c28bffd35c376583acae8",9.317957166392093],[6917,"c6fb079820a50e5db69e78089bbf7b982da2f019c0c611f36350e5327fcb7bd2",9.917710196779964],[1679,"ead88d2353f6eaf3d75443e7eef2d7695081e86e3b1f4ebda5ede8f7754c0af5",9.917710196779964],[2137,"eb81105c972ddefd6edcaebfcd16ed52bce0f74f82a84c7a14af1476d95703f2",30.134529147982065],[12125,"52fbe8fc821b8b50c880bc0b0810f604d0e7fd0f0233afed42d957c230a483b0",9.917710196779964],[5016,"de0865de80cb6bafc6fb68802a32a53f4979ff64d8e5bcc6b61855289cdb10df",9.917710196779964],[19122,"ce49bb65f477fa94d8d55df42a25302cad2323cc887ce644812a7a79917a741b",9.317957166392093],[8705,"8e513009cfd0828eeb48dc58d41860e2b4fb920f6ce4781892f9fb93866cacc6",9.917710196779964],[2588,"f16df073dac27a97a71bb7b9f883c522aaf20dfc4b1bd95f23565394a50b3cef",16.056140350877193],[19305,"900b82379e84a64e34e5cf1fd433cc90dbcd6a35607b3012847cd2704d1acc14",26.036553524804177],[16018,"12a3968a7e958b0a03f1f774e5c77c82cdc32f6107bb170afc10923873891068",9.317957166392093],[18675,"8d5b3292ebbdad0433043d015ff615fef47f4c6b870624df0612cc694632902b",10.052724077328646],[8021,"de397f9328826885b2cb3414ae4cf71eeb226cd2bc8076fd1b9d941b5e216bcb",9.917710196779964],[142,"457b91ec7c9c22f131f6234963cbc0b8523afae91278aa5f224c455d4f7d0aff",9.917710196779964],[11306,"ced93fbc33eb727c1483facf23ebe43667492144b64037e94330e536d25cf9b5",9.317957166392093],[13012,"ab061f6fb8eb639a4e5593685f635f05dbe95974d52a4cf8a1ddb9c8388880aa",9.917710196779964],[11986,"cd89a03e82a3502a8481947159cbb264d71e594b1520d1d4afdeb591c16c67b1",9.917710196779964],[470,"70e42393df05a11ca53925f8161c3aba3b639ea4c72f56eccc1f0dbbd9f9d7fc",9.917710196779964],[7970,"d79b2e46467e57cd1e4b49f53ab9839c43313e496be73bc6c35d3bd6c2d9bbcb",9.917710196779964],[10370,"580715ede048c3a1097d2a3bcfff89bc00a001e8ce714e9f19283c2abc09f4bb",9.917710196779964],[11548,"dd8b0a3ef73dbe3d749cfd8b50ce4890922ee9eda2565cea4f2e6b8f81de3fb4",9.917710196779964],[9113,"e59e05e3c3e4c1e796ed866163f3dbc891dfc0fb315400826b2c0fc11d560fc4",9.917710196779964],[9139,"ad36c985d1549fdfc72de06c025a71c0feb4ec52e186ee840b8b208325d0e0c3",9.317957166392093],[12115,"ee2250efed7d9b2f79ff3bd82dd17b3e11e0dc74f21cd6e7bf99f5c03608a6b0",9.317957166392093],[17776,"9f3f370260d253b506621148fdee8c5e21bd40f123383c3da2d4b7fa5191ca41",9.317957166392093],[15656,"28364995cb030c366bed921be55824e0fe291915706fde4c4851ce0b81573570",9.317957166392093],[7447,"57d2848499e399ef328cef079399ff6e78136a71730bd03323445252efaf1acf",9.917710196779964],[10204,"6a5794d87b167ba15f3ba94c9964dbdf982ec818d73edc18b6a8d32d9b32f8bc",9.917710196779964],[15330,"0de5537766ce950e85453ce7a2d855a094d6f7bb8c12a902ff076a03df69c377",10.030959752321982],[12875,"4b2bc088532718899ddcbc6789973af1759273ebff706deb78cc73ec60b96bab",9.424083769633508],[6045,"0b52ca99c74664a42b38682dd8ad624a9ede150d936072010c923e3aaf2ccad8",9.917710196779964],[7178,"dbcf1a30f31218dc748a50d41c056e4df3df61204cacf7b11f4aa182a260d7d0",9.917710196779964],[7950,"1c778de59faf4abb2297e14d968aab48726fe481909474e860ae1584105ddfcb",9.917710196779964],[16406,"a8b62cac825bddd25447b9be13a2773837344621f83f5a5f08419f0be808025f",9.317957166392093],[1010,"669fa62f1607c7c059dfa4f21304bcc4a41e9b8a5757e05e41829f0015f724f9",9.917710196779964],[11180,"aaf6524124401cbd72476c073d341401f2cad71915b56b354e6a680ab037d1b6",9.917710196779964],[2237,"7c4836a6472e88ba60065c85255f6a8dc487871658ba8fec815b1a3cc09a50f1",9.917710196779964],[11758,"689bf37a9d13a816653cc8a401ce31be7d67d9216cae5ba3f885d41977f4f0b2",9.917710196779964],[14708,"37d902e1cd39c99c26b3b1f9d58a120f1bbbad18d07e0a7149417668f879bc84",29.93211488250653],[7545,"4519b9198861b9601423db6cdcb940156be65de9c8845d017b23a79129668dce",9.317957166392093],[6995,"1e27697a9cf88778ff2b0854e27352f8d536452c473e73b727af9d507a7809d2",9.917710196779964],[10822,"cf26a0c0b2d24066d908fd9c94d960d29c7b4052f5805d47f09a82e12a7227b9",9.917710196779964],[16258,"fa36920df56d570f3efe609658fdd78c92fd61f4b80e6edcace62e9329452e62",10.052724077328646],[19614,"f4770c1fb7da9e1e91cd310cf5b8f2617bf9854aee38657360a6f288ffa26209",9.317957166392093],[11174,"c54f1393a0262b9e9e8015dd23d18796d61ce396249ee3a86b801b379651d9b6",27.185354691075514],[5284,"302a91f51e4fe99cc8a6ac4dbee553df5ca4930eb051d0055d5e60c356997fdd",9.917710196779964],[17208,"961cbc54c3fad07ec347be7f9682f3e918e4fd1a7d4f354b7a69a339b539a04d",10.033508207818581],[15557,"966b44691d606e1147fb3a75c6ed61649feac24f7c7a13692dab1bce35b3ab72",9.868312757201647],[19,"fd20b3f3df736f05163671a3dbee68a3393f22643c3d58c5cf54098f5d62e4ff",9.917710196779964],[16607,"99248cfbadc4edb50e1ad263a2fa22d08617bac0d01b50ae7d1e73365081ab5a",9.317957166392093],[9647,"1a131a1222e6f82d7aa099ad91de57f4fe22b447c28dfa625abf32348994bbc0",33.78407079646018],[5915,"6d3c6e3aca6794aa5678baaf8c1c2ddddca4493dccfda881beab450dfb7e98d9",9.917710196779964],[17806,"cd81d7cb54d4ec3ff2d1b6cdfb8bdd696b88fb2406e8c288acea326a37e72941",451.7711670480549],[18485,"ddc8b878347c525b7c7ea2f5525df6975e5d5c0ea7f58b3c20164dadd392b431",9.317957166392093],[18271,"3a359cec4fbe39bd29514bc462f951591f847097fa3efd387495bf3a6a836b36",9.317957166392093],[3204,"4b4fb918e23acdf02df22d096db3570bb87819a20911313be8a5e5bfcbc605eb",9.917710196779964],[2436,"cb642de9b0e9f44d7bad6ac6b1dac195a94b5c0cbd2b77fb101397ac523f3ef0",9.917710196779964],[11545,"684e0129b6b105b46f9a890ca60ce3bea72ef5b732f74c2a386246419bdd44b4",9.917710196779964],[1726,"daf06b95933249590a2827151823a5a0488264457e3133ad9c67750c9be6c0f4",9.917710196779964],[3353,"d209e72034aee5c1809ad59388c101f03079c626f3df5d9a6860cfa8dc3001ea",9.317957166392093],[2490,"b76e7bab4e406b0e5a1176c0f6c652a58fb740c8e7613610b7b717666b14eaef",9.917710196779964],[9156,"57cb8cf72b1955c1aff85c296129976797a60b74bcefd1f8d8a5ef6218e2c7c3",9.917710196779964],[2533,"3590a316817dda074db688785fc7a82bda9829500b31ccfb11acfc27eddc9aef",9.917710196779964],[8588,"80a7d66f4d49992133ac443d4369b4605f0cbdaadd5e408100394a8ffa7f7fc7",9.647446457990116],[9394,"677179eb3521e944c905852060b38b5a989a8df2a9dc0abe45faaa12143c4fc2",9.317957166392093],[17794,"510fdc3f6ba74c2e91dd5496c51bd3deecfce2e090bf8f4dbd4031444bd06b41",10.052724077328646],[3258,"c0de1383bf512aea511c94a006edcc5e27573e8f2b3e944c0969165c4ce9a0ea",9.917710196779964],[16715,"b204622a9f15fa88ac3ea073e8b29795a4be6255a0f84f35192f7d8135303858",9.317957166392093],[16067,"164628d683af2860cc862c4f1d662674c59e84794e14159cb860c0771b7ffa66",9.647446457990116],[6155,"e0385d00c36dab536c53548f2ffbfe6103583499460bb6aee2c8664d3f2e1ed8",9.917710196779964],[15090,"e2f73c5c0935e2a5a96aa7e5fd515049fdacb2111cb13c7626f2e43f3f27e37c",9.317957166392093],[7588,"6b8550cda5eec45db625bf26289906edf1ee29ce998a4e49093eadb2f77c42ce",9.917710196779964],[3448,"10f15535fac8c5eeb28b2f672a83b7173c6458a1968a7181ccbeb767812a64e9",9.317957166392093],[6654,"738964b6ef972a18621268326d2a3343d0844007e2691587696fce0b188549d4",9.317957166392093],[18450,"4f43f91a3c9b91300c0608043f9fc9374fef7db5d9f84c7783f64b4ff2bea732",9.317957166392093],[9163,"5a6e21856fcbab3d0463d5c71b27cd6344c73211bff4f931feb0d01febebbec3",9.917710196779964],[16456,"e6dce996c5d5e3858287fcc4ed0aac368f09d613d3eb200d3d2a6ec33bb51b5e",9.317957166392093],[11276,"1ab6b41c099e26ac4abd44ab11161c5406d7ce23c0b0c7ed5172c57c877c31b6",9.917710196779964],[16078,"db340a8b97d21ea08ba1c71df56f8ed49221b6c6ed2ef16b7add4d84ef8eb766",9.317957166392093],[13142,"68c6e5849e0677d9e3d3553ae3a0aeaef4b3a5985334d0364a020e9f68b418a8",9.317957166392093],[16108,"c28e6abb37325b81eb6ccba8e7ab32f83075f6a58376baf7beadc77d943ed365",9.317957166392093],[19867,"2ca5f60ab0186f199d3c3856db55a3ed8914fb82b64d9f3c1ff9ec93729d4700",9.317957166392093],[12687,"ffdfb78e45f402a0a54d783f46008cf6368401f98d0fcfeba47a4e36495ba8ac",9.917710196779964],[15664,"60afd7d7715ab86b8c5b8fe394265d60da646d35f78888f572b855c241ad1a70",9.317957166392093],[5865,"0f12ca04be968ab54f2d9fcf7c42990c10073c37d2955c904940ac1fcaa5dfd9",9.917710196779964],[12971,"8d91787c793fc35f5932b133d29d24e983d0052f443a70fc0a5c75e11df0c0aa",9.317957166392093],[15270,"041fa97fbfe4fa3377acc2b6c3e2cd9bd188171cdcd10dc73bb4c6bcd35dff78",17.077062556663645],[19283,"8c501b53573b1fd3105f4caad97547c5b4dba481ffe3f930ed8c7ea9a8ec5615",25.356890459363957],[3992,"cfc9d9b0b2748d68596386a938c8f2a036fcc2dca94c8a38c68aacdc5018c4e5",9.917710196779964],[18013,"f1d5694c532ffda80ceb17adb3ea64faced503104659abe2feac590cdb1dfb3c",10.0090661831369],[14406,"360c6956b21eb53e980131cb22c555da05d1b8a5934e5d637072730ebba82f8b",37.937282229965156],[7966,"5307165c18895f447acb6344c3cd078bc4175c4aff1928ae7a889055c3d2c9cb",9.917710196779964],[3552,"89269d3155ba25052801e7cc4bbfb9aede65f7282dae9fa915665149bc1f92e8",9.917710196779964],[6994,"6e63ab95aa88133a2eedce7ccb0a11b45cec64e7a904d50842496f7293660bd2",9.917710196779964],[4855,"72d1ae1b4f5be253f436c144cae861ae9ef82905a2157cc38526ad0508671be0",9.917710196779964],[10798,"b07e16c03998211b5a5df70e1dec38190a5c652ee1d8f4192ea66b92212a4db9",9.317957166392093],[8551,"55e364550ec7cbff8ae51df2507c54f8f95958c2fdd1678049e191b2abb9b8c7",9.917710196779964],[17340,"f1748848e90289b1116a2906cb1d0a957725dba38baa04bfa6b56c24dfad1e4b",9.317957166392093],[5527,"61263a1aac6c157580c25e0218ef8c3e517672398bb06e6eada2917288db0edc",9.917710196779964],[3148,"9514dd974d273135e51b40584812d8bbcf0ec179c6c471382f034fb8a4155ceb",9.917710196779964],[2810,"800c9dec613eff4899ddb293f95075d35e970a707d0adb3d07e32c331c4198ed",9.917710196779964],[14730,"130d530afc290cd67a54f851dda9b45a4f4fea70164d48c121b7dd0f90525384",9.317957166392093],[8309,"df2bbd210d3f500a38595a9fca1b7f9cf39de49277b0ece7c9c8a468e92442c9",9.917710196779964],[8898,"b40be1de618618f0da9b31cdd1faa8b6bad0d0fdece122b063cf108a720b75c5",9.917710196779964],[19387,"8e26e33d1798130a906a09bbf8070c6d54fda41450fb7b1d5e285650653a4e12",9.317957166392093],[13848,"ef623ecf9850510417f7d7445d2b84f8e6fc08259e92717749129efe29777098",9.317957166392093],[11405,"36b3dc53a8553efaa979736c61edf5880d376365b12b75ec24911d96ffaf50b5",9.917710196779964],[1363,"cc5a8ebaec19e796bf4ed944e2426298e2f437a6cc818e40dc65a019a571faf6",9.917710196779964],[6910,"4cf97fd16fdbfef149c2bef522cc360cb75aed735dd8ce80095cdc0331dc87d2",27.658536585365855],[15114,"8c746a9120c464adca83f17bca2d67f2da5e853c661c0e2261b7296f58eb5a7c",9.317957166392093],[9927,"63efb6ae4d31bdbc51627296979f2d0efd4d885eee996a1438340d616a72cabe",9.317957166392093],[14047,"a3ca1a0f2b59a60b4da0d2e0dbe2bae32fcfe98b56e67525a28d660ee1b9bc93",9.317957166392093],[1081,"a7e33b3b50d56402a56ac35f48b143d719ca8c86f2d102dd982d552e2fa8b2f8",9.917710196779964],[2034,"430ab7dff7840705cc59ec2d5b23ec8372f91e9775947e2e9583e9039727bff2",9.917710196779964],[18803,"d45f519957b7e5ae4849c3a47b663a2d2afdd595b281b7669c445b504d2ed726",9.317957166392093],[18557,"c560ac61fbe14aa376fba307ae10e873f2cfed0f08c6a6d812517700db484330",9.317957166392093],[17643,"5705da4c4432566ce6632a3cacdd8b671ea669024b78faece3a2ba7872985644",9.647446457990116],[10449,"6b264de2ad5cf634ce676dea329f8743c820ef271048ec94eb40f101af856bbb",9.917710196779964],[10677,"d9d094adc718d5e94e15ed327f21ec16fb3114f0ca839885a9924787295132ba",9.917710196779964],[4648,"20b43f3dfa3377cd2d9fc9c962d53888b289e344b11fc681190ae600449955e1",9.917710196779964],[284,"ddc60e8f2e837951d9ecadb498ffdcf438b87728a2097bda1b3763ae2a160efe",9.317957166392093],[814,"087afbd779d0377368dcc04f31940af1a040ade9ba5cae1b3f568de1af3072fa",9.917710196779964],[13739,"46e7587533743d379f34ad3eef0157b1022f21e3465de0b5ab2719152b08b49a",9.317957166392093],[18205,"e688ce515ff270ab457733762e70cdac3eb592950d94a76d76ab4cf29335e637",9.317957166392093],[15869,"7c625fb2d7a1757e1d541b34773757bc53ffe7f46dbaa6b4e1a2d2edcd3bbb6b",9.317957166392093],[2468,"8e9a867165f75483e7b5e186488048d691675ebe6ffbb5de09a3c610424311f0",9.917710196779964],[9356,"a4795ad28b8c0a40010f02e406c4cf9610b1e8b884d3f121f96fc3a8388c91c2",9.917710196779964],[19010,"2e9705a693f65d443dcd336a2fd87267054c58e9c5eee5515e31d98000362b20",9.317957166392093],[8617,"4151b3b955163095d118eb4bcbee7309bcc98345e271de6ce3c80026e7e04dc7",9.917710196779964],[16590,"67bee763fe32b1c18e41f984ceee29385b11fdd68deb04c74571551739e41d5b",9.317957166392093],[5669,"9b9e75ef14229a7296942b973cde411b72531a293d282c4ee940492b8a0b36db",9.647446457990116],[9637,"0e2064a006097b983fd872413e80de70e8b5323746caeb255f1f3bc8004fcbc0",9.317957166392093],[13994,"79309e1df951ab97f6ee2dd140f1ab4a7a9272f54a4077d29be81f52ae2d1995",9.317957166392093],[19681,"daf79e2c299ae3ada1c23fec2cc878df5d1bc1a38bbacfda75d841b1986a5707",41.35472370766488],[26,"eac0b4d41f68a33f98d03d16e78759cb785ae6e8dbe6b1ba05108c3b6a73deff",9.917710196779964],[11625,"2b3b1363a532cd376999f8b5a4e7258593cfa53c0209138ec27e7aaad3cfbcb3",9.917710196779964],[17144,"92ff48749ebe1dcb3f3b9230efaf4fbbac12a9889d3d90d727cde891b1d32e4f",9.317957166392093],[12438,"de8b48c2dc9c614e7acf840feb21b1146c5085074b847f552d9378d4bacc59ae",9.917710196779964],[18999,"cf9212ed0a7c78d709984ba8aa48eae6ddfdbb331c4feba700b2d512ad0a8820",9.317957166392093],[4650,"47a2740f7d7c29910b892bd89063fbeaf8a2e2bcf7e504468dd7b98b53594ae1",9.917710196779964],[4600,"71a39fe86e42da7188089e0791cb8aeb6b2f37f132204a26a0d4c331f61ca0e1",9.917710196779964],[5986,"ebdd9f9e8c6e3eb99ce082c5828dedeca09f2fff78d00ebd49984fbb21e82cd9",9.317957166392093],[14564,"e0cc95f59dd0a209b64c0fa63e9aff382d337745d9fac374bca516d43dcfd187",9.317957166392093],[18138,"720ab91650a5151639cdf2906d4ab0175edaa359556230e24d4925448a0ff239",9.424083769633508],[7975,"21b6211b11615dd6ad133ce663ec026abc6e37a443df4e131a5503f90ea1b0cb",28],[15697,"381760c342bc3c6d88a792e633a340143c642c0900254626a070f3c913b98c6f",9.317957166392093],[17324,"d6f12691386220d2a8ff123c7d7cc101ff07ef2d2689933c1fb0be6a7b75654b",9.317957166392093],[9925,"e0fbb3a889eefd77e1eea369890bb25c8accc1b1779aae3e088c897e8410d0be",9.917710196779964],[15227,"94a5874c2ee1b4ed04c99bd570b18b9e42097877a9c85b5412beb059f36ff579",9.317957166392093],[8427,"62d8100b581b2c904dcb34c47cd146771f4404caa7bd438af2e2d6c2ff6673c8",9.317957166392093],[17307,"b4516056783f2b0f37edf0bfe4d297eba86f570fdabbecc7ab637460ce6cd04b",9.317957166392093],[12462,"b95666106d17fd870bd84b9ae3cd62bbf0d4b46728b29b724c4a68e852f83bae",9.917710196779964],[6867,"944288dd28c354a8812184742b63f025fc3007bde4b47eb74ac310ef4ef9d3d2",9.917710196779964],[2196,"ce52ecf4a1e537d22a30ebbdf37f40c066020337a0c64327a0fb692142e991f1",9.917710196779964],[2018,"8f9f8b22edd0c747b73db6442e0986a82f1797ec9b12bb3c6a054fd45da1def2",9.917710196779964],[1850,"4aa1cb9336265285aafdb79a4be3accba88a7d6e278f705f34c9b31bdb72eef3",9.917710196779964],[18144,"dbb0ea4b3193c83ffdf3370f70a7aecf7c965caf9bbf0581b4e259755f40cf39",9.317957166392093],[2157,"e806c2a2561dce76921938ca48abccb16b527d3880d08edb7265064ac61adbf1",9.647446457990116],[17305,"595d59b9a302f0c10f37abc0b3a9dbb25b748be2196b387c2814039d62bae14b",9.317957166392093],[17505,"7059a5a3c27b8e4427f530e2eb854fb40d7f13e19116e92fa8c4927d919d5c47",16.475972540045767],[8452,"0eae2d76e672336f1f066438f203d046f01721e15a3568db9e15c134e0264fc8",9.917710196779964],[14596,"22ac1180342a384303d40d5e06840bf22f5d8a1388e0248f6e243141cd482e87",9.317957166392093],[16764,"a9e2393f4bf649c4674bf5f9061acef02ee0f3cadd6698cbff57d7399a352157",25],[9222,"d3c1c5f3f37244c227d0efee95676db11c4187c44264ec0b64a7fc7d683756c3",9.917710196779964],[6188,"429b8d93d3d7ce0573febd078d4cf4ee47027e86ab12ed21db23274ed586dbd7",9.317957166392093],[12415,"af56208532dec7364e5cb3bcee80b39d022e21e022a70a92132633dec71e7fae",9.917710196779964],[17995,"55a3c59c49de808ec767350c904a4a2ee34bf431b434f594b2b5f5feb4e24f3d",9.317957166392093],[8346,"21afb05a577d357712444cd0a489d9aa8e8124492319e4888269d67edb2307c9",9.317957166392093],[10819,"218b31767e9e7f43d4ee31c99b4f21e99bcc1b7734b24c3d91267fb6f7912cb9",9.917710196779964],[1206,"2d0c2e6772e8173795296b25d876be60096d973ecbc771638d05237665def9f7",9.917710196779964],[17842,"254ebfc233ea7a5b8da05106f9c84482872bf2dd32b1d884c46cdd5f5c136740",9.986861079955135],[3582,"fec407269fc980cda1afc007ed556adb78eb14b44d2b1ea61346847e9d5b6ee8",9.917710196779964],[17545,"f0d2faf0872ec07fccbf222e790630af30207da332e4ab4d29f183b066a59646",9.317957166392093],[17044,"dadea1805ce8b81b7bb48ddcd3a415336bc6163e83e16b0b47be1fac590a2a51",9.647446457990116],[15360,"5ee6843bafd4e6a64152bee12d21260e1e603b181a1f7897684079d67bde3877",9.317957166392093],[3708,"c26bd247affa93b45671fca65b7c0286457efe53e048329dcedb640c8e6888e7",9.917710196779964],[3382,"79568ee390011d7d2bb5378ddbd9e01b4f146bd366a6baaba0a98d043e0ed2e9",9.917710196779964],[5913,"09b15adc3b309fc557654c9e36a98beb0196bcb434d1a20d2662aaa99acb99d9",9.917710196779964],[16228,"29f7faf0ba0add6b386f31a10893e7b014b69f205451c38e7c1975b37f501463",9.317957166392093],[4472,"9ed4250a4d3574172a90f92aea6791d5359c13bbac083730d1fbd32d98d297e2",9.917710196779964],[13226,"a55145732ddd46c217946b58206a154205832be1ccc345b6bf576b19d2d45fa6",24.072948328267476],[9748,"a516918e070d2497ddec5e9324c729de981983cd9ad69251d8acdcf1af2a04c0",9.917710196779964],[12250,"d7ff35661b2cfc4d5e46f1025945a1875d9bfa867a81db1f43234e1c1120b1af",9.917710196779964],[14457,"d38cb451c788f1c75e070a26d6bfc97448573a0680ed927ba4102c781880188a",15.942959001782532],[19641,"85fa397d821093d9d5ddaf8cf3ec8a134994abda1fbdfaed9a300395474b3108",26.13903743315508],[6125,"8d14bc97e845c910bdc45ba567941f190b3c8ac2a922f3ddc022562fbdef49d8",9.917710196779964],[16711,"05de5eb263d4c1e619184be9c06f4dd6399f66ea3ee6253ee79eec2f29604e58",9.317957166392093],[9933,"0b46e107560fec6bfc53aef4f8586271191153990d52ea42e091b3802614c3be",9.917710196779964],[11906,"9f45110415ea0af705f2fdf70ec4727e34d531b3391ea81e2802c51b6520fbb1",9.917710196779964],[6660,"1e7493e52c72fce26ecab812ffcf783cf2e9810bed1a3082d05285f371b93fd4",9.917710196779964],[5205,"b4a2707d877c000f7497ca4e060ed0e33d4c79fce6556b059cd6c40f6105f6dd",9.917710196779964],[1336,"c285f4ec2ac28487aaa807e8f1304139ea363952f2b88bf7769c58c898012af7",9.917710196779964],[15459,"5c621a07f7fc35a851edcf31b075e50935bb0486b2eba051a8e7293fe1550075",9.317957166392093],[14635,"eb53e71cc528b2616ea202c8a9db9be5781ceda27bb8bddef2debb3260674786",9.317957166392093],[17892,"5c0dc3edfbb76f8f27649593f515d595c0bbae33183d56f463e30a8c02526d3f",9.317957166392093],[14144,"b17572b5d100e09ae0f0a9aa71689be80f9f50f15310f7a997bd7d07d1b9a891",9.317957166392093],[5328,"e84f7671ffe586137536d7c1f8e6ff3e292c8962dce50237297f83c6ef7643dd",9.317957166392093],[16317,"5d2b1fd19e748cb7cf59d27ac722ebdba3be0ea966a050b85ba648c21bd8a360",10.052724077328646],[3213,"a1e2e1aed3b59339f86fbc2fc93918e02f22377a6a7bd2cb4dba42e56622f8ea",9.317957166392093],[10993,"a0223ed4f38ce195c5608c55690c139cd2eac22f51024fa7e135315c168407b8",26.928759894459102],[815,"c1c18a1b9c5471f8c020f36256877cec13706e8730184f6d5959024d82d471fa",9.917710196779964],[9469,"ebd01235b1eb58246acbf960a8f733b1920d8ccd0bdaa64bc6779b86ef3ae9c1",9.917710196779964],[11982,"22bbb6210f707f2bf61d08e95abad2c9d62a98b74f18ca435e3af3430e686db1",9.917710196779964],[505,"1c51ca0d6a249b0eb8b2fcb21f302946b759b9e5eb3ba32ac4c523759184a5fc",9.917710196779964],[13752,"6a4ef61654215a7fecc8f4e2b0629df5186407f5fc3ef54f626b408febf1669a",9.317957166392093],[10428,"b3608ece29e433b3052c2f4207ade840f631209bb1c2b900cfd78bb96d7fa0bb",9.344947735191637],[9940,"650a9874b65714e10d4e1fbf7bd75ba926f5f73ecb46a0bfa25a141ab79eb4be",9.917710196779964],[13511,"b648e2a7da4335debd2e18618a2c3d681e6ea1b0a6d7cc699b8d1067cd3b8f9f",9.317957166392093],[14038,"fce5cb0697475591fa7390b7890f07bb34fa202b52bf782a40cf163f5c5ed993",9.317957166392093],[8598,"2bae66e6076190f622bd670a5c5fdef873d9c2b2215563ab09f1f144127874c7",17.089005235602095],[17186,"b6fc8e2b51240a96cadf5849ef8de2629d2b447eecd65c32db3e54828092114e",9.317957166392093],[11622,"8441b059dd75eedfd81e6e02734058363f36ff8e489ace609ef5f00b6182c2b3",9.917710196779964],[894,"51c3ca03456766d22eb1aab2f3a556eaa08df5f723646c371c6256913e18f5f9",9.917710196779964],[6586,"191ed07e4b1b13534ed5e25db7181aaa49ef47ed7e14011bbd8434d62c13bbd4",9.917710196779964],[17002,"1db26b339717b7f17672a80fb15654ff9f4c5d638ee16d369c57d59bb062f451",9.317957166392093],[9585,"065d3c9a7e73993b0831257c5eec62e13d3b58acf80d6c188ce14e3d3b4917c1",9.917710196779964],[9981,"48ed91c97ffa61e283ae4ed74a298210ac8c403a7d2c937b1502d88ebb0470be",9.917710196779964],[1304,"ad615b067c2755c8852a771bc291c5b1be1d3e90b4ab7997a2a0c7fc346f5bf7",9.917710196779964],[13415,"cf7f5e0160f8d050e461c5948c201a4bba10258b225fd5ab29f2ee1fb3910ba2",9.317957166392093],[18152,"b8e8432ecd5ee0c623e9851b9a02ab56d6bbc7c1da2357022d46f0dd28a35239",9.317957166392093],[4597,"4c4b9fc718b5377b3caf411e3594b8d26228149bd814f1d6eedca2cf0ff0a2e1",9.917710196779964],[15111,"2030ee722a7241e62804c3aaf830b127c29fd299f1ae9c23ac99b650c573617c",256.5445026178011],[17147,"f4ce2fcb63f465a1fc81c80e5716319186b5cf20ee3b69ef4c3688ef7cea234f",9.317957166392093],[904,"fe31c266b3a4dce07e1eeedba709879a9455e99e395578fed11eab584ea4d1f9",9.317957166392093],[1282,"3df03fac2cc67632b8d8044df5a6e5174627249129cfbb929877b380dd947cf7",9.917710196779964],[4832,"254ed0ac263cac7a6cd3d2efee6f733a61d07219354a74bd910a660009e53be0",9.917710196779964],[16701,"94091b9e2097351f9d387ff950be023418d9c31fb011f5186ed182df67f77658",9.491990846681922],[5615,"c1b3ce3c28ae4b34c12db1c419e51eea711b9572cf4a268fcbe88bdc580493db",9.917710196779964],[9530,"e1fa2b3b9ddc599a3608cb3424cd1ae05885b7867b7c6de9a2b08be1be397fc1",9.917710196779964],[859,"3470d90ff0c1637e1ee14a1d720393aef9d744ecbbaa6bd5add42d5db9fc29fa",9.917710196779964],[14735,"9df7b14df28dd464b93c3ae28881de5edce89214a9d221ba786e38a55c602d84",9.317957166392093],[8291,"666b72ad8fd4c592bd1929139bb295b3461a4c4f8ef2de57aa28682d43aa5fc9",9.647446457990116],[3011,"0c51eff729fd9786090a7693279187946cba39b688bc3d28e24f3ed46e1035ec",9.917710196779964],[19262,"af091b7b88cff361e277954dfd0ec1cd4ba1409a2a6d7dd0d242c816ee093a16",9.675862068965516],[3373,"ba455c14306d433fb8074e3540c40162361269207b318ca4de13a2564766e0e9",9.917710196779964],[11450,"da0e06b1c396f21f7f348e3630a58f7cf65349ed8d5b7037adb7126f51f8f2b4",9.317957166392093],[10039,"9137f54554bf68e7850d7e4a5ac7055065c4200310c7db4fe9b68937612618be",9.917710196779964],[13103,"45feffebd4f80185f20a9b739c8647b801add6dc044456318d194ce6512a25a9",38.72],[14187,"7d5cd89d5a06b5e55566edacc72e3ed572b17cf099985666c2b85a44fdb8ad90",26.291115311909262],[4720,"793640f7340424976544b64509bac1a171d3c25e0370ff56ed2394b6a04febe0",9.917710196779964],[7574,"bd222aaa1c6b42d21935c23bce4a9ca31737c6e06799b7e4143a6019355157ce",9.917710196779964],[6592,"624e0da3de2252f42e1bb33f897aa8115fc474e037584d95f04f0cd1b404b4d4",9.917710196779964],[18874,"901fb77ac18590fda2910547e68035770e0f2487f36249fc51a675ae58494724",9.317957166392093],[4890,"4984ec7683dbc0365851304746e914092899a71a17b634291db261022804e5df",9.917710196779964],[15178,"74fc822e9f9b7b97dd62ccdc02eda0a72445647ae1c93c05797c3d1caae8fe7a",37.014925373134325],[18487,"535f1f20c15f297af9c4f87834a10f388a36b43ecc6253e4157484116b4eaf31",25],[12095,"af04b3688f9706fe2180cfde299da60fe1c0a85f8c14165ca54662272a8bbab0",9.317957166392093],[16093,"63bf7d74dff80ba4e1f61a71fdfd73733700386a24b93782f6ac727690e95b66",9.317957166392093],[18400,"132b2a2d91a15db52b13cfb81e852bf5379f5eda5f2be6912f501280600f6f33",9.317957166392093],[10526,"ebe3249f6182c51255717af3ab36875122a587c180f3262ff6471166ba4902bb",9.317957166392093],[13237,"7bc93d23f289d817b86f176a8a5ece880806e8b0198d337f966785258f0525a6",9.317957166392093],[11097,"124fc171bec5e4ad9b3bcbd56fe282a382ec80207bc308dde04b5e040b2f45b7",9.317957166392093],[16740,"9b819eb2b88b21199d7b259425d5640287b9e045fde1f5378fcbbbe88e369857",9.647446457990116],[15105,"f602405d62d81d1c74a96895d66138de480fcb052c63c5c92a5e744667f17a7c",41.35472370766488],[11630,"4003163e56d94af01d560f3d94efb447c2ac8bc217a1906997a3526f7ce2b7b3",9.917710196779964],[14976,"b62f615a918965a3552902b575c0b2a627e08b0e0dd71f4ab9d185df5b7b197f",14.188948306595366],[12359,"df35b5c501637dd073bedfb20bc099aa9ddcd6c7d1fb0f50a6bebcf96e61dfae",9.917710196779964],[15607,"cefe72661f2d51ebc8fa04b104c3cd7d3e08af7328f83d5251dab5285b304671",9.317957166392093],[13260,"c5f2b5f54a6adadae51a96eb1ae08f6cf1c2aa45ce569c14e5f888cac8ea7aa5",9.317957166392093],[4055,"2a7dd569ede155409363b68dd428616a5936005d18df01cb02ff0af8667264e5",9.917710196779964],[300,"243316de468586885389486dcf8acc988309bd340b3b73a809f43858e93df2fd",9.917710196779964],[14606,"ec715465fe4aad57e841d154bc24bb0ed1e6394aa9221bb8a7a6ef0dda3cfd86",9.317957166392093],[2884,"45f4926c13d66bc8b7bb91ff41b702cf2d8b8218007b1db05c2018d2e6fa39ed",9.917710196779964],[10121,"8a79478430c84943e2410b363fc8f05e0839d960cbd7a5c97883d4b4793191bd",9.917710196779964],[981,"cbea13c775905d9f6ed4f7faf1844803baeee84f666df2114ad733d00f5551f9",9.917710196779964],[10784,"4c06151602e6b1d26a4fc5c5c51a233216485e14793503717eef145a63b568b9",9.917710196779964],[15172,"a30771bb9422b8ed8fa837e5fa40bb927a20046fecf4612c6c8557dd57ab0b7b",9.317957166392093],[5953,"f72333590e2541d4a95d68a15a52aa0b4e4b4c4a9f7ed43b90fa1aa4c28665d9",9.917710196779964],[10270,"019b955bf606efc79f22f7743c7612b28d600f17ab832d82ccb082667d4b97bc",9.317957166392093],[15254,"9e862a81d00d087baadd1f6c502a39365edea63210cc61439fbeeed3d8315a79",9.317957166392093],[10842,"3f231fd1d5dd57bc4fe101729c7f0c90ee63c0d09a8d4793a59fbf5599fa09b9",9.917710196779964],[8867,"393413f1149640ab83bd8cc949061f6a7f0fd9f13dbd8bdf0f529a938397a3c5",9.317957166392093],[17456,"ca337eb8b90798a484182ec2559d761b3b0cb8ab58d8b5138a257cac1367a348",10.052724077328646],[14562,"b0eb01c7eb8cc1d3b88720c8bb0db83c58b2061cd9090a4d590854532a18d787",28.124444444444446],[9398,"4dae4b6f97ef42cd19f9652c4bedc05f7a3786b4e6c7b1fb70c6f9f33aee47c2",9.917710196779964],[1195,"ef8eff69d7d8bf1923afc92cd1349806c7e8af2d91750ed13ec7e09d5d3e08f8",9.917710196779964],[9544,"153ffbc6bb245db592e67af41a378ca43cfa05ec78b1ec7ac93b0e8d63f46dc1",9.917710196779964],[11915,"abe8837b57d46bb076619075b462c0b88baef4e359aff624f62c0c8cea5ee7b1",9.917710196779964],[11500,"808ba7759529fe4c8e051fd229f57ba03182208aed738a9636fd0dcccef084b4",9.917710196779964],[7293,"9c4f843399d25e2e279a1a25f748830742fb6edd5d8f0f850f89cb0c881a1ed0",9.917710196779964],[13008,"04529b92a7f1cd63091e114a82f04b2324f38a25aadcabee6e3744ca97d488aa",9.917710196779964],[12544,"b17e4be4977ad079533f3371b6a4078a51abe1f11da57513b23ff29f4fb8a8ad",9.917710196779964],[17535,"eed4c6826f5980b8a2ecbb7c89b3daaf41afd06a20c1aa7bdc5db0ae5422db46",9.317957166392093],[6826,"9db4a451edaf7b99e40751d1d750ca1ec1d2098718a8229562bb6149d75515d3",9.917710196779964],[3793,"053cf7dc3ea853876f0919d5a18070691d687c12c8603a593ba5da77bc44ffe6",9.317957166392093],[11847,"15195238fdff8e0f474cb6469be4fa2cae69c304b9a757eafa43d71923d96bb2",9.917710196779964],[9760,"50897b04831f4313daa9f1b3bdc429d4e8c4072872399890e223123329eff3bf",9.917710196779964],[5993,"17bb9d5c04e4b4baf08659bff8f5fc3995870d0ddc4bb797e00cfd3cb6771fd9",9.917710196779964],[1009,"66813f495a575bb3d0918f28093cc31a48876511aafb87cd07c845341ab026f9",9.917710196779964],[4092,"c8edfe2db05a751de4d42dabb3c451612416a64e6c520e1c5eeff703f2f01fe5",9.917710196779964],[4701,"ca6504a0f93a0f5dc5beb4c7cbb0702c27c3919ae275f30981980da9df72fee0",9.917710196779964],[12377,"d4be8e332e83895759d79f913aaab19b10230a91f509ebdd0c200aba1c48c7ae",9.647446457990116],[16768,"7ea6d0a64b9ab5fb19db6d6dde069a612bf0a0b6e3c23ae67e420d797d861057",9.317957166392093],[19689,"03beca5cc04891afa0fd1e75c2dc8fcf0ed3b5941de43bfac45b3f5079ad1d07",22.196428571428573],[16627,"36f2e7fd07cfdcaa87d07b4cfffee0278d7d16786927a10ea78d6b32178d445a",9.317957166392093],[3177,"9906f0de63b8b1d85202c651dc8ba55404636a3dff54d4c18e6aeaade6412aeb",9.917710196779964],[15132,"2e46259bb2a343826b835e617ec75f9e2af650663176ebb94516552269140e7c",9.317957166392093],[8972,"bd2df9f999c8f32107b8e81c5ca715e84badd520dfbc44ce90435ebc28bdfec4",9.917710196779964],[16404,"85e38456d5fa48e188c8d605cd473be9affcec0065326d2ebc04fe8797cb075f",27.800711743772244],[4234,"80fed791ae60a4bb869e79ac8949ddc71f910da9d0ac7918d1a1eb2fc5ce31e4",9.917710196779964],[161,"125ef251bd87b362cdbd7b03ed51fab7a30f60b2e8fd2c53ce33a09aa1ccedfe",9.917710196779964],[10084,"5c1fbf788be9418030aadef09c0ce5d1c8126c5e4798603b11d554fd44d0cebd",9.917710196779964],[16394,"536b936dcce3db60009dcbf88bc4416a614305ee0338596a7b7081f21f572a5f",9.317957166392093],[2786,"dbcfc0aa82ee95f3f604926962a1dce13f0079c5761c88e9ce5e3df1a4b2d8ed",9.317957166392093],[8131,"c560bb856ab43dd7dfe7f8de5e8e746cc4c0c7c4eba30b8485c95486724f86ca",9.317957166392093],[15740,"66dfcd57b4d14aafbce3fb27df7b53d27689119ad98719542be301014eb5936e",9.317957166392093],[11821,"4341efc934972f3d230958b53d93151813d16f3b3cf4a2ffe28ed121d94991b2",9.317957166392093],[8320,"81c1b2f07964371b9b172b50c45dea5eb5397bd72b992f786dc2d671f46037c9",9.917710196779964],[4149,"f33f9dfc53b5914086f2465a16434767cb71b2524046f24aedc5bb5cb0b6bce4",9.917710196779964],[14234,"a8b19839d451ecccdcce2628a76a15a0113fb3a6b3a8a168849a35fb3060618f",9.317957166392093],[18041,"abe74bde42d9e7a6dc40c58a1f1a3fdb89ace3367d28c0dfa39553658083723c",9.317957166392093],[12518,"9b95de07c39b62de9afe28ba19f4e51552259467e26edc990b99e138842ad8ad",9.917710196779964],[14383,"a6040cd4ba462f5fdf5a91c10dc938480c7fba02ae5db9770f5a51beda5eb08b",9.317957166392093],[19735,"3c8080615bb028402a611fcffed0bf5896a47569a3e0481622cd1c6662779405",9.317957166392093],[3417,"d10d096e3daf09d4fa41e6b5620193d18fd7db2a064d204290d8551b38c78be9",9.917710196779964],[9724,"d8f0228c079265018c36968de67f50da04955611ae2185756bb8fc8e142430c0",23.958115183246072],[5403,"366f810d2409f3acb14100f6fd8046408e9b452135438230bcd4d9bdc70accdc",9.917710196779964],[12685,"12012ea165ce4e7347db97da412cb85c0ac9d5d0e32eee1da8dce8cea027abac",9.317957166392093],[15401,"4a1457d094568611e1398091303b2861f41f6ae94a4bb8466f594cd7a0664776",9.317957166392093],[14424,"3717ba6ae5c5591ef995ace53c5b4bf29ee7f0f23b5c829e6ed5d9e67d7acc8a",9.317957166392093],[14680,"496544618de2c5b5cef20840ed0991fd3bea227578974ba622bbdac4bf803d85",9.317957166392093],[4664,"f8a41ea58cd224268a0e594fb28d6ccc18049d9c736e5dfc562bb7e41e9537e1",9.917710196779964],[7580,"7d036a952595773fbfb5d8c42a008a00cf84b53e4de97f6a610d8eaec17d4bce",9.917710196779964],[2615,"fe1b061e0bc073d13fd4582515ad9199a844f047c0af2505832ac3ed70ac10ef",9.917710196779964],[17442,"28f7f0c9c070dd74091bded6a67988a795cc17304307814675497f826a9fd848",9.317957166392093],[14185,"dbbebc2a8e5493b9255fb1e077eff73ca2e543f1880da82f1c0e363d7c0bb590",9.317957166392093],[10123,"2c57304c2b8c6aa60f9d9be63a894423e5a25a64d4c239d40e46cfb960e08cbd",9.917710196779964],[1635,"15c7c16f1ef11a5bc8fd3fd21b4e9dceee4314fc639218bb4d1746d50abc65f5",18.130434782608695],[12205,"74cf584ca74ca05460a7d7e3c35643eed17eddd75532f9b65141bf11bb350ab0",9.917710196779964],[15584,"dd99fadac74d6e57fad040860bc76d29f8e6fbee8745ef1a10ca93a3e29db871",9.317957166392093],[10734,"0db316d9319972944d6df0e8a877cfee5df3d172503d400aaa4d7f4dc800c5b9",9.917710196779964],[7141,"916365d4f2687505116543e87ae22d002e5254b65adfcf2c8cf08971e97e14d1",9.917710196779964],[13522,"59c49cabbe23dda149ff3601e2da31abc34a3f9feafa450932c7071e34835c9f",9.317957166392093],[2968,"d270107979ed62ebedd19f8ee99d5a24072f6bf2a28d6ae30e03a09b8a6982ec",9.917710196779964],[15414,"7cca64a40c4de0942ac763c21343973917e9eea079b151818ff564c1de4d0076",9.317957166392093],[7100,"860c213a772c721afa6e82b384875ea6103f34edc8cb4d404da9436282d659d1",9.917710196779964],[3494,"78b59a19919e43625025c4c6519004b5418fad4710fdc9e04526040628bb04e9",9.917710196779964],[1064,"3f142b8237d818aa400d7808464545682e4a0e2d1bef5ad76345b4976306d6f8",9.647446457990116],[4176,"2b651e0948ff03800aa08b80d13a8d26cddb6271828a116d852d69214e0898e4",9.917710196779964],[16299,"f17440a5587ba7a736f224fa3e821c9cf449092fd9756b3837dcdca639922261",9.317957166392093],[13078,"841be0117a01dd8435860788f13df6751da598ecadf24ae7212f69c3ba8deda9",9.317957166392093],[8374,"da672dafac0feef2dd3b3b7597d347bcb7b3f58db1b0a1a31ee7222693fbcdc8",9.317957166392093],[4250,"49432842a11b8c52d5653f9fef2d6eade9bf152914ac2e1b3e6ebec5ec7e1de4",9.917710196779964],[4898,"4db4b565a9525221bbddec2d10452b758c36e983a7b38dbad33a085fbdc5dfdf",9.917710196779964],[10570,"79e5d3cca91047c670efb93522beae36073a6a88b4eb1a4e346b6833694dc7ba",9.917710196779964],[12484,"70b04d4e18cdd285f90717f80d800a92e8c56f9e4d484a538bbba7cfe21409ae",9.917710196779964],[2244,"c8d9cbc885ae64e245224882d2c8d891312206e87b3fda9a1efd3b346b9e47f1",9.917710196779964],[17024,"e9cd55797acd1cacdd7b7182a86685c396f5f4ac57fb0668320507e7c2f26e51",9.317957166392093],[4113,"48144110db733853acd0e62fb671884b9adc9a45ff31c1ad2c7c661c2f73f4e4",9.917710196779964],[3117,"310baf01277cf635ba1cb81eb7af5f9b545adb43c4c688feff86cb8022e18beb",19.228318584070795],[15447,"8c2ee04b51363c7367b8063043eb7bef2356ae9e692cfd719ad26d113bdc2b75",9.317957166392093],[13376,"bcbdd6a5495b7dee8b94c92dc3681bf76dce92ca3837ecd3633c8b786f48e9a2",9.317957166392093],[6205,"4b224884f9172dbcd1a218649fae7d2ec0b60955f40245d85769adab6c76b8d7",9.317957166392093],[13108,"8d9a7ea2ef9e7c8c945abc27c46420b4de264d398e24471f69278e3cf20aeaa8",9.647446457990116],[4152,"e527eccf558772feb71007f32da7735bd08120c804417e6eb8437d8a43fbb6e4",10.052724077328646],[18621,"5abf969a19af2fbefe31188f55fa4a362eb6f623f5d7b0bf19f8ddf94ce1242e",9.317957166392093],[17276,"581e9fc96d29e4b82b0ed5d0d91453b1f909d5b520bb9f82bdb3bcec6cc5b14c",9.317957166392093],[1320,"f5621a6bc27679c9e713cebf95fab40e198ca3aa3d607cd3523be7d242b549f7",9.317957166392093],[5735,"d37c51e3f80689421321bf1524bbbf8b519e5fb04c44fd5a059425cee788dada",9.917710196779964],[7429,"54512c1f64cac1230b59149c1e5d1ffda17fa9b5877420757c7013b85c8d30cf",9.917710196779964],[3969,"1db261adac980cb1dc44b2dc1d07e2dc09378df2e6cdc3273af402895494ebe5",9.917710196779964],[1058,"9a6ae4b788bc02a8e3b9766e99944b9a42a77a6bf61cc7033835bc90b0c9def8",9.917710196779964],[8279,"03cde9befb5139860605213e66ef5d144352cb07e4f47e54b8ab6eb056b57ac9",9.917710196779964],[53,"dc604f30cfedfa395a5499d303cfb34695d97efa85bdfe4f5e4b2b1e0c0f9fff",9.917710196779964],[3406,"066c85cd80b5ad6b757377401091c1c0a73b568f2ba2dae92100e9b10cc6a9e9",9.917710196779964],[8286,"7af3b384870eff61277b2bf2d758efd5000b0150f9fc8d6925342df1093b67c9",9.917710196779964],[1331,"cd4219ee92787b516a5a339a17e6ae87bd8a171c45d4c5bdf8e4b0e3ff9739f7",9.317957166392093],[18092,"c4ecdd5e6b1822bb705a351f5d4a67572309a5fee8d73c6b1c1575368bcb173b",9.506082725060827],[4917,"99ce5a1a789bb4a22e93d522ca1e8cd3fa67e0b95e4f709d95ef77d0f6e5c2df",19.033462486791123],[15458,"a72e6706c2958c39b6d5718b4e16cb24e8930853d123aa2d100b37b4b2b10875",28.110847189231986],[12528,"fff0f90d00062f2bdeefbe6c9ce9396d73c1940fd68ce01806d9a2dc057abdad",9.917710196779964],[3380,"62a0b6458aa4b0fd7d68d1e2fde2bc245408aa40ebff112a244260f43a79d4e9",9.917710196779964],[4120,"0de6a295a1062f0ed7b3168e36763c12724307452d36faad373ddb11cddaeee4",18.130434782608695],[5054,"3140558364f1623999ede711dd91134628bdc69475f3777efe73e5749debd7de",9.917710196779964],[2233,"4ad39263d7e8020be4d1258d06ba803c4fdd24d8f6d7ba320392d3d9b94d52f1",9.917710196779964],[6074,"e3801c37e98fdf6b13f728f972192dc39f315d8216228caaedff31d5d1e594d8",9.317957166392093],[16422,"46aba2c68f2ffba825653e662cec8f3666ef0d342c13eca2555651665034a75e",9.647446457990116],[16262,"36795167fdd7fd5fb9d588d923e8444f5f0e802d77de9a14a3057ba5ca921d62",9.647446457990116],[13534,"e83ebc31c7b52e4f340e0ee70cbf4bf952a0d6feb45bc21d88b1fd68cbed179f",9.317957166392093],[17965,"3e835f8742a49591011bbf0097e60371dbcdf37b25966d400034feb5b391d93d",9.317957166392093],[10603,"0c3806e067e81fdd1bae1e498e99d1f044dd6af6a42a85ab29af13996869a0ba",9.917710196779964],[842,"32253416852960cf261857c69b56323f9c2607535f7cc08bf51fc4dbbb9348fa",9.917710196779964],[8487,"707ff92e8181fbd5844091cec07127b416ff4a0e30fa99864f79f91530e417c8",9.917710196779964],[238,"f092660af44e9fe40ee5d9dd717720865a0b46ccd0a5201e56c5af9417a362fe",9.917710196779964],[17149,"9a295102e54564c8f84c76c7246f0d43d8b0ab3db4e1cb036eb218790ea1214f",9.647446457990116],[7733,"587d26300264b3286d8d5d3ab939bf866582b2f89a961aa6a16c5ffd37f846cd",9.917710196779964],[4586,"2d1f19dcd3791a3a79ea210a4ce58027e13bea9502240224db9e011100ceb3e1",9.917710196779964],[14022,"4a11339190cd8c7854f45f17018b94cc7b37c924063e795eac0f700369123e94",9.693363844393593],[19495,"0be41149861d29c266c36e674908ef0c9b0fa6cda86a8805de96caff4225840e",9.317957166392093],[15901,"e3fa485f7489f2e71cce244c29d754bf7f28a4bd63dd86ff43adb0f529b9046b",9.317957166392093],[5966,"fbc1a9ed866ecd8b906d39b71a89c3c6d29eadb44af337f512e341d847db50d9",9.917710196779964],[809,"7058bd2fdbf4d57e96a68ddef474e9e4335439cca3a73420a8f3b6a480737ffa",9.917710196779964],[12230,"f2b98e0fc81c351a7b974183154e40b8b6bc74bb2986907405f246ad5bf2cfaf",9.917710196779964],[16002,"24e1db661c0735d96e1c9c604517998597c52b7cfe82ac8b3c54e467d1b37068",9.317957166392093]] \ No newline at end of file From 10beb76585c7dc4df368f92ed4646fd77534bfa5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 27 Jun 2023 17:44:52 -0400 Subject: [PATCH 509/782] conform to core's gbt quirks --- backend/rust-gbt/src/audit_transaction.rs | 16 +++++++++---- backend/rust-gbt/src/gbt.rs | 29 ++++++++++++++++------- backend/src/api/mempool-blocks.ts | 2 +- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index d4e9cf1c3..393594b2e 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -14,6 +14,7 @@ pub struct AuditTransaction { pub uid: u32, pub fee: u64, pub weight: u32, + pub vsize: u32, pub sigops: u32, pub fee_per_vsize: f64, pub effective_fee_per_vsize: f64, @@ -24,6 +25,7 @@ pub struct AuditTransaction { pub children: HashSet, ancestor_fee: u64, ancestor_weight: u32, + ancestor_vsize: u32, ancestor_sigops: u32, // Safety: Must be private to prevent NaN breaking Ord impl. score: f64, @@ -74,6 +76,7 @@ impl AuditTransaction { uid: tx.uid, fee: tx.fee, weight: tx.weight, + vsize: ((tx.weight + 3) / 4).max(tx.sigops * 5), // rounded up to the nearest integer sigops: tx.sigops, fee_per_vsize: tx.fee_per_vsize, effective_fee_per_vsize: tx.effective_fee_per_vsize, @@ -84,6 +87,7 @@ impl AuditTransaction { children: u32hashset_new(), ancestor_fee: tx.fee, ancestor_weight: tx.weight, + ancestor_vsize: ((tx.weight + 3) / 4).max(tx.sigops * 5), // rounded up to the nearest integer ancestor_sigops: tx.sigops, score: 0.0, used: false, @@ -98,8 +102,8 @@ impl AuditTransaction { } #[inline] - pub const fn ancestor_weight(&self) -> u32 { - self.ancestor_weight + pub const fn ancestor_vsize(&self) -> u32 { + self.ancestor_vsize } #[inline] @@ -128,10 +132,10 @@ impl AuditTransaction { #[inline] fn calc_new_score(&mut self) { self.score = (self.ancestor_fee as f64) - / (if self.ancestor_weight == 0 { + / (if self.ancestor_vsize == 0 { 1.0 } else { - f64::from(self.ancestor_weight) / 4.0 + f64::from(self.ancestor_vsize) }); } @@ -141,11 +145,13 @@ impl AuditTransaction { ancestors: HashSet, total_fee: u64, total_weight: u32, + total_vsize: u32, total_sigops: u32, ) { self.ancestors = ancestors; self.ancestor_fee = self.fee + total_fee; self.ancestor_weight = self.weight + total_weight; + self.ancestor_vsize = self.vsize + total_vsize; self.ancestor_sigops = self.sigops + total_sigops; self.calc_new_score(); self.relatives_set_flag = true; @@ -157,6 +163,7 @@ impl AuditTransaction { root_txid: u32, root_fee: u64, root_weight: u32, + root_vsize: u32, root_sigops: u32, cluster_rate: f64, ) -> f64 { @@ -165,6 +172,7 @@ impl AuditTransaction { if self.ancestors.remove(&root_txid) { self.ancestor_fee -= root_fee; self.ancestor_weight -= root_weight; + self.ancestor_vsize -= root_vsize; self.ancestor_sigops -= root_sigops; self.calc_new_score(); } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 797f7f981..cab684a9d 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -13,9 +13,10 @@ use crate::{ GbtResult, ThreadTransactionsMap, STARTING_CAPACITY, }; -const BLOCK_WEIGHT_UNITS: u32 = 4_000_000; +const MAX_BLOCK_WEIGHT_UNITS: u32 = 4_000_000 - 4_000; const BLOCK_SIGOPS: u32 = 80_000; const BLOCK_RESERVED_WEIGHT: u32 = 4_000; +const BLOCK_RESERVED_SIGOPS: u32 = 400; const MAX_BLOCKS: usize = 8; type AuditPool = HashMap; @@ -91,7 +92,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { info!("(i.e. the package rooted in the transaction with the best ancestor score)"); let mut blocks: Vec> = Vec::new(); let mut block_weight: u32 = BLOCK_RESERVED_WEIGHT; - let mut block_sigops: u32 = 0; + let mut block_sigops: u32 = BLOCK_RESERVED_SIGOPS; let mut transactions: Vec = Vec::with_capacity(STARTING_CAPACITY); let mut modified: ModifiedQueue = u32priority_queue_with_capacity(STARTING_CAPACITY); let mut overflow: Vec = Vec::new(); @@ -135,7 +136,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { } if blocks.len() < (MAX_BLOCKS - 1) - && ((block_weight + next_tx.ancestor_weight() >= BLOCK_WEIGHT_UNITS) + && ((block_weight + (4 * next_tx.ancestor_vsize()) >= MAX_BLOCK_WEIGHT_UNITS) || (block_sigops + next_tx.ancestor_sigops() > BLOCK_SIGOPS)) { // hold this package in an overflow list while we check for smaller options @@ -150,7 +151,13 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { package.push((*ancestor_id, ancestor.ancestors.len())); } } - package.sort_unstable_by_key(|a| a.1); + package.sort_unstable_by(|a, b| -> Ordering { + if a.1 == b.1 { + b.0.cmp(&a.0) + } else { + a.1.cmp(&b.1) + } + }); package.push((next_tx.uid, next_tx.ancestors.len())); let cluster_rate = next_tx.cluster_rate(); @@ -176,7 +183,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { // this block is full let exceeded_package_tries = - failures > 1000 && block_weight > (BLOCK_WEIGHT_UNITS - BLOCK_RESERVED_WEIGHT); + failures > 1000 && block_weight > (MAX_BLOCK_WEIGHT_UNITS - BLOCK_RESERVED_WEIGHT); let queue_is_empty = mempool_stack.is_empty() && modified.is_empty(); if (exceeded_package_tries || queue_is_empty) && blocks.len() < (MAX_BLOCKS - 1) { // finalize this block @@ -185,8 +192,8 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { } // reset for the next block transactions = Vec::with_capacity(STARTING_CAPACITY); - block_weight = 4000; - block_sigops = 0; + block_weight = BLOCK_RESERVED_WEIGHT; + block_sigops = BLOCK_RESERVED_SIGOPS; failures = 0; // 'overflow' packages didn't fit in this block, but are valid candidates for the next overflow.reverse(); @@ -290,6 +297,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { let mut total_fee: u64 = 0; let mut total_weight: u32 = 0; + let mut total_vsize: u32 = 0; let mut total_sigops: u32 = 0; for ancestor_id in &ancestors { @@ -298,11 +306,12 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { .expect("audit_pool contains all ancestors"); total_fee += ancestor.fee; total_weight += ancestor.weight; + total_vsize += ancestor.vsize; total_sigops += ancestor.sigops; } if let Some(tx) = audit_pool.get_mut(&txid) { - tx.set_ancestors(ancestors, total_fee, total_weight, total_sigops); + tx.set_ancestors(ancestors, total_fee, total_weight, total_vsize, total_sigops); } } @@ -317,6 +326,7 @@ fn update_descendants( let mut descendant_stack: Vec = Vec::new(); let root_fee: u64; let root_weight: u32; + let root_vsize: u32; let root_sigops: u32; if let Some(root_tx) = audit_pool.get(&root_txid) { for descendant_id in &root_tx.children { @@ -327,6 +337,7 @@ fn update_descendants( } root_fee = root_tx.fee; root_weight = root_tx.weight; + root_vsize = root_tx.vsize; root_sigops = root_tx.sigops; } else { return; @@ -335,7 +346,7 @@ fn update_descendants( if let Some(descendant) = audit_pool.get_mut(&next_txid) { // remove root tx as ancestor let old_score = - descendant.remove_root(root_txid, root_fee, root_weight, root_sigops, cluster_rate); + descendant.remove_root(root_txid, root_fee, root_weight, root_vsize, root_sigops, cluster_rate); // add to priority queue or update priority if score has changed if descendant.score() < old_score { descendant.modified = true; diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index d9c61866d..7da8e0613 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -657,7 +657,7 @@ class MempoolBlocks { if (tx.uid !== null && tx.uid !== undefined) { view.setUint32(offset, tx.uid, false); view.setFloat64(offset + 4, tx.fee, false); - view.setUint32(offset + 12, (tx.adjustedVsize * 4), false); + view.setUint32(offset + 12, tx.weight, false); view.setUint32(offset + 16, tx.sigops, false); view.setFloat64(offset + 20, (tx.adjustedFeePerVsize || tx.feePerVsize), false); view.setFloat64(offset + 28, (tx.effectiveFeePerVsize || tx.adjustedFeePerVsize || tx.feePerVsize), false); From 79a10ee833544727ffd51ffea1eafcaa65c0e957 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 27 Jun 2023 18:51:18 -0400 Subject: [PATCH 510/782] vsize -> sigop_adjusted_vsize --- backend/rust-gbt/src/audit_transaction.rs | 24 +++++++++++------------ backend/rust-gbt/src/gbt.rs | 14 ++++++------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 393594b2e..d2ea59dc2 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -14,7 +14,7 @@ pub struct AuditTransaction { pub uid: u32, pub fee: u64, pub weight: u32, - pub vsize: u32, + pub sigop_adjusted_vsize: u32, pub sigops: u32, pub fee_per_vsize: f64, pub effective_fee_per_vsize: f64, @@ -25,7 +25,7 @@ pub struct AuditTransaction { pub children: HashSet, ancestor_fee: u64, ancestor_weight: u32, - ancestor_vsize: u32, + ancestor_sigop_adjusted_vsize: u32, ancestor_sigops: u32, // Safety: Must be private to prevent NaN breaking Ord impl. score: f64, @@ -76,7 +76,7 @@ impl AuditTransaction { uid: tx.uid, fee: tx.fee, weight: tx.weight, - vsize: ((tx.weight + 3) / 4).max(tx.sigops * 5), // rounded up to the nearest integer + sigop_adjusted_vsize: ((tx.weight + 3) / 4).max(tx.sigops * 5), // rounded up to the nearest integer sigops: tx.sigops, fee_per_vsize: tx.fee_per_vsize, effective_fee_per_vsize: tx.effective_fee_per_vsize, @@ -87,7 +87,7 @@ impl AuditTransaction { children: u32hashset_new(), ancestor_fee: tx.fee, ancestor_weight: tx.weight, - ancestor_vsize: ((tx.weight + 3) / 4).max(tx.sigops * 5), // rounded up to the nearest integer + ancestor_sigop_adjusted_vsize: ((tx.weight + 3) / 4).max(tx.sigops * 5), // rounded up to the nearest integer ancestor_sigops: tx.sigops, score: 0.0, used: false, @@ -102,8 +102,8 @@ impl AuditTransaction { } #[inline] - pub const fn ancestor_vsize(&self) -> u32 { - self.ancestor_vsize + pub const fn ancestor_sigop_adjusted_vsize(&self) -> u32 { + self.ancestor_sigop_adjusted_vsize } #[inline] @@ -132,10 +132,10 @@ impl AuditTransaction { #[inline] fn calc_new_score(&mut self) { self.score = (self.ancestor_fee as f64) - / (if self.ancestor_vsize == 0 { + / (if self.ancestor_sigop_adjusted_vsize == 0 { 1.0 } else { - f64::from(self.ancestor_vsize) + f64::from(self.ancestor_sigop_adjusted_vsize) }); } @@ -145,13 +145,13 @@ impl AuditTransaction { ancestors: HashSet, total_fee: u64, total_weight: u32, - total_vsize: u32, + total_sigop_adjusted_vsize: u32, total_sigops: u32, ) { self.ancestors = ancestors; self.ancestor_fee = self.fee + total_fee; self.ancestor_weight = self.weight + total_weight; - self.ancestor_vsize = self.vsize + total_vsize; + self.ancestor_sigop_adjusted_vsize = self.sigop_adjusted_vsize + total_sigop_adjusted_vsize; self.ancestor_sigops = self.sigops + total_sigops; self.calc_new_score(); self.relatives_set_flag = true; @@ -163,7 +163,7 @@ impl AuditTransaction { root_txid: u32, root_fee: u64, root_weight: u32, - root_vsize: u32, + root_sigop_adjusted_vsize: u32, root_sigops: u32, cluster_rate: f64, ) -> f64 { @@ -172,7 +172,7 @@ impl AuditTransaction { if self.ancestors.remove(&root_txid) { self.ancestor_fee -= root_fee; self.ancestor_weight -= root_weight; - self.ancestor_vsize -= root_vsize; + self.ancestor_sigop_adjusted_vsize -= root_sigop_adjusted_vsize; self.ancestor_sigops -= root_sigops; self.calc_new_score(); } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index cab684a9d..0d69d3049 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -136,7 +136,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { } if blocks.len() < (MAX_BLOCKS - 1) - && ((block_weight + (4 * next_tx.ancestor_vsize()) >= MAX_BLOCK_WEIGHT_UNITS) + && ((block_weight + (4 * next_tx.ancestor_sigop_adjusted_vsize()) >= MAX_BLOCK_WEIGHT_UNITS) || (block_sigops + next_tx.ancestor_sigops() > BLOCK_SIGOPS)) { // hold this package in an overflow list while we check for smaller options @@ -297,7 +297,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { let mut total_fee: u64 = 0; let mut total_weight: u32 = 0; - let mut total_vsize: u32 = 0; + let mut total_sigop_adjusted_vsize: u32 = 0; let mut total_sigops: u32 = 0; for ancestor_id in &ancestors { @@ -306,12 +306,12 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { .expect("audit_pool contains all ancestors"); total_fee += ancestor.fee; total_weight += ancestor.weight; - total_vsize += ancestor.vsize; + total_sigop_adjusted_vsize += ancestor.sigop_adjusted_vsize; total_sigops += ancestor.sigops; } if let Some(tx) = audit_pool.get_mut(&txid) { - tx.set_ancestors(ancestors, total_fee, total_weight, total_vsize, total_sigops); + tx.set_ancestors(ancestors, total_fee, total_weight, total_sigop_adjusted_vsize, total_sigops); } } @@ -326,7 +326,7 @@ fn update_descendants( let mut descendant_stack: Vec = Vec::new(); let root_fee: u64; let root_weight: u32; - let root_vsize: u32; + let root_sigop_adjusted_vsize: u32; let root_sigops: u32; if let Some(root_tx) = audit_pool.get(&root_txid) { for descendant_id in &root_tx.children { @@ -337,7 +337,7 @@ fn update_descendants( } root_fee = root_tx.fee; root_weight = root_tx.weight; - root_vsize = root_tx.vsize; + root_sigop_adjusted_vsize = root_tx.sigop_adjusted_vsize; root_sigops = root_tx.sigops; } else { return; @@ -346,7 +346,7 @@ fn update_descendants( if let Some(descendant) = audit_pool.get_mut(&next_txid) { // remove root tx as ancestor let old_score = - descendant.remove_root(root_txid, root_fee, root_weight, root_vsize, root_sigops, cluster_rate); + descendant.remove_root(root_txid, root_fee, root_weight, root_sigop_adjusted_vsize, root_sigops, cluster_rate); // add to priority queue or update priority if score has changed if descendant.score() < old_score { descendant.modified = true; From 77c83a6a13fe41bf19e61e11bdb50cda633dfbcc Mon Sep 17 00:00:00 2001 From: junderw Date: Tue, 27 Jun 2023 16:12:39 -0700 Subject: [PATCH 511/782] Fix CI for Rust test --- .github/workflows/ci.yml | 5 +++++ backend/package-lock.json | 44 +++++++++++++++++++++++++++++++++++++++ backend/package.json | 1 + 3 files changed, 50 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54259241b..b3c072689 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,11 @@ jobs: node-version: ${{ matrix.node }} registry-url: "https://registry.npmjs.org" + - name: Install 1.70.x Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: 1.70 + - name: Install if: ${{ matrix.flavor == 'dev'}} run: npm ci diff --git a/backend/package-lock.json b/backend/package-lock.json index a7b0a5877..f277f6d6d 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -19,6 +19,7 @@ "maxmind": "~4.3.8", "mysql2": "~3.2.0", "node-worker-threads-pool": "~1.5.1", + "rust-gbt": "file:./rust-gbt", "socks-proxy-agent": "~7.0.0", "typescript": "~4.7.4", "ws": "~8.13.0" @@ -1485,6 +1486,22 @@ "node": ">=6" } }, + "node_modules/@napi-rs/cli": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.16.1.tgz", + "integrity": "sha512-L0Gr5iEQIDEbvWdDr1HUaBOxBSHL1VZhWSk1oryawoT8qJIY+KGfLFelU+Qma64ivCPbxYpkfPoKYVG3rcoGIA==", + "dev": true, + "bin": { + "napi": "scripts/index.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, "node_modules/@noble/hashes": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", @@ -6665,6 +6682,10 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rust-gbt": { + "resolved": "rust-gbt", + "link": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7544,6 +7565,17 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "rust-gbt": { + "name": "gbt", + "version": "0.1.0", + "hasInstallScript": true, + "devDependencies": { + "@napi-rs/cli": "^2.16.1" + }, + "engines": { + "node": ">= 12" + } } }, "dependencies": { @@ -8631,6 +8663,12 @@ "resolved": "https://registry.npmjs.org/@mempool/electrum-client/-/electrum-client-1.1.9.tgz", "integrity": "sha512-mlvPiCzUlaETpYW3i6V87A24jjMYgsebaXtUo3WQyyLnYUuxs0KiXQ2mnKh3h15j8Xg/hfxeGIi+5OC9u0nftQ==" }, + "@napi-rs/cli": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.16.1.tgz", + "integrity": "sha512-L0Gr5iEQIDEbvWdDr1HUaBOxBSHL1VZhWSk1oryawoT8qJIY+KGfLFelU+Qma64ivCPbxYpkfPoKYVG3rcoGIA==", + "dev": true + }, "@noble/hashes": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", @@ -12481,6 +12519,12 @@ "queue-microtask": "^1.2.2" } }, + "rust-gbt": { + "version": "file:rust-gbt", + "requires": { + "@napi-rs/cli": "^2.16.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", diff --git a/backend/package.json b/backend/package.json index 5337ff508..baed8be97 100644 --- a/backend/package.json +++ b/backend/package.json @@ -47,6 +47,7 @@ "maxmind": "~4.3.8", "mysql2": "~3.2.0", "node-worker-threads-pool": "~1.5.1", + "rust-gbt": "file:./rust-gbt", "socks-proxy-agent": "~7.0.0", "typescript": "~4.7.4", "ws": "~8.13.0" From 2838b068f7d8915bfe3e19718f9e2d7194878d10 Mon Sep 17 00:00:00 2001 From: junderw Date: Tue, 27 Jun 2023 22:48:22 -0700 Subject: [PATCH 512/782] Increased performance --- backend/rust-gbt/src/audit_transaction.rs | 25 +++++++----- backend/rust-gbt/src/gbt.rs | 47 +++++++++++++++-------- backend/rust-gbt/src/lib.rs | 2 +- 3 files changed, 48 insertions(+), 26 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index d2ea59dc2..93e04f804 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -49,15 +49,20 @@ impl PartialEq for AuditTransaction { impl Eq for AuditTransaction {} +#[inline] +pub fn partial_cmp_uid_score(a: (u32, f64), b: (u32, f64)) -> Option { + // If either score is NaN, this is false, + // and partial_cmp will return None + if a.1 == b.1 { + Some(a.0.cmp(&b.0)) + } else { + a.1.partial_cmp(&b.1) + } +} + impl PartialOrd for AuditTransaction { fn partial_cmp(&self, other: &Self) -> Option { - // If either score is NaN, this is false, - // and partial_cmp will return None - if self.score == other.score { - Some(self.uid.cmp(&other.uid)) - } else { - self.score.partial_cmp(&other.score) - } + partial_cmp_uid_score((self.uid, self.score), (other.uid, other.score)) } } @@ -72,11 +77,13 @@ impl Ord for AuditTransaction { impl AuditTransaction { pub fn from_thread_transaction(tx: &ThreadTransaction) -> Self { + // rounded up to the nearest integer + let sigop_adjusted_vsize = ((tx.weight + 3) / 4).max(tx.sigops * 5); Self { uid: tx.uid, fee: tx.fee, weight: tx.weight, - sigop_adjusted_vsize: ((tx.weight + 3) / 4).max(tx.sigops * 5), // rounded up to the nearest integer + sigop_adjusted_vsize, sigops: tx.sigops, fee_per_vsize: tx.fee_per_vsize, effective_fee_per_vsize: tx.effective_fee_per_vsize, @@ -87,7 +94,7 @@ impl AuditTransaction { children: u32hashset_new(), ancestor_fee: tx.fee, ancestor_weight: tx.weight, - ancestor_sigop_adjusted_vsize: ((tx.weight + 3) / 4).max(tx.sigops * 5), // rounded up to the nearest integer + ancestor_sigop_adjusted_vsize: sigop_adjusted_vsize, ancestor_sigops: tx.sigops, score: 0.0, used: false, diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 0d69d3049..0226a42ef 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -6,7 +6,7 @@ use std::{ use tracing::{info, trace}; use crate::{ - audit_transaction::AuditTransaction, + audit_transaction::{partial_cmp_uid_score, AuditTransaction}, u32_hasher_types::{ u32hashmap_with_capacity, u32hashset_new, u32priority_queue_with_capacity, U32HasherState, }, @@ -78,15 +78,17 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { trace!("Post relative graph Audit Pool: {:#?}", audit_pool); info!("Sorting by descending ancestor score"); - mempool_stack.sort_unstable_by(|a, b| { - let a_tx = audit_pool - .get(a) - .expect("audit_pool contains exact same txes as mempool_stack"); - let b_tx = audit_pool - .get(b) - .expect("audit_pool contains exact same txes as mempool_stack"); - a_tx.cmp(b_tx) - }); + let mut mempool_stack: Vec<(u32, f64)> = mempool_stack + .into_iter() + .map(|txid| { + let atx = audit_pool + .get(&txid) + .expect("All txids are from audit_pool"); + (txid, atx.score()) + }) + .collect(); + mempool_stack.sort_unstable_by(|a, b| partial_cmp_uid_score(*a, *b).expect("Not NaN")); + let mut mempool_stack: Vec = mempool_stack.into_iter().map(|(txid, _)| txid).collect(); info!("Building blocks by greedily choosing the highest feerate package"); info!("(i.e. the package rooted in the transaction with the best ancestor score)"); @@ -136,7 +138,8 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { } if blocks.len() < (MAX_BLOCKS - 1) - && ((block_weight + (4 * next_tx.ancestor_sigop_adjusted_vsize()) >= MAX_BLOCK_WEIGHT_UNITS) + && ((block_weight + (4 * next_tx.ancestor_sigop_adjusted_vsize()) + >= MAX_BLOCK_WEIGHT_UNITS) || (block_sigops + next_tx.ancestor_sigops() > BLOCK_SIGOPS)) { // hold this package in an overflow list while we check for smaller options @@ -215,12 +218,12 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { overflow = Vec::new(); } } - // add the final unbounded block if it contains any transactions + info!("add the final unbounded block if it contains any transactions"); if !transactions.is_empty() { blocks.push(transactions); } - // make a list of dirty transactions and their new rates + info!("make a list of dirty transactions and their new rates"); let mut rates: Vec> = Vec::new(); for (txid, tx) in audit_pool { trace!("txid: {}, is_dirty: {}", txid, tx.dirty); @@ -311,7 +314,13 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { } if let Some(tx) = audit_pool.get_mut(&txid) { - tx.set_ancestors(ancestors, total_fee, total_weight, total_sigop_adjusted_vsize, total_sigops); + tx.set_ancestors( + ancestors, + total_fee, + total_weight, + total_sigop_adjusted_vsize, + total_sigops, + ); } } @@ -345,8 +354,14 @@ fn update_descendants( while let Some(next_txid) = descendant_stack.pop() { if let Some(descendant) = audit_pool.get_mut(&next_txid) { // remove root tx as ancestor - let old_score = - descendant.remove_root(root_txid, root_fee, root_weight, root_sigop_adjusted_vsize, root_sigops, cluster_rate); + let old_score = descendant.remove_root( + root_txid, + root_fee, + root_weight, + root_sigop_adjusted_vsize, + root_sigops, + cluster_rate, + ); // add to priority queue or update priority if score has changed if descendant.score() < old_score { descendant.modified = true; diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 754763946..f74b218f5 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -30,7 +30,7 @@ use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState}; /// by virtue of starting with such a large capacity. /// /// Note: This doesn't *have* to be a power of 2. (uwu) -const STARTING_CAPACITY: usize = 2048; +const STARTING_CAPACITY: usize = 32768; type ThreadTransactionsMap = HashMap; From 5065fa42d022bd500f360746187a1a51e23e8a4d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 26 Jun 2023 14:22:10 -0400 Subject: [PATCH 513/782] calculate total block weights inside rust gbt --- backend/rust-gbt/index.d.ts | 10 ++- backend/rust-gbt/src/gbt.rs | 4 + backend/rust-gbt/src/lib.rs | 8 +- backend/src/api/mempool-blocks.ts | 134 ++++++++++++++++-------------- 4 files changed, 87 insertions(+), 69 deletions(-) diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index c2c4854ee..3ddcff18b 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -22,13 +22,15 @@ export class GbtGenerator { * The result from calling the gbt function. * * This tuple contains the following: - * blocks: A 2D Vector of transaction IDs (u32), the inner Vecs each represent a block. - * clusters: A 2D Vector of transaction IDs representing clusters of dependent mempool transactions - * rates: A Vector of tuples containing transaction IDs (u32) and effective fee per vsize (f64) + * blocks: A 2D Vector of transaction IDs (u32), the inner Vecs each represent a block. + * block_weights: A Vector of total weights per block. + * clusters: A 2D Vector of transaction IDs representing clusters of dependent mempool transactions + * rates: A Vector of tuples containing transaction IDs (u32) and effective fee per vsize (f64) */ export class GbtResult { blocks: Array> + blockWeights: Array clusters: Array> rates: Array> - constructor(blocks: Array>, clusters: Array>, rates: Array>) + constructor(blocks: Array>, blockWeights: Array, clusters: Array>, rates: Array>) } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 0226a42ef..1899650d9 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -62,6 +62,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { let mut audit_pool: AuditPool = u32hashmap_with_capacity(STARTING_CAPACITY); let mut mempool_stack: Vec = Vec::with_capacity(STARTING_CAPACITY); let mut clusters: Vec> = Vec::new(); + let mut block_weights: Vec = Vec::new(); info!("Initializing working structs"); for (uid, tx) in mempool { @@ -192,6 +193,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { // finalize this block if !transactions.is_empty() { blocks.push(transactions); + block_weights.push(block_weight); } // reset for the next block transactions = Vec::with_capacity(STARTING_CAPACITY); @@ -221,6 +223,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { info!("add the final unbounded block if it contains any transactions"); if !transactions.is_empty() { blocks.push(transactions); + block_weights.push(block_weight); } info!("make a list of dirty transactions and their new rates"); @@ -238,6 +241,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { GbtResult { blocks, + block_weights, clusters, rates, } diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index f74b218f5..1696d4351 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -109,12 +109,14 @@ impl GbtGenerator { /// The result from calling the gbt function. /// /// This tuple contains the following: -/// blocks: A 2D Vector of transaction IDs (u32), the inner Vecs each represent a block. -/// clusters: A 2D Vector of transaction IDs representing clusters of dependent mempool transactions -/// rates: A Vector of tuples containing transaction IDs (u32) and effective fee per vsize (f64) +/// blocks: A 2D Vector of transaction IDs (u32), the inner Vecs each represent a block. +/// block_weights: A Vector of total weights per block. +/// clusters: A 2D Vector of transaction IDs representing clusters of dependent mempool transactions +/// rates: A Vector of tuples containing transaction IDs (u32) and effective fee per vsize (f64) #[napi(constructor)] pub struct GbtResult { pub blocks: Vec>, + pub block_weights: Vec, pub clusters: Vec>, pub rates: Vec>, // Tuples not supported. u32 fits inside f64 } diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 7da8e0613..757b77c55 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -262,7 +262,7 @@ class MempoolBlocks { // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + const processed = this.processBlockTemplates(newMempool, blocks, null, rates, clusters, saveResults); logger.debug(`makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); @@ -318,7 +318,7 @@ class MempoolBlocks { // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + this.processBlockTemplates(newMempool, blocks, null, rates, clusters, saveResults); logger.debug(`updateBlockTemplates completed in ${(Date.now() - start) / 1000} seconds`); } catch (e) { logger.err('updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); @@ -349,13 +349,13 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result const rustGbt = saveResults ? this.rustGbtGenerator : new GbtGenerator(); try { - const { blocks, rates, clusters } = this.convertNapiResultTxids( + const { blocks, blockWeights, rates, clusters } = this.convertNapiResultTxids( await rustGbt.make(new Uint8Array(mempoolBuffer)), ); if (saveResults) { this.rustInitialized = true; } - const processed = this.processBlockTemplates(newMempool, blocks, rates, clusters, saveResults); + const processed = this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, saveResults); logger.debug(`RUST makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); return processed; } catch (e) { @@ -395,7 +395,7 @@ class MempoolBlocks { // run the block construction algorithm in a separate thread, and wait for a result try { - const { blocks, rates, clusters } = this.convertNapiResultTxids( + const { blocks, blockWeights, rates, clusters } = this.convertNapiResultTxids( await this.rustGbtGenerator.update( new Uint8Array(addedBuffer), new Uint8Array(removedBuffer), @@ -406,7 +406,7 @@ class MempoolBlocks { if (expectedMempoolSize !== actualMempoolSize) { throw new Error('GBT returned wrong number of transactions, cache is probably out of sync'); } else { - this.processBlockTemplates(newMempool, blocks, rates, clusters, true); + this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, true); } logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); } catch (e) { @@ -415,10 +415,11 @@ class MempoolBlocks { } } - private processBlockTemplates(mempool, blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }, saveResults): MempoolBlockWithTransactions[] { + private processBlockTemplates(mempool: { [txid: string]: MempoolTransactionExtended }, blocks: string[][], blockWeights: number[] | null, rates: { [root: string]: number }, clusters: { [root: string]: string[] }, saveResults): MempoolBlockWithTransactions[] { for (const txid of Object.keys(rates)) { if (txid in mempool) { mempool[txid].effectiveFeePerVsize = rates[txid]; + mempool[txid].cpfpChecked = false; } } @@ -426,62 +427,15 @@ class MempoolBlocks { let stackWeight; let feeStatsCalculator: OnlineFeeStatsCalculator | void; if (hasBlockStack) { - stackWeight = blocks[blocks.length - 1].reduce((total, tx) => total + (mempool[tx]?.weight || 0), 0); + if (blockWeights && blockWeights[7] !== null) { + stackWeight = blockWeights[7]; + } else { + stackWeight = blocks[blocks.length - 1].reduce((total, tx) => total + (mempool[tx]?.weight || 0), 0); + } hasBlockStack = stackWeight > config.MEMPOOL.BLOCK_WEIGHT_UNITS; feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5, [10, 20, 30, 40, 50, 60, 70, 80, 90]); } - const readyBlocks: { transactionIds, transactions, totalSize, totalWeight, totalFees, feeStats }[] = []; - const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; - // update this thread's mempool with the results - for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) { - const block: string[] = blocks[blockIndex]; - let txid: string; - let mempoolTx: MempoolTransactionExtended; - let totalSize = 0; - let totalVsize = 0; - let totalWeight = 0; - let totalFees = 0; - const transactions: MempoolTransactionExtended[] = []; - for (let txIndex = 0; txIndex < block.length; txIndex++) { - txid = block[txIndex]; - if (txid) { - mempoolTx = mempool[txid]; - // save position in projected blocks - mempoolTx.position = { - block: blockIndex, - vsize: totalVsize + (mempoolTx.vsize / 2), - }; - mempoolTx.ancestors = []; - mempoolTx.descendants = []; - mempoolTx.bestDescendant = null; - mempoolTx.cpfpChecked = true; - - // online calculation of stack-of-blocks fee stats - if (hasBlockStack && blockIndex === blocks.length - 1 && feeStatsCalculator) { - feeStatsCalculator.processNext(mempoolTx); - } - - totalSize += mempoolTx.size; - totalVsize += mempoolTx.vsize; - totalWeight += mempoolTx.weight; - totalFees += mempoolTx.fee; - - if (totalVsize <= sizeLimit) { - transactions.push(mempoolTx); - } - } - } - readyBlocks.push({ - transactionIds: block, - transactions, - totalSize, - totalWeight, - totalFees, - feeStats: (hasBlockStack && blockIndex === blocks.length - 1 && feeStatsCalculator) ? feeStatsCalculator.getRawFeeStats() : undefined, - }); - } - for (const cluster of Object.values(clusters)) { for (const memberTxid of cluster) { if (memberTxid in mempool) { @@ -508,10 +462,66 @@ class MempoolBlocks { mempoolTx.ancestors = ancestors; mempoolTx.descendants = descendants; mempoolTx.bestDescendant = null; + mempoolTx.cpfpChecked = true; } } } + const readyBlocks: { transactionIds, transactions, totalSize, totalWeight, totalFees, feeStats }[] = []; + const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; + // update this thread's mempool with the results + for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) { + const block: string[] = blocks[blockIndex]; + let mempoolTx: MempoolTransactionExtended; + let totalSize = 0; + let totalVsize = 0; + let totalWeight = 0; + let totalFees = 0; + const transactions: MempoolTransactionExtended[] = []; + for (const txid of block) { + if (txid) { + mempoolTx = mempool[txid]; + // save position in projected blocks + mempoolTx.position = { + block: blockIndex, + vsize: totalVsize + (mempoolTx.vsize / 2), + }; + if (!mempoolTx.cpfpChecked) { + if (mempoolTx.ancestors?.length) { + mempoolTx.ancestors = []; + } + if (mempoolTx.descendants?.length) { + mempoolTx.descendants = []; + } + mempoolTx.bestDescendant = null; + mempoolTx.cpfpChecked = true; + } + + // online calculation of stack-of-blocks fee stats + if (hasBlockStack && blockIndex === blocks.length - 1 && feeStatsCalculator) { + feeStatsCalculator.processNext(mempoolTx); + } + + totalSize += mempoolTx.size; + totalVsize += mempoolTx.vsize; + totalWeight += mempoolTx.weight; + totalFees += mempoolTx.fee; + + if (totalVsize <= sizeLimit) { + transactions.push(mempoolTx); + } + } + } + readyBlocks.push({ + transactionIds: block, + transactions, + totalSize, + totalWeight, + totalFees, + feeStats: (hasBlockStack && blockIndex === blocks.length - 1 && feeStatsCalculator) ? feeStatsCalculator.getRawFeeStats() : undefined, + }); + } + const mempoolBlocks = readyBlocks.map((b) => { return this.dataToMempoolBlocks(b.transactionIds, b.transactions, b.totalSize, b.totalWeight, b.totalFees, b.feeStats); }); @@ -595,8 +605,8 @@ class MempoolBlocks { return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; } - private convertNapiResultTxids({ blocks, rates, clusters }: { blocks: number[][], rates: number[][], clusters: number[][]}) - : { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }} { + private convertNapiResultTxids({ blocks, blockWeights, rates, clusters }: { blocks: number[][], blockWeights: number[], rates: number[][], clusters: number[][]}) + : { blocks: string[][], blockWeights: number[], rates: { [root: string]: number }, clusters: { [root: string]: string[] }} { const rateMap = new Map(); const clusterMap = new Map(); for (const rate of rates) { @@ -634,7 +644,7 @@ class MempoolBlocks { throw new Error('GBT returned a cluster rooted in a transaction with unknown uid'); } } - return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; + return { blocks: convertedBlocks, blockWeights, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], blockWeights: number[], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; } private mempoolToArrayBuffer(txs: MempoolTransactionExtended[], mempool: { [txid: string]: MempoolTransactionExtended }): ArrayBuffer { From 0886e850f9e0437aeee564513c88ffce2da9c08d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 28 Jun 2023 16:31:59 -0400 Subject: [PATCH 514/782] Pass gbt mempool data directly without serialization --- backend/rust-gbt/index.d.ts | 12 +++- backend/rust-gbt/src/audit_transaction.rs | 9 +-- backend/rust-gbt/src/lib.rs | 15 ++--- backend/rust-gbt/src/thread_transaction.rs | 41 ++---------- backend/rust-gbt/src/utils.rs | 13 ---- backend/src/__tests__/gbt/gbt-tests.ts | 32 ++++++++- backend/src/api/mempool-blocks.ts | 76 ++++------------------ backend/src/mempool.interfaces.ts | 3 +- 8 files changed, 70 insertions(+), 131 deletions(-) delete mode 100644 backend/rust-gbt/src/utils.rs diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index 3ddcff18b..2acdde672 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -3,6 +3,14 @@ /* auto-generated by NAPI-RS */ +export interface ThreadTransaction { + uid: number + fee: number + weight: number + sigops: number + effectiveFeePerVsize: number + inputs: Array +} export class GbtGenerator { constructor() /** @@ -10,13 +18,13 @@ export class GbtGenerator { * * Rejects if the thread panics or if the Mutex is poisoned. */ - make(mempoolBuffer: Uint8Array): Promise + make(mempool: Array): Promise /** * # Errors * * Rejects if the thread panics or if the Mutex is poisoned. */ - update(newTxs: Uint8Array, removeTxs: Uint8Array): Promise + update(newTxs: Array, removeTxs: Array): Promise } /** * The result from calling the gbt function. diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 93e04f804..00d75cdf4 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -1,6 +1,5 @@ use crate::{ - thread_transaction::ThreadTransaction, - u32_hasher_types::{u32hashset_new, U32HasherState}, + u32_hasher_types::{u32hashset_new, U32HasherState}, ThreadTransaction, }; use std::{ cmp::Ordering, @@ -16,7 +15,6 @@ pub struct AuditTransaction { pub weight: u32, pub sigop_adjusted_vsize: u32, pub sigops: u32, - pub fee_per_vsize: f64, pub effective_fee_per_vsize: f64, pub dependency_rate: f64, pub inputs: Vec, @@ -81,18 +79,17 @@ impl AuditTransaction { let sigop_adjusted_vsize = ((tx.weight + 3) / 4).max(tx.sigops * 5); Self { uid: tx.uid, - fee: tx.fee, + fee: tx.fee as u64, weight: tx.weight, sigop_adjusted_vsize, sigops: tx.sigops, - fee_per_vsize: tx.fee_per_vsize, effective_fee_per_vsize: tx.effective_fee_per_vsize, dependency_rate: f64::INFINITY, inputs: tx.inputs.clone(), relatives_set_flag: false, ancestors: u32hashset_new(), children: u32hashset_new(), - ancestor_fee: tx.fee, + ancestor_fee: tx.fee as u64, ancestor_weight: tx.weight, ancestor_sigop_adjusted_vsize: sigop_adjusted_vsize, ancestor_sigops: tx.sigops, diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 1696d4351..6a0e3ea5e 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -6,8 +6,9 @@ #![allow(clippy::cast_sign_loss)] #![allow(clippy::float_cmp)] -use napi::bindgen_prelude::{Result, Uint8Array}; +use napi::bindgen_prelude::{Result}; use napi_derive::napi; +use thread_transaction::ThreadTransaction; use tracing::{debug, info, trace}; use tracing_log::LogTracer; use tracing_subscriber::{EnvFilter, FmtSubscriber}; @@ -19,9 +20,7 @@ mod audit_transaction; mod gbt; mod thread_transaction; mod u32_hasher_types; -mod utils; -use thread_transaction::ThreadTransaction; use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState}; /// This is the starting capacity for HashMap/Vec/etc. that deal with transactions. @@ -78,10 +77,10 @@ impl GbtGenerator { /// /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] - pub async fn make(&self, mempool_buffer: Uint8Array) -> Result { + pub async fn make(&self, mempool: Vec) -> Result { trace!("make: Current State {:#?}", self.thread_transactions); run_task(Arc::clone(&self.thread_transactions), move |map| { - for tx in ThreadTransaction::batch_from_buffer(&mempool_buffer) { + for tx in mempool { map.insert(tx.uid, tx); } }) @@ -92,13 +91,13 @@ impl GbtGenerator { /// /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] - pub async fn update(&self, new_txs: Uint8Array, remove_txs: Uint8Array) -> Result { + pub async fn update(&self, new_txs: Vec, remove_txs: Vec) -> Result { trace!("update: Current State {:#?}", self.thread_transactions); run_task(Arc::clone(&self.thread_transactions), move |map| { - for tx in ThreadTransaction::batch_from_buffer(&new_txs) { + for tx in new_txs { map.insert(tx.uid, tx); } - for txid in &utils::txids_from_buffer(&remove_txs) { + for txid in &remove_txs { map.remove(txid); } }) diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs index 2bb3a959d..a5eab8399 100644 --- a/backend/rust-gbt/src/thread_transaction.rs +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -1,45 +1,12 @@ -use bytes::buf::Buf; -use std::io::Cursor; +use napi_derive::napi; #[derive(Debug)] +#[napi(object)] pub struct ThreadTransaction { pub uid: u32, - pub fee: u64, + pub fee: f64, pub weight: u32, pub sigops: u32, - pub fee_per_vsize: f64, pub effective_fee_per_vsize: f64, pub inputs: Vec, -} - -impl ThreadTransaction { - pub fn batch_from_buffer(buffer: &[u8]) -> Vec { - let mut transactions: Vec = Vec::new(); - let mut cursor = Cursor::new(buffer); - let size = cursor.get_u32(); - for _ in 0..size { - let uid = cursor.get_u32(); - let fee = cursor.get_f64().round() as u64; - let weight = cursor.get_u32(); - let sigops = cursor.get_u32(); - let fee_per_vsize = cursor.get_f64(); - let effective_fee_per_vsize = cursor.get_f64(); - let input_count = cursor.get_u32(); - let mut inputs: Vec = Vec::new(); - for _ in 0..input_count { - inputs.push(cursor.get_u32()); - } - transactions.push(Self { - uid, - fee, - weight, - sigops, - fee_per_vsize, - effective_fee_per_vsize, - inputs, - }); - } - - transactions - } -} +} \ No newline at end of file diff --git a/backend/rust-gbt/src/utils.rs b/backend/rust-gbt/src/utils.rs deleted file mode 100644 index c1b6063a1..000000000 --- a/backend/rust-gbt/src/utils.rs +++ /dev/null @@ -1,13 +0,0 @@ -use bytes::buf::Buf; -use std::io::Cursor; - -pub fn txids_from_buffer(buffer: &[u8]) -> Vec { - let mut txids: Vec = Vec::new(); - let mut cursor: Cursor<&[u8]> = Cursor::new(buffer); - let size: u32 = cursor.get_u32(); - for _ in 0..size { - txids.push(cursor.get_u32()); - } - - txids -} diff --git a/backend/src/__tests__/gbt/gbt-tests.ts b/backend/src/__tests__/gbt/gbt-tests.ts index 53d05b481..92c023aca 100644 --- a/backend/src/__tests__/gbt/gbt-tests.ts +++ b/backend/src/__tests__/gbt/gbt-tests.ts @@ -1,6 +1,7 @@ import fs from 'fs'; import { GbtGenerator } from '../../../rust-gbt'; import path from 'path'; +import { CompactThreadTransaction } from '../../mempool.interfaces'; const baseline = require('./test-data/target-template.json'); const testVector = require('./test-data/test-data-ids.json'); @@ -9,12 +10,13 @@ const vectorTxidMap: Map = new Map(testVector.map(x => [x[1], x // Note that this test buffer is specially constructed // such that uids are assigned in numerical txid order // so that ties break the same way as in Core's implementation -const vectorBuffer: ArrayBuffer = fs.readFileSync(path.join(__dirname, './', './test-data/test-buffer.bin')); +const vectorBuffer: Buffer = fs.readFileSync(path.join(__dirname, './', './test-data/test-buffer.bin')); describe('Rust GBT', () => { test('should produce the same template as getBlockTemplate from Bitcoin Core', async () => { const rustGbt = new GbtGenerator(); - const result = await rustGbt.make(new Uint8Array(vectorBuffer)); + const mempool = mempoolFromArrayBuffer(vectorBuffer.buffer); + const result = await rustGbt.make(mempool); const blocks: [string, number][][] = result.blocks.map(block => { return block.map(uid => [vectorUidMap.get(uid) || 'missing', uid]); @@ -25,3 +27,29 @@ describe('Rust GBT', () => { expect(blocks[0]).toEqual(template); }); }); + +function mempoolFromArrayBuffer(buf: ArrayBuffer): CompactThreadTransaction[] { + const view = new DataView(buf); + const count = view.getUint32(0, false); + const txs: CompactThreadTransaction[] = []; + let offset = 4; + for (let i = 0; i < count; i++) { + const tx: CompactThreadTransaction = { + uid: view.getUint32(offset, false), + fee: view.getFloat64(offset + 4, false), + weight: view.getUint32(offset + 12, false), + sigops: view.getUint32(offset + 16, false), + feePerVsize: view.getFloat64(offset + 20, false), + effectiveFeePerVsize: view.getFloat64(offset + 28, false), + inputs: [], + }; + const numInputs = view.getUint32(offset + 36, false); + offset += 40; + for (let j = 0; j < numInputs; j++) { + tx.inputs.push(view.getUint32(offset, false)); + offset += 4; + } + txs.push(tx); + } + return txs; +} diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 757b77c55..c676cb1bb 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,4 +1,4 @@ -import { GbtGenerator } from '../../rust-gbt'; +import { GbtGenerator, ThreadTransaction as RustThreadTransaction } from '../../rust-gbt'; import logger from '../logger'; import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; @@ -341,16 +341,16 @@ class MempoolBlocks { for (const tx of Object.values(newMempool)) { this.setUid(tx, !saveResults); } - - // serialize relevant mempool data into an ArrayBuffer - // to reduce the overhead of passing this data to the rust thread - const mempoolBuffer = this.mempoolToArrayBuffer(Object.values(newMempool), newMempool); + // set short ids for transaction inputs + for (const tx of Object.values(newMempool)) { + tx.inputs = tx.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => (uid !== null && uid !== undefined)) as number[]; + } // run the block construction algorithm in a separate thread, and wait for a result const rustGbt = saveResults ? this.rustGbtGenerator : new GbtGenerator(); try { const { blocks, blockWeights, rates, clusters } = this.convertNapiResultTxids( - await rustGbt.make(new Uint8Array(mempoolBuffer)), + await rustGbt.make(Object.values(newMempool) as RustThreadTransaction[]), ); if (saveResults) { this.rustInitialized = true; @@ -383,22 +383,22 @@ class MempoolBlocks { } const start = Date.now(); - - for (const tx of Object.values(added)) { + // set missing short ids + for (const tx of added) { this.setUid(tx, true); } + // set short ids for transaction inputs + for (const tx of added) { + tx.inputs = tx.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => (uid !== null && uid !== undefined)) as number[]; + } const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => (uid !== null && uid !== undefined)) as number[]; - // serialize relevant mempool data into an ArrayBuffer - // to reduce the overhead of passing this data to the rust thread - const addedBuffer = this.mempoolToArrayBuffer(added, newMempool); - const removedBuffer = this.uidsToArrayBuffer(removedUids); // run the block construction algorithm in a separate thread, and wait for a result try { const { blocks, blockWeights, rates, clusters } = this.convertNapiResultTxids( await this.rustGbtGenerator.update( - new Uint8Array(addedBuffer), - new Uint8Array(removedBuffer), + added as RustThreadTransaction[], + removedUids, ), ); const expectedMempoolSize = Object.keys(newMempool).length; @@ -646,54 +646,6 @@ class MempoolBlocks { } return { blocks: convertedBlocks, blockWeights, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], blockWeights: number[], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; } - - private mempoolToArrayBuffer(txs: MempoolTransactionExtended[], mempool: { [txid: string]: MempoolTransactionExtended }): ArrayBuffer { - let len = 4; - const inputs: { [uid: number]: number[] } = {}; - let validCount = 0; - for (const tx of txs) { - if (tx.uid !== null && tx.uid !== undefined) { - validCount++; - const txInputs = tx.vin.map(v => this.getUid(mempool[v.txid])).filter(uid => (uid !== null && uid !== undefined)) as number[]; - inputs[tx.uid] = txInputs; - len += (10 + txInputs.length) * 4; - } - } - const buf = new ArrayBuffer(len); - const view = new DataView(buf); - view.setUint32(0, validCount, false); - let offset = 4; - for (const tx of txs) { - if (tx.uid !== null && tx.uid !== undefined) { - view.setUint32(offset, tx.uid, false); - view.setFloat64(offset + 4, tx.fee, false); - view.setUint32(offset + 12, tx.weight, false); - view.setUint32(offset + 16, tx.sigops, false); - view.setFloat64(offset + 20, (tx.adjustedFeePerVsize || tx.feePerVsize), false); - view.setFloat64(offset + 28, (tx.effectiveFeePerVsize || tx.adjustedFeePerVsize || tx.feePerVsize), false); - view.setUint32(offset + 36, inputs[tx.uid].length, false); - offset += 40; - for (const input of inputs[tx.uid]) { - view.setUint32(offset, input, false); - offset += 4; - } - } - } - return buf; - } - - private uidsToArrayBuffer(uids: number[]): ArrayBuffer { - const len = (uids.length + 1) * 4; - const buf = new ArrayBuffer(len); - const view = new DataView(buf); - view.setUint32(0, uids.length, false); - let offset = 4; - for (const uid of uids) { - view.setUint32(offset, uid, false); - offset += 4; - } - return buf; - } } export default new MempoolBlocks(); diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 5958f464f..efdd874bf 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -96,6 +96,7 @@ export interface MempoolTransactionExtended extends TransactionExtended { sigops: number; adjustedVsize: number; adjustedFeePerVsize: number; + inputs?: number[]; } export interface AuditTransaction { @@ -125,7 +126,7 @@ export interface CompactThreadTransaction { weight: number; sigops: number; feePerVsize: number; - effectiveFeePerVsize?: number; + effectiveFeePerVsize: number; inputs: number[]; cpfpRoot?: number; cpfpChecked?: boolean; From db8c34ae615cd6c66799260e567a9f3f41f6f935 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 28 Jun 2023 19:51:52 -0400 Subject: [PATCH 515/782] misc JS-side gbt performance optimizations --- backend/src/api/mempool-blocks.ts | 24 +++++++++++------------- backend/src/api/mempool.ts | 15 +++++++++------ backend/src/api/websocket-handler.ts | 6 +++--- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index c676cb1bb..de8d6f51a 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -371,7 +371,7 @@ class MempoolBlocks { return this.$rustMakeBlockTemplates(newMempool, false); } - public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[]): Promise { + public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[]): Promise { // sanity check to avoid approaching uint32 uid overflow if (this.nextUid + added.length > MAX_UINT32) { this.resetRustGbt(); @@ -401,13 +401,13 @@ class MempoolBlocks { removedUids, ), ); - const expectedMempoolSize = Object.keys(newMempool).length; - const actualMempoolSize = blocks.reduce((total, block) => total + block.length, 0); - if (expectedMempoolSize !== actualMempoolSize) { + const resultMempoolSize = blocks.reduce((total, block) => total + block.length, 0); + if (mempoolSize !== resultMempoolSize) { throw new Error('GBT returned wrong number of transactions, cache is probably out of sync'); } else { this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, true); } + this.removeUids(removedUids); logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); } catch (e) { logger.err('RUST updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); @@ -423,6 +423,7 @@ class MempoolBlocks { } } + const lastBlockIndex = blocks.length - 1; let hasBlockStack = blocks.length >= 8; let stackWeight; let feeStatsCalculator: OnlineFeeStatsCalculator | void; @@ -430,7 +431,7 @@ class MempoolBlocks { if (blockWeights && blockWeights[7] !== null) { stackWeight = blockWeights[7]; } else { - stackWeight = blocks[blocks.length - 1].reduce((total, tx) => total + (mempool[tx]?.weight || 0), 0); + stackWeight = blocks[lastBlockIndex].reduce((total, tx) => total + (mempool[tx]?.weight || 0), 0); } hasBlockStack = stackWeight > config.MEMPOOL.BLOCK_WEIGHT_UNITS; feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5, [10, 20, 30, 40, 50, 60, 70, 80, 90]); @@ -438,8 +439,8 @@ class MempoolBlocks { for (const cluster of Object.values(clusters)) { for (const memberTxid of cluster) { - if (memberTxid in mempool) { - const mempoolTx = mempool[memberTxid]; + const mempoolTx = mempool[memberTxid]; + if (mempoolTx) { const ancestors: Ancestor[] = []; const descendants: Ancestor[] = []; let matched = false; @@ -459,10 +460,7 @@ class MempoolBlocks { } } }); - mempoolTx.ancestors = ancestors; - mempoolTx.descendants = descendants; - mempoolTx.bestDescendant = null; - mempoolTx.cpfpChecked = true; + Object.assign(mempoolTx, {ancestors, descendants, bestDescendant: null, cpfpChecked: true}); } } } @@ -498,7 +496,7 @@ class MempoolBlocks { } // online calculation of stack-of-blocks fee stats - if (hasBlockStack && blockIndex === blocks.length - 1 && feeStatsCalculator) { + if (hasBlockStack && blockIndex === lastBlockIndex && feeStatsCalculator) { feeStatsCalculator.processNext(mempoolTx); } @@ -518,7 +516,7 @@ class MempoolBlocks { totalSize, totalWeight, totalFees, - feeStats: (hasBlockStack && blockIndex === blocks.length - 1 && feeStatsCalculator) ? feeStatsCalculator.getRawFeeStats() : undefined, + feeStats: (hasBlockStack && blockIndex === lastBlockIndex && feeStatsCalculator) ? feeStatsCalculator.getRawFeeStats() : undefined, }); } diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index d237818b2..c7d7b8b27 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -19,7 +19,7 @@ class Mempool { maxmempool: 300000000, mempoolminfee: 0.00001000, minrelaytxfee: 0.00001000 }; private mempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]) => void) | undefined; - private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, newTransactions: MempoolTransactionExtended[], + private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, mempoolSize: number, newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]) => Promise) | undefined; private txPerSecondArray: number[] = []; @@ -69,7 +69,7 @@ class Mempool { this.mempoolChangedCallback = fn; } - public setAsyncMempoolChangedCallback(fn: (newMempool: { [txId: string]: MempoolTransactionExtended; }, + public setAsyncMempoolChangedCallback(fn: (newMempool: { [txId: string]: MempoolTransactionExtended; }, mempoolSize: number, newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]) => Promise): void { this.$asyncMempoolChangedCallback = fn; } @@ -84,16 +84,18 @@ class Mempool { public async $setMempool(mempoolData: { [txId: string]: MempoolTransactionExtended }) { this.mempoolCache = mempoolData; + let count = 0; for (const txid of Object.keys(this.mempoolCache)) { if (this.mempoolCache[txid].sigops == null || this.mempoolCache[txid].effectiveFeePerVsize == null) { this.mempoolCache[txid] = transactionUtils.extendMempoolTransaction(this.mempoolCache[txid]); } + count++; } if (this.mempoolChangedCallback) { this.mempoolChangedCallback(this.mempoolCache, [], []); } if (this.$asyncMempoolChangedCallback) { - await this.$asyncMempoolChangedCallback(this.mempoolCache, [], []); + await this.$asyncMempoolChangedCallback(this.mempoolCache, count, [], []); } this.addToSpendMap(Object.values(this.mempoolCache)); } @@ -237,23 +239,24 @@ class Mempool { } } + const newMempoolSize = currentMempoolSize + newTransactions.length - deletedTransactions.length; const newTransactionsStripped = newTransactions.map((tx) => Common.stripTransaction(tx)); this.latestTransactions = newTransactionsStripped.concat(this.latestTransactions).slice(0, 6); - if (!this.inSync && transactions.length === Object.keys(this.mempoolCache).length) { + if (!this.inSync && transactions.length === newMempoolSize) { this.inSync = true; logger.notice('The mempool is now in sync!'); loadingIndicators.setProgress('mempool', 100); } - this.mempoolCacheDelta = Math.abs(transactions.length - Object.keys(this.mempoolCache).length); + this.mempoolCacheDelta = Math.abs(transactions.length - newMempoolSize); if (this.mempoolChangedCallback && (hasChange || deletedTransactions.length)) { this.mempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions); } if (this.$asyncMempoolChangedCallback && (hasChange || deletedTransactions.length)) { this.updateTimerProgress(timer, 'running async mempool callback'); - await this.$asyncMempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions); + await this.$asyncMempoolChangedCallback(this.mempoolCache, newMempoolSize, newTransactions, deletedTransactions); this.updateTimerProgress(timer, 'completed async mempool callback'); } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 00d5a6026..97092d2b1 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -333,7 +333,7 @@ class WebsocketHandler { }); } - async $handleMempoolChange(newMempool: { [txid: string]: MempoolTransactionExtended }, + async $handleMempoolChange(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]): Promise { if (!this.wss) { throw new Error('WebSocket.Server is not set'); @@ -343,7 +343,7 @@ class WebsocketHandler { if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { if (config.MEMPOOL.RUST_GBT) { - await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, newTransactions, deletedTransactions); + await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, mempoolSize, newTransactions, deletedTransactions); } else { await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); } @@ -664,7 +664,7 @@ class WebsocketHandler { if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { if (config.MEMPOOL.RUST_GBT) { - await mempoolBlocks.$rustUpdateBlockTemplates(_memPool, [], transactions); + await mempoolBlocks.$rustUpdateBlockTemplates(_memPool, Object.keys(_memPool).length, [], transactions); } else { await mempoolBlocks.$makeBlockTemplates(_memPool, true); } From 552818607ad6f36b954c2d8b00f7d403210ed759 Mon Sep 17 00:00:00 2001 From: junderw Date: Wed, 28 Jun 2023 12:42:33 -0700 Subject: [PATCH 516/782] Better initial capacity --- backend/rust-gbt/src/gbt.rs | 15 +++++++++------ backend/rust-gbt/src/lib.rs | 7 ++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 1899650d9..bab19ac89 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -10,7 +10,7 @@ use crate::{ u32_hasher_types::{ u32hashmap_with_capacity, u32hashset_new, u32priority_queue_with_capacity, U32HasherState, }, - GbtResult, ThreadTransactionsMap, STARTING_CAPACITY, + GbtResult, ThreadTransactionsMap, }; const MAX_BLOCK_WEIGHT_UNITS: u32 = 4_000_000 - 4_000; @@ -59,8 +59,9 @@ impl Ord for TxPriority { #[allow(clippy::too_many_lines)] #[allow(clippy::cognitive_complexity)] pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { - let mut audit_pool: AuditPool = u32hashmap_with_capacity(STARTING_CAPACITY); - let mut mempool_stack: Vec = Vec::with_capacity(STARTING_CAPACITY); + let mempool_len = mempool.len(); + let mut audit_pool: AuditPool = u32hashmap_with_capacity(mempool_len); + let mut mempool_stack: Vec = Vec::with_capacity(mempool_len); let mut clusters: Vec> = Vec::new(); let mut block_weights: Vec = Vec::new(); @@ -96,8 +97,10 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { let mut blocks: Vec> = Vec::new(); let mut block_weight: u32 = BLOCK_RESERVED_WEIGHT; let mut block_sigops: u32 = BLOCK_RESERVED_SIGOPS; - let mut transactions: Vec = Vec::with_capacity(STARTING_CAPACITY); - let mut modified: ModifiedQueue = u32priority_queue_with_capacity(STARTING_CAPACITY); + // No need to be bigger than 4096 transactions for the per-block transaction Vec. + let initial_txes_per_block: usize = 4096.min(mempool_len); + let mut transactions: Vec = Vec::with_capacity(initial_txes_per_block); + let mut modified: ModifiedQueue = u32priority_queue_with_capacity(mempool_len); let mut overflow: Vec = Vec::new(); let mut failures = 0; while !mempool_stack.is_empty() || !modified.is_empty() { @@ -196,7 +199,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { block_weights.push(block_weight); } // reset for the next block - transactions = Vec::with_capacity(STARTING_CAPACITY); + transactions = Vec::with_capacity(initial_txes_per_block); block_weight = BLOCK_RESERVED_WEIGHT; block_sigops = BLOCK_RESERVED_SIGOPS; failures = 0; diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 6a0e3ea5e..0f7c0f7ba 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -23,13 +23,10 @@ mod u32_hasher_types; use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState}; -/// This is the starting capacity for HashMap/Vec/etc. that deal with transactions. -/// `HashMap` doubles capacity when it hits it, so 2048 is a decent tradeoff between -/// not wasting too much memory when it's below this, and allowing for less re-allocations -/// by virtue of starting with such a large capacity. +/// This is the initial capacity of the GbtGenerator struct's inner HashMap. /// /// Note: This doesn't *have* to be a power of 2. (uwu) -const STARTING_CAPACITY: usize = 32768; +const STARTING_CAPACITY: usize = 1_048_576; type ThreadTransactionsMap = HashMap; From ccbed8ec58b4fc7e9260dd2903dd889cb9fb2f77 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 29 Jun 2023 12:56:54 -0400 Subject: [PATCH 517/782] Use min(feerate,ancestor_feerate) for ancestor score --- backend/rust-gbt/src/audit_transaction.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 00d75cdf4..44f93094c 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -15,6 +15,7 @@ pub struct AuditTransaction { pub weight: u32, pub sigop_adjusted_vsize: u32, pub sigops: u32, + adjusted_fee_per_vsize: f64, pub effective_fee_per_vsize: f64, pub dependency_rate: f64, pub inputs: Vec, @@ -73,6 +74,18 @@ impl Ord for AuditTransaction { } } +#[inline] +fn calc_fee_rate( + fee: f64, + vsize: u32, +) -> f64 { + fee / (if vsize == 0 { + 1.0 + } else { + f64::from(vsize) + }) +} + impl AuditTransaction { pub fn from_thread_transaction(tx: &ThreadTransaction) -> Self { // rounded up to the nearest integer @@ -83,6 +96,7 @@ impl AuditTransaction { weight: tx.weight, sigop_adjusted_vsize, sigops: tx.sigops, + adjusted_fee_per_vsize: calc_fee_rate(tx.fee, sigop_adjusted_vsize), effective_fee_per_vsize: tx.effective_fee_per_vsize, dependency_rate: f64::INFINITY, inputs: tx.inputs.clone(), @@ -135,12 +149,7 @@ impl AuditTransaction { /// Safety: This function must NEVER set score to NaN. #[inline] fn calc_new_score(&mut self) { - self.score = (self.ancestor_fee as f64) - / (if self.ancestor_sigop_adjusted_vsize == 0 { - 1.0 - } else { - f64::from(self.ancestor_sigop_adjusted_vsize) - }); + self.score = self.adjusted_fee_per_vsize.min(calc_fee_rate(self.ancestor_fee as f64, self.ancestor_sigop_adjusted_vsize)); } #[inline] From 0ddfa94b593f251495f6fbaf98b353c34afe08c1 Mon Sep 17 00:00:00 2001 From: junderw Date: Thu, 29 Jun 2023 15:48:40 -0700 Subject: [PATCH 518/782] Ran cargo fmt --- backend/rust-gbt/src/audit_transaction.rs | 19 ++++++++----------- backend/rust-gbt/src/lib.rs | 8 ++++++-- backend/rust-gbt/src/thread_transaction.rs | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 44f93094c..c12911f0a 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -1,5 +1,6 @@ use crate::{ - u32_hasher_types::{u32hashset_new, U32HasherState}, ThreadTransaction, + u32_hasher_types::{u32hashset_new, U32HasherState}, + ThreadTransaction, }; use std::{ cmp::Ordering, @@ -75,15 +76,8 @@ impl Ord for AuditTransaction { } #[inline] -fn calc_fee_rate( - fee: f64, - vsize: u32, -) -> f64 { - fee / (if vsize == 0 { - 1.0 - } else { - f64::from(vsize) - }) +fn calc_fee_rate(fee: f64, vsize: u32) -> f64 { + fee / (if vsize == 0 { 1.0 } else { f64::from(vsize) }) } impl AuditTransaction { @@ -149,7 +143,10 @@ impl AuditTransaction { /// Safety: This function must NEVER set score to NaN. #[inline] fn calc_new_score(&mut self) { - self.score = self.adjusted_fee_per_vsize.min(calc_fee_rate(self.ancestor_fee as f64, self.ancestor_sigop_adjusted_vsize)); + self.score = self.adjusted_fee_per_vsize.min(calc_fee_rate( + self.ancestor_fee as f64, + self.ancestor_sigop_adjusted_vsize, + )); } #[inline] diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 0f7c0f7ba..bfd54ae58 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -6,7 +6,7 @@ #![allow(clippy::cast_sign_loss)] #![allow(clippy::float_cmp)] -use napi::bindgen_prelude::{Result}; +use napi::bindgen_prelude::Result; use napi_derive::napi; use thread_transaction::ThreadTransaction; use tracing::{debug, info, trace}; @@ -88,7 +88,11 @@ impl GbtGenerator { /// /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] - pub async fn update(&self, new_txs: Vec, remove_txs: Vec) -> Result { + pub async fn update( + &self, + new_txs: Vec, + remove_txs: Vec, + ) -> Result { trace!("update: Current State {:#?}", self.thread_transactions); run_task(Arc::clone(&self.thread_transactions), move |map| { for tx in new_txs { diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs index a5eab8399..7bbefe648 100644 --- a/backend/rust-gbt/src/thread_transaction.rs +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -9,4 +9,4 @@ pub struct ThreadTransaction { pub sigops: u32, pub effective_fee_per_vsize: f64, pub inputs: Vec, -} \ No newline at end of file +} From af6de9b72ccc6c27755d0f585672e510808a0b22 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 30 Jun 2023 14:46:44 -0400 Subject: [PATCH 519/782] more misc JS-side gbt performance optimizations --- backend/src/api/mempool-blocks.ts | 72 ++++++++++--------------------- 1 file changed, 23 insertions(+), 49 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index de8d6f51a..a012ba4c2 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,4 +1,4 @@ -import { GbtGenerator, ThreadTransaction as RustThreadTransaction } from '../../rust-gbt'; +import { GbtGenerator, GbtResult, ThreadTransaction as RustThreadTransaction } from '../../rust-gbt'; import logger from '../logger'; import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; @@ -262,7 +262,7 @@ class MempoolBlocks { // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - const processed = this.processBlockTemplates(newMempool, blocks, null, rates, clusters, saveResults); + const processed = this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), saveResults); logger.debug(`makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); @@ -318,7 +318,7 @@ class MempoolBlocks { // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - this.processBlockTemplates(newMempool, blocks, null, rates, clusters, saveResults); + this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), saveResults); logger.debug(`updateBlockTemplates completed in ${(Date.now() - start) / 1000} seconds`); } catch (e) { logger.err('updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); @@ -415,10 +415,10 @@ class MempoolBlocks { } } - private processBlockTemplates(mempool: { [txid: string]: MempoolTransactionExtended }, blocks: string[][], blockWeights: number[] | null, rates: { [root: string]: number }, clusters: { [root: string]: string[] }, saveResults): MempoolBlockWithTransactions[] { - for (const txid of Object.keys(rates)) { + private processBlockTemplates(mempool: { [txid: string]: MempoolTransactionExtended }, blocks: string[][], blockWeights: number[] | null, rates: [string, number][], clusters: string[][], saveResults): MempoolBlockWithTransactions[] { + for (const [txid, rate] of rates) { if (txid in mempool) { - mempool[txid].effectiveFeePerVsize = rates[txid]; + mempool[txid].effectiveFeePerVsize = rate; mempool[txid].cpfpChecked = false; } } @@ -437,7 +437,7 @@ class MempoolBlocks { feeStatsCalculator = new OnlineFeeStatsCalculator(stackWeight, 0.5, [10, 20, 30, 40, 50, 60, 70, 80, 90]); } - for (const cluster of Object.values(clusters)) { + for (const cluster of clusters) { for (const memberTxid of cluster) { const mempoolTx = mempool[memberTxid]; if (mempoolTx) { @@ -465,12 +465,10 @@ class MempoolBlocks { } } - const readyBlocks: { transactionIds, transactions, totalSize, totalWeight, totalFees, feeStats }[] = []; const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; // update this thread's mempool with the results - for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) { - const block: string[] = blocks[blockIndex]; - let mempoolTx: MempoolTransactionExtended; + let mempoolTx: MempoolTransactionExtended; + const mempoolBlocks: MempoolBlockWithTransactions[] = blocks.map((block, blockIndex) => { let totalSize = 0; let totalVsize = 0; let totalWeight = 0; @@ -510,18 +508,14 @@ class MempoolBlocks { } } } - readyBlocks.push({ - transactionIds: block, + return this.dataToMempoolBlocks( + block, transactions, totalSize, totalWeight, totalFees, - feeStats: (hasBlockStack && blockIndex === lastBlockIndex && feeStatsCalculator) ? feeStatsCalculator.getRawFeeStats() : undefined, - }); - } - - const mempoolBlocks = readyBlocks.map((b) => { - return this.dataToMempoolBlocks(b.transactionIds, b.transactions, b.totalSize, b.totalWeight, b.totalFees, b.feeStats); + (hasBlockStack && blockIndex === lastBlockIndex && feeStatsCalculator) ? feeStatsCalculator.getRawFeeStats() : undefined, + ); }); if (saveResults) { @@ -603,16 +597,8 @@ class MempoolBlocks { return { blocks: convertedBlocks, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; } - private convertNapiResultTxids({ blocks, blockWeights, rates, clusters }: { blocks: number[][], blockWeights: number[], rates: number[][], clusters: number[][]}) - : { blocks: string[][], blockWeights: number[], rates: { [root: string]: number }, clusters: { [root: string]: string[] }} { - const rateMap = new Map(); - const clusterMap = new Map(); - for (const rate of rates) { - rateMap.set(rate[0], rate[1]); - } - for (const cluster of clusters) { - clusterMap.set(cluster[0], cluster); - } + private convertNapiResultTxids({ blocks, blockWeights, rates, clusters }: GbtResult) + : { blocks: string[][], blockWeights: number[], rates: [string, number][], clusters: string[][] } { const convertedBlocks: string[][] = blocks.map(block => block.map(uid => { const txid = this.uidMap.get(uid); if (txid !== undefined) { @@ -621,28 +607,16 @@ class MempoolBlocks { throw new Error('GBT returned a block containing a transaction with unknown uid'); } })); - const convertedRates = {}; - for (const rateUid of rateMap.keys()) { - const rateTxid = this.uidMap.get(rateUid); - if (rateTxid !== undefined) { - convertedRates[rateTxid] = rateMap.get(rateUid); - } else { - throw new Error('GBT returned a fee rate for a transaction with unknown uid'); - } + const convertedRates: [string, number][] = []; + for (const [rateUid, rate] of rates) { + const rateTxid = this.uidMap.get(rateUid) as string; + convertedRates.push([rateTxid, rate]); } - const convertedClusters = {}; - for (const rootUid of clusterMap.keys()) { - const rootTxid = this.uidMap.get(rootUid); - if (rootTxid !== undefined) { - const members = clusterMap.get(rootUid)?.map(uid => { - return this.uidMap.get(uid); - }); - convertedClusters[rootTxid] = members; - } else { - throw new Error('GBT returned a cluster rooted in a transaction with unknown uid'); - } + const convertedClusters: string[][] = []; + for (const cluster of clusters) { + convertedClusters.push(cluster.map(uid => this.uidMap.get(uid)) as string[]); } - return { blocks: convertedBlocks, blockWeights, rates: convertedRates, clusters: convertedClusters } as { blocks: string[][], blockWeights: number[], rates: { [root: string]: number }, clusters: { [root: string]: string[] }}; + return { blocks: convertedBlocks, blockWeights, rates: convertedRates, clusters: convertedClusters }; } } From 23d487b904106ac1c6c691feb6f39c7b6672a439 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 2 Jul 2023 20:05:30 -0400 Subject: [PATCH 520/782] Mimic Core's ordering for equal-score transactions --- backend/rust-gbt/index.d.ts | 1 + backend/rust-gbt/src/audit_transaction.rs | 22 +++++++++++++++++----- backend/rust-gbt/src/gbt.rs | 18 ++++++++++++------ backend/rust-gbt/src/lib.rs | 2 +- backend/rust-gbt/src/thread_transaction.rs | 1 + backend/src/__tests__/gbt/gbt-tests.ts | 19 ++++++++++++------- backend/src/api/mempool.ts | 3 +++ backend/src/api/transaction-utils.ts | 6 ++++++ backend/src/mempool.interfaces.ts | 1 + 9 files changed, 54 insertions(+), 19 deletions(-) diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index 2acdde672..68b56a8e1 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -5,6 +5,7 @@ export interface ThreadTransaction { uid: number + order: number fee: number weight: number sigops: number diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index c12911f0a..2df9e0b8c 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -12,6 +12,7 @@ use std::{ #[derive(Clone, Debug)] pub struct AuditTransaction { pub uid: u32, + order: u32, pub fee: u64, pub weight: u32, pub sigop_adjusted_vsize: u32, @@ -50,19 +51,24 @@ impl PartialEq for AuditTransaction { impl Eq for AuditTransaction {} #[inline] -pub fn partial_cmp_uid_score(a: (u32, f64), b: (u32, f64)) -> Option { +pub fn partial_cmp_uid_score(a: (u32, u32, f64), b: (u32, u32, f64)) -> Option { // If either score is NaN, this is false, // and partial_cmp will return None - if a.1 == b.1 { - Some(a.0.cmp(&b.0)) + if a.2 != b.2 { + a.2.partial_cmp(&b.2) + } else if a.1 != b.1 { + Some(b.1.cmp(&a.1)) } else { - a.1.partial_cmp(&b.1) + Some(a.0.cmp(&b.0)) } } impl PartialOrd for AuditTransaction { fn partial_cmp(&self, other: &Self) -> Option { - partial_cmp_uid_score((self.uid, self.score), (other.uid, other.score)) + partial_cmp_uid_score( + (self.uid, self.order, self.score), + (other.uid, self.order, other.score), + ) } } @@ -86,6 +92,7 @@ impl AuditTransaction { let sigop_adjusted_vsize = ((tx.weight + 3) / 4).max(tx.sigops * 5); Self { uid: tx.uid, + order: tx.order, fee: tx.fee as u64, weight: tx.weight, sigop_adjusted_vsize, @@ -113,6 +120,11 @@ impl AuditTransaction { self.score } + #[inline] + pub const fn order(&self) -> u32 { + self.order + } + #[inline] pub const fn ancestor_sigop_adjusted_vsize(&self) -> u32 { self.ancestor_sigop_adjusted_vsize diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index bab19ac89..f88c022c4 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -25,6 +25,7 @@ type ModifiedQueue = PriorityQueue; #[derive(Debug)] struct TxPriority { uid: u32, + order: u32, score: f64, } impl PartialEq for TxPriority { @@ -35,10 +36,12 @@ impl PartialEq for TxPriority { impl Eq for TxPriority {} impl PartialOrd for TxPriority { fn partial_cmp(&self, other: &Self) -> Option { - if self.score == other.score { - Some(self.uid.cmp(&other.uid)) - } else { + if self.score != other.score { self.score.partial_cmp(&other.score) + } else if self.order != other.order { + Some(other.order.cmp(&self.order)) + } else { + Some(self.uid.cmp(&other.uid)) } } } @@ -80,17 +83,17 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { trace!("Post relative graph Audit Pool: {:#?}", audit_pool); info!("Sorting by descending ancestor score"); - let mut mempool_stack: Vec<(u32, f64)> = mempool_stack + let mut mempool_stack: Vec<(u32, u32, f64)> = mempool_stack .into_iter() .map(|txid| { let atx = audit_pool .get(&txid) .expect("All txids are from audit_pool"); - (txid, atx.score()) + (txid, atx.order(), atx.score()) }) .collect(); mempool_stack.sort_unstable_by(|a, b| partial_cmp_uid_score(*a, *b).expect("Not NaN")); - let mut mempool_stack: Vec = mempool_stack.into_iter().map(|(txid, _)| txid).collect(); + let mut mempool_stack: Vec = mempool_stack.into_iter().map(|(txid, _, _)| txid).collect(); info!("Building blocks by greedily choosing the highest feerate package"); info!("(i.e. the package rooted in the transaction with the best ancestor score)"); @@ -212,6 +215,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { *overflowed, TxPriority { uid: *overflowed, + order: overflowed_tx.order(), score: overflowed_tx.score(), }, ); @@ -376,6 +380,7 @@ fn update_descendants( descendant.uid, TxPriority { uid: descendant.uid, + order: descendant.order(), score: descendant.score(), }, ); @@ -385,6 +390,7 @@ fn update_descendants( descendant.uid, TxPriority { uid: descendant.uid, + order: descendant.order(), score: descendant.score(), }, ); diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index bfd54ae58..08f7cb599 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -23,7 +23,7 @@ mod u32_hasher_types; use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState}; -/// This is the initial capacity of the GbtGenerator struct's inner HashMap. +/// This is the initial capacity of the `GbtGenerator` struct's inner `HashMap`. /// /// Note: This doesn't *have* to be a power of 2. (uwu) const STARTING_CAPACITY: usize = 1_048_576; diff --git a/backend/rust-gbt/src/thread_transaction.rs b/backend/rust-gbt/src/thread_transaction.rs index 7bbefe648..ca81f5990 100644 --- a/backend/rust-gbt/src/thread_transaction.rs +++ b/backend/rust-gbt/src/thread_transaction.rs @@ -4,6 +4,7 @@ use napi_derive::napi; #[napi(object)] pub struct ThreadTransaction { pub uid: u32, + pub order: u32, pub fee: f64, pub weight: u32, pub sigops: u32, diff --git a/backend/src/__tests__/gbt/gbt-tests.ts b/backend/src/__tests__/gbt/gbt-tests.ts index 92c023aca..8619457ea 100644 --- a/backend/src/__tests__/gbt/gbt-tests.ts +++ b/backend/src/__tests__/gbt/gbt-tests.ts @@ -1,7 +1,6 @@ import fs from 'fs'; -import { GbtGenerator } from '../../../rust-gbt'; +import { GbtGenerator, ThreadTransaction } from '../../../rust-gbt'; import path from 'path'; -import { CompactThreadTransaction } from '../../mempool.interfaces'; const baseline = require('./test-data/target-template.json'); const testVector = require('./test-data/test-data-ids.json'); @@ -28,18 +27,20 @@ describe('Rust GBT', () => { }); }); -function mempoolFromArrayBuffer(buf: ArrayBuffer): CompactThreadTransaction[] { +function mempoolFromArrayBuffer(buf: ArrayBuffer): ThreadTransaction[] { const view = new DataView(buf); const count = view.getUint32(0, false); - const txs: CompactThreadTransaction[] = []; + const txs: ThreadTransaction[] = []; let offset = 4; for (let i = 0; i < count; i++) { - const tx: CompactThreadTransaction = { - uid: view.getUint32(offset, false), + const uid = view.getUint32(offset, false); + const tx: ThreadTransaction = { + uid, + order: txidToOrdering(vectorUidMap.get(uid) as string), fee: view.getFloat64(offset + 4, false), weight: view.getUint32(offset + 12, false), sigops: view.getUint32(offset + 16, false), - feePerVsize: view.getFloat64(offset + 20, false), + // feePerVsize: view.getFloat64(offset + 20, false), effectiveFeePerVsize: view.getFloat64(offset + 28, false), inputs: [], }; @@ -53,3 +54,7 @@ function mempoolFromArrayBuffer(buf: ArrayBuffer): CompactThreadTransaction[] { } return txs; } + +function txidToOrdering(txid: string): number { + return parseInt(txid.slice(56).match(/../g)?.reverse().join('') as string, 16); +} diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index c7d7b8b27..bc3f33806 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -89,6 +89,9 @@ class Mempool { if (this.mempoolCache[txid].sigops == null || this.mempoolCache[txid].effectiveFeePerVsize == null) { this.mempoolCache[txid] = transactionUtils.extendMempoolTransaction(this.mempoolCache[txid]); } + if (this.mempoolCache[txid].order == null) { + this.mempoolCache[txid].order = transactionUtils.txidToOrdering(txid); + } count++; } if (this.mempoolChangedCallback) { diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 8523a938e..28861a997 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -76,6 +76,7 @@ class TransactionUtils { const adjustedFeePerVsize = Math.max(Common.isLiquid() ? 0.1 : 1, (transaction.fee || 0) / adjustedVsize); const transactionExtended: MempoolTransactionExtended = Object.assign(transaction, { + order: this.txidToOrdering(transaction.txid), vsize: Math.round(transaction.weight / 4), adjustedVsize, sigops, @@ -154,6 +155,11 @@ class TransactionUtils { return sigops; } + + // returns the most significant 4 bytes of the txid as an integer + public txidToOrdering(txid: string): number { + return parseInt(txid.slice(56).match(/../g)?.reverse().join('') as string, 16); + } } export default new TransactionUtils(); diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index efdd874bf..eaa0cd63f 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -93,6 +93,7 @@ export interface TransactionExtended extends IEsploraApi.Transaction { } export interface MempoolTransactionExtended extends TransactionExtended { + order: number; sigops: number; adjustedVsize: number; adjustedFeePerVsize: number; From d16d961cb22ece2f0512fa37f827098aee9fedec Mon Sep 17 00:00:00 2001 From: mononaut <83316221+mononaut@users.noreply.github.com> Date: Mon, 3 Jul 2023 11:55:43 -0400 Subject: [PATCH 521/782] Apply suggestions from code review avoid regex in partial txid ordering conversion Co-authored-by: Jonathan Underwood --- backend/src/__tests__/gbt/gbt-tests.ts | 8 +++++++- backend/src/api/transaction-utils.ts | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/src/__tests__/gbt/gbt-tests.ts b/backend/src/__tests__/gbt/gbt-tests.ts index 8619457ea..8927b4096 100644 --- a/backend/src/__tests__/gbt/gbt-tests.ts +++ b/backend/src/__tests__/gbt/gbt-tests.ts @@ -56,5 +56,11 @@ function mempoolFromArrayBuffer(buf: ArrayBuffer): ThreadTransaction[] { } function txidToOrdering(txid: string): number { - return parseInt(txid.slice(56).match(/../g)?.reverse().join('') as string, 16); + return ( + ((parseInt(txid.substring(62, 64), 16) << 24) | + (parseInt(txid.substring(60, 62), 16) << 16) | + (parseInt(txid.substring(58, 60), 16) << 8) | + parseInt(txid.substring(56, 58), 16)) >>> + 0 + ); } diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 28861a997..92f5b71c5 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -158,7 +158,13 @@ class TransactionUtils { // returns the most significant 4 bytes of the txid as an integer public txidToOrdering(txid: string): number { - return parseInt(txid.slice(56).match(/../g)?.reverse().join('') as string, 16); + return ( + ((parseInt(txid.substring(62, 64), 16) << 24) | + (parseInt(txid.substring(60, 62), 16) << 16) | + (parseInt(txid.substring(58, 60), 16) << 8) | + parseInt(txid.substring(56, 58), 16)) >>> + 0 + ); } } From 078bc1d91426f297a85139613f7709ec182498c5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 3 Jul 2023 11:57:12 -0400 Subject: [PATCH 522/782] fix and consolidate tx ordering logic --- backend/rust-gbt/src/audit_transaction.rs | 7 ++++-- backend/rust-gbt/src/gbt.rs | 30 ++++++++++++----------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 2df9e0b8c..56acea4ae 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -55,11 +55,14 @@ pub fn partial_cmp_uid_score(a: (u32, u32, f64), b: (u32, u32, f64)) -> Option Option { partial_cmp_uid_score( (self.uid, self.order, self.score), - (other.uid, self.order, other.score), + (other.uid, other.order, other.score), ) } } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index f88c022c4..0ee63cef6 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -36,13 +36,10 @@ impl PartialEq for TxPriority { impl Eq for TxPriority {} impl PartialOrd for TxPriority { fn partial_cmp(&self, other: &Self) -> Option { - if self.score != other.score { - self.score.partial_cmp(&other.score) - } else if self.order != other.order { - Some(other.order.cmp(&self.order)) - } else { - Some(self.uid.cmp(&other.uid)) - } + partial_cmp_uid_score( + (self.uid, self.order, self.score), + (other.uid, other.order, other.score), + ) } } impl Ord for TxPriority { @@ -153,26 +150,31 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { overflow.push(next_tx.uid); failures += 1; } else { - let mut package: Vec<(u32, usize)> = Vec::new(); + let mut package: Vec<(u32, u32, usize)> = Vec::new(); let mut cluster: Vec = Vec::new(); let is_cluster: bool = !next_tx.ancestors.is_empty(); for ancestor_id in &next_tx.ancestors { if let Some(ancestor) = audit_pool.get(ancestor_id) { - package.push((*ancestor_id, ancestor.ancestors.len())); + package.push((*ancestor_id, ancestor.order(), ancestor.ancestors.len())); } } package.sort_unstable_by(|a, b| -> Ordering { - if a.1 == b.1 { - b.0.cmp(&a.0) - } else { + if a.2 != b.2 { + // order by ascending ancestor count + a.2.cmp(&b.2) + } else if a.1 != b.1 { + // tie-break by ascending partial txid a.1.cmp(&b.1) + } else { + // tie-break partial txid collisions by ascending uid + a.0.cmp(&b.0) } }); - package.push((next_tx.uid, next_tx.ancestors.len())); + package.push((next_tx.uid, next_tx.order(), next_tx.ancestors.len())); let cluster_rate = next_tx.cluster_rate(); - for (txid, _) in &package { + for (txid, _, _) in &package { cluster.push(*txid); if let Some(tx) = audit_pool.get_mut(txid) { tx.used = true; From 897c667f177693ab253e3a6b0ce983819918ff47 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 3 Jul 2023 12:01:06 -0400 Subject: [PATCH 523/782] return sigop-adjusted effective fee rates --- backend/rust-gbt/src/audit_transaction.rs | 42 +++++++++++++++-------- backend/rust-gbt/src/gbt.rs | 12 +++---- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 56acea4ae..3e25a18a0 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -15,6 +15,9 @@ pub struct AuditTransaction { order: u32, pub fee: u64, pub weight: u32, + // exact sigop-adjusted weight + pub sigop_adjusted_weight: u32, + // sigop-adjusted vsize rounded up the the next integer pub sigop_adjusted_vsize: u32, pub sigops: u32, adjusted_fee_per_vsize: f64, @@ -25,7 +28,7 @@ pub struct AuditTransaction { pub ancestors: HashSet, pub children: HashSet, ancestor_fee: u64, - ancestor_weight: u32, + ancestor_sigop_adjusted_weight: u32, ancestor_sigop_adjusted_vsize: u32, ancestor_sigops: u32, // Safety: Must be private to prevent NaN breaking Ord impl. @@ -85,36 +88,44 @@ impl Ord for AuditTransaction { } #[inline] -fn calc_fee_rate(fee: f64, vsize: u32) -> f64 { - fee / (if vsize == 0 { 1.0 } else { f64::from(vsize) }) +fn calc_fee_rate(fee: f64, vsize: f64) -> f64 { + fee / (if vsize == 0.0 { 1.0 } else { vsize }) } impl AuditTransaction { pub fn from_thread_transaction(tx: &ThreadTransaction) -> Self { // rounded up to the nearest integer + let is_adjusted = tx.weight < (tx.sigops * 20); let sigop_adjusted_vsize = ((tx.weight + 3) / 4).max(tx.sigops * 5); + let sigop_adjusted_weight = tx.weight.max(tx.sigops * 20); + let effective_fee_per_vsize = if is_adjusted { + calc_fee_rate(tx.fee, f64::from(sigop_adjusted_weight) / 4.0) + } else { + tx.effective_fee_per_vsize + }; Self { uid: tx.uid, order: tx.order, fee: tx.fee as u64, weight: tx.weight, + sigop_adjusted_weight, sigop_adjusted_vsize, sigops: tx.sigops, - adjusted_fee_per_vsize: calc_fee_rate(tx.fee, sigop_adjusted_vsize), - effective_fee_per_vsize: tx.effective_fee_per_vsize, + adjusted_fee_per_vsize: calc_fee_rate(tx.fee, f64::from(sigop_adjusted_vsize)), + effective_fee_per_vsize, dependency_rate: f64::INFINITY, inputs: tx.inputs.clone(), relatives_set_flag: false, ancestors: u32hashset_new(), children: u32hashset_new(), ancestor_fee: tx.fee as u64, - ancestor_weight: tx.weight, + ancestor_sigop_adjusted_weight: sigop_adjusted_weight, ancestor_sigop_adjusted_vsize: sigop_adjusted_vsize, ancestor_sigops: tx.sigops, score: 0.0, used: false, modified: false, - dirty: false, + dirty: effective_fee_per_vsize != tx.effective_fee_per_vsize, } } @@ -144,8 +155,10 @@ impl AuditTransaction { // Even if it could, as it approaches 0, the value inside the min() call // grows, so if we think of 0 as "grew infinitely" then dependency_rate would be // the smaller of the two. If either side is NaN, the other side is returned. - self.dependency_rate - .min(self.ancestor_fee as f64 / (f64::from(self.ancestor_weight) / 4.0)) + self.dependency_rate.min(calc_fee_rate( + self.ancestor_fee as f64, + f64::from(self.ancestor_sigop_adjusted_weight) / 4.0, + )) } pub fn set_dirty_if_different(&mut self, cluster_rate: f64) { @@ -160,7 +173,7 @@ impl AuditTransaction { fn calc_new_score(&mut self) { self.score = self.adjusted_fee_per_vsize.min(calc_fee_rate( self.ancestor_fee as f64, - self.ancestor_sigop_adjusted_vsize, + f64::from(self.ancestor_sigop_adjusted_vsize), )); } @@ -169,13 +182,14 @@ impl AuditTransaction { &mut self, ancestors: HashSet, total_fee: u64, - total_weight: u32, + total_sigop_adjusted_weight: u32, total_sigop_adjusted_vsize: u32, total_sigops: u32, ) { self.ancestors = ancestors; self.ancestor_fee = self.fee + total_fee; - self.ancestor_weight = self.weight + total_weight; + self.ancestor_sigop_adjusted_weight = + self.sigop_adjusted_weight + total_sigop_adjusted_weight; self.ancestor_sigop_adjusted_vsize = self.sigop_adjusted_vsize + total_sigop_adjusted_vsize; self.ancestor_sigops = self.sigops + total_sigops; self.calc_new_score(); @@ -187,7 +201,7 @@ impl AuditTransaction { &mut self, root_txid: u32, root_fee: u64, - root_weight: u32, + root_sigop_adjusted_weight: u32, root_sigop_adjusted_vsize: u32, root_sigops: u32, cluster_rate: f64, @@ -196,7 +210,7 @@ impl AuditTransaction { self.dependency_rate = self.dependency_rate.min(cluster_rate); if self.ancestors.remove(&root_txid) { self.ancestor_fee -= root_fee; - self.ancestor_weight -= root_weight; + self.ancestor_sigop_adjusted_weight -= root_sigop_adjusted_weight; self.ancestor_sigop_adjusted_vsize -= root_sigop_adjusted_vsize; self.ancestor_sigops -= root_sigops; self.calc_new_score(); diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 0ee63cef6..aafa94c44 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -312,7 +312,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { } let mut total_fee: u64 = 0; - let mut total_weight: u32 = 0; + let mut total_sigop_adjusted_weight: u32 = 0; let mut total_sigop_adjusted_vsize: u32 = 0; let mut total_sigops: u32 = 0; @@ -321,7 +321,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { .get(ancestor_id) .expect("audit_pool contains all ancestors"); total_fee += ancestor.fee; - total_weight += ancestor.weight; + total_sigop_adjusted_weight += ancestor.sigop_adjusted_weight; total_sigop_adjusted_vsize += ancestor.sigop_adjusted_vsize; total_sigops += ancestor.sigops; } @@ -330,7 +330,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { tx.set_ancestors( ancestors, total_fee, - total_weight, + total_sigop_adjusted_weight, total_sigop_adjusted_vsize, total_sigops, ); @@ -347,7 +347,7 @@ fn update_descendants( let mut visited: HashSet = u32hashset_new(); let mut descendant_stack: Vec = Vec::new(); let root_fee: u64; - let root_weight: u32; + let root_sigop_adjusted_weight: u32; let root_sigop_adjusted_vsize: u32; let root_sigops: u32; if let Some(root_tx) = audit_pool.get(&root_txid) { @@ -358,7 +358,7 @@ fn update_descendants( } } root_fee = root_tx.fee; - root_weight = root_tx.weight; + root_sigop_adjusted_weight = root_tx.sigop_adjusted_weight; root_sigop_adjusted_vsize = root_tx.sigop_adjusted_vsize; root_sigops = root_tx.sigops; } else { @@ -370,7 +370,7 @@ fn update_descendants( let old_score = descendant.remove_root( root_txid, root_fee, - root_weight, + root_sigop_adjusted_weight, root_sigop_adjusted_vsize, root_sigops, cluster_rate, From cfa23637430cbeb6275cc8c6c31cac1167c39617 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 3 Jul 2023 12:01:49 -0400 Subject: [PATCH 524/782] only return rates changed since last update --- backend/rust-gbt/src/gbt.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index aafa94c44..9354d706b 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -66,7 +66,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { let mut block_weights: Vec = Vec::new(); info!("Initializing working structs"); - for (uid, tx) in mempool { + for (uid, tx) in &mut *mempool { let audit_tx = AuditTransaction::from_thread_transaction(tx); // Safety: audit_pool and mempool_stack must always contain the same transactions audit_pool.insert(audit_tx.uid, audit_tx); @@ -241,6 +241,9 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { trace!("txid: {}, is_dirty: {}", txid, tx.dirty); if tx.dirty { rates.push(vec![f64::from(txid), tx.effective_fee_per_vsize]); + if let Some(mempool_tx) = mempool.get_mut(&txid) { + mempool_tx.effective_fee_per_vsize = tx.effective_fee_per_vsize; + } } } trace!("\n\n\n\n\n===================="); From 8fdc44aa89c2af8ebc8fc4b0d4a3cdaa1beb9180 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 3 Jul 2023 22:01:54 -0400 Subject: [PATCH 525/782] replace audit_pool hashmap with a vec --- backend/rust-gbt/index.d.ts | 4 +- backend/rust-gbt/src/gbt.rs | 84 ++++++++++++++------------ backend/rust-gbt/src/lib.rs | 10 +-- backend/src/__tests__/gbt/gbt-tests.ts | 10 +-- backend/src/api/mempool-blocks.ts | 8 ++- 5 files changed, 65 insertions(+), 51 deletions(-) diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index 68b56a8e1..33ae32bdf 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -19,13 +19,13 @@ export class GbtGenerator { * * Rejects if the thread panics or if the Mutex is poisoned. */ - make(mempool: Array): Promise + make(mempool: Array, maxUid: number): Promise /** * # Errors * * Rejects if the thread panics or if the Mutex is poisoned. */ - update(newTxs: Array, removeTxs: Array): Promise + update(newTxs: Array, removeTxs: Array, maxUid: number): Promise } /** * The result from calling the gbt function. diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 9354d706b..876bd12ef 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -1,14 +1,14 @@ use priority_queue::PriorityQueue; use std::{ cmp::Ordering, - collections::{HashMap, HashSet}, + collections::{HashSet}, }; use tracing::{info, trace}; use crate::{ audit_transaction::{partial_cmp_uid_score, AuditTransaction}, u32_hasher_types::{ - u32hashmap_with_capacity, u32hashset_new, u32priority_queue_with_capacity, U32HasherState, + u32hashset_new, u32priority_queue_with_capacity, U32HasherState, }, GbtResult, ThreadTransactionsMap, }; @@ -19,7 +19,7 @@ const BLOCK_RESERVED_WEIGHT: u32 = 4_000; const BLOCK_RESERVED_SIGOPS: u32 = 400; const MAX_BLOCKS: usize = 8; -type AuditPool = HashMap; +type AuditPool = Vec>; type ModifiedQueue = PriorityQueue; #[derive(Debug)] @@ -58,9 +58,10 @@ impl Ord for TxPriority { // TODO: Make gbt smaller to fix these lints. #[allow(clippy::too_many_lines)] #[allow(clippy::cognitive_complexity)] -pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { +pub fn gbt(mempool: &mut ThreadTransactionsMap, max_uid: usize) -> GbtResult { let mempool_len = mempool.len(); - let mut audit_pool: AuditPool = u32hashmap_with_capacity(mempool_len); + let mut audit_pool: AuditPool = Vec::with_capacity(max_uid + 1); + audit_pool.resize(max_uid + 1, None); let mut mempool_stack: Vec = Vec::with_capacity(mempool_len); let mut clusters: Vec> = Vec::new(); let mut block_weights: Vec = Vec::new(); @@ -69,7 +70,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { for (uid, tx) in &mut *mempool { let audit_tx = AuditTransaction::from_thread_transaction(tx); // Safety: audit_pool and mempool_stack must always contain the same transactions - audit_pool.insert(audit_tx.uid, audit_tx); + audit_pool[*uid as usize] = Some(audit_tx); mempool_stack.push(*uid); } @@ -84,7 +85,8 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { .into_iter() .map(|txid| { let atx = audit_pool - .get(&txid) + .get(txid as usize) + .and_then(Option::as_ref) .expect("All txids are from audit_pool"); (txid, atx.order(), atx.score()) }) @@ -154,7 +156,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { let mut cluster: Vec = Vec::new(); let is_cluster: bool = !next_tx.ancestors.is_empty(); for ancestor_id in &next_tx.ancestors { - if let Some(ancestor) = audit_pool.get(ancestor_id) { + if let Some(Some(ancestor)) = audit_pool.get(*ancestor_id as usize) { package.push((*ancestor_id, ancestor.order(), ancestor.ancestors.len())); } } @@ -176,7 +178,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { for (txid, _, _) in &package { cluster.push(*txid); - if let Some(tx) = audit_pool.get_mut(txid) { + if let Some(Some(tx)) = audit_pool.get_mut(*txid as usize) { tx.used = true; tx.set_dirty_if_different(cluster_rate); transactions.push(tx.uid); @@ -211,7 +213,7 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { // 'overflow' packages didn't fit in this block, but are valid candidates for the next overflow.reverse(); for overflowed in &overflow { - if let Some(overflowed_tx) = audit_pool.get(overflowed) { + if let Some(Some(overflowed_tx)) = audit_pool.get(*overflowed as usize) { if overflowed_tx.modified { modified.push( *overflowed, @@ -237,12 +239,12 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap) -> GbtResult { info!("make a list of dirty transactions and their new rates"); let mut rates: Vec> = Vec::new(); - for (txid, tx) in audit_pool { - trace!("txid: {}, is_dirty: {}", txid, tx.dirty); - if tx.dirty { - rates.push(vec![f64::from(txid), tx.effective_fee_per_vsize]); - if let Some(mempool_tx) = mempool.get_mut(&txid) { - mempool_tx.effective_fee_per_vsize = tx.effective_fee_per_vsize; + for (uid, thread_tx) in mempool { + if let Some(Some(audit_tx)) = audit_pool.get(*uid as usize) { + trace!("txid: {}, is_dirty: {}", uid, audit_tx.dirty); + if audit_tx.dirty { + rates.push(vec![f64::from(*uid), audit_tx.effective_fee_per_vsize]); + thread_tx.effective_fee_per_vsize = audit_tx.effective_fee_per_vsize; } } } @@ -263,33 +265,39 @@ fn next_valid_from_stack<'a>( mempool_stack: &mut Vec, audit_pool: &'a AuditPool, ) -> Option<&'a AuditTransaction> { - let mut next_txid = mempool_stack.last()?; - let mut tx: &AuditTransaction = audit_pool.get(next_txid)?; - while tx.used || tx.modified { - mempool_stack.pop(); - next_txid = mempool_stack.last()?; - tx = audit_pool.get(next_txid)?; + while let Some(next_txid) = mempool_stack.last() { + match audit_pool.get(*next_txid as usize) { + Some(Some(tx)) if !tx.used && !tx.modified => { + return Some(tx); + } + _ => { + mempool_stack.pop(); + } + } } - Some(tx) + None } fn next_valid_from_queue<'a>( queue: &mut ModifiedQueue, audit_pool: &'a AuditPool, ) -> Option<&'a AuditTransaction> { - let mut next_txid = queue.peek()?.0; - let mut tx: &AuditTransaction = audit_pool.get(next_txid)?; - while tx.used { - queue.pop(); - next_txid = queue.peek()?.0; - tx = audit_pool.get(next_txid)?; + while let Some((next_txid, _)) = queue.peek() { + match audit_pool.get(*next_txid as usize) { + Some(Some(tx)) if !tx.used => { + return Some(tx); + } + _ => { + queue.pop(); + } + } } - Some(tx) + None } fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { let mut parents: HashSet = u32hashset_new(); - if let Some(tx) = audit_pool.get(&txid) { + if let Some(Some(tx)) = audit_pool.get(txid as usize) { if tx.relatives_set_flag { return; } @@ -304,7 +312,7 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { for parent_id in &parents { set_relatives(*parent_id, audit_pool); - if let Some(parent) = audit_pool.get_mut(parent_id) { + if let Some(Some(parent)) = audit_pool.get_mut(*parent_id as usize) { // Safety: ancestors must always contain only txes in audit_pool ancestors.insert(*parent_id); parent.children.insert(txid); @@ -320,16 +328,16 @@ fn set_relatives(txid: u32, audit_pool: &mut AuditPool) { let mut total_sigops: u32 = 0; for ancestor_id in &ancestors { - let ancestor = audit_pool - .get(ancestor_id) - .expect("audit_pool contains all ancestors"); + let Some(ancestor) = audit_pool + .get(*ancestor_id as usize) + .expect("audit_pool contains all ancestors") else { todo!() }; total_fee += ancestor.fee; total_sigop_adjusted_weight += ancestor.sigop_adjusted_weight; total_sigop_adjusted_vsize += ancestor.sigop_adjusted_vsize; total_sigops += ancestor.sigops; } - if let Some(tx) = audit_pool.get_mut(&txid) { + if let Some(Some(tx)) = audit_pool.get_mut(txid as usize) { tx.set_ancestors( ancestors, total_fee, @@ -353,7 +361,7 @@ fn update_descendants( let root_sigop_adjusted_weight: u32; let root_sigop_adjusted_vsize: u32; let root_sigops: u32; - if let Some(root_tx) = audit_pool.get(&root_txid) { + if let Some(Some(root_tx)) = audit_pool.get(root_txid as usize) { for descendant_id in &root_tx.children { if !visited.contains(descendant_id) { descendant_stack.push(*descendant_id); @@ -368,7 +376,7 @@ fn update_descendants( return; } while let Some(next_txid) = descendant_stack.pop() { - if let Some(descendant) = audit_pool.get_mut(&next_txid) { + if let Some(Some(descendant)) = audit_pool.get_mut(next_txid as usize) { // remove root tx as ancestor let old_score = descendant.remove_root( root_txid, diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 08f7cb599..21b333441 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -74,9 +74,9 @@ impl GbtGenerator { /// /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] - pub async fn make(&self, mempool: Vec) -> Result { + pub async fn make(&self, mempool: Vec, max_uid: u32) -> Result { trace!("make: Current State {:#?}", self.thread_transactions); - run_task(Arc::clone(&self.thread_transactions), move |map| { + run_task(Arc::clone(&self.thread_transactions), max_uid as usize, move |map| { for tx in mempool { map.insert(tx.uid, tx); } @@ -92,9 +92,10 @@ impl GbtGenerator { &self, new_txs: Vec, remove_txs: Vec, + max_uid: u32, ) -> Result { trace!("update: Current State {:#?}", self.thread_transactions); - run_task(Arc::clone(&self.thread_transactions), move |map| { + run_task(Arc::clone(&self.thread_transactions), max_uid as usize, move |map| { for tx in new_txs { map.insert(tx.uid, tx); } @@ -132,6 +133,7 @@ pub struct GbtResult { /// to the `HashMap` as the only argument. (A move closure is recommended to meet the bounds) async fn run_task( thread_transactions: Arc>, + max_uid: usize, callback: F, ) -> Result where @@ -149,7 +151,7 @@ where callback(&mut map); info!("Starting gbt algorithm for {} elements...", map.len()); - let result = gbt::gbt(&mut map); + let result = gbt::gbt(&mut map, max_uid); info!("Finished gbt algorithm for {} elements...", map.len()); debug!( diff --git a/backend/src/__tests__/gbt/gbt-tests.ts b/backend/src/__tests__/gbt/gbt-tests.ts index 8927b4096..8af76a47c 100644 --- a/backend/src/__tests__/gbt/gbt-tests.ts +++ b/backend/src/__tests__/gbt/gbt-tests.ts @@ -14,8 +14,8 @@ const vectorBuffer: Buffer = fs.readFileSync(path.join(__dirname, './', './test- describe('Rust GBT', () => { test('should produce the same template as getBlockTemplate from Bitcoin Core', async () => { const rustGbt = new GbtGenerator(); - const mempool = mempoolFromArrayBuffer(vectorBuffer.buffer); - const result = await rustGbt.make(mempool); + const { mempool, maxUid } = mempoolFromArrayBuffer(vectorBuffer.buffer); + const result = await rustGbt.make(mempool, maxUid); const blocks: [string, number][][] = result.blocks.map(block => { return block.map(uid => [vectorUidMap.get(uid) || 'missing', uid]); @@ -27,13 +27,15 @@ describe('Rust GBT', () => { }); }); -function mempoolFromArrayBuffer(buf: ArrayBuffer): ThreadTransaction[] { +function mempoolFromArrayBuffer(buf: ArrayBuffer): { mempool: ThreadTransaction[], maxUid: number } { + let maxUid = 0; const view = new DataView(buf); const count = view.getUint32(0, false); const txs: ThreadTransaction[] = []; let offset = 4; for (let i = 0; i < count; i++) { const uid = view.getUint32(offset, false); + maxUid = Math.max(maxUid, uid); const tx: ThreadTransaction = { uid, order: txidToOrdering(vectorUidMap.get(uid) as string), @@ -52,7 +54,7 @@ function mempoolFromArrayBuffer(buf: ArrayBuffer): ThreadTransaction[] { } txs.push(tx); } - return txs; + return { mempool: txs, maxUid }; } function txidToOrdering(txid: string): number { diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index a012ba4c2..d5538854a 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -350,7 +350,7 @@ class MempoolBlocks { const rustGbt = saveResults ? this.rustGbtGenerator : new GbtGenerator(); try { const { blocks, blockWeights, rates, clusters } = this.convertNapiResultTxids( - await rustGbt.make(Object.values(newMempool) as RustThreadTransaction[]), + await rustGbt.make(Object.values(newMempool) as RustThreadTransaction[], this.nextUid), ); if (saveResults) { this.rustInitialized = true; @@ -372,8 +372,9 @@ class MempoolBlocks { } public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[]): Promise { - // sanity check to avoid approaching uint32 uid overflow - if (this.nextUid + added.length > MAX_UINT32) { + // GBT optimization requires that uids never get too sparse + // as a sanity check, we should also explicitly prevent uint32 uid overflow + if (this.nextUid + added.length >= Math.min(Math.max(262144, 2 * mempoolSize), MAX_UINT32)) { this.resetRustGbt(); } if (!this.rustInitialized) { @@ -399,6 +400,7 @@ class MempoolBlocks { await this.rustGbtGenerator.update( added as RustThreadTransaction[], removedUids, + this.nextUid, ), ); const resultMempoolSize = blocks.reduce((total, block) => total + block.length, 0); From 9e5d10b15f43b65c5460aae00e9577e2e2a08e2e Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Mon, 3 Jul 2023 16:00:32 +0200 Subject: [PATCH 526/782] Add average fee delta to pool ranking Co-authored-by: mononaut <83316221+mononaut@users.noreply.github.com> --- backend/src/api/mining/mining.ts | 1 + backend/src/mempool.interfaces.ts | 1 + backend/src/repositories/PoolsRepository.ts | 3 ++- .../pool-ranking/pool-ranking.component.html | 13 +++++++++++-- .../pool-ranking/pool-ranking.component.scss | 13 ++++++++++++- frontend/src/app/interfaces/node-api.interface.ts | 1 + 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/backend/src/api/mining/mining.ts b/backend/src/api/mining/mining.ts index 1283a1846..e190492b8 100644 --- a/backend/src/api/mining/mining.ts +++ b/backend/src/api/mining/mining.ts @@ -106,6 +106,7 @@ class Mining { emptyBlocks: emptyBlocksCount.length > 0 ? emptyBlocksCount[0]['count'] : 0, slug: poolInfo.slug, avgMatchRate: poolInfo.avgMatchRate !== null ? Math.round(100 * poolInfo.avgMatchRate) / 100 : null, + avgFeeDelta: poolInfo.avgFeeDelta, }; poolsStats.push(poolStat); }); diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 3edd84cde..13c74160a 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -19,6 +19,7 @@ export interface PoolInfo { blockCount: number; slug: string; avgMatchRate: number | null; + avgFeeDelta: number | null; } export interface PoolStats extends PoolInfo { diff --git a/backend/src/repositories/PoolsRepository.ts b/backend/src/repositories/PoolsRepository.ts index 293fd5e39..899712266 100644 --- a/backend/src/repositories/PoolsRepository.ts +++ b/backend/src/repositories/PoolsRepository.ts @@ -39,7 +39,8 @@ class PoolsRepository { pools.name AS name, pools.link AS link, slug, - AVG(blocks_audits.match_rate) AS avgMatchRate + AVG(blocks_audits.match_rate) AS avgMatchRate, + AVG((CAST(blocks.fees as SIGNED) - CAST(blocks_audits.expected_fees as SIGNED)) / NULLIF(CAST(blocks_audits.expected_fees as SIGNED), 0)) AS avgFeeDelta FROM blocks JOIN pools on pools.id = pool_id LEFT JOIN blocks_audits ON blocks_audits.height = blocks.height diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.html b/frontend/src/app/components/pool-ranking/pool-ranking.component.html index 7b7fbfae0..6ffcbf485 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.html +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.html @@ -94,7 +94,8 @@

    Blocks Avg HealthEmpty blocksAvg Block FeesEmpty blocks
    {{ pool.emptyBlocks }} ({{ pool.emptyBlockRatio }}%) + + {{ pool.avgFeeDelta > 0 ? '+' : '' }}{{ (pool.avgFeeDelta * 100) | amountShortener: 2 }}% + + + - + + {{ pool.emptyBlocks }} ({{ pool.emptyBlockRatio }}%)
    Timestamp - +
    + + + + + + + + + + + + + + + + + + + + + + + +
    ClosedCapacityNodesChannel ID
    + ‎{{ channel.closing_date | date:'yyyy-MM-dd HH:mm' }} + + + + {{ channel.capacity | amountShortener: 1 }} + sats + + + + + + + {{ channel.short_id }} + + +
    + +
    +
    + + + + + +
    + +
    +
    Opening transaction
    +
    + + +
    + +
    +
    Closing transaction
       +
    + + +
    +
    Recently broadcasted Added Marginal fee rateFull RBF
    Fee per vByte - {{ tx.fee / (tx.weight / 4) | feeRounding }} sat/vB +  
    Fee rate - {{ feeRate | feeRounding }} sat/vB +
    Effective fee rate - {{ effectiveRate | feeRounding }} sat/vB +
    Median fee~{{ block?.extras?.medianFee | number:'1.0-0' }} sat/vB~
    Fee span{{ block?.extras?.minFee | number:'1.0-0' }} - {{ block?.extras?.maxFee | number:'1.0-0' }} sat/vB -
    Median fee~{{ block?.extras?.medianFee | number:'1.0-0' }} sat/vB + ~
    - ~{{ block?.extras?.medianFee | number:feeRounding }} sat/vB + ~
    @@ -32,8 +31,9 @@
    - {{ block.extras.minFee | number:feeRounding }} - {{ block.extras.maxFee | number:feeRounding }} sat/vB + + - +
    diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index cff158697..373653b7e 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -45,7 +45,9 @@

    priority rate

    -

    {{ recommendedFees.fastestFee }} sat/vB

    +

    + +

    diff --git a/frontend/src/app/components/fees-box/fees-box.component.html b/frontend/src/app/components/fees-box/fees-box.component.html index 1aea85429..580307df5 100644 --- a/frontend/src/app/components/fees-box/fees-box.component.html +++ b/frontend/src/app/components/fees-box/fees-box.component.html @@ -13,23 +13,23 @@
    -
    {{ recommendedFees.economyFee }} sat/vB
    +
    -
    {{ recommendedFees.hourFee }} sat/vB
    +
    -
    {{ recommendedFees.halfHourFee }} sat/vB
    +
    -
    {{ recommendedFees.fastestFee }} sat/vB
    +
    diff --git a/frontend/src/app/components/mempool-block/mempool-block.component.html b/frontend/src/app/components/mempool-block/mempool-block.component.html index 7d5b18ccb..b089a6d74 100644 --- a/frontend/src/app/components/mempool-block/mempool-block.component.html +++ b/frontend/src/app/components/mempool-block/mempool-block.component.html @@ -14,11 +14,15 @@
    Median fee~{{ mempoolBlock.medianFee | number:'1.0-0' }} sat/vB ~
    Fee span{{ mempoolBlock.feeRange[0] | number:'1.0-0' }} - {{ mempoolBlock.feeRange[mempoolBlock.feeRange.length - 1] | number:'1.0-0' }} sat/vB + + - + +
    Total fees {{ cpfpTx.fee / (cpfpTx.weight / 4) | feeRounding }} sat/vB
    {{ cpfpInfo.bestDescendant.fee / (cpfpInfo.bestDescendant.weight / 4) | feeRounding }} sat/vB
    {{ cpfpTx.fee / (cpfpTx.weight / 4) | feeRounding }} sat/vB
    Fee rate - {{ tx.feePerVsize | feeRounding }} sat/vB +   @@ -486,7 +486,7 @@ Effective fee rate
    - {{ tx.effectiveFeePerVsize | feeRounding }} sat/vB + diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index c509a799d..a758f3c94 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -290,8 +290,8 @@
    - {{ tx.fee / (tx.weight / 4) | feeRounding }} sat/vB  – {{ tx.fee | number }} +  – {{ tx.fee | number }} sat
    Show more inputs to reveal fee data
    diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index e5504c84a..e7c17d87a 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -132,7 +132,7 @@
    Confidential {{ transaction.fee / transaction.vsize | feeRounding }} sat/vB
    @@ -188,7 +188,7 @@
    Minimum fee
    Purging

    - < {{ mempoolInfoData.value.memPoolInfo.mempoolminfee * 100000 | feeRounding }} sat/vB + <

    diff --git a/frontend/src/app/shared/components/fee-rate/fee-rate.component.html b/frontend/src/app/shared/components/fee-rate/fee-rate.component.html index 3b6ecc75e..bd684369c 100644 --- a/frontend/src/app/shared/components/fee-rate/fee-rate.component.html +++ b/frontend/src/app/shared/components/fee-rate/fee-rate.component.html @@ -1,4 +1,4 @@ - {{ fee / (weight / 4) | feeRounding:rounding }} sat/vB - {{ fee / weight | feeRounding:rounding }} sat/WU + {{ fee / (weight / 4) | feeRounding:rounding }} sat/vB + {{ fee / weight | feeRounding:rounding }} sat/WU \ No newline at end of file diff --git a/frontend/src/app/shared/components/fee-rate/fee-rate.component.ts b/frontend/src/app/shared/components/fee-rate/fee-rate.component.ts index f48686ad5..4d65ef0c2 100644 --- a/frontend/src/app/shared/components/fee-rate/fee-rate.component.ts +++ b/frontend/src/app/shared/components/fee-rate/fee-rate.component.ts @@ -13,6 +13,7 @@ export class FeeRateComponent implements OnInit { @Input() rounding: string = null; @Input() showUnit: boolean = true; @Input() unitClass: string = 'symbol'; + @Input() unitStyle: any; rateUnits$: Observable; From bde8fbac98405c0084ba7a6476bf7ca92cd4be48 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 15 Jun 2023 18:52:13 -0400 Subject: [PATCH 544/782] Implement only-vsize and only-weight directives --- .../weight-directives/weight-directives.ts | 45 +++++++++++++++++++ frontend/src/app/shared/shared.module.ts | 8 ++++ 2 files changed, 53 insertions(+) create mode 100644 frontend/src/app/shared/components/weight-directives/weight-directives.ts diff --git a/frontend/src/app/shared/components/weight-directives/weight-directives.ts b/frontend/src/app/shared/components/weight-directives/weight-directives.ts new file mode 100644 index 000000000..879b6bee6 --- /dev/null +++ b/frontend/src/app/shared/components/weight-directives/weight-directives.ts @@ -0,0 +1,45 @@ +import { Directive, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core'; +import { Subscription } from 'rxjs'; +import { StateService } from '../../../services/state.service'; + +function createRateUnitDirective(checkFn: (rateUnit: string) => boolean): any { + @Directive() + class RateUnitDirective implements OnDestroy { + private subscription: Subscription; + private enabled: boolean; + private hasView: boolean = false; + + constructor( + private templateRef: TemplateRef, + private viewContainer: ViewContainerRef, + private stateService: StateService + ) { + this.subscription = this.stateService.rateUnits$.subscribe(rateUnit => { + this.enabled = checkFn(rateUnit); + this.updateView(); + }); + } + + updateView(): void { + if (this.enabled && !this.hasView) { + this.viewContainer.createEmbeddedView(this.templateRef); + this.hasView = true; + } else if (!this.enabled && this.hasView) { + this.viewContainer.clear(); + this.hasView = false; + } + } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); + } + } + + return RateUnitDirective; +} + +@Directive({ selector: '[only-vsize]' }) +export class OnlyVsizeDirective extends createRateUnitDirective(rateUnit => rateUnit !== 'wu') {} + +@Directive({ selector: '[only-weight]' }) +export class OnlyWeightDirective extends createRateUnitDirective(rateUnit => rateUnit === 'wu') {} \ No newline at end of file diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index d68f1e4e0..5d9b91e11 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -98,6 +98,8 @@ import { ClockchainComponent } from '../components/clockchain/clockchain.compone import { ClockFaceComponent } from '../components/clock-face/clock-face.component'; import { ClockComponent } from '../components/clock/clock.component'; +import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-directives/weight-directives'; + @NgModule({ declarations: [ ClipboardComponent, @@ -188,6 +190,9 @@ import { ClockComponent } from '../components/clock/clock.component'; ClockchainComponent, ClockComponent, ClockFaceComponent, + + OnlyVsizeDirective, + OnlyWeightDirective ], imports: [ CommonModule, @@ -303,6 +308,9 @@ import { ClockComponent } from '../components/clock/clock.component'; ClockchainComponent, ClockComponent, ClockFaceComponent, + + OnlyVsizeDirective, + OnlyWeightDirective ] }) export class SharedModule { From 5b9d43032c829e423da346962aa0d7f08af22d08 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 15 Jun 2023 18:56:34 -0400 Subject: [PATCH 545/782] Switch remaining vb fields according to unit preference --- .../bisq-transaction.component.html | 3 +- .../block-fee-rates-graph.component.ts | 28 ++++++++++------ .../block-overview-tooltip.component.html | 6 +++- .../fee-distribution-graph.component.ts | 32 +++++++++++++------ .../components/footer/footer.component.html | 3 +- .../incoming-transactions-graph.component.ts | 25 +++++++++++++-- .../mempool-graph/mempool-graph.component.ts | 3 ++ .../rbf-timeline-tooltip.component.html | 6 +++- .../rbf-timeline/rbf-timeline.component.html | 2 +- .../rbf-timeline/rbf-timeline.component.scss | 5 --- .../transaction/transaction.component.html | 12 ++++--- .../app/dashboard/dashboard.component.html | 3 +- .../shared/pipes/bytes-pipe/wubytes.pipe.ts | 11 ++++--- frontend/src/app/shared/shared.module.ts | 1 + 14 files changed, 99 insertions(+), 41 deletions(-) diff --git a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html index 4dd1c0a3e..85abafee0 100644 --- a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html +++ b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html @@ -64,7 +64,8 @@ {{ bisqTx.burntFee / 100 | number: '1.2-2' }} BSQ - Fee per vByte + Fee per vByte + Fee per weight unit   diff --git a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts index cbf33933c..66a594643 100644 --- a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts +++ b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, NgZone, OnInit } from '@angular/core'; import { EChartsOption } from 'echarts'; -import { Observable } from 'rxjs'; +import { Observable, Subscription, combineLatest } from 'rxjs'; import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; import { ApiService } from '../../services/api.service'; import { SeoService } from '../../services/seo.service'; @@ -76,10 +76,11 @@ export class BlockFeeRatesGraphComponent implements OnInit { } }); - this.statsObservable$ = this.radioGroupForm.get('dateSpan').valueChanges - .pipe( - startWith(this.radioGroupForm.controls.dateSpan.value), - switchMap((timespan) => { + this.statsObservable$ = combineLatest([ + this.radioGroupForm.get('dateSpan').valueChanges.pipe(startWith(this.radioGroupForm.controls.dateSpan.value)), + this.stateService.rateUnits$ + ]).pipe( + switchMap(([timespan, rateUnits]) => { this.storageService.setValue('miningWindowPreference', timespan); this.timespan = timespan; this.isLoading = true; @@ -135,8 +136,8 @@ export class BlockFeeRatesGraphComponent implements OnInit { this.prepareChartOptions({ legends: legends, - series: series, - }); + series: series + }, rateUnits === 'wu'); this.isLoading = false; }), map((response) => { @@ -150,7 +151,7 @@ export class BlockFeeRatesGraphComponent implements OnInit { ); } - prepareChartOptions(data) { + prepareChartOptions(data, weightMode) { this.chartOptions = { color: ['#D81B60', '#8E24AA', '#1E88E5', '#7CB342', '#FDD835', '#6D4C41', '#546E7A'], animation: false, @@ -181,7 +182,11 @@ export class BlockFeeRatesGraphComponent implements OnInit { let tooltip = `${formatterXAxis(this.locale, this.timespan, parseInt(data[0].axisValue, 10))}
    `; for (const rate of data.reverse()) { - tooltip += `${rate.marker} ${rate.seriesName}: ${rate.data[1]} sats/vByte
    `; + if (weightMode) { + tooltip += `${rate.marker} ${rate.seriesName}: ${rate.data[1] / 4} sats/WU
    `; + } else { + tooltip += `${rate.marker} ${rate.seriesName}: ${rate.data[1]} sats/vByte
    `; + } } if (['24h', '3d'].includes(this.timespan)) { @@ -231,9 +236,12 @@ export class BlockFeeRatesGraphComponent implements OnInit { axisLabel: { color: 'rgb(110, 112, 121)', formatter: (val) => { + if (weightMode) { + val /= 4; + } const selectedPowerOfTen: any = selectPowerOfTen(val); const newVal = Math.round(val / selectedPowerOfTen.divider); - return `${newVal}${selectedPowerOfTen.unit} s/vB`; + return `${newVal}${selectedPowerOfTen.unit} s/${weightMode ? 'WU': 'vB'}`; }, }, splitLine: { diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html index 636f2c16a..eece860f8 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html @@ -34,10 +34,14 @@ - + Virtual size + + Weight + + Audit status diff --git a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts index 823d271a1..f275588a1 100644 --- a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts +++ b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts @@ -1,16 +1,17 @@ -import { OnChanges } from '@angular/core'; +import { OnChanges, OnDestroy } from '@angular/core'; import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core'; import { TransactionStripped } from '../../interfaces/websocket.interface'; import { StateService } from '../../services/state.service'; import { VbytesPipe } from '../../shared/pipes/bytes-pipe/vbytes.pipe'; import { selectPowerOfTen } from '../../bitcoin.utils'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-fee-distribution-graph', templateUrl: './fee-distribution-graph.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) -export class FeeDistributionGraphComponent implements OnInit, OnChanges { +export class FeeDistributionGraphComponent implements OnInit, OnChanges, OnDestroy { @Input() feeRange: number[]; @Input() vsize: number; @Input() transactions: TransactionStripped[]; @@ -25,6 +26,8 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { data: number[][]; labelInterval: number = 50; + rateUnitSub: Subscription; + weightMode: boolean = false; mempoolVsizeFeesOptions: any; mempoolVsizeFeesInitOptions = { renderer: 'svg' @@ -35,8 +38,13 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { private vbytesPipe: VbytesPipe, ) { } - ngOnInit(): void { - this.mountChart(); + ngOnInit() { + this.rateUnitSub = this.stateService.rateUnits$.subscribe(rateUnits => { + this.weightMode = rateUnits === 'wu'; + if (this.data) { + this.mountChart(); + } + }); } ngOnChanges(): void { @@ -122,8 +130,9 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { }, axisLabel: { formatter: (value: number): string => { - const selectedPowerOfTen = selectPowerOfTen(value); - const newVal = Math.round(value / selectedPowerOfTen.divider); + const unitValue = this.weightMode ? value / 4 : value; + const selectedPowerOfTen = selectPowerOfTen(unitValue); + const newVal = Math.round(unitValue / selectedPowerOfTen.divider); return `${newVal}${selectedPowerOfTen.unit}`; }, } @@ -138,10 +147,11 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { textShadowBlur: 0, formatter: (label: { data: number[] }): string => { const value = label.data[1]; - const selectedPowerOfTen = selectPowerOfTen(value); - const newVal = Math.round(value / selectedPowerOfTen.divider); + const unitValue = this.weightMode ? value / 4 : value; + const selectedPowerOfTen = selectPowerOfTen(unitValue); + const newVal = Math.round(unitValue / selectedPowerOfTen.divider); return `${newVal}${selectedPowerOfTen.unit}`; - }, + } }, showAllSymbol: false, smooth: true, @@ -162,4 +172,8 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges { }] }; } + + ngOnDestroy(): void { + this.rateUnitSub.unsubscribe(); + } } diff --git a/frontend/src/app/components/footer/footer.component.html b/frontend/src/app/components/footer/footer.component.html index c8d28824f..cc5d1f9b9 100644 --- a/frontend/src/app/components/footer/footer.component.html +++ b/frontend/src/app/components/footer/footer.component.html @@ -10,7 +10,8 @@
     
    -
    ‎{{ mempoolInfoData.vBytesPerSecond | ceil | number }} vB/s
    +
    ‎{{ mempoolInfoData.vBytesPerSecond | ceil | number }} vB/s
    +
    ‎{{ mempoolInfoData.vBytesPerSecond * 4 | ceil | number }} WU/s
    diff --git a/frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.ts b/frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.ts index d721469b7..219811e9c 100644 --- a/frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.ts +++ b/frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.ts @@ -1,9 +1,11 @@ -import { Component, Input, Inject, LOCALE_ID, ChangeDetectionStrategy, OnInit } from '@angular/core'; +import { Component, Input, Inject, LOCALE_ID, ChangeDetectionStrategy, OnInit, OnDestroy } from '@angular/core'; import { EChartsOption } from 'echarts'; import { OnChanges } from '@angular/core'; import { StorageService } from '../../services/storage.service'; import { download, formatterXAxis, formatterXAxisLabel } from '../../shared/graphs.utils'; import { formatNumber } from '@angular/common'; +import { StateService } from '../../services/state.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-incoming-transactions-graph', @@ -18,7 +20,7 @@ import { formatNumber } from '@angular/common'; `], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class IncomingTransactionsGraphComponent implements OnInit, OnChanges { +export class IncomingTransactionsGraphComponent implements OnInit, OnChanges, OnDestroy { @Input() data: any; @Input() theme: string; @Input() height: number | string = '200'; @@ -35,14 +37,24 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges { }; windowPreference: string; chartInstance: any = undefined; + weightMode: boolean = false; + rateUnitSub: Subscription; constructor( @Inject(LOCALE_ID) private locale: string, private storageService: StorageService, + private stateService: StateService, ) { } ngOnInit() { this.isLoading = true; + + this.rateUnitSub = this.stateService.rateUnits$.subscribe(rateUnits => { + this.weightMode = rateUnits === 'wu'; + if (this.data) { + this.mountChart(); + } + }); } ngOnChanges(): void { @@ -118,7 +130,7 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges { itemFormatted += `
    ${colorSpan(item.color)}
    -
    ${formatNumber(item.value[1], this.locale, '1.0-0')}vB/s
    +
    ${formatNumber(this.weightMode ? item.value[1] * 4 : item.value[1], this.locale, '1.0-0')} ${this.weightMode ? 'WU' : 'vB'}/s
    `; } }); @@ -147,6 +159,9 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges { type: 'value', axisLabel: { fontSize: 11, + formatter: (value) => { + return this.weightMode ? value * 4 : value; + } }, splitLine: { lineStyle: { @@ -250,4 +265,8 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges { this.mempoolStatsChartOption.backgroundColor = 'none'; this.chartInstance.setOption(this.mempoolStatsChartOption); } + + ngOnDestroy(): void { + this.rateUnitSub.unsubscribe(); + } } diff --git a/frontend/src/app/components/mempool-graph/mempool-graph.component.ts b/frontend/src/app/components/mempool-graph/mempool-graph.component.ts index 4ab8c33fc..6c9795c89 100644 --- a/frontend/src/app/components/mempool-graph/mempool-graph.component.ts +++ b/frontend/src/app/components/mempool-graph/mempool-graph.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit, Input, Inject, LOCALE_ID, ChangeDetectionStrategy, OnChanges } from '@angular/core'; import { VbytesPipe } from '../../shared/pipes/bytes-pipe/vbytes.pipe'; +import { WuBytesPipe } from '../../shared/pipes/bytes-pipe/wubytes.pipe'; import { formatNumber } from '@angular/common'; import { OptimizedMempoolStats } from '../../interfaces/node-api.interface'; import { StateService } from '../../services/state.service'; @@ -48,9 +49,11 @@ export class MempoolGraphComponent implements OnInit, OnChanges { chartColorsOrdered = chartColors; inverted: boolean; chartInstance: any = undefined; + weightMode: boolean = false; constructor( private vbytesPipe: VbytesPipe, + private wubytesPipe: WuBytesPipe, private stateService: StateService, private storageService: StorageService, @Inject(LOCALE_ID) private locale: string, diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html index 1ce224760..68f8a1caf 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html @@ -21,10 +21,14 @@ Fee {{ rbfInfo.tx.fee | number }} sat - + Virtual size + + Weight + + Status diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html index 5af1c7a0b..ce5a9678f 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html @@ -31,7 +31,7 @@ >
    - +
    diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss index 97388b98e..3745360a5 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss @@ -126,11 +126,6 @@ } } - .symbol::ng-deep { - display: block; - margin-top: -0.5em; - } - &.selected { .shape-border { background: #9339f4; diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 5c2457c02..25707b007 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -137,7 +137,8 @@ Type TXID - Virtual size + Virtual size + Weight Fee rate @@ -149,7 +150,8 @@ - + + @@ -160,7 +162,8 @@ - + + @@ -171,7 +174,8 @@ - + + diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index e7c17d87a..620678a28 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -229,7 +229,8 @@
     
    -
    ‎{{ mempoolInfoData.value.vBytesPerSecond | ceil | number }} vB/s
    +
    ‎{{ mempoolInfoData.value.vBytesPerSecond | ceil | number }} vB/s
    +
    ‎{{ mempoolInfoData.value.vBytesPerSecond * 4 | ceil | number }} WU/s
    diff --git a/frontend/src/app/shared/pipes/bytes-pipe/wubytes.pipe.ts b/frontend/src/app/shared/pipes/bytes-pipe/wubytes.pipe.ts index 397873df2..b6566ac0a 100644 --- a/frontend/src/app/shared/pipes/bytes-pipe/wubytes.pipe.ts +++ b/frontend/src/app/shared/pipes/bytes-pipe/wubytes.pipe.ts @@ -17,7 +17,7 @@ export class WuBytesPipe implements PipeTransform { 'TWU': {max: Number.MAX_SAFE_INTEGER, prev: 'GWU'} }; - transform(input: any, decimal: number = 0, from: ByteUnit = 'WU', to?: ByteUnit): any { + transform(input: any, decimal: number = 0, from: ByteUnit = 'WU', to?: ByteUnit, plainText?: boolean): any { if (!(isNumberFinite(input) && isNumberFinite(decimal) && @@ -38,7 +38,7 @@ export class WuBytesPipe implements PipeTransform { const result = toDecimal(WuBytesPipe.calculateResult(format, bytes), decimal); - return WuBytesPipe.formatResult(result, to); + return WuBytesPipe.formatResult(result, to, plainText); } for (const key in WuBytesPipe.formats) { @@ -47,12 +47,15 @@ export class WuBytesPipe implements PipeTransform { const result = toDecimal(WuBytesPipe.calculateResult(format, bytes), decimal); - return WuBytesPipe.formatResult(result, key); + return WuBytesPipe.formatResult(result, key, plainText); } } } - static formatResult(result: number, unit: string): string { + static formatResult(result: number, unit: string, plainText: boolean): string { + if (plainText){ + return `${result} ${unit}`; + } return `${result} ${unit}`; } diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 5d9b91e11..9cf780116 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -209,6 +209,7 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir ], providers: [ VbytesPipe, + WuBytesPipe, RelativeUrlPipe, NoSanitizePipe, ShortenStringPipe, From 94c0222efec787fb79666542c301ead23484766e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 10:50:25 +0900 Subject: [PATCH 546/782] reset blocks$ and transactions$ observables when network changes --- frontend/src/app/services/state.service.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 0c5f5a5d9..c1b4421df 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -1,11 +1,11 @@ import { Inject, Injectable, PLATFORM_ID, LOCALE_ID } from '@angular/core'; import { ReplaySubject, BehaviorSubject, Subject, fromEvent, Observable, merge } from 'rxjs'; import { Transaction } from '../interfaces/electrs.interface'; -import { IBackendInfo, MempoolBlock, MempoolBlockWithTransactions, MempoolBlockDelta, MempoolInfo, Recommendedfees, ReplacedTransaction, TransactionStripped } from '../interfaces/websocket.interface'; +import { IBackendInfo, MempoolBlock, MempoolBlockDelta, MempoolInfo, Recommendedfees, ReplacedTransaction, TransactionStripped } from '../interfaces/websocket.interface'; import { BlockExtended, DifficultyAdjustment, MempoolPosition, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface'; import { Router, NavigationStart } from '@angular/router'; import { isPlatformBrowser } from '@angular/common'; -import { map, scan, shareReplay, tap } from 'rxjs/operators'; +import { map, scan, shareReplay } from 'rxjs/operators'; import { StorageService } from './storage.service'; export interface MarkBlockState { @@ -198,6 +198,11 @@ export class StateService { this.networkChanged$.next(this.env.BASE_MODULE); } + this.networkChanged$.subscribe((network) => { + this.transactions$ = new ReplaySubject(6); + this.blocks$ = new ReplaySubject<[BlockExtended, string]>(this.env.KEEP_BLOCKS_AMOUNT); + }); + this.blockVSize = this.env.BLOCK_WEIGHT_UNITS / 4; const savedTimePreference = this.storageService.getValue('time-preference-ltr'); From 01bd9dd957e11809f1e2ab30e8231656bad81a6c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 11:18:17 +0900 Subject: [PATCH 547/782] Add spacer for missing fiat values --- frontend/src/app/fiat/fiat.component.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/fiat/fiat.component.html b/frontend/src/app/fiat/fiat.component.html index afee30d27..ebf59ffb1 100644 --- a/frontend/src/app/fiat/fiat.component.html +++ b/frontend/src/app/fiat/fiat.component.html @@ -8,7 +8,10 @@ - + {{ (conversions[currency] > -1 ? conversions[currency] : 0) * value / 100000000 | fiatCurrency : digitsInfo : currency }} + +   + \ No newline at end of file From a01336d8ac96dfb339a4fe80eb51620b8e0cd090 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 11:44:30 +0900 Subject: [PATCH 548/782] Fix mined rbf conflict prevention --- backend/src/api/common.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index 9836559ae..735e240c1 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -86,19 +86,19 @@ export class Common { const match = spendMap.get(`${vin.txid}:${vin.vout}`); if (match && match.txid !== tx.txid) { replaced.add(match); + // remove this tx from the spendMap + // prevents the same tx being replaced more than once + for (const replacedVin of match.vin) { + const key = `${replacedVin.txid}:${replacedVin.vout}`; + spendMap.delete(key); + } } + const key = `${vin.txid}:${vin.vout}`; + spendMap.delete(key); } if (replaced.size) { matches[tx.txid] = { replaced: Array.from(replaced), replacedBy: tx }; } - // remove this tx from the spendMap - // prevents the same tx being replaced more than once - for (const vin of tx.vin) { - const key = `${vin.txid}:${vin.vout}`; - if (spendMap.get(key)?.txid === tx.txid) { - spendMap.delete(key); - } - } } return matches; } From 11d1a68f78c8324cb1efdc9c9fd45ac2ceb7dd84 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 14:36:42 +0900 Subject: [PATCH 549/782] Upgrade bitcoin core to v25.0 --- production/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/production/install b/production/install index 5ee445a21..0297d4b4f 100755 --- a/production/install +++ b/production/install @@ -332,7 +332,7 @@ BITCOIN_REPO_URL=https://github.com/bitcoin/bitcoin BITCOIN_REPO_NAME=bitcoin BITCOIN_REPO_BRANCH=master #BITCOIN_LATEST_RELEASE=$(curl -s https://api.github.com/repos/bitcoin/bitcoin/releases/latest|grep tag_name|head -1|cut -d '"' -f4) -BITCOIN_LATEST_RELEASE=v23.0 +BITCOIN_LATEST_RELEASE=v25.0 echo -n '.' BISQ_REPO_URL=https://github.com/bisq-network/bisq From ca2830d6d8c4e223c9400fcad52acc92e5597ced Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 16:03:44 +0900 Subject: [PATCH 550/782] fix price updater loop on testnet/signet --- backend/src/indexer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/indexer.ts b/backend/src/indexer.ts index 4b120867f..88f44d587 100644 --- a/backend/src/indexer.ts +++ b/backend/src/indexer.ts @@ -6,6 +6,7 @@ import logger from './logger'; import bitcoinClient from './api/bitcoin/bitcoin-client'; import priceUpdater from './tasks/price-updater'; import PricesRepository from './repositories/PricesRepository'; +import config from './config'; export interface CoreIndex { name: string; @@ -72,7 +73,7 @@ class Indexer { return; } - if (task === 'blocksPrices' && !this.tasksRunning.includes(task)) { + if (task === 'blocksPrices' && !this.tasksRunning.includes(task) && !['testnet', 'signet'].includes(config.MEMPOOL.NETWORK)) { this.tasksRunning.push(task); const lastestPriceId = await PricesRepository.$getLatestPriceId(); if (priceUpdater.historyInserted === false || lastestPriceId === null) { From 2570357becc0548c09da98590988310f127ddf6c Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn <100320+knorrium@users.noreply.github.com> Date: Tue, 11 Jul 2023 00:21:00 -0700 Subject: [PATCH 551/782] Add node v20 to the test matrix --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b3c072689..e6bd3941d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" strategy: matrix: - node: ["16", "17", "18"] + node: ["16", "17", "18", "20"] flavor: ["dev", "prod"] fail-fast: false runs-on: "ubuntu-latest" @@ -60,7 +60,7 @@ jobs: if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" strategy: matrix: - node: ["16", "17", "18"] + node: ["16", "17", "18", "20"] flavor: ["dev", "prod"] fail-fast: false runs-on: "ubuntu-latest" From ffca2f174d7e6a5aaec4c180c95120bc57655b1d Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 12 Jul 2023 12:24:45 +0900 Subject: [PATCH 552/782] Connectivity ranking title fix --- .../top-nodes-per-channels.component.html | 2 +- .../top-nodes-per-channels.component.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html b/frontend/src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html index 652a70cc3..94a887bb3 100644 --- a/frontend/src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html +++ b/frontend/src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.html @@ -1,7 +1,7 @@
    -

    Liquidity Ranking

    +

    Connectivity Ranking

    diff --git a/frontend/src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.ts b/frontend/src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.ts index 4db896cb7..607ec2a99 100644 --- a/frontend/src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.ts +++ b/frontend/src/app/lightning/nodes-ranking/top-nodes-per-channels/top-nodes-per-channels.component.ts @@ -1,6 +1,7 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; import { map, Observable } from 'rxjs'; import { INodesRanking, ITopNodesPerChannels } from '../../../interfaces/node-api.interface'; +import { SeoService } from '../../../services/seo.service'; import { StateService } from '../../../services/state.service'; import { GeolocationData } from '../../../shared/components/geolocation/geolocation.component'; import { LightningApiService } from '../../lightning-api.service'; @@ -22,6 +23,7 @@ export class TopNodesPerChannels implements OnInit { constructor( private apiService: LightningApiService, private stateService: StateService, + private seoService: SeoService, ) {} ngOnInit(): void { @@ -32,6 +34,8 @@ export class TopNodesPerChannels implements OnInit { } if (this.widget === false) { + this.seoService.setTitle($localize`:@@c50bf442cf99f6fc5f8b687c460f33234b879869:Connectivity Ranking`); + this.topNodesPerChannels$ = this.apiService.getTopNodesByChannels$().pipe( map((ranking) => { for (const i in ranking) { From 0dd9867a1f3ecdde3a86df9858ccf61ac85635f0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 12 Jul 2023 12:58:48 +0900 Subject: [PATCH 553/782] always show latest difficulty on hashrate chart --- .../hashrate-chart/hashrate-chart.component.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts index fcff0dddb..d562375b8 100644 --- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts +++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -109,6 +109,14 @@ export class HashrateChartComponent implements OnInit { tap((response: any) => { const data = response.body; + // always include the latest difficulty + if (data.difficulty.length && data.difficulty[data.difficulty.length - 1].difficulty !== data.currentDifficulty) { + data.difficulty.push({ + timestamp: Date.now() / 1000, + difficulty: data.currentDifficulty + }); + } + // We generate duplicated data point so the tooltip works nicely const diffFixed = []; let diffIndex = 1; @@ -137,6 +145,14 @@ export class HashrateChartComponent implements OnInit { ++diffIndex; } + while (diffIndex <= data.difficulty.length) { + diffFixed.push({ + timestamp: data.difficulty[diffIndex - 1].time, + difficulty: data.difficulty[diffIndex - 1].difficulty + }); + diffIndex++; + } + let maResolution = 15; const hashrateMa = []; for (let i = maResolution - 1; i < data.hashrates.length; ++i) { From 95e50ddf02f6188ca2ffb5758e5882a8e8523849 Mon Sep 17 00:00:00 2001 From: wiz Date: Wed, 12 Jul 2023 17:16:40 +0900 Subject: [PATCH 554/782] Fix production rust GBT build --- backend/package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index f277f6d6d..4f36005a7 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -7570,7 +7570,7 @@ "name": "gbt", "version": "0.1.0", "hasInstallScript": true, - "devDependencies": { + "dependencies": { "@napi-rs/cli": "^2.16.1" }, "engines": { From 415b70da1448dea6c78daca197fd22d3caf41cbe Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 15:49:38 +0900 Subject: [PATCH 555/782] show "loading" message while checking for cached txs --- .../transaction/transaction.component.html | 13 ++++++++++--- .../components/transaction/transaction.component.ts | 8 ++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 25707b007..3e739a30f 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -453,12 +453,19 @@ -
    -

    Transaction not found.

    -
    Waiting for it to appear in the mempool...
    +
    +

    Loading transaction

    + +
    +

    Transaction not found.

    +
    Waiting for it to appear in the mempool...
    +
    +
    +
    +

    {{ error.error }}

    diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index bbf679dcf..08f331e60 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -39,6 +39,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { isLoadingTx = true; error: any = undefined; errorUnblinded: any = undefined; + loadingCachedTx = false; waitingForTransaction = false; latestBlock: BlockExtended; transactionTime = -1; @@ -199,6 +200,9 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.fetchCachedTxSubscription = this.fetchCachedTx$ .pipe( + tap(() => { + this.loadingCachedTx = true; + }), switchMap((txId) => this.apiService .getRbfCachedTx$(txId) @@ -207,6 +211,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { return of(null); }) ).subscribe((tx) => { + this.loadingCachedTx = false; if (!tx) { return; } @@ -221,6 +226,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.tx.feePerVsize = tx.fee / (tx.weight / 4); this.isLoadingTx = false; this.error = undefined; + this.loadingCachedTx = false; this.waitingForTransaction = false; this.graphExpanded = false; this.transactionTime = tx.firstSeen || 0; @@ -338,6 +344,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.tx.feePerVsize = tx.fee / (tx.weight / 4); this.isLoadingTx = false; this.error = undefined; + this.loadingCachedTx = false; this.waitingForTransaction = false; this.websocketService.startTrackTransaction(tx.txid); this.graphExpanded = false; @@ -409,6 +416,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.txReplacedSubscription = this.stateService.txReplaced$.subscribe((rbfTransaction) => { if (!this.tx) { this.error = new Error(); + this.loadingCachedTx = false; this.waitingForTransaction = false; } this.rbfTransaction = rbfTransaction; From 55cc3a0c074ff7641d77a021a0f0e2bfeafc38cf Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 16:36:48 +0900 Subject: [PATCH 556/782] fix loading transaction i18n tag --- .../src/app/components/transaction/transaction.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 3e739a30f..8c88d6fc1 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -454,7 +454,7 @@
    -

    Loading transaction

    +

    Loading transaction

    From 132923e7db1245aaa0fa4ce6abf61c95a9231582 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 12 Jul 2023 17:43:48 +0900 Subject: [PATCH 557/782] Show skeleton loader instead of "Loading transaction..." --- .../transaction/transaction.component.html | 17 +++++------------ .../transaction/transaction.component.ts | 1 - 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 8c88d6fc1..203a5df5c 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -306,7 +306,7 @@
    - +
    @@ -451,21 +451,14 @@ - + -
    -

    Loading transaction

    +
    +

    Transaction not found.

    +
    Waiting for it to appear in the mempool...
    - -
    -

    Transaction not found.

    -
    Waiting for it to appear in the mempool...
    -
    -
    -
    -

    {{ error.error }}

    diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 08f331e60..797282c7b 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -226,7 +226,6 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.tx.feePerVsize = tx.fee / (tx.weight / 4); this.isLoadingTx = false; this.error = undefined; - this.loadingCachedTx = false; this.waitingForTransaction = false; this.graphExpanded = false; this.transactionTime = tx.firstSeen || 0; From e8c703fdbc733f5ccf2ae3fdea717cd2f0d275e9 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 8 Jul 2023 01:07:06 -0400 Subject: [PATCH 558/782] replace client recent blocks on reorg --- backend/src/api/blocks.ts | 3 ++ backend/src/api/websocket-handler.ts | 34 ++++++++++++ .../bisq-transaction.component.ts | 2 +- .../bisq-transfers.component.ts | 2 +- .../app/components/block/block.component.ts | 21 ++++---- .../blockchain-blocks.component.ts | 52 +++++++++---------- .../clock-face/clock-face.component.ts | 11 ++-- .../app/components/clock/clock.component.ts | 13 ++--- .../difficulty-mining.component.ts | 7 +-- .../difficulty/difficulty.component.ts | 7 +-- .../mempool-blocks.component.ts | 17 +++--- .../src/app/components/pool/pool.component.ts | 8 +-- .../reward-stats/reward-stats.component.ts | 7 +-- .../app/components/start/start.component.ts | 10 ++-- .../transaction/transaction.component.ts | 6 +-- .../transactions-list.component.ts | 2 +- .../src/app/dashboard/dashboard.component.ts | 4 +- frontend/src/app/services/cache.service.ts | 17 ++++-- frontend/src/app/services/state.service.ts | 17 ++++-- .../src/app/services/websocket.service.ts | 12 ++--- 20 files changed, 153 insertions(+), 99 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 4d218ed54..5939421a7 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -25,6 +25,7 @@ import DifficultyAdjustmentsRepository from '../repositories/DifficultyAdjustmen import PricesRepository from '../repositories/PricesRepository'; import priceUpdater from '../tasks/price-updater'; import chainTips from './chain-tips'; +import websocketHandler from './websocket-handler'; class Blocks { private blocks: BlockExtended[] = []; @@ -686,6 +687,8 @@ class Blocks { this.updateTimerProgress(timer, `reindexed difficulty adjustments`); logger.info(`Re-indexed 10 blocks and summaries. Also re-indexed the last difficulty adjustments. Will re-index latest hashrates in a few seconds.`, logger.tags.mining); indexer.reindex(); + + websocketHandler.handleReorg(); } } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index ae536b72e..f91947dcb 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -333,6 +333,40 @@ class WebsocketHandler { }); } + handleReorg(): void { + if (!this.wss) { + throw new Error('WebSocket.Server is not set'); + } + + const da = difficultyAdjustment.getDifficultyAdjustment(); + + // update init data + this.updateSocketDataFields({ + 'blocks': blocks.getBlocks(), + 'da': da?.previousTime ? da : undefined, + }); + + this.wss.clients.forEach((client) => { + if (client.readyState !== WebSocket.OPEN) { + return; + } + + const response = {}; + + if (client['want-blocks']) { + response['blocks'] = this.socketData['blocks']; + } + if (client['want-stats']) { + response['da'] = this.socketData['da']; + } + + if (Object.keys(response).length) { + const serializedResponse = this.serializeResponse(response); + client.send(serializedResponse); + } + }); + } + async $handleMempoolChange(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]): Promise { if (!this.wss) { diff --git a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.ts b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.ts index fb30fc59f..47ac0d6db 100644 --- a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.ts +++ b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.ts @@ -112,7 +112,7 @@ export class BisqTransactionComponent implements OnInit, OnDestroy { this.error = error; }); - this.latestBlock$ = this.stateService.blocks$.pipe(map((([block]) => block))); + this.latestBlock$ = this.stateService.blocks$.pipe(map((blocks) => blocks[0])); this.stateService.bsqPrice$ .subscribe((bsqPrice) => { diff --git a/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.ts b/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.ts index 4346f15d3..a46cbf07f 100644 --- a/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.ts +++ b/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.ts @@ -27,7 +27,7 @@ export class BisqTransfersComponent implements OnInit, OnChanges { } ngOnInit() { - this.latestBlock$ = this.stateService.blocks$.pipe(map(([block]) => block)); + this.latestBlock$ = this.stateService.blocks$.pipe(map((blocks) => blocks[0])); } ngOnChanges() { diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index ad008089d..720203220 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -129,18 +129,19 @@ export class BlockComponent implements OnInit, OnDestroy { ); this.blocksSubscription = this.stateService.blocks$ - .subscribe(([block]) => { - this.latestBlock = block; - this.latestBlocks.unshift(block); - this.latestBlocks = this.latestBlocks.slice(0, this.stateService.env.KEEP_BLOCKS_AMOUNT); + .subscribe((blocks) => { + this.latestBlock = blocks[0]; + this.latestBlocks = blocks; this.setNextAndPreviousBlockLink(); - if (block.id === this.blockHash) { - this.block = block; - block.extras.minFee = this.getMinBlockFee(block); - block.extras.maxFee = this.getMaxBlockFee(block); - if (block?.extras?.reward != undefined) { - this.fees = block.extras.reward / 100000000 - this.blockSubsidy; + for (const block of blocks) { + if (block.id === this.blockHash) { + this.block = block; + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); + if (block?.extras?.reward != undefined) { + this.fees = block.extras.reward / 100000000 - this.blockSubsidy; + } } } }); diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 5242c1fe5..23efb0c78 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -41,6 +41,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { networkSubscription: Subscription; tabHiddenSubscription: Subscription; markBlockSubscription: Subscription; + txConfirmedSubscription: Subscription; loadingBlocks$: Observable; blockStyles = []; emptyBlockStyles = []; @@ -104,31 +105,22 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.tabHiddenSubscription = this.stateService.isTabHidden$.subscribe((tabHidden) => this.tabHidden = tabHidden); if (!this.static) { this.blocksSubscription = this.stateService.blocks$ - .subscribe(([block, txConfirmed]) => { - if (this.blocks.some((b) => b.height === block.height)) { + .subscribe((blocks) => { + if (!blocks?.length) { return; } + const latestHeight = blocks[0].height; + const animate = latestHeight > blocks[0].height; - if (this.blocks.length && block.height !== this.blocks[0].height + 1) { - this.blocks = []; - this.blocksFilled = false; + for (const block of blocks) { + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); } - block.extras.minFee = this.getMinBlockFee(block); - block.extras.maxFee = this.getMaxBlockFee(block); - - this.blocks.unshift(block); - this.blocks = this.blocks.slice(0, this.dynamicBlocksAmount); - - if (txConfirmed && block.height > this.chainTip) { - this.markHeight = block.height; - this.moveArrowToPosition(true, true); - } else { - this.moveArrowToPosition(true, false); - } + this.blocks = blocks; this.blockStyles = []; - if (this.blocksFilled && block.height > this.chainTip) { + if (animate) { this.blocks.forEach((b, i) => this.blockStyles.push(this.getStyleForBlock(b, i, i ? -this.blockOffset : -this.dividerBlockOffset))); setTimeout(() => { this.blockStyles = []; @@ -139,13 +131,18 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.blocks.forEach((b, i) => this.blockStyles.push(this.getStyleForBlock(b, i))); } - if (this.blocks.length === this.dynamicBlocksAmount) { - this.blocksFilled = true; - } - - this.chainTip = Math.max(this.chainTip, block.height); + this.chainTip = latestHeight; this.cd.markForCheck(); }); + + this.txConfirmedSubscription = this.stateService.txConfirmed$.subscribe(([txid, block]) => { + if (txid) { + this.markHeight = block.height; + this.moveArrowToPosition(true, true); + } else { + this.moveArrowToPosition(true, false); + } + }) } else { this.blockPageSubscription = this.cacheService.loadedBlocks$.subscribe((block) => { if (block.height <= this.height && block.height > this.height - this.count) { @@ -164,9 +161,9 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.cd.markForCheck(); }); - if (this.static) { - this.updateStaticBlocks(); - } + if (this.static) { + this.updateStaticBlocks(); + } } ngOnChanges(changes: SimpleChanges): void { @@ -190,6 +187,9 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { if (this.blockPageSubscription) { this.blockPageSubscription.unsubscribe(); } + if (this.txConfirmedSubscription) { + this.txConfirmedSubscription.unsubscribe(); + } this.networkSubscription.unsubscribe(); this.tabHiddenSubscription.unsubscribe(); this.markBlockSubscription.unsubscribe(); diff --git a/frontend/src/app/components/clock-face/clock-face.component.ts b/frontend/src/app/components/clock-face/clock-face.component.ts index c2c946b74..63d87c436 100644 --- a/frontend/src/app/components/clock-face/clock-face.component.ts +++ b/frontend/src/app/components/clock-face/clock-face.component.ts @@ -39,13 +39,10 @@ export class ClockFaceComponent implements OnInit, OnChanges, OnDestroy { }) ).subscribe(); this.blocksSubscription = this.stateService.blocks$ - .subscribe(([block]) => { - if (block) { - this.blockTimes.push([block.height, new Date(block.timestamp * 1000)]); - // using block-reported times, so ensure they are sorted chronologically - this.blockTimes = this.blockTimes.sort((a, b) => a[1].getTime() - b[1].getTime()); - this.updateSegments(); - } + .subscribe((blocks) => { + this.blockTimes = blocks.map(block => [block.height, new Date(block.timestamp * 1000)]); + this.blockTimes = this.blockTimes.sort((a, b) => a[1].getTime() - b[1].getTime()); + this.updateSegments(); }); } diff --git a/frontend/src/app/components/clock/clock.component.ts b/frontend/src/app/components/clock/clock.component.ts index b1a9d2159..7ae38583a 100644 --- a/frontend/src/app/components/clock/clock.component.ts +++ b/frontend/src/app/components/clock/clock.component.ts @@ -60,14 +60,11 @@ export class ClockComponent implements OnInit { this.websocketService.want(['blocks', 'stats', 'mempool-blocks']); this.blocksSubscription = this.stateService.blocks$ - .subscribe(([block]) => { - if (block) { - this.blocks.unshift(block); - this.blocks = this.blocks.slice(0, 16); - if (this.blocks[this.blockIndex]) { - this.blockStyle = this.getStyleForBlock(this.blocks[this.blockIndex]); - this.cd.markForCheck(); - } + .subscribe((blocks) => { + this.blocks = blocks.slice(0, 16); + if (this.blocks[this.blockIndex]) { + this.blockStyle = this.getStyleForBlock(this.blocks[this.blockIndex]); + this.cd.markForCheck(); } }); diff --git a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts index fbf31f238..c23d7d4b9 100644 --- a/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts +++ b/frontend/src/app/components/difficulty-mining/difficulty-mining.component.ts @@ -38,11 +38,12 @@ export class DifficultyMiningComponent implements OnInit { ngOnInit(): void { this.isLoadingWebSocket$ = this.stateService.isLoadingWebSocket$; this.difficultyEpoch$ = combineLatest([ - this.stateService.blocks$.pipe(map(([block]) => block)), + this.stateService.blocks$, this.stateService.difficultyAdjustment$, ]) .pipe( - map(([block, da]) => { + map(([blocks, da]) => { + const maxHeight = blocks.reduce((max, block) => Math.max(max, block.height), 0); let colorAdjustments = '#ffffff66'; if (da.difficultyChange > 0) { colorAdjustments = '#3bcc49'; @@ -63,7 +64,7 @@ export class DifficultyMiningComponent implements OnInit { colorPreviousAdjustments = '#ffffff66'; } - const blocksUntilHalving = 210000 - (block.height % 210000); + const blocksUntilHalving = 210000 - (maxHeight % 210000); const timeUntilHalving = new Date().getTime() + (blocksUntilHalving * 600000); const data = { diff --git a/frontend/src/app/components/difficulty/difficulty.component.ts b/frontend/src/app/components/difficulty/difficulty.component.ts index b246a14fe..d3983c939 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.ts +++ b/frontend/src/app/components/difficulty/difficulty.component.ts @@ -67,11 +67,12 @@ export class DifficultyComponent implements OnInit { ngOnInit(): void { this.isLoadingWebSocket$ = this.stateService.isLoadingWebSocket$; this.difficultyEpoch$ = combineLatest([ - this.stateService.blocks$.pipe(map(([block]) => block)), + this.stateService.blocks$, this.stateService.difficultyAdjustment$, ]) .pipe( - map(([block, da]) => { + map(([blocks, da]) => { + const maxHeight = blocks.reduce((max, block) => Math.max(max, block.height), 0); let colorAdjustments = '#ffffff66'; if (da.difficultyChange > 0) { colorAdjustments = '#3bcc49'; @@ -92,7 +93,7 @@ export class DifficultyComponent implements OnInit { colorPreviousAdjustments = '#ffffff66'; } - const blocksUntilHalving = 210000 - (block.height % 210000); + const blocksUntilHalving = 210000 - (maxHeight % 210000); const timeUntilHalving = new Date().getTime() + (blocksUntilHalving * 600000); const newEpochStart = Math.floor(this.stateService.latestBlockHeight / EPOCH_BLOCK_LENGTH) * EPOCH_BLOCK_LENGTH; const newExpectedHeight = Math.floor(newEpochStart + da.expectedBlocks); diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index bc3633be0..3ec240b78 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -124,7 +124,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { ) .pipe( switchMap(() => combineLatest([ - this.stateService.blocks$.pipe(map(([block]) => block)), + this.stateService.blocks$.pipe(map((blocks) => blocks[0])), this.stateService.mempoolBlocks$ .pipe( map((mempoolBlocks) => { @@ -186,8 +186,11 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { this.cd.markForCheck(); }); - this.blockSubscription = this.stateService.blocks$ - .subscribe(([block]) => { + this.blockSubscription = this.stateService.blocks$.pipe(map((blocks) => blocks[0])) + .subscribe((block) => { + if (!block) { + return; + } if (this.chainTip === -1) { this.animateEntry = block.height === this.stateService.latestBlockHeight; } else { @@ -221,8 +224,8 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { this.router.navigate([this.relativeUrlPipe.transform('mempool-block/'), this.markIndex - 1]); } else { this.stateService.blocks$ - .pipe(take(this.stateService.env.MEMPOOL_BLOCKS_AMOUNT)) - .subscribe(([block]) => { + .pipe(map((blocks) => blocks[0])) + .subscribe((block) => { if (this.stateService.latestBlockHeight === block.height) { this.router.navigate([this.relativeUrlPipe.transform('/block/'), block.id], { state: { data: { block } }}); } @@ -297,7 +300,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { while (blocks.length > blocksAmount) { const block = blocks.pop(); if (!this.count) { - const lastBlock = blocks[blocks.length - 1]; + const lastBlock = blocks[0]; lastBlock.blockSize += block.blockSize; lastBlock.blockVSize += block.blockVSize; lastBlock.nTx += block.nTx; @@ -308,7 +311,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { } } if (blocks.length) { - blocks[blocks.length - 1].isStack = blocks[blocks.length - 1].blockVSize > this.stateService.blockVSize; + blocks[0].isStack = blocks[0].blockVSize > this.stateService.blockVSize; } return blocks; } diff --git a/frontend/src/app/components/pool/pool.component.ts b/frontend/src/app/components/pool/pool.component.ts index 85fd028ef..139da5ef0 100644 --- a/frontend/src/app/components/pool/pool.component.ts +++ b/frontend/src/app/components/pool/pool.component.ts @@ -37,7 +37,7 @@ export class PoolComponent implements OnInit { auditAvailable = false; - loadMoreSubject: BehaviorSubject = new BehaviorSubject(this.blocks[this.blocks.length - 1]?.height); + loadMoreSubject: BehaviorSubject = new BehaviorSubject(this.blocks[0]?.height); constructor( @Inject(LOCALE_ID) public locale: string, @@ -68,7 +68,7 @@ export class PoolComponent implements OnInit { return this.apiService.getPoolStats$(slug); }), tap(() => { - this.loadMoreSubject.next(this.blocks[this.blocks.length - 1]?.height); + this.loadMoreSubject.next(this.blocks[0]?.height); }), map((poolStats) => { this.seoService.setTitle(poolStats.pool.name); @@ -91,7 +91,7 @@ export class PoolComponent implements OnInit { if (this.slug === undefined) { return []; } - return this.apiService.getPoolBlocks$(this.slug, this.blocks[this.blocks.length - 1]?.height); + return this.apiService.getPoolBlocks$(this.slug, this.blocks[0]?.height); }), tap((newBlocks) => { this.blocks = this.blocks.concat(newBlocks); @@ -237,7 +237,7 @@ export class PoolComponent implements OnInit { } loadMore() { - this.loadMoreSubject.next(this.blocks[this.blocks.length - 1]?.height); + this.loadMoreSubject.next(this.blocks[0]?.height); } trackByBlock(index: number, block: BlockExtended) { diff --git a/frontend/src/app/components/reward-stats/reward-stats.component.ts b/frontend/src/app/components/reward-stats/reward-stats.component.ts index 30bf26488..5aac641b0 100644 --- a/frontend/src/app/components/reward-stats/reward-stats.component.ts +++ b/frontend/src/app/components/reward-stats/reward-stats.component.ts @@ -29,11 +29,12 @@ export class RewardStatsComponent implements OnInit { // Or when we receive a newer block, newer than the latest reward stats api call this.stateService.blocks$ .pipe( - switchMap((block) => { - if (block[0].height <= this.lastBlockHeight) { + switchMap((blocks) => { + const maxHeight = blocks.reduce((max, block) => Math.max(max, block.height), 0); + if (maxHeight <= this.lastBlockHeight) { return []; // Return an empty stream so the last pipe is not executed } - this.lastBlockHeight = block[0].height; + this.lastBlockHeight = maxHeight; return this.apiService.getRewardStats$(); }) ) diff --git a/frontend/src/app/components/start/start.component.ts b/frontend/src/app/components/start/start.component.ts index 22d3d6350..33770bb24 100644 --- a/frontend/src/app/components/start/start.component.ts +++ b/frontend/src/app/components/start/start.component.ts @@ -2,6 +2,7 @@ import { Component, ElementRef, HostListener, OnInit, OnDestroy, ViewChild, Inpu import { Subscription } from 'rxjs'; import { MarkBlockState, StateService } from '../../services/state.service'; import { specialBlocks } from '../../app.constants'; +import { BlockExtended } from '../../interfaces/node-api.interface'; @Component({ selector: 'app-start', @@ -55,8 +56,8 @@ export class StartComponent implements OnInit, OnDestroy { ngOnInit() { this.firstPageWidth = 40 + (this.blockWidth * this.dynamicBlocksAmount); - this.blockCounterSubscription = this.stateService.blocks$.subscribe(() => { - this.blockCount++; + this.blockCounterSubscription = this.stateService.blocks$.subscribe((blocks) => { + this.blockCount = blocks.length; this.dynamicBlocksAmount = Math.min(this.blockCount, this.stateService.env.KEEP_BLOCKS_AMOUNT, 8); this.firstPageWidth = 40 + (this.blockWidth * this.dynamicBlocksAmount); if (this.blockCount <= Math.min(8, this.stateService.env.KEEP_BLOCKS_AMOUNT)) { @@ -110,9 +111,12 @@ export class StartComponent implements OnInit, OnDestroy { } }); this.stateService.blocks$ - .subscribe((blocks: any) => { + .subscribe((blocks: BlockExtended[]) => { this.countdown = 0; const block = blocks[0]; + if (!block) { + return; + } for (const sb in specialBlocks) { if (specialBlocks[sb].networks.includes(this.stateService.network || 'mainnet')) { diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index bbf679dcf..684f343eb 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -49,7 +49,6 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { txReplacedSubscription: Subscription; txRbfInfoSubscription: Subscription; mempoolPositionSubscription: Subscription; - blocksSubscription: Subscription; queryParamsSubscription: Subscription; urlFragmentSubscription: Subscription; mempoolBlocksSubscription: Subscription; @@ -391,9 +390,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } ); - this.blocksSubscription = this.stateService.blocks$.subscribe(([block, txConfirmed]) => { - this.latestBlock = block; - + this.stateService.txConfirmed$.subscribe(([txConfirmed, block]) => { if (txConfirmed && this.tx && !this.tx.status.confirmed && txConfirmed === this.tx.txid) { this.tx.status = { confirmed: true, @@ -593,7 +590,6 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.fetchCachedTxSubscription.unsubscribe(); this.txReplacedSubscription.unsubscribe(); this.txRbfInfoSubscription.unsubscribe(); - this.blocksSubscription.unsubscribe(); this.queryParamsSubscription.unsubscribe(); this.flowPrefSubscription.unsubscribe(); this.urlFragmentSubscription.unsubscribe(); diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.ts b/frontend/src/app/components/transactions-list/transactions-list.component.ts index 53ddb449c..c49ff0e3c 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.ts +++ b/frontend/src/app/components/transactions-list/transactions-list.component.ts @@ -56,7 +56,7 @@ export class TransactionsListComponent implements OnInit, OnChanges { ) { } ngOnInit(): void { - this.latestBlock$ = this.stateService.blocks$.pipe(map(([block]) => block)); + this.latestBlock$ = this.stateService.blocks$.pipe(map((blocks) => blocks[0])); this.stateService.networkChanged$.subscribe((network) => this.network = network); if (this.network === 'liquid' || this.network === 'liquidtestnet') { diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 7e4645fe0..74a48c74c 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -132,8 +132,8 @@ export class DashboardComponent implements OnInit, OnDestroy { this.blocks$ = this.stateService.blocks$ .pipe( - tap(([block]) => { - this.latestBlockHeight = block.height; + tap((blocks) => { + this.latestBlockHeight = blocks[0].height; }), scan((acc, [block]) => { if (acc.find((b) => b.height == block.height)) { diff --git a/frontend/src/app/services/cache.service.ts b/frontend/src/app/services/cache.service.ts index 5eefd6e0a..8c90dc210 100644 --- a/frontend/src/app/services/cache.service.ts +++ b/frontend/src/app/services/cache.service.ts @@ -18,6 +18,7 @@ export class CacheService { txCache: { [txid: string]: Transaction } = {}; network: string; + blockHashCache: { [hash: string]: BlockExtended } = {}; blockCache: { [height: number]: BlockExtended } = {}; blockLoading: { [height: number]: boolean } = {}; copiesInBlockQueue: { [height: number]: number } = {}; @@ -27,8 +28,10 @@ export class CacheService { private stateService: StateService, private apiService: ApiService, ) { - this.stateService.blocks$.subscribe(([block]) => { - this.addBlockToCache(block); + this.stateService.blocks$.subscribe((blocks) => { + for (const block of blocks) { + this.addBlockToCache(block); + } this.clearBlocks(); }); this.stateService.chainTip$.subscribe((height) => { @@ -56,8 +59,11 @@ export class CacheService { } addBlockToCache(block: BlockExtended) { - this.blockCache[block.height] = block; - this.bumpBlockPriority(block.height); + if (!this.blockHashCache[block.id]) { + this.blockHashCache[block.id] = block; + this.blockCache[block.height] = block; + this.bumpBlockPriority(block.height); + } } async loadBlock(height) { @@ -105,7 +111,9 @@ export class CacheService { } else if ((this.tip - height) < KEEP_RECENT_BLOCKS) { this.bumpBlockPriority(height); } else { + const block = this.blockCache[height]; delete this.blockCache[height]; + delete this.blockHashCache[block.id]; delete this.copiesInBlockQueue[height]; } } @@ -113,6 +121,7 @@ export class CacheService { // remove all blocks from the cache resetBlockCache() { + this.blockHashCache = {}; this.blockCache = {}; this.blockLoading = {}; this.copiesInBlockQueue = {}; diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index c1b4421df..4b1323939 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -90,10 +90,11 @@ export class StateService { blockVSize: number; env: Env; latestBlockHeight = -1; + blocks: BlockExtended[] = []; networkChanged$ = new ReplaySubject(1); lightningChanged$ = new ReplaySubject(1); - blocks$: ReplaySubject<[BlockExtended, string]>; + blocks$ = new BehaviorSubject([]); transactions$ = new ReplaySubject(6); conversions$ = new ReplaySubject(1); bsqPrice$ = new ReplaySubject(1); @@ -102,6 +103,7 @@ export class StateService { mempoolBlockTransactions$ = new Subject(); mempoolBlockDelta$ = new Subject(); liveMempoolBlockTransactions$: Observable<{ [txid: string]: TransactionStripped}>; + txConfirmed$ = new Subject<[string, BlockExtended]>(); txReplaced$ = new Subject(); txRbfInfo$ = new Subject(); rbfLatest$ = new Subject(); @@ -167,8 +169,6 @@ export class StateService { } }); - this.blocks$ = new ReplaySubject<[BlockExtended, string]>(this.env.KEEP_BLOCKS_AMOUNT); - this.liveMempoolBlockTransactions$ = merge( this.mempoolBlockTransactions$.pipe(map(transactions => { return { transactions }; })), this.mempoolBlockDelta$.pipe(map(delta => { return { delta }; })), @@ -341,4 +341,15 @@ export class StateService { this.chainTip$.next(height); } } + + resetBlocks(blocks: BlockExtended[]): void { + this.blocks = blocks.reverse(); + this.blocks$.next(blocks); + } + + addBlock(block: BlockExtended): void { + this.blocks.unshift(block); + this.blocks = this.blocks.slice(0, this.env.KEEP_BLOCKS_AMOUNT); + this.blocks$.next(this.blocks); + } } diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index d22717b2a..472501384 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -239,13 +239,8 @@ export class WebsocketService { if (response.blocks && response.blocks.length) { const blocks = response.blocks; - let maxHeight = 0; - blocks.forEach((block: BlockExtended) => { - if (block.height > this.stateService.latestBlockHeight) { - maxHeight = Math.max(maxHeight, block.height); - this.stateService.blocks$.next([block, '']); - } - }); + this.stateService.resetBlocks(blocks); + const maxHeight = blocks.reduce((max, block) => Math.max(max, block.height), this.stateService.latestBlockHeight); this.stateService.updateChainTip(maxHeight); } @@ -260,7 +255,8 @@ export class WebsocketService { if (response.block) { if (response.block.height === this.stateService.latestBlockHeight + 1) { this.stateService.updateChainTip(response.block.height); - this.stateService.blocks$.next([response.block, response.txConfirmed || '']); + this.stateService.addBlock(response.block); + this.stateService.txConfirmed$.next([response.txConfirmed, response.block]); } else if (response.block.height > this.stateService.latestBlockHeight + 1) { reinitBlocks = true; } From 842ac8ce39dbaed04eb2c6da3c2a1cbe0f313063 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 10 Jul 2023 13:57:18 +0900 Subject: [PATCH 559/782] Add stale block banner immediately on reorg --- .../src/app/components/block/block.component.ts | 3 +++ .../blockchain-blocks.component.ts | 14 +++++++++++--- .../transaction/transaction.component.ts | 8 +++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 720203220..faadd7b5c 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -142,6 +142,9 @@ export class BlockComponent implements OnInit, OnDestroy { if (block?.extras?.reward != undefined) { this.fees = block.extras.reward / 100000000 - this.blockSubsidy; } + } else if (block.height === this.block.height) { + this.block.stale = true; + this.block.canonical = block.id; } } }); diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 23efb0c78..f9f25315f 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -36,6 +36,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { emptyBlocks: BlockExtended[] = this.mountEmptyBlocks(); markHeight: number; chainTip: number; + pendingMarkBlock: { animate: boolean, newBlockFromLeft: boolean }; blocksSubscription: Subscription; blockPageSubscription: Subscription; networkSubscription: Subscription; @@ -83,7 +84,6 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { } ngOnInit() { - this.chainTip = this.stateService.latestBlockHeight; this.dynamicBlocksAmount = Math.min(8, this.stateService.env.KEEP_BLOCKS_AMOUNT); if (['', 'testnet', 'signet'].includes(this.stateService.network)) { @@ -110,7 +110,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { return; } const latestHeight = blocks[0].height; - const animate = latestHeight > blocks[0].height; + const animate = this.chainTip != null && latestHeight > this.chainTip; for (const block of blocks) { block.extras.minFee = this.getMinBlockFee(block); @@ -132,6 +132,11 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { } this.chainTip = latestHeight; + + if (this.pendingMarkBlock) { + this.moveArrowToPosition(this.pendingMarkBlock.animate, this.pendingMarkBlock.newBlockFromLeft); + this.pendingMarkBlock = null; + } this.cd.markForCheck(); }); @@ -202,7 +207,10 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { this.arrowVisible = false; return; } - const blockindex = this.blocks.findIndex((b) => b.height === this.markHeight); + if (this.chainTip == null) { + this.pendingMarkBlock = { animate, newBlockFromLeft }; + } + const blockindex = this.blocks.findIndex((b) => { console.log(b); return b.height === this.markHeight }); if (blockindex > -1) { if (!animate) { this.arrowTransition = 'inherit'; diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index 684f343eb..0ae1ea3c3 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -12,7 +12,7 @@ import { tap } from 'rxjs/operators'; import { Transaction } from '../../interfaces/electrs.interface'; -import { of, merge, Subscription, Observable, Subject, timer, from, throwError } from 'rxjs'; +import { of, merge, Subscription, Observable, Subject, from, throwError } from 'rxjs'; import { StateService } from '../../services/state.service'; import { CacheService } from '../../services/cache.service'; import { WebsocketService } from '../../services/websocket.service'; @@ -52,6 +52,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { queryParamsSubscription: Subscription; urlFragmentSubscription: Subscription; mempoolBlocksSubscription: Subscription; + blocksSubscription: Subscription; fragmentParams: URLSearchParams; rbfTransaction: undefined | Transaction; replaced: boolean = false; @@ -130,6 +131,10 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.outputIndex = (!isNaN(vout) && vout >= 0) ? vout : null; }); + this.blocksSubscription = this.stateService.blocks$.subscribe((blocks) => { + this.latestBlock = blocks[0]; + }); + this.fetchCpfpSubscription = this.fetchCpfp$ .pipe( switchMap((txId) => @@ -596,6 +601,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { this.mempoolBlocksSubscription.unsubscribe(); this.mempoolPositionSubscription.unsubscribe(); this.mempoolBlocksSubscription.unsubscribe(); + this.blocksSubscription.unsubscribe(); this.leaveTransaction(); } } From 7230b65dc31751f4573f0e1175dc38ca0a92bc22 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 11 Jul 2023 16:35:00 +0900 Subject: [PATCH 560/782] remove console.log, fix null blocks --- .../src/app/components/block/block.component.ts | 2 +- .../blockchain-blocks.component.ts | 2 +- frontend/src/app/services/state.service.ts | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index faadd7b5c..5a24ebab8 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -142,7 +142,7 @@ export class BlockComponent implements OnInit, OnDestroy { if (block?.extras?.reward != undefined) { this.fees = block.extras.reward / 100000000 - this.blockSubsidy; } - } else if (block.height === this.block.height) { + } else if (block.height === this.block?.height) { this.block.stale = true; this.block.canonical = block.id; } diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index f9f25315f..245973885 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -210,7 +210,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { if (this.chainTip == null) { this.pendingMarkBlock = { animate, newBlockFromLeft }; } - const blockindex = this.blocks.findIndex((b) => { console.log(b); return b.height === this.markHeight }); + const blockindex = this.blocks.findIndex((b) => b.height === this.markHeight); if (blockindex > -1) { if (!animate) { this.arrowTransition = 'inherit'; diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 4b1323939..a3392d738 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -5,7 +5,7 @@ import { IBackendInfo, MempoolBlock, MempoolBlockDelta, MempoolInfo, Recommended import { BlockExtended, DifficultyAdjustment, MempoolPosition, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface'; import { Router, NavigationStart } from '@angular/router'; import { isPlatformBrowser } from '@angular/common'; -import { map, scan, shareReplay } from 'rxjs/operators'; +import { filter, map, scan, shareReplay } from 'rxjs/operators'; import { StorageService } from './storage.service'; export interface MarkBlockState { @@ -94,7 +94,8 @@ export class StateService { networkChanged$ = new ReplaySubject(1); lightningChanged$ = new ReplaySubject(1); - blocks$ = new BehaviorSubject([]); + blocksSubject$ = new BehaviorSubject([]); + blocks$: Observable; transactions$ = new ReplaySubject(6); conversions$ = new ReplaySubject(1); bsqPrice$ = new ReplaySubject(1); @@ -200,11 +201,13 @@ export class StateService { this.networkChanged$.subscribe((network) => { this.transactions$ = new ReplaySubject(6); - this.blocks$ = new ReplaySubject<[BlockExtended, string]>(this.env.KEEP_BLOCKS_AMOUNT); + this.blocksSubject$ = new BehaviorSubject([]); }); this.blockVSize = this.env.BLOCK_WEIGHT_UNITS / 4; + this.blocks$ = this.blocksSubject$.pipe(filter(blocks => blocks != null && blocks.length > 0)); + const savedTimePreference = this.storageService.getValue('time-preference-ltr'); const rtlLanguage = (this.locale.startsWith('ar') || this.locale.startsWith('fa') || this.locale.startsWith('he')); // default time direction is right-to-left, unless locale is a RTL language @@ -344,12 +347,12 @@ export class StateService { resetBlocks(blocks: BlockExtended[]): void { this.blocks = blocks.reverse(); - this.blocks$.next(blocks); + this.blocksSubject$.next(blocks); } addBlock(block: BlockExtended): void { this.blocks.unshift(block); this.blocks = this.blocks.slice(0, this.env.KEEP_BLOCKS_AMOUNT); - this.blocks$.next(this.blocks); + this.blocksSubject$.next(this.blocks); } } From 886a099a2fd026d9c2051ba51ba6b2f2f168c8cb Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 12 Jul 2023 16:25:00 +0900 Subject: [PATCH 561/782] Detect stale blocks from client blockchain cache --- .../app/components/block/block.component.ts | 22 +++++++++++++++++++ .../src/app/services/websocket.service.ts | 5 +++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 5a24ebab8..84028820c 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -14,6 +14,7 @@ import { ApiService } from '../../services/api.service'; import { BlockOverviewGraphComponent } from '../../components/block-overview-graph/block-overview-graph.component'; import { detectWebGL } from '../../shared/graphs.utils'; import { PriceService, Price } from '../../services/price.service'; +import { CacheService } from '../../services/cache.service'; @Component({ selector: 'app-block', @@ -72,6 +73,7 @@ export class BlockComponent implements OnInit, OnDestroy { auditSubscription: Subscription; keyNavigationSubscription: Subscription; blocksSubscription: Subscription; + cacheBlocksSubscription: Subscription; networkChangedSubscription: Subscription; queryParamsSubscription: Subscription; nextBlockSubscription: Subscription = undefined; @@ -99,6 +101,7 @@ export class BlockComponent implements OnInit, OnDestroy { private relativeUrlPipe: RelativeUrlPipe, private apiService: ApiService, private priceService: PriceService, + private cacheService: CacheService, ) { this.webGlEnabled = detectWebGL(); } @@ -128,6 +131,10 @@ export class BlockComponent implements OnInit, OnDestroy { map((indicators) => indicators['blocktxs-' + this.blockHash] !== undefined ? indicators['blocktxs-' + this.blockHash] : 0) ); + this.cacheBlocksSubscription = this.cacheService.loadedBlocks$.subscribe((block) => { + this.loadedCacheBlock(block); + }); + this.blocksSubscription = this.stateService.blocks$ .subscribe((blocks) => { this.latestBlock = blocks[0]; @@ -258,6 +265,13 @@ export class BlockComponent implements OnInit, OnDestroy { this.transactionsError = null; this.isLoadingOverview = true; this.overviewError = null; + + const cachedBlock = this.cacheService.getCachedBlock(block.height); + if (!cachedBlock) { + this.cacheService.loadBlock(block.height); + } else { + this.loadedCacheBlock(cachedBlock); + } }), throttleTime(300, asyncScheduler, { leading: true, trailing: true }), shareReplay(1) @@ -463,6 +477,7 @@ export class BlockComponent implements OnInit, OnDestroy { this.auditSubscription?.unsubscribe(); this.keyNavigationSubscription?.unsubscribe(); this.blocksSubscription?.unsubscribe(); + this.cacheBlocksSubscription?.unsubscribe(); this.networkChangedSubscription?.unsubscribe(); this.queryParamsSubscription?.unsubscribe(); this.timeLtrSubscription?.unsubscribe(); @@ -683,4 +698,11 @@ export class BlockComponent implements OnInit, OnDestroy { } return 0; } + + loadedCacheBlock(block: BlockExtended): void { + if (block.height === this.block.height && block.id !== this.block.id) { + this.block.stale = true; + this.block.canonical = block.id; + } + } } \ No newline at end of file diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index 472501384..7eed09e77 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -1,13 +1,13 @@ import { Injectable } from '@angular/core'; import { webSocket, WebSocketSubject } from 'rxjs/webSocket'; -import { WebsocketResponse, IBackendInfo } from '../interfaces/websocket.interface'; +import { WebsocketResponse } from '../interfaces/websocket.interface'; import { StateService } from './state.service'; import { Transaction } from '../interfaces/electrs.interface'; import { Subscription } from 'rxjs'; import { ApiService } from './api.service'; import { take } from 'rxjs/operators'; import { TransferState, makeStateKey } from '@angular/platform-browser'; -import { BlockExtended } from '../interfaces/node-api.interface'; +import { CacheService } from './cache.service'; const OFFLINE_RETRY_AFTER_MS = 2000; const OFFLINE_PING_CHECK_AFTER_MS = 30000; @@ -40,6 +40,7 @@ export class WebsocketService { private stateService: StateService, private apiService: ApiService, private transferState: TransferState, + private cacheService: CacheService, ) { if (!this.stateService.isBrowser) { // @ts-ignore From 1e69ea2f1d7cbc3c7ab3250fb4656006528b2f1b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 13 Jul 2023 11:03:44 +0900 Subject: [PATCH 562/782] Fix merge conflicts --- .../blocks-list/blocks-list.component.ts | 8 ++++---- frontend/src/app/dashboard/dashboard.component.ts | 15 ++++----------- frontend/src/app/services/state.service.ts | 2 +- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 324807628..2b54058e8 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -82,12 +82,12 @@ export class BlocksList implements OnInit { ), this.stateService.blocks$ .pipe( - switchMap((block) => { - if (block[0].height <= this.lastBlockHeight) { + switchMap((blocks) => { + if (blocks[0].height <= this.lastBlockHeight) { return [null]; // Return an empty stream so the last pipe is not executed } - this.lastBlockHeight = block[0].height; - return [block]; + this.lastBlockHeight = blocks[0].height; + return blocks; }) ) ]) diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 74a48c74c..6cf487be6 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -135,23 +135,16 @@ export class DashboardComponent implements OnInit, OnDestroy { tap((blocks) => { this.latestBlockHeight = blocks[0].height; }), - scan((acc, [block]) => { - if (acc.find((b) => b.height == block.height)) { - return acc; - } - acc.unshift(block); - acc = acc.slice(0, 6); - + switchMap((blocks) => { if (this.stateService.env.MINING_DASHBOARD === true) { - for (const block of acc) { + for (const block of blocks) { // @ts-ignore: Need to add an extra field for the template block.extras.pool.logo = `/resources/mining-pools/` + block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; } } - - return acc; - }, []), + return of(blocks.slice(0, 6)); + }) ); this.transactions$ = this.stateService.transactions$ diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index a3392d738..f38600605 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -201,7 +201,7 @@ export class StateService { this.networkChanged$.subscribe((network) => { this.transactions$ = new ReplaySubject(6); - this.blocksSubject$ = new BehaviorSubject([]); + this.blocksSubject$.next([]); }); this.blockVSize = this.env.BLOCK_WEIGHT_UNITS / 4; From eccbcbe53b557d0860104ac291f8d90c08ed78a5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 13 Jul 2023 11:58:29 +0900 Subject: [PATCH 563/782] Add missing this.block null check --- frontend/src/app/components/block/block.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 84028820c..0d733ff6b 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -700,7 +700,7 @@ export class BlockComponent implements OnInit, OnDestroy { } loadedCacheBlock(block: BlockExtended): void { - if (block.height === this.block.height && block.id !== this.block.id) { + if (this.block && block.height === this.block.height && block.id !== this.block.id) { this.block.stale = true; this.block.canonical = block.id; } From 3287c62f9133714d88fc8fcb6a4c67523a5ce996 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 13 Jul 2023 10:42:33 +0900 Subject: [PATCH 564/782] highlight & tag fullrbf replacements in RBF timeline --- backend/src/api/rbf-cache.ts | 2 +- .../rbf-timeline-tooltip.component.html | 1 + .../rbf-timeline-tooltip.component.ts | 4 +- .../rbf-timeline/rbf-timeline.component.html | 11 +++-- .../rbf-timeline/rbf-timeline.component.scss | 25 ++++++++-- .../rbf-timeline/rbf-timeline.component.ts | 48 ++++++++++++++----- .../src/app/interfaces/node-api.interface.ts | 4 +- 7 files changed, 69 insertions(+), 26 deletions(-) diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 79d5ff2d1..a3714406f 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -55,7 +55,7 @@ class RbfCache { if (tree) { tree.interval = newTime - tree?.time; replacedTrees.push(tree); - fullRbf = fullRbf || tree.fullRbf; + fullRbf = fullRbf || tree.fullRbf || !tree.tx.rbf; } } } else { diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html index 68f8a1caf..540da7480 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html @@ -32,6 +32,7 @@ Status + Full RBF RBF RBF Mined diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.ts b/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.ts index b9da63c86..fc3748f32 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.ts +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.ts @@ -1,5 +1,5 @@ import { Component, ElementRef, ViewChild, Input, OnChanges } from '@angular/core'; -import { RbfInfo } from '../../interfaces/node-api.interface'; +import { RbfTree } from '../../interfaces/node-api.interface'; @Component({ selector: 'app-rbf-timeline-tooltip', @@ -7,7 +7,7 @@ import { RbfInfo } from '../../interfaces/node-api.interface'; styleUrls: ['./rbf-timeline-tooltip.component.scss'], }) export class RbfTimelineTooltipComponent implements OnChanges { - @Input() rbfInfo: RbfInfo | void; + @Input() rbfInfo: RbfTree | null; @Input() cursorPosition: { x: number, y: number }; tooltipPosition = null; diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html index ce5a9678f..a2012d45f 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.html @@ -15,14 +15,15 @@
    - +
    -
    +
    +
    -
    -
    +
    +
    -
    +
    diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss index 3745360a5..be7aef2d6 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.scss @@ -83,15 +83,26 @@ transform: translateY(-50%); background: #105fb0; border-radius: 5px; + + &.left { + right: 50%; + } + &.right { + left: 50%; + } + + &.fullrbf { + background: #1bd8f4; + } } &.first-node { - .track { - left: 50%; + .track.left { + display: none; } } &:last-child { - .track { - right: 50%; + .track.right { + display: none; } } } @@ -177,11 +188,17 @@ height: 108px; bottom: 50%; border-right: solid 10px #105fb0; + &.fullrbf { + border-right: solid 10px #1bd8f4; + } } .corner { border-bottom: solid 10px #105fb0; border-bottom-right-radius: 10px; + &.fullrbf { + border-bottom: solid 10px #1bd8f4; + } } } } diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts index f02e8ca35..474da7326 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline.component.ts @@ -1,15 +1,20 @@ import { Component, Input, OnInit, OnChanges, Inject, LOCALE_ID, HostListener } from '@angular/core'; import { Router } from '@angular/router'; -import { RbfInfo, RbfTree } from '../../interfaces/node-api.interface'; +import { RbfTree, RbfTransaction } from '../../interfaces/node-api.interface'; import { StateService } from '../../services/state.service'; import { ApiService } from '../../services/api.service'; type Connector = 'pipe' | 'corner'; interface TimelineCell { - replacement?: RbfInfo, + replacement?: RbfTree, connector?: Connector, first?: boolean, + fullRbf?: boolean, +} + +function isTimelineCell(val: RbfTree | TimelineCell): boolean { + return !val || !('tx' in val); } @Component({ @@ -22,7 +27,7 @@ export class RbfTimelineComponent implements OnInit, OnChanges { @Input() txid: string; rows: TimelineCell[][] = []; - hoverInfo: RbfInfo | void = null; + hoverInfo: RbfTree | null = null; tooltipPosition = null; dir: 'rtl' | 'ltr' = 'ltr'; @@ -53,13 +58,27 @@ export class RbfTimelineComponent implements OnInit, OnChanges { buildTimelines(tree: RbfTree): TimelineCell[][] { if (!tree) return []; + this.flagFullRbf(tree); const split = this.splitTimelines(tree); const timelines = this.prepareTimelines(split); return this.connectTimelines(timelines); } + // sets the fullRbf flag on each transaction in the tree + flagFullRbf(tree: RbfTree): void { + let fullRbf = false; + for (const replaced of tree.replaces) { + if (!replaced.tx.rbf) { + fullRbf = true; + } + replaced.replacedBy = tree.tx; + this.flagFullRbf(replaced); + } + tree.tx.fullRbf = fullRbf; + } + // splits a tree into N leaf-to-root paths - splitTimelines(tree: RbfTree, tail: RbfInfo[] = []): RbfInfo[][] { + splitTimelines(tree: RbfTree, tail: RbfTree[] = []): RbfTree[][] { const replacements = [...tail, tree]; if (tree.replaces.length) { return [].concat(...tree.replaces.map(subtree => this.splitTimelines(subtree, replacements))); @@ -70,7 +89,7 @@ export class RbfTimelineComponent implements OnInit, OnChanges { // merges separate leaf-to-root paths into a coherent forking timeline // represented as a 2D array of Rbf events - prepareTimelines(lines: RbfInfo[][]): RbfInfo[][] { + prepareTimelines(lines: RbfTree[][]): (RbfTree | TimelineCell)[][] { lines.sort((a, b) => b.length - a.length); const rows = lines.map(() => []); @@ -85,7 +104,7 @@ export class RbfTimelineComponent implements OnInit, OnChanges { let emptyCount = 0; const nextGroups = []; for (const group of lineGroups) { - const toMerge: { [txid: string]: RbfInfo[][] } = {}; + const toMerge: { [txid: string]: RbfTree[][] } = {}; let emptyInGroup = 0; let first = true; for (const line of group) { @@ -97,7 +116,7 @@ export class RbfTimelineComponent implements OnInit, OnChanges { } else { // substitute duplicates with empty cells // (we'll fill these in with connecting lines later) - rows[index].unshift(null); + rows[index].unshift({ connector: true, replacement: head }); } // group the tails of the remaining lines for the next iteration if (line.length) { @@ -127,7 +146,7 @@ export class RbfTimelineComponent implements OnInit, OnChanges { } // annotates a 2D timeline array with info needed to draw connecting lines for multi-replacements - connectTimelines(timelines: RbfInfo[][]): TimelineCell[][] { + connectTimelines(timelines: (RbfTree | TimelineCell)[][]): TimelineCell[][] { const rows: TimelineCell[][] = []; timelines.forEach((lines, row) => { rows.push([]); @@ -135,11 +154,12 @@ export class RbfTimelineComponent implements OnInit, OnChanges { let finished = false; lines.forEach((replacement, column) => { const cell: TimelineCell = {}; - if (replacement) { - cell.replacement = replacement; + if (!isTimelineCell(replacement)) { + cell.replacement = replacement as RbfTree; + cell.fullRbf = (replacement as RbfTree).replacedBy?.fullRbf; } rows[row].push(cell); - if (replacement) { + if (!isTimelineCell(replacement)) { if (!started) { cell.first = true; started = true; @@ -153,11 +173,13 @@ export class RbfTimelineComponent implements OnInit, OnChanges { matched = true; } else if (i === row) { rows[i][column] = { - connector: 'corner' + connector: 'corner', + fullRbf: (replacement as TimelineCell).replacement.tx.fullRbf, }; } else if (nextCell.connector !== 'corner') { rows[i][column] = { - connector: 'pipe' + connector: 'pipe', + fullRbf: (replacement as TimelineCell).replacement.tx.fullRbf, }; } } diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 82e1ae50d..7a8ab3f06 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -39,6 +39,7 @@ export interface RbfTree extends RbfInfo { mined?: boolean; fullRbf: boolean; replaces: RbfTree[]; + replacedBy?: RbfTransaction; } export interface DifficultyAdjustment { @@ -176,9 +177,10 @@ export interface TransactionStripped { context?: 'projected' | 'actual'; } -interface RbfTransaction extends TransactionStripped { +export interface RbfTransaction extends TransactionStripped { rbf?: boolean; mined?: boolean, + fullRbf?: boolean, } export interface MempoolPosition { block: number, From 21a47a7b4bdcbb00f50064b0cfab052ca53d3c2c Mon Sep 17 00:00:00 2001 From: junderw Date: Wed, 19 Apr 2023 18:10:10 -0700 Subject: [PATCH 565/782] Push TX: Include validation to prevent DoS --- backend/src/api/bitcoin/bitcoin.routes.ts | 13 +--- backend/src/api/common.ts | 85 +++++++++++++++++++++++ backend/src/config.ts | 4 ++ 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index 8f31e152d..17ebc9275 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -723,12 +723,7 @@ class BitcoinRoutes { private async $postTransaction(req: Request, res: Response) { res.setHeader('content-type', 'text/plain'); try { - let rawTx; - if (typeof req.body === 'object') { - rawTx = Object.keys(req.body)[0]; - } else { - rawTx = req.body; - } + const rawTx = Common.getTransactionFromRequest(req, false); const txIdResult = await bitcoinApi.$sendRawTransaction(rawTx); res.send(txIdResult); } catch (e: any) { @@ -739,12 +734,8 @@ class BitcoinRoutes { private async $postTransactionForm(req: Request, res: Response) { res.setHeader('content-type', 'text/plain'); - const matches = /tx=([a-z0-9]+)/.exec(req.body); - let txHex = ''; - if (matches && matches[1]) { - txHex = matches[1]; - } try { + const txHex = Common.getTransactionFromRequest(req, true); const txIdResult = await bitcoinClient.sendRawTransaction(txHex); res.send(txIdResult); } catch (e: any) { diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index 735e240c1..b854c1701 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -1,3 +1,5 @@ +import * as bitcoinjs from 'bitcoinjs-lib'; +import { Request } from 'express'; import { Ancestor, CpfpInfo, CpfpSummary, CpfpCluster, EffectiveFeeStats, MempoolBlockWithTransactions, TransactionExtended, MempoolTransactionExtended, TransactionStripped, WorkingEffectiveFeeStats } from '../mempool.interfaces'; import config from '../config'; import { NodeSocket } from '../repositories/NodesSocketsRepository'; @@ -511,6 +513,89 @@ export class Common { static getNthPercentile(n: number, sortedDistribution: any[]): any { return sortedDistribution[Math.floor((sortedDistribution.length - 1) * (n / 100))]; } + + static getTransactionFromRequest(req: Request, form: boolean): string { + let rawTx: any = typeof req.body === 'object' && form + ? Object.values(req.body)[0] as any + : req.body; + if (typeof rawTx !== 'string') { + throw Object.assign(new Error('Non-string request body'), { code: -1 }); + } + + // Support both upper and lower case hex + // Support both txHash= Form and direct API POST + const reg = form ? /^txHash=((?:[a-fA-F0-9]{2})+)$/ : /^((?:[a-fA-F0-9]{2})+)$/; + const matches = reg.exec(rawTx); + if (!matches || !matches[1]) { + throw Object.assign(new Error('Non-hex request body'), { code: -2 }); + } + + // Guaranteed to be a hex string of multiple of 2 + // Guaranteed to be lower case + // Guaranteed to pass validation (see function below) + return this.validateTransactionHex(matches[1].toLowerCase()); + } + + private static validateTransactionHex(txhex: string): string { + // Do not mutate txhex + + // We assume txhex to be valid hex (output of getTransactionFromRequest above) + + // Check 1: Valid transaction parse + let tx: bitcoinjs.Transaction; + try { + tx = bitcoinjs.Transaction.fromHex(txhex); + } catch(e) { + throw Object.assign(new Error('Invalid transaction (could not parse)'), { code: -4 }); + } + + // Check 2: Simple size check + if (tx.weight() > config.MEMPOOL.MAX_PUSH_TX_SIZE_WEIGHT) { + throw Object.assign(new Error(`Transaction too large (max ${config.MEMPOOL.MAX_PUSH_TX_SIZE_WEIGHT} weight units)`), { code: -3 }); + } + + // Check 3: Check unreachable script in taproot (if not allowed) + if (!config.MEMPOOL.ALLOW_UNREACHABLE) { + tx.ins.forEach(input => { + const witness = input.witness; + // See BIP 341: Script validation rules + const hasAnnex = witness.length >= 2 && + witness[witness.length - 1].length > 1 && + witness[witness.length - 1][0] === 0x50; + const scriptSpendMinLength = hasAnnex ? 3 : 2; + const maybeScriptSpend = witness.length >= scriptSpendMinLength; + + if (maybeScriptSpend) { + const controlBlock = witness[witness.length - scriptSpendMinLength + 1]; + if (controlBlock.length === 0 || (controlBlock[0] & 0xfe) < 0xc0) { + // Skip this input, it's not taproot + return; + } + // Definitely taproot. Get script + const script = witness[witness.length - scriptSpendMinLength]; + const decompiled = bitcoinjs.script.decompile(script); + if (!decompiled || decompiled.length < 2) { + // Skip this input + return; + } + // Iterate up to second last (will look ahead 1 item) + for (let i = 0; i < decompiled.length - 1; i++) { + const first = decompiled[i]; + const second = decompiled[i + 1]; + if ( + first === bitcoinjs.opcodes.OP_FALSE && + second === bitcoinjs.opcodes.OP_IF + ) { + throw Object.assign(new Error('Unreachable taproot scripts not allowed'), { code: -5 }); + } + } + } + }) + } + + // Pass through the input string untouched + return txhex; + } } /** diff --git a/backend/src/config.ts b/backend/src/config.ts index fd7d7bc28..40b407a57 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -35,6 +35,8 @@ interface IConfig { CPFP_INDEXING: boolean; MAX_BLOCKS_BULK_QUERY: number; DISK_CACHE_BLOCK_INTERVAL: number; + MAX_PUSH_TX_SIZE_WEIGHT: number; + ALLOW_UNREACHABLE: boolean; }; ESPLORA: { REST_API_URL: string; @@ -165,6 +167,8 @@ const defaults: IConfig = { 'CPFP_INDEXING': false, 'MAX_BLOCKS_BULK_QUERY': 0, 'DISK_CACHE_BLOCK_INTERVAL': 6, + 'MAX_PUSH_TX_SIZE_WEIGHT': 400000, + 'ALLOW_UNREACHABLE': true, }, 'ESPLORA': { 'REST_API_URL': 'http://127.0.0.1:3000', From 95a8752a0af320eda3ddd781d4d646dd6fccdebb Mon Sep 17 00:00:00 2001 From: junderw Date: Wed, 19 Apr 2023 18:19:27 -0700 Subject: [PATCH 566/782] Fix: Tests for config --- backend/src/__fixtures__/mempool-config.template.json | 6 ++++-- backend/src/__tests__/config.test.ts | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 62b2e5f45..600c5e430 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -30,7 +30,9 @@ "RUST_GBT": false, "CPFP_INDEXING": true, "MAX_BLOCKS_BULK_QUERY": 999, - "DISK_CACHE_BLOCK_INTERVAL": 999 + "DISK_CACHE_BLOCK_INTERVAL": 999, + "MAX_PUSH_TX_SIZE_WEIGHT": "__MEMPOOL_MAX_PUSH_TX_SIZE_WEIGHT__", + "ALLOW_UNREACHABLE": "__MEMPOOL_ALLOW_UNREACHABLE__" }, "CORE_RPC": { "HOST": "__CORE_RPC_HOST__", @@ -120,4 +122,4 @@ "CLIGHTNING": { "SOCKET": "__CLIGHTNING_SOCKET__" } -} \ No newline at end of file +} diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 937011ba2..fdd8a02de 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -44,6 +44,8 @@ describe('Mempool Backend Config', () => { CPFP_INDEXING: false, MAX_BLOCKS_BULK_QUERY: 0, DISK_CACHE_BLOCK_INTERVAL: 6, + MAX_PUSH_TX_SIZE_WEIGHT: 400000, + ALLOW_UNREACHABLE: true, }); expect(config.ELECTRUM).toStrictEqual({ HOST: '127.0.0.1', PORT: 3306, TLS_ENABLED: true }); From 43d41fca95423ba39f48a29991bc08e5e0d7f835 Mon Sep 17 00:00:00 2001 From: junderw Date: Thu, 13 Jul 2023 13:31:57 +0900 Subject: [PATCH 567/782] Fix: Allow detection of 1 byte annexes --- backend/src/api/common.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index b854c1701..49d2c0458 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -560,7 +560,6 @@ export class Common { const witness = input.witness; // See BIP 341: Script validation rules const hasAnnex = witness.length >= 2 && - witness[witness.length - 1].length > 1 && witness[witness.length - 1][0] === 0x50; const scriptSpendMinLength = hasAnnex ? 3 : 2; const maybeScriptSpend = witness.length >= scriptSpendMinLength; From df70ea05c6543d1ea76b4f30b8e3128a2b47fff8 Mon Sep 17 00:00:00 2001 From: junderw Date: Thu, 13 Jul 2023 13:50:54 +0900 Subject: [PATCH 568/782] Fix: Leaf version validation --- backend/src/api/common.ts | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index 49d2c0458..cd9da3d2a 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -566,7 +566,7 @@ export class Common { if (maybeScriptSpend) { const controlBlock = witness[witness.length - scriptSpendMinLength + 1]; - if (controlBlock.length === 0 || (controlBlock[0] & 0xfe) < 0xc0) { + if (controlBlock.length === 0 || !this.isValidLeafVersion(controlBlock[0])) { // Skip this input, it's not taproot return; } @@ -595,6 +595,33 @@ export class Common { // Pass through the input string untouched return txhex; } + + private static isValidLeafVersion(leafVersion: number): boolean { + // See Note 7 in BIP341 + // https://github.com/bitcoin/bips/blob/66a1a8151021913047934ebab3f8883f2f8ca75b/bip-0341.mediawiki#cite_note-7 + // "What constraints are there on the leaf version?" + + // Must be an integer between 0 and 255 + // Since we're parsing a byte + if (Math.floor(leafVersion) !== leafVersion || leafVersion < 0 || leafVersion > 255) { + return false; + } + // "the leaf version cannot be odd" + if ((leafVersion & 0x01) === 1) { + return false; + } + // "The values that comply to this rule are + // the 32 even values between 0xc0 and 0xfe + if (leafVersion >= 0xc0 && leafVersion <= 0xfe) { + return true; + } + // and also 0x66, 0x7e, 0x80, 0x84, 0x96, 0x98, 0xba, 0xbc, 0xbe." + if ([0x66, 0x7e, 0x80, 0x84, 0x96, 0x98, 0xba, 0xbc, 0xbe].includes(leafVersion)) { + return true; + } + // Otherwise, invalid + return false; + } } /** From 222b34993b584a9727a61ffdafd7e6bb32e7c2a5 Mon Sep 17 00:00:00 2001 From: junderw Date: Thu, 13 Jul 2023 14:06:46 +0900 Subject: [PATCH 569/782] Fix: Add new configs to all config instances properly. --- backend/mempool-config.sample.json | 4 +++- backend/src/__fixtures__/mempool-config.template.json | 4 ++-- docker/backend/mempool-config.json | 4 +++- docker/backend/start.sh | 5 +++++ production/mempool-config.mainnet.json | 4 +++- production/mempool-config.signet.json | 4 +++- production/mempool-config.testnet.json | 4 +++- 7 files changed, 22 insertions(+), 7 deletions(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index 3371a8587..c0a2d9d62 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -29,7 +29,9 @@ "ADVANCED_GBT_MEMPOOL": false, "RUST_GBT": false, "CPFP_INDEXING": false, - "DISK_CACHE_BLOCK_INTERVAL": 6 + "DISK_CACHE_BLOCK_INTERVAL": 6, + "MAX_PUSH_TX_SIZE_WEIGHT": 4000000, + "ALLOW_UNREACHABLE": true }, "CORE_RPC": { "HOST": "127.0.0.1", diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 600c5e430..776f01de1 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -31,8 +31,8 @@ "CPFP_INDEXING": true, "MAX_BLOCKS_BULK_QUERY": 999, "DISK_CACHE_BLOCK_INTERVAL": 999, - "MAX_PUSH_TX_SIZE_WEIGHT": "__MEMPOOL_MAX_PUSH_TX_SIZE_WEIGHT__", - "ALLOW_UNREACHABLE": "__MEMPOOL_ALLOW_UNREACHABLE__" + "MAX_PUSH_TX_SIZE_WEIGHT": 4000000, + "ALLOW_UNREACHABLE": true }, "CORE_RPC": { "HOST": "__CORE_RPC_HOST__", diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 45f95a53e..d070d8010 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -29,6 +29,8 @@ "CPFP_INDEXING": __MEMPOOL_CPFP_INDEXING__, "MAX_BLOCKS_BULK_QUERY": __MEMPOOL_MAX_BLOCKS_BULK_QUERY__, "DISK_CACHE_BLOCK_INTERVAL": __MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__, + "MAX_PUSH_TX_SIZE_WEIGHT": __MEMPOOL_MAX_PUSH_TX_SIZE_WEIGHT__, + "ALLOW_UNREACHABLE": __MEMPOOL_ALLOW_UNREACHABLE__, "POOLS_JSON_TREE_URL": "__MEMPOOL_POOLS_JSON_TREE_URL__", "POOLS_JSON_URL": "__MEMPOOL_POOLS_JSON_URL__" }, @@ -126,4 +128,4 @@ "GEOLITE2_ASN": "__MAXMIND_GEOLITE2_ASN__", "GEOIP2_ISP": "__MAXMIND_GEOIP2_ISP__" } -} \ No newline at end of file +} diff --git a/docker/backend/start.sh b/docker/backend/start.sh index b746512a9..7241444fb 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -32,6 +32,9 @@ __MEMPOOL_RUST_GBT__=${MEMPOOL_RUST_GBT:=false} __MEMPOOL_CPFP_INDEXING__=${MEMPOOL_CPFP_INDEXING:=false} __MEMPOOL_MAX_BLOCKS_BULK_QUERY__=${MEMPOOL_MAX_BLOCKS_BULK_QUERY:=0} __MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__=${MEMPOOL_DISK_CACHE_BLOCK_INTERVAL:=6} +__MEMPOOL_MAX_PUSH_TX_SIZE_WEIGHT__=${MEMPOOL_MAX_PUSH_TX_SIZE_WEIGHT:=4000000} +__MEMPOOL_ALLOW_UNREACHABLE__=${MEMPOOL_ALLOW_UNREACHABLE:=true} + # CORE_RPC __CORE_RPC_HOST__=${CORE_RPC_HOST:=127.0.0.1} @@ -161,6 +164,8 @@ sed -i "s!__MEMPOOL_ADVANCED_GBT_AUDIT__!${__MEMPOOL_ADVANCED_GBT_AUDIT__}!g" me sed -i "s!__MEMPOOL_CPFP_INDEXING__!${__MEMPOOL_CPFP_INDEXING__}!g" mempool-config.json sed -i "s!__MEMPOOL_MAX_BLOCKS_BULK_QUERY__!${__MEMPOOL_MAX_BLOCKS_BULK_QUERY__}!g" mempool-config.json sed -i "s!__MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__!${__MEMPOOL_DISK_CACHE_BLOCK_INTERVAL__}!g" mempool-config.json +sed -i "s!__MEMPOOL_MAX_PUSH_TX_SIZE_WEIGHT__!${__MEMPOOL_MAX_PUSH_TX_SIZE_WEIGHT__}!g" mempool-config.json +sed -i "s!__MEMPOOL_ALLOW_UNREACHABLE__!${__MEMPOOL_ALLOW_UNREACHABLE__}!g" mempool-config.json sed -i "s!__CORE_RPC_HOST__!${__CORE_RPC_HOST__}!g" mempool-config.json sed -i "s!__CORE_RPC_PORT__!${__CORE_RPC_PORT__}!g" mempool-config.json diff --git a/production/mempool-config.mainnet.json b/production/mempool-config.mainnet.json index 8630f1fcd..a76053913 100644 --- a/production/mempool-config.mainnet.json +++ b/production/mempool-config.mainnet.json @@ -16,7 +16,9 @@ "ADVANCED_GBT_MEMPOOL": true, "RUST_GBT": true, "USE_SECOND_NODE_FOR_MINFEE": true, - "DISK_CACHE_BLOCK_INTERVAL": 1 + "DISK_CACHE_BLOCK_INTERVAL": 1, + "MAX_PUSH_TX_SIZE_WEIGHT": 4000000, + "ALLOW_UNREACHABLE": true }, "SYSLOG" : { "MIN_PRIORITY": "debug" diff --git a/production/mempool-config.signet.json b/production/mempool-config.signet.json index e216ed216..957b36101 100644 --- a/production/mempool-config.signet.json +++ b/production/mempool-config.signet.json @@ -12,7 +12,9 @@ "ADVANCED_GBT_MEMPOOL": true, "RUST_GBT": true, "POLL_RATE_MS": 1000, - "DISK_CACHE_BLOCK_INTERVAL": 1 + "DISK_CACHE_BLOCK_INTERVAL": 1, + "MAX_PUSH_TX_SIZE_WEIGHT": 4000000, + "ALLOW_UNREACHABLE": true }, "SYSLOG" : { "MIN_PRIORITY": "debug" diff --git a/production/mempool-config.testnet.json b/production/mempool-config.testnet.json index 02bf892c1..8943e987f 100644 --- a/production/mempool-config.testnet.json +++ b/production/mempool-config.testnet.json @@ -12,7 +12,9 @@ "ADVANCED_GBT_MEMPOOL": true, "RUST_GBT": true, "POLL_RATE_MS": 1000, - "DISK_CACHE_BLOCK_INTERVAL": 1 + "DISK_CACHE_BLOCK_INTERVAL": 1, + "MAX_PUSH_TX_SIZE_WEIGHT": 4000000, + "ALLOW_UNREACHABLE": true }, "SYSLOG" : { "MIN_PRIORITY": "debug" From 15e58035e544a62a3f002ae49baddf35c099d112 Mon Sep 17 00:00:00 2001 From: wiz Date: Thu, 13 Jul 2023 15:06:00 +0900 Subject: [PATCH 570/782] ops: Remove 2 electrs patches from prod installer --- production/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/production/install b/production/install index 0297d4b4f..1121f5b4f 100755 --- a/production/install +++ b/production/install @@ -1240,8 +1240,8 @@ if [ "${BITCOIN_ELECTRS_INSTALL}" = ON ];then FreeBSD) echo "[*] Patching Bitcoin Electrs code for FreeBSD" osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_HOME}/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sysconf-0.3.4\" && patch -p1 < \"${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/freebsd/sysconf.patch\"" - osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_ELECTRS_HOME}/src/new_index/\" && sed -i.bak -e s/Snappy/None/ db.rs && rm db.rs.bak" - osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_ELECTRS_HOME}/src/bin/\" && sed -i.bak -e 's/from_secs(5)/from_secs(1)/' electrs.rs && rm electrs.rs.bak" + #osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_ELECTRS_HOME}/src/new_index/\" && sed -i.bak -e s/Snappy/None/ db.rs && rm db.rs.bak" + #osSudo "${BITCOIN_USER}" sh -c "cd \"${BITCOIN_ELECTRS_HOME}/src/bin/\" && sed -i.bak -e 's/from_secs(5)/from_secs(1)/' electrs.rs && rm electrs.rs.bak" ;; Debian) ;; From 5ef592f53eac5266a5b7631f749182824d7478b7 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 13 Jul 2023 16:57:36 +0900 Subject: [PATCH 571/782] Load more mempool transactions --- .../app/components/address/address.component.ts | 6 +++++- frontend/src/app/services/electrs-api.service.ts | 14 +++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/components/address/address.component.ts b/frontend/src/app/components/address/address.component.ts index 2ae9a962b..57439f983 100644 --- a/frontend/src/app/components/address/address.component.ts +++ b/frontend/src/app/components/address/address.component.ts @@ -207,7 +207,7 @@ export class AddressComponent implements OnInit, OnDestroy { } this.isLoadingTransactions = true; this.retryLoadMore = false; - this.electrsApiService.getAddressTransactionsFromHash$(this.address.address, this.lastTransactionTxId) + this.electrsApiService.getAddressTransactions$(this.address.address, this.lastTransactionTxId) .subscribe((transactions: Transaction[]) => { this.lastTransactionTxId = transactions[transactions.length - 1].txid; this.loadedConfirmedTxCount += transactions.length; @@ -217,6 +217,10 @@ export class AddressComponent implements OnInit, OnDestroy { (error) => { this.isLoadingTransactions = false; this.retryLoadMore = true; + // In the unlikely event of the txid wasn't found in the mempool anymore and we must reload the page. + if (error.status === 422) { + window.location.reload(); + } }); } diff --git a/frontend/src/app/services/electrs-api.service.ts b/frontend/src/app/services/electrs-api.service.ts index 5756f7fb2..c87018741 100644 --- a/frontend/src/app/services/electrs-api.service.ts +++ b/frontend/src/app/services/electrs-api.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { Transaction, Address, Outspend, Recent, Asset } from '../interfaces/electrs.interface'; import { StateService } from './state.service'; @@ -65,12 +65,12 @@ export class ElectrsApiService { return this.httpClient.get
    (this.apiBaseUrl + this.apiBasePath + '/api/address/' + address); } - getAddressTransactions$(address: string): Observable { - return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/address/' + address + '/txs'); - } - - getAddressTransactionsFromHash$(address: string, txid: string): Observable { - return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/address/' + address + '/txs/chain/' + txid); + getAddressTransactions$(address: string, txid?: string): Observable { + let params = new HttpParams(); + if (txid) { + params = params.append('after_txid', txid); + } + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/address/' + address + '/txs', { params }); } getAsset$(assetId: string): Observable { From 15a8c8d42062bd81da20e007a98f3934db9155b2 Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 13 Jul 2023 17:59:02 +0900 Subject: [PATCH 572/782] Support for romanz/electrs --- backend/src/api/bitcoin/bitcoin.routes.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index 17ebc9275..babc0aa53 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -121,7 +121,6 @@ class BitcoinRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'block-height/:height', this.getBlockHeight) .get(config.MEMPOOL.API_URL_PREFIX + 'address/:address', this.getAddress) .get(config.MEMPOOL.API_URL_PREFIX + 'address/:address/txs', this.getAddressTransactions) - .get(config.MEMPOOL.API_URL_PREFIX + 'address/:address/txs/chain/:txId', this.getAddressTransactions) .get(config.MEMPOOL.API_URL_PREFIX + 'address-prefix/:prefix', this.getAddressPrefix) ; } @@ -546,27 +545,28 @@ class BitcoinRoutes { } } - private async getAddressTransactions(req: Request, res: Response) { + private async getAddressTransactions(req: Request, res: Response): Promise { if (config.MEMPOOL.BACKEND === 'none') { res.status(405).send('Address lookups cannot be used with bitcoind as backend.'); return; } try { - const transactions = await bitcoinApi.$getAddressTransactions(req.params.address, req.params.txId); + let lastTxId: string = ''; + if (req.query.after_txid && typeof req.query.after_txid === 'string') { + lastTxId = req.query.after_txid; + } + const transactions = await bitcoinApi.$getAddressTransactions(req.params.address, lastTxId); res.json(transactions); } catch (e) { if (e instanceof Error && e.message && (e.message.indexOf('too long') > 0 || e.message.indexOf('confirmed status') > 0)) { - return res.status(413).send(e instanceof Error ? e.message : e); + res.status(413).send(e instanceof Error ? e.message : e); + return; } res.status(500).send(e instanceof Error ? e.message : e); } } - private async getAdressTxChain(req: Request, res: Response) { - res.status(501).send('Not implemented'); - } - private async getAddressPrefix(req: Request, res: Response) { try { const blockHash = await bitcoinApi.$getAddressPrefix(req.params.prefix); From 8477600859f50748e5803d6cdb06b928bffa1d61 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 14 Jul 2023 11:05:09 +0900 Subject: [PATCH 573/782] Fix difficulty chart bug --- .../app/components/hashrate-chart/hashrate-chart.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts index d562375b8..62cc71ca6 100644 --- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts +++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.ts @@ -130,6 +130,7 @@ export class HashrateChartComponent implements OnInit { }); ++hashIndex; } + diffIndex++; break; } From e9c618849d58d1f6a5feae414100b12b929d6290 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 12 Jul 2023 10:11:04 +0900 Subject: [PATCH 574/782] Highlight matching transactions in the block visualizations --- .../block-overview-graph.component.ts | 29 ++++++++++++++ .../block-overview-graph/block-scene.ts | 4 ++ .../block-overview-graph/tx-view.ts | 39 ++++++++++++++++++- .../search-form/search-form.component.ts | 3 ++ frontend/src/app/services/state.service.ts | 1 + 5 files changed, 74 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index 15e41f1a7..583f9875c 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -6,6 +6,8 @@ import TxSprite from './tx-sprite'; import TxView from './tx-view'; import { Position } from './sprite-types'; import { Price } from '../../services/price.service'; +import { StateService } from '../../services/state.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-block-overview-graph', @@ -44,16 +46,25 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On scene: BlockScene; hoverTx: TxView | void; selectedTx: TxView | void; + highlightTx: TxView | void; mirrorTx: TxView | void; tooltipPosition: Position; readyNextFrame = false; + searchText: string; + searchSubscription: Subscription; + constructor( readonly ngZone: NgZone, readonly elRef: ElementRef, + private stateService: StateService, ) { this.vertexArray = new FastVertexArray(512, TxSprite.dataSize); + this.searchSubscription = this.stateService.searchText$.subscribe((text) => { + this.searchText = text; + this.updateSearchHighlight(); + }); } ngAfterViewInit(): void { @@ -109,6 +120,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On this.scene.setup(transactions); this.readyNextFrame = true; this.start(); + this.updateSearchHighlight(); } } @@ -116,6 +128,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On if (this.scene) { this.scene.enter(transactions, direction); this.start(); + this.updateSearchHighlight(); } } @@ -123,6 +136,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On if (this.scene) { this.scene.exit(direction); this.start(); + this.updateSearchHighlight(); } } @@ -130,6 +144,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On if (this.scene) { this.scene.replace(transactions || [], direction, sort); this.start(); + this.updateSearchHighlight(); } } @@ -137,6 +152,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On if (this.scene) { this.scene.update(add, remove, change, direction, resetLayout); this.start(); + this.updateSearchHighlight(); } } @@ -406,6 +422,19 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On } } + updateSearchHighlight(): void { + if (this.highlightTx && this.highlightTx.txid !== this.searchText && this.scene) { + this.scene.setHighlight(this.highlightTx, false); + this.start(); + } else if (this.searchText && this.searchText.length === 64) { + this.highlightTx = this.scene.txs[this.searchText]; + if (this.highlightTx) { + this.scene.setHighlight(this.highlightTx, true); + this.start(); + } + } + } + setHighlightingEnabled(enabled: boolean): void { if (this.scene) { this.scene.setHighlighting(enabled); diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index 0cd5c9391..e7241141d 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -215,6 +215,10 @@ export default class BlockScene { this.animateUntil = Math.max(this.animateUntil, tx.setHover(value)); } + setHighlight(tx: TxView, value: boolean): void { + this.animateUntil = Math.max(this.animateUntil, tx.setHighlight(value)); + } + private init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting, pixelAlign }: { width: number, height: number, resolution: number, blockLimit: number, orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean, pixelAlign: boolean } diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index 7d3e0ee13..77f5a182a 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -7,6 +7,7 @@ import BlockScene from './block-scene'; const hoverTransitionTime = 300; const defaultHoverColor = hexToColor('1bd8f4'); +const defaultHighlightColor = hexToColor('800080'); const feeColors = mempoolFeeColors.map(hexToColor); const auditFeeColors = feeColors.map((color) => darken(desaturate(color, 0.3), 0.9)); @@ -44,8 +45,10 @@ export default class TxView implements TransactionStripped { initialised: boolean; vertexArray: FastVertexArray; hover: boolean; + highlight: boolean; sprite: TxSprite; hoverColor: Color | void; + highlightColor: Color | void; screenPosition: Square; gridPosition: Square | void; @@ -150,8 +153,40 @@ export default class TxView implements TransactionStripped { } else { this.hover = false; this.hoverColor = null; - if (this.sprite) { - this.sprite.resume(hoverTransitionTime); + if (this.highlight) { + this.setHighlight(true, this.highlightColor); + } else { + if (this.sprite) { + this.sprite.resume(hoverTransitionTime); + } + } + } + this.dirty = false; + return performance.now() + hoverTransitionTime; + } + + // Temporarily override the tx color + // returns minimum transition end time + setHighlight(highlightOn: boolean, color: Color | void = defaultHighlightColor): number { + if (highlightOn) { + this.highlight = true; + this.highlightColor = color; + + this.sprite.update({ + ...this.highlightColor, + duration: hoverTransitionTime, + adjust: false, + temp: true + }); + } else { + this.highlight = false; + this.highlightColor = null; + if (this.hover) { + this.setHover(true, this.hoverColor); + } else { + if (this.sprite) { + this.sprite.resume(hoverTransitionTime); + } } } this.dirty = false; diff --git a/frontend/src/app/components/search-form/search-form.component.ts b/frontend/src/app/components/search-form/search-form.component.ts index 422cb2f45..ab42fe1f7 100644 --- a/frontend/src/app/components/search-form/search-form.component.ts +++ b/frontend/src/app/components/search-form/search-form.component.ts @@ -80,6 +80,9 @@ export class SearchFormComponent implements OnInit { } return text.trim(); }), + tap((text) => { + this.stateService.searchText$.next(text); + }), distinctUntilChanged(), ); diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index f38600605..16252a9ec 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -129,6 +129,7 @@ export class StateService { markBlock$ = new BehaviorSubject({}); keyNavigation$ = new Subject(); + searchText$ = new BehaviorSubject(''); blockScrolling$: Subject = new Subject(); resetScroll$: Subject = new Subject(); From d60709deff25b04572e1475a26b337ec93c4f3bf Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 14 Jul 2023 11:21:23 +0900 Subject: [PATCH 575/782] Fix scene null check on visualization load --- .../block-overview-graph/block-overview-graph.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index 583f9875c..cc9934af8 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -426,7 +426,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On if (this.highlightTx && this.highlightTx.txid !== this.searchText && this.scene) { this.scene.setHighlight(this.highlightTx, false); this.start(); - } else if (this.searchText && this.searchText.length === 64) { + } else if (this.scene?.txs && this.searchText && this.searchText.length === 64) { this.highlightTx = this.scene.txs[this.searchText]; if (this.highlightTx) { this.scene.setHighlight(this.highlightTx, true); From 756fac7270c50fa88ccf6f71bb9389cf5e5a0da4 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 14 Jul 2023 11:52:07 +0900 Subject: [PATCH 576/782] Switch "latest blocks" to "latest replacements" --- .../app/dashboard/dashboard.component.html | 39 +++++------ .../app/dashboard/dashboard.component.scss | 46 ++++++------ .../src/app/dashboard/dashboard.component.ts | 70 ++++++++++++++----- 3 files changed, 88 insertions(+), 67 deletions(-) diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index 620678a28..90ec01e1d 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -75,36 +75,31 @@
    - -
    Latest blocks
    +
    +
    Latest Replacements
     
    - +
    - - - - - + + + + - - - - + - - + + diff --git a/frontend/src/app/dashboard/dashboard.component.scss b/frontend/src/app/dashboard/dashboard.component.scss index eb466fc16..5633a3c7e 100644 --- a/frontend/src/app/dashboard/dashboard.component.scss +++ b/frontend/src/app/dashboard/dashboard.component.scss @@ -175,40 +175,34 @@ height: 18px; } -.lastest-blocks-table { +.lastest-replacements-table { width: 100%; text-align: left; + table-layout:fixed; tr, td, th { border: 0px; - padding-top: 0.65rem !important; - padding-bottom: 0.7rem !important; + padding-top: 0.71rem !important; + padding-bottom: 0.75rem !important; } - .table-cell-height { - width: 15%; + td { + overflow:hidden; + width: 25%; } - .table-cell-mined { - width: 35%; - text-align: left; + .table-cell-txid { + width: 33%; + text-align: start; } - .table-cell-transaction-count { - display: none; - text-align: right; - width: 20%; - display: table-cell; + .table-cell-old-fee { + width: 33%; + text-align: end; } - .table-cell-size { - display: none; - text-align: center; - width: 30%; - @media (min-width: 485px) { - display: table-cell; - } - @media (min-width: 768px) { - display: none; - } - @media (min-width: 992px) { - display: table-cell; - } + .table-cell-new-fee { + width: 33%; + text-align: end; + } + .table-cell-badges { + width: 25%; + text-align: end; } } diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 6cf487be6..4ef4501aa 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { combineLatest, merge, Observable, of, Subscription } from 'rxjs'; import { filter, map, scan, share, switchMap, tap } from 'rxjs/operators'; -import { BlockExtended, OptimizedMempoolStats } from '../interfaces/node-api.interface'; +import { BlockExtended, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface'; import { MempoolInfo, TransactionStripped } from '../interfaces/websocket.interface'; import { ApiService } from '../services/api.service'; import { StateService } from '../services/state.service'; @@ -25,6 +25,17 @@ interface MempoolStatsData { weightPerSecond: any; } +interface ReplacementInfo { + tree: RbfTree; + mined: boolean; + fullRbf: boolean; + txid: string; + oldFee: number; + oldVsize: number; + newFee: number; + newVsize: number; +} + @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', @@ -38,8 +49,8 @@ export class DashboardComponent implements OnInit, OnDestroy { mempoolInfoData$: Observable; mempoolLoadingStatus$: Observable; vBytesPerSecondLimit = 1667; - blocks$: Observable; transactions$: Observable; + replacements$: Observable; latestBlockHeight: number; mempoolTransactionsWeightPerSecondData: any; mempoolStats$: Observable; @@ -64,6 +75,7 @@ export class DashboardComponent implements OnInit, OnDestroy { this.isLoadingWebSocket$ = this.stateService.isLoadingWebSocket$; this.seoService.resetTitle(); this.websocketService.want(['blocks', 'stats', 'mempool-blocks', 'live-2h-chart']); + this.websocketService.startTrackRbf('all'); this.network$ = merge(of(''), this.stateService.networkChanged$); this.mempoolLoadingStatus$ = this.stateService.loadingIndicators$ .pipe( @@ -130,23 +142,6 @@ export class DashboardComponent implements OnInit, OnDestroy { }), ); - this.blocks$ = this.stateService.blocks$ - .pipe( - tap((blocks) => { - this.latestBlockHeight = blocks[0].height; - }), - switchMap((blocks) => { - if (this.stateService.env.MINING_DASHBOARD === true) { - for (const block of blocks) { - // @ts-ignore: Need to add an extra field for the template - block.extras.pool.logo = `/resources/mining-pools/` + - block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; - } - } - return of(blocks.slice(0, 6)); - }) - ); - this.transactions$ = this.stateService.transactions$ .pipe( scan((acc, tx) => { @@ -159,6 +154,31 @@ export class DashboardComponent implements OnInit, OnDestroy { }, []), ); + this.replacements$ = this.stateService.rbfLatest$.pipe( + switchMap((rbfList) => { + const replacements = rbfList.slice(0, 6).map(rbfTree => { + let oldFee = 0; + let oldVsize = 0; + for (const replaced of rbfTree.replaces) { + oldFee += replaced.tx.fee; + oldVsize += replaced.tx.vsize; + } + this.checkFullRbf(rbfTree); + return { + tree: rbfTree, + txid: rbfTree.tx.txid, + mined: rbfTree.tx.mined, + fullRbf: rbfTree.tx.fullRbf, + oldFee, + oldVsize, + newFee: rbfTree.tx.fee, + newVsize: rbfTree.tx.vsize, + }; + }); + return of(replacements); + }) + ); + this.mempoolStats$ = this.stateService.connectionState$ .pipe( filter((state) => state === 2), @@ -219,4 +239,16 @@ export class DashboardComponent implements OnInit, OnDestroy { trackByBlock(index: number, block: BlockExtended) { return block.height; } + + checkFullRbf(tree: RbfTree): void { + let fullRbf = false; + for (const replaced of tree.replaces) { + if (!replaced.tx.rbf) { + fullRbf = true; + } + replaced.replacedBy = tree.tx; + this.checkFullRbf(replaced); + } + tree.tx.fullRbf = fullRbf; + } } From 240afbed955604f00a11eb07c1d531d69825a2e1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 14 Jul 2023 12:11:14 +0900 Subject: [PATCH 577/782] adjust latest replacements labels & layout --- .../src/app/dashboard/dashboard.component.html | 6 +++--- .../src/app/dashboard/dashboard.component.scss | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index 90ec01e1d..3faef5a83 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -76,16 +76,16 @@
    HeightMinedPoolTXsSizeTXIDOld feeNew fee
    {{ block.height }} - - - {{ block.extras.pool.name }} +
    + + {{ block.tx_count | number }} -
    -
     
    -
    -
    +
    + Mined + Full RBF + RBF
    - + - + diff --git a/frontend/src/app/dashboard/dashboard.component.scss b/frontend/src/app/dashboard/dashboard.component.scss index 5633a3c7e..f1e835d9c 100644 --- a/frontend/src/app/dashboard/dashboard.component.scss +++ b/frontend/src/app/dashboard/dashboard.component.scss @@ -189,20 +189,30 @@ width: 25%; } .table-cell-txid { - width: 33%; + width: 25%; text-align: start; } .table-cell-old-fee { - width: 33%; + width: 25%; text-align: end; + + @media(max-width: 1080px) { + display: none; + } } .table-cell-new-fee { - width: 33%; + width: 20%; text-align: end; } .table-cell-badges { - width: 25%; + width: 23%; + padding-right: 0; + padding-left: 5px; text-align: end; + + .badge { + margin-left: 5px; + } } } From 3cca6f6b8bb867faaec12e819652029751bedb4e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 2 Apr 2023 06:54:42 +0900 Subject: [PATCH 578/782] Pixel-aligned grids for sharper block visualizations --- .../block-overview-graph.component.html | 28 ++++++++++--------- .../block-overview-graph.component.scss | 8 ++++++ .../block/block-preview.component.html | 2 +- .../block/block-preview.component.scss | 4 +-- .../app/components/block/block.component.html | 6 ++-- .../mempool-block-overview.component.html | 2 +- 6 files changed, 30 insertions(+), 20 deletions(-) diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.html b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.html index 2a357843b..a625a0385 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.html +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.html @@ -1,15 +1,17 @@ -
    - -
    -
    -
    not available
    -
    - +
    +
    + +
    +
    +
    not available
    +
    + +
    diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.scss b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.scss index 58b53aebf..d30dd3305 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.scss +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.scss @@ -6,8 +6,16 @@ display: flex; justify-content: center; align-items: center; + grid-column: 1/-1; } +.grid-align { + position: relative; + width: 100%; + display: grid; + grid-template-columns: repeat(auto-fit, 75px); + justify-content: center; +} .block-overview-canvas { position: absolute; diff --git a/frontend/src/app/components/block/block-preview.component.html b/frontend/src/app/components/block/block-preview.component.html index 83962857c..0c33246a7 100644 --- a/frontend/src/app/components/block/block-preview.component.html +++ b/frontend/src/app/components/block/block-preview.component.html @@ -71,7 +71,7 @@

    Expected Block beta

    - @@ -239,7 +239,7 @@

    Actual Block

    - diff --git a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html index 37c82afad..7d5ddec30 100644 --- a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html +++ b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html @@ -1,7 +1,7 @@ Date: Fri, 14 Jul 2023 14:44:15 +0900 Subject: [PATCH 579/782] tweak default sizes & resolutions --- .../block-overview-graph.component.ts | 3 +- .../block-overview-graph/block-scene.ts | 30 ++++++------------- .../app/components/block/block.component.html | 8 ++--- .../app/components/block/block.component.scss | 4 +++ .../app/components/clock/clock.component.html | 2 +- .../mempool-block-overview.component.html | 3 +- .../mempool-block-overview.component.ts | 1 - 7 files changed, 20 insertions(+), 31 deletions(-) diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index cc9934af8..49da16d55 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -25,7 +25,6 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On @Input() unavailable: boolean = false; @Input() auditHighlighting: boolean = false; @Input() blockConversion: Price; - @Input() pixelAlign: boolean = false; @Output() txClickEvent = new EventEmitter<{ tx: TransactionStripped, keyModifier: boolean}>(); @Output() txHoverEvent = new EventEmitter(); @Output() readyEvent = new EventEmitter(); @@ -219,7 +218,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On } else { this.scene = new BlockScene({ width: this.displayWidth, height: this.displayHeight, resolution: this.resolution, blockLimit: this.blockLimit, orientation: this.orientation, flip: this.flip, vertexArray: this.vertexArray, - highlighting: this.auditHighlighting, pixelAlign: this.pixelAlign }); + highlighting: this.auditHighlighting }); this.start(); } } diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index e7241141d..510803f03 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -15,7 +15,6 @@ export default class BlockScene { gridWidth: number; gridHeight: number; gridSize: number; - pixelAlign: boolean; vbytesPerUnit: number; unitPadding: number; unitWidth: number; @@ -24,24 +23,19 @@ export default class BlockScene { animateUntil = 0; dirty: boolean; - constructor({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting, pixelAlign }: + constructor({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting }: { width: number, height: number, resolution: number, blockLimit: number, - orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean, pixelAlign: boolean } + orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean } ) { - this.init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting, pixelAlign }); + this.init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting }); } resize({ width = this.width, height = this.height, animate = true }: { width?: number, height?: number, animate: boolean }): void { this.width = width; this.height = height; this.gridSize = this.width / this.gridWidth; - if (this.pixelAlign) { - this.unitPadding = Math.max(1, Math.floor(this.gridSize / 2.5)); - this.unitWidth = this.gridSize - (this.unitPadding); - } else { - this.unitPadding = width / 500; - this.unitWidth = this.gridSize - (this.unitPadding * 2); - } + this.unitPadding = Math.max(1, Math.floor(this.gridSize / 5)); + this.unitWidth = this.gridSize - (this.unitPadding * 2); this.dirty = true; if (this.initialised && this.scene) { @@ -219,15 +213,14 @@ export default class BlockScene { this.animateUntil = Math.max(this.animateUntil, tx.setHighlight(value)); } - private init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting, pixelAlign }: + private init({ width, height, resolution, blockLimit, orientation, flip, vertexArray, highlighting }: { width: number, height: number, resolution: number, blockLimit: number, - orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean, pixelAlign: boolean } + orientation: string, flip: boolean, vertexArray: FastVertexArray, highlighting: boolean } ): void { this.orientation = orientation; this.flip = flip; this.vertexArray = vertexArray; this.highlightingEnabled = highlighting; - this.pixelAlign = pixelAlign; this.scene = { count: 0, @@ -353,12 +346,7 @@ export default class BlockScene { private gridToScreen(position: Square | void): Square { if (position) { const slotSize = (position.s * this.gridSize); - let squareSize; - if (this.pixelAlign) { - squareSize = slotSize - (this.unitPadding); - } else { - squareSize = slotSize - (this.unitPadding * 2); - } + const squareSize = slotSize - (this.unitPadding * 2); // The grid is laid out notionally left-to-right, bottom-to-top, // so we rotate and/or flip the y axis to match the target configuration. @@ -434,7 +422,7 @@ export default class BlockScene { // calculates and returns the size of the tx in multiples of the grid size private txSize(tx: TxView): number { - const scale = Math.max(1, Math.round(Math.sqrt(tx.vsize / this.vbytesPerUnit))); + const scale = Math.max(1, Math.round(Math.sqrt(1.1 * tx.vsize / this.vbytesPerUnit))); return Math.min(this.gridWidth, Math.max(1, scale)); // bound between 1 and the max displayable size (just in case!) } diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 84fdfcd91..e65905cd2 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -100,7 +100,7 @@
    TXIDOld feePrevious fee New feeStatus
    -
    +
    @@ -110,7 +110,7 @@

    Expected Block beta

    - @@ -239,7 +239,7 @@

    Actual Block

    - diff --git a/frontend/src/app/components/block/block.component.scss b/frontend/src/app/components/block/block.component.scss index a15c876e6..7f042552e 100644 --- a/frontend/src/app/components/block/block.component.scss +++ b/frontend/src/app/components/block/block.component.scss @@ -293,3 +293,7 @@ h1 { margin-top: 0.75rem; } } + +.graph-col { + flex-grow: 1.11; +} diff --git a/frontend/src/app/components/clock/clock.component.html b/frontend/src/app/components/clock/clock.component.html index 373653b7e..bdddef730 100644 --- a/frontend/src/app/components/clock/clock.component.html +++ b/frontend/src/app/components/clock/clock.component.html @@ -25,7 +25,7 @@
    - +
    diff --git a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html index 7d5ddec30..503f2e38d 100644 --- a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html +++ b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html @@ -1,10 +1,9 @@ diff --git a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts index 540046e13..30632a862 100644 --- a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts +++ b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts @@ -16,7 +16,6 @@ import { Router } from '@angular/router'; }) export class MempoolBlockOverviewComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit { @Input() index: number; - @Input() pixelAlign: boolean = false; @Output() txPreviewEvent = new EventEmitter(); @ViewChild('blockGraph') blockGraph: BlockOverviewGraphComponent; From fa48791c59a10cb7a0caab02bba0d3fb723a25b1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 14 Jul 2023 16:08:57 +0900 Subject: [PATCH 580/782] reduce latest rbf websocket data --- backend/src/api/rbf-cache.ts | 45 +++++++++++++++++-- backend/src/api/websocket-handler.ts | 27 +++++++++-- .../src/app/dashboard/dashboard.component.ts | 43 +++--------------- .../src/app/interfaces/websocket.interface.ts | 12 +++++ frontend/src/app/services/state.service.ts | 3 +- .../src/app/services/websocket.service.ts | 15 +++++++ 6 files changed, 99 insertions(+), 46 deletions(-) diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index a3714406f..367ba1c0e 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -6,6 +6,7 @@ import { Common } from "./common"; interface RbfTransaction extends TransactionStripped { rbf?: boolean; mined?: boolean; + fullRbf?: boolean; } interface RbfTree { @@ -17,6 +18,16 @@ interface RbfTree { replaces: RbfTree[]; } +export interface ReplacementInfo { + mined: boolean; + fullRbf: boolean; + txid: string; + oldFee: number; + oldVsize: number; + newFee: number; + newVsize: number; +} + class RbfCache { private replacedBy: Map = new Map(); private replaces: Map = new Map(); @@ -41,11 +52,15 @@ class RbfCache { this.txs.set(newTx.txid, newTxExtended); // maintain rbf trees - let fullRbf = false; + let txFullRbf = false; + let treeFullRbf = false; const replacedTrees: RbfTree[] = []; for (const replacedTxExtended of replaced) { const replacedTx = Common.stripTransaction(replacedTxExtended) as RbfTransaction; replacedTx.rbf = replacedTxExtended.vin.some((v) => v.sequence < 0xfffffffe); + if (!replacedTx.rbf) { + txFullRbf = true; + } this.replacedBy.set(replacedTx.txid, newTx.txid); if (this.treeMap.has(replacedTx.txid)) { const treeId = this.treeMap.get(replacedTx.txid); @@ -55,7 +70,7 @@ class RbfCache { if (tree) { tree.interval = newTime - tree?.time; replacedTrees.push(tree); - fullRbf = fullRbf || tree.fullRbf || !tree.tx.rbf; + treeFullRbf = treeFullRbf || tree.fullRbf || !tree.tx.rbf; } } } else { @@ -67,15 +82,16 @@ class RbfCache { fullRbf: !replacedTx.rbf, replaces: [], }); - fullRbf = fullRbf || !replacedTx.rbf; + treeFullRbf = treeFullRbf || !replacedTx.rbf; this.txs.set(replacedTx.txid, replacedTxExtended); } } + newTx.fullRbf = txFullRbf; const treeId = replacedTrees[0].tx.txid; const newTree = { tx: newTx, time: newTime, - fullRbf, + fullRbf: treeFullRbf, replaces: replacedTrees }; this.rbfTrees.set(treeId, newTree); @@ -349,6 +365,27 @@ class RbfCache { } return tree; } + + public getLatestRbfSummary(): ReplacementInfo[] { + const rbfList = this.getRbfTrees(false); + return rbfList.slice(0, 6).map(rbfTree => { + let oldFee = 0; + let oldVsize = 0; + for (const replaced of rbfTree.replaces) { + oldFee += replaced.tx.fee; + oldVsize += replaced.tx.vsize; + } + return { + txid: rbfTree.tx.txid, + mined: !!rbfTree.tx.mined, + fullRbf: !!rbfTree.tx.fullRbf, + oldFee, + oldVsize, + newFee: rbfTree.tx.fee, + newVsize: rbfTree.tx.vsize, + }; + }); + } } export default new RbfCache(); diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index f91947dcb..48e9106f0 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -12,7 +12,7 @@ import { Common } from './common'; import loadingIndicators from './loading-indicators'; import config from '../config'; import transactionUtils from './transaction-utils'; -import rbfCache from './rbf-cache'; +import rbfCache, { ReplacementInfo } from './rbf-cache'; import difficultyAdjustment from './difficulty-adjustment'; import feeApi from './fee-api'; import BlocksAuditsRepository from '../repositories/BlocksAuditsRepository'; @@ -40,6 +40,7 @@ class WebsocketHandler { private socketData: { [key: string]: string } = {}; private serializedInitData: string = '{}'; + private lastRbfSummary: ReplacementInfo | null = null; constructor() { } @@ -225,6 +226,15 @@ class WebsocketHandler { } } + if (parsedMessage && parsedMessage['track-rbf-summary'] != null) { + if (parsedMessage['track-rbf-summary']) { + client['track-rbf-summary'] = true; + response['rbfLatestSummary'] = this.socketData['rbfSummary']; + } else { + client['track-rbf-summary'] = false; + } + } + if (parsedMessage.action === 'init') { if (!this.socketData['blocks']?.length || !this.socketData['da']) { this.updateSocketData(); @@ -395,10 +405,13 @@ class WebsocketHandler { const rbfChanges = rbfCache.getRbfChanges(); let rbfReplacements; let fullRbfReplacements; + let rbfSummary; if (Object.keys(rbfChanges.trees).length) { rbfReplacements = rbfCache.getRbfTrees(false); fullRbfReplacements = rbfCache.getRbfTrees(true); + rbfSummary = rbfCache.getLatestRbfSummary(); } + for (const deletedTx of deletedTransactions) { rbfCache.evict(deletedTx.txid); } @@ -409,7 +422,7 @@ class WebsocketHandler { const latestTransactions = newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx)); // update init data - this.updateSocketDataFields({ + const socketDataFields = { 'mempoolInfo': mempoolInfo, 'vBytesPerSecond': vBytesPerSecond, 'mempool-blocks': mBlocks, @@ -417,7 +430,11 @@ class WebsocketHandler { 'loadingIndicators': loadingIndicators.getLoadingIndicators(), 'da': da?.previousTime ? da : undefined, 'fees': recommendedFees, - }); + }; + if (rbfSummary) { + socketDataFields['rbfSummary'] = rbfSummary; + } + this.updateSocketDataFields(socketDataFields); // cache serialized objects to avoid stringify-ing the same thing for every client const responseCache = { ...this.socketData }; @@ -601,6 +618,10 @@ class WebsocketHandler { response['rbfLatest'] = getCachedResponse('fullrbfLatest', fullRbfReplacements); } + if (client['track-rbf-summary'] && rbfSummary) { + response['rbfLatestSummary'] = getCachedResponse('rbfLatestSummary', rbfSummary); + } + if (Object.keys(response).length) { const serializedResponse = this.serializeResponse(response); client.send(serializedResponse); diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 4ef4501aa..b1bc35eca 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -1,8 +1,8 @@ import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { combineLatest, merge, Observable, of, Subscription } from 'rxjs'; -import { filter, map, scan, share, switchMap, tap } from 'rxjs/operators'; +import { filter, map, scan, share, switchMap } from 'rxjs/operators'; import { BlockExtended, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface'; -import { MempoolInfo, TransactionStripped } from '../interfaces/websocket.interface'; +import { MempoolInfo, TransactionStripped, ReplacementInfo } from '../interfaces/websocket.interface'; import { ApiService } from '../services/api.service'; import { StateService } from '../services/state.service'; import { WebsocketService } from '../services/websocket.service'; @@ -25,17 +25,6 @@ interface MempoolStatsData { weightPerSecond: any; } -interface ReplacementInfo { - tree: RbfTree; - mined: boolean; - fullRbf: boolean; - txid: string; - oldFee: number; - oldVsize: number; - newFee: number; - newVsize: number; -} - @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', @@ -69,13 +58,14 @@ export class DashboardComponent implements OnInit, OnDestroy { ngOnDestroy(): void { this.currencySubscription.unsubscribe(); + this.websocketService.stopTrackRbfSummary(); } ngOnInit(): void { this.isLoadingWebSocket$ = this.stateService.isLoadingWebSocket$; this.seoService.resetTitle(); this.websocketService.want(['blocks', 'stats', 'mempool-blocks', 'live-2h-chart']); - this.websocketService.startTrackRbf('all'); + this.websocketService.startTrackRbfSummary(); this.network$ = merge(of(''), this.stateService.networkChanged$); this.mempoolLoadingStatus$ = this.stateService.loadingIndicators$ .pipe( @@ -154,30 +144,7 @@ export class DashboardComponent implements OnInit, OnDestroy { }, []), ); - this.replacements$ = this.stateService.rbfLatest$.pipe( - switchMap((rbfList) => { - const replacements = rbfList.slice(0, 6).map(rbfTree => { - let oldFee = 0; - let oldVsize = 0; - for (const replaced of rbfTree.replaces) { - oldFee += replaced.tx.fee; - oldVsize += replaced.tx.vsize; - } - this.checkFullRbf(rbfTree); - return { - tree: rbfTree, - txid: rbfTree.tx.txid, - mined: rbfTree.tx.mined, - fullRbf: rbfTree.tx.fullRbf, - oldFee, - oldVsize, - newFee: rbfTree.tx.fee, - newVsize: rbfTree.tx.vsize, - }; - }); - return of(replacements); - }) - ); + this.replacements$ = this.stateService.rbfLatestSummary$; this.mempoolStats$ = this.stateService.connectionState$ .pipe( diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 20a114c72..991fe2680 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -18,6 +18,7 @@ export interface WebsocketResponse { txReplaced?: ReplacedTransaction; rbfInfo?: RbfTree; rbfLatest?: RbfTree[]; + rbfLatestSummary?: ReplacementInfo[]; utxoSpent?: object; transactions?: TransactionStripped[]; loadingIndicators?: ILoadingIndicators; @@ -29,6 +30,7 @@ export interface WebsocketResponse { 'track-asset'?: string; 'track-mempool-block'?: number; 'track-rbf'?: string; + 'track-rbf-summary'?: boolean; 'watch-mempool'?: boolean; 'track-bisq-market'?: string; 'refresh-blocks'?: boolean; @@ -37,6 +39,16 @@ export interface WebsocketResponse { export interface ReplacedTransaction extends Transaction { txid: string; } + +export interface ReplacementInfo { + mined: boolean; + fullRbf: boolean; + txid: string; + oldFee: number; + oldVsize: number; + newFee: number; + newVsize: number; +} export interface MempoolBlock { blink?: boolean; height?: number; diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index f38600605..c1964e85e 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -1,7 +1,7 @@ import { Inject, Injectable, PLATFORM_ID, LOCALE_ID } from '@angular/core'; import { ReplaySubject, BehaviorSubject, Subject, fromEvent, Observable, merge } from 'rxjs'; import { Transaction } from '../interfaces/electrs.interface'; -import { IBackendInfo, MempoolBlock, MempoolBlockDelta, MempoolInfo, Recommendedfees, ReplacedTransaction, TransactionStripped } from '../interfaces/websocket.interface'; +import { IBackendInfo, MempoolBlock, MempoolBlockDelta, MempoolInfo, Recommendedfees, ReplacedTransaction, ReplacementInfo, TransactionStripped } from '../interfaces/websocket.interface'; import { BlockExtended, DifficultyAdjustment, MempoolPosition, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface'; import { Router, NavigationStart } from '@angular/router'; import { isPlatformBrowser } from '@angular/common'; @@ -108,6 +108,7 @@ export class StateService { txReplaced$ = new Subject(); txRbfInfo$ = new Subject(); rbfLatest$ = new Subject(); + rbfLatestSummary$ = new Subject(); utxoSpent$ = new Subject(); difficultyAdjustment$ = new ReplaySubject(1); mempoolTransactions$ = new Subject(); diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index 7eed09e77..f32f772ac 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -29,6 +29,7 @@ export class WebsocketService { private trackingTxId: string; private isTrackingMempoolBlock = false; private isTrackingRbf = false; + private isTrackingRbfSummary = false; private trackingMempoolBlock: number; private latestGitCommit = ''; private onlineCheckTimeout: number; @@ -185,6 +186,16 @@ export class WebsocketService { this.isTrackingRbf = false; } + startTrackRbfSummary() { + this.websocketSubject.next({ 'track-rbf-summary': true }); + this.isTrackingRbfSummary = true; + } + + stopTrackRbfSummary() { + this.websocketSubject.next({ 'track-rbf-summary': false }); + this.isTrackingRbfSummary = false; + } + startTrackBisqMarket(market: string) { this.websocketSubject.next({ 'track-bisq-market': market }); } @@ -283,6 +294,10 @@ export class WebsocketService { this.stateService.rbfLatest$.next(response.rbfLatest); } + if (response.rbfLatestSummary) { + this.stateService.rbfLatestSummary$.next(response.rbfLatestSummary); + } + if (response.txReplaced) { this.stateService.txReplaced$.next(response.txReplaced); } From 69e6b164b98d4f87ecf10bb7f367027be35a7961 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 20 Jun 2023 16:21:54 -0400 Subject: [PATCH 581/782] Add audit data replication service --- backend/mempool-config.sample.json | 11 ++ .../__fixtures__/mempool-config.template.json | 6 + backend/src/__tests__/config.test.ts | 7 + backend/src/config.ts | 14 ++ backend/src/indexer.ts | 2 + backend/src/mempool.interfaces.ts | 9 ++ backend/src/replication/AuditReplication.ts | 123 ++++++++++++++++++ backend/src/replication/replicator.ts | 70 ++++++++++ production/mempool-config.mainnet.json | 25 ++++ 9 files changed, 267 insertions(+) create mode 100644 backend/src/replication/AuditReplication.ts create mode 100644 backend/src/replication/replicator.ts diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index c0a2d9d62..e3df7d2fe 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -125,5 +125,16 @@ "LIQUID_ONION": "http://liquidmom47f6s3m53ebfxn47p76a6tlnxib3wp6deux7wuzotdr6cyd.onion/api/v1", "BISQ_URL": "https://bisq.markets/api", "BISQ_ONION": "http://bisqmktse2cabavbr2xjq7xw3h6g5ottemo5rolfcwt6aly6tp5fdryd.onion/api" + }, + "REPLICATION": { + "ENABLED": false, + "AUDIT": false, + "AUDIT_START_HEIGHT": 774000, + "SERVERS": [ + "list", + "of", + "trusted", + "servers" + ] } } diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 776f01de1..4213f0ffb 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -121,5 +121,11 @@ }, "CLIGHTNING": { "SOCKET": "__CLIGHTNING_SOCKET__" + }, + "REPLICATION": { + "ENABLED": false, + "AUDIT": false, + "AUDIT_START_HEIGHT": 774000, + "SERVERS": [] } } diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index fdd8a02de..dc1beaa46 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -120,6 +120,13 @@ describe('Mempool Backend Config', () => { GEOLITE2_ASN: '/usr/local/share/GeoIP/GeoLite2-ASN.mmdb', GEOIP2_ISP: '/usr/local/share/GeoIP/GeoIP2-ISP.mmdb' }); + + expect(config.REPLICATION).toStrictEqual({ + ENABLED: false, + AUDIT: false, + AUDIT_START_HEIGHT: 774000, + SERVERS: [] + }); }); }); diff --git a/backend/src/config.ts b/backend/src/config.ts index 40b407a57..09d279537 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -132,6 +132,12 @@ interface IConfig { GEOLITE2_ASN: string; GEOIP2_ISP: string; }, + REPLICATION: { + ENABLED: boolean; + AUDIT: boolean; + AUDIT_START_HEIGHT: number; + SERVERS: string[]; + } } const defaults: IConfig = { @@ -264,6 +270,12 @@ const defaults: IConfig = { 'GEOLITE2_ASN': '/usr/local/share/GeoIP/GeoLite2-ASN.mmdb', 'GEOIP2_ISP': '/usr/local/share/GeoIP/GeoIP2-ISP.mmdb' }, + 'REPLICATION': { + 'ENABLED': false, + 'AUDIT': false, + 'AUDIT_START_HEIGHT': 774000, + 'SERVERS': [], + } }; class Config implements IConfig { @@ -283,6 +295,7 @@ class Config implements IConfig { PRICE_DATA_SERVER: IConfig['PRICE_DATA_SERVER']; EXTERNAL_DATA_SERVER: IConfig['EXTERNAL_DATA_SERVER']; MAXMIND: IConfig['MAXMIND']; + REPLICATION: IConfig['REPLICATION']; constructor() { const configs = this.merge(configFromFile, defaults); @@ -302,6 +315,7 @@ class Config implements IConfig { this.PRICE_DATA_SERVER = configs.PRICE_DATA_SERVER; this.EXTERNAL_DATA_SERVER = configs.EXTERNAL_DATA_SERVER; this.MAXMIND = configs.MAXMIND; + this.REPLICATION = configs.REPLICATION; } merge = (...objects: object[]): IConfig => { diff --git a/backend/src/indexer.ts b/backend/src/indexer.ts index 88f44d587..d89a2647f 100644 --- a/backend/src/indexer.ts +++ b/backend/src/indexer.ts @@ -7,6 +7,7 @@ import bitcoinClient from './api/bitcoin/bitcoin-client'; import priceUpdater from './tasks/price-updater'; import PricesRepository from './repositories/PricesRepository'; import config from './config'; +import auditReplicator from './replication/AuditReplication'; export interface CoreIndex { name: string; @@ -136,6 +137,7 @@ class Indexer { await blocks.$generateBlocksSummariesDatabase(); await blocks.$generateCPFPDatabase(); await blocks.$generateAuditStats(); + await auditReplicator.$sync(); } catch (e) { this.indexerRunning = false; logger.err(`Indexer failed, trying again in 10 seconds. Reason: ` + (e instanceof Error ? e.message : e)); diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index a051eea4f..1971234f8 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -236,6 +236,15 @@ export interface BlockSummary { transactions: TransactionStripped[]; } +export interface AuditSummary extends BlockAudit { + timestamp?: number, + size?: number, + weight?: number, + tx_count?: number, + transactions: TransactionStripped[]; + template?: TransactionStripped[]; +} + export interface BlockPrice { height: number; priceId: number; diff --git a/backend/src/replication/AuditReplication.ts b/backend/src/replication/AuditReplication.ts new file mode 100644 index 000000000..b950acb6c --- /dev/null +++ b/backend/src/replication/AuditReplication.ts @@ -0,0 +1,123 @@ +import DB from '../database'; +import logger from '../logger'; +import { AuditSummary } from '../mempool.interfaces'; +import blocksAuditsRepository from '../repositories/BlocksAuditsRepository'; +import blocksSummariesRepository from '../repositories/BlocksSummariesRepository'; +import { $sync } from './replicator'; +import config from '../config'; +import { Common } from '../api/common'; + +const BATCH_SIZE = 16; + +/** + * Syncs missing block template and audit data from trusted servers + */ +class AuditReplication { + inProgress: boolean = false; + skip: Set = new Set(); + + public async $sync(): Promise { + if (!config.REPLICATION.ENABLED || !config.REPLICATION.AUDIT) { + // replication not enabled + return; + } + if (this.inProgress) { + logger.info(`AuditReplication sync already in progress`, 'Replication'); + return; + } + this.inProgress = true; + + const missingAudits = await this.$getMissingAuditBlocks(); + + logger.debug(`Fetching missing audit data for ${missingAudits.length} blocks from trusted servers`, 'Replication'); + + let totalSynced = 0; + let totalMissed = 0; + let loggerTimer = Date.now(); + // process missing audits in batches of + for (let i = 0; i < missingAudits.length; i += BATCH_SIZE) { + const results = await Promise.all(missingAudits.slice(i * BATCH_SIZE, (i + 1) * BATCH_SIZE).map(hash => this.$syncAudit(hash))); + const synced = results.reduce((total, status) => status ? total + 1 : total, 0); + totalSynced += synced; + totalMissed += (BATCH_SIZE - synced); + if (Date.now() - loggerTimer > 10000) { + loggerTimer = Date.now(); + logger.info(`Found ${totalSynced} / ${totalSynced + totalMissed} of ${missingAudits.length} missing audits`, 'Replication'); + } + await Common.sleep$(1000); + } + + logger.debug(`Fetched ${totalSynced} audits, ${totalMissed} still missing`, 'Replication'); + + this.inProgress = false; + } + + private async $syncAudit(hash: string): Promise { + if (this.skip.has(hash)) { + // we already know none of our trusted servers have this audit + return false; + } + + let success = false; + // start with a random server so load is uniformly spread + const syncResult = await $sync(`/api/v1/block/${hash}/audit-summary`); + if (syncResult) { + if (syncResult.data?.template?.length) { + await this.$saveAuditData(hash, syncResult.data); + success = true; + } + if (!syncResult.data && !syncResult.exists) { + this.skip.add(hash); + } + } + + return success; + } + + private async $getMissingAuditBlocks(): Promise { + try { + const startHeight = config.REPLICATION.AUDIT_START_HEIGHT || 0; + const [rows]: any[] = await DB.query(` + SELECT auditable.hash, auditable.height + FROM ( + SELECT hash, height + FROM blocks + WHERE height >= ? + ) AS auditable + LEFT JOIN blocks_audits ON auditable.hash = blocks_audits.hash + WHERE blocks_audits.hash IS NULL + ORDER BY auditable.height DESC + `, [startHeight]); + return rows.map(row => row.hash); + } catch (e: any) { + logger.err(`Cannot fetch missing audit blocks from db. Reason: ` + (e instanceof Error ? e.message : e)); + throw e; + } + } + + private async $saveAuditData(blockHash: string, auditSummary: AuditSummary): Promise { + // save audit & template to DB + await blocksSummariesRepository.$saveTemplate({ + height: auditSummary.height, + template: { + id: blockHash, + transactions: auditSummary.template || [] + } + }); + await blocksAuditsRepository.$saveAudit({ + hash: blockHash, + height: auditSummary.height, + time: auditSummary.timestamp || auditSummary.time, + missingTxs: auditSummary.missingTxs || [], + addedTxs: auditSummary.addedTxs || [], + freshTxs: auditSummary.freshTxs || [], + sigopTxs: auditSummary.sigopTxs || [], + matchRate: auditSummary.matchRate, + expectedFees: auditSummary.expectedFees, + expectedWeight: auditSummary.expectedWeight, + }); + } +} + +export default new AuditReplication(); + diff --git a/backend/src/replication/replicator.ts b/backend/src/replication/replicator.ts new file mode 100644 index 000000000..60dfa8a2d --- /dev/null +++ b/backend/src/replication/replicator.ts @@ -0,0 +1,70 @@ +import config from '../config'; +import backendInfo from '../api/backend-info'; +import axios, { AxiosResponse } from 'axios'; +import { SocksProxyAgent } from 'socks-proxy-agent'; +import * as https from 'https'; + +export async function $sync(path): Promise<{ data?: any, exists: boolean }> { + // start with a random server so load is uniformly spread + let allMissing = true; + const offset = Math.floor(Math.random() * config.REPLICATION.SERVERS.length); + for (let i = 0; i < config.REPLICATION.SERVERS.length; i++) { + const server = config.REPLICATION.SERVERS[(i + offset) % config.REPLICATION.SERVERS.length]; + // don't query ourself + if (server === backendInfo.getBackendInfo().hostname) { + continue; + } + + try { + const result = await query(`https://${server}${path}`); + if (result) { + return { data: result, exists: true }; + } + } catch (e: any) { + if (e?.response?.status === 404) { + // this server is also missing this data + } else { + // something else went wrong + allMissing = false; + } + } + } + + return { exists: !allMissing }; +} + +export async function query(path): Promise { + type axiosOptions = { + headers: { + 'User-Agent': string + }; + timeout: number; + httpsAgent?: https.Agent; + }; + const axiosOptions: axiosOptions = { + headers: { + 'User-Agent': (config.MEMPOOL.USER_AGENT === 'mempool') ? `mempool/v${backendInfo.getBackendInfo().version}` : `${config.MEMPOOL.USER_AGENT}` + }, + timeout: config.SOCKS5PROXY.ENABLED ? 30000 : 10000 + }; + + if (config.SOCKS5PROXY.ENABLED) { + const socksOptions = { + agentOptions: { + keepAlive: true, + }, + hostname: config.SOCKS5PROXY.HOST, + port: config.SOCKS5PROXY.PORT, + username: config.SOCKS5PROXY.USERNAME || 'circuit0', + password: config.SOCKS5PROXY.PASSWORD, + }; + + axiosOptions.httpsAgent = new SocksProxyAgent(socksOptions); + } + + const data: AxiosResponse = await axios.get(path, axiosOptions); + if (data.statusText === 'error' || !data.data) { + throw new Error(`${data.status}`); + } + return data.data; +} \ No newline at end of file diff --git a/production/mempool-config.mainnet.json b/production/mempool-config.mainnet.json index a76053913..5e25bcb76 100644 --- a/production/mempool-config.mainnet.json +++ b/production/mempool-config.mainnet.json @@ -48,5 +48,30 @@ "STATISTICS": { "ENABLED": true, "TX_PER_SECOND_SAMPLE_PERIOD": 150 + }, + "REPLICATION": { + "ENABLED": true, + "AUDIT": true, + "AUDIT_START_HEIGHT": 774000, + "SERVERS": [ + "node201.fmt.mempool.space", + "node202.fmt.mempool.space", + "node203.fmt.mempool.space", + "node204.fmt.mempool.space", + "node205.fmt.mempool.space", + "node206.fmt.mempool.space", + "node201.fra.mempool.space", + "node202.fra.mempool.space", + "node203.fra.mempool.space", + "node204.fra.mempool.space", + "node205.fra.mempool.space", + "node206.fra.mempool.space", + "node201.tk7.mempool.space", + "node202.tk7.mempool.space", + "node203.tk7.mempool.space", + "node204.tk7.mempool.space", + "node205.tk7.mempool.space", + "node206.tk7.mempool.space" + ] } } From 736b997104c592673fd3e558f94d3eac1be2071d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 20 Jun 2023 17:03:24 -0400 Subject: [PATCH 582/782] Add missing audit data to cached blocks --- backend/src/replication/AuditReplication.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/src/replication/AuditReplication.ts b/backend/src/replication/AuditReplication.ts index b950acb6c..c762df201 100644 --- a/backend/src/replication/AuditReplication.ts +++ b/backend/src/replication/AuditReplication.ts @@ -6,6 +6,7 @@ import blocksSummariesRepository from '../repositories/BlocksSummariesRepository import { $sync } from './replicator'; import config from '../config'; import { Common } from '../api/common'; +import blocks from '../api/blocks'; const BATCH_SIZE = 16; @@ -116,6 +117,13 @@ class AuditReplication { expectedFees: auditSummary.expectedFees, expectedWeight: auditSummary.expectedWeight, }); + // add missing data to cached blocks + const cachedBlock = blocks.getBlocks().find(block => block.id === blockHash); + if (cachedBlock) { + cachedBlock.extras.matchRate = auditSummary.matchRate; + cachedBlock.extras.expectedFees = auditSummary.expectedFees || null; + cachedBlock.extras.expectedWeight = auditSummary.expectedWeight || null; + } } } From 7f6d17fc0ece0bfc57945fafca338a96ce0e64c1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 20 Jun 2023 17:07:14 -0400 Subject: [PATCH 583/782] Fix audit sync progress logging --- backend/src/replication/AuditReplication.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/replication/AuditReplication.ts b/backend/src/replication/AuditReplication.ts index c762df201..89c514347 100644 --- a/backend/src/replication/AuditReplication.ts +++ b/backend/src/replication/AuditReplication.ts @@ -37,10 +37,11 @@ class AuditReplication { let loggerTimer = Date.now(); // process missing audits in batches of for (let i = 0; i < missingAudits.length; i += BATCH_SIZE) { - const results = await Promise.all(missingAudits.slice(i * BATCH_SIZE, (i + 1) * BATCH_SIZE).map(hash => this.$syncAudit(hash))); + const slice = missingAudits.slice(i * BATCH_SIZE, (i + 1) * BATCH_SIZE); + const results = await Promise.all(slice.map(hash => this.$syncAudit(hash))); const synced = results.reduce((total, status) => status ? total + 1 : total, 0); totalSynced += synced; - totalMissed += (BATCH_SIZE - synced); + totalMissed += (slice.length - synced); if (Date.now() - loggerTimer > 10000) { loggerTimer = Date.now(); logger.info(`Found ${totalSynced} / ${totalSynced + totalMissed} of ${missingAudits.length} missing audits`, 'Replication'); From bccc6b3680e4bd6aeeb25bc229983de1f21b8c91 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 21 Jun 2023 09:19:59 -0400 Subject: [PATCH 584/782] Add missing replication docker config --- docker/backend/mempool-config.json | 6 ++++++ docker/backend/start.sh | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index d070d8010..2ff76d5dd 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -127,5 +127,11 @@ "GEOLITE2_CITY": "__MAXMIND_GEOLITE2_CITY__", "GEOLITE2_ASN": "__MAXMIND_GEOLITE2_ASN__", "GEOIP2_ISP": "__MAXMIND_GEOIP2_ISP__" + }, + "REPLICATION": { + "ENABLED": __REPLICATION_ENABLED__, + "AUDIT": __REPLICATION_AUDIT__, + "AUDIT_START_HEIGHT": __REPLICATION_AUDIT_START_HEIGHT__, + "SERVERS": __REPLICATION_SERVERS__ } } diff --git a/docker/backend/start.sh b/docker/backend/start.sh index 7241444fb..c34d804b4 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -130,6 +130,12 @@ __MAXMIND_GEOLITE2_CITY__=${MAXMIND_GEOLITE2_CITY:="/backend/GeoIP/GeoLite2-City __MAXMIND_GEOLITE2_ASN__=${MAXMIND_GEOLITE2_ASN:="/backend/GeoIP/GeoLite2-ASN.mmdb"} __MAXMIND_GEOIP2_ISP__=${MAXMIND_GEOIP2_ISP:=""} +# REPLICATION +__REPLICATION_ENABLED__=${REPLICATION_ENABLED:=true} +__REPLICATION_AUDIT__=${REPLICATION_AUDIT:=true} +__REPLICATION_AUDIT_START_HEIGHT__=${REPLICATION_AUDIT_START_HEIGHT:=774000} +__REPLICATION_SERVERS__=${REPLICATION_SERVERS:=[]} + mkdir -p "${__MEMPOOL_CACHE_DIR__}" @@ -250,5 +256,10 @@ sed -i "s!__MAXMIND_GEOLITE2_CITY__!${__MAXMIND_GEOLITE2_CITY__}!g" mempool-conf sed -i "s!__MAXMIND_GEOLITE2_ASN__!${__MAXMIND_GEOLITE2_ASN__}!g" mempool-config.json sed -i "s!__MAXMIND_GEOIP2_ISP__!${__MAXMIND_GEOIP2_ISP__}!g" mempool-config.json +# REPLICATION +sed -i "s!__REPLICATION_ENABLED__!${__REPLICATION_ENABLED__}!g" mempool-config.json +sed -i "s!__REPLICATION_AUDIT__!${__REPLICATION_AUDIT__}!g" mempool-config.json +sed -i "s!__REPLICATION_AUDIT_START_HEIGHT__!${__REPLICATION_AUDIT_START_HEIGHT__}!g" mempool-config.json +sed -i "s!__REPLICATION_SERVERS__!${__REPLICATION_SERVERS__}!g" mempool-config.json node /backend/package/index.js From e59a9d38ff238850fc9e727102a56ff0f5c0e05e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 14 Jul 2023 16:47:58 +0900 Subject: [PATCH 585/782] fix audit replication merge conflicts --- backend/src/replication/AuditReplication.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/replication/AuditReplication.ts b/backend/src/replication/AuditReplication.ts index 89c514347..2043532db 100644 --- a/backend/src/replication/AuditReplication.ts +++ b/backend/src/replication/AuditReplication.ts @@ -37,7 +37,7 @@ class AuditReplication { let loggerTimer = Date.now(); // process missing audits in batches of for (let i = 0; i < missingAudits.length; i += BATCH_SIZE) { - const slice = missingAudits.slice(i * BATCH_SIZE, (i + 1) * BATCH_SIZE); + const slice = missingAudits.slice(i, i + BATCH_SIZE); const results = await Promise.all(slice.map(hash => this.$syncAudit(hash))); const synced = results.reduce((total, status) => status ? total + 1 : total, 0); totalSynced += synced; @@ -114,6 +114,7 @@ class AuditReplication { addedTxs: auditSummary.addedTxs || [], freshTxs: auditSummary.freshTxs || [], sigopTxs: auditSummary.sigopTxs || [], + fullrbfTxs: auditSummary.fullrbfTxs || [], matchRate: auditSummary.matchRate, expectedFees: auditSummary.expectedFees, expectedWeight: auditSummary.expectedWeight, From 1abd2a23cce04a8913791eb88a0818814f35d106 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 14 Jul 2023 16:48:11 +0900 Subject: [PATCH 586/782] Add audit replication success logging --- backend/src/replication/AuditReplication.ts | 1 + backend/src/replication/replicator.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/replication/AuditReplication.ts b/backend/src/replication/AuditReplication.ts index 2043532db..26bf6dad7 100644 --- a/backend/src/replication/AuditReplication.ts +++ b/backend/src/replication/AuditReplication.ts @@ -66,6 +66,7 @@ class AuditReplication { if (syncResult) { if (syncResult.data?.template?.length) { await this.$saveAuditData(hash, syncResult.data); + logger.info(`Imported audit data from ${syncResult.server} for block ${syncResult.data.height} (${hash})`); success = true; } if (!syncResult.data && !syncResult.exists) { diff --git a/backend/src/replication/replicator.ts b/backend/src/replication/replicator.ts index 60dfa8a2d..ac204efcc 100644 --- a/backend/src/replication/replicator.ts +++ b/backend/src/replication/replicator.ts @@ -4,7 +4,7 @@ import axios, { AxiosResponse } from 'axios'; import { SocksProxyAgent } from 'socks-proxy-agent'; import * as https from 'https'; -export async function $sync(path): Promise<{ data?: any, exists: boolean }> { +export async function $sync(path): Promise<{ data?: any, exists: boolean, server?: string }> { // start with a random server so load is uniformly spread let allMissing = true; const offset = Math.floor(Math.random() * config.REPLICATION.SERVERS.length); @@ -18,7 +18,7 @@ export async function $sync(path): Promise<{ data?: any, exists: boolean }> { try { const result = await query(`https://${server}${path}`); if (result) { - return { data: result, exists: true }; + return { data: result, exists: true, server }; } } catch (e: any) { if (e?.response?.status === 404) { From 7f0218e343e34c897426e83b72b5deeb2a63689a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 14 Jul 2023 18:39:28 +0900 Subject: [PATCH 587/782] add margin between mobile audit tabs & visualization --- frontend/src/app/components/block/block.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/components/block/block.component.scss b/frontend/src/app/components/block/block.component.scss index 7f042552e..c413b1fce 100644 --- a/frontend/src/app/components/block/block.component.scss +++ b/frontend/src/app/components/block/block.component.scss @@ -239,6 +239,7 @@ h1 { .nav-tabs { border-color: white; border-width: 1px; + margin-bottom: 1em; } .nav-tabs .nav-link { From 23151ec3dbc530166df7f474a4e702915808a057 Mon Sep 17 00:00:00 2001 From: wiz Date: Fri, 14 Jul 2023 18:39:35 +0900 Subject: [PATCH 588/782] Bump version to 3.0.0-dev - Now requires mempool/electrs - Mempool Accelerator integration - Rust GBT integration - And more! --- backend/package-lock.json | 4 ++-- backend/package.json | 2 +- backend/rust-gbt/package-lock.json | 4 ++-- backend/rust-gbt/package.json | 4 ++-- frontend/package-lock.json | 4 ++-- frontend/package.json | 4 ++-- unfurler/package-lock.json | 4 ++-- unfurler/package.json | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 4f36005a7..6800c24c0 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mempool-backend", - "version": "2.6.0-dev", + "version": "3.0.0-dev", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mempool-backend", - "version": "2.6.0-dev", + "version": "3.0.0-dev", "license": "GNU Affero General Public License v3.0", "dependencies": { "@babel/core": "^7.21.3", diff --git a/backend/package.json b/backend/package.json index bc4771ebb..5cfb7982e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "mempool-backend", - "version": "2.6.0-dev", + "version": "3.0.0-dev", "description": "Bitcoin mempool visualizer and blockchain explorer backend", "license": "GNU Affero General Public License v3.0", "homepage": "https://mempool.space", diff --git a/backend/rust-gbt/package-lock.json b/backend/rust-gbt/package-lock.json index e20a6f5bf..b7949b9ab 100644 --- a/backend/rust-gbt/package-lock.json +++ b/backend/rust-gbt/package-lock.json @@ -1,12 +1,12 @@ { "name": "gbt", - "version": "0.1.0", + "version": "3.0.0-dev", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gbt", - "version": "0.1.0", + "version": "3.0.0-dev", "hasInstallScript": true, "dependencies": { "@napi-rs/cli": "^2.16.1" diff --git a/backend/rust-gbt/package.json b/backend/rust-gbt/package.json index e65fb2209..c95f36b06 100644 --- a/backend/rust-gbt/package.json +++ b/backend/rust-gbt/package.json @@ -1,6 +1,6 @@ { "name": "gbt", - "version": "0.1.0", + "version": "3.0.0-dev", "description": "An inefficient re-implementation of the getBlockTemplate algorithm in Rust", "main": "index.js", "types": "index.d.ts", @@ -30,4 +30,4 @@ "engines": { "node": ">= 12" } -} \ No newline at end of file +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a9f8b7049..13dc6d1b6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mempool-frontend", - "version": "2.6.0-dev", + "version": "3.0.0-dev", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mempool-frontend", - "version": "2.6.0-dev", + "version": "3.0.0-dev", "license": "GNU Affero General Public License v3.0", "dependencies": { "@angular-devkit/build-angular": "^14.2.10", diff --git a/frontend/package.json b/frontend/package.json index c06fe74a7..d73fa8fa2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "mempool-frontend", - "version": "2.6.0-dev", + "version": "3.0.0-dev", "description": "Bitcoin mempool visualizer and blockchain explorer backend", "license": "GNU Affero General Public License v3.0", "homepage": "https://mempool.space", @@ -119,4 +119,4 @@ "scarfSettings": { "enabled": false } -} \ No newline at end of file +} diff --git a/unfurler/package-lock.json b/unfurler/package-lock.json index 40520d413..16968f203 100644 --- a/unfurler/package-lock.json +++ b/unfurler/package-lock.json @@ -1,12 +1,12 @@ { "name": "mempool-unfurl", - "version": "0.1.0", + "version": "3.0.0-dev", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mempool-unfurl", - "version": "0.1.0", + "version": "3.0.0-dev", "dependencies": { "@types/node": "^16.11.41", "express": "^4.18.0", diff --git a/unfurler/package.json b/unfurler/package.json index 59d48aa50..ec0a153b6 100644 --- a/unfurler/package.json +++ b/unfurler/package.json @@ -1,6 +1,6 @@ { "name": "mempool-unfurl", - "version": "0.1.0", + "version": "3.0.0-dev", "description": "Renderer for mempool open graph link preview images", "repository": { "type": "git", From 67a998c69f165905c2e720566e78f79a2dd02c56 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 17 Jun 2023 21:04:23 +0200 Subject: [PATCH 589/782] Working fiat/btc calculator --- frontend/src/app/app-routing.module.ts | 5 ++ .../calculator/calculator.component.html | 44 ++++++++++ .../calculator/calculator.component.scss | 3 + .../calculator/calculator.component.ts | 85 +++++++++++++++++++ .../svg-images/svg-images.component.html | 3 + frontend/src/app/shared/shared.module.ts | 4 +- 6 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 frontend/src/app/components/calculator/calculator.component.html create mode 100644 frontend/src/app/components/calculator/calculator.component.scss create mode 100644 frontend/src/app/components/calculator/calculator.component.ts diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index 7a9b53ed0..c7982b75f 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -22,6 +22,7 @@ import { AssetsFeaturedComponent } from './components/assets/assets-featured/ass import { AssetsComponent } from './components/assets/assets.component'; import { AssetComponent } from './components/asset/asset.component'; import { AssetsNavComponent } from './components/assets/assets-nav/assets-nav.component'; +import { CalculatorComponent } from './components/calculator/calculator.component'; const browserWindow = window || {}; // @ts-ignore @@ -278,6 +279,10 @@ let routes: Routes = [ path: 'rbf', component: RbfList, }, + { + path: 'calculator', + component: CalculatorComponent + }, { path: 'terms-of-service', component: TermsOfServiceComponent diff --git a/frontend/src/app/components/calculator/calculator.component.html b/frontend/src/app/components/calculator/calculator.component.html new file mode 100644 index 000000000..62026566f --- /dev/null +++ b/frontend/src/app/components/calculator/calculator.component.html @@ -0,0 +1,44 @@ +
    +
    +

    Calculator

    +
    + +
    +
    + + +
    +
    + {{ currency$ | async }} +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + + +
    +
    + + +
    + Waiting for price feed... +
    +
    + +
    \ No newline at end of file diff --git a/frontend/src/app/components/calculator/calculator.component.scss b/frontend/src/app/components/calculator/calculator.component.scss new file mode 100644 index 000000000..bc3ca2665 --- /dev/null +++ b/frontend/src/app/components/calculator/calculator.component.scss @@ -0,0 +1,3 @@ +.input-group-text { + width: 75px; +} diff --git a/frontend/src/app/components/calculator/calculator.component.ts b/frontend/src/app/components/calculator/calculator.component.ts new file mode 100644 index 000000000..f857bbd8c --- /dev/null +++ b/frontend/src/app/components/calculator/calculator.component.ts @@ -0,0 +1,85 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { combineLatest, Observable } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; +import { Price, PriceService } from '../../services/price.service'; +import { StateService } from '../../services/state.service'; +import { WebsocketService } from '../../services/websocket.service'; + +@Component({ + selector: 'app-calculator', + templateUrl: './calculator.component.html', + styleUrls: ['./calculator.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CalculatorComponent implements OnInit { + satoshis = 10000; + form: FormGroup; + + currency: string; + currency$ = this.stateService.fiatCurrency$; + mainSubscription$: Observable; + price$: Observable; + + constructor( + private priceService: PriceService, + private stateService: StateService, + private formBuilder: FormBuilder, + private websocketService: WebsocketService, + ) { } + + ngOnInit(): void { + this.form = this.formBuilder.group({ + fiat: [0], + bitcoin: [0], + satoshis: [0], + }); + + this.price$ = this.currency$.pipe( + switchMap((currency) => { + this.currency = currency; + return this.stateService.conversions$.asObservable(); + }), + map((conversions) => { + return conversions[this.currency]; + }) + ); + + combineLatest([ + this.price$, + this.form.get('fiat').valueChanges + ]).subscribe(([price, value]) => { + value = parseFloat(value.replace(',', '.')); + value = value || 0; + const rate = (value / price).toFixed(8); + const satsRate = Math.round(value / price * 100_000_000); + this.form.get('bitcoin').setValue(rate, { emitEvent: false }); + this.form.get('satoshis').setValue(satsRate, { emitEvent: false } ); + }); + + combineLatest([ + this.price$, + this.form.get('bitcoin').valueChanges + ]).subscribe(([price, value]) => { + value = parseFloat(value.replace(',', '.')); + value = value || 0; + const rate = parseFloat((value * price).toFixed(8)); + this.form.get('fiat').setValue(rate, { emitEvent: false } ); + this.form.get('satoshis').setValue(Math.round(value * 100_000_000), { emitEvent: false } ); + }); + + combineLatest([ + this.price$, + this.form.get('satoshis').valueChanges + ]).subscribe(([price, value]) => { + value = parseFloat(value.replace(',', '.')); + value = value || 0; + const rate = parseFloat((value / 100_000_000 * price).toFixed(8)); + const bitcoinRate = (value / 100_000_000).toFixed(8); + this.form.get('fiat').setValue(rate, { emitEvent: false } ); + this.form.get('bitcoin').setValue(bitcoinRate, { emitEvent: false }); + }); + + } + +} diff --git a/frontend/src/app/components/svg-images/svg-images.component.html b/frontend/src/app/components/svg-images/svg-images.component.html index c4d5296bd..1c3a8bc2d 100644 --- a/frontend/src/app/components/svg-images/svg-images.component.html +++ b/frontend/src/app/components/svg-images/svg-images.component.html @@ -74,6 +74,9 @@ + + + diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 9cf780116..4a114faa7 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -97,6 +97,7 @@ import { MempoolBlockOverviewComponent } from '../components/mempool-block-overv import { ClockchainComponent } from '../components/clockchain/clockchain.component'; import { ClockFaceComponent } from '../components/clock-face/clock-face.component'; import { ClockComponent } from '../components/clock/clock.component'; +import { CalculatorComponent } from '../components/calculator/calculator.component'; import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-directives/weight-directives'; @@ -185,12 +186,11 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir GeolocationComponent, TestnetAlertComponent, GlobalFooterComponent, - + CalculatorComponent, MempoolBlockOverviewComponent, ClockchainComponent, ClockComponent, ClockFaceComponent, - OnlyVsizeDirective, OnlyWeightDirective ], From 120c27d120ba28611e9b12e008a0054b9ee4c4eb Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 18 Jun 2023 00:16:47 +0200 Subject: [PATCH 590/782] Calculator visual results --- frontend/src/app/app-routing.module.ts | 2 +- .../calculator/calculator.component.html | 41 +++++++++++++---- .../calculator/calculator.component.scss | 18 ++++++++ .../calculator/calculator.component.ts | 44 +++++++++++++------ .../app/shared/pipes/bitcoinsatoshis.pipe.ts | 28 ++++++++++++ frontend/src/app/shared/shared.module.ts | 5 ++- 6 files changed, 115 insertions(+), 23 deletions(-) create mode 100644 frontend/src/app/shared/pipes/bitcoinsatoshis.pipe.ts diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index c7982b75f..79a8e1c02 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -280,7 +280,7 @@ let routes: Routes = [ component: RbfList, }, { - path: 'calculator', + path: 'tools/calculator', component: CalculatorComponent }, { diff --git a/frontend/src/app/components/calculator/calculator.component.html b/frontend/src/app/components/calculator/calculator.component.html index 62026566f..da8e77e79 100644 --- a/frontend/src/app/components/calculator/calculator.component.html +++ b/frontend/src/app/components/calculator/calculator.component.html @@ -3,37 +3,62 @@

    Calculator

    -
    -
    + + +
    {{ currency$ | async }}
    - +
    - +
    - +
    - +
    - +
    -
    + +
    + +
    +
    + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + Fiat price last updated +
    +
    + + +
    diff --git a/frontend/src/app/components/calculator/calculator.component.scss b/frontend/src/app/components/calculator/calculator.component.scss index bc3ca2665..649af4934 100644 --- a/frontend/src/app/components/calculator/calculator.component.scss +++ b/frontend/src/app/components/calculator/calculator.component.scss @@ -1,3 +1,21 @@ .input-group-text { width: 75px; } + +.bitcoin-satoshis-text { + font-size: 40px; +} + +.fiat-text { + font-size: 24px; +} + +.symbol { + font-style: italic; +} + +@media (max-width: 767.98px) { + .bitcoin-satoshis-text { + font-size: 30px; + } +} \ No newline at end of file diff --git a/frontend/src/app/components/calculator/calculator.component.ts b/frontend/src/app/components/calculator/calculator.component.ts index f857bbd8c..838afbbd4 100644 --- a/frontend/src/app/components/calculator/calculator.component.ts +++ b/frontend/src/app/components/calculator/calculator.component.ts @@ -2,7 +2,6 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup } from '@angular/forms'; import { combineLatest, Observable } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; -import { Price, PriceService } from '../../services/price.service'; import { StateService } from '../../services/state.service'; import { WebsocketService } from '../../services/websocket.service'; @@ -16,13 +15,11 @@ export class CalculatorComponent implements OnInit { satoshis = 10000; form: FormGroup; - currency: string; currency$ = this.stateService.fiatCurrency$; - mainSubscription$: Observable; price$: Observable; + lastFiatPrice$: Observable; constructor( - private priceService: PriceService, private stateService: StateService, private formBuilder: FormBuilder, private websocketService: WebsocketService, @@ -35,13 +32,19 @@ export class CalculatorComponent implements OnInit { satoshis: [0], }); + this.lastFiatPrice$ = this.stateService.conversions$.asObservable() + .pipe( + map((conversions) => conversions.time) + ); + + let currency; this.price$ = this.currency$.pipe( - switchMap((currency) => { - this.currency = currency; + switchMap((result) => { + currency = result; return this.stateService.conversions$.asObservable(); }), map((conversions) => { - return conversions[this.currency]; + return conversions[currency]; }) ); @@ -49,8 +52,6 @@ export class CalculatorComponent implements OnInit { this.price$, this.form.get('fiat').valueChanges ]).subscribe(([price, value]) => { - value = parseFloat(value.replace(',', '.')); - value = value || 0; const rate = (value / price).toFixed(8); const satsRate = Math.round(value / price * 100_000_000); this.form.get('bitcoin').setValue(rate, { emitEvent: false }); @@ -61,8 +62,6 @@ export class CalculatorComponent implements OnInit { this.price$, this.form.get('bitcoin').valueChanges ]).subscribe(([price, value]) => { - value = parseFloat(value.replace(',', '.')); - value = value || 0; const rate = parseFloat((value * price).toFixed(8)); this.form.get('fiat').setValue(rate, { emitEvent: false } ); this.form.get('satoshis').setValue(Math.round(value * 100_000_000), { emitEvent: false } ); @@ -72,8 +71,6 @@ export class CalculatorComponent implements OnInit { this.price$, this.form.get('satoshis').valueChanges ]).subscribe(([price, value]) => { - value = parseFloat(value.replace(',', '.')); - value = value || 0; const rate = parseFloat((value / 100_000_000 * price).toFixed(8)); const bitcoinRate = (value / 100_000_000).toFixed(8); this.form.get('fiat').setValue(rate, { emitEvent: false } ); @@ -82,4 +79,25 @@ export class CalculatorComponent implements OnInit { } + transformInput(name: string): void { + const formControl = this.form.get(name); + if (!formControl.value) { + return formControl.setValue('', {emitEvent: false}); + } + let value = formControl.value.replace(',', '.').replace(/[^0-9.]/g, ''); + if (value === '.') { + value = '0'; + } + const sanitizedValue = this.removeExtraDots(value); + formControl.setValue(sanitizedValue, {emitEvent: true}); + } + + removeExtraDots(str: string): string { + const [beforeDot, afterDot] = str.split('.', 2); + if (afterDot === undefined) { + return str; + } + const afterDotReplaced = afterDot.replace(/\./g, ''); + return `${beforeDot}.${afterDotReplaced}`; + } } diff --git a/frontend/src/app/shared/pipes/bitcoinsatoshis.pipe.ts b/frontend/src/app/shared/pipes/bitcoinsatoshis.pipe.ts new file mode 100644 index 000000000..7065b5138 --- /dev/null +++ b/frontend/src/app/shared/pipes/bitcoinsatoshis.pipe.ts @@ -0,0 +1,28 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; + +@Pipe({ + name: 'bitcoinsatoshis' +}) +export class BitcoinsatoshisPipe implements PipeTransform { + + constructor(private sanitizer: DomSanitizer) { } + + transform(value: string): SafeHtml { + const newValue = this.insertSpaces(parseFloat(value || '0').toFixed(8)); + const position = (newValue || '0').search(/[1-9]/); + + const firstPart = newValue.slice(0, position); + const secondPart = newValue.slice(position); + + return this.sanitizer.bypassSecurityTrustHtml( + `${firstPart}${secondPart}` + ); + } + + insertSpaces(str: string): string { + const length = str.length; + return str.slice(0, length - 6) + ' ' + str.slice(length - 6, length - 3) + ' ' + str.slice(length - 3); + } + +} diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index 4a114faa7..c06b1dc8f 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -98,6 +98,7 @@ import { ClockchainComponent } from '../components/clockchain/clockchain.compone import { ClockFaceComponent } from '../components/clock-face/clock-face.component'; import { ClockComponent } from '../components/clock/clock.component'; import { CalculatorComponent } from '../components/calculator/calculator.component'; +import { BitcoinsatoshisPipe } from '../shared/pipes/bitcoinsatoshis.pipe'; import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-directives/weight-directives'; @@ -190,9 +191,11 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir MempoolBlockOverviewComponent, ClockchainComponent, ClockComponent, + CalculatorComponent, ClockFaceComponent, OnlyVsizeDirective, - OnlyWeightDirective + OnlyWeightDirective, + BitcoinsatoshisPipe ], imports: [ CommonModule, From 98be07f5efd4ff622c1b74647cde7ef324e6e242 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 18 Jun 2023 02:09:06 +0200 Subject: [PATCH 591/782] Removing logos --- .../app/components/calculator/calculator.component.html | 8 ++++---- .../app/components/calculator/calculator.component.scss | 4 ++++ .../app/components/svg-images/svg-images.component.html | 3 --- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/components/calculator/calculator.component.html b/frontend/src/app/components/calculator/calculator.component.html index da8e77e79..df2146760 100644 --- a/frontend/src/app/components/calculator/calculator.component.html +++ b/frontend/src/app/components/calculator/calculator.component.html @@ -18,7 +18,7 @@
    - + BTC
    @@ -26,7 +26,7 @@
    - + sats
    @@ -39,9 +39,9 @@
    - + ₿ - + sats
    diff --git a/frontend/src/app/components/calculator/calculator.component.scss b/frontend/src/app/components/calculator/calculator.component.scss index 649af4934..c9d608455 100644 --- a/frontend/src/app/components/calculator/calculator.component.scss +++ b/frontend/src/app/components/calculator/calculator.component.scss @@ -18,4 +18,8 @@ .bitcoin-satoshis-text { font-size: 30px; } +} + +.sats { + font-size: 25px; } \ No newline at end of file diff --git a/frontend/src/app/components/svg-images/svg-images.component.html b/frontend/src/app/components/svg-images/svg-images.component.html index 1c3a8bc2d..c4d5296bd 100644 --- a/frontend/src/app/components/svg-images/svg-images.component.html +++ b/frontend/src/app/components/svg-images/svg-images.component.html @@ -74,9 +74,6 @@ - - - From 23dffb4ca27d595809e6003b88545be0a87a16cb Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 18 Jun 2023 18:04:32 +0200 Subject: [PATCH 592/782] Slight margin fix --- .../src/app/components/calculator/calculator.component.scss | 3 ++- frontend/src/app/shared/shared.module.ts | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/components/calculator/calculator.component.scss b/frontend/src/app/components/calculator/calculator.component.scss index c9d608455..5c0cbb5b1 100644 --- a/frontend/src/app/components/calculator/calculator.component.scss +++ b/frontend/src/app/components/calculator/calculator.component.scss @@ -21,5 +21,6 @@ } .sats { - font-size: 25px; + font-size: 20px; + margin-left: 5px; } \ No newline at end of file diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts index c06b1dc8f..d56986107 100644 --- a/frontend/src/app/shared/shared.module.ts +++ b/frontend/src/app/shared/shared.module.ts @@ -188,14 +188,13 @@ import { OnlyVsizeDirective, OnlyWeightDirective } from './components/weight-dir TestnetAlertComponent, GlobalFooterComponent, CalculatorComponent, + BitcoinsatoshisPipe, MempoolBlockOverviewComponent, ClockchainComponent, ClockComponent, - CalculatorComponent, ClockFaceComponent, OnlyVsizeDirective, - OnlyWeightDirective, - BitcoinsatoshisPipe + OnlyWeightDirective ], imports: [ CommonModule, From 9ffd4cc38d804cb498c422c9c481760e99fec4e3 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 15 Jul 2023 12:18:55 +0900 Subject: [PATCH 593/782] Calculator mobile margin --- .../src/app/components/calculator/calculator.component.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/calculator/calculator.component.scss b/frontend/src/app/components/calculator/calculator.component.scss index 5c0cbb5b1..81f74f9ee 100644 --- a/frontend/src/app/components/calculator/calculator.component.scss +++ b/frontend/src/app/components/calculator/calculator.component.scss @@ -23,4 +23,8 @@ .sats { font-size: 20px; margin-left: 5px; -} \ No newline at end of file +} + +.row { + margin: auto; +} From 992196c91f7600578c079eefeaa77eead08e2a51 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sat, 15 Jul 2023 15:09:41 +0900 Subject: [PATCH 594/782] Calculator validation improvements --- .../calculator/calculator.component.ts | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/calculator/calculator.component.ts b/frontend/src/app/components/calculator/calculator.component.ts index 838afbbd4..d99302f40 100644 --- a/frontend/src/app/components/calculator/calculator.component.ts +++ b/frontend/src/app/components/calculator/calculator.component.ts @@ -54,6 +54,9 @@ export class CalculatorComponent implements OnInit { ]).subscribe(([price, value]) => { const rate = (value / price).toFixed(8); const satsRate = Math.round(value / price * 100_000_000); + if (isNaN(value)) { + return; + } this.form.get('bitcoin').setValue(rate, { emitEvent: false }); this.form.get('satoshis').setValue(satsRate, { emitEvent: false } ); }); @@ -63,6 +66,9 @@ export class CalculatorComponent implements OnInit { this.form.get('bitcoin').valueChanges ]).subscribe(([price, value]) => { const rate = parseFloat((value * price).toFixed(8)); + if (isNaN(value)) { + return; + } this.form.get('fiat').setValue(rate, { emitEvent: false } ); this.form.get('satoshis').setValue(Math.round(value * 100_000_000), { emitEvent: false } ); }); @@ -73,6 +79,9 @@ export class CalculatorComponent implements OnInit { ]).subscribe(([price, value]) => { const rate = parseFloat((value / 100_000_000 * price).toFixed(8)); const bitcoinRate = (value / 100_000_000).toFixed(8); + if (isNaN(value)) { + return; + } this.form.get('fiat').setValue(rate, { emitEvent: false } ); this.form.get('bitcoin').setValue(bitcoinRate, { emitEvent: false }); }); @@ -88,7 +97,16 @@ export class CalculatorComponent implements OnInit { if (value === '.') { value = '0'; } - const sanitizedValue = this.removeExtraDots(value); + let sanitizedValue = this.removeExtraDots(value); + if (name === 'bitcoin' && this.countDecimals(sanitizedValue) > 8) { + sanitizedValue = this.toFixedWithoutRounding(sanitizedValue, 8); + } + if (sanitizedValue === '') { + sanitizedValue = '0'; + } + if (name === 'satoshis') { + sanitizedValue = parseFloat(sanitizedValue).toFixed(0); + } formControl.setValue(sanitizedValue, {emitEvent: true}); } @@ -100,4 +118,16 @@ export class CalculatorComponent implements OnInit { const afterDotReplaced = afterDot.replace(/\./g, ''); return `${beforeDot}.${afterDotReplaced}`; } + + countDecimals(numberString: string): number { + const decimalPos = numberString.indexOf('.'); + if (decimalPos === -1) return 0; + return numberString.length - decimalPos - 1; + } + + toFixedWithoutRounding(numStr: string, fixed: number): string { + const re = new RegExp(`^-?\\d+(?:.\\d{0,${(fixed || -1)}})?`); + const result = numStr.match(re); + return result ? result[0] : numStr; + } } From a372b479b4bb3f1fa37a2bb82d82f3cf746bba6a Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 15 Jul 2023 16:26:25 +0900 Subject: [PATCH 595/782] [network selector] improve align --- .../bisq-master-page/bisq-master-page.component.html | 4 ++-- .../liquid-master-page/liquid-master-page.component.html | 4 ++-- .../src/app/components/master-page/master-page.component.html | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html index c1280efa1..010723125 100644 --- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html +++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html @@ -40,8 +40,8 @@
    + diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 0d733ff6b..4be6e3aff 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -370,7 +370,11 @@ export class BlockComponent implements OnInit, OnDestroy { tx.status = 'found'; } else { if (isFresh[tx.txid]) { - tx.status = 'fresh'; + if (tx.rate - (tx.fee / tx.vsize) >= 0.1) { + tx.status = 'freshcpfp'; + } else { + tx.status = 'fresh'; + } } else if (isSigop[tx.txid]) { tx.status = 'sigop'; } else if (isFullRbf[tx.txid]) { diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 7a8ab3f06..ad97d5f3d 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -173,7 +173,8 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected' | 'fullrbf'; + rate?: number; // effective fee rate + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'fullrbf'; context?: 'projected' | 'actual'; } diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 991fe2680..15d97fa8d 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -89,7 +89,7 @@ export interface TransactionStripped { vsize: number; value: number; rate?: number; // effective fee rate - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'added' | 'censored' | 'selected' | 'fullrbf'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'fullrbf'; context?: 'projected' | 'actual'; } From 2d4bc9dbd6d5082097f4dfdac3d03e46543df629 Mon Sep 17 00:00:00 2001 From: wiz Date: Sun, 16 Jul 2023 17:50:36 +0900 Subject: [PATCH 601/782] ops: Move electrs scripts to mempool/electrs repo --- production/electrs-start-liquid | 24 ------------------ production/electrs-start-liquidtestnet | 24 ------------------ production/electrs-start-mainnet | 22 ---------------- production/electrs-start-signet | 23 ----------------- production/electrs-start-testnet | 23 ----------------- production/install | 35 +++----------------------- 6 files changed, 3 insertions(+), 148 deletions(-) delete mode 100755 production/electrs-start-liquid delete mode 100755 production/electrs-start-liquidtestnet delete mode 100755 production/electrs-start-mainnet delete mode 100755 production/electrs-start-signet delete mode 100755 production/electrs-start-testnet diff --git a/production/electrs-start-liquid b/production/electrs-start-liquid deleted file mode 100755 index a28135836..000000000 --- a/production/electrs-start-liquid +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env zsh -cd "${HOME}/electrs" -#source "${HOME}/.cargo/env" -#export PATH="${HOME}/.cargo/bin:${PATH}" - -until false -do - cargo run \ - --release \ - --features liquid \ - --bin electrs \ - -- \ - -vvv \ - --asset-db-path "${HOME}/asset_registry_db" \ - --address-search \ - --cors '*' \ - --db-dir __ELECTRS_DATA_ROOT__ \ - --network liquid \ - --daemon-dir "${HOME}" \ - --http-socket-file '/elements/socket/esplora-liquid-mainnet' \ - --cookie '__ELEMENTS_RPC_USER__:__ELEMENTS_RPC_PASS__' \ - --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" - sleep 1 -done diff --git a/production/electrs-start-liquidtestnet b/production/electrs-start-liquidtestnet deleted file mode 100755 index 828e96533..000000000 --- a/production/electrs-start-liquidtestnet +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/local/bin/zsh -cd "${HOME}/electrs" -#source "${HOME}/.cargo/env" -#export PATH="${HOME}/.cargo/bin:${PATH}" - -until false -do - cargo run \ - --release \ - --features liquid \ - --bin electrs \ - -- \ - -vv \ - --asset-db-path "${HOME}/asset_registry_testnet_db" \ - --address-search \ - --cors '*' \ - --db-dir __ELECTRS_DATA_ROOT__ \ - --network liquidtestnet \ - --daemon-dir "${HOME}" \ - --http-socket-file '/elements/socket/esplora-liquid-testnet' \ - --cookie '__ELEMENTS_RPC_USER__:__ELEMENTS_RPC_PASS__' \ - --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" - sleep 1 -done diff --git a/production/electrs-start-mainnet b/production/electrs-start-mainnet deleted file mode 100755 index c6a8c4d54..000000000 --- a/production/electrs-start-mainnet +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env zsh -cd "${HOME}/electrs" -#source "${HOME}/.cargo/env" -#export PATH="${HOME}/.cargo/bin:${PATH}" - -until false -do - cargo run \ - --release \ - --bin electrs \ - -- \ - -vvvv \ - --address-search \ - --cors '*' \ - --db-dir __ELECTRS_DATA_ROOT__ \ - --daemon-dir "${HOME}" \ - --http-socket-file '/bitcoin/socket/esplora-bitcoin-mainnet' \ - --cookie '__BITCOIN_RPC_USER__:__BITCOIN_RPC_PASS__' \ - --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" - - sleep 3 -done diff --git a/production/electrs-start-signet b/production/electrs-start-signet deleted file mode 100755 index 40e1d1115..000000000 --- a/production/electrs-start-signet +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env zsh -cd "${HOME}/electrs" -#source "${HOME}/.cargo/env" -#export PATH="${HOME}/.cargo/bin:${PATH}" - -until false -do - cargo run \ - --release \ - --bin electrs \ - -- \ - -vv \ - --network signet \ - --address-search \ - --cors '*' \ - --db-dir __ELECTRS_DATA_ROOT__ \ - --daemon-rpc-addr '127.0.0.1:38332' \ - --daemon-dir "${HOME}" \ - --http-socket-file '/bitcoin/socket/esplora-bitcoin-signet' \ - --cookie '__BITCOIN_RPC_USER__:__BITCOIN_RPC_PASS__' \ - --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" - sleep 1 -done diff --git a/production/electrs-start-testnet b/production/electrs-start-testnet deleted file mode 100755 index ce05de2de..000000000 --- a/production/electrs-start-testnet +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env zsh -cd "${HOME}/electrs" -#source $HOME/.cargo/env -#export PATH=$HOME/.cargo/bin:$PATH - -until false -do - cargo run \ - --release \ - --bin electrs \ - -- \ - -vvvv \ - --network testnet \ - --address-search \ - --cors '*' \ - --db-dir __ELECTRS_DATA_ROOT__ \ - --daemon-dir "${HOME}" \ - --http-socket-file '/bitcoin/socket/esplora-bitcoin-testnet' \ - --cookie '__BITCOIN_RPC_USER__:__BITCOIN_RPC_PASS__' \ - --precache-scripts "${HOME}/electrs/contrib/popular-scripts.txt" - - sleep 3 -done diff --git a/production/install b/production/install index 1121f5b4f..05b868ba0 100755 --- a/production/install +++ b/production/install @@ -1600,15 +1600,8 @@ fi ######################################## # Electrs instance for Bitcoin Mainnet # ######################################## - if [ "${BITCOIN_MAINNET_ENABLE}" = ON ];then - echo "[*] Installing Bitcoin Mainnet electrs start script" - osSudo "${ROOT_USER}" install -c -o "${BITCOIN_USER}" -g "${BITCOIN_GROUP}" -m 755 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/electrs-start-mainnet" "${BITCOIN_ELECTRS_HOME}" - - echo "[*] Configuring Bitcoin Mainnet RPC credentials in electrs start script" - osSudo "${ROOT_USER}" sed -i.orig "s/__BITCOIN_RPC_USER__/${BITCOIN_RPC_USER}/" "${BITCOIN_ELECTRS_HOME}/electrs-start-mainnet" - osSudo "${ROOT_USER}" sed -i.orig "s/__BITCOIN_RPC_PASS__/${BITCOIN_RPC_PASS}/" "${BITCOIN_ELECTRS_HOME}/electrs-start-mainnet" - osSudo "${ROOT_USER}" sed -i.orig "s!__ELECTRS_DATA_ROOT__!${ELECTRS_DATA_ROOT}!" "${BITCOIN_ELECTRS_HOME}/electrs-start-mainnet" + echo "[*] FIXME: must only crontab enabled daemons" fi ######################################## @@ -1616,13 +1609,7 @@ fi ######################################## if [ "${BITCOIN_TESTNET_ENABLE}" = ON ];then - echo "[*] Installing Bitcoin Testnet electrs start script" - osSudo "${ROOT_USER}" install -c -o "${BITCOIN_USER}" -g "${BITCOIN_GROUP}" -m 755 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/electrs-start-testnet" "${BITCOIN_ELECTRS_HOME}" - - echo "[*] Configuring Bitcoin Testnet RPC credentials in electrs start script" - osSudo "${ROOT_USER}" sed -i.orig "s/__BITCOIN_RPC_USER__/${BITCOIN_RPC_USER}/" "${BITCOIN_ELECTRS_HOME}/electrs-start-testnet" - osSudo "${ROOT_USER}" sed -i.orig "s/__BITCOIN_RPC_PASS__/${BITCOIN_RPC_PASS}/" "${BITCOIN_ELECTRS_HOME}/electrs-start-testnet" - osSudo "${ROOT_USER}" sed -i.orig "s!__ELECTRS_DATA_ROOT__!${ELECTRS_DATA_ROOT}!" "${BITCOIN_ELECTRS_HOME}/electrs-start-testnet" + echo "[*] FIXME: must only crontab enabled daemons" fi ####################################### @@ -1630,13 +1617,7 @@ fi ####################################### if [ "${BITCOIN_SIGNET_ENABLE}" = ON ];then - echo "[*] Installing Bitcoin Signet electrs start script" - osSudo "${ROOT_USER}" install -c -o "${BITCOIN_USER}" -g "${BITCOIN_GROUP}" -m 755 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/electrs-start-signet" "${BITCOIN_ELECTRS_HOME}" - - echo "[*] Configuring Bitcoin Signet RPC credentials in electrs start script" - osSudo "${ROOT_USER}" sed -i.orig "s/__BITCOIN_RPC_USER__/${BITCOIN_RPC_USER}/" "${BITCOIN_ELECTRS_HOME}/electrs-start-signet" - osSudo "${ROOT_USER}" sed -i.orig "s/__BITCOIN_RPC_PASS__/${BITCOIN_RPC_PASS}/" "${BITCOIN_ELECTRS_HOME}/electrs-start-signet" - osSudo "${ROOT_USER}" sed -i.orig "s!__ELECTRS_DATA_ROOT__!${ELECTRS_DATA_ROOT}!" "${BITCOIN_ELECTRS_HOME}/electrs-start-signet" + echo "[*] FIXME: must only crontab enabled daemons" fi ######################################## @@ -1644,21 +1625,12 @@ fi ######################################## if [ "${ELEMENTS_LIQUID_ENABLE}" = ON ];then - echo "[*] Installing Elements Liquid electrs start script" - osSudo "${ROOT_USER}" install -c -o "${ELEMENTS_USER}" -g "${ELEMENTS_GROUP}" -m 755 "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/electrs-start-liquid" "${ELEMENTS_ELECTRS_HOME}" - echo "[*] Installing Elements crontab" case $OS in FreeBSD) - echo "[*] FIXME: must only crontab enabled daemons" osSudo "${ROOT_USER}" crontab -u "${ELEMENTS_USER}" "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/elements.crontab" ;; esac - - echo "[*] Configuring Elements Liquid RPC credentials in electrs start script" - osSudo "${ROOT_USER}" sed -i.orig "s/__ELEMENTS_RPC_USER__/${ELEMENTS_RPC_USER}/" "${ELEMENTS_ELECTRS_HOME}/electrs-start-liquid" - osSudo "${ROOT_USER}" sed -i.orig "s/__ELEMENTS_RPC_PASS__/${ELEMENTS_RPC_PASS}/" "${ELEMENTS_ELECTRS_HOME}/electrs-start-liquid" - osSudo "${ROOT_USER}" sed -i.orig "s!__ELECTRS_DATA_ROOT__!${ELECTRS_DATA_ROOT}!" "${ELEMENTS_ELECTRS_HOME}/electrs-start-liquid" fi ################################################ @@ -1687,7 +1659,6 @@ fi echo "[*] Installing crontabs" case $OS in FreeBSD) - echo "[*] FIXME: must only crontab enabled daemons" osSudo "${ROOT_USER}" crontab -u "${BITCOIN_USER}" "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/bitcoin.crontab" osSudo "${ROOT_USER}" crontab -u "${MINFEE_USER}" "${MEMPOOL_HOME}/${MEMPOOL_REPO_NAME}/production/minfee.crontab" ;; From 1f003cc2923123846d260e547dba70dad788bd59 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Jul 2023 11:06:51 +0200 Subject: [PATCH 602/782] [lightning] save node features as stringified json array in db --- backend/src/api/database-migration.ts | 7 +- backend/src/api/explorer/nodes.api.ts | 17 ++- .../clightning/clightning-convert.ts | 112 +++++++++++++++++- .../tasks/lightning/network-sync.service.ts | 1 - backend/src/utils/format.ts | 33 ++++++ 5 files changed, 164 insertions(+), 6 deletions(-) diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index a9266a016..7c7608aff 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository'; import { RowDataPacket } from 'mysql2'; class DatabaseMigration { - private static currentVersion = 63; + private static currentVersion = 64; private queryTimeout = 3600_000; private statisticsAddedIndexed = false; private uniqueLogs: string[] = []; @@ -543,6 +543,11 @@ class DatabaseMigration { await this.$executeQuery('ALTER TABLE `blocks_audits` ADD fullrbf_txs JSON DEFAULT "[]"'); await this.updateToSchemaVersion(63); } + + if (databaseSchemaVersion < 64 && isBitcoin === true) { + await this.$executeQuery('ALTER TABLE `nodes` ADD features text NULL'); + await this.updateToSchemaVersion(64); + } } /** diff --git a/backend/src/api/explorer/nodes.api.ts b/backend/src/api/explorer/nodes.api.ts index d429299e1..f5c87fbd1 100644 --- a/backend/src/api/explorer/nodes.api.ts +++ b/backend/src/api/explorer/nodes.api.ts @@ -656,10 +656,19 @@ class NodesApi { alias_search, color, sockets, - status + status, + features ) - VALUES (?, NOW(), FROM_UNIXTIME(?), ?, ?, ?, ?, 1) - ON DUPLICATE KEY UPDATE updated_at = FROM_UNIXTIME(?), alias = ?, alias_search = ?, color = ?, sockets = ?, status = 1`; + VALUES (?, NOW(), FROM_UNIXTIME(?), ?, ?, ?, ?, 1, ?) + ON DUPLICATE KEY UPDATE + updated_at = FROM_UNIXTIME(?), + alias = ?, + alias_search = ?, + color = ?, + sockets = ?, + status = 1, + features = ? + `; await DB.query(query, [ node.pub_key, @@ -668,11 +677,13 @@ class NodesApi { this.aliasToSearchText(node.alias), node.color, sockets, + JSON.stringify(node.features), node.last_update, node.alias, this.aliasToSearchText(node.alias), node.color, sockets, + JSON.stringify(node.features), ]); } catch (e) { logger.err('$saveNode() error: ' + (e instanceof Error ? e.message : e)); diff --git a/backend/src/api/lightning/clightning/clightning-convert.ts b/backend/src/api/lightning/clightning/clightning-convert.ts index 084965383..75296ded2 100644 --- a/backend/src/api/lightning/clightning/clightning-convert.ts +++ b/backend/src/api/lightning/clightning/clightning-convert.ts @@ -2,8 +2,94 @@ import { ILightningApi } from '../lightning-api.interface'; import FundingTxFetcher from '../../../tasks/lightning/sync-tasks/funding-tx-fetcher'; import logger from '../../../logger'; import { Common } from '../../common'; +import { hex2bin } from '../../../utils/format'; import config from '../../../config'; +// https://github.com/lightningnetwork/lnd/blob/master/lnwire/features.go +enum FeatureBits { + DataLossProtectRequired = 0, + DataLossProtectOptional = 1, + InitialRoutingSync = 3, + UpfrontShutdownScriptRequired = 4, + UpfrontShutdownScriptOptional = 5, + GossipQueriesRequired = 6, + GossipQueriesOptional = 7, + TLVOnionPayloadRequired = 8, + TLVOnionPayloadOptional = 9, + StaticRemoteKeyRequired = 12, + StaticRemoteKeyOptional = 13, + PaymentAddrRequired = 14, + PaymentAddrOptional = 15, + MPPRequired = 16, + MPPOptional = 17, + WumboChannelsRequired = 18, + WumboChannelsOptional = 19, + AnchorsRequired = 20, + AnchorsOptional = 21, + AnchorsZeroFeeHtlcTxRequired = 22, + AnchorsZeroFeeHtlcTxOptional = 23, + ShutdownAnySegwitRequired = 26, + ShutdownAnySegwitOptional = 27, + AMPRequired = 30, + AMPOptional = 31, + ExplicitChannelTypeRequired = 44, + ExplicitChannelTypeOptional = 45, + ScidAliasRequired = 46, + ScidAliasOptional = 47, + PaymentMetadataRequired = 48, + PaymentMetadataOptional = 49, + ZeroConfRequired = 50, + ZeroConfOptional = 51, + KeysendRequired = 54, + KeysendOptional = 55, + ScriptEnforcedLeaseRequired = 2022, + ScriptEnforcedLeaseOptional = 2023, + MaxBolt11Feature = 5114, +}; + +// Features is a mapping of known feature bits to a descriptive name. All known +// feature bits must be assigned a name in this mapping, and feature bit pairs +// must be assigned together for correct behavior. +const FeaturesMap = new Map([ + [FeatureBits.DataLossProtectRequired, 'data-loss-protect'], + [FeatureBits.DataLossProtectOptional, 'data-loss-protect'], + [FeatureBits.InitialRoutingSync, 'initial-routing-sync'], + [FeatureBits.UpfrontShutdownScriptRequired, 'upfront-shutdown-script'], + [FeatureBits.UpfrontShutdownScriptOptional, 'upfront-shutdown-script'], + [FeatureBits.GossipQueriesRequired, 'gossip-queries'], + [FeatureBits.GossipQueriesOptional, 'gossip-queries'], + [FeatureBits.TLVOnionPayloadRequired, 'tlv-onion'], + [FeatureBits.TLVOnionPayloadOptional, 'tlv-onion'], + [FeatureBits.StaticRemoteKeyOptional, 'static-remote-key'], + [FeatureBits.StaticRemoteKeyRequired, 'static-remote-key'], + [FeatureBits.PaymentAddrOptional, 'payment-addr'], + [FeatureBits.PaymentAddrRequired, 'payment-addr'], + [FeatureBits.MPPOptional, 'multi-path-payments'], + [FeatureBits.MPPRequired, 'multi-path-payments'], + [FeatureBits.AnchorsRequired, 'anchor-commitments'], + [FeatureBits.AnchorsOptional, 'anchor-commitments'], + [FeatureBits.AnchorsZeroFeeHtlcTxRequired, 'anchors-zero-fee-htlc-tx'], + [FeatureBits.AnchorsZeroFeeHtlcTxOptional, 'anchors-zero-fee-htlc-tx'], + [FeatureBits.WumboChannelsRequired, 'wumbo-channels'], + [FeatureBits.WumboChannelsOptional, 'wumbo-channels'], + [FeatureBits.AMPRequired, 'amp'], + [FeatureBits.AMPOptional, 'amp'], + [FeatureBits.PaymentMetadataOptional, 'payment-metadata'], + [FeatureBits.PaymentMetadataRequired, 'payment-metadata'], + [FeatureBits.ExplicitChannelTypeOptional, 'explicit-commitment-type'], + [FeatureBits.ExplicitChannelTypeRequired, 'explicit-commitment-type'], + [FeatureBits.KeysendOptional, 'keysend'], + [FeatureBits.KeysendRequired, 'keysend'], + [FeatureBits.ScriptEnforcedLeaseRequired, 'script-enforced-lease'], + [FeatureBits.ScriptEnforcedLeaseOptional, 'script-enforced-lease'], + [FeatureBits.ScidAliasRequired, 'scid-alias'], + [FeatureBits.ScidAliasOptional, 'scid-alias'], + [FeatureBits.ZeroConfRequired, 'zero-conf'], + [FeatureBits.ZeroConfOptional, 'zero-conf'], + [FeatureBits.ShutdownAnySegwitRequired, 'shutdown-any-segwit'], + [FeatureBits.ShutdownAnySegwitOptional, 'shutdown-any-segwit'], +]); + /** * Convert a clightning "listnode" entry to a lnd node entry */ @@ -17,10 +103,34 @@ export function convertNode(clNode: any): ILightningApi.Node { custom_records = undefined; } } + + const nodeFeatures: ILightningApi.Feature[] = []; + const nodeFeaturesBinary = hex2bin(clNode.features).split('').reverse().join(''); + + for (let i = 0; i < nodeFeaturesBinary.length; i++) { + if (nodeFeaturesBinary[i] === '0') { + continue; + } + const feature = FeaturesMap.get(i); + if (!feature) { + nodeFeatures.push({ + name: 'unknown', + is_required: i % 2 === 0, + is_known: false + }); + } else { + nodeFeatures.push({ + name: feature, + is_required: i % 2 === 0, + is_known: true + }); + } + } + return { alias: clNode.alias ?? '', color: `#${clNode.color ?? ''}`, - features: [], // TODO parse and return clNode.feature + features: nodeFeatures, pub_key: clNode.nodeid, addresses: clNode.addresses?.map((addr) => { let address = addr.address; diff --git a/backend/src/tasks/lightning/network-sync.service.ts b/backend/src/tasks/lightning/network-sync.service.ts index 6785b0e2d..963b9e8c2 100644 --- a/backend/src/tasks/lightning/network-sync.service.ts +++ b/backend/src/tasks/lightning/network-sync.service.ts @@ -3,7 +3,6 @@ import logger from '../../logger'; import channelsApi from '../../api/explorer/channels.api'; import bitcoinApi from '../../api/bitcoin/bitcoin-api-factory'; import config from '../../config'; -import { IEsploraApi } from '../../api/bitcoin/esplora-api.interface'; import { ILightningApi } from '../../api/lightning/lightning-api.interface'; import { $lookupNodeLocation } from './sync-tasks/node-locations'; import lightningApi from '../../api/lightning/lightning-api-factory'; diff --git a/backend/src/utils/format.ts b/backend/src/utils/format.ts index a18ce1892..9017f349f 100644 --- a/backend/src/utils/format.ts +++ b/backend/src/utils/format.ts @@ -26,4 +26,37 @@ export function formatBytes(bytes: number, toUnit: string, skipUnit = false): st } return `${bytes.toFixed(2)}${skipUnit ? '' : ' ' + byteUnits[unitIndex]}`; +} + +// https://stackoverflow.com/a/64235212 +export function hex2bin(hex): string { + if (!hex) { + return ''; + } + + hex = hex.replace('0x', '').toLowerCase(); + let out = ''; + + for (const c of hex) { + switch (c) { + case '0': out += '0000'; break; + case '1': out += '0001'; break; + case '2': out += '0010'; break; + case '3': out += '0011'; break; + case '4': out += '0100'; break; + case '5': out += '0101'; break; + case '6': out += '0110'; break; + case '7': out += '0111'; break; + case '8': out += '1000'; break; + case '9': out += '1001'; break; + case 'a': out += '1010'; break; + case 'b': out += '1011'; break; + case 'c': out += '1100'; break; + case 'd': out += '1101'; break; + case 'e': out += '1110'; break; + case 'f': out += '1111'; break; + default: return ''; + } + } + return out; } \ No newline at end of file From 32d46ad7ac4f2434219712d9024abe1e89400c3c Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Jul 2023 11:17:04 +0200 Subject: [PATCH 603/782] [lightning] save bit number when converting features from clightning --- backend/src/api/explorer/nodes.api.ts | 5 ++++- backend/src/api/lightning/clightning/clightning-convert.ts | 2 ++ backend/src/api/lightning/lightning-api.interface.ts | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/src/api/explorer/nodes.api.ts b/backend/src/api/explorer/nodes.api.ts index f5c87fbd1..dc359f914 100644 --- a/backend/src/api/explorer/nodes.api.ts +++ b/backend/src/api/explorer/nodes.api.ts @@ -56,7 +56,8 @@ class NodesApi { UNIX_TIMESTAMP(updated_at) AS updated_at, color, sockets as sockets, as_number, city_id, country_id, subdivision_id, longitude, latitude, geo_names_iso.names as iso_code, geo_names_as.names as as_organization, geo_names_city.names as city, - geo_names_country.names as country, geo_names_subdivision.names as subdivision + geo_names_country.names as country, geo_names_subdivision.names as subdivision, + features FROM nodes LEFT JOIN geo_names geo_names_as on geo_names_as.id = as_number LEFT JOIN geo_names geo_names_city on geo_names_city.id = city_id @@ -75,6 +76,8 @@ class NodesApi { node.subdivision = JSON.parse(node.subdivision); node.city = JSON.parse(node.city); node.country = JSON.parse(node.country); + + node.features = JSON.parse(node.features); // Active channels and capacity const activeChannelsStats: any = await this.$getActiveChannelsStats(public_key); diff --git a/backend/src/api/lightning/clightning/clightning-convert.ts b/backend/src/api/lightning/clightning/clightning-convert.ts index 75296ded2..84510d0fd 100644 --- a/backend/src/api/lightning/clightning/clightning-convert.ts +++ b/backend/src/api/lightning/clightning/clightning-convert.ts @@ -114,12 +114,14 @@ export function convertNode(clNode: any): ILightningApi.Node { const feature = FeaturesMap.get(i); if (!feature) { nodeFeatures.push({ + bit: i, name: 'unknown', is_required: i % 2 === 0, is_known: false }); } else { nodeFeatures.push({ + bit: i, name: feature, is_required: i % 2 === 0, is_known: true diff --git a/backend/src/api/lightning/lightning-api.interface.ts b/backend/src/api/lightning/lightning-api.interface.ts index cd5cb973d..ef26646a0 100644 --- a/backend/src/api/lightning/lightning-api.interface.ts +++ b/backend/src/api/lightning/lightning-api.interface.ts @@ -79,6 +79,7 @@ export namespace ILightningApi { } export interface Feature { + bit: number; name: string; is_required: boolean; is_known: boolean; From 4d41d36fe768493ef98716502b741decdcd8799a Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Jul 2023 11:28:13 +0200 Subject: [PATCH 604/782] [lightning] save feature bit number when using lnd describegraph --- backend/src/api/lightning/lnd/lnd-api.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/backend/src/api/lightning/lnd/lnd-api.ts b/backend/src/api/lightning/lnd/lnd-api.ts index b4c91d36e..eb48b5f96 100644 --- a/backend/src/api/lightning/lnd/lnd-api.ts +++ b/backend/src/api/lightning/lnd/lnd-api.ts @@ -41,8 +41,23 @@ class LndApi implements AbstractLightningApi { } async $getNetworkGraph(): Promise { - return axios.get(config.LND.REST_API_URL + '/v1/graph', this.axiosConfig) + const graph = await axios.get(config.LND.REST_API_URL + '/v1/graph', this.axiosConfig) .then((response) => response.data); + + for (const node of graph.nodes) { + const nodeFeatures: ILightningApi.Feature[] = []; + for (const bit in node.features) { + nodeFeatures.push({ + bit: parseInt(bit, 10), + name: node.features[bit].name, + is_required: node.features[bit].is_required, + is_known: node.features[bit].is_known, + }); + } + node.features = nodeFeatures; + } + + return graph; } } From 556eb65320d358d9d4812cac27b3ea497774dc4e Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Wed, 5 Jul 2023 14:00:30 +0200 Subject: [PATCH 605/782] [lightning] start integrating features bits in the node page --- backend/src/api/explorer/nodes.api.ts | 13 ++++++- .../clightning/clightning-convert.ts | 7 ++-- backend/src/api/lightning/lnd/lnd-api.ts | 4 +-- backend/src/utils/format.ts | 35 ++++++++++++++++++- .../app/lightning/node/node.component.html | 19 ++++++++-- 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/backend/src/api/explorer/nodes.api.ts b/backend/src/api/explorer/nodes.api.ts index dc359f914..40e106345 100644 --- a/backend/src/api/explorer/nodes.api.ts +++ b/backend/src/api/explorer/nodes.api.ts @@ -3,6 +3,7 @@ import DB from '../../database'; import { ResultSetHeader } from 'mysql2'; import { ILightningApi } from '../lightning/lightning-api.interface'; import { ITopNodesPerCapacity, ITopNodesPerChannels } from '../../mempool.interfaces'; +import { bin2hex } from '../../utils/format'; class NodesApi { public async $getWorldNodes(): Promise { @@ -76,8 +77,18 @@ class NodesApi { node.subdivision = JSON.parse(node.subdivision); node.city = JSON.parse(node.city); node.country = JSON.parse(node.country); - + + // Features node.features = JSON.parse(node.features); + let maxBit = 0; + for (const feature of node.features) { + maxBit = Math.max(maxBit, feature.bit); + } + node.featuresBits = new Array(maxBit + 1).fill(0); + for (const feature of node.features) { + node.featuresBits[feature.bit] = 1; + } + node.featuresBits = bin2hex(node.featuresBits.reverse().join('')); // Active channels and capacity const activeChannelsStats: any = await this.$getActiveChannelsStats(public_key); diff --git a/backend/src/api/lightning/clightning/clightning-convert.ts b/backend/src/api/lightning/clightning/clightning-convert.ts index 84510d0fd..771dabcd7 100644 --- a/backend/src/api/lightning/clightning/clightning-convert.ts +++ b/backend/src/api/lightning/clightning/clightning-convert.ts @@ -6,7 +6,7 @@ import { hex2bin } from '../../../utils/format'; import config from '../../../config'; // https://github.com/lightningnetwork/lnd/blob/master/lnwire/features.go -enum FeatureBits { +export enum FeatureBits { DataLossProtectRequired = 0, DataLossProtectOptional = 1, InitialRoutingSync = 3, @@ -47,10 +47,7 @@ enum FeatureBits { MaxBolt11Feature = 5114, }; -// Features is a mapping of known feature bits to a descriptive name. All known -// feature bits must be assigned a name in this mapping, and feature bit pairs -// must be assigned together for correct behavior. -const FeaturesMap = new Map([ +export const FeaturesMap = new Map([ [FeatureBits.DataLossProtectRequired, 'data-loss-protect'], [FeatureBits.DataLossProtectOptional, 'data-loss-protect'], [FeatureBits.InitialRoutingSync, 'initial-routing-sync'], diff --git a/backend/src/api/lightning/lnd/lnd-api.ts b/backend/src/api/lightning/lnd/lnd-api.ts index eb48b5f96..f4099e82b 100644 --- a/backend/src/api/lightning/lnd/lnd-api.ts +++ b/backend/src/api/lightning/lnd/lnd-api.ts @@ -46,10 +46,10 @@ class LndApi implements AbstractLightningApi { for (const node of graph.nodes) { const nodeFeatures: ILightningApi.Feature[] = []; - for (const bit in node.features) { + for (const bit in node.features) { nodeFeatures.push({ bit: parseInt(bit, 10), - name: node.features[bit].name, + name: node.features[bit].name, is_required: node.features[bit].is_required, is_known: node.features[bit].is_known, }); diff --git a/backend/src/utils/format.ts b/backend/src/utils/format.ts index 9017f349f..63dc07ae4 100644 --- a/backend/src/utils/format.ts +++ b/backend/src/utils/format.ts @@ -29,7 +29,7 @@ export function formatBytes(bytes: number, toUnit: string, skipUnit = false): st } // https://stackoverflow.com/a/64235212 -export function hex2bin(hex): string { +export function hex2bin(hex: string): string { if (!hex) { return ''; } @@ -58,5 +58,38 @@ export function hex2bin(hex): string { default: return ''; } } + return out; +} + +export function bin2hex(bin: string): string { + if (!bin) { + return ''; + } + + let out = ''; + + for (let i = 0; i < bin.length; i += 4) { + const c = bin.substring(i, i + 4); + switch (c) { + case '0000': out += '0'; break; + case '0001': out += '1'; break; + case '0010': out += '2'; break; + case '0011': out += '3'; break; + case '0100': out += '4'; break; + case '0101': out += '5'; break; + case '0110': out += '6'; break; + case '0111': out += '7'; break; + case '1000': out += '8'; break; + case '1001': out += '9'; break; + case '1010': out += 'a'; break; + case '1011': out += 'b'; break; + case '1100': out += 'c'; break; + case '1101': out += 'd'; break; + case '1110': out += 'e'; break; + case '1111': out += 'f'; break; + default: return ''; + } + } + return out; } \ No newline at end of file diff --git a/frontend/src/app/lightning/node/node.component.html b/frontend/src/app/lightning/node/node.component.html index 2a74a68aa..c3903e915 100644 --- a/frontend/src/app/lightning/node/node.component.html +++ b/frontend/src/app/lightning/node/node.component.html @@ -21,7 +21,6 @@
    -
    Marginal fee rate High sigop count Recently broadcastedRecently CPFP'd Added Marginal fee rate Full RBF
    @@ -59,6 +58,9 @@ + + +
    Avg channel distance {{ avgDistance | amountShortener: 1 }} km ·{{ kmToMiles(avgDistance) | amountShortener: 1 }} mi
    @@ -100,13 +102,26 @@ + + + + + +
    -
    + + Features + + {{ bits }} + + + +
    From 6336c529edcf297909142627b5f75be7ab55fe40 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 8 Jul 2023 10:43:37 +0200 Subject: [PATCH 606/782] [lightning] show decoded features in node page --- .../app/lightning/node/node.component.html | 28 ++++++++++++++++++- .../src/app/lightning/node/node.component.ts | 7 ++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/lightning/node/node.component.html b/frontend/src/app/lightning/node/node.component.html index c3903e915..0ed1c78c9 100644 --- a/frontend/src/app/lightning/node/node.component.html +++ b/frontend/src/app/lightning/node/node.component.html @@ -118,10 +118,36 @@ Features {{ bits }} - + +
    +
    +
    +
    +
    Raw bits
    + {{ node.featuresBits }} +
    +
    Decoded
    + + + + + + + + + + + + + +
    BitNameRequired
    {{ feature.bit }}{{ feature.name }}{{ feature.is_required }}
    +
    +
    +
    +
    diff --git a/frontend/src/app/lightning/node/node.component.ts b/frontend/src/app/lightning/node/node.component.ts index 47f65007f..719136d79 100644 --- a/frontend/src/app/lightning/node/node.component.ts +++ b/frontend/src/app/lightning/node/node.component.ts @@ -37,7 +37,7 @@ export class NodeComponent implements OnInit { liquidityAd: ILiquidityAd; tlvRecords: CustomRecord[]; avgChannelDistance$: Observable; - + showFeatures = false; kmToMiles = kmToMiles; constructor( @@ -164,4 +164,9 @@ export class NodeComponent implements OnInit { onLoadingEvent(e) { this.channelListLoading = e; } + + toggleFeatures() { + this.showFeatures = !this.showFeatures; + return false; + } } From 8fb67a914cc3eb12e9d6e74b9f22b08b56ce419a Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 8 Jul 2023 10:59:43 +0200 Subject: [PATCH 607/782] [lightning] fix node features binary conversion --- backend/src/api/explorer/nodes.api.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/api/explorer/nodes.api.ts b/backend/src/api/explorer/nodes.api.ts index 40e106345..7d78559c4 100644 --- a/backend/src/api/explorer/nodes.api.ts +++ b/backend/src/api/explorer/nodes.api.ts @@ -84,6 +84,8 @@ class NodesApi { for (const feature of node.features) { maxBit = Math.max(maxBit, feature.bit); } + maxBit = Math.ceil(maxBit / 4) * 4 - 1; + node.featuresBits = new Array(maxBit + 1).fill(0); for (const feature of node.features) { node.featuresBits[feature.bit] = 1; From 6fe32cdd191259f53d95a3448ef912a6d319ed89 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sun, 16 Jul 2023 18:24:42 +0900 Subject: [PATCH 608/782] [lightning] fix issue during initial node.features indexing --- backend/src/api/explorer/nodes.api.ts | 23 +++++++++++-------- .../app/lightning/node/node.component.html | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/backend/src/api/explorer/nodes.api.ts b/backend/src/api/explorer/nodes.api.ts index 7d78559c4..22f9ca48a 100644 --- a/backend/src/api/explorer/nodes.api.ts +++ b/backend/src/api/explorer/nodes.api.ts @@ -80,17 +80,20 @@ class NodesApi { // Features node.features = JSON.parse(node.features); - let maxBit = 0; - for (const feature of node.features) { - maxBit = Math.max(maxBit, feature.bit); + node.featuresBits = null; + if (node.features) { + let maxBit = 0; + for (const feature of node.features) { + maxBit = Math.max(maxBit, feature.bit); + } + maxBit = Math.ceil(maxBit / 4) * 4 - 1; + + node.featuresBits = new Array(maxBit + 1).fill(0); + for (const feature of node.features) { + node.featuresBits[feature.bit] = 1; + } + node.featuresBits = bin2hex(node.featuresBits.reverse().join('')); } - maxBit = Math.ceil(maxBit / 4) * 4 - 1; - - node.featuresBits = new Array(maxBit + 1).fill(0); - for (const feature of node.features) { - node.featuresBits[feature.bit] = 1; - } - node.featuresBits = bin2hex(node.featuresBits.reverse().join('')); // Active channels and capacity const activeChannelsStats: any = await this.$getActiveChannelsStats(public_key); diff --git a/frontend/src/app/lightning/node/node.component.html b/frontend/src/app/lightning/node/node.component.html index 0ed1c78c9..47b10184e 100644 --- a/frontend/src/app/lightning/node/node.component.html +++ b/frontend/src/app/lightning/node/node.component.html @@ -102,10 +102,10 @@ - + - + From 565336df21a6d2c0a821e73752aee9d8bf8c36be Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 16 Jul 2023 18:39:51 +0900 Subject: [PATCH 609/782] Set missing websocket init data --- backend/src/api/websocket-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 48e9106f0..e31221dfd 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -236,7 +236,7 @@ class WebsocketHandler { } if (parsedMessage.action === 'init') { - if (!this.socketData['blocks']?.length || !this.socketData['da']) { + if (!this.socketData['blocks']?.length || !this.socketData['da'] || !this.socketData['backendInfo'] || !this.socketData['conversions']) { this.updateSocketData(); } if (!this.socketData['blocks']?.length) { From a7ec9138c3308e692625550396b004b119c6a780 Mon Sep 17 00:00:00 2001 From: wiz Date: Mon, 17 Jul 2023 01:14:37 +0900 Subject: [PATCH 610/782] ops: Bump elements tag to 22.1.1 --- production/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/production/install b/production/install index 1121f5b4f..9ea9b7a75 100755 --- a/production/install +++ b/production/install @@ -353,7 +353,7 @@ ELEMENTS_REPO_URL=https://github.com/ElementsProject/elements ELEMENTS_REPO_NAME=elements ELEMENTS_REPO_BRANCH=master #ELEMENTS_LATEST_RELEASE=$(curl -s https://api.github.com/repos/ElementsProject/elements/releases/latest|grep tag_name|head -1|cut -d '"' -f4) -ELEMENTS_LATEST_RELEASE=elements-22.1 +ELEMENTS_LATEST_RELEASE=elements-22.1.1 echo -n '.' BITCOIN_ELECTRS_REPO_URL=https://github.com/mempool/electrs From bf5a16b043cb5eb7b70d396bd25c4fd3fcbe649c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 17 Jul 2023 11:02:28 +0900 Subject: [PATCH 611/782] always send 6 latest transactions to websocket clients --- backend/src/api/websocket-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index e31221dfd..ab7dcf443 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -419,7 +419,7 @@ class WebsocketHandler { memPool.addToSpendMap(newTransactions); const recommendedFees = feeApi.getRecommendedFee(); - const latestTransactions = newTransactions.slice(0, 6).map((tx) => Common.stripTransaction(tx)); + const latestTransactions = memPool.getLatestTransactions(); // update init data const socketDataFields = { From 2c39e1e203786d5520018fc7fcbf275a026cf23d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 17 Jul 2023 11:15:55 +0900 Subject: [PATCH 612/782] unbork mining pool blocks list --- frontend/src/app/components/pool/pool.component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/pool/pool.component.ts b/frontend/src/app/components/pool/pool.component.ts index 139da5ef0..f2fc79ff2 100644 --- a/frontend/src/app/components/pool/pool.component.ts +++ b/frontend/src/app/components/pool/pool.component.ts @@ -37,7 +37,7 @@ export class PoolComponent implements OnInit { auditAvailable = false; - loadMoreSubject: BehaviorSubject = new BehaviorSubject(this.blocks[0]?.height); + loadMoreSubject: BehaviorSubject = new BehaviorSubject(this.blocks[this.blocks.length - 1]?.height); constructor( @Inject(LOCALE_ID) public locale: string, @@ -91,7 +91,7 @@ export class PoolComponent implements OnInit { if (this.slug === undefined) { return []; } - return this.apiService.getPoolBlocks$(this.slug, this.blocks[0]?.height); + return this.apiService.getPoolBlocks$(this.slug, this.blocks[this.blocks.length - 1]?.height); }), tap((newBlocks) => { this.blocks = this.blocks.concat(newBlocks); @@ -237,7 +237,7 @@ export class PoolComponent implements OnInit { } loadMore() { - this.loadMoreSubject.next(this.blocks[0]?.height); + this.loadMoreSubject.next(this.blocks[this.blocks.length - 1]?.height); } trackByBlock(index: number, block: BlockExtended) { From 7a059ba29476a0cad6a4fd704061abfd1e774e4a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 16 Jul 2023 17:12:26 +0900 Subject: [PATCH 613/782] get chain tip direct from Bitcoin Core to avoid race conditions --- backend/src/api/bitcoin/bitcoin-api.ts | 10 ++-------- backend/src/api/blocks.ts | 15 +++++++++------ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index a0cc41770..cbcb2c571 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -65,17 +65,11 @@ class BitcoinApi implements AbstractBitcoinApi { } $getBlockHeightTip(): Promise { - return this.bitcoindClient.getChainTips() - .then((result: IBitcoinApi.ChainTips[]) => { - return result.find(tip => tip.status === 'active')!.height; - }); + return this.bitcoindClient.getBlockCount(); } $getBlockHashTip(): Promise { - return this.bitcoindClient.getChainTips() - .then((result: IBitcoinApi.ChainTips[]) => { - return result.find(tip => tip.status === 'active')!.hash; - }); + return this.bitcoindClient.getBestBlockHash(); } $getTxIdsForBlock(hash: string): Promise { diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 5939421a7..fdf32f438 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -76,11 +76,14 @@ class Blocks { blockHash: string, blockHeight: number, onlyCoinbase: boolean, + txIds: string[] | null = null, quiet: boolean = false, addMempoolData: boolean = false, ): Promise { const transactions: TransactionExtended[] = []; - const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash); + if (!txIds) { + txIds = await bitcoinApi.$getTxIdsForBlock(blockHash); + } const mempool = memPool.getMempool(); let transactionsFound = 0; @@ -554,7 +557,7 @@ class Blocks { } const blockHash = await bitcoinApi.$getBlockHash(blockHeight); const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(blockHash); - const transactions = await this.$getTransactionsExtended(blockHash, block.height, true, true); + const transactions = await this.$getTransactionsExtended(blockHash, block.height, true, null, true); const blockExtended = await this.$getBlockExtended(block, transactions); newlyIndexed++; @@ -586,7 +589,7 @@ class Blocks { let fastForwarded = false; let handledBlocks = 0; - const blockHeightTip = await bitcoinApi.$getBlockHeightTip(); + const blockHeightTip = await bitcoinCoreApi.$getBlockHeightTip(); this.updateTimerProgress(timer, 'got block height tip'); if (this.blocks.length === 0) { @@ -639,11 +642,11 @@ class Blocks { } this.updateTimerProgress(timer, `getting block data for ${this.currentBlockHeight}`); - const blockHash = await bitcoinApi.$getBlockHash(this.currentBlockHeight); + const blockHash = await bitcoinCoreApi.$getBlockHash(this.currentBlockHeight); const verboseBlock = await bitcoinClient.getBlock(blockHash, 2); const block = BitcoinApi.convertBlock(verboseBlock); - const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash); - const transactions = await this.$getTransactionsExtended(blockHash, block.height, false, false, true) as MempoolTransactionExtended[]; + const txIds: string[] = verboseBlock.tx.map(tx => tx.txid); + const transactions = await this.$getTransactionsExtended(blockHash, block.height, false, txIds, false, true) as MempoolTransactionExtended[]; if (config.MEMPOOL.BACKEND !== 'esplora') { // fill in missing transaction fee data from verboseBlock for (let i = 0; i < transactions.length; i++) { From 6ab3b89884c8d7631e45e23a0f1a91070e783556 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 17 Jul 2023 17:41:38 +0900 Subject: [PATCH 614/782] Change to a Details-button --- frontend/src/app/lightning/node/node.component.html | 2 +- frontend/src/styles.scss | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/lightning/node/node.component.html b/frontend/src/app/lightning/node/node.component.html index 47b10184e..c6c693a3a 100644 --- a/frontend/src/app/lightning/node/node.component.html +++ b/frontend/src/app/lightning/node/node.component.html @@ -118,7 +118,7 @@ Features {{ bits }} - + diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index ac299a547..428752d60 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -1164,3 +1164,10 @@ app-master-page, app-liquid-master-page, app-bisq-master-page { app-global-footer { margin-top: auto; } + +.btn-xs { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 0.5; + border-radius: 0.2rem; +} From 4309bfd519e913db34b64c9e1846cc7e8af23e6e Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 17 Jul 2023 17:53:26 +0900 Subject: [PATCH 615/782] Fix websocket null data for undefined rbfSummary --- backend/src/api/websocket-handler.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index ab7dcf443..a0c031175 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -229,7 +229,9 @@ class WebsocketHandler { if (parsedMessage && parsedMessage['track-rbf-summary'] != null) { if (parsedMessage['track-rbf-summary']) { client['track-rbf-summary'] = true; - response['rbfLatestSummary'] = this.socketData['rbfSummary']; + if (this.socketData['rbfSummary'] != null) { + response['rbfLatestSummary'] = this.socketData['rbfSummary']; + } } else { client['track-rbf-summary'] = false; } From 2c1b9b9095cde80c4d1e7e960cf7fad4b2b4898d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 17 Jul 2023 18:21:44 +0900 Subject: [PATCH 616/782] Fix mempool update poll delay --- backend/src/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index 81863a208..bbfaa9ff3 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -169,6 +169,7 @@ class Server { } async runMainUpdateLoop(): Promise { + const start = Date.now(); try { try { await memPool.$updateMemPoolInfo(); @@ -188,7 +189,9 @@ class Server { indexer.$run(); // rerun immediately if we skipped the mempool update, otherwise wait POLL_RATE_MS - setTimeout(this.runMainUpdateLoop.bind(this), numHandledBlocks > 0 ? 1 : config.MEMPOOL.POLL_RATE_MS); + const elapsed = Date.now() - start; + const remainingTime = Math.max(0, config.MEMPOOL.POLL_RATE_MS - elapsed) + setTimeout(this.runMainUpdateLoop.bind(this), numHandledBlocks > 0 ? 0 : remainingTime); this.backendRetryCount = 0; } catch (e: any) { this.backendRetryCount++; From 6a16759e2025ac2aa75415922a29aa60dc1cfc24 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 17 Jul 2023 18:37:46 +0900 Subject: [PATCH 617/782] Hide confirmations badge if height unknown --- .../app/components/transaction/transaction.component.html | 1 + .../components/confirmations/confirmations.component.html | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 203a5df5c..d4cd6913d 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -19,6 +19,7 @@
    {{ i }} confirmations + + + - + \ No newline at end of file From c02eef352be0c36482c7123802110bf2bcc79897 Mon Sep 17 00:00:00 2001 From: wiz Date: Mon, 17 Jul 2023 22:56:16 +0900 Subject: [PATCH 618/782] ops: Increase bitcoin.conf maxconnections 42 -> 100 --- production/bitcoin.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/production/bitcoin.conf b/production/bitcoin.conf index d9f3fc252..fb8ad52e5 100644 --- a/production/bitcoin.conf +++ b/production/bitcoin.conf @@ -9,7 +9,7 @@ dbcache=8192 maxmempool=4096 mempoolexpiry=999999 mempoolfullrbf=1 -maxconnections=42 +maxconnections=100 onion=127.0.0.1:9050 rpcallowip=127.0.0.1 rpcuser=__BITCOIN_RPC_USER__ From 7e06c97f519d3fc4c74817574c9e60309eb939c6 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 18 Jul 2023 07:50:14 +0900 Subject: [PATCH 619/782] ops: Bump NodeJS to v20.4.0 --- production/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/production/install b/production/install index 9ea9b7a75..2a5064b89 100755 --- a/production/install +++ b/production/install @@ -1045,7 +1045,7 @@ echo "[*] Installing nvm.sh from GitHub" osSudo "${MEMPOOL_USER}" sh -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh' echo "[*] Building NodeJS via nvm.sh" -osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm install v16.16.0 --shared-zlib' +osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm install v20.4.0 --shared-zlib' #################### # Tor installation # From fa48c6f025cb1ade799baf82b5c21f2b75093bb3 Mon Sep 17 00:00:00 2001 From: wiz Date: Tue, 18 Jul 2023 08:52:51 +0900 Subject: [PATCH 620/782] ops: Use NodeJS v18 to build, v20 to run backend --- production/install | 5 ++++- production/mempool-start-all | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/production/install b/production/install index 2a5064b89..1af975d64 100755 --- a/production/install +++ b/production/install @@ -1044,8 +1044,11 @@ osSudo "${ROOT_USER}" crontab -u "${MEMPOOL_USER}" "${MEMPOOL_HOME}/${MEMPOOL_RE echo "[*] Installing nvm.sh from GitHub" osSudo "${MEMPOOL_USER}" sh -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh' -echo "[*] Building NodeJS via nvm.sh" +echo "[*] Building NodeJS v20.4.0 via nvm.sh" osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm install v20.4.0 --shared-zlib' +echo "[*] Building NodeJS v18.16.1 via nvm.sh" +osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm install v18.16.1 --shared-zlib' +osSudo "${MEMPOOL_USER}" zsh -c 'source ~/.zshrc ; nvm alias default 18.16.1' #################### # Tor installation # diff --git a/production/mempool-start-all b/production/mempool-start-all index 13fd30430..306156660 100755 --- a/production/mempool-start-all +++ b/production/mempool-start-all @@ -1,6 +1,7 @@ #!/usr/bin/env zsh export NVM_DIR="$HOME/.nvm" source "$NVM_DIR/nvm.sh" +nvm use v20.4.0 # start all mempool backends that exist for site in mainnet mainnet-lightning testnet testnet-lightning signet signet-lightning bisq liquid liquidtestnet;do From 5e46176c4e9cf20377ffa4b8fa8c6ae9a7e68774 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 18 Jul 2023 10:52:47 +0900 Subject: [PATCH 621/782] Fix clock horizontal scroll bug --- frontend/src/app/components/clock/clock.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/components/clock/clock.component.scss b/frontend/src/app/components/clock/clock.component.scss index 20baf02ee..64929aa38 100644 --- a/frontend/src/app/components/clock/clock.component.scss +++ b/frontend/src/app/components/clock/clock.component.scss @@ -9,6 +9,7 @@ display: flex; flex-direction: column; justify-content: flex-start; + overflow: hidden; --chain-height: 60px; --clock-width: 300px; From 17866f80bd4ddb14e3469b9357043612fcc18b8c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 18 Jul 2023 11:01:35 +0900 Subject: [PATCH 622/782] Remove frontend FULL_RBF_ENABLED flag --- docker/frontend/entrypoint.sh | 2 -- frontend/mempool-frontend-config.sample.json | 1 - frontend/src/app/components/rbf-list/rbf-list.component.html | 2 +- frontend/src/app/components/rbf-list/rbf-list.component.ts | 5 +---- frontend/src/app/services/state.service.ts | 2 -- 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/docker/frontend/entrypoint.sh b/docker/frontend/entrypoint.sh index 013b1ce53..b6946578b 100644 --- a/docker/frontend/entrypoint.sh +++ b/docker/frontend/entrypoint.sh @@ -39,7 +39,6 @@ __AUDIT__=${AUDIT:=false} __MAINNET_BLOCK_AUDIT_START_HEIGHT__=${MAINNET_BLOCK_AUDIT_START_HEIGHT:=0} __TESTNET_BLOCK_AUDIT_START_HEIGHT__=${TESTNET_BLOCK_AUDIT_START_HEIGHT:=0} __SIGNET_BLOCK_AUDIT_START_HEIGHT__=${SIGNET_BLOCK_AUDIT_START_HEIGHT:=0} -__FULL_RBF_ENABLED__=${FULL_RBF_ENABLED:=false} __HISTORICAL_PRICE__=${HISTORICAL_PRICE:=true} # Export as environment variables to be used by envsubst @@ -66,7 +65,6 @@ export __AUDIT__ export __MAINNET_BLOCK_AUDIT_START_HEIGHT__ export __TESTNET_BLOCK_AUDIT_START_HEIGHT__ export __SIGNET_BLOCK_AUDIT_START_HEIGHT__ -export __FULL_RBF_ENABLED__ export __HISTORICAL_PRICE__ folder=$(find /var/www/mempool -name "config.js" | xargs dirname) diff --git a/frontend/mempool-frontend-config.sample.json b/frontend/mempool-frontend-config.sample.json index c45425612..084cbd0ef 100644 --- a/frontend/mempool-frontend-config.sample.json +++ b/frontend/mempool-frontend-config.sample.json @@ -22,6 +22,5 @@ "TESTNET_BLOCK_AUDIT_START_HEIGHT": 0, "SIGNET_BLOCK_AUDIT_START_HEIGHT": 0, "LIGHTNING": false, - "FULL_RBF_ENABLED": false, "HISTORICAL_PRICE": true } diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.html b/frontend/src/app/components/rbf-list/rbf-list.component.html index eebb7e152..5ce6254c4 100644 --- a/frontend/src/app/components/rbf-list/rbf-list.component.html +++ b/frontend/src/app/components/rbf-list/rbf-list.component.html @@ -2,7 +2,7 @@

    RBF Replacements

    -
    +
    diff --git a/frontend/src/app/components/rbf-list/rbf-list.component.ts b/frontend/src/app/components/rbf-list/rbf-list.component.ts index 06f798860..b6e178270 100644 --- a/frontend/src/app/components/rbf-list/rbf-list.component.ts +++ b/frontend/src/app/components/rbf-list/rbf-list.component.ts @@ -53,25 +53,6 @@ export class RbfList implements OnInit, OnDestroy { ); } - toggleFullRbf(event) { - this.router.navigate([], { - relativeTo: this.route, - fragment: this.fullRbf ? null : 'fullrbf' - }); - } - - isFullRbf(tree: RbfTree): boolean { - return tree.fullRbf; - } - - isMined(tree: RbfTree): boolean { - return tree.mined; - } - - // pageChange(page: number) { - // this.fromTreeSubject.next(this.lastTreeId); - // } - ngOnDestroy(): void { this.websocketService.stopTrackRbf(); } diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index b1bc35eca..bf9816a69 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -206,16 +206,4 @@ export class DashboardComponent implements OnInit, OnDestroy { trackByBlock(index: number, block: BlockExtended) { return block.height; } - - checkFullRbf(tree: RbfTree): void { - let fullRbf = false; - for (const replaced of tree.replaces) { - if (!replaced.tx.rbf) { - fullRbf = true; - } - replaced.replacedBy = tree.tx; - this.checkFullRbf(replaced); - } - tree.tx.fullRbf = fullRbf; - } } From ac82a25fa2768513ea6c3f56afce40dddd46bcb1 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 18 Jul 2023 13:38:33 +0900 Subject: [PATCH 624/782] Angular 16 --- frontend/package-lock.json | 15051 ++++++++++++++----------------- frontend/package.json | 70 +- frontend/src/app/app.module.ts | 5 +- frontend/src/styles.scss | 4 +- 4 files changed, 6731 insertions(+), 8399 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 13dc6d1b6..9c04c486e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,172 +9,204 @@ "version": "3.0.0-dev", "license": "GNU Affero General Public License v3.0", "dependencies": { - "@angular-devkit/build-angular": "^14.2.10", - "@angular/animations": "^14.2.12", - "@angular/cli": "^14.2.10", - "@angular/common": "^14.2.12", - "@angular/compiler": "^14.2.12", - "@angular/core": "^14.2.12", - "@angular/forms": "^14.2.12", - "@angular/localize": "^14.2.12", - "@angular/platform-browser": "^14.2.12", - "@angular/platform-browser-dynamic": "^14.2.12", - "@angular/platform-server": "^14.2.12", - "@angular/router": "^14.2.12", - "@fortawesome/angular-fontawesome": "~0.11.1", - "@fortawesome/fontawesome-common-types": "~6.2.1", - "@fortawesome/fontawesome-svg-core": "~6.2.1", - "@fortawesome/free-solid-svg-icons": "~6.2.1", + "@angular-devkit/build-angular": "^16.1.4", + "@angular/animations": "^16.1.5", + "@angular/cli": "^16.1.4", + "@angular/common": "^16.1.5", + "@angular/compiler": "^16.1.5", + "@angular/core": "^16.1.5", + "@angular/forms": "^16.1.5", + "@angular/localize": "^16.1.5", + "@angular/platform-browser": "^16.1.5", + "@angular/platform-browser-dynamic": "^16.1.5", + "@angular/platform-server": "^16.1.5", + "@angular/router": "^16.1.5", + "@fortawesome/angular-fontawesome": "~0.13.0", + "@fortawesome/fontawesome-common-types": "~6.4.0", + "@fortawesome/fontawesome-svg-core": "~6.4.0", + "@fortawesome/free-solid-svg-icons": "~6.4.0", "@mempool/mempool.js": "2.3.0", - "@ng-bootstrap/ng-bootstrap": "^13.1.1", + "@ng-bootstrap/ng-bootstrap": "^15.1.0", "@types/qrcode": "~1.5.0", - "bootstrap": "~4.6.1", + "bootstrap": "~4.6.2", "browserify": "^17.0.0", "clipboard": "^2.0.11", "domino": "^2.1.6", - "echarts": "~5.4.1", + "echarts": "~5.4.3", "echarts-gl": "^2.0.9", "lightweight-charts": "~3.8.0", - "ngx-echarts": "~14.0.0", - "ngx-infinite-scroll": "^14.0.1", + "ngx-echarts": "~16.0.0", + "ngx-infinite-scroll": "^16.0.0", "qrcode": "1.5.1", - "rxjs": "~7.8.0", - "tinyify": "^3.1.0", + "rxjs": "~7.8.1", + "tinyify": "^4.0.0", "tlite": "^0.1.9", - "tslib": "~2.4.1", - "zone.js": "~0.12.0" + "tslib": "~2.6.0", + "zone.js": "~0.13.1" }, "devDependencies": { - "@angular/compiler-cli": "^14.2.12", - "@angular/language-service": "^14.2.12", + "@angular/compiler-cli": "^16.1.5", + "@angular/language-service": "^16.1.5", "@types/node": "^18.11.9", "@typescript-eslint/eslint-plugin": "^5.48.1", "@typescript-eslint/parser": "^5.48.1", "eslint": "^8.31.0", "http-proxy-middleware": "~2.0.6", - "prettier": "^2.8.2", + "prettier": "^3.0.0", "ts-node": "~10.9.1", - "typescript": "~4.6.4" + "typescript": "~4.9.3" }, "optionalDependencies": { - "@cypress/schematic": "^2.4.0", - "cypress": "^12.7.0", - "cypress-fail-on-console-error": "~4.0.2", - "cypress-wait-until": "^1.7.2", - "mock-socket": "~9.1.5", - "start-server-and-test": "~1.14.0" + "@cypress/schematic": "^2.5.0", + "cypress": "^12.17.1", + "cypress-fail-on-console-error": "~4.0.3", + "cypress-wait-until": "^2.0.0", + "mock-socket": "~9.2.1", + "start-server-and-test": "~2.0.0" } }, - "node_modules/@adobe/css-tools": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", - "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==" + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@angular-devkit/build-angular": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.10.tgz", - "integrity": "sha512-VCeZAyq4uPCJukKInaSiD4i/GgxgcU4jFlLFQtoYNmaBS4xbPOymL19forRIihiV0dwNEa2L694vRTAPMBxIfw==", + "node_modules/@angular-devkit/architect": { + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.4.tgz", + "integrity": "sha512-OOSbNlDy+Q3jY0oFHaq8kkna9HYI1zaS8IHeCIDP6T/ZIAVad4+HqXAL4SKQrKJikkoBQv1Z/eaDBL5XPFK9Bw==", "dependencies": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.10", - "@angular-devkit/build-webpack": "0.1402.10", - "@angular-devkit/core": "14.2.10", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", + "@angular-devkit/core": "16.1.4", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.4.tgz", + "integrity": "sha512-LiHM7R20fTHg/eM+Iabotj08edP5wVBQahRfVNLxERo8X6VJgSjVChnsh3AQJkRywlGuFe20AOQYpyLyN367Ug==", + "dependencies": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/build-webpack": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@babel/core": "7.22.5", + "@babel/generator": "7.22.7", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.5", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.5", + "@babel/preset-env": "7.22.5", + "@babel/runtime": "7.22.5", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.10", + "@ngtools/webpack": "16.1.4", + "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.2", "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", + "browserslist": "^4.21.5", + "cacache": "17.1.3", + "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", + "critters": "0.0.19", + "css-loader": "6.8.1", + "esbuild-wasm": "0.17.19", + "fast-glob": "3.2.12", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", + "jsonc-parser": "3.2.0", "karma-source-map-support": "1.4.0", "less": "4.1.3", - "less-loader": "11.0.0", + "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", + "magic-string": "0.30.0", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", + "postcss": "8.4.24", + "postcss-loader": "7.3.2", "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", + "rxjs": "7.8.1", + "sass": "1.63.2", + "sass-loader": "13.3.1", + "semver": "7.5.3", + "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", + "terser": "5.17.7", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.74.0", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", + "tslib": "2.5.3", + "vite": "4.3.9", + "webpack": "5.86.0", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.0", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.15.5" + "esbuild": "0.17.19" }, "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "@angular/localize": "^14.0.0", - "@angular/service-worker": "^14.0.0", + "@angular/compiler-cli": "^16.0.0", + "@angular/localize": "^16.0.0", + "@angular/platform-server": "^16.0.0", + "@angular/service-worker": "^16.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^14.0.0", + "ng-packagr": "^16.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.6.2 <4.9" + "typescript": ">=4.9.3 <5.2" }, "peerDependenciesMeta": { "@angular/localize": { "optional": true }, + "@angular/platform-server": { + "optional": true + }, "@angular/service-worker": { "optional": true }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, "karma": { "optional": true }, @@ -189,148 +221,21 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", - "dependencies": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "dependencies": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.10.tgz", - "integrity": "sha512-sLHapZLVub6mEz5b19tf1VfIV1w3tYfg7FNPLeni79aldxu1FbP1v2WmiFAnMzrswqyK0bhTtxrl+Z/CLKqyoQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.4.tgz", + "integrity": "sha512-+8bfavDH8eWxjlJFYr6bkjcRHhy95j+f8oNn7/sGLNu4L96nuE2AZ011XIu2dJahCnNiBvwc1EpkKa92t9rkaA==", "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "typescript": ">=4.6.2 <4.9", + "@angular/compiler-cli": "^16.0.0", + "typescript": ">=4.9.3 <5.2", "webpack": "^5.54.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, "node_modules/@angular-devkit/build-angular/node_modules/loader-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", @@ -339,37 +244,10 @@ "node": ">= 12.13.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -380,29 +258,21 @@ "node": ">=10" } }, - "node_modules/@angular-devkit/build-angular/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.10.tgz", - "integrity": "sha512-h+2MaSY7QSvoJ3R+Hvin21jVCfPGOTLdASIUk4Jmq6J3y5BSku3KSSaV8dWoBOBkFCwQyPQMRjiHoHKLpC1K7g==", + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.4.tgz", + "integrity": "sha512-GC1y//ScAYbYQ68Wri2QgTEekC4hRxBC+xEkYL9OFiAMQ4mcN+eYvbkQBX8enJwDMXpkYfLR6VV8cChjAVYIgg==", "dependencies": { - "@angular-devkit/architect": "0.1402.10", - "rxjs": "6.6.7" + "@angular-devkit/architect": "0.1601.4", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -411,33 +281,19 @@ "webpack-dev-server": "^4.0.0" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", + "node_modules/@angular-devkit/core": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.4.tgz", + "integrity": "sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==", "dependencies": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "dependencies": { - "ajv": "8.11.0", + "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -450,10 +306,10 @@ } } }, - "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -465,243 +321,88 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { + "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/@angular-devkit/build-webpack/node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@angular-devkit/schematics": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.10.tgz", - "integrity": "sha512-MMp31KpJTwKHisXOq+6VOXYApq97hZxFaFmZk396X5aIFTCELUwjcezQDk+u2nEs5iK/COUfnN3plGcfJxYhQA==", - "dependencies": { - "@angular-devkit/core": "14.2.10", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "dependencies": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "node_modules/@angular-devkit/schematics/node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@angular/animations": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.12.tgz", - "integrity": "sha512-gwdnFZkvVUr+enUNfhfCGRGGqNHn1+vTA81apLfHYhJxgjiLUtETc4KTOrQevtDm022pEd+LSrvr8r+7ag+jkw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.5.tgz", + "integrity": "sha512-CUm81m1N00EIza8LH81BJ+PoR23HzfoD+8ltASya9D0VurB6hlv0Axa5kQ0o02PQwCAU1a6RUUTsTjODc/mUYA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.2.12" + "@angular/core": "16.1.5" } }, "node_modules/@angular/cli": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.10.tgz", - "integrity": "sha512-gX9sAKOwq4lKdPWeABB7TzKDHdjQXvkUU8NmPJA6mEAVXvm3lhQtFvHDalZstwK8au2LY0LaXTcEtcKYOt3AXQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.4.tgz", + "integrity": "sha512-coSOLVLpOCOD5q9K9EAFFMrTES+HtdJiLy/iI9kdKNCKWUJpm8/svZ3JZOej3vPxYEp0AokXNOwORQnX21/qZQ==", "dependencies": { - "@angular-devkit/architect": "0.1402.10", - "@angular-devkit/core": "14.2.10", - "@angular-devkit/schematics": "14.2.10", - "@schematics/angular": "14.2.10", + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "@schematics/angular": "16.1.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", + "ini": "4.1.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", "ora": "5.4.1", - "pacote": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.3", "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" + "yargs": "17.7.2" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", + "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.4.tgz", + "integrity": "sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==", "dependencies": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" + "@angular-devkit/core": "16.1.4", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", + "node_modules/@angular/cli/node_modules/@schematics/angular": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.4.tgz", + "integrity": "sha512-XfoeL+aBVIR/DzgVKGVhHW/TGQnqWvngyJVuCwXEVWzNfjxHYFkchXa78OItpAvTEr6/Y0Me9FQVAGVA4mMUyg==", "dependencies": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "jsonc-parser": "3.2.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular/cli/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@angular/cli/node_modules/ansi-styles": { @@ -719,13 +420,16 @@ } }, "node_modules/@angular/cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/@angular/cli/node_modules/color-convert": { @@ -744,47 +448,10 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@angular/cli/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@angular/cli/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@angular/cli/node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "node_modules/@angular/cli/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/@angular/cli/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -795,19 +462,6 @@ "node": ">=10" } }, - "node_modules/@angular/cli/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@angular/cli/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@angular/cli/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -833,17 +487,17 @@ } }, "node_modules/@angular/cli/node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -858,32 +512,32 @@ } }, "node_modules/@angular/common": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.12.tgz", - "integrity": "sha512-oZunh9wfInFWhNO1P8uoEs/o4u8kerKMhw8GruywKm1TV7gHDP2Fi5WHGjFqq3XYptgBTPCTSEfyLX6Cwq1PUw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.5.tgz", + "integrity": "sha512-XQVIpICniWXXMoXsr6X7Q3pVcYBeQ0FZF06BNNolkkkVuReYpqr3TwWrZfuB9TUmxdF6R5WZ+M3NAdXodDDUNA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.2.12", + "@angular/core": "16.1.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.12.tgz", - "integrity": "sha512-u2MH9+NRwbbFDRNiPWPexed9CnCq9+pGHLuyACSP2uR6Ik68cE6cayeZbIeoEV5vWpda/XsLmJgPJysw7dAZLQ==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.5.tgz", + "integrity": "sha512-QNyisdr9lEN43v/e/fjS0H1vrJBMY8lIGpxVY1OOERFjA1clfMhaz5fiPE3vWFV5TOm3/ym9z2xuRXM6UoyWoA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.2.12" + "@angular/core": "16.1.5" }, "peerDependenciesMeta": { "@angular/core": { @@ -892,32 +546,30 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.12.tgz", - "integrity": "sha512-9Gkb9KFkaQPz8XaS8ZwwTioRZ4ywykdAWyceICEi78/Y9ConYrTX2SbFogzI2dPUZU8a04tMlbqTSmHjVbJftQ==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.5.tgz", + "integrity": "sha512-j20hmPyM+rLJDU1y0ta9Uf7+o2oGjvGWGpyANbpuTlAfA1+VN5G3xD53FnNcmO6LZuAw0wDw6NDAyy+G55o8xQ==", "dependencies": { - "@babel/core": "^7.17.2", + "@babel/core": "7.22.5", + "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", "tslib": "^2.3.0", "yargs": "^17.2.1" }, "bin": { "ng-xi18n": "bundles/src/bin/ng_xi18n.js", "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/main-ngcc.js" + "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "14.2.12", - "typescript": ">=4.6.2 <4.9" + "@angular/compiler": "16.1.5", + "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/compiler-cli/node_modules/ansi-styles": { @@ -960,17 +612,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@angular/compiler-cli/node_modules/magic-string": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz", - "integrity": "sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -1021,53 +662,53 @@ } }, "node_modules/@angular/core": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.12.tgz", - "integrity": "sha512-sGQxU5u4uawwvJa6jOTmGoisJiQ5HIN/RoBw99CmoqZIVyUSg9IRJJC1KVdH8gbpWBNLkElZv21lwJTL/msWyg==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.5.tgz", + "integrity": "sha512-xmk+WeL3qtFb3BM2hsEq/kGHJinqaTNVJkK/m4TiGArY+hjJwfCOeuTss7nOkKXvhRkZxU9VP0tej1w3QV5Yzw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4 || ~0.12.0" + "zone.js": "~0.13.0" } }, "node_modules/@angular/forms": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.12.tgz", - "integrity": "sha512-7abYlGIT2JnAtutQUlH3fQS6QEpbfftgvsVcZJCyvX0rXL3u2w2vUQkDHJH4YJJp3AHFVCH4/l7R4VcaPnrwvA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.5.tgz", + "integrity": "sha512-4E/5msvODs5tixlkB1iHPsRv7jHj189WMpN2n7LKXT+l+jA3/rD2AbGnYVKR04gymN2x/HQ/qOrbvrqv3E1NBw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.2.12", - "@angular/core": "14.2.12", - "@angular/platform-browser": "14.2.12", + "@angular/common": "16.1.5", + "@angular/core": "16.1.5", + "@angular/platform-browser": "16.1.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.12.tgz", - "integrity": "sha512-YmW6simyEVmpDmbYVUhZ2IxSP6pmsWrV120rB9Y21/BeM39WIXA4NCNirVWlAd/KAKY9O7Sbn1nXI6rSDfhopQ==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.1.5.tgz", + "integrity": "sha512-Zhuoy3KB35fvD52Wg85emmmK38t2oPLHhKYV3pC1WegJunopyF4FkIE1hGqXZyk4VA29QgOT3WC1315FbUiV4Q==", "dev": true, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/localize": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-14.2.12.tgz", - "integrity": "sha512-6TTnuvubvYL1LDIJhDfd7ygxTaj0ShTILCDXT4URBhZKQbQ3HAorDqsc6SXqZVGCHdqF0hGTaeN/7zVvgP9kzA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.1.5.tgz", + "integrity": "sha512-8ApTdmv4sH0VbW9kVNanze5DEmb3OPIGzbD19jzvUSb6mTVMfUcQrsf4h+H8+cT+epBhor8RgVeVbUJaUbaLNQ==", "dependencies": { - "@babel/core": "7.18.9", - "glob": "8.0.3", + "@babel/core": "7.22.5", + "fast-glob": "3.2.12", "yargs": "^17.2.1" }, "bin": { @@ -1076,11 +717,11 @@ "localize-translate": "tools/bundles/src/translate/cli.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "14.2.12", - "@angular/compiler-cli": "14.2.12" + "@angular/compiler": "16.1.5", + "@angular/compiler-cli": "16.1.5" } }, "node_modules/@angular/localize/node_modules/ansi-styles": { @@ -1097,14 +738,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@angular/localize/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/@angular/localize/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1131,35 +764,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@angular/localize/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@angular/localize/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular/localize/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -1210,19 +814,19 @@ } }, "node_modules/@angular/platform-browser": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.12.tgz", - "integrity": "sha512-vOarWym8ucl1gjYWCzdwyBha+MTvL381mvTTUu8aUx6nVhHFjv4bvpjlZnZgojecqUPyxOwmPLLHvCZPJVHZYg==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.5.tgz", + "integrity": "sha512-TLM29KPr0A0pQ0YEmSy0JUOkfBXfwfBFzXQSt9SOiUs0wgDVVLMdGOpR/tbvBx2QfrSU3qgOX8P1FXIPJch6TQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "14.2.12", - "@angular/common": "14.2.12", - "@angular/core": "14.2.12" + "@angular/animations": "16.1.5", + "@angular/common": "16.1.5", + "@angular/core": "16.1.5" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1231,57 +835,55 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.12.tgz", - "integrity": "sha512-oZhNJeaBmgw8+KBSYpKz2RYqEDyETC+HJXH8dwIFcP6BqqwL2NE70FdSR7EnOa5c41MEtTmMCGhrJSFR60x5/w==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.5.tgz", + "integrity": "sha512-ugdIXeN5IVj9o15ywH32hxNI0ZLyakpBGqMTHZSeEhU/uN6ajAJX7z6okdMbJ7dlTyBO8eFV1KDX3aAz+sK9bg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.2.12", - "@angular/compiler": "14.2.12", - "@angular/core": "14.2.12", - "@angular/platform-browser": "14.2.12" + "@angular/common": "16.1.5", + "@angular/compiler": "16.1.5", + "@angular/core": "16.1.5", + "@angular/platform-browser": "16.1.5" } }, "node_modules/@angular/platform-server": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-14.2.12.tgz", - "integrity": "sha512-RDxNh47Rp0EYrimbzviqhagdbL58Z3S88PDYybYbshFwV+MgWsvWasK/WntTMP/JtRP4FBU0Uiwxy7mgVdxb0g==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-16.1.5.tgz", + "integrity": "sha512-hpsjqgEylaE3SFObrVzNLq3g37mM8hUWas0+Gl3/BIsnGxiIuArhW9mhgYjoIgAOhl+jqDiAU1a5eNzivvOMtQ==", "dependencies": { - "domino": "^2.1.2", "tslib": "^2.3.0", "xhr2": "^0.2.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "14.2.12", - "@angular/common": "14.2.12", - "@angular/compiler": "14.2.12", - "@angular/core": "14.2.12", - "@angular/platform-browser": "14.2.12", - "@angular/platform-browser-dynamic": "14.2.12" + "@angular/animations": "16.1.5", + "@angular/common": "16.1.5", + "@angular/compiler": "16.1.5", + "@angular/core": "16.1.5", + "@angular/platform-browser": "16.1.5" } }, "node_modules/@angular/router": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.12.tgz", - "integrity": "sha512-r5tVus5RJDNc4U2v0jMtjPiAS1xDsVsJ70lS313DgZmBDHIVZP1cWIehdxwgNlGwQQtAA36eG7toBwqUU3gb/A==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.5.tgz", + "integrity": "sha512-L1gyWA16U+XgcxWmemWjy08/OPCjch9sBEiHaikuW8i9Ys0nx9ic3wh8Fyu6cVKQE9aQZ7xLYT5CdPPwYxclTw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.2.12", - "@angular/core": "14.2.12", - "@angular/platform-browser": "14.2.12", + "@angular/common": "16.1.5", + "@angular/core": "16.1.5", + "@angular/platform-browser": "16.1.5", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1291,43 +893,43 @@ "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -1339,71 +941,73 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dependencies": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "node_modules/@babel/generator/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1412,26 +1016,41 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1440,13 +1059,33 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1455,140 +1094,138 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", + "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dependencies": { - "@babel/types": "^7.18.6" - }, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -1598,110 +1235,110 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -1710,9 +1347,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1721,11 +1358,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1735,13 +1372,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1751,12 +1388,12 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -1767,201 +1404,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "engines": { "node": ">=6.9.0" }, @@ -2043,11 +1489,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2056,6 +1502,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -2161,28 +1632,60 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2192,11 +1695,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2206,11 +1709,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", - "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2219,19 +1722,50 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -2241,12 +1775,24 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2256,11 +1802,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2270,12 +1816,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2285,11 +1831,26 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2299,12 +1860,27 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2314,11 +1890,11 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2328,13 +1904,28 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2344,11 +1935,26 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -2358,11 +1964,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2372,12 +1978,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2387,13 +1993,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2403,14 +2009,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2420,12 +2026,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2435,12 +2041,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2450,11 +2056,59 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2464,12 +2118,43 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2479,11 +2164,43 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", - "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2493,11 +2210,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2507,12 +2224,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" }, "engines": { "node": ">=6.9.0" @@ -2522,11 +2239,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2536,15 +2253,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", + "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", "semver": "^6.3.0" }, "engines": { @@ -2555,19 +2272,19 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2577,12 +2294,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2592,11 +2309,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2606,11 +2323,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2620,11 +2337,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2634,11 +2351,26 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2648,12 +2380,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2662,38 +2394,41 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", + "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2703,44 +2438,61 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.5", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", "semver": "^6.3.0" }, "engines": { @@ -2751,9 +2503,9 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -2773,43 +2525,48 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2817,51 +2574,118 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/types": "^7.20.2", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@browserify/envify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@browserify/envify/-/envify-6.0.0.tgz", + "integrity": "sha512-ovxHR0KTsRCyMNwD7MGV0+VCU1sT6Ds+itC4DaQHM41eUId+w5Jd0qlhLVoDkkIVBnkY3BAAM8yb2QfpBlHkPw==", + "dependencies": { + "acorn-node": "^2.0.1", + "dash-ast": "^2.0.1", + "multisplice": "^1.0.0", + "through2": "^4.0.2" + }, + "bin": { + "envify": "bin/envify" + } + }, + "node_modules/@browserify/envify/node_modules/acorn-node": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-2.0.1.tgz", + "integrity": "sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/@browserify/envify/node_modules/dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==" + }, + "node_modules/@browserify/envify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@browserify/envify/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/@browserify/uglifyify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@browserify/uglifyify/-/uglifyify-6.0.0.tgz", + "integrity": "sha512-48M2a3novsgKhUSo/B3ja10awc7unliK1HfW6aYBJdLFQj3wXDx9BBJVfj6MVYERSQVEVjNHQQ7IK89h4MpCLw==", + "dependencies": { + "convert-source-map": "^1.9.0", + "minimatch": "^3.0.2", + "terser": "^5.15.1", + "through2": "^4.0.2", + "xtend": "^4.0.1" + } + }, + "node_modules/@browserify/uglifyify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@browserify/uglifyify/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "optional": true, - "peer": true, "engines": { "node": ">=0.1.90" } @@ -2878,276 +2702,10 @@ "node": ">=12" } }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2", - "postcss-selector-parser": "^6.0.10" - } - }, "node_modules/@cypress/request": { - "version": "2.88.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", - "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "version": "2.88.11", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz", + "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", "optional": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -3163,7 +2721,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.5.2", + "qs": "~6.10.3", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", @@ -3173,135 +2731,20 @@ "node": ">= 6" } }, - "node_modules/@cypress/request/node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/@cypress/request/node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "engines": [ - "node >=0.6.0" - ], - "optional": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "node_modules/@cypress/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "optional": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/@cypress/schematic": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@cypress/schematic/-/schematic-2.4.0.tgz", - "integrity": "sha512-aor8hQ+gMXqx/ASdo7CUGo/sMEWwwfSRsLr99rM2GjvW+pZnCKKTnRG4UPf8Ro9SevLJj7KRZAZWxa5MAkJzZA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cypress/schematic/-/schematic-2.5.0.tgz", + "integrity": "sha512-Yt/fQxYIHl9lU8LSoJL92nIwTVyYG5uP4VqW4taTn3viVWvssjK7sRtTI/LRxOoeMYX2RRlXQyUbFEikByn0cQ==", "optional": true, "dependencies": { - "@angular-devkit/architect": "^0.1402.1", - "@angular-devkit/core": "^14.2.1", - "@angular-devkit/schematics": "^14.2.1", - "@schematics/angular": "^14.2.1", "jsonc-parser": "^3.0.0", "rxjs": "~6.6.0" }, "peerDependencies": { - "@angular/cli": ">=12", - "@angular/core": ">=12" + "@angular/cli": ">=14", + "@angular/core": ">=14" } }, - "node_modules/@cypress/schematic/node_modules/@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", - "optional": true, - "dependencies": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@cypress/schematic/node_modules/@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "optional": true, - "dependencies": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@cypress/schematic/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@cypress/schematic/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "optional": true - }, - "node_modules/@cypress/schematic/node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", - "optional": true - }, "node_modules/@cypress/schematic/node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -3314,15 +2757,6 @@ "npm": ">=2.0.0" } }, - "node_modules/@cypress/schematic/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "optional": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/@cypress/schematic/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -3356,10 +2790,160 @@ "node": ">=10.0.0" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "cpu": [ "loong64" ], @@ -3371,6 +2955,171 @@ "node": ">=12" } }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", @@ -3440,55 +3189,50 @@ } }, "node_modules/@fortawesome/angular-fontawesome": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.11.1.tgz", - "integrity": "sha512-Ngzm5MVxk76ZhYpPTNOI/mpYNz9bzwfBXC5L9mktLgOONjBuYBPVt+bH8lny8hNtDk0ppZzXsMN6CO7hckdfnw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.13.0.tgz", + "integrity": "sha512-gzSPRdveOXNO7NIiMgTyB46aiHG0i98KinnAEqHXi8qzraM/kCcHn/0y3f4MhemX6kftwsFli0IU8RyHmtXlSQ==", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "peerDependencies": { - "@angular/core": "^14.0.0", + "@angular/core": "^16.0.0", "@fortawesome/fontawesome-svg-core": "~1.2.27 || ~1.3.0-beta2 || ^6.1.0" } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz", - "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz", - "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz", - "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" - }, "node_modules/@goto-bus-stop/common-shake": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@goto-bus-stop/common-shake/-/common-shake-2.4.0.tgz", @@ -3507,35 +3251,6 @@ "ms": "^2.1.1" } }, - "node_modules/@goto-bus-stop/envify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@goto-bus-stop/envify/-/envify-5.0.0.tgz", - "integrity": "sha512-xAnxuDWmwQxO8CgVuPTxKuNsKDfwyXXTyAabG4sNoK59H/ZMC7BHxTA/4ehtinsxbcH7/9L65F5VhyNdQfUyqA==", - "dependencies": { - "acorn-node": "^2.0.1", - "dash-ast": "^2.0.1", - "multisplice": "^1.0.0", - "through2": "^2.0.5" - }, - "bin": { - "envify": "bin/envify" - } - }, - "node_modules/@goto-bus-stop/envify/node_modules/acorn-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-2.0.1.tgz", - "integrity": "sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/@goto-bus-stop/envify/node_modules/dash-ast": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", - "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==" - }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -3584,6 +3299,95 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3608,46 +3412,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", - "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3657,10 +3424,35 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", @@ -3714,21 +3506,29 @@ } }, "node_modules/@ng-bootstrap/ng-bootstrap": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-13.1.1.tgz", - "integrity": "sha512-R6qnmFKT2EwwijBHw7rUXqyo5W90OImHOv7BlsxMNnZLIksWIhqwU00k4UBTfRTnd6JsTPuj/co3MaP61ajILA==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-15.1.0.tgz", + "integrity": "sha512-4Z/sXYcAq22D15jtlnZV7qztuSnlSlOgO7EVp6rJ8dyGi3CPzX9PqMfetoM6K5sKQTiSW8IfsbdXCWN7rnzxWQ==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^14.1.0", - "@angular/core": "^14.1.0", - "@angular/forms": "^14.1.0", - "@angular/localize": "^14.1.0", - "@popperjs/core": "^2.10.2", + "@angular/common": "^16.0.0", + "@angular/core": "^16.0.0", + "@angular/forms": "^16.0.0", + "@angular/localize": "^16.0.0", + "@popperjs/core": "^2.11.6", "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3762,126 +3562,140 @@ } }, "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dependencies": { - "@gar/promisify": "^1.1.3", "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^2.0.2" + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { "node": ">=12" } }, - "node_modules/@npmcli/git/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dependencies": { + "isexe": "^2.0.0" + }, "bin": { - "mkdirp": "bin/cmd.js" + "node-which": "bin/which.js" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "index.js" + "installed-package-contents": "lib/index.js" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dependencies": { - "infer-owner": "^1.0.4" + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" } }, "node_modules/@popperjs/core": { @@ -3894,95 +3708,6 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@schematics/angular": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.10.tgz", - "integrity": "sha512-YFTc/9QJdx422XcApizEcVLKoyknu8b9zHIlAepZCu7WkV8GPT0hvVEHQ7KBWys5aQ7pPZMT0JpZLeAz0F2xYQ==", - "dependencies": { - "@angular-devkit/core": "14.2.10", - "@angular-devkit/schematics": "14.2.10", - "jsonc-parser": "3.1.0" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "dependencies": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@schematics/angular/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@schematics/angular/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@schematics/angular/node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "node_modules/@schematics/angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@schematics/angular/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@schematics/angular/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -3993,9 +3718,9 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "optional": true }, "node_modules/@sideway/pinpoint": { @@ -4004,51 +3729,70 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "optional": true }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", + "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "optional": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "optional": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "optional": true, "dependencies": { - "@sinonjs/commons": "^1.6.0", + "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "optional": true - }, - "node_modules/@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6.0" + "dependencies": { + "type-detect": "4.0.8" } }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "optional": true + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -4056,6 +3800,14 @@ "optional": true, "peer": true }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -4080,6 +3832,48 @@ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", @@ -4106,9 +3900,9 @@ } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -4122,11 +3916,14 @@ "peer": true }, "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", "optional": true, - "peer": true + "peer": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/eslint": { "version": "8.4.1", @@ -4147,9 +3944,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/@types/express": { "version": "4.17.13", @@ -4195,11 +3992,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, "node_modules/@types/qrcode": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.0.tgz", @@ -4253,9 +4045,9 @@ "optional": true }, "node_modules/@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", "optional": true }, "node_modules/@types/sockjs": { @@ -4267,17 +4059,17 @@ } }, "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "optional": true, "dependencies": { "@types/node": "*" @@ -4316,23 +4108,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/parser": { "version": "5.48.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.1.tgz", @@ -4360,23 +4135,6 @@ } } }, - "node_modules/@typescript-eslint/parser/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.48.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.1.tgz", @@ -4421,23 +4179,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/types": { "version": "5.48.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.1.tgz", @@ -4478,23 +4219,6 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/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, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -4567,134 +4291,145 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -4797,12 +4532,12 @@ } }, "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", "dependencies": { "debug": "^4.1.0", - "depd": "^1.1.2", + "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -4990,9 +4725,9 @@ } }, "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5027,9 +4762,9 @@ "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" }, "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-from": { "version": "2.1.1", @@ -5046,9 +4781,9 @@ } }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "optional": true, "dependencies": { "safer-buffer": "~2.1.0" @@ -5082,7 +4817,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "optional": true, "engines": { "node": ">=0.8" @@ -5119,10 +4854,16 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "optional": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "optional": true }, "node_modules/at-least-node": { @@ -5135,9 +4876,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "funding": [ { "type": "opencollective", @@ -5149,8 +4890,8 @@ } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -5183,43 +4924,56 @@ "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "optional": true, "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "optional": true }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "optional": true, "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, "node_modules/babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 8.9" + "node": ">= 14.15.0" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, "node_modules/babel-plugin-istanbul": { @@ -5238,44 +4992,36 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", + "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.1", + "@nicolo-ribaudo/semver-v6": "^6.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", + "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.1", + "core-js-compat": "^3.31.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", + "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -5318,12 +5064,12 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "optional": true, "dependencies": { "tweetnacl": "^0.14.3" @@ -5416,23 +5162,6 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -5464,9 +5193,9 @@ } }, "node_modules/bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -5474,15 +5203,10 @@ "multicast-dns": "^7.2.5" } }, - "node_modules/bonjour-service/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/bootstrap": { "version": "4.6.2", @@ -5845,9 +5569,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "funding": [ { "type": "opencollective", @@ -5856,13 +5580,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -5897,7 +5625,7 @@ "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "optional": true, "engines": { "node": "*" @@ -5951,31 +5679,25 @@ } }, "node_modules/cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", + "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "minipass": "^5.0.0", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "unique-filename": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/brace-expansion": { @@ -5987,51 +5709,46 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { "node": ">=12" } }, "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" + "node": ">=16 || 14 >=14.17" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cached-path-relative": { @@ -6060,16 +5777,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-matcher": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-2.0.0.tgz", - "integrity": "sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA==", - "dependencies": { - "deep-equal": "^1.0.0", - "espurify": "^2.0.0", - "estraverse": "^4.0.0" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -6087,9 +5794,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", "funding": [ { "type": "opencollective", @@ -6098,13 +5805,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "optional": true }, "node_modules/chai": { @@ -6203,10 +5914,19 @@ } }, "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "optional": true + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "optional": true, + "engines": { + "node": ">=8" + } }, "node_modules/cipher-base": { "version": "1.0.4", @@ -6253,9 +5973,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "optional": true, "dependencies": { "string-width": "^4.2.0" @@ -6264,7 +5984,7 @@ "node": "10.* || >= 12.*" }, "optionalDependencies": { - "colors": "1.4.0" + "@colors/colors": "1.5.0" } }, "node_modules/cli-truncate": { @@ -6354,19 +6074,9 @@ } }, "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "optional": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "node_modules/combine-source-map": { "version": "0.8.0", @@ -6508,6 +6218,14 @@ "typedarray": "^0.0.6" } }, + "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==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -6577,7 +6295,7 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-anything": { "version": "2.0.6", @@ -6613,32 +6331,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -6650,35 +6342,12 @@ "node": ">=10.13.0" } }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dependencies": { - "browserslist": "^4.21.4" + "browserslist": "^4.21.9" }, "funding": { "type": "opencollective", @@ -6705,18 +6374,36 @@ } }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dependencies": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cosmiconfig/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/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/count-lines": { @@ -6773,15 +6460,16 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", + "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", "dependencies": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" } }, @@ -6883,53 +6571,19 @@ "node": "*" } }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" }, "engines": { "node": ">= 12.13.0" @@ -6942,29 +6596,15 @@ "webpack": "^5.0.0" } }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "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": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -6972,9 +6612,9 @@ } }, "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "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" }, @@ -6982,15 +6622,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssdb": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.1.0.tgz", - "integrity": "sha512-Sd99PrFgx28ez4GHu8yoQIufc/70h9oYowDf4EjeIKi8mac9whxRjhM3IaMr6EllP6KKKWtJrMfN6C7T9tIWvQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -7010,13 +6641,13 @@ "peer": true }, "node_modules/cypress": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.7.0.tgz", - "integrity": "sha512-7rq+nmhzz0u6yabCFyPtADU2OOrYt6pvUau9qV7xyifJ/hnsaw/vkr0tnLlcuuQKUAOC1v1M1e4Z0zG7S0IAvA==", + "version": "12.17.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.1.tgz", + "integrity": "sha512-eKfBgO6t8waEyhegL4gxD7tcI6uTCGttu+ZU7y9Hq8BlpMztd7iLeIF4AJFAnbZH1xjX+wwgg4cRKFNSvv3VWQ==", "hasInstallScript": true, "optional": true, "dependencies": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^2.88.11", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", @@ -7030,7 +6661,7 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.4", @@ -7048,12 +6679,12 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -7067,26 +6698,31 @@ } }, "node_modules/cypress-fail-on-console-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-4.0.2.tgz", - "integrity": "sha512-ioSI9Ti30HABK6xxtaa8HXGWeZFFIde/iOyeerRuYAU0dRNKxzzP4+Zi/6q2xNgIQgKF6NKuktZPN4sqnZ5CxA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-4.0.3.tgz", + "integrity": "sha512-v2nPupd2brtxKLkDQX58SbEPWRF/2nDbqPTnYyhPIYHqG7U3P2dGUZ3zraETKKoLhU3+C0otjgB6Vg/bHhocQw==", "optional": true, "dependencies": { "chai": "^4.3.4", - "sinon": "^14.0.0", - "sinon-chai": "^3.7.0" + "sinon": "^15.0.0", + "sinon-chai": "^3.7.0", + "type-detect": "^4.0.8" } }, "node_modules/cypress-wait-until": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz", - "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==", - "optional": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-2.0.0.tgz", + "integrity": "sha512-ulUZyrWBn+OuC8oiQuGKAScDYfpaWnE3dEE/raUo64w4RHQxZrQ/iMIWT4ZjGMMPr3P+BFEALCRnjQeRqzZj6g==", + "optional": true, + "engines": { + "node": ">=18.16.0", + "npm": ">=9.5.1" + } }, "node_modules/cypress/node_modules/@types/node": { - "version": "14.17.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.3.tgz", - "integrity": "sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw==", + "version": "14.18.53", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", + "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==", "optional": true }, "node_modules/cypress/node_modules/ansi-styles": { @@ -7105,9 +6741,9 @@ } }, "node_modules/cypress/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "optional": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -7151,31 +6787,14 @@ "optional": true }, "node_modules/cypress/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "optional": true, "engines": { "node": ">= 6" } }, - "node_modules/cypress/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/cypress/node_modules/execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -7265,15 +6884,6 @@ "node": ">=8.17.0" } }, - "node_modules/cypress/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -7291,7 +6901,7 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "optional": true, "dependencies": { "assert-plus": "^1.0.0" @@ -7311,15 +6921,15 @@ } }, "node_modules/dayjs": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz", - "integrity": "sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==", + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==", "optional": true }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -7357,26 +6967,11 @@ "node": ">=0.12" } }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, "node_modules/default-gateway": { "version": "6.0.3", @@ -7424,7 +7019,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "optional": true, "engines": { "node": ">=0.4.0" @@ -7441,19 +7036,11 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "engines": { - "node": ">= 0.6.0" + "node": ">= 0.8" } }, "node_modules/deps-sort": { @@ -7479,6 +7066,15 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -7553,9 +7149,9 @@ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7589,13 +7185,13 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" @@ -7611,9 +7207,9 @@ } }, "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -7622,11 +7218,11 @@ ] }, "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -7641,13 +7237,13 @@ "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -7666,10 +7262,15 @@ "readable-stream": "^2.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "optional": true, "dependencies": { "jsbn": "~0.1.0", @@ -7677,12 +7278,12 @@ } }, "node_modules/echarts": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.1.tgz", - "integrity": "sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", "dependencies": { "tslib": "2.3.0", - "zrender": "5.4.1" + "zrender": "5.4.4" } }, "node_modules/echarts-gl": { @@ -7708,9 +7309,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + "version": "1.4.463", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz", + "integrity": "sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -7787,9 +7388,9 @@ } }, "node_modules/engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.1.tgz", + "integrity": "sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA==", "optional": true, "peer": true, "dependencies": { @@ -7801,22 +7402,19 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "engine.io-parser": "~5.1.0", + "ws": "~8.11.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", + "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", "optional": true, "peer": true, - "dependencies": { - "@socket.io/base64-arraybuffer": "~1.0.2" - }, "engines": { "node": ">=10.0.0" } @@ -7832,9 +7430,9 @@ } }, "node_modules/engine.io/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "optional": true, "peer": true, "engines": { @@ -7854,9 +7452,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7885,9 +7483,12 @@ "peer": true }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -7955,9 +7556,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" }, "node_modules/es-to-primitive": { "version": "1.2.1", @@ -8050,11 +7651,10 @@ } }, "node_modules/esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "hasInstallScript": true, - "optional": true, "bin": { "esbuild": "bin/esbuild" }, @@ -8062,288 +7662,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", + "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", "bin": { "esbuild": "bin/esbuild" }, @@ -8351,51 +7697,6 @@ "node": ">=12" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -8417,6 +7718,43 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/escope": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", @@ -8717,17 +8055,17 @@ } }, "node_modules/eslint/node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -8834,11 +8172,6 @@ "node": ">=4" } }, - "node_modules/espurify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.1.1.tgz", - "integrity": "sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==" - }, "node_modules/esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", @@ -8921,7 +8254,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } @@ -9034,6 +8367,11 @@ "node": ">=4" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -9075,6 +8413,11 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -9083,51 +8426,6 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9177,48 +8475,6 @@ } ] }, - "node_modules/express/node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/express/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/express/node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -9297,7 +8553,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" ], @@ -9350,7 +8606,8 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "node_modules/fast-safe-stringify": { "version": "2.0.7", @@ -9379,7 +8636,7 @@ "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "optional": true, "dependencies": { "pend": "~1.2.0" @@ -9422,6 +8679,55 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -9493,10 +8799,36 @@ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "optional": true, "engines": { "node": "*" @@ -9539,7 +8871,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -9582,31 +8914,21 @@ "node": ">=12" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^5.0.0" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -9631,14 +8953,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -9728,16 +9042,10 @@ "async": "^3.2.0" } }, - "node_modules/getos/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "optional": true - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "optional": true, "dependencies": { "assert-plus": "^1.0.0" @@ -9779,9 +9087,9 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "optional": true, "dependencies": { "ini": "2.0.0" @@ -9994,20 +9302,20 @@ } }, "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dependencies": { "lru-cache": "^7.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { "node": ">=12" } @@ -10024,9 +9332,19 @@ } }, "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/htmlescape": { "version": "1.1.1", @@ -10036,10 +9354,28 @@ "node": ">=0.10" } }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-deceiver": { "version": "1.2.7", @@ -10061,14 +9397,6 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/http-errors/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -10095,6 +9423,19 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-proxy-middleware": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", @@ -10118,6 +9459,20 @@ } } }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -10202,14 +9557,14 @@ } }, "node_modules/ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "dependencies": { - "minimatch": "^5.0.1" + "minimatch": "^9.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/ignore-walk/node_modules/brace-expansion": { @@ -10221,14 +9576,17 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/image-size": { @@ -10243,6 +9601,11 @@ "node": ">=0.10.0" } }, + "node_modules/immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -10282,11 +9645,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -10302,11 +9660,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/inline-source-map": { @@ -10456,9 +9814,9 @@ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "engines": { "node": ">= 10" } @@ -10532,12 +9890,12 @@ } }, "node_modules/is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "optional": true, "dependencies": { - "ci-info": "^3.1.1" + "ci-info": "^3.2.0" }, "bin": { "is-ci": "bin.js" @@ -10779,7 +10137,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "optional": true }, "node_modules/is-unicode-supported": { @@ -10835,7 +10193,7 @@ "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { "node": ">=0.10.0" } @@ -10843,7 +10201,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "optional": true }, "node_modules/istanbul-lib-coverage": { @@ -10870,13 +10228,30 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, + "node_modules/jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -10912,16 +10287,24 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", "optional": true, "dependencies": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", + "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, @@ -10961,7 +10344,7 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "optional": true }, "node_modules/jsesc": { @@ -11000,7 +10383,7 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "optional": true }, "node_modules/json5": { @@ -11014,6 +10397,11 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -11026,15 +10414,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -11058,6 +10437,21 @@ "node": "*" } }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "engines": [ + "node >=0.6.0" + ], + "optional": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -11196,26 +10590,6 @@ "node": ">=8.17.0" } }, - "node_modules/karma/node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "optional": true, - "peer": true, - "engines": { - "node": "*" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -11225,9 +10599,9 @@ } }, "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "engines": { "node": ">= 8" } @@ -11241,6 +10615,15 @@ "stream-splicer": "^2.0.0" } }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -11276,9 +10659,9 @@ } }, "node_modules/less-loader": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dependencies": { "klona": "^2.0.4" }, @@ -11329,9 +10712,9 @@ } }, "node_modules/less/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "optional": true, "bin": { "semver": "bin/semver" @@ -11346,18 +10729,6 @@ "node": ">=0.10.0" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/license-webpack-plugin": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", @@ -11388,16 +10759,17 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listr2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", - "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", "optional": true, "dependencies": { "cli-truncate": "^2.1.0", - "colorette": "^1.2.2", + "colorette": "^2.0.16", "log-update": "^4.0.0", "p-map": "^4.0.0", - "rxjs": "^6.6.7", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, @@ -11406,6 +10778,11 @@ }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, "node_modules/listr2/node_modules/ansi-styles": { @@ -11441,24 +10818,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "optional": true }, - "node_modules/listr2/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "optional": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/listr2/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -11700,24 +11059,6 @@ "node": ">=8.0" } }, - "node_modules/log4js/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -11729,6 +11070,17 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -11744,9 +11096,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -11758,56 +11110,34 @@ "dev": true }, "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dependencies": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { "node": ">=12" } @@ -11837,11 +11167,11 @@ } }, "node_modules/memfs": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", - "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -11850,7 +11180,7 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -11868,7 +11198,7 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } @@ -11943,9 +11273,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dependencies": { "schema-utils": "^4.0.0" }, @@ -11960,55 +11290,6 @@ "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/minify-stream": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/minify-stream/-/minify-stream-2.1.0.tgz", @@ -12109,17 +11390,17 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { "node": ">=8" } @@ -12135,17 +11416,28 @@ "node": ">= 8" } }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dependencies": { - "minipass": "^3.1.6", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dependencies": { + "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" @@ -12162,6 +11454,17 @@ "node": ">= 8" } }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-json-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", @@ -12171,6 +11474,17 @@ "minipass": "^3.0.0" } }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -12182,6 +11496,17 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -12193,6 +11518,17 @@ "node": ">=8" } }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -12205,6 +11541,17 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -12224,9 +11571,9 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mock-socket": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", - "integrity": "sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.2.1.tgz", + "integrity": "sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag==", "optional": true, "engines": { "node": ">= 8" @@ -12260,15 +11607,23 @@ "node": ">= 0.8.0" } }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "engines": { + "node": ">=10" + } + }, "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==" }, "node_modules/multi-stage-sourcemap": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz", - "integrity": "sha512-umaOM+8BZByZIB/ciD3dQLzTv50rEkkGJV78ta/tIVc/J/rfGZY5y1R+fBD3oTaolx41mK8rRcyGtYbDXlzx8Q==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.3.1.tgz", + "integrity": "sha512-UiTLYjqeIoVnJHyWGskwMKIhtZKK9uXUjSTWuwatarrc0d2H/6MAVFdwvEA/aKOHamIn7z4tfvxjz+FYucFpNQ==", "dependencies": { "source-map": "^0.1.34" } @@ -12382,9 +11737,15 @@ } }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12461,9 +11822,9 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, "node_modules/ngx-echarts": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/ngx-echarts/-/ngx-echarts-14.0.0.tgz", - "integrity": "sha512-Q8J/DXiWqYM2vqTfQq16A7KyxbWECZSiAApS0rBjsAJCPjG/VZogUe0snZ/i3mA6bV3vYm41imTYOaH+Rl97QA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ngx-echarts/-/ngx-echarts-16.0.0.tgz", + "integrity": "sha512-hdM7/CL29bY3sF3V5ihb7H1NeUsQlhijp8tVxT23+vkNTf9SJrUHPjs9oHOMkbTlr2Q8HB+eVpckYAL/tuK0CQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -12472,15 +11833,15 @@ } }, "node_modules/ngx-infinite-scroll": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-14.0.1.tgz", - "integrity": "sha512-PlGL29d2PxNJTn6qdXs4Es0HlJTZ/ZqOVvFWECWm7mK2fN/q+q62s0iUQ7xRf76NuqoNovXvrjZ1zwLFT6c0Wg==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-16.0.0.tgz", + "integrity": "sha512-bzyNYd+wVlUUxcopRVr2DAa81eEc8vITtKVvb+c7R1uy8hWPTlxOEXf3L1qA4FMwTEzCQ9b37TXzlJji3qBy+A==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": ">=14.0.0 <15.0.0", - "@angular/core": ">=14.0.0 <15.0.0" + "@angular/common": ">=16.0.0 <17.0.0", + "@angular/core": ">=16.0.0 <17.0.0" } }, "node_modules/nice-napi": { @@ -12498,18 +11859,27 @@ } }, "node_modules/nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "optional": true, "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" } }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "optional": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, "node_modules/nise/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -12540,14 +11910,15 @@ } }, "node_modules/node-gyp": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -12559,7 +11930,7 @@ "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": "^12.13 || ^14.13 || >=16" } }, "node_modules/node-gyp-build": { @@ -12574,9 +11945,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/nopt": { "version": "6.0.0", @@ -12593,17 +11964,17 @@ } }, "node_modules/normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "dependencies": { - "hosted-git-info": "^5.0.0", + "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-path": { @@ -12623,145 +11994,89 @@ } }, "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" + "ignore-walk": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-packlist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-packlist/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-packlist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-packlist/node_modules/npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-run-path": { @@ -12790,9 +12105,9 @@ } }, "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "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==", "dependencies": { "boolbase": "^1.0.0" }, @@ -12816,21 +12131,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -12905,9 +12205,9 @@ } }, "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -12920,22 +12220,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -13045,6 +12329,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -13123,48 +12408,34 @@ } }, "node_modules/pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/pacote/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/pako": { @@ -13229,33 +12500,38 @@ } }, "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dependencies": { - "parse5": "^6.0.1" + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dependencies": { - "parse5": "^6.0.1" + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parseurl": { @@ -13303,10 +12579,33 @@ "node": ">= 0.8.0" } }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -13352,13 +12651,13 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "optional": true }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "optional": true }, "node_modules/picocolors": { @@ -13367,9 +12666,9 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -13381,6 +12680,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -13429,9 +12729,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "funding": [ { "type": "opencollective", @@ -13440,10 +12740,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -13451,317 +12755,15 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.10", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.10.tgz", - "integrity": "sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, "node_modules/postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", + "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" + "cosmiconfig": "^8.1.3", + "jiti": "^1.18.2", + "klona": "^2.0.6", + "semver": "^7.3.8" }, "engines": { "node": ">= 14.15.0" @@ -13775,28 +12777,6 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", @@ -13809,9 +12789,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -13852,201 +12832,10 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14060,24 +12849,16 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/prettier": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.2.tgz", - "integrity": "sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -14103,11 +12884,11 @@ } }, "node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/process": { @@ -14163,7 +12944,7 @@ "node_modules/proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", "optional": true }, "node_modules/prr": { @@ -14188,9 +12969,9 @@ } }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "optional": true }, "node_modules/public-encrypt": { @@ -14278,12 +13059,18 @@ } }, "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", "optional": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/querystring": { @@ -14361,14 +13148,6 @@ "node": ">= 0.8" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, "node_modules/read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", @@ -14378,29 +13157,37 @@ } }, "node_modules/read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-package-json/node_modules/brace-expansion": { @@ -14412,40 +13199,46 @@ } }, "node_modules/read-package-json/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/read-package-json/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/readable-stream": { @@ -14500,9 +13293,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.1", @@ -14517,22 +13310,6 @@ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -14546,13 +13323,13 @@ } }, "node_modules/regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" @@ -14561,11 +13338,6 @@ "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" - }, "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", @@ -14621,11 +13393,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -14700,8 +13472,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "optional": true, - "peer": true + "optional": true }, "node_modules/rimraf": { "version": "3.0.2", @@ -14726,6 +13497,21 @@ "inherits": "^2.0.1" } }, + "node_modules/rollup": { + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -14757,9 +13543,9 @@ } }, "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { "tslib": "^2.1.0" } @@ -14775,9 +13561,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", + "version": "1.63.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", + "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -14787,15 +13573,15 @@ "sass": "sass.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz", + "integrity": "sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==", "dependencies": { - "klona": "^2.0.4", + "klona": "^2.0.6", "neo-async": "^2.6.2" }, "engines": { @@ -14807,7 +13593,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -14827,33 +13613,61 @@ } } }, - "node_modules/sass/node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" - }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true }, "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/scope-analyzer": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.1.tgz", @@ -14890,9 +13704,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14903,10 +13717,81 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dependencies": { "randombytes": "^2.1.0" } @@ -14914,7 +13799,7 @@ "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -14936,10 +13821,18 @@ "ms": "2.0.0" } }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -14953,18 +13846,32 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -15048,6 +13955,22 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/sigstore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", + "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/tuf": "^1.0.1", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -15068,16 +13991,16 @@ ] }, "node_modules/sinon": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", - "integrity": "sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "optional": true, "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", - "diff": "^5.0.0", - "nise": "^5.1.1", + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", "supports-color": "^7.2.0" }, "funding": { @@ -15193,34 +14116,60 @@ } }, "node_modules/socket.io": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", - "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.1.tgz", + "integrity": "sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw==", "optional": true, "peer": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.2.1", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.1" + "engine.io": "~6.5.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", "optional": true, - "peer": true + "peer": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "optional": true, "peer": true, "dependencies": { @@ -15267,26 +14216,10 @@ "node": ">= 10" } }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "engines": { "node": ">= 8" } @@ -15300,9 +14233,9 @@ } }, "node_modules/source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dependencies": { "abab": "^2.0.6", "iconv-lite": "^0.6.3", @@ -15353,9 +14286,9 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15376,9 +14309,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" }, "node_modules/spdy": { "version": "4.0.2", @@ -15409,9 +14342,9 @@ } }, "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15434,9 +14367,9 @@ } }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "optional": true, "dependencies": { "asn1": "~0.2.3", @@ -15459,29 +14392,30 @@ } }, "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", "dependencies": { - "minipass": "^3.1.1" + "minipass": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/start-server-and-test": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.14.0.tgz", - "integrity": "sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.0.tgz", + "integrity": "sha512-UqKLw0mJbfrsG1jcRLTUlvuRi9sjNuUiDOLI42r7R5fA9dsFoywAy9DoLXNYys9B886E4RCKb+qM1Gzu96h7DQ==", "optional": true, "dependencies": { + "arg": "^5.0.2", "bluebird": "3.7.2", "check-more-types": "2.24.0", - "debug": "4.3.2", + "debug": "4.3.4", "execa": "5.1.1", "lazy-ass": "1.6.0", "ps-tree": "1.2.0", - "wait-on": "6.0.0" + "wait-on": "7.0.1" }, "bin": { "server-test": "src/bin/start.js", @@ -15492,6 +14426,12 @@ "node": ">=6" } }, + "node_modules/start-server-and-test/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "optional": true + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -15568,6 +14508,20 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -15603,6 +14557,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -15623,48 +14589,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "bin": { - "stylus": "bin/stylus" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://opencollective.com/stylus" - } - }, - "node_modules/stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", - "dependencies": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "stylus": ">=0.52.4", - "webpack": "^5.0.0" - } - }, "node_modules/subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -15720,13 +14644,13 @@ } }, "node_modules/tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -15735,6 +14659,28 @@ "node": ">=10" } }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -15747,12 +14693,12 @@ } }, "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -15764,16 +14710,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dependencies": { - "jest-worker": "^27.0.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.0" + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -15784,12 +14729,37 @@ }, "peerDependencies": { "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15803,18 +14773,10 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/terser/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "bin": { "acorn": "bin/acorn" }, @@ -15871,30 +14833,70 @@ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "node_modules/tinyify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyify/-/tinyify-3.1.0.tgz", - "integrity": "sha512-r4tHoDkWhhoItWbxJ3KCHXask3hJN7gCUkR5PLfnQzQagTA6oDkzhCbiEDHkMqo7Ck7vVSA1pTP1gDc9p1AC1w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tinyify/-/tinyify-4.0.0.tgz", + "integrity": "sha512-jNDxImwUrJJAU2NyGG144J8aWx2ni39UuBo7ppCXFRmhSH0CbpWL4HgjNvrsAW05WQAgNZePwAlEemNuB+byaA==", "dependencies": { - "@goto-bus-stop/envify": "^5.0.0", - "acorn-node": "^1.8.2", + "@browserify/envify": "^6.0.0", + "@browserify/uglifyify": "^6.0.0", "browser-pack-flat": "^3.0.9", "bundle-collapser": "^1.3.0", "common-shakeify": "^1.1.1", - "dash-ast": "^1.0.0", "minify-stream": "^2.0.1", "multisplice": "^1.0.0", - "through2": "^3.0.1", - "uglifyify": "^5.0.0", - "unassertify": "^2.1.1" + "terser": "3.16.1", + "through2": "^4.0.2", + "unassertify": "^3.0.1" + } + }, + "node_modules/tinyify/node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "node_modules/tinyify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tinyify/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyify/node_modules/terser": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", + "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", + "dependencies": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.9" + }, + "bin": { + "terser": "bin/uglifyjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/tinyify/node_modules/through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "readable-stream": "3" } }, "node_modules/tlite": { @@ -15940,6 +14942,19 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "optional": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/transform-ast": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/transform-ast/-/transform-ast-2.4.4.tgz", @@ -16073,9 +15088,9 @@ } }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -16098,10 +15113,23 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "optional": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -16113,7 +15141,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "optional": true }, "node_modules/type": { @@ -16121,17 +15149,6 @@ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -16175,9 +15192,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "node_modules/typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16186,45 +15203,24 @@ "node": ">=4.2.0" } }, - "node_modules/uglifyify": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/uglifyify/-/uglifyify-5.0.2.tgz", - "integrity": "sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q==", - "dependencies": { - "convert-source-map": "~1.1.0", - "minimatch": "^3.0.2", - "terser": "^3.7.5", - "through": "~2.3.4", - "xtend": "^4.0.1" - } - }, - "node_modules/uglifyify/node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" - }, - "node_modules/uglifyify/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "optional": true, + "peer": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uglifyify/node_modules/terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", - "dependencies": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" - }, - "bin": { - "terser": "bin/uglifyjs" - }, - "engines": { - "node": ">=6.0.0" + "node": "*" } }, "node_modules/umd": { @@ -16236,36 +15232,38 @@ } }, "node_modules/unassert": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.6.0.tgz", - "integrity": "sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unassert/-/unassert-2.0.2.tgz", + "integrity": "sha512-P6OOg/aRdQmWH+b0g+T4U+9MgL+DG7w6oQPG+N3F2IMuvvd1WfZ5alT/Rjik2lMFVyhfACUxF7PGP1VCwSHlQA==", "dependencies": { - "acorn": "^7.0.0", - "call-matcher": "^2.0.0", - "deep-equal": "^1.0.0", - "espurify": "^2.0.1", - "estraverse": "^4.1.0", - "esutils": "^2.0.2", - "object-assign": "^4.1.0" + "estraverse": "^5.0.0" + } + }, + "node_modules/unassert/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" } }, "node_modules/unassertify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-2.1.1.tgz", - "integrity": "sha512-YIAaIlc6/KC9Oib8cVZLlpDDhK1UTEuaDyx9BwD97xqxDZC0cJOqwFcs/Y6K3m73B5VzHsRTBLXNO0dxS/GkTw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-3.0.1.tgz", + "integrity": "sha512-461ykSPY3oWU+39J5haiq7S/hcYy1oGJ2nHU92lqdL3jft+pSU6oAbb7o6VVmM7nZGLqppszgyzfpCnRBFgFtw==", "dependencies": { - "acorn": "^5.1.0", + "acorn": "^8.0.0", "convert-source-map": "^1.1.1", - "escodegen": "^1.6.1", - "multi-stage-sourcemap": "^0.2.1", + "escodegen": "^2.0.0", + "multi-stage-sourcemap": "^0.3.1", "through": "^2.3.7", - "unassert": "^1.3.1" + "unassert": "^2.0.0" } }, "node_modules/unassertify/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "bin": { "acorn": "bin/acorn" }, @@ -16273,36 +15271,6 @@ "node": ">=0.4.0" } }, - "node_modules/unassertify/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/unassertify/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -16369,19 +15337,34 @@ } }, "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dependencies": { - "unique-slug": "^2.0.0" + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dependencies": { "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "optional": true, + "engines": { + "node": ">= 10.0.0" } }, "node_modules/unpipe": { @@ -16402,9 +15385,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "funding": [ { "type": "opencollective", @@ -16413,6 +15396,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -16420,7 +15407,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -16485,14 +15472,14 @@ } }, "node_modules/validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dependencies": { "builtins": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/vary": { @@ -16506,7 +15493,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -16517,6 +15504,53 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -16533,22 +15567,22 @@ } }, "node_modules/wait-on": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz", - "integrity": "sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", + "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", "optional": true, "dependencies": { - "axios": "^0.21.1", - "joi": "^17.4.0", + "axios": "^0.27.2", + "joi": "^17.7.0", "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.1.0" + "minimist": "^1.2.7", + "rxjs": "^7.8.0" }, "bin": { "wait-on": "bin/wait-on" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" } }, "node_modules/watchpack": { @@ -16580,21 +15614,21 @@ } }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -16603,9 +15637,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -16626,6 +15660,91 @@ } }, "node_modules/webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", @@ -16647,200 +15766,10 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "node_modules/webpack-dev-server/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==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" @@ -16878,9 +15807,9 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "bin": { "acorn": "bin/acorn" }, @@ -16889,17 +15818,17 @@ } }, "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", - "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "peerDependencies": { "acorn": "^8" } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -16997,17 +15926,9 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" }, "node_modules/wrap-ansi": { "version": "6.2.0", @@ -17022,6 +15943,53 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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==" + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -17062,10 +16030,30 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xhr2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.0.tgz", - "integrity": "sha512-BDtiD0i2iKPK/S8OAZfpk6tyzEDnKKSjxWHcMBVmh+LuqJ8A32qXTyOx+TVOg2dKvq6zGBq2sgKPkEeRs1qTRA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", "engines": { "node": ">= 6" } @@ -17088,14 +16076,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -17216,7 +16196,7 @@ "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "optional": true, "dependencies": { "buffer-crc32": "~0.2.3", @@ -17236,6 +16216,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, @@ -17244,17 +16225,17 @@ } }, "node_modules/zone.js": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz", - "integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", + "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", "dependencies": { "tslib": "^2.3.0" } }, "node_modules/zrender": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.1.tgz", - "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", "dependencies": { "tslib": "2.3.0" } @@ -17266,334 +16247,153 @@ } }, "dependencies": { - "@adobe/css-tools": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", - "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==" + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true }, "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, - "@angular-devkit/build-angular": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.10.tgz", - "integrity": "sha512-VCeZAyq4uPCJukKInaSiD4i/GgxgcU4jFlLFQtoYNmaBS4xbPOymL19forRIihiV0dwNEa2L694vRTAPMBxIfw==", + "@angular-devkit/architect": { + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1601.4.tgz", + "integrity": "sha512-OOSbNlDy+Q3jY0oFHaq8kkna9HYI1zaS8IHeCIDP6T/ZIAVad4+HqXAL4SKQrKJikkoBQv1Z/eaDBL5XPFK9Bw==", "requires": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.10", - "@angular-devkit/build-webpack": "0.1402.10", - "@angular-devkit/core": "14.2.10", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", + "@angular-devkit/core": "16.1.4", + "rxjs": "7.8.1" + } + }, + "@angular-devkit/build-angular": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.1.4.tgz", + "integrity": "sha512-LiHM7R20fTHg/eM+Iabotj08edP5wVBQahRfVNLxERo8X6VJgSjVChnsh3AQJkRywlGuFe20AOQYpyLyN367Ug==", + "requires": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/build-webpack": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@babel/core": "7.22.5", + "@babel/generator": "7.22.7", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.5", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.5", + "@babel/preset-env": "7.22.5", + "@babel/runtime": "7.22.5", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.10", + "@ngtools/webpack": "16.1.4", + "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.2", "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", + "browserslist": "^4.21.5", + "cacache": "17.1.3", + "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild": "0.15.5", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", + "critters": "0.0.19", + "css-loader": "6.8.1", + "esbuild": "0.17.19", + "esbuild-wasm": "0.17.19", + "fast-glob": "3.2.12", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", + "jsonc-parser": "3.2.0", "karma-source-map-support": "1.4.0", "less": "4.1.3", - "less-loader": "11.0.0", + "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", + "magic-string": "0.30.0", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", + "postcss": "8.4.24", + "postcss-loader": "7.3.2", "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", + "rxjs": "7.8.1", + "sass": "1.63.2", + "sass-loader": "13.3.1", + "semver": "7.5.3", + "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", + "terser": "5.17.7", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.74.0", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", + "tslib": "2.5.3", + "vite": "4.3.9", + "webpack": "5.86.0", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.0", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", - "requires": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" - } - }, - "@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - } - }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, "@ngtools/webpack": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.10.tgz", - "integrity": "sha512-sLHapZLVub6mEz5b19tf1VfIV1w3tYfg7FNPLeni79aldxu1FbP1v2WmiFAnMzrswqyK0bhTtxrl+Z/CLKqyoQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.1.4.tgz", + "integrity": "sha512-+8bfavDH8eWxjlJFYr6bkjcRHhy95j+f8oNn7/sGLNu4L96nuE2AZ011XIu2dJahCnNiBvwc1EpkKa92t9rkaA==", "requires": {} }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, "loader-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "requires": { "lru-cache": "^6.0.0" } }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" } } }, "@angular-devkit/build-webpack": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.10.tgz", - "integrity": "sha512-h+2MaSY7QSvoJ3R+Hvin21jVCfPGOTLdASIUk4Jmq6J3y5BSku3KSSaV8dWoBOBkFCwQyPQMRjiHoHKLpC1K7g==", + "version": "0.1601.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1601.4.tgz", + "integrity": "sha512-GC1y//ScAYbYQ68Wri2QgTEekC4hRxBC+xEkYL9OFiAMQ4mcN+eYvbkQBX8enJwDMXpkYfLR6VV8cChjAVYIgg==", "requires": { - "@angular-devkit/architect": "0.1402.10", - "rxjs": "6.6.7" - }, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", - "requires": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" - } - }, - "@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@angular-devkit/architect": "0.1601.4", + "rxjs": "7.8.1" } }, - "@angular-devkit/schematics": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.10.tgz", - "integrity": "sha512-MMp31KpJTwKHisXOq+6VOXYApq97hZxFaFmZk396X5aIFTCELUwjcezQDk+u2nEs5iK/COUfnN3plGcfJxYhQA==", + "@angular-devkit/core": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.1.4.tgz", + "integrity": "sha512-WCAzNi9LxpFIi2WVPaJQd2kHPqCnCexWzUZN05ltJuBGCQL1O+LgRHGwnQ4WZoqmrF5tcWt2a3GFtJ3DgMc1hw==", "requires": { - "@angular-devkit/core": "14.2.10", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", - "ora": "5.4.1", - "rxjs": "6.6.7" + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "dependencies": { - "@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - } - }, "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -17605,105 +16405,62 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } }, "@angular/animations": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.12.tgz", - "integrity": "sha512-gwdnFZkvVUr+enUNfhfCGRGGqNHn1+vTA81apLfHYhJxgjiLUtETc4KTOrQevtDm022pEd+LSrvr8r+7ag+jkw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.1.5.tgz", + "integrity": "sha512-CUm81m1N00EIza8LH81BJ+PoR23HzfoD+8ltASya9D0VurB6hlv0Axa5kQ0o02PQwCAU1a6RUUTsTjODc/mUYA==", "requires": { "tslib": "^2.3.0" } }, "@angular/cli": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.10.tgz", - "integrity": "sha512-gX9sAKOwq4lKdPWeABB7TzKDHdjQXvkUU8NmPJA6mEAVXvm3lhQtFvHDalZstwK8au2LY0LaXTcEtcKYOt3AXQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.1.4.tgz", + "integrity": "sha512-coSOLVLpOCOD5q9K9EAFFMrTES+HtdJiLy/iI9kdKNCKWUJpm8/svZ3JZOej3vPxYEp0AokXNOwORQnX21/qZQ==", "requires": { - "@angular-devkit/architect": "0.1402.10", - "@angular-devkit/core": "14.2.10", - "@angular-devkit/schematics": "14.2.10", - "@schematics/angular": "14.2.10", + "@angular-devkit/architect": "0.1601.4", + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "@schematics/angular": "16.1.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", + "ini": "4.1.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", "ora": "5.4.1", - "pacote": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.3", "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" + "yargs": "17.7.2" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", + "@angular-devkit/schematics": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.1.4.tgz", + "integrity": "sha512-yjRgwHAfFaeuimgbQtjwSUyXzEHpMSdTRb2zg+TOp6skoGvHOG8xXFJ7DjBkSMeAQdFF0fkxhPS9YmlxqNc+7A==", "requires": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" + "@angular-devkit/core": "16.1.4", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.0", + "ora": "5.4.1", + "rxjs": "7.8.1" } }, - "@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", + "@schematics/angular": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.1.4.tgz", + "integrity": "sha512-XfoeL+aBVIR/DzgVKGVhHW/TGQnqWvngyJVuCwXEVWzNfjxHYFkchXa78OItpAvTEr6/Y0Me9FQVAGVA4mMUyg==", "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@angular-devkit/core": "16.1.4", + "@angular-devkit/schematics": "16.1.4", + "jsonc-parser": "3.2.0" } }, "ansi-styles": { @@ -17715,12 +16472,12 @@ } }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -17737,50 +16494,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "requires": { "lru-cache": "^6.0.0" } }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -17797,17 +16518,17 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { @@ -17818,34 +16539,32 @@ } }, "@angular/common": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.12.tgz", - "integrity": "sha512-oZunh9wfInFWhNO1P8uoEs/o4u8kerKMhw8GruywKm1TV7gHDP2Fi5WHGjFqq3XYptgBTPCTSEfyLX6Cwq1PUw==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.1.5.tgz", + "integrity": "sha512-XQVIpICniWXXMoXsr6X7Q3pVcYBeQ0FZF06BNNolkkkVuReYpqr3TwWrZfuB9TUmxdF6R5WZ+M3NAdXodDDUNA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.12.tgz", - "integrity": "sha512-u2MH9+NRwbbFDRNiPWPexed9CnCq9+pGHLuyACSP2uR6Ik68cE6cayeZbIeoEV5vWpda/XsLmJgPJysw7dAZLQ==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.1.5.tgz", + "integrity": "sha512-QNyisdr9lEN43v/e/fjS0H1vrJBMY8lIGpxVY1OOERFjA1clfMhaz5fiPE3vWFV5TOm3/ym9z2xuRXM6UoyWoA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.12.tgz", - "integrity": "sha512-9Gkb9KFkaQPz8XaS8ZwwTioRZ4ywykdAWyceICEi78/Y9ConYrTX2SbFogzI2dPUZU8a04tMlbqTSmHjVbJftQ==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.1.5.tgz", + "integrity": "sha512-j20hmPyM+rLJDU1y0ta9Uf7+o2oGjvGWGpyANbpuTlAfA1+VN5G3xD53FnNcmO6LZuAw0wDw6NDAyy+G55o8xQ==", "requires": { - "@babel/core": "^7.17.2", + "@babel/core": "7.22.5", + "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", "tslib": "^2.3.0", "yargs": "^17.2.1" }, @@ -17881,14 +16600,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "magic-string": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz", - "integrity": "sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -17926,34 +16637,34 @@ } }, "@angular/core": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.12.tgz", - "integrity": "sha512-sGQxU5u4uawwvJa6jOTmGoisJiQ5HIN/RoBw99CmoqZIVyUSg9IRJJC1KVdH8gbpWBNLkElZv21lwJTL/msWyg==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.1.5.tgz", + "integrity": "sha512-xmk+WeL3qtFb3BM2hsEq/kGHJinqaTNVJkK/m4TiGArY+hjJwfCOeuTss7nOkKXvhRkZxU9VP0tej1w3QV5Yzw==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.12.tgz", - "integrity": "sha512-7abYlGIT2JnAtutQUlH3fQS6QEpbfftgvsVcZJCyvX0rXL3u2w2vUQkDHJH4YJJp3AHFVCH4/l7R4VcaPnrwvA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.1.5.tgz", + "integrity": "sha512-4E/5msvODs5tixlkB1iHPsRv7jHj189WMpN2n7LKXT+l+jA3/rD2AbGnYVKR04gymN2x/HQ/qOrbvrqv3E1NBw==", "requires": { "tslib": "^2.3.0" } }, "@angular/language-service": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.12.tgz", - "integrity": "sha512-YmW6simyEVmpDmbYVUhZ2IxSP6pmsWrV120rB9Y21/BeM39WIXA4NCNirVWlAd/KAKY9O7Sbn1nXI6rSDfhopQ==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.1.5.tgz", + "integrity": "sha512-Zhuoy3KB35fvD52Wg85emmmK38t2oPLHhKYV3pC1WegJunopyF4FkIE1hGqXZyk4VA29QgOT3WC1315FbUiV4Q==", "dev": true }, "@angular/localize": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-14.2.12.tgz", - "integrity": "sha512-6TTnuvubvYL1LDIJhDfd7ygxTaj0ShTILCDXT4URBhZKQbQ3HAorDqsc6SXqZVGCHdqF0hGTaeN/7zVvgP9kzA==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-16.1.5.tgz", + "integrity": "sha512-8ApTdmv4sH0VbW9kVNanze5DEmb3OPIGzbD19jzvUSb6mTVMfUcQrsf4h+H8+cT+epBhor8RgVeVbUJaUbaLNQ==", "requires": { - "@babel/core": "7.18.9", - "glob": "8.0.3", + "@babel/core": "7.22.5", + "fast-glob": "3.2.12", "yargs": "^17.2.1" }, "dependencies": { @@ -17965,14 +16676,6 @@ "color-convert": "^2.0.1" } }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -17996,26 +16699,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -18053,35 +16736,34 @@ } }, "@angular/platform-browser": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.12.tgz", - "integrity": "sha512-vOarWym8ucl1gjYWCzdwyBha+MTvL381mvTTUu8aUx6nVhHFjv4bvpjlZnZgojecqUPyxOwmPLLHvCZPJVHZYg==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.1.5.tgz", + "integrity": "sha512-TLM29KPr0A0pQ0YEmSy0JUOkfBXfwfBFzXQSt9SOiUs0wgDVVLMdGOpR/tbvBx2QfrSU3qgOX8P1FXIPJch6TQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.12.tgz", - "integrity": "sha512-oZhNJeaBmgw8+KBSYpKz2RYqEDyETC+HJXH8dwIFcP6BqqwL2NE70FdSR7EnOa5c41MEtTmMCGhrJSFR60x5/w==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.5.tgz", + "integrity": "sha512-ugdIXeN5IVj9o15ywH32hxNI0ZLyakpBGqMTHZSeEhU/uN6ajAJX7z6okdMbJ7dlTyBO8eFV1KDX3aAz+sK9bg==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-server": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-14.2.12.tgz", - "integrity": "sha512-RDxNh47Rp0EYrimbzviqhagdbL58Z3S88PDYybYbshFwV+MgWsvWasK/WntTMP/JtRP4FBU0Uiwxy7mgVdxb0g==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-16.1.5.tgz", + "integrity": "sha512-hpsjqgEylaE3SFObrVzNLq3g37mM8hUWas0+Gl3/BIsnGxiIuArhW9mhgYjoIgAOhl+jqDiAU1a5eNzivvOMtQ==", "requires": { - "domino": "^2.1.2", "tslib": "^2.3.0", "xhr2": "^0.2.0" } }, "@angular/router": { - "version": "14.2.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.12.tgz", - "integrity": "sha512-r5tVus5RJDNc4U2v0jMtjPiAS1xDsVsJ70lS313DgZmBDHIVZP1cWIehdxwgNlGwQQtAA36eG7toBwqUU3gb/A==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.1.5.tgz", + "integrity": "sha512-L1gyWA16U+XgcxWmemWjy08/OPCjch9sBEiHaikuW8i9Ys0nx9ic3wh8Fyu6cVKQE9aQZ7xLYT5CdPPwYxclTw==", "requires": { "tslib": "^2.3.0" } @@ -18092,471 +16774,383 @@ "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" } }, "@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==" + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==" }, "@babel/core": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", - "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.9", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "requires": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } } } }, "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" } }, "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "requires": { + "@babel/types": "^7.22.5" + } + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "requires": { - "@babel/types": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } } }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "@babel/helper-define-polyfill-provider": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", + "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==" + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "requires": { + "@babel/types": "^7.22.5" + } + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" } }, "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" } }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "requires": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==" }, "@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "requires": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==" + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "requires": {} }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", @@ -18608,11 +17202,27 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -18687,340 +17297,501 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, - "@babel/plugin-transform-arrow-functions": { + "@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", - "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "requires": { + "@babel/types": "^7.22.5" + } + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "requires": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" } }, "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", - "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", + "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", + "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -19030,51 +17801,68 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.5", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -19090,79 +17878,149 @@ "esutils": "^2.0.2" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { - "@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "requires": { - "@babel/types": "^7.20.2", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.22.5" } } } }, "@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" } }, + "@browserify/envify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@browserify/envify/-/envify-6.0.0.tgz", + "integrity": "sha512-ovxHR0KTsRCyMNwD7MGV0+VCU1sT6Ds+itC4DaQHM41eUId+w5Jd0qlhLVoDkkIVBnkY3BAAM8yb2QfpBlHkPw==", + "requires": { + "acorn-node": "^2.0.1", + "dash-ast": "^2.0.1", + "multisplice": "^1.0.0", + "through2": "^4.0.2" + }, + "dependencies": { + "acorn-node": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-2.0.1.tgz", + "integrity": "sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==" + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + } + } + }, + "@browserify/uglifyify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@browserify/uglifyify/-/uglifyify-6.0.0.tgz", + "integrity": "sha512-48M2a3novsgKhUSo/B3ja10awc7unliK1HfW6aYBJdLFQj3wXDx9BBJVfj6MVYERSQVEVjNHQQ7IK89h4MpCLw==", + "requires": { + "convert-source-map": "^1.9.0", + "minimatch": "^3.0.2", + "terser": "^5.15.1", + "through2": "^4.0.2", + "xtend": "^4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + } + } + }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "peer": true + "optional": true }, "@cspotcode/source-map-support": { "version": "0.8.1", @@ -19173,131 +18031,10 @@ "@jridgewell/trace-mapping": "0.3.9" } }, - "@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "requires": {} - }, "@cypress/request": { - "version": "2.88.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", - "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "version": "2.88.11", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz", + "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", "optional": true, "requires": { "aws-sign2": "~0.7.0", @@ -19313,109 +18050,23 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.5.2", + "qs": "~6.10.3", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" - }, - "dependencies": { - "http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - } - }, - "jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "optional": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } } }, "@cypress/schematic": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@cypress/schematic/-/schematic-2.4.0.tgz", - "integrity": "sha512-aor8hQ+gMXqx/ASdo7CUGo/sMEWwwfSRsLr99rM2GjvW+pZnCKKTnRG4UPf8Ro9SevLJj7KRZAZWxa5MAkJzZA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cypress/schematic/-/schematic-2.5.0.tgz", + "integrity": "sha512-Yt/fQxYIHl9lU8LSoJL92nIwTVyYG5uP4VqW4taTn3viVWvssjK7sRtTI/LRxOoeMYX2RRlXQyUbFEikByn0cQ==", "optional": true, "requires": { - "@angular-devkit/architect": "^0.1402.1", - "@angular-devkit/core": "^14.2.1", - "@angular-devkit/schematics": "^14.2.1", - "@schematics/angular": "^14.2.1", "jsonc-parser": "^3.0.0", "rxjs": "~6.6.0" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1402.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.10.tgz", - "integrity": "sha512-/6YmPrgataj1jD2Uqd1ED+CG4DaZGacoeZd/89hH7hF76Nno8K18DrSOqJAEmDnOWegpSRGVLd0qP09IHmaG5w==", - "optional": true, - "requires": { - "@angular-devkit/core": "14.2.10", - "rxjs": "6.6.7" - } - }, - "@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "optional": true, - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "optional": true - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", - "optional": true - }, "rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -19425,12 +18076,6 @@ "tslib": "^1.9.0" } }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "optional": true - }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -19465,10 +18110,136 @@ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "optional": true + }, "@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "optional": true }, "@eslint/eslintrc": { @@ -19521,39 +18292,34 @@ } }, "@fortawesome/angular-fontawesome": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.11.1.tgz", - "integrity": "sha512-Ngzm5MVxk76ZhYpPTNOI/mpYNz9bzwfBXC5L9mktLgOONjBuYBPVt+bH8lny8hNtDk0ppZzXsMN6CO7hckdfnw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.13.0.tgz", + "integrity": "sha512-gzSPRdveOXNO7NIiMgTyB46aiHG0i98KinnAEqHXi8qzraM/kCcHn/0y3f4MhemX6kftwsFli0IU8RyHmtXlSQ==", "requires": { - "tslib": "^2.4.0" + "tslib": "^2.4.1" } }, "@fortawesome/fontawesome-common-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz", - "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==" + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" }, "@fortawesome/fontawesome-svg-core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz", - "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "requires": { - "@fortawesome/fontawesome-common-types": "6.2.1" + "@fortawesome/fontawesome-common-types": "6.4.0" } }, "@fortawesome/free-solid-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz", - "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", "requires": { - "@fortawesome/fontawesome-common-types": "6.2.1" + "@fortawesome/fontawesome-common-types": "6.4.0" } }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" - }, "@goto-bus-stop/common-shake": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@goto-bus-stop/common-shake/-/common-shake-2.4.0.tgz", @@ -19574,34 +18340,6 @@ } } }, - "@goto-bus-stop/envify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@goto-bus-stop/envify/-/envify-5.0.0.tgz", - "integrity": "sha512-xAnxuDWmwQxO8CgVuPTxKuNsKDfwyXXTyAabG4sNoK59H/ZMC7BHxTA/4ehtinsxbcH7/9L65F5VhyNdQfUyqA==", - "requires": { - "acorn-node": "^2.0.1", - "dash-ast": "^2.0.1", - "multisplice": "^1.0.0", - "through2": "^2.0.5" - }, - "dependencies": { - "acorn-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-2.0.1.tgz", - "integrity": "sha512-VLR5sHqjk+8c5hrKeP2fWaIHb8eewsoxnZ8r2qpwRHXMHuC7KyOPflnOx9dLssVQUurzJ7rO0OzIFjHcndafWw==", - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "dash-ast": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", - "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==" - } - } - }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -19640,6 +18378,64 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -19658,49 +18454,38 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", - "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { "version": "0.3.9", @@ -19742,13 +18527,18 @@ } }, "@ng-bootstrap/ng-bootstrap": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-13.1.1.tgz", - "integrity": "sha512-R6qnmFKT2EwwijBHw7rUXqyo5W90OImHOv7BlsxMNnZLIksWIhqwU00k4UBTfRTnd6JsTPuj/co3MaP61ajILA==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-15.1.0.tgz", + "integrity": "sha512-4Z/sXYcAq22D15jtlnZV7qztuSnlSlOgO7EVp6rJ8dyGi3CPzX9PqMfetoM6K5sKQTiSW8IfsbdXCWN7rnzxWQ==", "requires": { "tslib": "^2.3.0" } }, + "@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -19773,161 +18563,109 @@ } }, "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "requires": { - "@gar/promisify": "^1.1.3", "semver": "^7.3.5" } }, "@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "requires": { - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^2.0.2" + "which": "^3.0.0" }, "dependencies": { "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "requires": { + "isexe": "^2.0.0" + } } } }, "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" } }, "@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==" }, "@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "requires": { - "infer-owner": "^1.0.4" + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "requires": { + "isexe": "^2.0.0" + } + } } }, "@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "requires": { + "isexe": "^2.0.0" + } + } } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, "@popperjs/core": { "version": "2.11.6", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", "peer": true }, - "@schematics/angular": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.10.tgz", - "integrity": "sha512-YFTc/9QJdx422XcApizEcVLKoyknu8b9zHIlAepZCu7WkV8GPT0hvVEHQ7KBWys5aQ7pPZMT0JpZLeAz0F2xYQ==", - "requires": { - "@angular-devkit/core": "14.2.10", - "@angular-devkit/schematics": "14.2.10", - "jsonc-parser": "3.1.0" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.10.tgz", - "integrity": "sha512-K4AO7mROTdbhQ7chtyQd6oPwmuL+BPUh+wn6Aq1qrmYJK4UZYFOPp8fi/Ehs8meCEeywtrssOPfrOE4Gsre9dg==", - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -19938,9 +18676,9 @@ } }, "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "optional": true }, "@sideway/pinpoint": { @@ -19949,48 +18687,66 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "optional": true }, + "@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==" + }, + "@sigstore/tuf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", + "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "requires": { + "@sigstore/protobuf-specs": "^0.1.0", + "tuf-js": "^1.1.7" + } + }, "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "optional": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "optional": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, "@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "optional": true, "requires": { - "@sinonjs/commons": "^1.6.0", + "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "optional": true, + "requires": { + "type-detect": "4.0.8" + } + } } }, "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "optional": true }, - "@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", - "optional": true, - "peer": true - }, "@socket.io/component-emitter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", @@ -19998,6 +18754,11 @@ "optional": true, "peer": true }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -20022,6 +18783,38 @@ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, + "@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==" + }, + "@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "requires": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "@types/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", @@ -20048,9 +18841,9 @@ } }, "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", "requires": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -20064,11 +18857,14 @@ "peer": true }, "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", "optional": true, - "peer": true + "peer": true, + "requires": { + "@types/node": "*" + } }, "@types/eslint": { "version": "8.4.1", @@ -20089,9 +18885,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "@types/express": { "version": "4.17.13", @@ -20137,11 +18933,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, "@types/qrcode": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.0.tgz", @@ -20195,9 +18986,9 @@ "optional": true }, "@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", "optional": true }, "@types/sockjs": { @@ -20209,17 +19000,17 @@ } }, "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "requires": { "@types/node": "*" } }, "@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "optional": true, "requires": { "@types/node": "*" @@ -20240,17 +19031,6 @@ "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } } }, "@typescript-eslint/parser": { @@ -20263,17 +19043,6 @@ "@typescript-eslint/types": "5.48.1", "@typescript-eslint/typescript-estree": "5.48.1", "debug": "^4.3.4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } } }, "@typescript-eslint/scope-manager": { @@ -20296,17 +19065,6 @@ "@typescript-eslint/utils": "5.48.1", "debug": "^4.3.4", "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } } }, "@typescript-eslint/types": { @@ -20330,15 +19088,6 @@ "tsutils": "^3.21.0" }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -20387,134 +19136,140 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "requires": {} + }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -20597,12 +19352,12 @@ } }, "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", "requires": { "debug": "^4.1.0", - "depd": "^1.1.2", + "depd": "^2.0.0", "humanize-ms": "^1.2.1" } }, @@ -20724,9 +19479,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -20762,9 +19517,9 @@ "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" }, "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-from": { "version": "2.1.1", @@ -20778,9 +19533,9 @@ "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "optional": true, "requires": { "safer-buffer": "~2.1.0" @@ -20831,7 +19586,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "optional": true }, "assertion-error": { @@ -20846,10 +19601,16 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "optional": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "optional": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "optional": true }, "at-least-node": { @@ -20859,12 +19620,12 @@ "optional": true }, "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -20882,33 +19643,45 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "optional": true }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "optional": true }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", "optional": true, "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" } }, "babel-plugin-istanbul": { @@ -20924,37 +19697,30 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", + "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.1", + "@nicolo-ribaudo/semver-v6": "^6.3.3" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", + "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.1", + "core-js-compat": "^3.31.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", + "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.1" } }, "balanced-match": { @@ -20977,12 +19743,12 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -21064,16 +19830,6 @@ "ms": "2.0.0" } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -21098,27 +19854,20 @@ } }, "bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", "requires": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - } } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "bootstrap": { "version": "4.6.2", @@ -21432,14 +20181,14 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "buffer": { @@ -21454,7 +20203,7 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "optional": true }, "buffer-from": { @@ -21499,28 +20248,22 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", + "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "minipass": "^5.0.0", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "unique-filename": "^3.0.0" }, "dependencies": { "brace-expansion": { @@ -21532,34 +20275,29 @@ } }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "requires": { "brace-expansion": "^2.0.1" } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" } } }, @@ -21583,16 +20321,6 @@ "get-intrinsic": "^1.0.2" } }, - "call-matcher": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-2.0.0.tgz", - "integrity": "sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA==", - "requires": { - "deep-equal": "^1.0.0", - "espurify": "^2.0.0", - "estraverse": "^4.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -21604,14 +20332,14 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==" + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "optional": true }, "chai": { @@ -21681,9 +20409,9 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "optional": true }, "cipher-base": { @@ -21719,12 +20447,12 @@ "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==" }, "cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "optional": true, "requires": { - "colors": "1.4.0", + "@colors/colors": "1.5.0", "string-width": "^4.2.0" } }, @@ -21797,16 +20525,9 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "optional": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "optional": true + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "combine-source-map": { "version": "0.8.0", @@ -21931,6 +20652,11 @@ "typedarray": "^0.0.6" } }, + "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==" + }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -21979,7 +20705,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-anything": { "version": "2.0.6", @@ -22002,25 +20728,6 @@ "serialize-javascript": "^6.0.0" }, "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -22028,31 +20735,15 @@ "requires": { "is-glob": "^4.0.3" } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } } } }, "core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "requires": { - "browserslist": "^4.21.4" + "browserslist": "^4.21.9" } }, "core-util-is": { @@ -22072,15 +20763,29 @@ } }, "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "requires": { - "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "path-type": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } } }, "count-lines": { @@ -22136,15 +20841,16 @@ "dev": true }, "critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.19.tgz", + "integrity": "sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw==", "requires": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" }, "dependencies": { @@ -22221,64 +20927,37 @@ "randomfill": "^1.0.3" } }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" } }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "requires": {} - }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" - }, - "cssdb": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.1.0.tgz", - "integrity": "sha512-Sd99PrFgx28ez4GHu8yoQIufc/70h9oYowDf4EjeIKi8mac9whxRjhM3IaMr6EllP6KKKWtJrMfN6C7T9tIWvQ==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "cssesc": { "version": "3.0.0", @@ -22293,12 +20972,12 @@ "peer": true }, "cypress": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.7.0.tgz", - "integrity": "sha512-7rq+nmhzz0u6yabCFyPtADU2OOrYt6pvUau9qV7xyifJ/hnsaw/vkr0tnLlcuuQKUAOC1v1M1e4Z0zG7S0IAvA==", + "version": "12.17.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.1.tgz", + "integrity": "sha512-eKfBgO6t8waEyhegL4gxD7tcI6uTCGttu+ZU7y9Hq8BlpMztd7iLeIF4AJFAnbZH1xjX+wwgg4cRKFNSvv3VWQ==", "optional": true, "requires": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^2.88.11", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", @@ -22312,7 +20991,7 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.4", @@ -22330,12 +21009,12 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -22343,9 +21022,9 @@ }, "dependencies": { "@types/node": { - "version": "14.17.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.3.tgz", - "integrity": "sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw==", + "version": "14.18.53", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", + "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==", "optional": true }, "ansi-styles": { @@ -22358,9 +21037,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "optional": true, "requires": { "ansi-styles": "^4.1.0", @@ -22394,20 +21073,11 @@ "optional": true }, "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "optional": true }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, "execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -22469,30 +21139,25 @@ "requires": { "rimraf": "^3.0.0" } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true } } }, "cypress-fail-on-console-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-4.0.2.tgz", - "integrity": "sha512-ioSI9Ti30HABK6xxtaa8HXGWeZFFIde/iOyeerRuYAU0dRNKxzzP4+Zi/6q2xNgIQgKF6NKuktZPN4sqnZ5CxA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-4.0.3.tgz", + "integrity": "sha512-v2nPupd2brtxKLkDQX58SbEPWRF/2nDbqPTnYyhPIYHqG7U3P2dGUZ3zraETKKoLhU3+C0otjgB6Vg/bHhocQw==", "optional": true, "requires": { "chai": "^4.3.4", - "sinon": "^14.0.0", - "sinon-chai": "^3.7.0" + "sinon": "^15.0.0", + "sinon-chai": "^3.7.0", + "type-detect": "^4.0.8" } }, "cypress-wait-until": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz", - "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-2.0.0.tgz", + "integrity": "sha512-ulUZyrWBn+OuC8oiQuGKAScDYfpaWnE3dEE/raUo64w4RHQxZrQ/iMIWT4ZjGMMPr3P+BFEALCRnjQeRqzZj6g==", "optional": true }, "d": { @@ -22512,7 +21177,7 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "optional": true, "requires": { "assert-plus": "^1.0.0" @@ -22526,15 +21191,15 @@ "peer": true }, "dayjs": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz", - "integrity": "sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==", + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==", "optional": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -22558,23 +21223,11 @@ "type-detect": "^4.0.0" } }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, "default-gateway": { "version": "6.0.3", @@ -22613,7 +21266,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "optional": true }, "delegate": { @@ -22627,14 +21280,9 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "deps-sort": { "version": "2.0.1", @@ -22656,6 +21304,11 @@ "minimalistic-assert": "^1.0.0" } }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -22720,9 +21373,9 @@ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "requires": { "@leichtgewicht/ip-codec": "^2.0.1" } @@ -22750,13 +21403,13 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domain-browser": { @@ -22765,16 +21418,16 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "domino": { @@ -22783,13 +21436,13 @@ "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" } }, "duplexer": { @@ -22805,10 +21458,15 @@ "readable-stream": "^2.0.2" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "optional": true, "requires": { "jsbn": "~0.1.0", @@ -22816,12 +21474,12 @@ } }, "echarts": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.1.tgz", - "integrity": "sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", "requires": { "tslib": "2.3.0", - "zrender": "5.4.1" + "zrender": "5.4.4" }, "dependencies": { "tslib": { @@ -22846,9 +21504,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + "version": "1.4.463", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz", + "integrity": "sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw==" }, "elliptic": { "version": "6.5.4", @@ -22920,9 +21578,9 @@ } }, "engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.1.tgz", + "integrity": "sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA==", "optional": true, "peer": true, "requires": { @@ -22934,8 +21592,8 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" + "engine.io-parser": "~5.1.0", + "ws": "~8.11.0" }, "dependencies": { "cookie": { @@ -22946,9 +21604,9 @@ "peer": true }, "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "optional": true, "peer": true, "requires": {} @@ -22956,19 +21614,16 @@ } }, "engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", + "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", "optional": true, - "peer": true, - "requires": { - "@socket.io/base64-arraybuffer": "~1.0.2" - } + "peer": true }, "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -22991,9 +21646,9 @@ "peer": true }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, "env-paths": { "version": "2.2.1", @@ -23046,9 +21701,9 @@ } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" }, "es-to-primitive": { "version": "1.2.1", @@ -23137,158 +21792,38 @@ } }, "esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", - "optional": true, + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "requires": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, - "esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "optional": true - }, "esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==" - }, - "esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "optional": true + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", + "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==" }, "escalade": { "version": "3.1.1", @@ -23305,6 +21840,30 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "escope": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", @@ -23488,17 +22047,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "p-locate": { @@ -23598,11 +22157,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, - "espurify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.1.1.tgz", - "integrity": "sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==" - }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", @@ -23671,7 +22225,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "event-emitter": { "version": "0.3.5", @@ -23770,6 +22324,11 @@ "pify": "^2.2.0" } }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, "express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -23808,6 +22367,11 @@ "vary": "~1.1.2" }, "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -23816,35 +22380,6 @@ "ms": "2.0.0" } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -23871,44 +22406,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -23973,7 +22470,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "optional": true }, "falafel": { @@ -24017,7 +22514,8 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "fast-safe-stringify": { "version": "2.0.7", @@ -24043,7 +22541,7 @@ "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "optional": true, "requires": { "pend": "~1.2.0" @@ -24074,6 +22572,48 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, "find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -24119,10 +22659,26 @@ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==" + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "optional": true }, "form-data": { @@ -24149,7 +22705,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "from": { "version": "0.1.7", @@ -24184,29 +22740,20 @@ "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true, - "peer": true - } } }, "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", "requires": { - "minipass": "^3.0.0" + "minipass": "^5.0.0" } }, "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" }, "fs.realpath": { "version": "1.0.0", @@ -24224,11 +22771,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, "gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -24292,20 +22834,12 @@ "optional": true, "requires": { "async": "^3.2.0" - }, - "dependencies": { - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "optional": true - } } }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "optional": true, "requires": { "assert-plus": "^1.0.0" @@ -24338,9 +22872,9 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "optional": true, "requires": { "ini": "2.0.0" @@ -24500,17 +23034,17 @@ } }, "hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "requires": { "lru-cache": "^7.5.1" }, "dependencies": { "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, @@ -24526,19 +23060,30 @@ } }, "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==" }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-deceiver": { "version": "1.2.7", @@ -24557,11 +23102,6 @@ "toidentifier": "1.0.1" }, "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -24584,6 +23124,16 @@ "requires-port": "^1.0.0" } }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "http-proxy-middleware": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", @@ -24596,6 +23146,17 @@ "micromatch": "^4.0.2" } }, + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -24649,11 +23210,11 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "requires": { - "minimatch": "^5.0.1" + "minimatch": "^9.0.0" }, "dependencies": { "brace-expansion": { @@ -24665,9 +23226,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "requires": { "brace-expansion": "^2.0.1" } @@ -24680,6 +23241,11 @@ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "optional": true }, + "immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -24706,11 +23272,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -24726,9 +23287,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==" }, "inline-source-map": { "version": "0.6.2", @@ -24845,9 +23406,9 @@ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==" }, "is-arguments": { "version": "1.1.0", @@ -24894,12 +23455,12 @@ "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" }, "is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "optional": true, "requires": { - "ci-info": "^3.1.1" + "ci-info": "^3.2.0" } }, "is-core-module": { @@ -25039,7 +23600,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "optional": true }, "is-unicode-supported": { @@ -25080,12 +23641,12 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "optional": true }, "istanbul-lib-coverage": { @@ -25106,12 +23667,21 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, + "jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -25137,16 +23707,21 @@ } } }, + "jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==" + }, "joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", "optional": true, "requires": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", + "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, @@ -25179,7 +23754,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "optional": true }, "jsesc": { @@ -25212,7 +23787,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "optional": true }, "json5": { @@ -25220,6 +23795,11 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==" }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -25228,14 +23808,6 @@ "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true - } } }, "jsonparse": { @@ -25252,6 +23824,18 @@ "through": ">=2.2.7 <3" } }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -25367,13 +23951,6 @@ "requires": { "rimraf": "^3.0.0" } - }, - "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "optional": true, - "peer": true } } }, @@ -25391,9 +23968,9 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" }, "labeled-stream-splicer": { "version": "2.0.2", @@ -25404,6 +23981,15 @@ "stream-splicer": "^2.0.0" } }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -25450,9 +24036,9 @@ "optional": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "optional": true }, "source-map": { @@ -25464,22 +24050,13 @@ } }, "less-loader": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "requires": { "klona": "^2.0.4" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, "license-webpack-plugin": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", @@ -25502,16 +24079,17 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "listr2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", - "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", "optional": true, "requires": { "cli-truncate": "^2.1.0", - "colorette": "^1.2.2", + "colorette": "^2.0.16", "log-update": "^4.0.0", "p-map": "^4.0.0", - "rxjs": "^6.6.7", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, @@ -25540,21 +24118,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "optional": true }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "optional": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -25734,18 +24297,6 @@ "flatted": "^3.2.4", "rfdc": "^1.3.0", "streamroller": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "optional": true, - "peer": true, - "requires": { - "ms": "2.1.2" - } - } } }, "lru-cache": { @@ -25756,6 +24307,14 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -25765,9 +24324,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -25778,47 +24337,31 @@ "dev": true }, "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "requires": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ssri": "^10.0.0" }, "dependencies": { - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, @@ -25844,17 +24387,17 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memfs": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", - "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "requires": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" } }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-stream": { "version": "2.0.0", @@ -25869,7 +24412,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { "version": "4.0.4", @@ -25922,48 +24465,11 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "requires": { "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } } }, "minify-stream": { @@ -26047,17 +24553,14 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" }, "minipass-collect": { "version": "1.0.2", @@ -26065,15 +24568,25 @@ "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "requires": { "encoding": "^0.1.13", - "minipass": "^3.1.6", + "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" } @@ -26084,6 +24597,16 @@ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-json-stream": { @@ -26093,6 +24616,16 @@ "requires": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-pipeline": { @@ -26101,6 +24634,16 @@ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-sized": { @@ -26109,6 +24652,16 @@ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "minizlib": { @@ -26118,6 +24671,16 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "mkdirp": { @@ -26136,9 +24699,9 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "mock-socket": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", - "integrity": "sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.2.1.tgz", + "integrity": "sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag==", "optional": true }, "module-deps": { @@ -26163,15 +24726,20 @@ "xtend": "^4.0.0" } }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multi-stage-sourcemap": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz", - "integrity": "sha512-umaOM+8BZByZIB/ciD3dQLzTv50rEkkGJV78ta/tIVc/J/rfGZY5y1R+fBD3oTaolx41mK8rRcyGtYbDXlzx8Q==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.3.1.tgz", + "integrity": "sha512-UiTLYjqeIoVnJHyWGskwMKIhtZKK9uXUjSTWuwatarrc0d2H/6MAVFdwvEA/aKOHamIn7z4tfvxjz+FYucFpNQ==", "requires": { "source-map": "^0.1.34" }, @@ -26264,9 +24832,9 @@ } }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, "natural-compare": { "version": "1.4.0", @@ -26327,17 +24895,17 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, "ngx-echarts": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/ngx-echarts/-/ngx-echarts-14.0.0.tgz", - "integrity": "sha512-Q8J/DXiWqYM2vqTfQq16A7KyxbWECZSiAApS0rBjsAJCPjG/VZogUe0snZ/i3mA6bV3vYm41imTYOaH+Rl97QA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ngx-echarts/-/ngx-echarts-16.0.0.tgz", + "integrity": "sha512-hdM7/CL29bY3sF3V5ihb7H1NeUsQlhijp8tVxT23+vkNTf9SJrUHPjs9oHOMkbTlr2Q8HB+eVpckYAL/tuK0CQ==", "requires": { "tslib": "^2.3.0" } }, "ngx-infinite-scroll": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-14.0.1.tgz", - "integrity": "sha512-PlGL29d2PxNJTn6qdXs4Es0HlJTZ/ZqOVvFWECWm7mK2fN/q+q62s0iUQ7xRf76NuqoNovXvrjZ1zwLFT6c0Wg==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-16.0.0.tgz", + "integrity": "sha512-bzyNYd+wVlUUxcopRVr2DAa81eEc8vITtKVvb+c7R1uy8hWPTlxOEXf3L1qA4FMwTEzCQ9b37TXzlJji3qBy+A==", "requires": { "tslib": "^2.3.0" } @@ -26353,18 +24921,27 @@ } }, "nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "optional": true, "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" }, "dependencies": { + "@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "optional": true, + "requires": { + "type-detect": "4.0.8" + } + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -26394,14 +24971,15 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-gyp": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "requires": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -26417,9 +24995,9 @@ "optional": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "nopt": { "version": "6.0.0", @@ -26430,11 +25008,11 @@ } }, "normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "requires": { - "hosted-git-info": "^5.0.0", + "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" @@ -26451,114 +25029,68 @@ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" }, "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "requires": { - "npm-normalize-package-bin": "^1.0.1" + "npm-normalize-package-bin": "^3.0.0" } }, "npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", "requires": { "semver": "^7.1.1" } }, "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==" }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "validate-npm-package-name": "^5.0.0" } }, "npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", - "requires": { - "npm-normalize-package-bin": "^2.0.0" - } - }, - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==" - } + "ignore-walk": "^6.0.0" } }, "npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", "semver": "^7.3.5" } }, "npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" } }, "npm-run-path": { @@ -26581,9 +25113,9 @@ } }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "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==", "requires": { "boolbase": "^1.0.0" } @@ -26598,15 +25130,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -26660,28 +25183,15 @@ } }, "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, "ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -26763,6 +25273,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -26815,38 +25326,28 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", "tar": "^6.1.11" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } } }, "pako": { @@ -26899,33 +25400,29 @@ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" }, "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "requires": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" + "entities": "^4.4.0" } }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "requires": { - "parse5": "^6.0.1" + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" } }, "parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "requires": { - "parse5": "^6.0.1" + "parse5": "^7.0.0" } }, "parseurl": { @@ -26958,10 +25455,26 @@ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==" + } + } + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "4.0.0", @@ -26998,13 +25511,13 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "optional": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "optional": true }, "picocolors": { @@ -27013,14 +25526,15 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "optional": true }, "piscina": { "version": "3.2.0", @@ -27053,187 +25567,26 @@ "peer": true }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, - "postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-properties": { - "version": "12.1.10", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.10.tgz", - "integrity": "sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "requires": {} - }, - "postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, "postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz", + "integrity": "sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig==", "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" + "cosmiconfig": "^8.1.3", + "jiti": "^1.18.2", + "klona": "^2.0.6", + "semver": "^7.3.8" } }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "requires": {} - }, "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", @@ -27241,9 +25594,9 @@ "requires": {} }, "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "requires": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -27266,124 +25619,10 @@ "icss-utils": "^5.0.0" } }, - "postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==" - }, - "postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} - }, - "postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "requires": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} - }, - "postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -27394,15 +25633,10 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, "prettier": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.2.tgz", - "integrity": "sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true }, "pretty-bytes": { @@ -27416,9 +25650,9 @@ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" }, "proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==" }, "process": { "version": "0.11.10", @@ -27463,7 +25697,7 @@ "proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", "optional": true }, "prr": { @@ -27482,9 +25716,9 @@ } }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "optional": true }, "public-encrypt": { @@ -27561,10 +25795,13 @@ } }, "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "optional": true + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "optional": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring": { "version": "0.2.0", @@ -27614,14 +25851,6 @@ "unpipe": "1.0.0" } }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "requires": { - "pify": "^2.3.0" - } - }, "read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", @@ -27631,14 +25860,14 @@ } }, "read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "dependencies": { "brace-expansion": { @@ -27650,39 +25879,46 @@ } }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==" + }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "requires": { "brace-expansion": "^2.0.1" } - }, - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==" } } }, "read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==" + } } }, "readable-stream": { @@ -27733,9 +25969,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.1", @@ -27750,16 +25986,6 @@ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -27767,23 +25993,18 @@ "dev": true }, "regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "requires": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" - }, "regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", @@ -27829,11 +26050,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -27885,8 +26106,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "optional": true, - "peer": true + "optional": true }, "rimraf": { "version": "3.0.2", @@ -27905,6 +26125,14 @@ "inherits": "^2.0.1" } }, + "rollup": { + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", + "requires": { + "fsevents": "~2.3.2" + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -27919,9 +26147,9 @@ } }, "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "requires": { "tslib": "^2.1.0" } @@ -27937,44 +26165,65 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", + "version": "1.63.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.2.tgz", + "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" - }, - "dependencies": { - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" - } } }, "sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz", + "integrity": "sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg==", "requires": { - "klona": "^2.0.4", + "klona": "^2.0.6", "neo-async": "^2.6.2" } }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true }, "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } } }, "scope-analyzer": { @@ -28010,17 +26259,77 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "requires": { "randombytes": "^2.1.0" } @@ -28028,7 +26337,7 @@ "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -28047,10 +26356,15 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -28061,12 +26375,12 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "setprototypeof": { "version": "1.1.0", @@ -28075,6 +26389,17 @@ } } }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -28143,22 +26468,32 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "sigstore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", + "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", + "requires": { + "@sigstore/protobuf-specs": "^0.1.0", + "@sigstore/tuf": "^1.0.1", + "make-fetch-happen": "^11.0.1" + } + }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "sinon": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", - "integrity": "sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "optional": true, "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", - "diff": "^5.0.0", - "nise": "^5.1.1", + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", "supports-color": "^7.2.0" }, "dependencies": { @@ -28240,31 +26575,45 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socket.io": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", - "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.1.tgz", + "integrity": "sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw==", "optional": true, "peer": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.2.1", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.1" + "engine.io": "~6.5.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" } }, "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", "optional": true, - "peer": true + "peer": true, + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "optional": true, + "peer": true, + "requires": {} + } + } }, "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "optional": true, "peer": true, "requires": { @@ -28299,22 +26648,12 @@ "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - } } }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" }, "source-map-js": { "version": "1.0.2", @@ -28322,9 +26661,9 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "requires": { "abab": "^2.0.6", "iconv-lite": "^0.6.3", @@ -28363,9 +26702,9 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -28386,9 +26725,9 @@ } }, "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" }, "spdy": { "version": "4.0.2", @@ -28416,9 +26755,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -28437,9 +26776,9 @@ } }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "optional": true, "requires": { "asn1": "~0.2.3", @@ -28454,26 +26793,35 @@ } }, "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", "requires": { - "minipass": "^3.1.1" + "minipass": "^5.0.0" } }, "start-server-and-test": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.14.0.tgz", - "integrity": "sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.0.tgz", + "integrity": "sha512-UqKLw0mJbfrsG1jcRLTUlvuRi9sjNuUiDOLI42r7R5fA9dsFoywAy9DoLXNYys9B886E4RCKb+qM1Gzu96h7DQ==", "optional": true, "requires": { + "arg": "^5.0.2", "bluebird": "3.7.2", "check-more-types": "2.24.0", - "debug": "4.3.2", + "debug": "4.3.4", "execa": "5.1.1", "lazy-ass": "1.6.0", "ps-tree": "1.2.0", - "wait-on": "6.0.0" + "wait-on": "7.0.1" + }, + "dependencies": { + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "optional": true + } } }, "statuses": { @@ -28543,6 +26891,16 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", @@ -28569,6 +26927,14 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -28580,28 +26946,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", - "requires": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - } - }, - "stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", - "requires": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" - } - }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -28642,18 +26986,36 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -28662,50 +27024,58 @@ } }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "dependencies": { "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" } } }, "terser-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "requires": { - "jest-worker": "^27.0.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.0" + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -28755,30 +27125,58 @@ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "tinyify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyify/-/tinyify-3.1.0.tgz", - "integrity": "sha512-r4tHoDkWhhoItWbxJ3KCHXask3hJN7gCUkR5PLfnQzQagTA6oDkzhCbiEDHkMqo7Ck7vVSA1pTP1gDc9p1AC1w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tinyify/-/tinyify-4.0.0.tgz", + "integrity": "sha512-jNDxImwUrJJAU2NyGG144J8aWx2ni39UuBo7ppCXFRmhSH0CbpWL4HgjNvrsAW05WQAgNZePwAlEemNuB+byaA==", "requires": { - "@goto-bus-stop/envify": "^5.0.0", - "acorn-node": "^1.8.2", + "@browserify/envify": "^6.0.0", + "@browserify/uglifyify": "^6.0.0", "browser-pack-flat": "^3.0.9", "bundle-collapser": "^1.3.0", "common-shakeify": "^1.1.1", - "dash-ast": "^1.0.0", "minify-stream": "^2.0.1", "multisplice": "^1.0.0", - "through2": "^3.0.1", - "uglifyify": "^5.0.0", - "unassertify": "^2.1.1" + "terser": "3.16.1", + "through2": "^4.0.2", + "unassertify": "^3.0.1" }, "dependencies": { - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", + "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.9" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" } } } @@ -28814,6 +27212,16 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "optional": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, "transform-ast": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/transform-ast/-/transform-ast-2.4.4.tgz", @@ -28897,9 +27305,9 @@ } }, "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "tsutils": { "version": "3.21.0", @@ -28918,10 +27326,20 @@ } } }, + "tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "requires": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "optional": true, "requires": { "safe-buffer": "^5.0.1" @@ -28930,7 +27348,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "optional": true }, "type": { @@ -28938,14 +27356,6 @@ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -28977,43 +27387,16 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==" + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" }, - "uglifyify": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/uglifyify/-/uglifyify-5.0.2.tgz", - "integrity": "sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q==", - "requires": { - "convert-source-map": "~1.1.0", - "minimatch": "^3.0.2", - "terser": "^3.7.5", - "through": "~2.3.4", - "xtend": "^4.0.1" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", - "requires": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" - } - } - } + "ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "optional": true, + "peer": true }, "umd": { "version": "3.0.3", @@ -29021,54 +27404,37 @@ "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" }, "unassert": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.6.0.tgz", - "integrity": "sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unassert/-/unassert-2.0.2.tgz", + "integrity": "sha512-P6OOg/aRdQmWH+b0g+T4U+9MgL+DG7w6oQPG+N3F2IMuvvd1WfZ5alT/Rjik2lMFVyhfACUxF7PGP1VCwSHlQA==", "requires": { - "acorn": "^7.0.0", - "call-matcher": "^2.0.0", - "deep-equal": "^1.0.0", - "espurify": "^2.0.1", - "estraverse": "^4.1.0", - "esutils": "^2.0.2", - "object-assign": "^4.1.0" + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } } }, "unassertify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-2.1.1.tgz", - "integrity": "sha512-YIAaIlc6/KC9Oib8cVZLlpDDhK1UTEuaDyx9BwD97xqxDZC0cJOqwFcs/Y6K3m73B5VzHsRTBLXNO0dxS/GkTw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unassertify/-/unassertify-3.0.1.tgz", + "integrity": "sha512-461ykSPY3oWU+39J5haiq7S/hcYy1oGJ2nHU92lqdL3jft+pSU6oAbb7o6VVmM7nZGLqppszgyzfpCnRBFgFtw==", "requires": { - "acorn": "^5.1.0", + "acorn": "^8.0.0", "convert-source-map": "^1.1.1", - "escodegen": "^1.6.1", - "multi-stage-sourcemap": "^0.2.1", + "escodegen": "^2.0.0", + "multi-stage-sourcemap": "^0.3.1", "through": "^2.3.7", - "unassert": "^1.3.1" + "unassert": "^2.0.0" }, "dependencies": { "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" } } }, @@ -29120,21 +27486,27 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" }, "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "^4.0.0" } }, "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "requires": { "imurmurhash": "^0.1.4" } }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "optional": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -29147,9 +27519,9 @@ "optional": true }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -29210,9 +27582,9 @@ } }, "validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "requires": { "builtins": "^5.0.0" } @@ -29225,7 +27597,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "optional": true, "requires": { "assert-plus": "^1.0.0", @@ -29233,6 +27605,17 @@ "extsprintf": "^1.2.0" } }, + "vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "requires": { + "esbuild": "^0.17.5", + "fsevents": "~2.3.2", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -29246,16 +27629,16 @@ "peer": true }, "wait-on": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz", - "integrity": "sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", + "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", "optional": true, "requires": { - "axios": "^0.21.1", - "joi": "^17.4.0", + "axios": "^0.27.2", + "joi": "^17.7.0", "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.1.0" + "minimist": "^1.2.7", + "rxjs": "^7.8.0" } }, "watchpack": { @@ -29284,21 +27667,21 @@ } }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -29307,28 +27690,28 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" }, "acorn-import-assertions": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", - "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "requires": {} }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -29338,63 +27721,21 @@ } }, "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", "requires": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^3.4.12", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } } }, "webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -29415,75 +27756,37 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "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==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} } } }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "requires": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" @@ -29565,14 +27868,9 @@ } }, "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" }, "wrap-ansi": { "version": "6.2.0", @@ -29607,6 +27905,39 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + } + } + }, "wrap-comment": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wrap-comment/-/wrap-comment-1.0.1.tgz", @@ -29617,10 +27948,16 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "requires": {} + }, "xhr2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.0.tgz", - "integrity": "sha512-BDtiD0i2iKPK/S8OAZfpk6tyzEDnKKSjxWHcMBVmh+LuqJ8A32qXTyOx+TVOg2dKvq6zGBq2sgKPkEeRs1qTRA==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==" }, "xtend": { "version": "4.0.2", @@ -29637,11 +27974,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -29737,7 +28069,7 @@ "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "optional": true, "requires": { "buffer-crc32": "~0.2.3", @@ -29753,20 +28085,21 @@ "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true }, "zone.js": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz", - "integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.1.tgz", + "integrity": "sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA==", "requires": { "tslib": "^2.3.0" } }, "zrender": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.1.tgz", - "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", "requires": { "tslib": "2.3.0" }, diff --git a/frontend/package.json b/frontend/package.json index d73fa8fa2..175c3397d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -61,60 +61,60 @@ "cypress:run:ci:staging": "node update-config.js TESTNET_ENABLED=true SIGNET_ENABLED=true LIQUID_ENABLED=true BISQ_ENABLED=true ITEMS_PER_PAGE=25 && npm run generate-config && start-server-and-test serve:local-staging 4200 cypress:run:record" }, "dependencies": { - "@angular-devkit/build-angular": "^14.2.10", - "@angular/animations": "^14.2.12", - "@angular/cli": "^14.2.10", - "@angular/common": "^14.2.12", - "@angular/compiler": "^14.2.12", - "@angular/core": "^14.2.12", - "@angular/forms": "^14.2.12", - "@angular/localize": "^14.2.12", - "@angular/platform-browser": "^14.2.12", - "@angular/platform-browser-dynamic": "^14.2.12", - "@angular/platform-server": "^14.2.12", - "@angular/router": "^14.2.12", - "@fortawesome/angular-fontawesome": "~0.11.1", - "@fortawesome/fontawesome-common-types": "~6.2.1", - "@fortawesome/fontawesome-svg-core": "~6.2.1", - "@fortawesome/free-solid-svg-icons": "~6.2.1", + "@angular-devkit/build-angular": "^16.1.4", + "@angular/animations": "^16.1.5", + "@angular/cli": "^16.1.4", + "@angular/common": "^16.1.5", + "@angular/compiler": "^16.1.5", + "@angular/core": "^16.1.5", + "@angular/forms": "^16.1.5", + "@angular/localize": "^16.1.5", + "@angular/platform-browser": "^16.1.5", + "@angular/platform-browser-dynamic": "^16.1.5", + "@angular/platform-server": "^16.1.5", + "@angular/router": "^16.1.5", + "@fortawesome/angular-fontawesome": "~0.13.0", + "@fortawesome/fontawesome-common-types": "~6.4.0", + "@fortawesome/fontawesome-svg-core": "~6.4.0", + "@fortawesome/free-solid-svg-icons": "~6.4.0", "@mempool/mempool.js": "2.3.0", - "@ng-bootstrap/ng-bootstrap": "^13.1.1", + "@ng-bootstrap/ng-bootstrap": "^15.1.0", "@types/qrcode": "~1.5.0", - "bootstrap": "~4.6.1", + "bootstrap": "~4.6.2", "browserify": "^17.0.0", "clipboard": "^2.0.11", "domino": "^2.1.6", - "echarts": "~5.4.1", + "echarts": "~5.4.3", "echarts-gl": "^2.0.9", "lightweight-charts": "~3.8.0", - "ngx-echarts": "~14.0.0", - "ngx-infinite-scroll": "^14.0.1", + "ngx-echarts": "~16.0.0", + "ngx-infinite-scroll": "^16.0.0", "qrcode": "1.5.1", - "rxjs": "~7.8.0", - "tinyify": "^3.1.0", + "rxjs": "~7.8.1", + "tinyify": "^4.0.0", "tlite": "^0.1.9", - "tslib": "~2.4.1", - "zone.js": "~0.12.0" + "tslib": "~2.6.0", + "zone.js": "~0.13.1" }, "devDependencies": { - "@angular/compiler-cli": "^14.2.12", - "@angular/language-service": "^14.2.12", + "@angular/compiler-cli": "^16.1.5", + "@angular/language-service": "^16.1.5", "@types/node": "^18.11.9", "@typescript-eslint/eslint-plugin": "^5.48.1", "@typescript-eslint/parser": "^5.48.1", "eslint": "^8.31.0", "http-proxy-middleware": "~2.0.6", - "prettier": "^2.8.2", + "prettier": "^3.0.0", "ts-node": "~10.9.1", - "typescript": "~4.6.4" + "typescript": "~4.9.3" }, "optionalDependencies": { - "@cypress/schematic": "^2.4.0", - "cypress": "^12.7.0", - "cypress-fail-on-console-error": "~4.0.2", - "cypress-wait-until": "^1.7.2", - "mock-socket": "~9.1.5", - "start-server-and-test": "~1.14.0" + "@cypress/schematic": "^2.5.0", + "cypress": "^12.17.1", + "cypress-fail-on-console-error": "~4.0.3", + "cypress-wait-until": "^2.0.0", + "mock-socket": "~9.2.1", + "start-server-and-test": "~2.0.0" }, "scarfSettings": { "enabled": false diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 7afdba1f8..378ef11ed 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -1,4 +1,4 @@ -import { BrowserModule, BrowserTransferStateModule } from '@angular/platform-browser'; +import { BrowserModule } from '@angular/platform-browser'; import { ModuleWithProviders, NgModule } from '@angular/core'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; @@ -48,8 +48,7 @@ const providers = [ AppComponent, ], imports: [ - BrowserModule.withServerTransition({ appId: 'serverApp' }), - BrowserTransferStateModule, + BrowserModule, AppRoutingModule, HttpClientModule, BrowserAnimationsModule, diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index 428752d60..078b6b30a 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -45,8 +45,8 @@ $dropdown-link-hover-bg: #11131f; $dropdown-link-active-color: #fff; $dropdown-link-active-bg: #11131f; -@import "~bootstrap/scss/bootstrap"; -@import '~tlite/tlite.css'; +@import "bootstrap/scss/bootstrap"; +@import 'tlite/tlite.css'; html, body { height: 100%; From 3825a1c359f78a260b5ac9e0bb75320e95bd64bd Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 18 Jul 2023 13:45:24 +0900 Subject: [PATCH 625/782] Trying downgrading cypress wait --- frontend/package-lock.json | 20 ++++++++------------ frontend/package.json | 2 +- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9c04c486e..561b61096 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -60,7 +60,7 @@ "@cypress/schematic": "^2.5.0", "cypress": "^12.17.1", "cypress-fail-on-console-error": "~4.0.3", - "cypress-wait-until": "^2.0.0", + "cypress-wait-until": "^1.7.2", "mock-socket": "~9.2.1", "start-server-and-test": "~2.0.0" } @@ -6710,14 +6710,10 @@ } }, "node_modules/cypress-wait-until": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-2.0.0.tgz", - "integrity": "sha512-ulUZyrWBn+OuC8oiQuGKAScDYfpaWnE3dEE/raUo64w4RHQxZrQ/iMIWT4ZjGMMPr3P+BFEALCRnjQeRqzZj6g==", - "optional": true, - "engines": { - "node": ">=18.16.0", - "npm": ">=9.5.1" - } + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz", + "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==", + "optional": true }, "node_modules/cypress/node_modules/@types/node": { "version": "14.18.53", @@ -21155,9 +21151,9 @@ } }, "cypress-wait-until": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-2.0.0.tgz", - "integrity": "sha512-ulUZyrWBn+OuC8oiQuGKAScDYfpaWnE3dEE/raUo64w4RHQxZrQ/iMIWT4ZjGMMPr3P+BFEALCRnjQeRqzZj6g==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz", + "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==", "optional": true }, "d": { diff --git a/frontend/package.json b/frontend/package.json index 175c3397d..29f57538e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -112,7 +112,7 @@ "@cypress/schematic": "^2.5.0", "cypress": "^12.17.1", "cypress-fail-on-console-error": "~4.0.3", - "cypress-wait-until": "^2.0.0", + "cypress-wait-until": "^1.7.2", "mock-socket": "~9.2.1", "start-server-and-test": "~2.0.0" }, From 29c53a78529ed4bcfc93aaa1b65b3f51523a9f21 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Tue, 18 Jul 2023 15:01:30 +0900 Subject: [PATCH 626/782] [search bar] fix alignment issue --- .../app/components/search-form/search-form.component.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/search-form/search-form.component.scss b/frontend/src/app/components/search-form/search-form.component.scss index f3d2ee234..534bf0698 100644 --- a/frontend/src/app/components/search-form/search-form.component.scss +++ b/frontend/src/app/components/search-form/search-form.component.scss @@ -18,9 +18,10 @@ form { margin-top: 5px; - @media (min-width: 576px) { + @media (min-width: 564px) { margin-top: 0px; - margin-left: 8px; + margin-left: 5px; + margin-right: -5px; } @media (min-width: 992px) { width: 100%; From bde7fad1c4b39b27771063c060354f50185a9a24 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 18 Jul 2023 15:36:30 +0900 Subject: [PATCH 627/782] Bumping backend deps --- backend/package-lock.json | 319 +++++++++++++++++------------------ backend/package.json | 21 ++- backend/src/api/bisq/bisq.ts | 5 - 3 files changed, 169 insertions(+), 176 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 6800c24c0..0a0b8b9d1 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -12,16 +12,15 @@ "@babel/core": "^7.21.3", "@mempool/electrum-client": "1.1.9", "@types/node": "^18.15.3", - "axios": "~0.27.2", - "bitcoinjs-lib": "~6.1.0", + "axios": "~1.4.0", + "bitcoinjs-lib": "~6.1.3", "crypto-js": "~4.1.1", "express": "~4.18.2", - "maxmind": "~4.3.8", - "mysql2": "~3.2.0", - "node-worker-threads-pool": "~1.5.1", + "maxmind": "~4.3.11", + "mysql2": "~3.5.2", "rust-gbt": "file:./rust-gbt", "socks-proxy-agent": "~7.0.0", - "typescript": "~4.7.4", + "typescript": "~4.9.3", "ws": "~8.13.0" }, "devDependencies": { @@ -29,19 +28,28 @@ "@babel/core": "^7.21.3", "@types/compression": "^1.7.2", "@types/crypto-js": "^4.1.1", - "@types/express": "^4.17.15", + "@types/express": "^4.17.17", "@types/jest": "^29.5.0", - "@types/ws": "~8.5.4", + "@types/ws": "~8.5.5", "@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/parser": "^5.55.0", "eslint": "^8.36.0", - "eslint-config-prettier": "^8.7.0", + "eslint-config-prettier": "^8.8.0", "jest": "^29.5.0", - "prettier": "^2.8.4", - "ts-jest": "^29.0.5", + "prettier": "^3.0.0", + "ts-jest": "^29.1.1", "ts-node": "^10.9.1" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -1490,7 +1498,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.16.1.tgz", "integrity": "sha512-L0Gr5iEQIDEbvWdDr1HUaBOxBSHL1VZhWSk1oryawoT8qJIY+KGfLFelU+Qma64ivCPbxYpkfPoKYVG3rcoGIA==", - "dev": true, "bin": { "napi": "scripts/index.js" }, @@ -1795,9 +1802,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "dependencies": { "@types/node": "*" @@ -1865,9 +1872,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2009,9 +2016,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2068,9 +2075,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2255,12 +2262,13 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/babel-jest": { @@ -2449,9 +2457,9 @@ } }, "node_modules/bitcoinjs-lib": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.1.tgz", - "integrity": "sha512-FYihfgTk29lt1eK2y48OtuarEDUnTprNBW3ctT8yHiOhvmeS3DzAVG6gI0VCvMkydz6UdlXlYNWIPqGD0SUYRQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.3.tgz", + "integrity": "sha512-TYXs/Qf+GNk2nnsB9HrXWqzFuEgCg0Gx+v3UW3B8VuceFHXVvhT+7hRnTSvwkX0i8rz2rtujeU6gFaDcFqYFDw==", "dependencies": { "@noble/hashes": "^1.2.0", "bech32": "^2.0.0", @@ -5367,9 +5375,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5892,12 +5900,12 @@ } }, "node_modules/maxmind": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.9.tgz", - "integrity": "sha512-rEfIxZ9M2P7CWQQzN5/LapCawpf2DLh+LWD/cA7lNfCbFL6dNJOKgtynp8QbRsxExutn7Ofz1P1tXEdL3gnukw==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.11.tgz", + "integrity": "sha512-tJDrKbUzN6PSA88tWgg0L2R4Ln00XwecYQJPFI+RvlF2k1sx6VQYtuQ1SVxm8+bw5tF7GWV4xyb+3/KyzEpPUw==", "dependencies": { "mmdb-lib": "2.0.2", - "tiny-lru": "10.3.0" + "tiny-lru": "11.0.1" }, "engines": { "node": ">=12", @@ -6019,15 +6027,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mysql2": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.0.tgz", - "integrity": "sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.2.tgz", + "integrity": "sha512-cptobmhYkYeTBIFp2c0piw2+gElpioga1rUw5UidHvo8yaHijMZoo8A3zyBVoo/K71f7ZFvrShA9iMIy9dCzCA==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", "long": "^5.2.1", - "lru-cache": "^7.14.1", + "lru-cache": "^8.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" @@ -6048,11 +6056,11 @@ } }, "node_modules/mysql2/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", "engines": { - "node": ">=12" + "node": ">=16.14" } }, "node_modules/named-placeholders": { @@ -6106,11 +6114,6 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, - "node_modules/node-worker-threads-pool": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/node-worker-threads-pool/-/node-worker-threads-pool-1.5.1.tgz", - "integrity": "sha512-7TXAhpMm+jO4MfESxYLtMGSnJWv+itdNHMdaFmeZuPXxwFGU90mtEB42BciUULXOUAxYBfXILAuvrSG3rQZ7mw==" - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6176,17 +6179,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -6417,15 +6420,15 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -6482,6 +6485,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -6711,9 +6719,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -7050,9 +7058,9 @@ "dev": true }, "node_modules/tiny-lru": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.3.0.tgz", - "integrity": "sha512-vTKRT2AEO1sViFDWAIzZVpV8KURCaMtnHa4RZB3XqtYLbrTO/fLDXKPEX9kVWq9u+nZREkwakbcmzGgvJm8QKA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==", "engines": { "node": ">=12" } @@ -7093,9 +7101,9 @@ } }, "node_modules/ts-jest": { - "version": "29.0.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", - "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -7104,7 +7112,7 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { @@ -7118,7 +7126,7 @@ "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", - "typescript": ">=4.3" + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { @@ -7148,9 +7156,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7283,9 +7291,9 @@ "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7405,15 +7413,6 @@ "node": ">= 8" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -7568,7 +7567,7 @@ }, "rust-gbt": { "name": "gbt", - "version": "0.1.0", + "version": "3.0.0-dev", "hasInstallScript": true, "dependencies": { "@napi-rs/cli": "^2.16.1" @@ -7579,6 +7578,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -8666,8 +8671,7 @@ "@napi-rs/cli": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.16.1.tgz", - "integrity": "sha512-L0Gr5iEQIDEbvWdDr1HUaBOxBSHL1VZhWSk1oryawoT8qJIY+KGfLFelU+Qma64ivCPbxYpkfPoKYVG3rcoGIA==", - "dev": true + "integrity": "sha512-L0Gr5iEQIDEbvWdDr1HUaBOxBSHL1VZhWSk1oryawoT8qJIY+KGfLFelU+Qma64ivCPbxYpkfPoKYVG3rcoGIA==" }, "@noble/hashes": { "version": "1.3.0", @@ -8947,9 +8951,9 @@ "dev": true }, "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "requires": { "@types/node": "*" @@ -8998,9 +9002,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9079,9 +9083,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9121,9 +9125,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9258,12 +9262,13 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "babel-jest": { @@ -9409,9 +9414,9 @@ "integrity": "sha512-lkc0XyiX9E9KiVAS1ZiOqK1xfiwvf4FXDDdkDq5crcDzOq+xGytY+14qCsqz7kCiy8rpN1CRNfacRhf9G3JNSA==" }, "bitcoinjs-lib": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.1.tgz", - "integrity": "sha512-FYihfgTk29lt1eK2y48OtuarEDUnTprNBW3ctT8yHiOhvmeS3DzAVG6gI0VCvMkydz6UdlXlYNWIPqGD0SUYRQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.3.tgz", + "integrity": "sha512-TYXs/Qf+GNk2nnsB9HrXWqzFuEgCg0Gx+v3UW3B8VuceFHXVvhT+7hRnTSvwkX0i8rz2rtujeU6gFaDcFqYFDw==", "requires": { "@noble/hashes": "^1.2.0", "bech32": "^2.0.0", @@ -11577,9 +11582,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -11973,12 +11978,12 @@ } }, "maxmind": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.9.tgz", - "integrity": "sha512-rEfIxZ9M2P7CWQQzN5/LapCawpf2DLh+LWD/cA7lNfCbFL6dNJOKgtynp8QbRsxExutn7Ofz1P1tXEdL3gnukw==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.11.tgz", + "integrity": "sha512-tJDrKbUzN6PSA88tWgg0L2R4Ln00XwecYQJPFI+RvlF2k1sx6VQYtuQ1SVxm8+bw5tF7GWV4xyb+3/KyzEpPUw==", "requires": { "mmdb-lib": "2.0.2", - "tiny-lru": "10.3.0" + "tiny-lru": "11.0.1" } }, "media-typer": { @@ -12062,15 +12067,15 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mysql2": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.0.tgz", - "integrity": "sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.2.tgz", + "integrity": "sha512-cptobmhYkYeTBIFp2c0piw2+gElpioga1rUw5UidHvo8yaHijMZoo8A3zyBVoo/K71f7ZFvrShA9iMIy9dCzCA==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", "long": "^5.2.1", - "lru-cache": "^7.14.1", + "lru-cache": "^8.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" @@ -12085,9 +12090,9 @@ } }, "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==" } } }, @@ -12135,11 +12140,6 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, - "node-worker-threads-pool": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/node-worker-threads-pool/-/node-worker-threads-pool-1.5.1.tgz", - "integrity": "sha512-7TXAhpMm+jO4MfESxYLtMGSnJWv+itdNHMdaFmeZuPXxwFGU90mtEB42BciUULXOUAxYBfXILAuvrSG3rQZ7mw==" - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -12187,17 +12187,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "p-limit": { @@ -12358,9 +12358,9 @@ "dev": true }, "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true }, "pretty-format": { @@ -12401,6 +12401,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -12536,9 +12541,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "send": { @@ -12801,9 +12806,9 @@ "dev": true }, "tiny-lru": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-10.3.0.tgz", - "integrity": "sha512-vTKRT2AEO1sViFDWAIzZVpV8KURCaMtnHa4RZB3XqtYLbrTO/fLDXKPEX9kVWq9u+nZREkwakbcmzGgvJm8QKA==" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.0.1.tgz", + "integrity": "sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==" }, "tmpl": { "version": "1.0.5", @@ -12832,9 +12837,9 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "ts-jest": { - "version": "29.0.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", - "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "requires": { "bs-logger": "0.x", @@ -12843,7 +12848,7 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "dependencies": { @@ -12857,9 +12862,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -12945,9 +12950,9 @@ "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==" + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" }, "unpipe": { "version": "1.0.0", @@ -13026,12 +13031,6 @@ "isexe": "^2.0.0" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/backend/package.json b/backend/package.json index 5cfb7982e..7ebc2e970 100644 --- a/backend/package.json +++ b/backend/package.json @@ -40,16 +40,15 @@ "@babel/core": "^7.21.3", "@mempool/electrum-client": "1.1.9", "@types/node": "^18.15.3", - "axios": "~0.27.2", - "bitcoinjs-lib": "~6.1.0", + "axios": "~1.4.0", + "bitcoinjs-lib": "~6.1.3", "crypto-js": "~4.1.1", "express": "~4.18.2", - "maxmind": "~4.3.8", - "mysql2": "~3.2.0", - "node-worker-threads-pool": "~1.5.1", + "maxmind": "~4.3.11", + "mysql2": "~3.5.2", "rust-gbt": "file:./rust-gbt", "socks-proxy-agent": "~7.0.0", - "typescript": "~4.7.4", + "typescript": "~4.9.3", "ws": "~8.13.0" }, "devDependencies": { @@ -57,16 +56,16 @@ "@babel/code-frame": "^7.18.6", "@types/compression": "^1.7.2", "@types/crypto-js": "^4.1.1", - "@types/express": "^4.17.15", + "@types/express": "^4.17.17", "@types/jest": "^29.5.0", - "@types/ws": "~8.5.4", + "@types/ws": "~8.5.5", "@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/parser": "^5.55.0", "eslint": "^8.36.0", - "eslint-config-prettier": "^8.7.0", + "eslint-config-prettier": "^8.8.0", "jest": "^29.5.0", - "prettier": "^2.8.4", - "ts-jest": "^29.0.5", + "prettier": "^3.0.0", + "ts-jest": "^29.1.1", "ts-node": "^10.9.1" } } diff --git a/backend/src/api/bisq/bisq.ts b/backend/src/api/bisq/bisq.ts index ed9c4fc3e..4171284bb 100644 --- a/backend/src/api/bisq/bisq.ts +++ b/backend/src/api/bisq/bisq.ts @@ -7,7 +7,6 @@ import { SocksProxyAgent } from 'socks-proxy-agent'; import { BisqBlocks, BisqBlock, BisqTransaction, BisqStats, BisqTrade } from './interfaces'; import { Common } from '../common'; import { BlockExtended } from '../../mempool.interfaces'; -import { StaticPool } from 'node-worker-threads-pool'; import backendInfo from '../backend-info'; import logger from '../../logger'; @@ -31,10 +30,6 @@ class Bisq { private priceUpdateCallbackFunction: ((price: number) => void) | undefined; private topDirectoryWatcher: fs.FSWatcher | undefined; private subdirectoryWatcher: fs.FSWatcher | undefined; - private jsonParsePool = new StaticPool({ - size: 4, - task: (blob: string) => JSON.parse(blob), - }); constructor() {} From d74e4b187600b2bf73d2bffd2fac228d1f5885f6 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 18 Jul 2023 17:15:54 +0900 Subject: [PATCH 628/782] Replacing loading text with spinner --- .../app/lightning/justice-list/justice-list.component.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/lightning/justice-list/justice-list.component.html b/frontend/src/app/lightning/justice-list/justice-list.component.html index 071c6f7f4..482ac9646 100644 --- a/frontend/src/app/lightning/justice-list/justice-list.component.html +++ b/frontend/src/app/lightning/justice-list/justice-list.component.html @@ -75,5 +75,9 @@ - loading... + +
    +
    +
    +
    From 67f58a4491ff809e745cf9b95179a96582e853f5 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 18 Jul 2023 17:19:14 +0900 Subject: [PATCH 629/782] Sorting by closing date descending --- backend/src/api/explorer/channels.api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/api/explorer/channels.api.ts b/backend/src/api/explorer/channels.api.ts index 67d775ea3..ab29ed2c2 100644 --- a/backend/src/api/explorer/channels.api.ts +++ b/backend/src/api/explorer/channels.api.ts @@ -127,6 +127,7 @@ class ChannelsApi { LEFT JOIN nodes AS n1 ON n1.public_key = channels.node1_public_key LEFT JOIN nodes AS n2 ON n2.public_key = channels.node2_public_key WHERE channels.status = 2 AND channels.closing_reason = 3 + ORDER BY closing_date DESC `; const [rows]: any = await DB.query(query); return rows; From a12316f4dc84ea107a494459989612daabb796a4 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 18 Jul 2023 18:16:21 +0900 Subject: [PATCH 630/782] Updating default mining pool icon --- .../src/resources/mining-pools/default.svg | 70 +------------------ 1 file changed, 1 insertion(+), 69 deletions(-) diff --git a/frontend/src/resources/mining-pools/default.svg b/frontend/src/resources/mining-pools/default.svg index 84496f899..d3d9904c7 100644 --- a/frontend/src/resources/mining-pools/default.svg +++ b/frontend/src/resources/mining-pools/default.svg @@ -1,69 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file From 4055128d7fbc0eced529db133ac94d189abff364 Mon Sep 17 00:00:00 2001 From: softsimon Date: Wed, 19 Jul 2023 11:06:28 +0900 Subject: [PATCH 631/782] Fix for 0 sat minimum fee --- frontend/src/app/dashboard/dashboard.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index 3faef5a83..7175f767a 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -180,10 +180,10 @@
    -
    Minimum fee
    +
    Minimum fee
    Purging

    - < + <

    From 943d05f680656075bf404dccf541d0b1a1f6075b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 19 Jul 2023 12:09:46 +0900 Subject: [PATCH 632/782] restore latest blocks on liquid --- .../app/dashboard/dashboard.component.html | 42 ++++++++++++++++++- .../app/dashboard/dashboard.component.scss | 37 ++++++++++++++++ .../src/app/dashboard/dashboard.component.ts | 20 ++++++++- 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index 7175f767a..a9f6e3994 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -73,7 +73,7 @@
    -
    + + +
    +
    + +
    Latest blocks
    +   + +
    + + + + + + + + + + + + + + + + + +
    HeightMinedPoolTXsSize
    {{ block.height }} + + + {{ block.extras.pool.name }} + + {{ block.tx_count | number }} +
    +
     
    +
    +
    +
    +
    +
    +
    diff --git a/frontend/src/app/dashboard/dashboard.component.scss b/frontend/src/app/dashboard/dashboard.component.scss index f1e835d9c..884ba1027 100644 --- a/frontend/src/app/dashboard/dashboard.component.scss +++ b/frontend/src/app/dashboard/dashboard.component.scss @@ -175,6 +175,43 @@ height: 18px; } +.lastest-blocks-table { + width: 100%; + text-align: left; + tr, td, th { + border: 0px; + padding-top: 0.65rem !important; + padding-bottom: 0.7rem !important; + } + .table-cell-height { + width: 15%; + } + .table-cell-mined { + width: 35%; + text-align: left; + } + .table-cell-transaction-count { + display: none; + text-align: right; + width: 20%; + display: table-cell; + } + .table-cell-size { + display: none; + text-align: center; + width: 30%; + @media (min-width: 485px) { + display: table-cell; + } + @media (min-width: 768px) { + display: none; + } + @media (min-width: 992px) { + display: table-cell; + } + } +} + .lastest-replacements-table { width: 100%; text-align: left; diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index bf9816a69..aca3593d7 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { combineLatest, merge, Observable, of, Subscription } from 'rxjs'; -import { filter, map, scan, share, switchMap } from 'rxjs/operators'; +import { filter, map, scan, share, switchMap, tap } from 'rxjs/operators'; import { BlockExtended, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface'; import { MempoolInfo, TransactionStripped, ReplacementInfo } from '../interfaces/websocket.interface'; import { ApiService } from '../services/api.service'; @@ -39,6 +39,7 @@ export class DashboardComponent implements OnInit, OnDestroy { mempoolLoadingStatus$: Observable; vBytesPerSecondLimit = 1667; transactions$: Observable; + blocks$: Observable; replacements$: Observable; latestBlockHeight: number; mempoolTransactionsWeightPerSecondData: any; @@ -144,6 +145,23 @@ export class DashboardComponent implements OnInit, OnDestroy { }, []), ); + this.blocks$ = this.stateService.blocks$ + .pipe( + tap((blocks) => { + this.latestBlockHeight = blocks[0].height; + }), + switchMap((blocks) => { + if (this.stateService.env.MINING_DASHBOARD === true) { + for (const block of blocks) { + // @ts-ignore: Need to add an extra field for the template + block.extras.pool.logo = `/resources/mining-pools/` + + block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + } + } + return of(blocks.slice(0, 6)); + }) + ); + this.replacements$ = this.stateService.rbfLatestSummary$; this.mempoolStats$ = this.stateService.connectionState$ From 709783280a54925db2145c9cf3f294c7ff6c3e43 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 19 Jul 2023 15:05:40 +0900 Subject: [PATCH 633/782] Fix liquid fees & remove minimum fee rate --- backend/src/api/blocks.ts | 6 ++++-- backend/src/api/transaction-utils.ts | 18 +++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index fdf32f438..7cd37f637 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -171,7 +171,9 @@ class Blocks { private convertLiquidFees(block: IBitcoinApi.VerboseBlock): IBitcoinApi.VerboseBlock { block.tx.forEach(tx => { - tx.fee = Object.values(tx.fee || {}).reduce((total, output) => total + output, 0); + if (!isFinite(Number(tx.fee))) { + tx.fee = Object.values(tx.fee || {}).reduce((total, output) => total + output, 0); + } }); return block; } @@ -877,7 +879,7 @@ class Blocks { let height = blockHeight; let summary: BlockSummary; - if (cpfpSummary) { + if (cpfpSummary && !Common.isLiquid()) { summary = { id: hash, transactions: cpfpSummary.transactions.map(tx => { diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 8bebc42d8..849aff8f3 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -35,6 +35,13 @@ class TransactionUtils { } else { transaction = await bitcoinApi.$getRawTransaction(txId, false, addPrevouts, lazyPrevouts); } + + if (Common.isLiquid()) { + if (!isFinite(Number(transaction.fee))) { + transaction.fee = Object.values(transaction.fee || {}).reduce((total, output) => total + output, 0); + } + } + if (addMempoolData || !transaction?.status?.confirmed) { return this.extendMempoolTransaction(transaction); } else { @@ -52,8 +59,7 @@ class TransactionUtils { // @ts-ignore return transaction; } - const feePerVbytes = Math.max(Common.isLiquid() ? 0.1 : 1, - (transaction.fee || 0) / (transaction.weight / 4)); + const feePerVbytes = (transaction.fee || 0) / (transaction.weight / 4); const transactionExtended: TransactionExtended = Object.assign({ vsize: Math.round(transaction.weight / 4), feePerVsize: feePerVbytes, @@ -68,13 +74,11 @@ class TransactionUtils { public extendMempoolTransaction(transaction: IEsploraApi.Transaction): MempoolTransactionExtended { const vsize = Math.ceil(transaction.weight / 4); const fractionalVsize = (transaction.weight / 4); - const sigops = this.countSigops(transaction); + const sigops = Common.isLiquid() ? this.countSigops(transaction) : 0; // https://github.com/bitcoin/bitcoin/blob/e9262ea32a6e1d364fb7974844fadc36f931f8c6/src/policy/policy.cpp#L295-L298 const adjustedVsize = Math.max(fractionalVsize, sigops * 5); // adjusted vsize = Max(weight, sigops * bytes_per_sigop) / witness_scale_factor - const feePerVbytes = Math.max(Common.isLiquid() ? 0.1 : 1, - (transaction.fee || 0) / fractionalVsize); - const adjustedFeePerVsize = Math.max(Common.isLiquid() ? 0.1 : 1, - (transaction.fee || 0) / adjustedVsize); + const feePerVbytes = (transaction.fee || 0) / fractionalVsize; + const adjustedFeePerVsize = (transaction.fee || 0) / adjustedVsize; const transactionExtended: MempoolTransactionExtended = Object.assign(transaction, { order: this.txidToOrdering(transaction.txid), vsize: Math.round(transaction.weight / 4), From 87e39b838951e1949986cf27388345821085a79b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 19 Jul 2023 16:24:05 +0900 Subject: [PATCH 634/782] Fix liquid blockchain bar --- .../blockchain-blocks.component.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 245973885..ba066d10a 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -113,8 +113,10 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { const animate = this.chainTip != null && latestHeight > this.chainTip; for (const block of blocks) { - block.extras.minFee = this.getMinBlockFee(block); - block.extras.maxFee = this.getMaxBlockFee(block); + if (block?.extras) { + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); + } } this.blocks = blocks; @@ -251,7 +253,7 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { if (height >= 0) { this.cacheService.loadBlock(height); block = this.cacheService.getCachedBlock(height) || null; - if (block) { + if (block?.extras) { block.extras.minFee = this.getMinBlockFee(block); block.extras.maxFee = this.getMaxBlockFee(block); } @@ -293,8 +295,10 @@ export class BlockchainBlocksComponent implements OnInit, OnChanges, OnDestroy { onBlockLoaded(block: BlockExtended) { const blockIndex = this.height - block.height; if (blockIndex >= 0 && blockIndex < this.blocks.length) { - block.extras.minFee = this.getMinBlockFee(block); - block.extras.maxFee = this.getMaxBlockFee(block); + if (block?.extras) { + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); + } this.blocks[blockIndex] = block; this.blockStyles[blockIndex] = this.getStyleForBlock(block, blockIndex); } From 9a2ab7fe2165bc30e958fa62167b5c8805f53a3b Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 20 Jul 2023 09:56:52 +0900 Subject: [PATCH 635/782] [search bar] chrome - fix flex-auto --- .../src/app/components/master-page/master-page.component.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/master-page/master-page.component.scss b/frontend/src/app/components/master-page/master-page.component.scss index fc8b4eb5a..95b9474b9 100644 --- a/frontend/src/app/components/master-page/master-page.component.scss +++ b/frontend/src/app/components/master-page/master-page.component.scss @@ -64,7 +64,9 @@ li.nav-item { .navbar-collapse { - flex-basis: auto; + @media (min-width: 564px) { + flex-basis: auto; + } justify-content: flex-end; } From ade790822962fa97663a39beecb1d543a51daf85 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 20 Jul 2023 10:36:26 +0900 Subject: [PATCH 636/782] [mining] add missing empty col at the bottom of pool ranking --- .../src/app/components/pool-ranking/pool-ranking.component.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.html b/frontend/src/app/components/pool-ranking/pool-ranking.component.html index 6ffcbf485..d5cf08aa5 100644 --- a/frontend/src/app/components/pool-ranking/pool-ranking.component.html +++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.html @@ -139,6 +139,8 @@ {{ miningStats.lastEstimatedHashrate}} {{ miningStats.miningUnits.hashrateUnit }} {{ miningStats.blockCount }} + + {{ miningStats.totalEmptyBlock }} ({{ miningStats.totalEmptyBlockRatio }}%) From 41928695934878ee0eab0d13294ea672efc483fe Mon Sep 17 00:00:00 2001 From: softsimon Date: Thu, 20 Jul 2023 16:02:04 +0900 Subject: [PATCH 637/782] Fix some icon css color changes --- .../mining-dashboard/mining-dashboard.component.html | 4 ++-- frontend/src/app/dashboard/dashboard.component.html | 4 ++-- .../lightning-dashboard/lightning-dashboard.component.html | 4 ++-- .../nodes-rankings-dashboard.component.html | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html index a7fbd0066..85f64f564 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.html @@ -51,7 +51,7 @@
    Latest blocks
      - +
    @@ -65,7 +65,7 @@
    Adjustments
      - +
    diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index a9f6e3994..fdd2131fe 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -78,7 +78,7 @@
    Latest replacements
      - +
    @@ -112,7 +112,7 @@
    Latest blocks
      - +
    diff --git a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.html b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.html index 123069479..f7d318073 100644 --- a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.html +++ b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.html @@ -61,7 +61,7 @@
    Liquidity Ranking
      - +
    @@ -75,7 +75,7 @@
    Connectivity Ranking
      - +
    diff --git a/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html b/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html index 1623d917e..ef23bc104 100644 --- a/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html +++ b/frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.html @@ -8,7 +8,7 @@
    Liquidity Ranking
      + style="vertical-align: text-top; font-size: 13px; color: #4a68b9"> @@ -22,7 +22,7 @@
    Connectivity Ranking
      + style="vertical-align: text-top; font-size: 13px; color: #4a68b9"> @@ -36,7 +36,7 @@
    Oldest nodes
      + style="vertical-align: text-top; font-size: 13px; color: #4a68b9"> From 943dc6f5e6bae8c3fdbc2cd7233a7cb4edaee30a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 20 Jul 2023 17:30:26 +0900 Subject: [PATCH 638/782] Fix blocks list observable --- .../src/app/components/blocks-list/blocks-list.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 2b54058e8..725b6dc74 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -84,10 +84,10 @@ export class BlocksList implements OnInit { .pipe( switchMap((blocks) => { if (blocks[0].height <= this.lastBlockHeight) { - return [null]; // Return an empty stream so the last pipe is not executed + return null; // Return an empty stream so the last pipe is not executed } this.lastBlockHeight = blocks[0].height; - return blocks; + return of(blocks); }) ) ]) From 6b453ef0186f816486a2ca1fef42ef136c9ecd6d Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 20 Jul 2023 17:24:13 +0100 Subject: [PATCH 639/782] sign contributor agreement --- contributors/pedromvpg.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/pedromvpg.txt diff --git a/contributors/pedromvpg.txt b/contributors/pedromvpg.txt new file mode 100644 index 000000000..ce98c4167 --- /dev/null +++ b/contributors/pedromvpg.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 20, 2023. + +Signed: pedromvpg From b1345038bde68a51be91a4913022c85ff7bccca0 Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn <100320+knorrium@users.noreply.github.com> Date: Thu, 20 Jul 2023 18:09:36 -0700 Subject: [PATCH 640/782] Tweak dependabot settings --- .github/dependabot.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9f7f6caeb..e0aee68c5 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,8 @@ updates: open-pull-requests-limit: 10 ignore: - dependency-name: "*" - update-types: ["version-update:semver-major"] + update-types: + ["version-update:semver-major", "version-update:semver-patch"] allow: - dependency-type: "production" @@ -18,7 +19,8 @@ updates: open-pull-requests-limit: 10 ignore: - dependency-name: "*" - update-types: ["version-update:semver-major"] + update-types: + ["version-update:semver-major", "version-update:semver-patch"] allow: - dependency-type: "production" @@ -28,7 +30,8 @@ updates: interval: weekly ignore: - dependency-name: "*" - update-types: ["version-update:semver-major"] + update-types: + ["version-update:semver-major", "version-update:semver-patch"] - package-ecosystem: docker directory: "/docker/frontend" @@ -36,7 +39,8 @@ updates: interval: weekly ignore: - dependency-name: "*" - update-types: ["version-update:semver-major"] + update-types: + ["version-update:semver-major", "version-update:semver-patch"] - package-ecosystem: "github-actions" directory: "/" @@ -44,4 +48,5 @@ updates: interval: weekly ignore: - dependency-name: "*" - update-types: ["version-update:semver-major"] + update-types: + ["version-update:semver-major", "version-update:semver-patch"] From 61eeb82694e8cb2df57a92d2bd82a5f2c6011984 Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Fri, 21 Jul 2023 17:09:57 +0900 Subject: [PATCH 641/782] Expose the GITHUB_SECRET to the frontend build step --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e6bd3941d..8a9ad248f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,6 +55,8 @@ jobs: - name: Build run: npm run build working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} frontend: if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" From 1bd19e1d8d029c0a423f7aa57347643b427dc663 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 21 Jul 2023 17:10:58 +0900 Subject: [PATCH 642/782] apply blockchain scroll offset when element is ready --- .../components/blockchain/blockchain.component.ts | 4 +--- .../mempool-blocks/mempool-blocks.component.ts | 7 ++++++- .../src/app/components/start/start.component.ts | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/components/blockchain/blockchain.component.ts b/frontend/src/app/components/blockchain/blockchain.component.ts index 5eb2ed481..7619587d8 100644 --- a/frontend/src/app/components/blockchain/blockchain.component.ts +++ b/frontend/src/app/components/blockchain/blockchain.component.ts @@ -82,9 +82,7 @@ export class BlockchainComponent implements OnInit, OnDestroy { } this.mempoolOffset = Math.max(0, width - this.dividerOffset); this.cd.markForCheck(); - setTimeout(() => { - this.mempoolOffsetChange.emit(this.mempoolOffset); - }, 0); + this.mempoolOffsetChange.emit(this.mempoolOffset); } @HostListener('window:resize', ['$event']) diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 3ec240b78..e6d5a4bf6 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -31,6 +31,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { @Input() getHref?: (index) => string = (index) => `/mempool-block/${index}`; @Input() allBlocks: boolean = false; + mempoolWidth: number = 0; @Output() widthChange: EventEmitter = new EventEmitter(); specialBlocks = specialBlocks; @@ -155,7 +156,11 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { }), tap(() => { this.cd.markForCheck(); - this.widthChange.emit(this.containerOffset + this.mempoolBlocks.length * this.blockOffset); + const width = this.containerOffset + this.mempoolBlocks.length * this.blockOffset; + if (this.mempoolWidth !== width) { + this.mempoolWidth = width; + this.widthChange.emit(this.mempoolWidth); + } }) ); diff --git a/frontend/src/app/components/start/start.component.ts b/frontend/src/app/components/start/start.component.ts index 33770bb24..22e39b2de 100644 --- a/frontend/src/app/components/start/start.component.ts +++ b/frontend/src/app/components/start/start.component.ts @@ -1,4 +1,4 @@ -import { Component, ElementRef, HostListener, OnInit, OnDestroy, ViewChild, Input } from '@angular/core'; +import { Component, ElementRef, HostListener, OnInit, OnDestroy, ViewChild, Input, DoCheck } from '@angular/core'; import { Subscription } from 'rxjs'; import { MarkBlockState, StateService } from '../../services/state.service'; import { specialBlocks } from '../../app.constants'; @@ -9,7 +9,7 @@ import { BlockExtended } from '../../interfaces/node-api.interface'; templateUrl: './start.component.html', styleUrls: ['./start.component.scss'], }) -export class StartComponent implements OnInit, OnDestroy { +export class StartComponent implements OnInit, OnDestroy, DoCheck { @Input() showLoadingIndicator = false; interval = 60; @@ -43,6 +43,7 @@ export class StartComponent implements OnInit, OnDestroy { pageIndex: number = 0; pages: any[] = []; pendingMark: number | null = null; + pendingOffset: number | null = null; lastUpdate: number = 0; lastMouseX: number; velocity: number = 0; @@ -54,6 +55,14 @@ export class StartComponent implements OnInit, OnDestroy { this.isiOS = ['iPhone','iPod','iPad'].includes((navigator as any)?.userAgentData?.platform || navigator.platform); } + ngDoCheck(): void { + if (this.pendingOffset != null) { + const offset = this.pendingOffset; + this.pendingOffset = null; + this.addConvertedScrollOffset(offset); + } + } + ngOnInit() { this.firstPageWidth = 40 + (this.blockWidth * this.dynamicBlocksAmount); this.blockCounterSubscription = this.stateService.blocks$.subscribe((blocks) => { @@ -429,6 +438,7 @@ export class StartComponent implements OnInit, OnDestroy { addConvertedScrollOffset(offset: number): void { if (!this.blockchainContainer?.nativeElement) { + this.pendingOffset = offset; return; } if (this.timeLtr) { From 0f77fb88bf011604712cf37b089cd8ad45c856b7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 21 Jul 2023 17:18:45 +0900 Subject: [PATCH 643/782] handle missing block.extras on liquid --- .../src/app/components/block/block.component.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 4be6e3aff..ce3317255 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -144,10 +144,12 @@ export class BlockComponent implements OnInit, OnDestroy { for (const block of blocks) { if (block.id === this.blockHash) { this.block = block; - block.extras.minFee = this.getMinBlockFee(block); - block.extras.maxFee = this.getMaxBlockFee(block); - if (block?.extras?.reward != undefined) { - this.fees = block.extras.reward / 100000000 - this.blockSubsidy; + if (block.extras) { + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); + if (block?.extras?.reward != undefined) { + this.fees = block.extras.reward / 100000000 - this.blockSubsidy; + } } } else if (block.height === this.block?.height) { this.block.stale = true; @@ -246,8 +248,10 @@ export class BlockComponent implements OnInit, OnDestroy { } this.updateAuditAvailableFromBlockHeight(block.height); this.block = block; - block.extras.minFee = this.getMinBlockFee(block); - block.extras.maxFee = this.getMaxBlockFee(block); + if (block.extras) { + block.extras.minFee = this.getMinBlockFee(block); + block.extras.maxFee = this.getMaxBlockFee(block); + } this.blockHeight = block.height; this.lastBlockHeight = this.blockHeight; this.nextBlockHeight = block.height + 1; From d91fa5c6effb59180f23d2097725d0c64942c3ba Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 21 Jul 2023 18:10:13 +0900 Subject: [PATCH 644/782] null => of([]) --- .../src/app/components/blocks-list/blocks-list.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 725b6dc74..1af6572fc 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -84,7 +84,7 @@ export class BlocksList implements OnInit { .pipe( switchMap((blocks) => { if (blocks[0].height <= this.lastBlockHeight) { - return null; // Return an empty stream so the last pipe is not executed + return of([]); // Return an empty stream so the last pipe is not executed } this.lastBlockHeight = blocks[0].height; return of(blocks); From ca69d19bf7739d7a7f9482f6c4ddced76906ac3a Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Fri, 21 Jul 2023 18:14:32 +0900 Subject: [PATCH 645/782] Use the GITHUB_SECRET to authenticate with the API Fix the environment variable Add extra logging when using the authentication Use the GITHUB_TOKEN on the frontend build step --- .github/workflows/ci.yml | 5 +++-- frontend/sync-assets.js | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a9ad248f..02131d800 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,8 +55,6 @@ jobs: - name: Build run: npm run build working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/backend - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} frontend: if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')" @@ -101,3 +99,6 @@ jobs: - name: Build run: npm run build working-directory: ${{ matrix.node }}/${{ matrix.flavor }}/frontend + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + diff --git a/frontend/sync-assets.js b/frontend/sync-assets.js index 26d84e319..49618dea3 100644 --- a/frontend/sync-assets.js +++ b/frontend/sync-assets.js @@ -26,6 +26,8 @@ try { } } +const githubSecret = process.env.GITHUB_TOKEN; + function download(filename, url) { https.get(url, (response) => { if (response.statusCode < 200 || response.statusCode > 299) { @@ -55,6 +57,12 @@ function downloadMiningPoolLogos$() { headers: {'user-agent': 'node.js'} }; + if (githubSecret) { + console.log('Downloading the mining pool logos with authentication'); + options.headers['authorization'] = `Bearer ${githubSecret}`; + options.headers['X-GitHub-Api-Version'] = '2022-11-28'; + } + https.get(options, (response) => { const chunks_of_data = []; @@ -109,6 +117,13 @@ function downloadPromoVideoSubtiles$() { headers: {'user-agent': 'node.js'} }; + if (githubSecret) { + console.log('Downloading the promo video subtitles with authentication'); + options.headers['authorization'] = `Bearer ${githubSecret}`; + options.headers['X-GitHub-Api-Version'] = '2022-11-28'; + } + + https.get(options, (response) => { const chunks_of_data = []; @@ -163,6 +178,12 @@ function downloadPromoVideo$() { headers: {'user-agent': 'node.js'} }; + if (githubSecret) { + console.log('Downloading the promo videos with authentication'); + options.headers['authorization'] = `Bearer ${githubSecret}`; + options.headers['X-GitHub-Api-Version'] = '2022-11-28'; + } + https.get(options, (response) => { const chunks_of_data = []; From f0983844c1564999c24dfc9768934bde311673b0 Mon Sep 17 00:00:00 2001 From: Devin Bileck <603793+devinbileck@users.noreply.github.com> Date: Fri, 21 Jul 2023 15:13:10 -0700 Subject: [PATCH 646/782] Accept CLA --- contributors/devinbileck.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/devinbileck.txt diff --git a/contributors/devinbileck.txt b/contributors/devinbileck.txt new file mode 100644 index 000000000..bbabfad65 --- /dev/null +++ b/contributors/devinbileck.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 21, 2023. + +Signed: devinbileck From 7970df27adaea7f1f8439a860de14c109c0a5dd7 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 22 Jul 2023 17:42:02 +0900 Subject: [PATCH 647/782] [graphs] fix min height in mobile landscape --- .../block-fee-rates-graph/block-fee-rates-graph.component.scss | 3 ++- .../block-fees-graph/block-fees-graph.component.scss | 3 ++- .../block-health-graph/block-health-graph.component.scss | 3 ++- .../block-rewards-graph/block-rewards-graph.component.scss | 3 ++- .../block-sizes-weights-graph.component.scss | 3 ++- .../components/hashrate-chart/hashrate-chart.component.scss | 3 ++- .../hashrates-chart-pools/hashrate-chart-pools.component.scss | 3 ++- frontend/src/app/lightning/nodes-map/nodes-map.component.scss | 3 ++- .../nodes-networks-chart/nodes-networks-chart.component.scss | 3 ++- .../statistics-chart/lightning-statistics-chart.component.scss | 3 ++- 10 files changed, 20 insertions(+), 10 deletions(-) diff --git a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.scss b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.scss index 47c87a45c..f4f4dcc77 100644 --- a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.scss +++ b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/components/block-fees-graph/block-fees-graph.component.scss b/frontend/src/app/components/block-fees-graph/block-fees-graph.component.scss index fae81952b..b73d55685 100644 --- a/frontend/src/app/components/block-fees-graph/block-fees-graph.component.scss +++ b/frontend/src/app/components/block-fees-graph/block-fees-graph.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/components/block-health-graph/block-health-graph.component.scss b/frontend/src/app/components/block-health-graph/block-health-graph.component.scss index f8403bad5..7b8154bae 100644 --- a/frontend/src/app/components/block-health-graph/block-health-graph.component.scss +++ b/frontend/src/app/components/block-health-graph/block-health-graph.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.scss b/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.scss index f8403bad5..7b8154bae 100644 --- a/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.scss +++ b/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.scss b/frontend/src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.scss index f8403bad5..7b8154bae 100644 --- a/frontend/src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.scss +++ b/frontend/src/app/components/block-sizes-weights-graph/block-sizes-weights-graph.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.scss b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.scss index 0caa35f33..886608573 100644 --- a/frontend/src/app/components/hashrate-chart/hashrate-chart.component.scss +++ b/frontend/src/app/components/hashrate-chart/hashrate-chart.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.scss b/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.scss index 3b1083505..64a4dcb3d 100644 --- a/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.scss +++ b/frontend/src/app/components/hashrates-chart-pools/hashrate-chart-pools.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/lightning/nodes-map/nodes-map.component.scss b/frontend/src/app/lightning/nodes-map/nodes-map.component.scss index d49b68957..a2f62e9c5 100644 --- a/frontend/src/app/lightning/nodes-map/nodes-map.component.scss +++ b/frontend/src/app/lightning/nodes-map/nodes-map.component.scss @@ -14,7 +14,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss index bb8f2cd87..0e6fb056d 100644 --- a/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss +++ b/frontend/src/app/lightning/nodes-networks-chart/nodes-networks-chart.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } diff --git a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss index 0d692a6c8..c885e4839 100644 --- a/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss +++ b/frontend/src/app/lightning/statistics-chart/lightning-statistics-chart.component.scss @@ -25,7 +25,8 @@ flex-direction: column; padding: 0px 15px; width: 100%; - height: calc(100vh - 250px); + height: calc(100vh - 225px); + min-height: 400px; @media (min-width: 992px) { height: calc(100vh - 150px); } From cea218b81a80a1cbc5ea3213cfae94b345d3fe9a Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Sun, 23 Jul 2023 11:05:49 +0900 Subject: [PATCH 648/782] Reset the supported browsers list --- frontend/.browserslistrc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/.browserslistrc b/frontend/.browserslistrc index 80848532e..e6f1183e7 100644 --- a/frontend/.browserslistrc +++ b/frontend/.browserslistrc @@ -2,11 +2,15 @@ # For additional information regarding the format and rule options, please see: # https://github.com/browserslist/browserslist#queries +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + # You can see what browsers were selected by your queries by running: # npx browserslist -> 0.5% -last 2 versions +last 2 Chrome versions +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions Firefox ESR -not dead -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file From 442a4ff6e0bd724faa2a0c362008562f9ba367aa Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Sun, 23 Jul 2023 11:06:21 +0900 Subject: [PATCH 649/782] Fix tsconfig settigns for ES2022 --- frontend/tsconfig.base.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/tsconfig.base.json b/frontend/tsconfig.base.json index c3676addb..cd44cb6d9 100644 --- a/frontend/tsconfig.base.json +++ b/frontend/tsconfig.base.json @@ -7,15 +7,15 @@ "declaration": false, "downlevelIteration": true, "experimentalDecorators": true, - "module": "es2020", + "module": "ES2020", "moduleResolution": "node", "importHelpers": true, - "target": "es2020", + "target": "ES2022", "typeRoots": [ "node_modules/@types" ], "lib": [ - "es2018", + "ES2018", "dom", "dom.iterable" ] @@ -24,5 +24,6 @@ "fullTemplateTypeCheck": true, "strictInjectionParameters": true, "strictTemplates": true, + "useDefineForClassFields": false } } From 975ec772fa99d9a8d32d9a8fe73a708185a185c2 Mon Sep 17 00:00:00 2001 From: junderw Date: Sat, 22 Jul 2023 19:41:36 -0700 Subject: [PATCH 650/782] Use more reliable Github Action for Rust toolchain install. --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02131d800..6947a0f00 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,9 +28,7 @@ jobs: registry-url: "https://registry.npmjs.org" - name: Install 1.70.x Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: 1.70 + uses: dtolnay/rust-toolchain@1.70 - name: Install if: ${{ matrix.flavor == 'dev'}} From 65dbafd2ec0b13873468671bda0bdc40f611efa1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 22 Jul 2023 17:51:45 +0900 Subject: [PATCH 651/782] Support P2PK address types --- .../bitcoin/bitcoin-api-abstract-factory.ts | 2 + backend/src/api/bitcoin/bitcoin-api.ts | 8 +++ backend/src/api/bitcoin/bitcoin.routes.ts | 41 +++++++++++ backend/src/api/bitcoin/electrum-api.ts | 71 +++++++++++++++++++ .../src/api/bitcoin/esplora-api.interface.ts | 7 ++ backend/src/api/bitcoin/esplora-api.ts | 8 +++ frontend/src/app/bitcoin.utils.ts | 9 +++ .../address/address-preview.component.ts | 8 ++- .../components/address/address.component.scss | 1 + .../components/address/address.component.ts | 15 ++-- .../transactions-list.component.html | 15 +++- .../transactions-list.component.scss | 6 ++ .../src/app/interfaces/electrs.interface.ts | 16 +++++ .../src/app/services/electrs-api.service.ts | 33 ++++++++- 14 files changed, 227 insertions(+), 13 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts index 7b2802d1b..c233ed5d7 100644 --- a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts +++ b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts @@ -14,6 +14,8 @@ export interface AbstractBitcoinApi { $getAddress(address: string): Promise; $getAddressTransactions(address: string, lastSeenTxId: string): Promise; $getAddressPrefix(prefix: string): string[]; + $getScriptHash(scripthash: string): Promise; + $getScriptHashTransactions(address: string, lastSeenTxId: string): Promise; $sendRawTransaction(rawTransaction: string): Promise; $getOutspend(txId: string, vout: number): Promise; $getOutspends(txId: string): Promise; diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index cbcb2c571..c045d8664 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -108,6 +108,14 @@ class BitcoinApi implements AbstractBitcoinApi { throw new Error('Method getAddressTransactions not supported by the Bitcoin RPC API.'); } + $getScriptHash(scripthash: string): Promise { + throw new Error('Method getScriptHash not supported by the Bitcoin RPC API.'); + } + + $getScriptHashTransactions(scripthash: string, lastSeenTxId: string): Promise { + throw new Error('Method getScriptHashTransactions not supported by the Bitcoin RPC API.'); + } + $getRawMempool(): Promise { return this.bitcoindClient.getRawMemPool(); } diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index babc0aa53..ffdb2e629 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -121,6 +121,8 @@ class BitcoinRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'block-height/:height', this.getBlockHeight) .get(config.MEMPOOL.API_URL_PREFIX + 'address/:address', this.getAddress) .get(config.MEMPOOL.API_URL_PREFIX + 'address/:address/txs', this.getAddressTransactions) + .get(config.MEMPOOL.API_URL_PREFIX + 'scripthash/:scripthash', this.getScriptHash) + .get(config.MEMPOOL.API_URL_PREFIX + 'scripthash/:scripthash/txs', this.getScriptHashTransactions) .get(config.MEMPOOL.API_URL_PREFIX + 'address-prefix/:prefix', this.getAddressPrefix) ; } @@ -567,6 +569,45 @@ class BitcoinRoutes { } } + private async getScriptHash(req: Request, res: Response) { + if (config.MEMPOOL.BACKEND === 'none') { + res.status(405).send('Address lookups cannot be used with bitcoind as backend.'); + return; + } + + try { + const addressData = await bitcoinApi.$getScriptHash(req.params.address); + res.json(addressData); + } catch (e) { + if (e instanceof Error && e.message && (e.message.indexOf('too long') > 0 || e.message.indexOf('confirmed status') > 0)) { + return res.status(413).send(e instanceof Error ? e.message : e); + } + res.status(500).send(e instanceof Error ? e.message : e); + } + } + + private async getScriptHashTransactions(req: Request, res: Response): Promise { + if (config.MEMPOOL.BACKEND === 'none') { + res.status(405).send('Address lookups cannot be used with bitcoind as backend.'); + return; + } + + try { + let lastTxId: string = ''; + if (req.query.after_txid && typeof req.query.after_txid === 'string') { + lastTxId = req.query.after_txid; + } + const transactions = await bitcoinApi.$getScriptHashTransactions(req.params.address, lastTxId); + res.json(transactions); + } catch (e) { + if (e instanceof Error && e.message && (e.message.indexOf('too long') > 0 || e.message.indexOf('confirmed status') > 0)) { + res.status(413).send(e instanceof Error ? e.message : e); + return; + } + res.status(500).send(e instanceof Error ? e.message : e); + } + } + private async getAddressPrefix(req: Request, res: Response) { try { const blockHash = await bitcoinApi.$getAddressPrefix(req.params.prefix); diff --git a/backend/src/api/bitcoin/electrum-api.ts b/backend/src/api/bitcoin/electrum-api.ts index 9d1ef46d3..07c58dbc9 100644 --- a/backend/src/api/bitcoin/electrum-api.ts +++ b/backend/src/api/bitcoin/electrum-api.ts @@ -126,6 +126,77 @@ class BitcoindElectrsApi extends BitcoinApi implements AbstractBitcoinApi { } } + async $getScriptHash(scripthash: string): Promise { + try { + const balance = await this.electrumClient.blockchainScripthash_getBalance(scripthash); + let history = memoryCache.get('Scripthash_getHistory', scripthash); + if (!history) { + history = await this.electrumClient.blockchainScripthash_getHistory(scripthash); + memoryCache.set('Scripthash_getHistory', scripthash, history, 2); + } + + const unconfirmed = history ? history.filter((h) => h.fee).length : 0; + + return { + 'scripthash': scripthash, + 'chain_stats': { + 'funded_txo_count': 0, + 'funded_txo_sum': balance.confirmed ? balance.confirmed : 0, + 'spent_txo_count': 0, + 'spent_txo_sum': balance.confirmed < 0 ? balance.confirmed : 0, + 'tx_count': (history?.length || 0) - unconfirmed, + }, + 'mempool_stats': { + 'funded_txo_count': 0, + 'funded_txo_sum': balance.unconfirmed > 0 ? balance.unconfirmed : 0, + 'spent_txo_count': 0, + 'spent_txo_sum': balance.unconfirmed < 0 ? -balance.unconfirmed : 0, + 'tx_count': unconfirmed, + }, + 'electrum': true, + }; + } catch (e: any) { + throw new Error(typeof e === 'string' ? e : e && e.message || e); + } + } + + async $getScriptHashTransactions(scripthash: string, lastSeenTxId?: string): Promise { + try { + loadingIndicators.setProgress('address-' + scripthash, 0); + + const transactions: IEsploraApi.Transaction[] = []; + let history = memoryCache.get('Scripthash_getHistory', scripthash); + if (!history) { + history = await this.electrumClient.blockchainScripthash_getHistory(scripthash); + memoryCache.set('Scripthash_getHistory', scripthash, history, 2); + } + if (!history) { + throw new Error('failed to get scripthash history'); + } + history.sort((a, b) => (b.height || 9999999) - (a.height || 9999999)); + + let startingIndex = 0; + if (lastSeenTxId) { + const pos = history.findIndex((historicalTx) => historicalTx.tx_hash === lastSeenTxId); + if (pos) { + startingIndex = pos + 1; + } + } + const endIndex = Math.min(startingIndex + 10, history.length); + + for (let i = startingIndex; i < endIndex; i++) { + const tx = await this.$getRawTransaction(history[i].tx_hash, false, true); + transactions.push(tx); + loadingIndicators.setProgress('address-' + scripthash, (i + 1) / endIndex * 100); + } + + return transactions; + } catch (e: any) { + loadingIndicators.setProgress('address-' + scripthash, 100); + throw new Error(typeof e === 'string' ? e : e && e.message || e); + } + } + private $getScriptHashBalance(scriptHash: string): Promise { return this.electrumClient.blockchainScripthash_getBalance(this.encodeScriptHash(scriptHash)); } diff --git a/backend/src/api/bitcoin/esplora-api.interface.ts b/backend/src/api/bitcoin/esplora-api.interface.ts index 5b86952b0..55abe1d34 100644 --- a/backend/src/api/bitcoin/esplora-api.interface.ts +++ b/backend/src/api/bitcoin/esplora-api.interface.ts @@ -99,6 +99,13 @@ export namespace IEsploraApi { electrum?: boolean; } + export interface ScriptHash { + scripthash: string; + chain_stats: ChainStats; + mempool_stats: MempoolStats; + electrum?: boolean; + } + export interface ChainStats { funded_txo_count: number; funded_txo_sum: number; diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index ee7fa4765..01294cc01 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -110,6 +110,14 @@ class ElectrsApi implements AbstractBitcoinApi { throw new Error('Method getAddressTransactions not implemented.'); } + $getScriptHash(scripthash: string): Promise { + throw new Error('Method getAddress not implemented.'); + } + + $getScriptHashTransactions(scripthash: string, txId?: string): Promise { + throw new Error('Method getAddressTransactions not implemented.'); + } + $getAddressPrefix(prefix: string): string[] { throw new Error('Method not implemented.'); } diff --git a/frontend/src/app/bitcoin.utils.ts b/frontend/src/app/bitcoin.utils.ts index 5419464a9..7ff0d9570 100644 --- a/frontend/src/app/bitcoin.utils.ts +++ b/frontend/src/app/bitcoin.utils.ts @@ -281,3 +281,12 @@ export function isFeatureActive(network: string, height: number, feature: 'rbf' return false; } } + +export async function calcScriptHash$(script: string): Promise { + const buf = Uint8Array.from(script.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); + const hashBuffer = await crypto.subtle.digest('SHA-256', buf); + const hashArray = Array.from(new Uint8Array(hashBuffer)); + return hashArray + .map((bytes) => bytes.toString(16).padStart(2, '0')) + .join(''); +} \ No newline at end of file diff --git a/frontend/src/app/components/address/address-preview.component.ts b/frontend/src/app/components/address/address-preview.component.ts index 713f09f14..07ead8baa 100644 --- a/frontend/src/app/components/address/address-preview.component.ts +++ b/frontend/src/app/components/address/address-preview.component.ts @@ -64,13 +64,15 @@ export class AddressPreviewComponent implements OnInit, OnDestroy { this.address = null; this.addressInfo = null; this.addressString = params.get('id') || ''; - if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}$/.test(this.addressString)) { + if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|[A-F0-9]{130}$/.test(this.addressString)) { this.addressString = this.addressString.toLowerCase(); } this.seoService.setTitle($localize`:@@address.component.browser-title:Address: ${this.addressString}:INTERPOLATION:`); - return this.electrsApiService.getAddress$(this.addressString) - .pipe( + return (this.addressString.match(/[a-f0-9]{130}/) + ? this.electrsApiService.getPubKeyAddress$(this.addressString) + : this.electrsApiService.getAddress$(this.addressString) + ).pipe( catchError((err) => { this.isLoadingAddress = false; this.error = err; diff --git a/frontend/src/app/components/address/address.component.scss b/frontend/src/app/components/address/address.component.scss index 37abcc49e..fe0729b94 100644 --- a/frontend/src/app/components/address/address.component.scss +++ b/frontend/src/app/components/address/address.component.scss @@ -81,6 +81,7 @@ h1 { top: 11px; } @media (min-width: 768px) { + max-width: calc(100% - 180px); top: 17px; } } diff --git a/frontend/src/app/components/address/address.component.ts b/frontend/src/app/components/address/address.component.ts index 57439f983..ae1f6dbbe 100644 --- a/frontend/src/app/components/address/address.component.ts +++ b/frontend/src/app/components/address/address.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { ActivatedRoute, ParamMap } from '@angular/router'; import { ElectrsApiService } from '../../services/electrs-api.service'; import { switchMap, filter, catchError, map, tap } from 'rxjs/operators'; -import { Address, Transaction } from '../../interfaces/electrs.interface'; +import { Address, ScriptHash, Transaction } from '../../interfaces/electrs.interface'; import { WebsocketService } from '../../services/websocket.service'; import { StateService } from '../../services/state.service'; import { AudioService } from '../../services/audio.service'; @@ -72,7 +72,7 @@ export class AddressComponent implements OnInit, OnDestroy { this.addressInfo = null; document.body.scrollTo(0, 0); this.addressString = params.get('id') || ''; - if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}$/.test(this.addressString)) { + if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|[A-F0-9]{130}$/.test(this.addressString)) { this.addressString = this.addressString.toLowerCase(); } this.seoService.setTitle($localize`:@@address.component.browser-title:Address: ${this.addressString}:INTERPOLATION:`); @@ -83,8 +83,11 @@ export class AddressComponent implements OnInit, OnDestroy { .pipe(filter((state) => state === 2 && this.transactions && this.transactions.length > 0)) ) .pipe( - switchMap(() => this.electrsApiService.getAddress$(this.addressString) - .pipe( + switchMap(() => ( + this.addressString.match(/[a-f0-9]{130}/) + ? this.electrsApiService.getPubKeyAddress$(this.addressString) + : this.electrsApiService.getAddress$(this.addressString) + ).pipe( catchError((err) => { this.isLoadingAddress = false; this.error = err; @@ -114,7 +117,9 @@ export class AddressComponent implements OnInit, OnDestroy { this.updateChainStats(); this.isLoadingAddress = false; this.isLoadingTransactions = true; - return this.electrsApiService.getAddressTransactions$(address.address); + return address.is_pubkey + ? this.electrsApiService.getScriptHashTransactions$('41' + address.address + 'ac') + : this.electrsApiService.getAddressTransactions$(address.address); }), switchMap((transactions) => { this.tempTransactions = transactions; diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index b32afbfb3..3f88c61b0 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -56,7 +56,9 @@ Peg-in - P2PK + P2PK + + @@ -182,12 +184,19 @@ - + diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index ce3317255..ec9a49504 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -339,7 +339,7 @@ export class BlockComponent implements OnInit, OnDestroy { const isSelected = {}; const isFresh = {}; const isSigop = {}; - const isFullRbf = {}; + const isRbf = {}; this.numMissing = 0; this.numUnexpected = 0; @@ -363,7 +363,7 @@ export class BlockComponent implements OnInit, OnDestroy { isSigop[txid] = true; } for (const txid of blockAudit.fullrbfTxs || []) { - isFullRbf[txid] = true; + isRbf[txid] = true; } // set transaction statuses for (const tx of blockAudit.template) { @@ -381,8 +381,8 @@ export class BlockComponent implements OnInit, OnDestroy { } } else if (isSigop[tx.txid]) { tx.status = 'sigop'; - } else if (isFullRbf[tx.txid]) { - tx.status = 'fullrbf'; + } else if (isRbf[tx.txid]) { + tx.status = 'rbf'; } else { tx.status = 'missing'; } @@ -398,8 +398,8 @@ export class BlockComponent implements OnInit, OnDestroy { tx.status = 'added'; } else if (inTemplate[tx.txid]) { tx.status = 'found'; - } else if (isFullRbf[tx.txid]) { - tx.status = 'fullrbf'; + } else if (isRbf[tx.txid]) { + tx.status = 'rbf'; } else { tx.status = 'selected'; isSelected[tx.txid] = true; diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 2b434c44d..4249fd9db 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -174,7 +174,7 @@ export interface TransactionStripped { vsize: number; value: number; rate?: number; // effective fee rate - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'fullrbf'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf'; context?: 'projected' | 'actual'; } diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index 15d97fa8d..e0ecdfeda 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -89,7 +89,7 @@ export interface TransactionStripped { vsize: number; value: number; rate?: number; // effective fee rate - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'fullrbf'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf'; context?: 'projected' | 'actual'; } From 07b0f24cf15d2e72a3b0458969278733addcb9dc Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 25 Jul 2023 14:26:43 +0900 Subject: [PATCH 676/782] Update frontend/src/app/shared/pipes/bytes-pipe/utils.ts --- frontend/src/app/shared/pipes/bytes-pipe/utils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/app/shared/pipes/bytes-pipe/utils.ts b/frontend/src/app/shared/pipes/bytes-pipe/utils.ts index 86a1e1a1d..2700be45d 100644 --- a/frontend/src/app/shared/pipes/bytes-pipe/utils.ts +++ b/frontend/src/app/shared/pipes/bytes-pipe/utils.ts @@ -332,6 +332,5 @@ export function hasTouchScreen(): boolean { /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA); } } - console.log(hasTouchScreen); return hasTouchScreen; } \ No newline at end of file From 6d5be78dd06d2b13a6636201eb1d1cb960e50a2f Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Tue, 25 Jul 2023 15:03:39 +0900 Subject: [PATCH 677/782] [search bar] use afterviewinit instead of afterviewchecked --- .../mining-dashboard.component.ts | 17 +++++++++++++---- .../search-form/search-form.component.ts | 8 +++++--- .../src/app/dashboard/dashboard.component.ts | 6 +++--- .../lightning-dashboard.component.ts | 6 +++--- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts index c7670bc1e..6353ab8b8 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts @@ -1,7 +1,8 @@ -import { AfterViewChecked, ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { AfterViewInit, ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { SeoService } from '../../services/seo.service'; import { WebsocketService } from '../../services/websocket.service'; import { StateService } from '../../services/state.service'; +import { EventType, NavigationStart, Router } from '@angular/router'; @Component({ selector: 'app-mining-dashboard', @@ -9,11 +10,12 @@ import { StateService } from '../../services/state.service'; styleUrls: ['./mining-dashboard.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class MiningDashboardComponent implements OnInit, AfterViewChecked { +export class MiningDashboardComponent implements OnInit, AfterViewInit { constructor( private seoService: SeoService, private websocketService: WebsocketService, - private stateService: StateService + private stateService: StateService, + private router: Router ) { this.seoService.setTitle($localize`:@@a681a4e2011bb28157689dbaa387de0dd0aa0c11:Mining Dashboard`); } @@ -22,7 +24,14 @@ export class MiningDashboardComponent implements OnInit, AfterViewChecked { this.websocketService.want(['blocks', 'mempool-blocks', 'stats']); } - ngAfterViewChecked(): void { + ngAfterViewInit(): void { this.stateService.focusSearchInputDesktop(); + this.router.events.subscribe((e: NavigationStart) => { + if (e.type === EventType.NavigationStart) { + if (e.url.indexOf('graphs') === -1) { // The mining dashboard and the graph component are part of the same module so we can't use ngAfterViewInit in graphs.component.ts to blur the input + this.stateService.focusSearchInputDesktop(); + } + } + }); } } diff --git a/frontend/src/app/components/search-form/search-form.component.ts b/frontend/src/app/components/search-form/search-form.component.ts index 2fc25748e..61b3351b7 100644 --- a/frontend/src/app/components/search-form/search-form.component.ts +++ b/frontend/src/app/components/search-form/search-form.component.ts @@ -65,13 +65,15 @@ export class SearchFormComponent implements OnInit { this.stateService.networkChanged$.subscribe((network) => this.network = network); this.router.events.subscribe((e: NavigationStart) => { // Reset search focus when changing page - if (e.type === EventType.NavigationStart) { + if (this.searchInput && e.type === EventType.NavigationStart) { this.searchInput.nativeElement.blur(); } }); - this.stateService.searchFocus$.subscribe(focus => { - if (this.searchInput && focus === true) { + this.stateService.searchFocus$.subscribe(() => { + if (!this.searchInput) { // Try again a bit later once the view is properly initialized + setTimeout(() => this.searchInput.nativeElement.focus(), 100); + } else if (this.searchInput) { this.searchInput.nativeElement.focus(); } }); diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 6d61953cf..05381453d 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -1,4 +1,4 @@ -import { AfterViewChecked, ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; +import { AfterViewInit, ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { combineLatest, merge, Observable, of, Subscription } from 'rxjs'; import { filter, map, scan, share, switchMap, tap } from 'rxjs/operators'; import { BlockExtended, OptimizedMempoolStats } from '../interfaces/node-api.interface'; @@ -31,7 +31,7 @@ interface MempoolStatsData { styleUrls: ['./dashboard.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class DashboardComponent implements OnInit, OnDestroy, AfterViewChecked { +export class DashboardComponent implements OnInit, OnDestroy, AfterViewInit { featuredAssets$: Observable; network$: Observable; mempoolBlocksData$: Observable; @@ -57,7 +57,7 @@ export class DashboardComponent implements OnInit, OnDestroy, AfterViewChecked { private seoService: SeoService ) { } - ngAfterViewChecked(): void { + ngAfterViewInit(): void { this.stateService.focusSearchInputDesktop(); } diff --git a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts index adaa8d115..e58d5f124 100644 --- a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts +++ b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -1,4 +1,4 @@ -import { AfterViewChecked, ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { AfterViewInit, ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { share } from 'rxjs/operators'; import { INodesRanking } from '../../interfaces/node-api.interface'; @@ -12,7 +12,7 @@ import { LightningApiService } from '../lightning-api.service'; styleUrls: ['./lightning-dashboard.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class LightningDashboardComponent implements OnInit, AfterViewChecked { +export class LightningDashboardComponent implements OnInit, AfterViewInit { statistics$: Observable; nodesRanking$: Observable; officialMempoolSpace = this.stateService.env.OFFICIAL_MEMPOOL_SPACE; @@ -30,7 +30,7 @@ export class LightningDashboardComponent implements OnInit, AfterViewChecked { this.statistics$ = this.lightningApiService.getLatestStatistics$().pipe(share()); } - ngAfterViewChecked(): void { + ngAfterViewInit(): void { this.stateService.focusSearchInputDesktop(); } } From e15c0c6c7a62b9d85bd6c0e5d6c02e64d8509d36 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 25 Jul 2023 21:18:19 +0900 Subject: [PATCH 678/782] Fix key navigation subscription leak --- .../mempool-blocks.component.ts | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 71075b261..cedcf03f4 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -50,6 +50,8 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { blockSubscription: Subscription; networkSubscription: Subscription; chainTipSubscription: Subscription; + keySubscription: Subscription; + isTabHiddenSubscription: Subscription; network = ''; now = new Date().getTime(); timeOffset = 0; @@ -116,7 +118,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { this.calculateTransactionPosition(); }); this.reduceMempoolBlocksToFitScreen(this.mempoolBlocks); - this.stateService.isTabHidden$.subscribe((tabHidden) => this.tabHidden = tabHidden); + this.isTabHiddenSubscription = this.stateService.isTabHidden$.subscribe((tabHidden) => this.tabHidden = tabHidden); this.loadingBlocks$ = combineLatest([ this.stateService.isLoadingWebSocket$, this.stateService.isLoadingMempool$ @@ -224,7 +226,7 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { this.networkSubscription = this.stateService.networkChanged$ .subscribe((network) => this.network = network); - this.stateService.keyNavigation$.subscribe((event) => { + this.keySubscription = this.stateService.keyNavigation$.subscribe((event) => { if (this.markIndex === undefined) { return; } @@ -235,13 +237,12 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { if (this.mempoolBlocks[this.markIndex - 1]) { this.router.navigate([this.relativeUrlPipe.transform('mempool-block/'), this.markIndex - 1]); } else { - this.stateService.blocks$ - .pipe(map((blocks) => blocks[0])) - .subscribe((block) => { - if (this.stateService.latestBlockHeight === block.height) { - this.router.navigate([this.relativeUrlPipe.transform('/block/'), block.id], { state: { data: { block } }}); - } - }); + const blocks = this.stateService.blocksSubject$.getValue(); + for (const block of (blocks || [])) { + if (this.stateService.latestBlockHeight === block.height) { + this.router.navigate([this.relativeUrlPipe.transform('/block/'), block.id], { state: { data: { block } }}); + } + } } } else if (event.key === nextKey) { if (this.mempoolBlocks[this.markIndex + 1]) { @@ -265,6 +266,8 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { this.networkSubscription.unsubscribe(); this.timeLtrSubscription.unsubscribe(); this.chainTipSubscription.unsubscribe(); + this.keySubscription.unsubscribe(); + this.isTabHiddenSubscription.unsubscribe(); clearTimeout(this.resetTransitionTimeout); } From e489f713eb46f8ece0d4190f1b49d72920d8ffdd Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 22 May 2023 18:16:58 -0400 Subject: [PATCH 679/782] include accelerated tx data in block audits --- backend/src/api/audit.ts | 11 ++++++++--- backend/src/api/database-migration.ts | 7 ++++++- backend/src/api/mempool-blocks.ts | 2 +- backend/src/api/websocket-handler.ts | 3 ++- backend/src/mempool.interfaces.ts | 1 + backend/src/repositories/BlocksAuditsRepository.ts | 9 ++++++--- .../app/components/block-overview-graph/tx-view.ts | 5 ++++- .../block-overview-tooltip.component.html | 1 + frontend/src/app/components/block/block.component.ts | 10 ++++++++++ frontend/src/app/interfaces/node-api.interface.ts | 3 ++- frontend/src/app/interfaces/websocket.interface.ts | 2 +- 11 files changed, 42 insertions(+), 12 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index a909fc2b6..63da288a1 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -6,16 +6,17 @@ import rbfCache from './rbf-cache'; const PROPAGATION_MARGIN = 180; // in seconds, time since a transaction is first seen after which it is assumed to have propagated to all miners class Audit { - auditBlock(transactions: MempoolTransactionExtended[], projectedBlocks: MempoolBlockWithTransactions[], mempool: { [txId: string]: MempoolTransactionExtended }) - : { censored: string[], added: string[], fresh: string[], sigop: string[], fullrbf: string[], score: number, similarity: number } { + auditBlock(transactions: MempoolTransactionExtended[], projectedBlocks: MempoolBlockWithTransactions[], mempool: { [txId: string]: MempoolTransactionExtended }, accelerations: { [txid: string]: number }) + : { censored: string[], added: string[], fresh: string[], sigop: string[], fullrbf: string[], accelerated: string[], score: number, similarity: number } { if (!projectedBlocks?.[0]?.transactionIds || !mempool) { - return { censored: [], added: [], fresh: [], sigop: [], fullrbf: [], score: 0, similarity: 1 }; + return { censored: [], added: [], fresh: [], sigop: [], fullrbf: [], accelerated: [], score: 0, similarity: 1 }; } const matches: string[] = []; // present in both mined block and template const added: string[] = []; // present in mined block, not in template const fresh: string[] = []; // missing, but firstSeen or lastBoosted within PROPAGATION_MARGIN const rbf: string[] = []; // either missing or present, and either part of a full-rbf replacement, or a conflict with the mined block + const accelerated: string[] = []; // prioritized by the mempool accelerator const isCensored = {}; // missing, without excuse const isDisplaced = {}; let displacedWeight = 0; @@ -28,6 +29,9 @@ class Audit { const now = Math.round((Date.now() / 1000)); for (const tx of transactions) { inBlock[tx.txid] = tx; + if (accelerations[tx.txid]) { + accelerated.push(tx.txid); + } } // coinbase is always expected if (transactions[0]) { @@ -149,6 +153,7 @@ class Audit { fresh, sigop: [], fullrbf: rbf, + accelerated, score, similarity, }; diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index 7c7608aff..b7dc39493 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository'; import { RowDataPacket } from 'mysql2'; class DatabaseMigration { - private static currentVersion = 64; + private static currentVersion = 65; private queryTimeout = 3600_000; private statisticsAddedIndexed = false; private uniqueLogs: string[] = []; @@ -548,6 +548,11 @@ class DatabaseMigration { await this.$executeQuery('ALTER TABLE `nodes` ADD features text NULL'); await this.updateToSchemaVersion(64); } + + if (databaseSchemaVersion < 65 && isBitcoin === true) { + await this.$executeQuery('ALTER TABLE `blocks_audits` ADD accelerated_txs JSON DEFAULT "[]"'); + await this.updateToSchemaVersion(65); + } } /** diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 08508310d..5ca5cff09 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -206,7 +206,7 @@ class MempoolBlocks { return mempoolBlockDeltas; } - public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): Promise { + public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, accelerations: { [txid: string]: number } = {}): Promise { const start = Date.now(); // reset mempool short ids diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 56c8513cd..91004e292 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -666,7 +666,7 @@ class WebsocketHandler { } if (Common.indexingEnabled()) { - const { censored, added, fresh, sigop, fullrbf, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool); + const { censored, added, fresh, sigop, fullrbf, accelerated, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool, accelerations); const matchRate = Math.round(score * 100 * 100) / 100; const stripped = projectedBlocks[0]?.transactions ? projectedBlocks[0].transactions : []; @@ -695,6 +695,7 @@ class WebsocketHandler { freshTxs: fresh, sigopTxs: sigop, fullrbfTxs: fullrbf, + acceleratedTxs: accelerated, matchRate: matchRate, expectedFees: totalFees, expectedWeight: totalWeight, diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 25e7f0387..d0549cd97 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -36,6 +36,7 @@ export interface BlockAudit { sigopTxs: string[], fullrbfTxs: string[], addedTxs: string[], + acceleratedTxs: string[], matchRate: number, expectedFees?: number, expectedWeight?: number, diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index f7a2a59b5..9c7568567 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -6,9 +6,9 @@ import { BlockAudit, AuditScore } from '../mempool.interfaces'; class BlocksAuditRepositories { public async $saveAudit(audit: BlockAudit): Promise { try { - await DB.query(`INSERT INTO blocks_audits(time, height, hash, missing_txs, added_txs, fresh_txs, sigop_txs, fullrbf_txs, match_rate, expected_fees, expected_weight) - VALUE (FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [audit.time, audit.height, audit.hash, JSON.stringify(audit.missingTxs), - JSON.stringify(audit.addedTxs), JSON.stringify(audit.freshTxs), JSON.stringify(audit.sigopTxs), JSON.stringify(audit.fullrbfTxs), audit.matchRate, audit.expectedFees, audit.expectedWeight]); + await DB.query(`INSERT INTO blocks_audits(time, height, hash, missing_txs, added_txs, fresh_txs, sigop_txs, fullrbf_txs, accelerated_txs, match_rate, expected_fees, expected_weight) + VALUE (FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [audit.time, audit.height, audit.hash, JSON.stringify(audit.missingTxs), + JSON.stringify(audit.addedTxs), JSON.stringify(audit.freshTxs), JSON.stringify(audit.sigopTxs), JSON.stringify(audit.fullrbfTxs), JSON.stringify(audit.acceleratedTxs), audit.matchRate, audit.expectedFees, audit.expectedWeight]); } catch (e: any) { if (e.errno === 1062) { // ER_DUP_ENTRY - This scenario is possible upon node backend restart logger.debug(`Cannot save block audit for block ${audit.hash} because it has already been indexed, ignoring`); @@ -69,6 +69,7 @@ class BlocksAuditRepositories { fresh_txs as freshTxs, sigop_txs as sigopTxs, fullrbf_txs as fullrbfTxs, + accelerated_txs as acceleratedTxs, match_rate as matchRate, expected_fees as expectedFees, expected_weight as expectedWeight @@ -83,6 +84,8 @@ class BlocksAuditRepositories { rows[0].freshTxs = JSON.parse(rows[0].freshTxs); rows[0].sigopTxs = JSON.parse(rows[0].sigopTxs); rows[0].fullrbfTxs = JSON.parse(rows[0].fullrbfTxs); + rows[0].acceleratedTxs = JSON.parse(rows[0].acceleratedTxs); + rows[0].transactions = JSON.parse(rows[0].transactions); rows[0].template = JSON.parse(rows[0].template); return rows[0]; diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index 1b8c88704..ac93eee0c 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -17,6 +17,7 @@ const auditColors = { missing: darken(desaturate(hexToColor('f344df'), 0.3), 0.7), added: hexToColor('0099ff'), selected: darken(desaturate(hexToColor('0099ff'), 0.3), 0.7), + accelerated: hexToColor('8F5FF6'), }; // convert from this class's update format to TxSprite's update format @@ -38,7 +39,7 @@ export default class TxView implements TransactionStripped { value: number; feerate: number; rate?: number; - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; scene?: BlockScene; @@ -216,6 +217,8 @@ export default class TxView implements TransactionStripped { return auditColors.added; case 'selected': return marginalFeeColors[feeLevelIndex] || marginalFeeColors[mempoolFeeColors.length - 1]; + case 'accelerated': + return auditColors.accelerated; case 'found': if (this.context === 'projected') { return auditFeeColors[feeLevelIndex] || auditFeeColors[mempoolFeeColors.length - 1]; diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html index c62779b69..8a410f3df 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html @@ -54,6 +54,7 @@ + diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index ec9a49504..1e94b1a9c 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -340,6 +340,7 @@ export class BlockComponent implements OnInit, OnDestroy { const isFresh = {}; const isSigop = {}; const isRbf = {}; + const isAccelerated = {}; this.numMissing = 0; this.numUnexpected = 0; @@ -365,6 +366,9 @@ export class BlockComponent implements OnInit, OnDestroy { for (const txid of blockAudit.fullrbfTxs || []) { isRbf[txid] = true; } + for (const txid of blockAudit.acceleratedTxs || []) { + isAccelerated[txid] = true; + } // set transaction statuses for (const tx of blockAudit.template) { tx.context = 'projected'; @@ -389,6 +393,9 @@ export class BlockComponent implements OnInit, OnDestroy { isMissing[tx.txid] = true; this.numMissing++; } + if (isAccelerated[tx.txid]) { + tx.status = 'accelerated'; + } } for (const [index, tx] of transactions.entries()) { tx.context = 'actual'; @@ -405,6 +412,9 @@ export class BlockComponent implements OnInit, OnDestroy { isSelected[tx.txid] = true; this.numUnexpected++; } + if (isAccelerated[tx.txid]) { + tx.status = 'accelerated'; + } } for (const tx of transactions) { inBlock[tx.txid] = true; diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 4249fd9db..7e7acfcf3 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -158,6 +158,7 @@ export interface BlockAudit extends BlockExtended { freshTxs: string[], sigopTxs: string[], fullrbfTxs: string[], + acceleratedTxs: string[], matchRate: number, expectedFees: number, expectedWeight: number, @@ -174,7 +175,7 @@ export interface TransactionStripped { vsize: number; value: number; rate?: number; // effective fee rate - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; } diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index e0ecdfeda..fb3c6d0c2 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -89,7 +89,7 @@ export interface TransactionStripped { vsize: number; value: number; rate?: number; // effective fee rate - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; } From aa24f6a84dbb5af04d2886462f2c752b056f7da6 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 26 May 2023 21:10:32 -0400 Subject: [PATCH 680/782] use accelerated rates for block templates & show in viz --- backend/src/api/audit.ts | 4 +-- backend/src/api/bitcoin/bitcoin.routes.ts | 1 + backend/src/api/common.ts | 1 + backend/src/api/mempool-blocks.ts | 15 +++++----- backend/src/api/mempool.ts | 29 +++++++++++++++++++ backend/src/api/websocket-handler.ts | 5 +++- backend/src/mempool.interfaces.ts | 2 ++ .../block-overview-graph.component.ts | 2 +- .../block-overview-graph/block-scene.ts | 3 +- .../block-overview-graph/tx-view.ts | 13 ++++++++- .../block-overview-tooltip.component.html | 3 +- .../block-overview-tooltip.component.ts | 2 ++ .../mempool-block-overview.component.ts | 1 - .../transaction/transaction.component.html | 3 +- .../transaction/transaction.component.ts | 3 ++ .../src/app/interfaces/electrs.interface.ts | 1 + .../src/app/interfaces/node-api.interface.ts | 1 + .../src/app/interfaces/websocket.interface.ts | 3 +- 18 files changed, 75 insertions(+), 17 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index 63da288a1..9710d0362 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -6,7 +6,7 @@ import rbfCache from './rbf-cache'; const PROPAGATION_MARGIN = 180; // in seconds, time since a transaction is first seen after which it is assumed to have propagated to all miners class Audit { - auditBlock(transactions: MempoolTransactionExtended[], projectedBlocks: MempoolBlockWithTransactions[], mempool: { [txId: string]: MempoolTransactionExtended }, accelerations: { [txid: string]: number }) + auditBlock(transactions: MempoolTransactionExtended[], projectedBlocks: MempoolBlockWithTransactions[], mempool: { [txId: string]: MempoolTransactionExtended }) : { censored: string[], added: string[], fresh: string[], sigop: string[], fullrbf: string[], accelerated: string[], score: number, similarity: number } { if (!projectedBlocks?.[0]?.transactionIds || !mempool) { return { censored: [], added: [], fresh: [], sigop: [], fullrbf: [], accelerated: [], score: 0, similarity: 1 }; @@ -29,7 +29,7 @@ class Audit { const now = Math.round((Date.now() / 1000)); for (const tx of transactions) { inBlock[tx.txid] = tx; - if (accelerations[tx.txid]) { + if (tx.acceleration) { accelerated.push(tx.txid); } } diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index ffdb2e629..e2887b706 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -214,6 +214,7 @@ class BitcoinRoutes { effectiveFeePerVsize: tx.effectiveFeePerVsize || null, sigops: tx.sigops, adjustedVsize: tx.adjustedVsize, + acceleration: tx.acceleration }); return; } diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index cd9da3d2a..775da2643 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -111,6 +111,7 @@ export class Common { fee: tx.fee, vsize: tx.weight / 4, value: tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0), + acc: tx.acceleration || undefined, rate: tx.effectiveFeePerVsize, }; } diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 5ca5cff09..81f2092a0 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -170,7 +170,7 @@ class MempoolBlocks { for (let i = 0; i < Math.max(mempoolBlocks.length, prevBlocks.length); i++) { let added: TransactionStripped[] = []; let removed: string[] = []; - const changed: { txid: string, rate: number | undefined }[] = []; + const changed: { txid: string, rate: number | undefined, acc: number | undefined }[] = []; if (mempoolBlocks[i] && !prevBlocks[i]) { added = mempoolBlocks[i].transactions; } else if (!mempoolBlocks[i] && prevBlocks[i]) { @@ -192,8 +192,8 @@ class MempoolBlocks { mempoolBlocks[i].transactions.forEach(tx => { if (!prevIds[tx.txid]) { added.push(tx); - } else if (tx.rate !== prevIds[tx.txid].rate) { - changed.push({ txid: tx.txid, rate: tx.rate }); + } else if (tx.rate !== prevIds[tx.txid].rate || tx.acc !== prevIds[tx.txid].acc) { + changed.push({ txid: tx.txid, rate: tx.rate, acc: tx.acc }); } }); } @@ -206,7 +206,7 @@ class MempoolBlocks { return mempoolBlockDeltas; } - public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, accelerations: { [txid: string]: number } = {}): Promise { + public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): Promise { const start = Date.now(); // reset mempool short ids @@ -222,7 +222,7 @@ class MempoolBlocks { if (entry.uid !== null && entry.uid !== undefined) { const stripped = { uid: entry.uid, - fee: entry.fee, + fee: entry.fee + (entry.acceleration || 0), weight: (entry.adjustedVsize * 4), sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, @@ -285,13 +285,14 @@ class MempoolBlocks { for (const tx of Object.values(added)) { this.setUid(tx, true); } - const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => (uid !== null && uid !== undefined)) as number[]; + + const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => uid != null) as number[]; // prepare a stripped down version of the mempool with only the minimum necessary data // to reduce the overhead of passing this data to the worker thread const addedStripped: CompactThreadTransaction[] = added.filter(entry => (entry.uid !== null && entry.uid !== undefined)).map(entry => { return { uid: entry.uid || 0, - fee: entry.fee, + fee: entry.fee + (entry.acceleration || 0), weight: (entry.adjustedVsize * 4), sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 945b78738..8e350c4fe 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -23,6 +23,8 @@ class Mempool { private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, mempoolSize: number, newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]) => Promise) | undefined; + private accelerations: { [txId: string]: number } = {}; + private txPerSecondArray: number[] = []; private txPerSecond: number = 0; @@ -301,6 +303,17 @@ class Mempool { const newTransactionsStripped = newTransactions.map((tx) => Common.stripTransaction(tx)); this.latestTransactions = newTransactionsStripped.concat(this.latestTransactions).slice(0, 6); + const newAccelerations: { txid: string, delta: number }[] = []; + newTransactions.forEach(tx => { + if (tx.txid.startsWith('00')) { + const delta = Math.floor(Math.random() * 100000) + 100000; + newAccelerations.push({ txid: tx.txid, delta }); + tx.acceleration = delta; + } + }); + this.addAccelerations(newAccelerations); + this.removeAccelerations(deletedTransactions.map(tx => tx.txid)); + this.mempoolCacheDelta = Math.abs(transactions.length - newMempoolSize); if (this.mempoolChangedCallback && (hasChange || deletedTransactions.length)) { @@ -325,6 +338,22 @@ class Mempool { this.clearTimer(timer); } + public getAccelerations(): { [txid: string]: number } { + return this.accelerations; + } + + public addAccelerations(newAccelerations: { txid: string, delta: number }[]): void { + for (const acceleration of newAccelerations) { + this.accelerations[acceleration.txid] = acceleration.delta; + } + } + + public removeAccelerations(txids: string[]): void { + for (const txid of txids) { + delete this.accelerations[txid]; + } + } + private startTimer() { const state: any = { start: Date.now(), diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 91004e292..a33a0f0fa 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -21,6 +21,7 @@ import Audit from './audit'; import { deepClone } from '../utils/clone'; import priceUpdater from '../tasks/price-updater'; import { ApiPrice } from '../repositories/PricesRepository'; +import mempool from './mempool'; // valid 'want' subscriptions const wantable = [ @@ -666,7 +667,7 @@ class WebsocketHandler { } if (Common.indexingEnabled()) { - const { censored, added, fresh, sigop, fullrbf, accelerated, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool, accelerations); + const { censored, added, fresh, sigop, fullrbf, accelerated, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool); const matchRate = Math.round(score * 100 * 100) / 100; const stripped = projectedBlocks[0]?.transactions ? projectedBlocks[0].transactions : []; @@ -737,6 +738,8 @@ class WebsocketHandler { const fees = feeApi.getRecommendedFee(); const mempoolInfo = memPool.getMempoolInfo(); + memPool.removeAccelerations(txIds); + // update init data this.updateSocketDataFields({ 'mempoolInfo': mempoolInfo, diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index d0549cd97..185256619 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -92,6 +92,7 @@ export interface TransactionExtended extends IEsploraApi.Transaction { block: number, vsize: number, }; + acceleration?: number; uid?: number; } @@ -183,6 +184,7 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; + acc?: number; rate?: number; // effective fee rate } diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index 49da16d55..fe847103f 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -147,7 +147,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On } } - update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { + update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined, acc: number | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { if (this.scene) { this.scene.update(add, remove, change, direction, resetLayout); this.start(); diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index 510803f03..94984bae2 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -150,7 +150,7 @@ export default class BlockScene { this.updateAll(startTime, 200, direction); } - update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { + update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined, acc: number | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { const startTime = performance.now(); const removed = this.removeBatch(remove, startTime, direction); @@ -175,6 +175,7 @@ export default class BlockScene { // update effective rates change.forEach(tx => { if (this.txs[tx.txid]) { + this.txs[tx.txid].acc = tx.acc; this.txs[tx.txid].feerate = tx.rate || (this.txs[tx.txid].fee / this.txs[tx.txid].vsize); this.txs[tx.txid].rate = tx.rate; this.txs[tx.txid].dirty = true; diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index ac93eee0c..690b974e3 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -38,6 +38,7 @@ export default class TxView implements TransactionStripped { vsize: number; value: number; feerate: number; + acc?: number; rate?: number; status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; @@ -64,6 +65,7 @@ export default class TxView implements TransactionStripped { this.vsize = tx.vsize; this.value = tx.value; this.feerate = tx.rate || (tx.fee / tx.vsize); // sort by effective fee rate where available + this.acc = tx.acc; this.rate = tx.rate; this.status = tx.status; this.initialised = false; @@ -200,6 +202,11 @@ export default class TxView implements TransactionStripped { const feeLevelColor = feeColors[feeLevelIndex] || feeColors[mempoolFeeColors.length - 1]; // Normal mode if (!this.scene?.highlightingEnabled) { + if (this.acc) { + return auditColors.accelerated; + } else { + return feeLevelColor; + } return feeLevelColor; } // Block audit @@ -226,7 +233,11 @@ export default class TxView implements TransactionStripped { return feeLevelColor; } default: - return feeLevelColor; + if (this.acc) { + return auditColors.accelerated; + } else { + return feeLevelColor; + } } } } diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html index 8a410f3df..a53cfdc9c 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html @@ -29,7 +29,8 @@ - + + diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.ts b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.ts index 61c294263..65d0f984c 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.ts +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.ts @@ -21,6 +21,7 @@ export class BlockOverviewTooltipComponent implements OnChanges { vsize = 1; feeRate = 0; effectiveRate; + acceleration; tooltipPosition: Position = { x: 0, y: 0 }; @@ -53,6 +54,7 @@ export class BlockOverviewTooltipComponent implements OnChanges { this.vsize = tx.vsize || 1; this.feeRate = this.fee / this.vsize; this.effectiveRate = tx.rate; + this.acceleration = tx.acc; } } } diff --git a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts index 30632a862..226be5210 100644 --- a/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts +++ b/frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.ts @@ -94,7 +94,6 @@ export class MempoolBlockOverviewComponent implements OnInit, OnDestroy, OnChang updateBlock(delta: MempoolBlockDelta): void { const blockMined = (this.stateService.latestBlockHeight > this.lastBlockHeight); - if (this.blockIndex !== this.index) { const direction = (this.blockIndex == null || this.index < this.blockIndex) ? this.poolDirection : this.chainDirection; this.blockGraph.replace(delta.added, direction); diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index d4cd6913d..81a6106db 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -488,7 +488,8 @@ - + + - - + + QI%w0w?yCIuQUgIsGQp9^>h`;T_)6DkBogUpS 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%0AjG}`q*)o_9 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
    ?$*t2#alCm$CE`Y+B7kwmJCo&vY!2aWPqPW)f z`6%J;mjz{V{ubJumsAux_hm@)y9di-Iipz$p3R|=G)s}(lNkt%t{M53-8Wu64$o*4%5Z@*bPpO4vfr5p zW_DzuxqS6-UX}{(M-9Gx%y zhmJwewDROO)FS zjHtpVNNQ?vpWa!q7SQi7Ipx%8y67|;)}0IxJe5!Y_cXD?+LM`fyjZ>aC zs@7ipEffVMy|mJIAfCCmFCP2Wr?p6)XYB9ih=Ei|7xM_RKLJ{w)+?iB9XWf88xpXAacV>n<3&fwqu@Wxcf@^o2!ryPE1m>){=4b+0PWT65 zBd?)P;yA-u@`5tt2Lx~oCo6Q{`FgeCx}`d1vHM-lQsxuFT~=_ihs&n5ud{5 zw>b2^Pgq2H=A7831sFv{eVo7dgPE7L<@9^N_YCd@8QpL{&EyjDi+6EUBrpFQ7)?3U z2_}*n$`UK?utuAtmw35Dj~O$i`l*z4LdRYNFUDO;Xow?>elO3NIgelQvwqqhK$)x< z)wTDl$ffBD5)K6Kv|Q$Xt<~mAJ2Zjf^6yD@-SWv9fnndZU4+3|!>(O4v`!XTK(PNF zOs556;Jh;G`gU;3lh!q%Ppfb_t9Q50xhpZ9oC|?l=cqkbv5MZL7T*}pC149p%wDP7 z1N82HeJ@b`3kA5e#ppGsKRnd+@+rvA^Oa0n3VJ;OO%*px=ɀ%CeF-|$mSkL(Uf#55!HwBImRLJq5h!VE+7dJ9+% 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 z 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 WOHN`Ve|onZf&O7f+P?Yr$A1TZXBJ-o diff --git a/frontend/src/resources/previews/dashboard.png b/frontend/src/resources/previews/dashboard.png index e11588994c23ff765f27cd404571986b1da0f2cc..60c8bcc6ac4a1ef484e3df91b4fada5e068426c4 100644 GIT binary patch literal 295855 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

    -KstMjm^%t(>cpBJ+h=| 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

    #BZURfd|b4seqI)#yS(YMsz zlQK2{zQNqVx*Xd!C{D_;^usHG=G{QNGG#1{@t^hB554;?Q^4a8HGvL;hbialpL97N zj7SBI9+k7-Fg|x%VXJtSa#Xd;?k|ypphG5dqh*?xwicA!9Z?%G4Id!)lD~`JKk!wy z+g$orGb7E6vXp<{!!BbRxci6n`%JsYK}TJ25R84gwZ(!~5T`5(qjEt&luX@mcEJh=z;Hl?)3E|zIJ%_UJdqqaQQ zqsVGd)ZZQ6JA3?LRNAn~QQW7s3syJQ#VOlvcWb;S{v1ya3nL+8Qk^8cSJ{K(5aqsq ziXI-t#Ir2xVd|Lv-84aUfq2SKhqa`4n#F;>jGuCGOA&1I&6*yxbJY%z=FDsy8~s!Q z74;5^Sla*;^pTF*p?n$C{B9B<{N1nhOU0ee%olzL2qK?W{mSX6x4h7cjl9P!DTg3D=)WvbjR)TVmf{V<6kngC-IZ17uKbxGPw^@9?Vif>X&QYrd(nh9(i^NZ( z)RK1uaqoTy!e7?br}c+0@lhU6@*RY~fjLc2p_aItM+%t*Tmn(;IH2>xLs|iK2xPDB zbWJ8@RgGbX40qrZwHDrV8em~tNoQe*(fnVLr3k{!tINJv^RtMuGck|YyQ;2jKbH~P zvePklDVI)iI_j#vhTz$f({`5Ja;VDkRsR`(%es#rRtu((9uIH;8asCFA77n#T5f)2 zy24%RJ}f!V?X_&yOi0nZr9C%;n752QGJUY|U**pp{eKnyu&LU?W5;}_fy* z?c&Yr77^NQ1}jc&2C^LpqjR^XyPw5tv^Bk#BmS{xR=-&$*~V<^fZQjyP-hH3W zdHy|`Z9b)%YW0C+ynEb&%%o_LCxeP_+?Cz2YK*yuz)Xh5`j&fgOPM^|gs8Gav-hpJd8& zGrq)0V()4(*=sKCISaIEhO5ohzMpSVAZ_5M8M_|7Ys&|ij83cnpGA8gR#aCO;e>9e zs&>B#cTX=^&HyCN)wTwsJ%-(|Vl~C8sjAEl-?*y-1|;U*X)~{(EbF90-Yv$oz|uP#saAB0!f13d28G>AAC{27CuqSr~rUw=(gQ>J^-r(e*$ zRD|@iuN-w}eAHt8Uc6A2F{ecyS=q z{(4&77z3EO*_o_pdBD7x&Rf(h$#h#48jfG2BTCN!#TCa1IKUF37gY?20i;uJ{2na> zDkLYmf(*PShGi@JR$*3PQInm)gkM>kSuP0R0Wm9Mix33genAV`+6{ZB<$aZ=HQJsz zMb`sDX`04X#Y(tttHoO_E+s%CSRJk~H7xs^^_8c)f^xSNF?0S0wwfL>1nYMEFxskgNWVmu{yR_vd{5MPm~-MmgJQG0*;kkkt!=r~Sl z`%)B9>M8g|BC}8|s^23<6RRS@%M|7> z?W$ri$hcvTd6Uwx?65ZzdS^oy0G^jbKv32M&uZU0ed_o}F%qJ@8VjT$Ic-9Uk|RI3 z(yvHEENp8oa%TTW3-ERK&nuW}%-wrWAcWzGX0}Y{@4Y1je$z3geg=HEf&fzceYQU9 zHC<MZ%!2=Jx0AlE zZ8Xc<&1GRy=o!&D%NQw=Pe@lg35a}&7s7qRF_)454^{6S)l}Mde}}Gspd*M%bsR-N z!Ac7Rka19vB2}f!APUk;fRGSG#RjNDQ7H*ZM~WyVp@gDl03k?+kN_eiv;;^XkdWlP zyzlo}zvuafwO|2jCArQy-?H~-!z{zCFHZ=9U;&9!9Ot zEpTF}VG*I!Iz{kUdPiFB1aS_zC|p4(A-34D0X}Oavi7pS8L;)%`w#(eiLOSj3dE4n zSO8O++8zUBs38k~MJ{^ICXDJG=aDyZ{msUXZX)-^aPzTFoWMx1oHBqre9jj?P5!4=t544-7dbSG(V90 z#I4|Wb@NvWtLGo&wr!@AEf)mGNK>5O#3)-9K2v&5$+fbGjFM%@ps3GLC8`GiJY2DbK$8f#|><`%g0+EwhGoS0I<#%0=$2 z3DU6F<=(LOKf)G5ZN*PClYXC~RlZJow#;m>GL-Bykd47X@|b?n4q ziDTKO=D|Pxv0kaGles%iPN*hWO2^pJ)I5*c2W)sArndN=bT1B0$VtT6=ffWXpjL!5 z{K_)w_hC!TFTmbI3T;dZFF^!jfM#26=!67f?AAIdJG@DUbRq@enCJf_;;IyX=jCbG zLY_KU9DmBd&((g#U8cYw+)@9M9>8fKYX1obHk@)|0m5? z;br~+>$Yl7bYo$p`tzoOF#ktXAAD7!T7NB=o7PKQ1fh;af&Lfb%A=_D=QKQrhl1n^ zyqvmW6+HXA2phKK*Go~J>9iU-;~^+m9)dDX`}_4ESf(BC>@s*=_HQQ_4{>W1u*w?s zPRwf5!v%4)ls)J29hbyz_Tu>q73MY86}tV^XS`kPUj-&Y>F-lJ%a%>G8;vUBoL-Vg zFJQff1d~eM4bT?6OJ$Z^=|o4jxbonVj(LJV>X-Tf0%1cBnwv4jwvk&Vs11!Hq9Wtb z`bI~Olk5ZJ&>r_AQXuZm@tGR0d2$kc8s7DvyqdpeWu+yKh>WyER*c1b_C0;ynK;~L zMwKUuSE(mm-!?L@JxPswO)?m6mK}Lye}ygI8}*_$JC)Ynz00r;IhLYnNx1FRJ(4*( zGFIs8SH}$qD9>JQ%M+tuPF+fWix!Zi&4o8t|51xiO0%z9h}Rr* z4X-lT%9@&KP3_`__hvb|opXCBupAqeoD4*HFD<4qeIh>%1?4f1@UHM@+gFF8ZVK1e zQ~lj?g+K1u^;BNqh!Cr|PEmSa<1=}O{mSPX-m`>JB;jq^FN-LC#;z;=#h5m?rDB_6 zEQDg3)mg$ig7e3%_V_n%LM8-k@^?PU5f;@EGV}qZLR>$!Rk2XDHRN6XUu#^`au@JJ z!!u)-Aa(z7iW-WTA`_M!(=vL>9$^rE2R9(=LlJ2bnwC75~+Ysp=)_ z$$Ja!V?A3@Qa@ZYsTV?m8B`C^8EhaqK;vEY^@3R-equx6CNJOjgE zX_jQSl{TkDAE3&-#F|H7{*O}UCwTg~RQ>^n0#Y@_p~3e}bkdJXYHZR^U)7SH3N?HZ zJ!e?e5$9VL4Oy(5+d?mr5)U>P2i22yo`rWew`|!LN}a>I*_A~UUsJ!l7AW$HNAf+e z@Y)v%LQf|h2O37sF7N0~UUS!~S9J3KQgC48Y=8UeX+sly|P=td!Zw z(e*WS!6EcRY(66k>1wg_A;g0+e{cBU#^{6GV(2}hxQp#e^z}fPNkV3>h9ak(vo?b(eVpkku#{(*nPaw^&;3`rUrkP_lMku zZjcfgX-s9ba*G|(WQLW@`{~>0At{)jTbGZ*KM8Xim&S9=!JrVzdCVXb$|jisHu3v#ygFWg8p7g+(|+Cnkyxivo6^eXyHEcnR}lThYt)o)9BrhA!Mt(*n{&!Ke$IyL+lT+ z6SST`p1e9j7L5q~#{2W+S#*?C$#34j-z(Dg)~huPV@ve)Xw{8h+ zD{eo>_)^S84z3P;xQ&6h-(-=VE@aUUxBT&9ER}7udF2+LGiep7z`wV~*}4WQa!I$K zZuQMdC|nu)i);TMiJN-D;^5>&XNcKKGbfj_cB4Jy7=s9I@;-vDN(vuyvqR+t_X1+) zp=`V1Ei;TB$P9+^)*`p!CFp>8!uNkel(YXYU05AUJoxi^?kbk+q8)B4W;Z|P@g~~Y zEvH3&;hoG8{C%nnQeJzjU^o`SXi7-f16jcAHDrRDa;oJr3wz$qO|tt88sP5WQ@!&O zK4bkgU<~Oc-+aQiA_B0%&XJs#BX08>%Os7p`*uCoX`r^oNz4`KV*(4vYraIOlRzHn z3v^jk2x{Gj(|~T>!74i~)sQ+BZ#!EV@QxJKyQ|=zgOtH}+3&ccct?yuEv_({qoL~X z34|sVh7{|Iv1y?6Q*&qlI?gOS@>q}RNtzSGU6?a`y=w#9UwfS9NS?4ut?mGp@rE`G zDM-6PeLbj!;rXP{+APv8>}K4=q^THCAlBz;*)(LCgG1Z3{aF)$%Il?xp)uOD2h z%vIAOBThs*O97hRI3>MZl@kbQF8{WtK0OhbAGbp>CU&qI7I#-BN7DQZTWu*eocQ+V(bJU zvB4=>LzZBo#;O91lS>v2Sv;8H%irkqJ|bG&a;NOiX?$GMss}Wyg5_O`A#%whTd>B! zL=6unfoC%HNR`N>B_+r@n4Epu=gWTZwJU{2H_(T}_B#^N@Me*Aln)Jdvdk&&RD-VJ z<6U3Bs}fUp@h%`bcxSl%X?`OU#Ji*48VHe-caHN-^LaC0??ByDM_PUNE`PZz!@Sgl zGW4vr5k7ksxJHw&Tga2y5e`lFHC#E|( zAnW&B#~MA6jY9C9HFDr7M7y@>qDV;TxFzB0W2(apG{bn%0+SeLH=`DiM|4s6`Kr#N zAf&1*61{Z6PYx`sHcK8*AqX!idsSx|XpoBxf$qTi3H;(Rb!yWQGJO3pY{XnIs?VAg zz!vT4rnwOToIC0Oq@lt}A}(?98povcsoawYOfN-&4jHPqnYRUL>RSVkwJF76nuWM~ zvxT{`zsel`&ug5Oo$_5Y?p(pegrnx{{PRGUbH?02Lk_4_r6>xs*o(~2oN2(b+*2Uq z?HP!f{3{^B9)u*~?28WDC%>TyKHAZGpM(8&+Cf^;d9y;tPtYUy5J08`L_RVEC$@k* zaEOauP)x;W*OIQrf}I5)>X0fQBJ)0W6cs%E_b@m zwDxL!Q^H07bch5Vy`g+4TDryJ3)Nv*FE4otTFz1u;W?DSD+^oZFF-PGcov{(uu8}; z7Y^7OCyDh1?!NO$O(6;EG|3P>y!%rUljn_*kL0qDUzi=$1J zlEg{7j(VeaRVDWtc|Vr&icalQM|&PJw4)uE8JyaiSD!Yd69%0;jMvoN)HH`~BupfT zyT$B^X8h#(c&R0yv=#4dGF{<+X2!aylBchQ<{3R#`ufL*pahkJ%Kqic4P!AK=MH@y zB=zaUCd4$o^glMPjc#7@#7!ZVCqY%dxhdNx%*vIZ3)w_L)K0*P9mAYi&fX6Z$GjQO z<%DD-7w%R3XpW3l$TuXPfra!I*X&9RaYee<4SiNGWmN+<9;Gsk|6;%TIcj@xoY@ds zooW_uyL-aO>oUsdnbhbLvOMuXrOnnJbW&IG$Aq=IgG}py@?@a!7pCM2SI5R@6&N6M zjyTZl@3le#CtZDEYm%wN&p}Ay^1U=M2NTMlOkVr>v7Pz#vz?q*VnoM&b(j_Mt1?!J z^&77O$m)8x0D_p;dn)aJkO3b>n@415_#fikxo_hy)#_qDIfRDD4B;5~E9I4~h;W;H z7d)C}QJ8viV%f|A2Xq_uG?Pz~u3=JE=M}k7*v#>38OCw8Xn7NM68Of7cComn{ltF{)*7`^rTO+21h_ zSTcc3!|*P%lx!0OT8qP1T)im}ZcdA;Lj!4nEn8yt+W;<$B>n}F5_w&wS#%w1t9NGt zlwdbxkic(r{~&#cxLhR4|H+QL`X=oxqrtr`&U#)BAhKzPQ+Oo^!L!Trl>u+{3WJsI zOk95eL*oiVs^-UOQIg%ORf%ga-Xcr-Fw3n?!3nmwm~G7uiF z1JxL5Kp^PyFpsE2Fwk7tCeUOL(O^Lc{!{bZOdDr_#7X**gROFWOJvhUewR5H10iVp z;V;6~c;-Zna}D=qwJYMKaRvo{yJBHU3+`}_B4^hrQ`}J?^EW~=aVNN&S3vFE;hcy{ z`sE2g3PrdX&=wO4x%Ig;sstTzU%!?T=8)j%K5N7=@8{wz}>15mw{7jb;i7h zQjGY(WD#zuTwjl!vD*cxb4zau$GS9ahaS2*<#^MK5N>Kf?ymqLo5EGuw>ciGsY+zA$Qg@Hk z^a^oEz-3MYU<|-dT|ziw-fSk&I!>!M-RXtOkKm@d`Rl`e>(JOh%o{e)PXkQ_CTMHz zfkBZlx+1ZKX~Oy+&h|;2KEJr|e0(&3!kqUQ)N<7tI@70?J}q8jRBNK=hH24&G{*0N z5V8uh{IRyrC)URnax8DaAJP zM?a6WH8+j_8o7-05MxLZJpwobkAJ6(oUi}1+{}ngTy&SoRa{8NHxI)6FBprh7yU)h zsoJa78u>O=u6DpVAUtC(UIeXEYmBifviE{;$mk8Mtmg9*#2o~3YJv@9<4VQkf8ROX z1tJ)o&oZ+aCVats_T)NM6vg3j=vQz5S3uee2Gje^i@je+To4Vl)%c7S+t2RKGz#6g z+~T$PwDvpUU^UwOPPu$c@h>btW8=Ubp;o|(7 zsu(r|W&2R?39sc-uAN8xS7O97j;VRZXT2z4{$1y-K^A$-=@SN`S@&V+R`J?aF*6cj zo456?xTqzvQ)p=RZtm!QSH!K3rkV=7a|G##hpc+M7eGbU01xsn)9@SNcTd;~rSZBL ze=r$lL`k5j+i`Lb7NnrpAyc%w024O2T@}B8?%86#UY~HG~OS+d7!(&=>J0x@5M};or2tkF39LdyZUJjge{FYPLeh? zkDQ=R$6lH79H^6@jlBZ)0iOU;;)6-Czw4a|#gk@N7jvH;q}zT-#i}g6BlQgaibNQ) z%(?^Ii1M{@QnZL0aFGEdKKkK;WbZkXgj=@Lpsw-~iL;rOn~MKbWNdZ8s34ki(xc?N zs!8!#W;Vol#5e?V6$#UW-li^MET2SQo=!bU(drzku?VSu?|_q!5xBeN9=-x9qoT9* z%hxzL;As$KCBeOBRvb5pHHS~B^f!XZ>7E?3G;MY!K+WTn|KxycIlw@p@p+NEcHMQ= z-l@2qCjQ!?qTTU#%Q0%{Gosky);FyN94&Xk#d=2XVKf}F6~D_`i~gm1=lfoH-}n)r zQx*zj`$i7Z4cNcNKpb_fSIbQI3HqJ3>MT{0?}_^2M|ZfJ#OO=dNL~JvCkB_hVHsK> zIeKFu2kCvRis<;zTSxjgwa+OVb9w(+8C6H4XXj*nJASOS$ih4k*9lyNz_8dU<( zDYNC7wuKe&etPelSX7gB2q`HG`Sku4>T5w~pOYFqHyUy#1Y42L9ApVQIC1u7Wm^_1LR4G{2`O9TW zkw2qbl6QS~k^00SHO0KPGL`Bm{wv%2IWy>6@7^Fq9*vZdl={tOEa9)o{Xyq?l?Axb z;o=(!nMlc$y(zhkdP`#W?NVR|kk4K*>4kp?&%a7Myirbf{8D4A)I7Q;2;_)VB?zj> z(Y2Cbf#{XZFydH&Ug7>+f&nMTv3s??45Pk@=f{@_h=FXW^zCDeeoN z8WTysBClq*gcDB(zBq%2!g26W_%8-ERFpk4z+}hGJ`c#XFm4ZVwswcWYlTIF%i7D0 zNxbtP)SRZpX*{otIFyA1vo*e?KCd8JDkiv3B@m;72HH`m0!f3b7kq7B086^pZg8A_ zA&lBzz1N(%D-h$B!Y(=qKlj~#ivRjblv=h0yDw9LR;`*rbD=fqs)HUlgXX6$MtgS@ zFS34Pu?czfnx`W!jo|r0u9Up%89DsYOmOQ&aiG;Yu8jrhU1rI4N&pa9m1$5$O2OJt)4duK&1}y+T`|zIz zw<{g%iR+Sm$R5^?zUKa>vd+L8oDZ;~yUE7$(s@9;mk0uKIjiAfKTdlftY>WJ#~asF z(6}UedL{B$FBt{kl|%Xj*Q5w?aqIPx4C-Q`%qz8ke9g<@E`I(2cO|D!`x#sME+mP~ z?;s4FQu1zbDDy8RC%w$AvOYF^U9s19Kv*`&lF^Qln!{0zk^VqDkpiJ7oazw*Z?K@~ z6MuW&L4I7_i+n*-zy|r4 zEEPUNe2#J2Pv=FX8CS_@=&oC_6A4fC{67WF^6qMm9XIMYBugtVP>$l>k%}80WbNjrjIF_wYM0deX;-Scdk-*! zfN`>=-Kv}Sb>p9{}SR(Z|V@w1?}4HHa;NpOh-eTu0Vd!-4?mV9!BGqG9mWv|Nj zN6VdeP!{t3`HiA8=++#O)z8Q`N3WAD87MfJ`0hR@j6-o9Vz%C9hr+;lWXG``Scnhb$ z8I%jrj+9E-sSQ<(5=HsNu^ZP0S7aaTLg_p}peN;SzWpC9K&NO+W5gf-=WRw5eYNvE z8albR)m?k6)DBSPe_12{f$&MfZIaAM;UYn>*e_Vq6V}9|SWmsctO+X7M-Y11W?4&f zlx~=JNhP0u{^XuF=TnsQj#0Q``ugIZ&qR9l4w@T>AAB>wn^O(_Xj5frQIka&eUFIkKfR@3iOh zN{TtRNse>sIko>&8VP&RZrbQP`^8uOC3p37TFYx`Nx+75+O1tgwc$%pPv>+rwzcr!^sn*|MP-`@J zK^>F)8z4#)IZ1_j2Iimf1`8E{zd*;@E!%35J#N60elGJKi#A(^Lg>f?(}u&AQdpS6 zl5av4*vLgB(MY7l3pT6+;oWhQ2i{Y$F!@&FibtcL1TMQ-9qZ2y!;@>mzRVeEuDb{yxRCQPlcAFsS?bOoyA40FA~hjCOgU; zY-|H~WugVd)p#KsXiSBlBPAgCnmc|(!RuehckUoOPB2-dcSrbgvTW`3JzBs=yLIAe zuToUjJb|^2ApFY;nF9|6;qvH$Y@Zjvkc{3CLr%U1*7?EzB#nShfhc1x9}scbxwjQs z5Uy1FMeOH3Vl{U<=d0=9@2&yxRaFUL#y!=*?1)`a&hnJz-Ma%S$oiOeWXYi2=BMTA zC5PsB#z>tKV8z8DH#%$|r0zB?2nPH-2<3*zEM!RMid6>gB8}RTrSm;Ql;0pu->yI2 z$fcb^@-B`A2e3DA$NB(?+RgtYvUOFY8==i{V5&?T4Z}iezqui5(5!qA`8Ht@1aQP! zeE=~TC=N!SI?miPyNb**MAnP+0smL(Ni z#pwlqW(BZ#2h#U?%U_PTJg;UR_kflifB~63hl8NSQJ4`k@?u`n>0D=;lRWa_v>!&U z(+$5N`OT_~^P-)SxK?v_3M$H8tGC=3czjT`4eZW13u}R!90s{4@Oe#h>orN5$Ai@Q zaUJujsi-CBR9xN@G1VN0RvGiTtiMmk#iq~eD;EP7AkUEKy%zKAb zMs*TMJ-co1c0?S9^z282Qo$`R5Me%*R^CF=xHCVVm3nn#GI!}+rA^x5

    dmVn|3E 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

    oJd6d{T;=( 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 Q`0tC&+c#Bw7XHnD0G%9=*#H0l literal 742892 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 ($!;`P_+d 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 jY#k$S zpS4i!S|owc{OM2-IjV3@*XANRbZ6vQ&s*`7&5^0fC$LDQgWdmRr`LZlK02|U$nx95 z!(c=Ob_O<0n*+C;;PWpfF)~S z7NvG|@8i&lCLkWGZ%?9f0nEUC(Lhplv75kZT2H4+8emdr4LM*xj~f39I8%vh({bWJadW48ua{6R2z>$SxQk$Mf_>OP<5+38A?R?p!zC5EOF|X}Z19=U z_t&7KTcUBm-~$j0xl&a>uloDT&`#iOCUD98Aif}(AhbQqu+6V@Pg@Bz2!B+!uns9T zywp~${Nq%>4effJ9bh*kdGhD%Ez2l$?w>Qf8^%#$n8_)kMKdVKq@m{I$^miw>u%V4Zy&l?2T^C^qT$zdKpH^*DihuDLo0=?(~2` zpa7ZE&p(G%(%&xdQr^Dt`9Kns#fsLvcVRUAd>kzgW)}DB;$!wqyp5 zjSW?gye;cL?YZ#6mPJXe%u}?DN5;#BUGP_BNbuzLmck4Z1x zw8WG_y+ZL8h|L`e5$XwnWNhRHgf->|zm);U0t5A)-HfAmPe0?1?$=&1{GlfRu?DJk zp+%1DdVWZj$)(}aDbBHHjjW}jM5?##6^E=85~_o?FDae}YqU)Q6bg0&(QrBrt@?zW?I5O$4y z^7Pc@n%wURElzIgz?)cQOoTP(71~6HRIh$YW`&0;;9KbY2w%TCEqQ+5@e-PUFS;wE z6f*7g^$Y@agcCWd2c8aZu%ad8&@)E0M=U!`WZNxicjtj$otTWEr#rIuHOR~*vmBvk z?Pi>9Ke(~CwaZje$y%?TlvePo&t9$@nQb;?SgB?N?K=%ATjx^5=wGpekJ56=}>1RIMVxj9%RAx8E-T;dJK)Y0Pp& zWZ~i-u=rkXn#OIi~@a%AcQa(r+7}9V$QZ4lW_H--j4c z+DL12rn~O9#r-#E#Z9_iUchwhm{>@L6^mseHPfnp;^ZI7vCndO^f=Qv+7s!#?Lh&L zQa<=`05CiIMH+a*4 zXI9bvw*!5S*;rUwh!C2(+t7_Gj{augK$fK@Z-I+#@sYs z)d?jYgy1?pU0NLo`pEpf;6bR$$k-k@h-@y3B4!96xZd5eFiytSd9nW-dCModLDnl( zWEI-_lMe3uum1t(p2RMH0DSm4o8V@9j<=hiT6^ttl5Lvy1kYc{n?X5aTCn|27r&COMDThsaP|jn%z*O1|-3=a9}D^@*5eOBkH&yX3-xk&)Z* z-k89C!m=54^_pC}-5hxCdNKli8u23iFKGow^DE9}Uq4KO6J_oi?C&B`i|T8-NJ{bA z+}r#GiX+WZ?v1rUz&#;P`BEDM2(C4RKPH~^tFJ=OG{xv4SBAtCsP!EAkw({F=vkyY zTJVWZQ=MIb_u;u$Gq-4yQCH_fEmUjP(&WTvI~bCz&e2yIUw}RwS~^(pWFh>~Jj}dX z&Vl_?;Mp0;U`Ow>j73e3O3n0l?=O#7QLkKzGZu*)g7W%M<@gkbybZPeEYDENL{j`~ zqfXV6;Y3pIBgNdG2QmiyhA1ffS`BTuG(Ku%B?_0ss*eFj=U2J-;G~AZ-(B$|@t!HNY0+~yy zK{`Vro?~BnwJYgOc&{w=xjsc0jPg6sM06?%jySXJohqT!*NhP0+g1mPU(`l2bEC12 zOj%0u6uxAx$mGDfs}a0g`G(a^;1klAw0aI6vD3hZ?LJdFux*-gL#e1umnQ*bHA2iB z>woad&g@SvxiVROLcsLlz~qYUn+t~Qfx*C|$&kv>k_+kpp7hF{L#Y~}pV0MJ(($bD zp3=zczNfOAKQRhM47NcTLM$ZWPJE~mI>>zDC+XWDa?c;siQB&^%P35grYPw4VYi-* zo*GWgBD&a3^gF&SzL8_)adtg=!(6>FyJhc*{YR$k1^kw=%Z45AsWBx#WMO3{F5CHw zD5yFG;|!zgqvLV4Enq35g)SwcR8=zjE#9k<34MyT5YIWMxrUc(GX>pk6p{FU0rm#$KQ)}MVq#)_(dsTrGZZx>5UmG7XO`GVrtQpYv(vg z_A+~yEeVq1&J#HLf$5}KQlmS}r_|aL<#ciUbsvkYWN#{QXm6>%_(D~*|AgU+$_M8`a>*$0vmUv->xJjv3`GHzZv@Y1s&d-q z#lp||`zNPgKTdAu>EOh*ppXSmo?gzWX1#D5-_f~yEck|<6n^k~D~6Fa6b(n?_wgOQ z1auqG?3)&{TELYfD0U2)g3_u%B>Z*zca?bgehAnb{(V_Biby=zxf3z%JtP$WJ6i$8t zsLAa2dgH^$T#2tpkYL6gwPR6l+Lh~(42n3~|5#j;D~!pmqyTXNSNE4e=Az&Cr3|QM z|6G7(tMkvf!krv$V`p-~7rKNQBB|%(n7CFdO*> zQAPhl_QZ!Dbox*i!XIsSFJpC@zq6sF1Uf|juDf^F@$F5XF~8KTGwlA+{t?sC6mx}j zik_VZ@}l&mD;u)qH?Miso-DA+yl@a1`L%Wc!VpdIoD$_yAyO6_ zC>~w}`E3UGJ?u$EOh~eXe9L<>R(ikoWS{ZTLJtH_q$2;voFohTQ|qa<^o{`LF#q># zQJ>%@UD|IPIVaU zf1y%KEiiGpZl)d`y_*bIU*hHY0yhC!tlQ;LxK$4MJ~A&3tv5dS98La`|9(Znkm#k} zm_RG0&(?Z?Wm3q2)s^bFla39Y#PII|c=v2jlB)cT`I6eI?H-HzR;QZ2h5B{kwDChq ze$Mu~L&^@cp`_@#&GwDdyTB#8YXi*m79OkC;CIVfy?N(PYbGogFPYV_>$1Ft$U7AU zz6bIx?}YRJ0TEOAevkO3i_jR9>V7o{6z|o1jYO$_Zzq-oMWDxpDoFOx_ix-s!uqV2 zGS^MKl%zfeHW1O1J?&T2iO$GN`afdw4~V~!1ZCNF+UA*6?3WyTVZ**fd+^(E#!L>Y z`0e{! z?WHv}`bsT@_Z*)H%}kl%{G!7LcSeH&)Y6x2AjbHC-+yzW(O2kbm0D@&)(*&^VhkZS=p@=hAUqB;<5BVdanc z@;dU)-g|ePd$VW(oS@AOy;}AvHdNFSHhsGF2hMEpFa>&06ua3MCdAf==)XV{(RUY& zh3s9s{OHT?+7IAh!Qc)~GoSwFA7`~(E@+uMt3<%;?q#ZJROvqGJu7zqOzg?L9)jBU z@Cv=Ns2xWiFQ&ii{LoTEKZKp#ki@HWw}8;Ov-QlkkN*HhvN^02{q_^{cd*poig!Ps z=LE`0OGtQe_Wyc>7`m#)V}Hq~z4Vxe2HM80nW?Gz9UAXQUq1m5o`kTpcy%EUlPx$|$~avF+#chgy!`~kDsMQo*b!<2;L55-#@H>=4!z&YH1(2VBpC|(`UmFlP=VReGj}ZbC?z=M1D zk^inPwUP%>dsgHRA{%52i__{eZsC1Ww;!*6`ZFaem+{cfP5@9DN|x-q4Vhir-gz}F zC0y&y-%qZ^dGg;?r{LR|kmfvg0&gdiAK_yXJbfbMttVVVY3Ks?!SF{rU6w9z2fS`|y0O-i_Y?&K<37&7ukWE9E<*(Mw|K<_Yr#pbX|*cnRf%tk zgv`E}m?*tn^B_6vU;pG3X7d8?mUR8{-_qi_WL6^uyo6?O%iS00mE9^QP1NpBHfqVl zAi~|eo%%dOx5e$3yH}R3@C&( z(f;8$7bR}l>~w*Ts)WC!8Z5I+A?E!+i3iPlZs8M;WO0+Nl%d428mZ>T#)aW}CtIEK z14_vBVUu$-R=BUT!RJ-p1^@5N6deZVaE)IdUd-D%(?vDdp;&yk>=pki-TXfJ#D(pO zRmPjf@{o1RJ;rq~7WK`uqes6yjEP3$!jXddU5f^Hcd&t+;E~F8eqslz}wHG06`_LE^i zQB`{oH{`?}ew7|*T5^jf6$d1J0@TFNF-q7K8K_0UpyTW{HIn0W{`ZLtWYY^Aj*eK5 zWx$Ll>~4R{uYHj`y61-W8!tip*oj}Gz=-&Aw0Gqp~itQ zYtMEk#j8SN%rr~qP$ty7T(;V?fV;`;jQ8C1`03~l7}9w&&WN3$|zcld^|~osYODTp|H}bA>a)7un0mi@8hSxbY~F zKOhOcN<~17!noVtxFC=a=yfqBECcW3{z7(zic%5R^yjU zgTz#Q8~5E<5Xe}i#HgIjTv5ypU}t1oO7nvHeJk&B79NlUx2oX1H|CKF2cx$&9Ia@Gpb zQ>f-TP%F71#pk%Y6g?Dk*SK_;eT^RIzWSxG;JvP<>%+MpGT8s#rP(qnnaTT|eNXu)iX6 zcM`Kts4-IA(w{-p?_UG#b1s;;&n@`>jjJ3-=UH7-$dlf0+T=UjPx+vo*%CkaJxbg+nGz zFHip4bdGMJ+oJ(j$1GS5q8VUBkNUB%IsKUx5`53v;O~Qk9Mn^uce7MExz#pC;saG3 zK1Ns%2e$$p@i0gldZ+=2`a!U-mVM_UO*`u+A2Eg|R>G+mJ2*BsT;>v=*FPfQbnIsQ za-7i=EG1Gm6BTNGJnu;*Ixtb_dD7yv?K<$yqL}XM0iPoa^G1eR+{s(H8KG1HJC3BK z`OiI(GE;;7k3E=9!~K{%ZVp>-Yb65h#qWWRGvV7TzsaPVj$3g6fSm1_2RzLC-qhwi zI5^+Z0)xVq6?mqSg9Q=5B?`Q3R*?gT;J`X3rMU!vy$ki69<|2xT};KE*lqAX7P8R5 zs)Mr?qhlj!)iqh+?``r#k|Z6&dyWVr2kvdu=+Y(Pvz+O1-9ehU+vkD8M9%&<<~^PN z+5oMq%I_0z4~ZUTGSVs>%TT%GF>k)kz6zK{^mSAoTz+rnG9M#3gIX3a32-!Jv9 z+_Y;|p4W(ISI2w0)?`xf@zkeP>jd`#&NM@X{xO{-LRigObyB#4CModxeQy)Xg*DRs zC)0k!-{WfjTo!GC*(ti79IDClr^_z)2q3I-*^HxfsX;$INqhK+Ig*Dk%3%8MdIFdX{rVN#&_C*M%}=eMU4 za^JtagrsVrRTGN$gdolf>P)oiB~chfJZdQ}8O(4JNo4!WW31Kv*Oh87_bj}sH0M1# zN^)DGXI8G4%-~h>7rjT1+*n_5e)bjr%6I138yk#SoJU#mv=c&NX; zX!$`jfSL2*3*P&AC5Iwc*}p^^JqjXWhVWM+^^%33inp^yr?kH^dT-BoPl-4EJEXMS zwx3|IRp(OzAqVm$l{Z(PR^U9X{J9xaPNWn6cyBUZ>wUa{P5-Oa+TWmAe4o902lzS$ z^l!1?(?YV((^13(epBZ=zt>6T3Y*;rEaPZ4=j5tQ8nLFGm}P88tS2|wK8F$WY1W-y z-Dq_5XgpI-NWkgvt7i11QCZU+c!_2^htmDc{&F5{ht0~zV2drRi@6DuGOsF;BN-_A ztV}0FAQ-8yiOBPgI7EMV^*}~a#5Db9X%?130S|{eRfHvy9bO#DUEVO+1&;1iTch$4 z+%zWEj;GrOeXVFEKxKmYUx=g?aH`(3`P1KV7iSKg-8H$`Y_{h-ZQ*x{`>C>|kl*!r z86%w?Kef`!-=^V>g?zqog=g>;|Fih3Ac-^O)&Xj89*uF2)2oDS@Jy~wl$un+CoQs8 z7F6?TK@`MW>Qfo>&5fC0_5Q4k_>xX`M7F^zp`EUERhbw}miUyxFQqrRg6%eS42Lqg z{gHLOW(Cm=ymn-)RD#p_<}b>h|NTbi*NLf`5VvMD=t6J5!f&IJLylv+)amIBqQ&kx zP}Z#f<^JmHlbnlT_r}!b+^vofq6Nz3neJ_0-;q2 z=kDs;(v$7h5MO^$qifx&zsU#c0kF<$=XZhJXc^Qhbd}+6c^vLW0}SGHOH)O<4>mg4 zpg^xto1w#w@s9aYuDN;#eups~4_YS4i`R0`y`JG?#QPBxPfj8v@1*JM zusU;YZTvW@;p9TX*q(0;t_b4j??AdUj%knkArcD$;=imxFBYu881TRu&=YrRrg@BY z43m01;t~YpOQsEc;jr<8i(3$+@=%KCIK$Xo_dq!lNVs3@MF3a4e=1*IJMSpNdwozK zi-a;tBpEDEm0UV!pkfzm8qyoeOUuF!Xy4;6Tdr&GRQ@ShXzxVkrofGD<~Vj?U)zn+ zg)nB3#@G8fte)6SUr<#DEf200l`&gz6EYV;;P1N&EUGhA2o;JtmVn0GKj3&kwmfjt z{&ML-`YRLRv5QigMF)kcL$*B>q{W#(4j*apeyiU8V_uFeg`l_4PWg;MQy`gZ_M)qx znf+w%+f%mO0flLvr$o~vSO#&JwPEvDIyRIk#7-!DT)>Qi@{9S+k5}x^B?(_!DZgM)b{e8x=%80_ z!cYD*T|>;2RwvHptN#6>uapKe)d{C(Oxv+Zfu-1MVT*juHdV45x9aa|%Ub;*-%Agc z_}^u&>98%hBF?`d{cSd0P+Jdn%FoNw`N=;)WO^>Ng1x^8Uw`X)BIYF5EWI~zA^W7J z-n8ZrY#F^FfS<52w?uzcLR8Q}N(ZB>Abzc1e`V-G2lukqu!}mdLYi;w<;`G~_d(iC zv#~&xz2MQieW4$kdKqm$^E45bJ>VWK;_uPizB17?#mkR%h~GCxhCoVE5d@+n8(msW z^gxJt5SEB6=xU!NrOM;;<#!c^8e|7)1bZNo{hkYp2K%p4q2a|#E#f=V)A}p23GA2p z%3%L3;Lji+@v0^cW#Mm3r#ebC67Se?l9jq?^?B&EWlHdB;jS%c`X&iXdY*d zLOeK*C1o4@>_@*%YM~GRivpGN*D}d}I!b@)m|wM~E+1T6kg0mE!tnzQxz=+2kkq84 zkd^w+D~@)Dq#(4^pe3o^(JjhGAYL^iLkX^o z@;rLR#*DYG>M=Q}-vM8)BE7E)klhB3B=(e@v*9Abk!YHI zPL`nVY_vF?zcW)`g%%AuWmk4eR>?sVa#cV+t%WmXiNB6f7KXh8jm;hqCB2a>F&@$) zX1=646FNdOm5(kz+>O9T@SprUPD|GvS_|#<)FYo}B%S_BKwXclzKJqPOpf9+r$f3G zf}>K?nJf~2eekQ>@Y{b6<=++^9v61Wb=JB;lJEJ&65KS+6qBG zBI=IN0r3S(NnecbfP6<_*B5JyFl(z-r#&5QvMsYX7sVp`0?^GR#<#Kw)*z@ouiEhI zx4S^fZAAfBm!p*mfzoH!R`jEQd)$3#^rIT~PQv?u&%(^}A6@bptL!p2lUpRZ0(D&i z490!e8c0xOPKpI8KpYG(x`4=gwB)Yn>6aR}Nc00^z!z{2Q851)Uu=w0QuK8{+!>vW z`^t#QzS&yV>#WsUA=V$5Nlpu>{)o{VFBGe*LGqXH_cXq8>q8y|Q+>q;e7Hb7yZ?##*}#KlhPMv8wx2 zzj-{B!%I54_oT-ylJ2ys4dRIubM^?+l86U1%HjK6(5G+2s)Lhz2DDEeC;e>yL9BT1 z(s9$BR>=t`CF^S$bu$#cve3WJu-pgpB`sIX1UA5MgJe=xR}=_YWE- zAA{troFU2|yHe2awvnUkc&9lsXNq3l_Z%!O5s3*JTOh^z_@^m5ezy9!BO#Q}!FRgIyrt9DBcmaNcE&O4LqoY(nqvL|JyTci3 zZ4Dd3hH_RnSU(NeMsqYSZZ8I<4%fW{bb|eE&p2?F1ICnUe$pm1VB<)-G0=RzZ)H2q>{-xRb$qGc3s{Ew(#1*AZ z&{+EO-2iy;_MUnI$nOUnwuJ!eb!C)#&~wN5ZSYXs3NN6ItjK+>@`m%~`xZpj1Dk6o zA0ze7h9(U7@tu*rk~ofzpOj{^?O}{hAem+hGN*WWRt)ddYaWo^m-cnMRJ>0~$s3@G zGNGSPdHM}1Ga!JinuITLNR{gc1@aF2>q`jRt^SIwm*~M z?Y7WexyF`D)eU?$&a5X->%tK;|8(B8e6VZ2e2t+JX=qMK{7Lk~T?ssSzr@(IcMF&J z{ZY@Gi*XTY4Z=m!*v~xetr@)ZFQ1>NH>5B=|Cmv6PtgC-c_$1}=>r^^LKeFMIJ%!#vs=hp?y20#1K%K%ETy zWl3lTThcqrn=i)kptdvfQr(qM2IfpIPo?0AFA?#OLDC`ID=bu08PDS~^#Eqn(}GBN zl_MJXyX~vNZ z86E==$c0~Jq?2>x7Rndo#)>}m4ui~IPH8RdhtLkuxfYPXG2M8$epVG?%Q6qIS)>f( z&2-^CI*Z?XEzKkxwaoJ(VJ+u+x1so2to--Un{DvsZ}dKSq0rg!P8*t zMa>goL7Jn^1?fyu>fJy_fF;F&c%}&VAH3jkW;C1WxK^ zrX1rac&Fpw!@S^{lj!}e{|-wWPD#I`cU^P+mrQfN=m5xc#w`5&|3B^*1EBPRGUEe+ z`%(izl*rEeUU0U=*pkc{Nh4_${7HtW)!EA+0p7KlyQ3o z#x2a1GUz@BNMD`+?Dx&bV6{aVVva|sE{K>xL@AA{)U?_>e?a{* zX3%Tn3!+d(rdY?jmfEKGA4n5}DY89^l&JoKk5jSu8X>Jn6d;fx z%j5)ct9OXg+u`A|XVcyWDD~K2{ROz9?>W zN^UC^595P}yg9Yz)IgoIm1xHHq8!>C;KuoAC3hla?va_sVR~RR@t`DfQk%5(82f%g zIo7p8o#{y?9rx0s0$d{cCTMS>qU~`@lA5`TKKY|+M~e*aXbKJ6w*}?(j}V`{jqt9? zkYpxp5`;FMfqw(AI3p^bO_hx?hH%F_uKyM3v64d&uk&aEfibbhZ1=rJZ|~HvLamNpt#strCg)p2nsWf^OIh_)*dz8 z#03IWfQyrxC&AEwchL7ZeZ)UFJ1RIDh^6%D4V^D0_b)Vl^k=Os2+8o*9smx&1X5lqnKjcOk>nXP4B+*s8NB z;;bH;+_rL;{Oisq@tx}Wc(z(;8J)iD@PYl`hL?n-jSde3DsF9`-A@dd%EuV z$?aNQWfzZG4Lv)XW?#n1jP$$q;gG|SE8i{SnhJS7RC-B%m2d;gFF%gS29K@1hQYL0 zWP@P9Iy))Qc|E@Fb<}s;S_v&*=m)gLU0X{gjp4I{Ftih;}^T7DP1$HugWe4FQPPdvC7v??svE-H{AzO9}2s^|o}aAa|s5L%2I~GAs)Y zhONKwMc?tKVTTzoFu2SLVdf9`i@M#+_mA{qu{@d}dAfRS@S$-c4CRzlx(u+%| ze)d~PCcc#VH__o74nq~N*F*bE29JWHpT6o?Yeg0NVhLx=qUXu`g=wv^>xWuq*Y2clXWHgiI;be2@Y+l~WK z1J&K>T_KIPa(>dla_ep3&I{S{JgDCrMSH+BK|Q>$4`&Yu>+A8%aeSWgit@GHtJg(W zJeLp(_6P4_1o%@9)m$J)VfhOH;XKp6Qyj1=j_m+Khx0Sx>mVs9Z|+S5TOq-9P){rY{}&S;S)L~oe2X2v5p+sa z&*d}Q$G*?f2PH=;mMv`@@R1a?hW_Kc;CC#k@5Ki+*8K7~t;>>Y>`ej+Qr~Vo?)l*U zKD0VrC)EQ(yrdx1!BG1Xo|EsC!7JW7^`+={VqywF;v&}o;x9IUBKn4;6O?qilX#gw zxs)yQo?t`M1twJA`b=NGCILoRq~ zgdV#WZm#2%(*aky$b@afBza*>aRqI{nj z8?u)tQcE&JiE1kw=6n^82huK>oe%vSJ${inM)!t^S+&@U2h%sWM_Ff+9u}>HcxLZ< zbh+OXF2$beJl>dRKD8|+p7m^}Jx%1~qle=^yvF11912FMAtwhdk=oSHo)Z7x39!|X z-h1uZ3Wv0s`zaw*tL}ZS1$n4TWy3C0C)`kR4U1T6la3ilAeg6Jp8O;v5W6 zR>FPn@d9xgckS(g)E?mGFjO!Qr71KBeA=czH+Gov@Qw$9mp9fq0%jdO|CNbs1HJt~ zXf(irg6VAL>c;ztdyBSA;tq=Tj-P(1!9&qrpK*9e4YE6al-MC%p{X+cV&1_E14Q+x78#K>IWK?0-ne zRm4uo)SJz-r3GN&<3c=mJq4R=tAWWMdQQ=X{6Kuc0PU zIFkr{&Gv2H%d8+`jTJuerq=gdl`r(P$JDKq^W}%AUVF>w7kY@6TlVdp#7!#)F=0|? zvxP>c{98*y)toJP>?s6*5U&Q#Vp;Wi}BtcO7jfZKe1RX^#dT4E+gSD#LI=OqB#^yJ6&O&(!0I1Dt#& zD-NEnnVN&)VNEGnA;j@3dfz7M|B5ch)LhoPWx*%B!giZaX0f7J9zr=yKyBW}UT15n znIE?2e5`z;Z<8-bV;18J9-kgoLbbS_;X5h>_jL-OD?Ud&d00^pw)pCy%15H8`g4=~ zdrR3NGlLzgH#J3{Oj@n!etghj%MTor6s>y8lc-m)WR40`Y_8O(QV$sR(#EUAQyq&b8dGK}awaopb4WsA{JJRQW2wO;>*Zj4X zYWGuC{Sh#i=ABqtwBqnE;t*w?`V-R;R@BU&b~`gWlyz=red~U}qK*V}!4twt&T}=O zv!k|*{Hw(S4cloc^|yA;dkZ&pJWZ=7o#Mllc=(o6HwW`h{$_2E_Bvg%(v6xMaU0!4 z$i&R_(#37XZ-)`j-LRkilgdd8LG2p626{D_7B*KroQm$r)WgqY1z)HyRB^mxZ}p`< z4Sh}(c6uOMn0+Q<_LuXdarV;Q8I<}zj;=DSslN@2h=2+xsECvZh_oVI!=l4N1caf0 zba!o(A|Rd8(jg(88{OS7V8G}aqc&KacmMaxuJd6Z7T5Wm=f0miL@OendrycMZnUlQ zSp|`&e^DHCmz8vf07DWj;>f=Shcj8nVbOB8PNp`OUk|QGLgF#$I>aVVBl)LxmDet) z$mVu9N#IW-?_2neDKgu?oo9 z|F&F;l!9&W6JXGdkrp8wat+@C#!6-549nLJ$yYh1g6Ed2Vk9JHpl)+_NC(mpiAeGx zzw2WEneoREhHGfeKK(3VQ1k32+LKS~%tX|06jt?a*`pB~qo;qceBe zFs5(y%3JF%P2bSsk;0L}PIbmZua~%fAE*7Dc+Y{GBXq^8B}T{bc3|`Q)zC*C2IyCn zzVYlXc`2VB7@FukZw(Oi)wx!5cSy7E(FX*_{#>?69bZ=OU}hsa)aswl28^a#LZ+7u z{tl0uBhIM#W~Mro<{&caw<@EwOLs_~&2AUIa;M?y9SdD>f2;6FeMh#$Rg^__(i zx!uF4RF$0<3GgJQO7?DC8v#DC<~;hej)G-)jU)(VcH{RgkUo_9S19dOB-2QCA;@-o z4l+M}8T_3(2{63u@-P%MqQ$WeEP!Q*IrNM5^w!it|d0#fSfJgr_2 z-cj`lhujjp{$*!osqeYA;Ld01wch1~`%}&edR5K}rSfW=pILCtkz9VyZbQEoc|z6v zBV_HSZj4$wPL-Q5U7HKLIaz(FL`h>REqxf+bA2a@r%n`(UD%oA@sfMttHBj%ebLr)Lx zIiA-l-`diQf;B$X`a)~?mGFI-&O@=n)pAW;AWQTeW~x-uAPsj&aZ3uCx&lHM4o4Rk2XBj699HPT4dEo1M7Cv3IAYydq!X-;Vs+13|xXglc#H zSHFGB#_O4vavBn4Fu)f1Nz{3$t^;bKJj~q?I0=z?&T)G86{C@s@$ZF1&FU964`)X7 zoyF^<3NW|&!kDTAdE>lnaC@w6Ir(NseyESk&!gxS>+N!VkDl%RU=upu?}mkeev9S} zW`U4i89MVmsmZZ354=CxtEg^7j7(+R(O=Kf%9{SO%e%d}HVw@&N@d(IqCVM_)HUm{ zlYr>eQt710i4NR4Q}jCoWOSN01ZeT=sG|9#pMWq$tsO6nw~I6>1vk|>P*!Vu83o{* zh8&!J@l90`!!gjX%sM$q8N#1BgBKNSe@l}%0F}T~6^08LMM?5uHW-Dx2Y}92L+q!P z&eo1njj?q1>{r`*$N-6$hntonves{MUlFX=A|Tf)?baa(Q=fULArD4IXDx1v;XZ(f z+l(QL0{Z;gIx{;mFY-N>-O4YJs?3s-c|n9CE1ba4gsH< z*MkW4(|wVf6GEWtb%EESDe zYc%z=I|j%k34q=w=aoiD&Z03fGQw0o=E1hNDz(n(=ad=e@lq+>GMQCL6|~(TpRj-~ zx5UhZ+s9V+@BgBnAIt8&m%tR+mgPi_X49Z2P`bmr*cgBB)03*{7kw-bFfjP)1J{&l z$v&0i1C66Ae#!)$%%_{cV7?b`QIC$<5_`9b2Uc+w%mAed*X7YBZN zb@i)Lg=_ZrpXItoatzi2T<>VEedkZrMAR-047@SE^+1)T__4?*F{g%S)sv0Q0xH>2 zdn4)hQ=Z*^|As~srl(|fk1Nt#&Arw4ff$6z}@YxIM7Ae&Jf}-5iYsE#6 z2mOaT32Yy%ZtxVY~yf>Bz z^w7gRiXx`J_z`q#HX$%Y>G91yL8%#uCtM%CH5~-~y$nUg5FdxcLOPXR+Vm#h7;{^5 zpWe&4Mm|gPwl5*kx;M5|#>z73SrfI=j*-o8U5cn;^Io!Bxk- z7tR7$I?K01uR@}mnE37US2zoCuY2i=#Vf|eOu}_w0|Kz;*GL^pw19~Z!*4lKz~Pr4 zhTxc;^)OH*etCP`E8{?ev0j^2S0#6 zI&lb7+Riq8JsKvdXys_!pN@kH9WrRBcTd27N3$D7YpDHIu7X4km&doBc{t+3^;Z|S zL<9xnk{{f!g`yOnYqaa1huXcHI}sP(IYVO>YfXA$Pbe9Q(XBqNr1Ho&U>4%}L*CjBw5jjXFhpfiO5-b^i7u$3U zB2JZOA}>lYz)(4$O!xqG(*xAg17%Gv1ahmx z2p(Vp`o@F0fWS1-wb1U4bGS96JH$!o#c^`jtEWjdSL~Y&-nCDD9e$UPVau*V;Xv!a zNxjtIQebJ@@De?pklP3Man@l0lsnw}U9Pu@BFcE}-0i2?!tK>?#Ix{|=phD0`L_yt zS8{b;1zM)|MC>n1)Qt2gWdh(u&@Gqk>j8mKpnJm_?EAFs1%nk!DkcNl|K8~Fa=2x? zwb7=yHdai=9Sf;m1{XFbXOQ*$t_=^!^n&7#U;PBom1f?vmLb4`Q9By9cEn}T4RoDD zwFm`f*{^l%85Wie%NM0`?LZc<_-a14N`^L5IIpA^Yt7Y7Ksv$8 zbMMrUG_q>a4YhtL4J4JzU+Np<<>u$Hp1;zIBiA~G>F0yaM87n-LWY5V^1VIxK*W^e zBvQvedq2i}hhgApX_ySD>W+Ss89F7Jk<7-6f!>|R=1b&5}q z7wjJSPokJ3JzOP?46@+s-rNO)r$0Xe)6goP1!od zUc(E2DW>T7$?T}=OUEVWg!EW)JX1IcfqzrXX~#wV3R4!FEyr)qvtw1ux;|NpbZQUH zsBW{jaC!4(QJN3-ogT4boAlVP=>}u5_aCU*+$&<=E|o$O&;nv;2{BMTo_8+W1X5MJ@Zq<{CiUy%T z#x_sb#cFt&_s0-bHbZIe?H@H!7I*C@)St3y;OJs$?6fv!|HkJtSje^~_h~%cmtN*C zFIfDzlbwmvavxQb;zy`OCn*I7piCb^RCSM(^s#oxtn)9|kEIp~FkeK%`uKRmHF-eXTI@ zgk2Y^0)5fg=d@<0SN-_)4jgTP==&g*4Y=@p1BVOuEQm@YZ$IZG9Akh(@NjwJqg4i0q zbg;8m!;|;lmyDb73ok>-2j77Wd<~0|?13JEiJ6CkE;`)ieyuZ8|LkZ-$m*|M%#L6N zoHPKl07xVY=zX#k!9iz-6b|3jL4ipYfQRSm@aA%D&sqE_(ifds4W8)%nlAc`9O~4J z9n2-=&Rct+XUjXpE?_7ThAqV=$wLvk?KsFPz*n|+R5zouTmoMv&Fo=*3(RcPhU zgPzww6h4gk>fKBp72`;Jy~ppUQP_0!*Rjj3c9V9o3yFf6HDoc|f%_uw`KJ8pmmAco z>nKa~TftydMfK2{5k`!K^AJQ%nu-wCNdev<}!lzf~MT#jfhdwgDKVsysCniZvO~n)~zS*Af0PkaYdAqut_` zu;pIk#J4Jxi%wRMY;bRY%L;NXxw@Ot_Kv^Rq==^0i`mDOucUfce9 zS63u>N2%n;nw@BSrD_jb8^wbLPML0w-kSl_>+DSJZzH$NSr@yi5}iC|1Em*FH`Hq6 zZr)$MnW_FfTCe_4i82;_Pc+EN=Gj&DSlN*)uh~E0FFBWwxxfE;N9`kA&dRDD)#3D} zP7ZSnyV(T^`Rw)BzVdc#;s+T$_!mjOLf5-4u~(l96B`xZl|O@;E>f6s0rBLZ55JEr z{%;TC4eGXTvjfhf%BVWb(2RPMq-W$iwgswW`;!vZ2L!>$%Xe;0&u;M=1^Cuv*K~*} zi`=$qem4DDWYN+Cj*?tEy1J8|DPCX2A`mL&ICBJ`54b=|g- zKhk<(G#R*Dq-~wm&+FTz1NPw4TVRF$jQeLII9X8+P#at9E*%Gp!CDm>9HLYtwBTODgv z<&t;Su3T5}x{bc((QvJQdeul*DDI^}5d0U4B>wz}uTv%48PwzKNR0K(8G3oHdKRAh z{C+K3Y--_y1+BX;%$0EuLnw5zZ}NKLm3J=UsA9YmXd>8yQ?2VG2MKAuH)ab0GunJry=We(ptWoExNnD!IaoDv|2TA^^pibxGiS-8TgoGha;{|<$bnqt zhs&a;cJv&afjtl`5wnR>gMI{ZDiwQDB^oLny@@hhuSQkXI~$RT)p#<#HafJY~+Q)IUFIi95wDE9|3yJhBBM-Ps0YV%Rx6tuw$r-cMe8J zCNq=GJmm2K2-p-iXR(Qo>`VMp8GRxNj)AeIz};bal!-eoD80c&BxCL7(Yo^lfcd{+fqoYeMymsviVJ zh2r{>1BxLwGZY2qklVCM)=rvub^1RA5!V;{Ox+ZJ>T2+7i>d^1?N_@gPP~ydGOAr} zT@IKXp)}76OTy5bUZUW&pqn_I4-Dv>nN<$F*sGj_iH6M7%HDrCOD*s5!!#_w_RCwo zB@3VXM4Uj|9-=F*_N^y9JXZ339(t;Ci8ClWj%{>wC=F@J?;?HYFqLg~uIYf5ACg!M(CCYK(KOcH-9iXZXNVhNbsLVDwv}XNjQwFNa3;mKo4<@##!y8pYhKk0zE#mz#D_fP-p=bX?ld{|hVfFq6{Or0SYo?#deTvpKAM4FR z$ZWWV`GbB=7t8`5dUZ2{7%wr?jrY!S`QRyr_HD*Pfe_3;V0Do!(1Eweof|W@BhE$) zUmQImIH=WvPNq4#TG$NVVg2-IXRv-J7KbaFncetu7*g`T>Bt_vw8ZG^@UH;j;M2U@ z0gB}GxzJgbBnL+JoYc}0gA{8E@O5wo5cY(`L&(Fyg(YV*t}NYsW{dDfUeEL;bdC_u zOJ40pEgO>q_A3CA;1W7-WS<{9^lj;Mg|n%EY?aUjrbW*q7bVGcBrb}iQgR9s@fd;v zy0M&yx^Hl(>=Je_!3cz((1W5o`N|k~I7ty$fAUvB5+cgItkI~vE%!Jq1KG2U)@>)D zq*kGE7>$+PIc8A(am~smd625&n^GC*K>-n&Qoc(wd!ffeAX_Nb`@hddRfQOPZ>i}> zmOYa(CI-42zJ7Ww5-5?EWzPlgngVW10CZyo9PRlhf~ohKLq z^r?IMzipkT=QwU1auo5ND1UAJNanFJBQ6}_aCV%XyQw*SK_#lcz7ALZnn8_EF5@8;+x8P8x%YP`p}vqB1K&x;r0l2oYN;4o30^B4T?Xkuc}Ka z<7xQhXSsunhHZTsNpqRVl*QLvqfbCJ8Y zY3GbEul*!bnRl-EPaiZZ~X$iP4zB6 za#SD%9k|c$|CCT7++o*h^EhIomYsSSwHxV`)i(2_&csz4_Pl@nE}wmN&`Ddd2wiv7 z1;5KPmYvh+ikC1)*ZtmpZ33tt2XK-?&_dWNpOuRG!vFlM>5*DelX7get0=(od<3`yh#l*0nGr(hpJn>WkOU*UU1bxdrbj5~ zT;*481pl%0sQRfKQjsY6WHMj;=B>h4d7t_!1pkDXMXD~ezM8NbqNh(kNI!AGPo^?bmuJ0KeB1M@c$OtZJpwHr%8uX!rvtQ-PudxuOmq!y9-}R97 z8mbokN*fUKSk^#hp3J$2z7@^$t(|uKaV0ej=B+iC9-i2Yb`W$e?xEG)LMVfW$7?^M zhtbhQdO`^h%XyWxRj}cjKZU9XjiL#LBF*V0vhR`Js@*Rq`B9q*H4#QfK2&p=NBLDc zkGt0#bB1BM0?MNtjlID*NWB6T`-ZB}r!sNR8$vN1joco~v1b%ISDJ4#UQ#%dhHT|s z7h_)N{{h;3kaE&g99CrYHJ;jZ*&EX*C8xfxF8!@2(d*EQoz(Z%=BmDh!!qa1Bf-nO zgeGGv6BKTQ<+Uu^8=;2wZ~7+W4&Ck zYi{Y4Eb6O#aUdJ-+zi|gDt7!v0lUSj^mpWK-HU|niRJ~rQK5p#fD1-5DeHu4Xf%jc ztR#xPpmOmSz{9yQ*55hII@rMz#{@*llDu}0#0c3n#?fby(vm}2Llx`!d+UolUnT5g z>)|W?vsx*jU+Rw7FkQn*AN_9X31`jAi19oH$y0IZ79wnyOtVj!|Zwq+VdQ zrfF)FH0K_?$ifIQcL@P6%9EJZ%%ZpRVMtN-A)LD=rLExK3jC#riA}@Zn2;NXx<>g^ z-cYgHgaSL<%jpRCLvZ!cyLIgX4jTfrZxb@4z*kdS@G+B+CW>IntoH}@jk*~G=9&~j zn>ck=|F9W8^x_$*dubmDge9%du3@vxdV9{qaXQ3RhUAh4EDkthAke@L=#Wk$v@?2h zf|qLHdTXAc7+{WBF_;skzO;n)nFU9hB3`#Sc_DDX7_*{3fB;>*#E}I{f071gIy!d} z<$)CsDE7`rkl8n~#CZe*vgR~O*Rt*D*+0xg%4?HR4oaG&GfwwD@lk>CW;3Ak+xN#R zcsB|I+1^LocPW+!3iR(aGZn@?5YJ3Edn&sJ{+EuZvpKu{??_($DwK3F@cm%-b{RVD z{b@nJ3nZ@A&%LHmQ>}(Xe=@aiRJ`zx&$P@iVaY<|@yt<8Zfv=xDPiLMj;X!(5z28VV*Cz7s*4PGQLL?PBPaLPbiBcLH^9DzbXw574g{;hneRL zT7({!D8EbiROg!qK7=vjH*`rSinN)Vp7rOTL9#p~*)^+|CV3T(I)WWRSxtXHKPLgZ z&O@S%;*AU9kl}Ms4J5BGV(GW>s(JO#UqD?ikl?PbM@^__3oOmm?ai!U%NfGOM_*l? z_*xa~K;e;7sH*8b?rzsuO@CLG+w9)TPfzLC;i+6@y-N1b;gbieB%98 z*;-ycCgKI+(o*pF)2A|&c79$aT>QZ((=i)=+7NM%TQobZ-=(?NWuB<(m;P8g@lo=p zwxk(L4XWy+jd`#0v~p!!=IblAt>BV(LPY3gOh-Lrax!kMtxTd~$BOSH~HO3>x-KI#;~J=GRDR z(Ce=7q(kQEvMfUh!~91H7;|OZo!13IIYJ55vBKX8?IpQ626kDDi2^L1jSRmr4i~hb z%N_81FKtP#+>vqB{)ClxhoWzJt;VhspJecI{bBogQ#@z%bA!m)uyh5Z#79q)D?3Wr zDCACYY6PI0J7HpK?|A1dDOM8cv7A&4WSC@5Xj;H_?k0}bc7989VY%>-EjZIYd8}dghqx3w zH%4vHq@9Nq)?}#5;ocVM(>;q&4=0uuHtz+vvBWW!W$S*l2FFg9avFNxtrp4|l9;zW z3RLE7v^;aL``ad{jJRGrxD~hlZrIK@l##*UBtS&2;F;yx6-gsXqNJ%%l*6jea*Mjb5`l&?p3Fynw5Cv%BeSNbE@>XshMBad6~5ysp5hyaVuooTB%2SV22I zXJuQNM_5z5(|ZE*!j9+0c|if66L{McdPE?C4r5n=a5xd8@D?x4&LBVn`6M(iX81!U zPZ||YiDcVWoaY5Ml=D9p$cO@hTa4lWLw>EDdl>QJL1c+z9|d_TQ6wKUXbDm#7O2wJ zCcxWqo7rDccCl^ZfZm5s7*KzislD3}byDqyFKi02frSo`=#QITb2QP^VSq(99{Ud{ zoiwOhi_c~u?ty{F+1)xVTB6U_X<~>s>(@|c>(192Y*P9U=5OOV)D2EVK77m966(_q zrw-mzrUClzm4xbt{1{np6#lU=dy>RE&tY4Do=8S0d$J=*lq;xE`MWE?WS2}D45XPDKOC69qQvLf1n`S3f-9DMhB+j|~Z`loC#%`4beI}c@W zTEfPbgsbtA{*Zc1Bw(GcF3W&02VTQeQ%7jo-v(JJ-T~}|dd@+)&4u9Q4MHa3>!I+2 z&+75!^cvt75SdxAdCD9TE02Sfcol*y+=rcRY!0Wq?X#MSN%817jFW?7%iEAu#@;TDtgE6*#7*% z$bhd^CbR!UvtTxt$g-2`#m{zd1rv{az)mUR(b_+?i|_HUp^!Eb>CF0pS67M(a=Jc0 z72zd*G&+On&uVkfWt2kx)~`1f7d|PJ{dtyf`bEqI^5MFIy1IpEc4xT1Uqy95n)a!A ztp4=+QnmLNGlEKZfNjVtTquys5+zM~E%uf+Z>@?)C7g|?lIr~nznGMhHJeqG>YMBg z#Hc~kj-%KjQ(lmLdTfot(+KU5UCWpTup@k$+O^CkTa?@$rDQ#)Prp?eod5TwNN)J+ zRLz@i*BnC3qt$GpwZs4BZBx`_RFuW3fKrOG;A=K}uW9bg#YL^}%CeQq!VKJ6*IBK_IH@uLUMr1`ge( z`*Perb(w5b-fk!aNQaGybTd{ieO8V4Z=O<9 zEnc0n9p6Nn4tP|7GYX>4zp^kod2M_aos)f+@pZ=2plJ{YAL46*F7@%_Q|967XL09o z(GsIV3`KG=(J@&=K)Fr8zPrcd++L}J!} zTgzR{^Rf|uU3jO-h~zMuJw#m)M1hG6#mWE$lU;c@&LothJ}B}WUVTd~g{zb0RR7`y z|NFxcjL@Nu_G7}Ny4zwR?~}CLf*(f`Or?75pjXyHri36%#349@v*wGGZCJn)QAmLQ zwFQGf2I{u9sR!@s&1!SxP1esU73W*Ss8gou{y8z2ZwD}qAFwT)-@Tvr`7CQ{RD+n$ z&Gd~s+a}@d+s_V@yR>!ru4C&@>J5eOac*bz>ek#7dRURd^y=$?yqru~ZeMD#R{2M> z+lRUqaj$Pi)^XP@2T-XwU%9-NYrssn^m#FMnp)Iv)}bVK+I6RlzN4T#xZG;LWf*|8wTX7WJ<2U(nC3aKXpdZLak06-3#+a1VfHQ>93MyKL>YmL)^e zd=&`1j5~X_+Pw4~1t!7;ak9xaX){x<7%7rZsd{98Qz zRRY_3nosv^m>w`a2ADd{zBH#xau1DL?Ne96143 ztV5o@A^whDc<-V17T!G@cOAp|y?}@e{P%yvf(l(xwXa1!L9E(bQV57>Wmr}lPT4z2 z?>Q+@(BfI*bGaV6;GWA zH6Em>JwH_W;6IR&Z^Au4yeObLsvBvty|fAdo0P!jXaB=%Y@pL{=p7wkUT3LNT&Cf` zu>FTdpA8B~93)~2fVC-Prsr!r{5F`VMp#bpvy+9~!~i*>5Jv}eLbaaa5@`VHSFmZC zC=coZ7-37$%>T0+_+J1!kkb(IjD-I0Z`wL0ab|AgkVw7A6!AMe!vuLggqYgg-Hu?w z_p%0sdS8D}3vn95M;D7fW|~!wy>$M-l|-kUyo3Ylsz2z96^$Ghl{_Np75Hf6Kkki; z_T%=8J1ns;vGLzzncU0F&xui-amb+KTW=G+%`9*a?e3u&|2>aN4&@^Brj_d>8*&H9 zd#AMc-?LWtuNW_6nOyGY-VfspXxj*K|IV|7O<*FM9jpd!M)}%oXdl$?9OUq{zj<5F zyHIcr+zDmwD?TPb@0tD4k=utAQkaD(bqd$T{dybbMFLs%^GI_;y5T63W$V{!@j5u2 z%j!#!5!dVwl8&J2(1pl8y_!)K1Eu>8XY4b$o&Fb)4NsnLb`R@(g3Dhlv-@nk;=^-L&p*6*Tc_S=^sk*f z0%!Cvhwa25!eBK%3fp)^S)u4|x3;XoQnzsLrQq?r+fTUt%eoHzT6N=M4dx%;%D#7* z^IP*?pU|@RyI8&7bdA%GnfI%n^?y|N`SNYiQ(OOWywD5H-y zY^P&xc`ReW+f<~jg~C@P*b0^kQS*}MMGG8~Hy%hkg~QCE|W=D0`3j zia%fIRcqoX1##5liG>t1x2h?5hYTc^Q*bjP%kSVw`kyiD|5&Jshxk9H(?C?xmz&0_sjw{=n!Wl5<$TjqD@0N0wa z*-3j&?@^JB=Mmowe|e9K`;PKIZHS zAE#Ao4J|Nna#ja|5A>AdXo8=@_X85oq4q_=Hj`OMdQs4S+iI_}~58WOb@f0XY~3KfQRD!)CCjIUXcd+fZ8WtQO8K1O>|dC zCKUajVCEfZ-T1*j%qf(p0;O^A0l-Zm24o}#-~A15Kuin}#V;yQ=%w|;)q?KJ$>iqJ zx>AzVpdv8_A@atvBIFob2R(rLbRk`yM#}X7OQQeRr1S*+1Vm?WKr;ZsINUZ0hvqA~ zPLbm!VW8&+e&@RaL{alC_S~T#v>MiSd($$EoRk{p;^j*BH#9VU8=R1s}s=t?b z3CCX0PmebOg_&=9XZL;Dl=8e*7kwE~m!=mH>~JdgNOTC>+a&5Z=am_twToDXM-z+3 zcAGa}8l>F&Anf`KEuz;Wo?=%O760{RRxP6i#7K)_1*xaYyaAW4n{BJQ<$LruT z_OI#nLFdr*aqR)(2tX~lvdR1O=8@4*t|&PWe9O9*PNG}2Keo9%RDc+m=uY)l1pKLT z*R!u+I9!|3!(CemHzV)RoU3?SfH(TPUMSqU-))bZdBt14+@{InenB7L2uNvDT)&-Q_LU+eC5sFHqz8-HC+?M#*R~IM?;xk$=_oECAh8*Q zZ{XyMCB?eV8V3Jv_0|M~#K%1){q5k3rYVoi=G&0*{M?;jvyYd9`jWpaKZl~BEY2*a zCAMd4Vcr#db1ZZoXKe#v+&%)mf;bia-Egj1BO4p1z^4hLAM56m28FMZ@@kOtduR83 zU#P{E8b&rOPb%NXqgs8+@zOHheIQHVTjv8nIbt&~Pc_HF?_>xLCT#^l0=)h$6 z_nWzd)3G-@T)IqrCGBFgum1_w(M)P7N%K#a)s6F;Ws!U0r&_otvT@(-2c&UYJX+Fi zpQk;G6iG^D!A<&N21vRtKVw!v(2tJ<_96ftK#oVGgXZlw-TXcpx5_Ka?#fYJWLGYA z^U8gLiLkQ(TK;c8)A#p%zeqAK=w~vIbx&QmtR)Efeoiwe#e%~=-kfP9>Ok_3-uoTJ z@KrE!@&TeJ+K0zc7z;E#d-sO7p zlwLMSv7z%Y{)Pem6iQ$Ql5n^QbUP{%&;w!4ai(Cv1G82Fzahn*G3$NS#jt9OK}(V* znF$=trxD1|0&>n2#+lu4{FI#&cZ)zQ>0H)`08-P)9*GuqDR#t*AmN62C(N`IIr?u} z3W_XU^8@vC@1Ct4$SLBu@z^9m5)^Sq2aNrJ_N@2yTMjEP$t7lp!yc~5WnKvSWJ<9^ zFA5-h9PR|@(G<9GV7W+?;NHAbrO3&Enzgmon07$az&~REEgcAPcqTQIa8-UUXa2xt z6GslSBZHq1Hh}l1hV1Zv!r=0IBw@8x(?dF-#66GRSmf=lWCv|~%eDPtnUv^$W~q%& z{sU^`_I|KfTM-!dzyr(JWODTFONm-Q#CL)X+Ex*ByYFucDfYB<{V6ki68|VS{lUg? zfb2|q*z8kpi)y;Ync$iRn$<-#%%3as%FOM@1LK>^cBD+VcfNsm4neYuqS=F0Y}Qls zXb+e4JH7>N&efzw{84)N`O2IAM-f(>no=Bx1i&ob%;w2l$p|o@T1m(HqWRpd8$MQK z(*fcXJN4L$bBdXc=d(<@yiVN1!uoej6rs*dz~E zp;hwqss>LnnWjIDqHyq4XVQqB$?pvIX6VurN<*1@vg;-{*x06S;y&N|ewuT; zRRgc|FJvy%WXE*DBtoe%nxiCgoJAu}t-=1eE9chDUco4(gw*u6BBE|4?Um?eM!Lw5 z&xcRc4+y0wtK)ILqYW{qFT;z3Yt+_+-1yZv>6~>&FpWEgbeeNe+jRR}zl? z;(A_zWkmW+f4nStSz7#6-9-Pr7wO)vigzK7dXb>5kfoC`NPbTe(gb5e_f4M-H`E7G zHQAD`W$T-N{O7rpDGM_($uILTbKUEq*_7AKxZ9j_z8%`nc5_#0Oe3^o-)BC?=uYZ? z$d?>Q&Oh<>ed)&^oFE$)8M${vws!{u4!B*=cRoez@x!wCGYLbA&_6$x)h)wbTYtIW zaQc*Lep@VW?nPdKYJ=1d0}kqUE6!D{*4-KOKO3|DiQHOq7Gjbxy3+4zn*E&b+{$=M ze1rNDa2&lVKu%uK)aWB5i*;wvaiBoeoO2Y#|pa7YV&e2*{-Qo$v0tH{v$0YnC1 z3%Dl=Sz}pnm8Zu+k95IdXksI0i{$w>+JHlcl^i_cL%t(*!L@wrwZW*f^Q^c?L$QO7 z5x4~ujm2jWx7~FQ#M|EpEKA@vGT!>!Zl%F9< z?*R!8nb_WiQy?$$sq2(X4FCS)jX*jj$U|4cL?Zzpu8z=Dr=A6{Xk>-JDGw`Ffp0wy z=h+TOVCkeW$$o|vKz!UsxSyi&TO*n$2`EJjG!+M5ImP-;VfW<~wq7%)?%RhRV~8E@gXEsL zrxV0obIKQ^mT4^sG_tfG`x0SbnHlS z#&^>MLb?Qe+4N=5w~acuwcj$=$Vlp&w!v@n$+jfq|NChYhmmA%Nk4rp7QmVl+Q*ov z+mLY#97M?-ShqN-&4fGy&~QBilW3g22Z9`3^%mTQ$sMTiyb<&5p3*Hz7FC_U2cL}2 zx6L+e;$v5nCbsPR>)e2P?3S&>-iOQ=@zH4KIiv#t{fYcqoqBCV>!ev74!fpG|NA{y|Fv0H#pK5rYL)A z^2-uG`E5_xM58GJjKbNj2*q&4HJQJDn>ZJS*6H2l)wh~e{#*P}lfGp~q))iH-Z-!z z66)T#WH5E^YI|~M-F_g&a5CV=(3la_77Q(N&b&iklgL-CWsQ+z z7YC%BOMrVRvYLIYM{xZ84;6VSKwbbPMp9W^0@mWn+Ms`)9Xhocr!lKOjo@avGLmP! z{!~w$X&`S%yY*MioclWuM4fKb$ul3!%Wt6zb9WRohhIM4yAZ!?6;jN$hRtqIss2FX5?7ozF58YLb{i99jv~vm1Ma@Oin`scpOAo`EX&^cdv3w8V z8qNb2mfoXh{MgPS(HF{cr`rMl*%8;t4{HEZ(s|&Km|`gAuCYWc&BR|v^&vxU14zP} z)GAq2CBW!v*nVIf8)cY{`Hl3vKLS||@*L4^$B@NT&uXC=7rM>yIC$T-B<%?n%u5B` zGC~>+vy&4jG3}{fAi{Hi86s!w(S>C#Gjp8yw{5nGZ79INqKG$^ToRh+!c84+z+-4(7M!t8}}){monu(>ULHoa?8jmF; zFy?V^MsQw+()UxJ3X>epF7jvm6kt2osvPQ9_l=opZENwQD3a#vLAYM+E-?c|_J2bi z8C7uTd-6Sir~V=I|Dm~-IM4}o=cS?%-Ax8sCq~~uD&)%|l!1tnDbKZ;CXXJbf#7rV zzJ`NEMG5?%p=8{1lP>*e&ue0g(c++#lWSw2tTez*U^avWaf2eRF+I%Hx|grN`gjvo+j};@gneXi;%Vx5&{0b)*#H(Zh*sWI^ans*uRZh)y&6*M7|>Rj7yWa_1RS?X7gDo` zfAMbjah8=DK7F$0?MD(t6e*_H%=Y)&9YGgsWy8ZV&|ArY9DSc0rOUDyLz<0m&QS5q z&^P=^Teu074**76B{%Zr?b%HCWew00fQJlew{s+>bj^P0V^t?K9r}#K6@7))=(I^vwJf4gCDMV$`^v&ju!wZv z<%cF>lVTL|*XNPnosz3(auh{nLNP5T+zpq_AEQ4(-u4uqUg|O_sa)o%b|^58;JK_4 zhlx?($yD-)*Zt;lm_a?P5@~*eIqW+XDYA86Nv$ytar&C$edI0QJ(YLrVs&=53o-xJ zoqQ^g5W9$kXnyP=zxdDlezW+Yr&l$(s03Hr%+fRzYi$In&^Z(GES)hw7%qc$Zhjne0-V>{+)+>l_Isb2p%K{ z+131A6Fn31H4bkP2&%XIT6+g;`nI`7x<*ARH^z6TCij0lon=(i-S_rE5Tr{%x=TvB zTa@mQZfTHihE}=-BnIg&>6Y#;8M;9_2N>r2%>DbX^}Lz2=H;w4=bXK-y|2$z=kXS> zA!WP^jvqjXpAvA;5;fd(CkA)|G>b@i;hZ>=%skHit1g`oiu8Uzt?n~ON7Uf;EskMS zBw$E6Bz@~f9ReubkfN{6I~VTc!K#jRTaCI##5h3?ZPiYumxkRpSkS3%00g&-0`%5= zan_*^E`N#I5#Z@Ce>xXXe&$MG>o!o4>w{wglyhxJHgC`$39b0uMc|!oG*6M71+ChO zZ3?1DZE>!9z9`@DFjY&r7T$dv*(SJhykwX_q2=cjZdKIgu|(h$3r!^~&v z*ah-((=`TY=S195^dSMa_x4I{&QSn~cdkSObG+qD-!9%H6mZ)F5Pq9t2mw$Z@S$5(qCH6+IffQ7{K#K1!G}o#eXD{KxcEe=Vy*6z! zs+y+~dkc zPIYwWDIW*Pqhkh^$QM|NvBPvY3f14Si+_U;KB1tB>IkW$`3M58m%;Gw;#umkU&P;r z*Dhz`OYLl68&!yUl2nh&cwU_BTR)$O9VQVl^YRYkQc%}--85Ou>L^yUCk?gZt5@s# zwQ!&&@I+vi-6#*eLShQmw6CnSun~(*)4Njq-gK4pXKK;`ZShhIOQ3?tEX={f!C5P} zI5DrPsAy!EY?ClK5sbdXsl_dv*vP6$RZS#H@_GG}Zp?^UL0lm{%Gc3iT(OFu*G4Uh zxVhEnkr;I+U-CbbBGcq+JD2g*2z>Fj+FW$FuFH~zz-a&pYvE61hxfyu z3$;^%fWMRdr|u;6F<_VQwa*UpZ-8O1=n#HsgN-`lAlKQb4%=_si>VqKDESx}&f&P1 zTsVMyCvkMq;xB<-CjCiOwN1&2$ZSkF8#ON+d6*F*_uRUseMl`VJ zXXU*|lWDK0*T!OaaYkEUTeKXj{b0X9{L{qGaN%{~4}7}=q6D%!Ma(7Xbj9h&!KV-C zGm9?uN|X+w=p%Nrq~2xgQNSlMfEsk(eklipfyzu?>GDbODA$g1U~`wdqKh;y`CWQj zdzV@EN-Pj*ucn20@HGAvkrdMnQ`+NpS$>Ds*zCegRPASM^I^kj^tzF|Nj}F1B{=|9 zsYV+rF) zozBL-6^R{SEC#UG7?=Et0YF}ScPc>&B#vtC)l|xTg^&;Vp@><9&?WG8%QS)i3HpoOaP`UTFd4;Tst5_#s`lFv(ds z;j*U3N%+Jyus~AeQuF{^sF87d;SwoM{EWyTTH0^1&$0gqA zLf%m?eqs!AT23H}WkAvRoNN^glXYBEyr5CqV;(4AhkD|N1=8>15 z+2-XN_G#x}%6Sg#G;c_u;0BQ5eD`U@y+)z~O4TF!igs&SGpP0FaE=phq;BERB(2pU z)_TyJ%xcBJ$C1h;uT45K6xzXeqWFy(hK)`tHea^m?!&?uUnMwgrs=>vz+|0Bqh_Ic zvS`Eu=A4D=-1wNfYz`>?uiwnS*wHoH+9ZL+3OuJ?Z0gsm{a{1Sv4mkMgfSGfFv1y6 z5K+Jk*}Jv8kvkhT3bWxifti&TU&`WIXfBSz#-QlOI7w2OA9Ie@)JR~0mS_aJoH{Py z+f0qijHI4T{99mORd5#QBbhV^jdUmP1p6L;Dns8UPS&-S8VcHY<=Uq8B1GO%f{)N|ov zT{Ur!NPh_==+2l#SX`__R?vn8n*Oz$ESpqrEF9M`JO!Hlaf+gt78pGfJqcGneGH9) zS3M^nOthQ*fH)#{(c471OJ6bJ6Rdm9br9%X{V+rdAiz|)P@60pgTkK-sxTsVB1&es z8Vn4zsaJ#b9hmXc9#C@T$yJADQ}a=N8zJY|d6T}+(e!xPz8&z}8}w$cJPkeFms2z3 zf$+7cdq}uJ>eXwe^W`&x9IvSC0p}$?K!hek$wJqj>%b`e*#-1&?dE_-!K4(g45472 z3F`TWdaL=M%vo67CnO1ZDF2RCMtb^j7M`Qwf%8|}G`TB!gE_Z}tIVNLiFBDyIM_!f z&lPZg*tG~1L9Ey>`9R=4A)eS^&kl%>BTRc#D_M$!FIH9NWVI@vIj~OMHI~CP4*ag^?7l zb->ylQuA_Y2=tnSHG*0~gk+yl=U<}*NZvnMtMJpT-LVzB;uh+^Y`{|D%Z6U*;y*;* zs9|g)S@SmT%cVU)>bYWxj;wkNNU|-pp^DRYZ845>UfOiY_R3aBQn6=t9lW)dx`Mx< zp;q5i-W{3sQ(BAd_XD00#dK_5l3b-`4; zEF1O4ZYqZb>{+E^*;xH({z-4>uEQ8?2`#uItylaqVQ#J)J^v_{SkaX0HFqh3@LtQU zedNXLs}kp^$N#-EAJPPW3q+q)-t#1j+4gx&r_qm>vZXLuiDp2(z@PLAgJw4Q?Y+p z?@~i~Z3X@!d03{VVTo;TI16S>>IBw0i7aO-b!o_pXnB4286#rJslTC34R?@Bo}>b2 zaF*={ZUc2aKuIo$s{8V0DxRwBLHTvU`6k1|diaanVNbRO-$eN?dSy$%s4786?3cag z%T)X{*1GmV?|#jxOJh1|!{qh(nk8c;8Sy7MH6!$@mE;8}g%&PW64W(WLS>h$ybs^T zRF%MnSrs!)JXL#Y`ITeyDGzKs<~eS9<55>1(~n$UUP`;ILQID_hh>Hi)ndA0R)?#N znk@;!8)Fp15+segk7G!FR2ynb@;A4q?BLqt?yO7~j8)Foy8!7RT&WjDs-B@Ez`78~_g7mRk2eFzGHq^ajt5?k-wJSlmWvmw z#^-)jp|%x^zO;3RB5dr0ex9P?z%HvN9~Zr(&2^AC51(SxH!|v*{8`=O zHCdUQhJ}xotq!XU>Fa{oCIkUKkl|BDEPYfR89?B900Sq= zCdaadD@_8Y*LdF^x*2UHM8aW<2(iB?zu){y0wSNLa9I)g)GvA6_8K=BaU1-RPfNH& zqzkJ>b+ts3Woe$r6WP_6dp+92yq{9?xEdPSGitRzC-o?^MX-4DNM&OZ-sf><@HifqKlZ!zZ`p*Y^eL0G<*h1!)bh|#mUHM-KE9NUmFFt}R z?wrsM)!p1^FJ=xDAttrIHS!vn%nR+t#Y)G#wBUSyl)T2y3uv2;vG+mBcRmXJ`x0vzlh-kSFoOj_ z!+f=?`!yIu&4MkWd#9nUjH^vX`8JHmBx)3@LE%HhJx-0tURIR0$CRIbyKCF(U{3ai z7p}pA8ldiQC)Kc9u4QJ=p}Z{uM0M&m@WgJge z)#U;CbvN$yhTD_`@(yQB{)^JpSY(C&gh-&Tso$vFK|{B( z%({9D7NS7vc&9%77r+c~B3abW&7#4Itf1!gaXW1c(|-G}f8%xTW`s7D?(x_WB&Fw$ zB+OTVGehFsLGB;qDb2v!#U+2quK$BKFySOT5r&AI_F5_N5}{@SvrN?|t70AHjRb)e z^fhsxwnG(k4Xi_2DGw~q{re1O zABWa_W>;944c88!PLrO8dNM)Y%}XYaDK|`l{Dwtk`=#xYjfWU#Dx5J4;&cpJDWc*N zXF)QZ$wN4wYI_%;Fq*oK#~x{Xl0mb-L{I?W5!TAYNe6}YbW;cZ6ANBX zEXzbq-WXNUkU9qw!*s`+6ZMufGOr?Ky<|T5%&=0ZK`H#@pmj7t zr|m-V-9b!Gbe@IqdsQnyVDoF|fhbRMB%heolT&ayF4jm9L!964Ce3CVy&_5zR7Hxz zbqtM!%(3^%QQXA{XH5YZAwIIOA9G<|l!Y>yA z&a4Y#Au?mUOoX3xH!A-##rLJ@ckD1 zM^}+5ciMhr)J|c>=l;eyAuhi8{+Dj7Gl#1NYh_EXeE{2Mwo9<%nBo9U{4?opzhv;x zOMvA+W7iLNGvVletP^Tt2GUhL>ptjg$HE+PZH88n63qUpPO;FMO))ig`?_mt2$Y1Vd_Tu(X1X4s=SypQu0ySDCkC>KIIQ z|8dI@_4{pGvszdEF=Vu0z*KfXs;w@EH=pToU;S8iHrEZ-;TTgzk`b?&g2g^7LCttRnS*5a5|3yt+{6$z>t~)bEhI~Jsa3zo*gUNftil|i}%Aq zOaTExS96*j&;$^%&W{w+z$UQ@DlxN%=*Gs}rjUst}#?4EUK^kZnnN&*zTHl&h+b&X~)1K>=ofF%Ct+cda z#f#?4!1|;?k36hH5Hx$%3lF98hS4-*^1bZ;ahx+d@3|NgQv2NXPr+3VRrUaxrhOIO zeQdLb+&HGrmXkQIf!eyc%9Mu_yY-#{5+480Fsti%s!L|NNy&hn&a&D-JsH^8^OJQNW|s>?#L5 zSsMv~@SJtqWn!+`JRbH>r`>DBUyB^JSFX{m)A108QtY;PfKcA30B_K>FKko| zh7(J$5`C1jJ^gce4dlQik?uOsyv?bW&1GR2gL2!sKzLy0RL~6}%Wlxk$J-NMR>;!* z`Ah4nZMts0WT&|)jF{Bz+D}{>d&dEU-Xi%Rew)=1S8~_L*sI`d6eR6zth#t^SadD= z_xE$aw%8Qy3f4-%lP|s#t>8~FrcCafy^bS6PYr7m$D$GI?Z4Jed+o7IL49a%y6?a+ z%7ATp>cId+;0q4?Q&s`Yk{q}l2By9VkY-t#BnU7rCtKsxHhShOf@gK*CPqdFY^AFCK-nlChMj7+` z&Ta`B0oQWU*By=6(y~?zW^*zB@@}tX_==CayISKzZQg%rKeMUwe&3pQ1n)_1Xrf8H zqfEGAcX=W8nx!N>Xy}4$pWQ=pk4G_VKD9CD4(B7O%MAFh`wFdQ@l5{5R?i8Bwkf5G zk2`ggU4rRH1evkJ)~~XFyPWOtz{r1cc!)Op1XX5tLku_<63PbBvkrhYbdf;B*8?MG zc-G~~&6B`mpJY*uLY6$xO$_^;p!qc)I2;zE+A>X9Yyf+p(U)Z|W!@ zCBe5V1>Io&7r{sGmcUaV#$Q|TP!yZR0}eBm@R-=&u^@%mmvP~23;WmfaJJ=ddgUV} zl=}cG7e6orE|M$^q#9dM%#>`E07{0THGk|aDy}B(N_GX?a~?{DfT&qJ<$XBKrKAam zMZJY+TJ*}A$#WyMuAq3(vU%E881ES3y4Dc-dLa$4OrZfvGiVYc!S$DwUQSr%!9 z1hc(fcR?jSUI*!};sQsb`jB>%sW%jMG;&{_GtjVF?aQVqHioBBG8W?t&G%^#7nYmt z+i9fsq7NQmge?wmV)G7`Z z(C2@mSk~pLv|wwP4(@#_eY{8Y5&78Yz5i88YxbME6sDxfi`a0KFW*dcx1E8SvR^zj zw2oKDBNX^`PpDlmEmI9W)cWyN;?gu3k}XpTpojLFP=;k!8^-JGD}@Nw zrr4oouqnzo=wzA63vUk6%5sjEOW=K^pPOUG@T! z&r!fzFtpLM&f8C^10|rwLbN>A!C>rd;4u@!sf!Exg?HR1LSJS@-iNltb%qUTT-Cd_ zPF{bRz3|a9!=FkwHGdN3Dre3Oa=Uc>M~(l@&8l)WbUGMackWLI=y~sWpQj{mKdH}x z%cXwYmvlblT)b+-e->4NrM7A&2TXqwiEh#|y=C?IA?=)mtF}y@!#2X3dx%F)IpR@6 zf<>8qUvxb6Z>W75OWcq$1^HB@mY6glNOD{a42BLpZ-UPFj{MoTyD2cOM63vnMvr5G zfd77?`yiqOPhfx}ASeGl=D>dyIUW{pw?MSO4GcN?YSfW_HhFq-LuWEWhjCqN5b2Bf zwRb|)TYkSGQtzvKC&g_gR1}rW^}E5~|p~hboD~6TIy* z0?hbmk~P)uu!nh#l1Q-AoiLoXM>>x6%FaFIGh`GhFroD)u_T{9j;)rNXHvLXdm{in zZ;_M3C|M^tZ~_}LA?WhFsYbU+(cVFK{eq&@49}i#zMvO2nL6AIR7ibR4WREa@j)GC zgv!%bnPC=bAuYXPkEtsyo1X<8(->=@2#x&lUD7NWnS;xm&uCY7T_BsQ6lxlx=_2kj znv*hy?@1x;%T#741WaG1o7it~qqng%sW8f_y>W75&bj>tkE`c(utnHeHTT+VF zk&aIkH5uMycTG$Zp6(%)e>FQ8MDoPRZ8~*t`X_PWp&S?Dg2qq1j7!BiP5=Aavy4+| z_JC>78MSdAeuUD~FKK%2^)v9wQ{iPAvJFAy5-o`C7v#9`+Q9&WI-qa3qUY~s2RaTm z+gA4jXD`XH1Qzv6VD>^Sz^_Oa=1$}Gm~Bc{O0^9#BG~`kk{l0AW)+HOP@>zZtOoTZ zIZt@5UEn!En;+{u36Fmvl9DvBWDP9XQYTeTcPFwLPzIn8PVXP>zg?g|yi9MM=0M3} zN?L=cK^BWiv>|58@($qBcOJoctQTD#CnHh75H$Buw`YWI`CA+xuVL zm(-g?-H%&DfXNXrf)IW!?Z<_kb1CVnM459*%?!_>5%YtRWFyQ!2Lq&~eFq}>_f);V zT6!+E>BRPTTLRn`-~L-}FuVNxjocNW6V2jXzU{RQ!_Lzi zdpsp!Cpf34E9|^}&gT(=W36)w>2JVWxM21`|CZq|SRCN&liJLDv6h~3naW)F%bYs? zNo7Ab`|M%^Q;1rar1L|-*Pq*M@)uii>`D@E$OI1f!iYUv^D!k>yN|2(5my;PcF)-_ zn*Qk=PNBHj{pc|CW@yN2(uw`KHki27X=yv^F%4-FdeG!?mnCx}&w2BeY!!_c&>PSS zgmqnrhaK;Ge*=B5mx?CinulpydXL0lu683(6 z^j}S=cTBSy2n)`$yAh70+M2H7p7^MN_Opv{-0ywC-dApN`urWUp?kQC6UjOkT(Q=* zXJkEfMF3e|&N_lGM9^<;_P41iYlvZ*9A8|_q7GS&sNMcRSP-t_aihd${0A<1wapMh zOqI>`2GbOSSr+LZU9 zlH$Ja&rslj$@!T*oq{;D-T$tzsdLGq^|!XMK|8@$?*sY^j$mE##K(g|JmVvS+0-in z&EK;n29CoaI()%{E~QnF-}Ff*y2nx)ey%QpamyDVGvGtTk1zEw#jcvC;~S=R>IWu0 ze+<4nWEooF!yox!+3a7}eEo-@<}imxz-{fK0XTt9A-%~DTf9!YoE5}7bWQ+HAg)J- zUaslR4$@gmv)jfR0rtpbbjDU9qK3H|n8Jw*&Ei?nerbTG9xULw^xZ;$d?)`mgp z2i|qUU^4`BhCQhxoUF9vCLofhmGaZ;5j`~EZ{OU5$~3v{51^m*gK=+ z*~2&L^6!{+1>JG%A=2dM4#yB6X4#C-jY=Wc9<=O~(%~Pt=GkxSwpD zBl6_Zh*e#)=4I*-dD6_-oGxp->FNt^r_#H?_cX66zffT~B<(voh0=>yhL5bbbQUZ_ zpsHv7jSus&O5(sl{d*uf6r^r6*|lw21^t$|E*qr#(M~UXSzP)ZoP*@J?CEuRzJTJ= zvNERfVc@GbQdDMz!y@Q)gV;Rs4~ry6p-P{;oKX#NzQ`Ewh~{MZ+BIa>eygQ0Al#FS z$KgdE(urv;#~MKv_9ZZpPmJf&WK;i`QTtbqip+w6H{#VS0D6DSwl_>5)@^&=0 zWyRe^-??;$m4^$Yg=fuuzaFC;=NXr02fWdvYZqa{HBxPsPrLqFKi|av+aQmFr@6^u z0Dl<9?`!bmWk>l(1tydY6t)#Tg z4K41-M*1y{ziGhxSbH1z+A-7t-@`&6khhVn2@FQgDQyP32WADtxNC{vIl+{$d!t{B zBF$ydt^RRMQjOIh6AVEde?u7PLJ}%1cAx9L6y7jrzhRl^1hQ;*A&-$G%^@7rxB0pb zPCOgY{b2gnRAJTxRuS0O#9QO^Py5GH0>^Y&_o(UYKBOmIU}ntPbj1gGWU1TV!uaoG zprOx3{`0KX7N;IkYmVqj==TmU;gL9bXT6+#izub5sFzsjHx3Ore_4(cZGXugS8=UC z`#S#Vnvttw1&uo9@8$BW(Z?6QVBVrN!P7FQ zVzszW;PiQx_HXXM5}i!z`=5jDVeQ-e>8!*16TLdyDR?s<*K$`jSKf(a5F z7Qw){9W-sUB3f!o2SBhe+&_>hI_y7szI!h`S#ktWaQe3oGo97H206zREQXB&zMVYr z$35=Sa~X6idB`fhX^k)LbAdko2gy-OVG+(=E>n$L7AT z;;YQ$O=tWk9(U*kSY%IX^F}vl?C&w~|%oTO^_&V|F&aAvcQ| zk2kCcyJ6}__)`z{`Zs)k zg+B!uqB~+)lkmPaT2e=bBqbV_qLAT=H8~|Bc8@HX)=8`fe5F|BXl5_K6QU|bH{k#u z2erpl9*y&tL_y<)P+k^Bc+}Uq(H=>#orsXki$ zw(DZoeI0OWb11D2OMAB_6teQ;o#d$#)s6oAF%i`l(S4$#Lq++{zmZSUc{raH!SkjV z0z-9uF>E@iUqGEvi0YX*ffBxPpAN@1ffj*l43k`d(~UQ9?UuXygmlTQ-C(K?hpgta z>QlFRZ6$H#5kp2Y%$&*2#xb?}f5;rQ8wwR@PC}IxWijx0uacCFh;_Ty$2-APo)@1* z-)HW&_h{jo`Gu0uc49wQtANaB=~T`P>|9A@Wj~TdIUSppJK`gzwV1dkA%ji2Lwh98 zw6_h6Qy};Tya2lUDQNG%s=b?pV7ui**e7oI##O27MJ%wl`+qY1|1a$&1!0--K;s1Z z7dQQA;fMV1I0=^I-cb+si0si#zt^u zFMDuWo4qGtgmTvZtr>%!wGm5K=?;-zw3?f0<1gg|^biXcj^{9?7feyQC$D=>KwJF1 z`C&+zEPQ@R!UV_`HrRJ0tS%e^o9?X=3GGu{=kPBo=d4GkYX|$=;fGd-w7c0?xccYr zQ;TnPUPls{r?^X)31Rh&sKmuE2{xyPisQgs{qX|e-Iw4`ql(*LdT`%?xQYC7=+tS+ zdU`E+F5nIOy*z)2CxD#Kim@02^={`Sjf~jMXE~U=rsM}oMnGH39xMoZ{}0Ib>`;ar z|EC9dhcLiw#?UIZhKArImk3P)X~pjkfFBl+zH<)qAqD1gr7muSGxGdF5?);_Yq!Kx zY=qGDCv)g6veE-o_orK{&Hb-iAML17KbQz%BYsp zA8mNqN79@Jf`8795{Iwk(e&d)Rx(h0&Xv8;iP-&^ZRpry0Sm_$XQdwqZ;(;)q*{=A zi!Z|+p}RIPvMcK0zFbA#Fjq}$i2SbSdrfQCJb4yI#;Z1-mJ}@wMJtryUmr)qk&i28 z%lVl%#B}dr@-I`ou=v=}v9-z)$^N&xTNCS!%>bpKbrK+|2^VF%+cI>4R+9?@zbDDpwrtUE2@)wZlS)!b4RlZfO-e$X%xGyn{jFKr` zie%uj9R2iTZF_NVM0#I8u(lC^+YNOATstn{ro+33$%4ZC8d=AXnospQL!y63xGET< zjMl9?)6rAmhP_0=-!(6OJ$gv;wooJJ|x4ybt z8z<9YhZp?zy?M?JX^`S<2V;Q-nB^X))Cey^K$Kb}qFL!c3tr6W)9c?oiAHdb>T-5SYNJZ0I?vO7}S);Oka>J3I&&Qp@N}LQSWJ z|2y|Pb^YD9V_%ixl#c#;<`Ips!d(=g*cXKu-rDpH1Fq;p*2{8+6!YeO^nDCtv9^0yDQ@6i~} z*I;nJ@$;XQ3QRXpX%0JqQ-NY<(A~&2pxC=JfKy({g0TS}ESy2h5+uyzb) z^@KkDbV%4`M(|Cpfn(@>%LuA|V6d+s@9v**lF_Ex7{dbfteX?c^m2;-s=(>sz<>UIsa39=r47 z1o8B|Rrync&fz6m%J+irEk3l}s$-);T77e|mP-zIeI6|e%bQ3Id=RaS_u~w9-;}Oc z^ZQe!RkoCfFs^0{N|x@+!8^HWkME0{gke8DhE=i9ON)eAO))0ywe5Y`x~7Ax5eZ&4 z;W&B1;}kxuU|djt24~!70=t#{dcwU?8Xc`BSeAX<6b8T|q}Qb36c~@jgpGz-wT@W) z4pKaYI7~rp{B{#-UQiBJ>{Ko&!n{xJA~o1HFaexT>v?xgQW7fmf6ZtkQLFM(QkrsO zyuNEks_3Mb{k_}_3Li<7u}K4&WQnH+cN)OH_}hyOgc8U7V$J-OPyZssp97}+nA%%e zr!iLh8TOHnRs1qx=q=FwygGDoy>X9znFJhw9II>@k_l>g+rNHac}Uj2cNYo{W462( zP-%`)e=-qZK6`EVGHKXLwX^%>klH}l(G`3at+SJVlAfr=U!3(6mE*K??V+JVlk^zk z6tq>ZViMu(U?a@pa8)ig`HY5FrDklume|=0xiP#sX~Ur0?~Sy(f01rC_Y$H2#jJ}! zR!T$s^LK47uR;5u2sQXIFAKt(l6?uR$MeGfA#mM@+5^hh)4hv`b@@-ALr8XNFcLUo zrEW58P`J%;z_Q&{lmM!?+$R}&_4?=zP!!@b8r7Ly-OxCDzIvL?scD&-nE`T^k4b1# zpl1Q2c>@Q4-YDgX0(G+1Fv&tQ)ClnL8R;*G+TnARRs|A_UHejgc889kO=ymk#N7== zeKxYXx^8t@NL6W3vI>=-PL@k{jI6=!{-GR^tGw^&+IRdo4G-m*M#P-i3jt!GQ0;P3LCXfJiHHVur*m^y*vWEvaEbH2WVIdytIq9T` zFfXe)50bV^H2&S>Grd>9(c$q6^dA9)pDtFM5D}{}3x=$48~>SddH7cJOx50igNrC?Ih!?Y5$50hw}; zMI+z93Ei$j18nu*plTa52DpkU2EJt}OusJJ=_a(Q%%mRtEU(jc9ZU$;O?Ofc zG!i9_V*jJAh5c&R5k}m+#ifBxZvD#Wh5Ull2y)LxOlZ{F%!$ZCX};9^v5!UT0_nsV zn{i~;drzBr8RjC23l^NuhlW8y;ZaGjV~(iQ`a0Vl7h;P6MN+b)OC`I4Llr|n{=IVi zfHarpE^;fM@*)aSLz?z}%+!*?knG6v$h!&0pPzY#^F{@>PAgs# z^fXhAdfWIuGxR^#_P5)PYtj=;omLO)tp1J8<8&;08U7Tad|3S_B2+a`W3~_z{zfxE zBj^nU`nV%+7}s@)y0YLNyhowo0}_=)Je)nG1c z`;xFe$?tgZO#r$3`Cm8LK5x^9^YbAzxAq%Y7o~$gvu_~b%II53&YfA#kEVMHu4;pt z`dsIHJyZUsH~!QPP;dWavBE7U4xLGe|9V<(PqkVlQ9{Fl-w#T!HbR`%xMwI;eZlpn zWFdRU__7yOQvbJ2Aq+LO6C3cCDXi<|8^NQNQL)_MZya?+UQ%vivsm)opBix6-#WoZ zK{xc!fzy#|)8{vc{r9m@5Xou4;Z}qmAADoSbr2M;l6#4e-7OPZxN*ktRWHb zS7~1Oe|kKqiZD)N32STeme^3gU2NboAys3XSLr6_Y6P`tZo4LTclXJ}9f@a!8gF3F ze=hKwipvy1_d8$S0S2XwKU$}2%TL)gvDXh|N+oGlEzD>9()*xx2zY)QQG?a=n2%m>o5e>1z_l21+ zn@Jslh8N!^LnW?qf`YcJba_-^Z^}b-&vFj{>1!Yqk$b{uMs%Zm4N%(J2exCR1mFdJ z8%X}%PU!JXT%<-j_mWznfBJWA&z4uV$>db=gjON@vb^CN|KXY|u3xkm6hkg419`5D zRNwupT;B~++s%|-NVVKNu<%I7W4y2o#Hr8WBsI~vm>;tEV-@80R*;yE@x|3G`O%WvXa zyoon~h=Z17%!}a=m!^d@Q4Bw~tY-du6{?fM+d3UXU2k( z%k^~rm9P35rTO%bN+1k#y>8Sf5~*s=hiiF z!6vY=cTzfh8cws@aXR+CYCN_19TD|GH2ogLsx|}@!*CBk6^K9N5Yz8YwB490ED$y*q&nJ{-t%{wS;mwcIPZBOkU>MXAC=uZ^Wz4mh>a5>6@8@)E?etVo%j8V$pua zwP;9~`XhQj=C&<>o=`D2UeBC~5cT2iuvO|O(@ijZ15~&SjRJKzLM3-^HDZ8!*K9;S z;^6=F*?>d4*#C}fHwaN^ObNjfHlF%E2G^~%WpvUBi`EGOIB+j$GfCS@*HdTEdfaPETzL^Io8d=aK%a2^~+U9$<54`cwxN~ z{dfC0`|4qCSGsgZ<-`4ClD|e2?(tjhQ)K>5onG-i?O6#vt@{A3H;FYDCtiHV)p8}7 zOL>{rw{Ro0g_n*S_xJ87MW#(V{Ylv`zw%2c79m!n(z6E-0XF7N^`nK?t_Vh6ZK5(Gopry8g29}m!|a5k!&Bf}pbBgY6hjl3AXF%8 zrdGl~mf{||XPsBPqBWF2fAJn5cO2W@TtYIg;qyKRDlu9$URcT0pppT+Er;)H$u$sR z?oS(8&+ps|w`@9}jg&RSknQ3Q5B^xwP6Dp}#^doS%?#BqpA#{sgXWQD!%zFsWuqU% zy>O)95?9*c>A&tG;zacnSy`?3yqUu_-Vgk281ViV(}nk`Ss)Dkl1Ycu%Ew}oK6z{s z#A?Hr#mfORC7~}3-ek}rV>V#kWWZ!eoHGib-IRAC2~LXW=T9A+L(k#gB$d=y@lW1-`WZnqtAdHhBW`!F%S zhf-P0G~}%j#kKI8c;|*khIi>_JFftm+6Ez3=CDRsWs zcCJn;+nWmUlmOfW6wbh}{#FfUITXv)J6rug2?BuWtqQt8hZ7wZPKd z`fcOw?}863zTzX&)8N%=Ec|K0+lFAI2TEEj!)&CNToj*KktG5mCr|56>_U30kEhc{ z8aQ5Tw!!E9yTaD2`%kehStF(b$O23Cmt5dG-a90~4fViN4cx?MV+srfMO;!J zP~Sp9eYErIq(Cd91gZ^8646Nz0HYD920}wXdIAw*rTxFT8FPO8#ncr>TZM-AObjGT zJJ)y8U;iw%Fdx;U69|CXrlwC%tob|_i_>RjYBP%bafSP*=;9O3B<|S9PLz&;#7ZZ~tf&P|a!&t-5+w3I4#Gudlk>0Q=$6XJ+NvfVA9SGHB-09W(ND?WF|?)qVrr*@bD;4>W;}aUf^u3=waz}YV|zIqtSJ6Y&o}NY((6;_o3Fy+WoT2x)k)rerdikPs>(=N)vXpD zR|>1pSDy9w=(mD$oosli4&p|NGr*<&e_XwFRFq-YJ**%g21qwZH;8mgcT2}ecQ*nf zEz%&}2qGaJ(%s#igLDl!z%chWKF|AG@4LQrtu^bu=kM#>=bXLw*{5LX)vbJgSj5Tw zqEhj4>Pj*n2ZLtWYMH260mf@|4px(xlrps1n8m5hFF(HzY^I*fRXU4^L3=4y+geh@ z%+*bAOvv@Ocu}`%b`(c41g!50&9zy*t@Uk=dqk=z%%(!48me|l3 zZ7T3Z-$i!jUN=FTo3Y+b9`wVSrI33Eg<;}{RJ?h+!f710yjxbUYpz94V>RT0En5{Ay%L zotNEi>6ffF0h;7Oy}x3sjN=y~u_|&-LOQ8rK^+u&cHX;=Tc_~rz~j4JW|{qiL`eCJqY|Km5XDo2t(C8{Lwda_c&+f z<#!w)CRl>}egh3ds_6xdRUpI4UB$D-EZc;z0I%|B!cu>G!J>yaYkZK)6XXQ1v<&P~l!~bOJTpc5WCS{9QJ4uU!Hy?#_p&x{E8_ zR7#78S8rJUG1fbd1k2ZRsN%j{@)naR4`*FcFjpW6+NG`g_QUV^i6k_%l-s zR)0;~oLVDt;3yR63#U@^JeVshleb_qn05 zSk{hW&ISDq*UL|;AtAdGZ`eb`(c3)|bcE_RV;S6+Boag#X;JafzCZ7#JL|u#(u#a4 z;cOpolC*(SMjIbjQ(ct6^(I7{EDd(HDYSkm#Y#Jucrssw#ib9bK+>vng=6?eY8GZKWj8fAG#Q|H&BfCM*5`V^a^bOj4 zHVM>~bVjj()suek_y%FFY|VM7LmwIow#ocXWPF79pl(14V;i0q$_-bozuthNZ(JZ?9&bHSUY=;81lf@M-Y}-d(xYRU#*6JLPb_pCO@p>ts4}G#}W7Cwlwm8Ur zb8#B@ntE@?9{HsJN*oh=j;rjJ1hGHRTZ{u}C4GE_cMi5<*kKI`04nKXkd%SdKs=Xz ziCnsw)jfr%jbSIU!P`Zqy=D6yT!Lh$Z8ge1crK_#;Z*Znd`Ww;g_CrM&kp|g!VlJV zFF5a99GwWnzC?oAsX2R8E#+~s-y>T8ZSTB%5>H{pZAQw(-SkOk)pTn*k9y>LUa*oU zJmcC+S~tJQL>T?WuQQM5KO`}Tunyd|9!hz!WeEb6r9QI7sui$%85tE%XT{pFJsIrv za3|Ji4bfq!mYHPvAdNojGB~|oYD6eUDZ>1;Sm-?^9l6juH~feTo3|ncqA7b*_tgl; zC$l4{4u`zI{ut@cvthV&dfyY=ab&-hHSesWXm|76Q?^SKIqoHU9nr1l7!)UqVh;ak zYvTBq=!;ABwMJU`x?eo@ z@02fFe^iecbEp`2q`lPrr(Lj22-_$=IF zzWm`Cp$#ai{WpfDYDyJ6)>z-^T$19%UA~LNNjBk?A2B>+!-H6AUJi87hc^}i*}{KX zD)z0gw(W%p6R$s6pSO1s(LUb-Nd?Zd){gik`1t9ramK59-<1*?eDfvFUr|&0SPM52 zr|ob>I;Po_ZmX$?dn=2p@=K;1_ZU_10TtQrN_Mg91050R%WVsH0PYmWIKW8_?uWFE z0h!`f_e8es^CM{ii@~u~a;&W7Z)(U`znHJuM3Uok9u}yd;BR)tD%4`4xPWZSD>yIdmG2Z;}Zz!o74 z{n{H!Ol+pe|i zP?LvK$C=FPd@GcVuRPX&uYS$VF&sl5HnXavetqJ3+Djr8A}G!%Wz~GFOcyaU_{E$) zB4qNel?Jt7<<-K|O9@o;)D^4(-i@}?pE!QF#iButw>@rih5lI!ia%oW5^ECnLu_BY zm24%;6XsO84_!WZr@_JMAf9(d>bHo9^0w>$WL4M5g6)){fMJAHySgG>S|3F_xy!D=CbmaD$#;8tT4)!SqHA6{V_}5qT9(To}v%A z`({*ccWQmr1-sE_xW*HHha2&z>q9wh))?1E38fR=8xDCwEx#S;Zmv=8ruNG1IqK|ETnT;N zP6X(Pvzh)Vk5qW3{HoA6URHfsK78>zuw!Psx$S9Op*UW>fAZfj`0unI7!qVlvy6T6 z>$@oQY&HjmoDIYSFf3L7qZ|B>ggB%RJohQBvi?8>6S^hBHrJY%v=Tx*M*ENGT>Nk0n7;9nyBK41D z2q?avQZEYO2bT9YWu>a=rOPDLk3d!G8Y znrurj3lKB>RIQOv&au7k%EuS4z{N28y@uE6W4xDN-m|6l)z!R4JV1l{tAK;NxTFTi zoqxtK)*d$vj_zn`M3S_Z-_7(hlnC?Axr5V{)|1G5!oWRL@etFpogCnteQdGo5mf1R zH;QiNK~$D4CU5eQxjzX44<7RIbpM)$iMNufjWJ+(qHXm*&88=2b+)(_0*Ek`H|qX8aJ?Vh6Z3Q#=6%F!6H=F8M!-mvVb@(MtBih7NfpAskdL4m#%e9=}0jfM9@9 z%PtC;BM#mIPsS(pk5nn@TVH?A=HRNML8aSPu}1;SlAk*i{orAQ)FqfEES1UHH^#a; z`YJh)Ml;<~_+$1bRsM4|;@VE}hp&wj)gYT{m7Vm%0a-`N=d(ZH`o!Ccuvhe|u?LC} zbWtWl)7BZIwM){C?=Db_q?vgA0x4hhV#+eQ!KXWHw_ATm^vL2BIlsAo5c1p-O3W5X ziPOUR8jN)=IK|=@WKwU@`l$__6@OvU{I&Wabg-1a^KhNFUN zbd)*LcZHIOQ>G7~{9ta+BEL!|wkLel0nBZN!;;ywR@0xorHkJ(O5l|jsNj_63<>Zu zhOi1=2rCLxnrX)+`ezhkZE!qut+R;~iZrF|LV02mSx)yd9a^_&wr61a^-qw{>QM90 z1KnqjQ#M`lgB_*#6M`El+(_c>jWaBKdLnkQZrGWt>`Qu>MsY1Mo)02_E81YI&vawxn`b7ztQbX80pXggS-Xzy!HMQU}I9giYspzSu)!pJ8VwZ%0 zi4mj2CtTratSquQOt31G;y$q=Vy0=K_1><2;6JCs0S>W%fIS`H&TwyiK15Sd40s84 z_UhleGaMr_23YRq?CQ|@rtR|@q>t6~&3R)?^#^WX*^9KL(B;n#h|5dL%*Wmx9)_5q zN-kHAUY%n>W-`3)z%$CD#?s3P?twL~B?}&eb7w}>JCnwP+YckIq6|H(IRo~*F>jTx zvd05XM5L4ss|!E8WVcl&!>?k2IP1H5HFVJ<6N@A2(Gw#kXe5}C$( zXKGC~3Gq)W(0V8`nNb)5q#Vut1MU~hw6jzqDF zsfsE(cCX4yUwr3yla|VUhug(n-|^ zIMr2}7^d?O-0i)O2&Lk(nhy@jM78h3x;43@-eFl;5p*=`2)LyJ9Cf}YC_LNDMft(~ z6>H*pBP|rqHoq3V$?NT4roKkD>L))!S*9mD>?W97MWfqoXiKq|Z|`;jFgtl2!cmJF zc!ZwVEReAZWm%X7@U-`E_2}2TWY!p#n9shzbwh6&=DyPDP)g?YnDI5|NV|ECa{Wj^ zqW&F*rN<0sHXP?;&Bb{WMM{1g*tTiN){PhJyJj^asSEL1{+8AFq{Zph%(j$fa2tab zgKnFEcbHHr<)uNVu5Y6PEUT9l)$M^Y>Ql0q!fP(6acKvNLXwY_H+jYHp=WR(Iu;2} zkMDRd^CvhyH!=%tt&NWsv-uSN=y#%p@71@w_7m5TBlJL8644q(Ce~`U+Bjf06%NrQ z2Y3nGoXBxx!h5y0K|gOnDk91l11V_O_;HGc(hoP;H;Crmj`6J4i?L$!X`Hp``jfN> zgLBjISW2HVsJvuwgh=We1`nPbFnmr@Z^aNoa-FzTOUoViz3Lf-(*&wBndwy*hc z&Et_4VRVIMF~I--s|E5@2qB|P&GROuajV?dWp^C%AbHt zjb!HL7!6>*u?YcQ0K@!JgR__c9UJD9FHy6Koxx(_6E#1WCVI*rdqhEkvZMv8#u#Tx zyE00V#IUXbpN#eCxK6iT)JFXfm2;At>?YRA2qxE9DSW6C$y=})T-=w_mF-+Ny@n%s zXaOcy&SwuToN(qs1Y9g8qa5nDA6C7q8wL$I?DHDOZ2Q6t`upw?x3kV7O>7OD-JlZ%dhLdQ*%~vcIv=OpGe68ADWNxEd?e5-q6{V?J=?Ixb|TQ)qaIIOSAC#h)ZzL*9fNoW*|-!+PsKlciIhb)`xP zylozqVO+kzIP)YQ#}lH9IGQ8O{<5=wJtbV?d-YX4>E&hC`GTZ-K-~__>eg?6#`&;w z&N%-Hv#BFDS=ia~A+&6%_pb-hxF+u`4?M|&0dygR{T=2xLX}tv&Ar(E$Vm2^M*KjL z5*?)#VcEd#l`(115`m|`^c7;!_tINP@xs{$6#Cmh&#oZnXf&PQMIv@oe3-J^(%nBG zK7bOpL^{1pD=+FOs#OJqg0gIsf zs~ZQ@mb8-s*u8|S^$PRb9lF_k2xnj2K~6lNjzIJwh3jYGpw^`!?l^^SQ7Hum1)-m+-T-(^Qkl17STw(nfm* zU><0lJqHI7VZk%*I!cQ{;sF0nDRDxm z)b}ol;gH!2*{r>!aaqLMCshlh$v)QQ<4PSkk=`X$6l}b@f0I#;{xpDjjLNI~EICG9b; zi7!Cy1YLw)?_1TRgQ+CF{*Z6m!s>?VUf^}{Z--xo6$%L9M*>HP0|ZeF-B)s;Fjye^ zO(I1{FVO8>tDO$T1}SU^EtpDczBbrrKyX_{zSzqBvCG2en=JJg^E3T8%Lq*Qp zA}51Fy)t4PSa-h!Gumub_QE|dIaD}k@^XzQ)v*$9& z@Ggl&Tl;Bq*{!i7187OU13N>-9&g3RKs+p7jxQ102`mY>)Z#+2OF4gi6=`Jt{A|QE zmo8E6OHnq`Km6c_xMd{+{+&^iEnA4V=YK!^Y8(6renhbW8K93GS4ZXmam!^GM*hE; z@uF7S=y$b$lJORhX@E>0Qq z%|+kgICbeNzq408g(8i@y{A*g_5>%Meh6RTIHqjO&6XlnTKU4-$MM4~mj2qU>DO+K zg?jWOmGXIv2`V|lohwlan|Ek@QOP_X;PT?G`Ny{lP8r*iz=56B>a zYdT0>#5Y%;Jh5)@%&w6@s-CtU(5 zGktSDW0-l`EtYtqb`f3`W8XY3+JM=qt!b-J{^uL}FuU!!tKeONe_?P&WkU3CXx-X0 z>MuSY`VIzzC8X`!L?Au|S+LF?y|5xpb#}tXOYD`hfv3*cE2Jg;d`AiAmT;!R_>Ye< z#~8~lsZ%63UqZagR@=6W*nJ~bXBwXvbmxLM?YLMyG(8YL-~c*=et(6bnib7!z(7&H zjH^i`iGe6PAnH-^1&)uzvZ+a%_eh}T1uJox*qgdF>}h^F@H^YouJum9zO8bTAEa8OGNByvrES;Whj+=Q+TQJxA3f3V%x( z<@_F8aoNFU!8e>FBs2Hl{J_=-<@^^NM-6<4RQP|B#RxKqfXzQxKtOy5O9+77B|c}) zTOuC|B+pxu_zse)G0x{37eE9^3|n#!+5@$sVvlu>MPo^lXyvv#Mh30~2-l?Y;_n!a zl6+PV137x7a&PcTzW6*hptJ7l7F)^50wZU9 zrYw&>SN+xzV7|?%;MLR`$Nelp8>et4TBV+CXa2Jb*2uY>Y86$1m+sKF&_A0|Iy+uN zs7_~%pEo)vj~hKVheOGB>PP!@7E`^ok?!jbKkA#yb@f+*sUZXs1|{D59}7L}d;UxX zb2!FOOXO!VdL~d@+esT0m6I;Gdq#&MqW5k0=`yw6Q(oa-30qsyr}e06n|#;7p6tpF z<-*Xc&HAoRUxJZTpf$ode~7=5+`OZe|6_;tOC^h_24Ut;+V!$oX?w=sIe&cN9o01Q zp-(@1n-p+wdFjN=@m5KBczpvI?(^tck_=h((Y3yi57Q?R5@-|YSYb4yKg>z_d2=+S z->fsC*WgJ`Rdn+C>F$7rJNDf_aC**li` zM&0&(85kW$_F!ig1XNr+s#LPc_O$!b)(f54=B59Exqp28hYdj&Y zN;-VQCaTvH&X5hikmMrF;s&M{B-%R5aoUzjJv`0Z*^u!U!ug)0vdyRO#||t{_dA3< z?(I)Z995+#A@4OY-2bTRPZ9a%UGVLJ%NF_nL=u3OU_{OTQ}zG1_Wz$>VD8_)xt4s$ zga8=9U)}}J6K`((+3$ieuD@II5|ACcHf!hv^11SbJxVOeMf!ssMV6d$eTaA%PL+L7 zFlOFNcjK%;0=pOGAsGZd$D~{gjC`W#Ve53HC29?&=ZiP&x3*JO)0etaiJY0j_-4lY z6Q0ovESm?$3WOOTy{Ob3c6Pq7?5sEM%%HhPn63kWC5cFWxqgS9khxS&65z8c9Ajvv z-c?BIAeCVc2PXSq;!kU%ftQ4Kg_65auzoD?c_;ZAChmZeE0Qt#$+*}#gkT)+{hrp~ zU#`)_r_8X%Bn#c;`^RP<0mPkwb6GGYwD*N_a~xxgdj=2^IG%?mNfu#pq2N0R6z~A4 zc(*bm1`yk(rzIos-1=3`lfIht-^Y6w;ciuLe@+0HeK8RlUzRdu96&9(!Do|2D(>)exOCN z%Ueq{GL*)787xdv&iwcE%fh4gUYM8pxCdE>=^=N8v0Obqi!CTfURObBarZ;hU0&q= z(P`HTntn1`4EkWQBL+YK613G~`}QR7_=s@muM1+;wqI)(18Nppxv#9ZPpxBJ>fE;8 z(Ab>&K{t|$c9TTRmk0a|I8ZadGiOfoIlNcQ93^^5kUF7ip2umB5PVl^eZhSqqKM6c zW;j*C4!hMHYs`cHrG-!8!!KGH9aliZ4d_!koV zh@<~$CBBE&&p^yCQ?vE#z?#hAW zasFnzbV@>r&}A;+I~2ito++iCT%2srxr)gIRAqYp~;hhz*O`>Fr|@sfrdT z514qo5#)_nG}U+3bLgsSy8iR*@)8D|(4LEr!JgA!L4iw*0buG2yNljV@y)0&`Ned~ z627W098}KnT%lv;m79~Zxe46>U=7z2d0N5zZq}VWkVYbP?v&KYOTKzhw{TFy2Xk%6 z<9qyHMD8Wnz@{fqMh<7cbAx1IBNI>>wscj!+^a(C>ktA`cajT9`+SdFSkvQqk%MDK z?-HinvrBJhgPxnGa^NBaqw&UIPFiH-xsu=nK&7-got@RAyFYHoe@gCx*o^a#30l#P zDz%@#80u%LbGC+e4Z!xm))q1HGo)UHp<3z!iVMN!P@OlcuPeVez8*{p(vMHvL}_z~ zS7zwGZIgG(m+(M-4HfEW@N#+MaX7cHWXQnVt@0^Ts|DnTgTG(4Pvg;(I+@o*es4&4 zCX~luvLTj%oRGnZy6u0C!CI1X*!3Z`u0_-);lsYiKDCfBlj9oEVnkXBp9T|kq;mGc zYPgb)(=zNNjOm^vs$W}s?owRx> zSNiNR@lh9Si0ViLBdeDMBSTq@DUyoYCx7t4S5Oi3LJZMOjO&D}0ltN&gAw1C3A6vQ z!733+u*TtmLPk|-l`EP!&F#c+KwlMaXNbNl8NG1X$tmLTa$yVfBD-QE>aiVlJ^J=m zL{%uDzhfyAQ8Sq^JAP8u+}iEBU6dXP(L?Bc??!z`mVLm;O$7S2uq|icSnt*j1ud__ zHvZ2^{ZCDVgj4_X(0yITN7`Xz0Re8eK^T?haL$b&(HJ0zsAtFV{#r#gd5{d%c55=y zohGX?tFAg(u;Gfs1nlfveoHK@=0h2fYGFQTFDok~SuW3tgSfccpWGW<_I ze>3uZeoh!czjyhCs*Fu<{N1zVn`F+$gvXrfvZ0We-xrfz<_AWl^^EE$#0UJshH2zs zCI=u7*k_laqt;R{o{>lziI68ru`K!A&&15nnUa&yd^SNjpV(##NCw$GCn9yj;Iuk< zh0*hl+bXPOnyZb2?HX?|xr4m|!vZ-1W0|SVkGxALO7;Z`JAUoN4bAA9Z%`lw9Lp9C zGpDOL*4Ga%L{Sq7_uv*`Zm|_+rceC*qRCCJf6t2XO^I zEP)KSKt!;;Ljr)ep~{1Kqa37(;gjz27r|D$UcNtFnwzNNWUEKf=Z&0LvltTirJTxX zGi;GSR=6!^S<{k2KH6SZD0`@^m#SO%VEifgu}9Cleq~5pC$btD0m%Em0n2?f`0v-B zA7M>Nc>C{J=KuX+nZFSOYy^Ql{cg3IH3vHMThIWk$fE}wSd|@-Qs6hSJjOYjEkxiB z_gSY;x`=lRONX3M62I~bvznAeoM_MBuoil-AGzgeaSZ!_IG0t_ZBiU#g_ae!{Lk5T zdqPN^)y`)^SIIllttUKUk3;%{xX~@+OGW2&u*u>9KEDpHb}eJt!e>?^#i44&fxIWC zUz2Fja~R=U&ks z6k(Majb1N~hnrd#d(xEXE0BO{ejx(q65N{_cm}6}{-#-UYug2et!*{5?Q(05&>Wx@ zD4TM24}sR-8kMOm$8ZSDz{q`L0L=NNIgSA9h}yzFo_^%w$swWQrfn&~BavfSLoc<2 zHJz4GOZ%SU({Im`Aah>0Og@TwKN~Du9p}5)qNLO1;p7(iM3=Fhg5q4DyOe>3{?b_5 z&J17qR4){t%GmD6FD~RbzdD^Sj8AlR=j~=k;8tM~)rn;nZ1|EM2Zpw5(=7?lSe5;A zJnL}`i72Y}l`+v0BSGLA;VL1WdTj(o-24h$=LQ0i5))T@ajc0uaE-|EXN-JasZN?S z?@3Qt+5K(KB|pXJ5ii>&6*K9S$rdfZ)@p4&7 z+BT!B`M&T_yzF%)W8tiVqWvZm;X~YYBirDP-uf7TKJ0dR1qLK~@46$ABGCNo9^b#l z82M-r69e$uIR2-2Lawu;N-A6)^ljtfvh#@AadXeF>I=nqAkP2uL@|`{#3`VEhwZ2h zx>py&&~Us}a#9RE?qP%!$)hn37BFxhkLgFN(Z;xU08nQKmzqotzU3`MJx3!<)!JFJcC7~Ue*Kb)k#n~#Q4 zq@d2cG@26q*fao$Pxuru`=FKdehs@Zi2;b<;4>J&{}4brU}g)uWo(#oA_Mr#aIE_~ z@F||Ux0%$ZKHt;&gFT`@th_et*kb;wp_@oIf={$Mux@8a2#|A63!B#xh9Fru+FW~CzJog;8@XQ+T`f&~ z0vJ;$pV%6nzKM&~Ux^>ZNCzf}dFDGOKtvhQ0au3QboWu3RXU%hKKtMt9x$P}EESkX{fpIN@m>S-iWp4khq^V0e@ zyuroSKFE;S{JY<-sn9;~)wlG%MJX#vV0HSVUm8J@wy3(Y@B?;GsalnmFuA5{!D9G$ z8jk7sbOgIO>cMH25b2uQ$Pc4z6QH0*$x*ryZY@2oQqc29lU@LB+E(i z!rlx)19C^jxMJiOE#WbSlNcFEOQ z!G3C-YW_ZUIqvpH8J(5<0LB5952fMRp2eqMQ;DhX5mfJM*WMwVnVG0ba=%{g3UDiu zZ-^qC)45N*J0b1a1OUf`&toahNxyzqM<^vuS+zU+O4oZ^Rk=|>P{D*TtefvBB4tP>b+<^m&h1~Sd-(~@{tj`H8LsJq2`d35`O`#DqwRoArX|`YU z>747HOqM1kqWDDJ9K-$uh0RfiO6sUGbWP{XCaYcNeTboY`bV`v3ZmKEbv3yrQBVWZ8|tq z#sTMCgB|o)EsORwrO_>d*9iJd9G&4NsKUj#1biR--ps89ftQi=~d5^*S(&qxnNWTDJXcEXi`X_$>>mD}P(FZ0MFWIc3PXD(0x)#TOMusKuC zTFXcH)&WIDQW7)0!!u14r|)KVi~2=Vj>oE;@N zTr#p$ZdjCYjpQ&tMazfI6W~xPJ%XG4wj6vs9E-H{7W+qaO)pP|7Cv&=-1Uh z3hzJi4yBe_D5r)qM4YtuBnCXW0^>vivbF2|;CX-p{)6z8S%_`!@b@I3H^z z$H-zoe`d&Uu1Nn>!EkofOJi-`$Ntq_NWjkg$1tu%+CKM8qmxf$H`L}V?w`8go~gt~ zDo;-v*gSni1vxekGU8hg^_PtmK!UDz`MQfi8z+>q-^{G{iTR$E)W!gD)rjcKG`hdl z=SOEGj@E2-zxW;S4Cg_3OV&L+cZ3cg{UEgro+~*T61>Sm^AN|RQ&EJP`IwaF9Vqsw zgBZ}wJ_oyoLXj&Q{jc*d+mwC&PNqVDLC3_vpfaE7MmskVms?zbSJf)VGLsK(KZcg3 z-mx=ra+$uT!K|#4#uHSDm8Rj}UqGVp%H~NJ=kLaub}ch9CYZs z-#P)fa*w5~_s5geEi%@ppdn6d5tR+5-Kw^CaXXUh^4>yBz&?_+7-TLD!?;n~4I%zs zEr$`hA1kAL^BLz=F!UQ=fV$)fFL3}j#!fkLF1=#2_-a2dC6kPH5^E<1>r@y@S^UA*7NFln;m^p_H;5JXyZUtC^_NLf64Q+xc5i^oayZ5nK&%68M2uv0H}$B=)p4MOr1 z?W`@~8>qH!tE;o(IdNX8`~sl zwr0h<^5OJnpiS{839Q*_zI(H);zq$fd=_WrvX!)bxd)v=wyUD32E7drq9-lwxyiDP zBuUX|?|Rdhf=@8Wtb$s(wxhYCSNU{YRxT}yrg=^jcLh?F|Ci_{Dj)+!yr>8M1yX+p zQt#0(e);ELj{3-lcv&96RTWO@1ttulgBEs%Fht?rHezWW3ztKBwci>IZ$i$2Exf}4q;BK& zmVmYt&317R7++naZ^9r9Pd9ocQm^QC{;$6?EN&v>lLn^0R%GT1!MIQA=X>Yu&Nh#* z;=-j3_hZAJjZp#grfiz;q!E~1T8+BttC-rfy8|#FABXk3M_JwhfCPGfIRyz**Ds48 zIM=K(Im7$N%i|_D{UrSQ3Ia1t+D2>sQx!O0N$szalyw+EVQ`Bb za1JmNk8>iY#JLM722zu)!Qv$Gk7xnIEtuRcu=-Jx@Py5uaS!-t$Eb|E*?$RU!{*{J z;%&@pWKjC@@mH3@2;e0CU5lWhYq>#oXCm^9NlJkEeapmrMT+K~!`Tz}gBwkhXN;UL z?etD)q0AYt^#)rXETRyofBWpUVqH>u_pix*iLtnvKQ)s|eweCRSnUOi`*LJt^xtSpa`Bd_( zrF@h^9cFO>Rz}GE(49n7ELIT~qi64`%vZ$b-uV!$s_ivE z#X+{I$kTDJ55=qaRdM3Y+cEl!kz$~fP2sUNnT(sVM zGj&6eUq*_HZN?OHy!n!JP30+nnA6|D3wtfUQDwb440vrU_lyY!T6|h?^K!^4CTO13 z7Rowkf+bRI!p`y+W*w}He44~eniPSQYZfp z6{Bl{Zmj%Yw2Z3oUy-*0B|8W6$bNUA+;dvUS~S@L$%A#$8=!t8v>(l?*RDk`fCEG2 zT-i!O7gEN6<;|{Ms_tf(;L#0)IH~XEv`1T6ETDjQJ@d4NeE6g*hm_~^b3eAc{`2Ta zpCY}Vg)4?f19D7Ot*SHMC|}!nt;JM30v^gNrf;z2BzBHSbG|nw?Mf;d@eXJTbujFk zJ$&|2=r{EYFg$%rc4fnsv8}UKtGmtC&K+p{d>=;$)1B~@z}Ns3h^}Pgd^^rTb{{SK zo{#vB-;rR|bKL@nY*=y&%1?B9|B3;;!yQ;k)(< zcbZ+XPauS1t9@m~=igm@^CAQzA+piKAqPnME|UN}z;mUSY!PZo=PAAeR>&AS*F6=V zJ(s?Z@ydU6rBM5|7ZBBqPD-u&*9xgV$qYB9Lwv&(lL**^M=M0 zeJ3e848Ew+e2IKXsubK4l!Nl?hf43!MmN`3I45Ut#?OA^22u|_&DLbhM+vw#M)81~ zB#n>2pkCkXRP#V|v9ye}`u?YEWI|s#zGzCa+&l3#)qAeTM0+#&ZpsWm4%JtgnHoyG zDg5^ER@VHN4=7NVu?DMtk8hg8D!-#<)5AXeERLX^wZp{oV+qtxQRaeN_f0JuK*Xcw z|IFC3*%49=caD3~`upzv*#_;BOD-Bg!1Pq|dhaCGsogP{W@&2C1+c^^LRdyJVQS#L zX_V&I-bg#Fj{7%5?NtMhhPK@Rn^MfgMUlT&i-dpQOAj;r&)ofCwgtT`6*?VEzIOzT zvJ}o`V$nXe(@Z|BC-|dGlCsI4`%w3X{*!o+$*1Rk`NoOY|Hu_2vo5vtUw{p~bHl#{ z+>m2Gp&paGC0qb)i64+a0Kdw+fdL=CEXzrw&2EOCKbHEfkn&UoK1SYi$iY}naq)FCHkGp7dkHTi1VT2-c8J-A zspq3-4gnkrCxa3-ydhnGER~O=OouydQtl39!TxX%mE|izMuDQu-0MDp;jg`7?3#~q zFV2+U5t=h9r%*sIy351h?P-J^wD?={WJNCwprNecbT=}~jd)Uq#!PPb2P$#HSjGcOJpyR zQLfuzV1u74D@hk@llCoy2sYn9|ALBsQ!vicQ^|c=!rI@5Fde>Y-C81#( zUQg}hW@8<8gNFcau%&y0d@%dl(1DG#P5 zrZRtgzQBbZKk@?`R$O!3E|0amog&`@9;V*=n=nt&4du3>bsE` zA{E|+QAIC!o0WVdjOkV$=-`3RXgKIVF#XHx=3bd=3^)^f{<%T+px^W9Vibn0lgP)t z<~b}P_0p>@~6Hz#SdO1OfWh3Db}k$~C%JspjW|HHuNk~_k6z5YRJ;x@nmOqUc$Du#-? zY8ylgQwj=@{8f(=@%(fL860wN_BP#&E>_cug%Cp$8)GJ*9zsWKSD#KN%sY8D;y4s@ zDkPG;ZHQS0y)(#637R_#$Cxr4w<1rfT3#cnAAKA!14cZEDg8PzYrXvH=un%}x(cdFP0xS6cEl6?_skIB!E2MugA@nZGC#dq%k`}^#@ zV?zw3mW&6|B^D1iMbfvnq7y)o2m|i@ogX6Z$l5>pWg=8guk4oZg1;Hg) z0W69HGII#?Jf`Ygw9($#ab73l?Na8}|J~NiZO5Dc0hV9Tv=*v$`z!n@T+u2_vX@D) zxH}AY`uWdAK3W2?(_9H%qF1Gb-DfpVakG651?c6vOPvgbNM@pjJ_;&|dYUA~k-`;= zbNxUGjBvPmh1ydT1;Wju_w}_Z5_5lvV*__6o;lWy<;^~m^As+19q|nf#YuZbMZ(jx zwn_sM=us&D8qD{(wGH!cIEN7@ZiM2&$K>CuGR$1n<8C-1FFZdW)OrgD0&Le^3>o`EnSwReN*}r<#-w%-@Lf~o!yzTAc$44l4qq~4gZ3l$a5`bL%3G0yi)xT0+!sc3ykfJUX+M{tb_re;tW1(8cn~AaQWJ@E@2SNCW!RPe#XNP z?Bcw*PzuB7-T?Nn?Kreui3WZ**!&QKZT1EXcG+QNYBHwh8B|7){PFDL&PR zFM9}^N0SSP!CTy-Lnovvi~DrWMk_D$n(ydZ^`}ave0xdqxz5W1oNsfKiCFKIR;NWG z)vm5F*;*$kt5MZ1kt7({+P{|#^ll2S%oI!5iXoBJBR1(s0Z{pEV~+1Z!9Omj?U8*> z21@fsN(eyzl?!3aM^C+ZSyt`KWjE#D0>pv`5~N?%tN+2|tUKq6iN=K*E2NUEL=#He zOyb54^2heC8e?T%XRzu zfMiD>Ae;tB#ba-#h68)e&)7wv46Kc?Q=9Zp&R}(_NO_Q9kMQ%YYjizxlKZa|39YQGAhdV`yQqg0qJgOX#wdN2|>Cf z1O#bm>1ISgx*O?`E|nA*knWW3p?k&+~^IA&t%wWWo$2h(WzhtcF;`vm0)R7=0#pZiM^V%y=p>++!v5r&sZnCBNl zU1Pvx%c}D_B%hpAu6M>14&+q?)y>=)V#Ybe(qFLPPiB$$Y<_MZn3MjPsE(JBr1_Ap zmgHAg4i;y9>;CNdTS036ht-(IU4{>D=A&{jI}F+lDE+>$5a&)t(gv`Ci;^F9j07@S z4>)o2yw_OYy(YYNiToHg_T-b0gkS;fD*Xe<13b;$1FbC_w6ut zpt>!lKu|uQvdlV2(op%~Yo5M=w_37AAV08l_>FXyk$Bbcbz`}P^kwj+1mK;y*TJgT zw`KynuTJAARoLM_5N9^e!|_i@eE)OCC%_p&xg(0)zMV&1tlEB*M1U2gS|Ajq$EuIL zS?Btw;icRBCkEJDGK>&<-%_Dc9KqyU??dVHhHCxvPnZ+z?7~NHJO6S63IyI5zaRlm zP~;|w?B4WY=6<@lfCU|0tXAaIzO}5pxjxpKqbKYWSu2w9vY^)t3pZ^)#A*I>DLF(%7ZpR?$q!jI3gN{e#T}kV zk|MXuel*|hyg4&D79Ob}q&gI&x#T#ko|pzBE+Fibqn%%qxb@Fz7T4R)PyH%J^ehYU z`l~Z%o|=MGlSr6yrv}%nEV-|f(HypDHJzTBrG3j_b2^(EviZhuU-d&F?Pj*sTxOTW z!ERu1PKxc7L}80xgX`4gr%JX2uUu~I3H2re3FiZCh0+(|^sL@{sdQPA`aDYPpLkq0 z&Y*2`VVcSxazG-i7NN1lldI_@o|84-tA8PqKz_E?3A1|&ZpJyaHE;N$*z;=)kKJ>? zxt~n)bw0HLx%!QBRBeVb!r-qTH7wMsO5YK`8lT!==ZP4p>2A#Wm7cUR+hBvZc}ZmY z@RaJ%OJTwalxWM4DFFouq*>3&46?OCYMJG_32(J(b!&~Tj9X>Iet!nAS5FF-Udz59FDdGXA?PWBd2?8~mPA z0IxgUD~kIYP)nH(we~OIW?DvP;{6dbN&_p0Wy{l`ytO_Z5JI?ecVUS})6y(?#*eNb zzVZ=-VLj+Z*wCjA{Y)_TYiZ=!M;q(2Aa5bif=0dlx7Z(sM#fhMmPr>uNpr`&u;KSo zBJ5q}b7$c~0cgqA*zN8)S6->zA=<)?H6IQ6J%Jq`tYDX)R27CHlKpy#bf7UqLh8+q zQ3~$4x4$!gJ zzk|Q;oze-!u@j*WMs45FAS`Hviq?# zq2O@FZtX_XZE-z(Y4(@UNth`%t}cITn&{T1mA?_I+`K3v($i5+SwgMJi=6!Q*;Rh` z_KcqBCs5-eab@!E*-F>+I$%}Djj;^x@s}H$)~_LMmE%aq>@gJZ4Hbvdi>wMXH_=Nx z*B>ic(_d>h&~0^6+>|hxWwHFCws-B2v%do_aa`TnI1Y!*1PNQyO=T58xno*8skdm5%> z#&uEZ)!%sHITQ)2C3%&1T z`>$d+U+DYOon!0{)}mBq1#aYk0Fn{z65#L$qYrTZM!cYjMGCX+hZNJlOnGh>mY$(i z43C)dIeyWn&H~bSnQe{KbfBw0qBVSSwqN(BeFRv^O1Ol?aO-rJ^dQz2b^*sIAx~ty zr;QNB-76=H8(a-7ss2sR&JSBJOlnN2%c2 z%~%7eNBw=PBJKq1>L`o5#VC9uB&kiCF5FCd7lbaox~s z!RS!81gPq*)lJO1k-l|}mf{c8118NRJZ=`!P0uGD5iAc@H<)np>8j`5ebHM8%lPS# z8wO-&slP>^k;^H-;@_$(fD{Uu9TPcyJ#lpNW2yQ!k`~ne&9$`iHs+lR`)_tD>BDE^ zhu!q8gz#g3;e-i7>^*bGcC9tht*(U}X&1Y1a$b=dHa%T7+$uEkno0vvadK(s`QlHs ziF8liznb99C(E&twY60f%e%^b^n0A~bCo>n+wm?L-?-ESqmghYM~ka+n^JW#^hgLu zsf^`-$5n|ar)=`G3VNCR<0XvD+7upoo5asRo4)20|BH@Ikor>5%l)&b-XDaXrhR>9 zCeM-PS{XZi`~1p~1r`H#Gnh|5VrRwf=N@p37U4$jUy}fG@FpvTT|u_3m;OS04z>f$ z=-StW&UverFMCu=8yRf`B}YG%Z1p?>RKlW5mCdL}LDd5#wx*$0j+YE~Sy#mgP25?& z6Fu>-d9c7-+t@ZuqLwV+gp8_RI=3@nZOKm^%}P8{Z#_^$&U>o~%53seU-Mo%P@Xl| z2mXl`!(NK@BL)Nav62e!>=tf%yOzby-pd&A6->H9XFsc%@Gm;%Lh$8+2k=qB19 zs>XG%X^#7~)j;o#f>}y|=Sc7cCl#O}_26jKXh5sBh*NUuHw{u1`6@7+AEnGxT1{tQ zjPa1!Lurwt@NV?t%-QX1ckz!GaDgmw%~Y7#g-PT~eE~y`ZQ(^+6~9#SCGc zGyY;l;#0aH~J}VtX7f}121+WB&LAsisW~L)ltIqIb zqB$xPq>4sStqHMX)Yv@bCqJyGqc8O8?3r1=RA0LP+_OiHTk%wt3xJnt;4+jryD^=d zsf2v?)%{`le>XEOz*9B1kUm=zn)+#6X`VAN!2*GK1+KZ7d~ly+yXwN@^|E>lomZQ4 z)O30q`h%)oL?|`ER|y<_{6)FA7aP$-c$4o+XC9r`XR&Swxlc3O=fXk??zdd{AbDX{86v+t| z`=sITetI_6tSxhozB9`~BNF-F-v>Xkl2#H;Za{p$M+h0|p9&Q3+eV9z>$Lx@=80?FQ(MWly;utWzFYU*p)JnqYSGT-R5b#soq+tKUIK zCh}SBO~h4(@`I?M)OC7O&Ilr;gTfo=nhg>W)C-={e3X&0x)idyQrzsV;Eg}GoY_kON7?@RWm01z%uxSCW!XzQG6&9h{ZiccyhuQRl)X?n)%e(^{z_y_)9>^LSv{fG2=hg- zt4A39m`@h1U;odp{flIZLi-dI>ABXxSv@T3o`~?#}oqaK2kw;nsYlo;mXyNFl}vU zrW1Bd>4!6vAP-@H_KD-gvq~7S(YoJl77G-S<01Z@R5`_f)iVCb5glz2?R?)^iWG8p z#0P6IQl&4CpMJ9K0n8zrRw*FC+HDIQtKdtJ*R;?M@FRePM0M407o7g`9lw7fz;-*M zhiK3#7)SM#APw5ZA$f`tw*!gM>T@AFR7PD&={Yks1~nB|m?m2;72^O0#0#nUCgG8( z{*esAdkkPEZBF$N=}M>Y8CV=s@#AlcOgS8)X)GSU0PBI6ea^C=C!X2*$MnHQ``Lt+ z^gMYlPCseAEz~3X_(C16ZkDUY3)5y|3w*qnE>@=aL?i2Q**vZ()r=ZR_8W(%n38;! z4G&H})DeAGoIZUMb2)#+@!;*`tcZf7qpEMILa75ha_>kyG0cUG#ljzto9G5rg7ec-W$N zVqLu18o^Y3@36;n33?h?ivj$%E6SS_jaSLWJQ(SZ^p9t}51wQ*KVd)qd)=RibI|G? zlUi^iBHqtbev%^4X#PD48qs1X{>Xe&rZ+-f*_LE`>2#Qnx20w0>cN(=HD^Y|qZOJj z7V)1~pG%pW)6)W1Za#@8pCvm~dtFS8b-3@^ zk*OkRe~&9KEpe`VMJTYZ);mMnk6Bk_p)#qAD# zULEx$Z`ZKE3%{K9z(HD%jeQ?Wj%P=-odix%Nf;9Tq{_kT_u3?6t^>r!2*Fony&y9! zBEcYGWM1R;wHpFr5pB5{2x9C?mq8M?|H3AMaMw_qy}x*zr|!cAE3*<>9`nvx^9~5^ z?*xd0ah)oyvUiL6g+3<1@{(@_x54lz#gXDpOC1C=-9d*DrLM6sxS#RF&#$N8BZK_NO5x_Gx9!7Fk9Z*x3MQMMM5+X9l?~ zrv@+mQxY8#uEK2PhrJfdG{+$X&fMCc2Ri3Nn1(EJG88xy-+W*qZc@}I>IqmE>CrA2)B>qp5XkH@XEu_RXqxy20(?a zQDU#nJnn9OBOwx-%U7qh=vG1=q~{>#Z>6D1D}0eUGB3s+@#1mSbU-XE4_+>X_AStngm=IJD=!N^T!k zo2#C!#>CQQTg;^*KbSW>Xet*EWHnvNFBwtr;tlwG!W^C;)(OqBh+S}xG(jjDNZ+vZ z{VO~|O0+=OP#^f5_uuWg7ldlE-Qziq9l8JOl`_Bl;f3=@v;9hM(TM}hHz`QVp^MsR zs13pcUq<@rH{3DuKyF85+b%zI(~MizLh3`oF_tuS^PSc@UX~w4E2hI9Z{~IKe&zNc zmVZY5@QNX3sct_JIyO;>tNyx_?*rY9ly%)?;V%*;VTJ#N?a*(gA2I3DDQ0OW(5 z5sbcSa{6#{YM}IiR`DlxmGdx%V4Ci>tVuXzw)e^Mi`r;WQ z-AdKYi*;k7FA2$GPYD)LqGp<-&|RQ-Z$X9OyC?lXm$vVeAF3=iiIDDH~ zqVu(&T>_Z9r85&=oD74|L1-y-HRV#gb@!uIaUCA)2fVuaG#M+&(5bON(yidtWrdyR*U+N=bN*wL`N z8@dvIc7DzG#@~_cSM_u3reDEmp%(iwZ&fWV?lMeTFd~yGBdns7jY66jX6$tm9${b) znjXhFJo+Uet6yRiyI%qdYn)WB`(Zo}YW^|Q$O`1y;uo;U`i83!rJOTLC@=dSpS78X zFn+Mv#_sb3^N3iPjrVxmf&FxTDInBusB&06m^E*5G;#UhlaX!Y#_x&8G{F@C8MyT0 z&)$CcE%^vXoK5=Y4ICp}=n>93fB1VCix<gEFl+Qc%2R(Og4bN;vr0JLZ0GAPUOE()i{`vGkbff5>qDq{Nr z5~Nl?Cblar=Z{qi02=6U1DlB*n^v?cNlT+akm|m6?g>rmp}0#b;CWAoi6VESX#t&~ ze>Q@DG69qz)CJMB1OfZ+)FpdE$3{BN$k8Et5z4z9IHxMfw5@U zxo(i8rKSIwHpS^I!ztdJkIIr^Q0fb8czmStRAk~~8q1$age1Mpgm_hFvl~@-Qcv`} zh}!LL;WcL(Bs96b4Dp&gXtK+?-wsE2MYHDSU1g(p6p)XsgKnf&uxdolQ~i%_eSSpT@7Z^mlQM;O3k#%mr4PQ*sAc!hq;?@eK|h(FY;KoTts zTRd;$dl$TbGL;yJ1Eo4BZKpC`%P);Fh`KDuT9E;l-a$iy#Z2}>Uf(gfmN)#(AO4GX znUuWnl(c@WStDdE>2~*Z=_Q@1mC#o{60h$wWOHGrD6gi_5UhI51H5|+p$QRujb0QU z6KSbv?u5GOVeO1gm8^m(0oX{ZV)Rm5Ii#A@OU|8c9WKjASN?sqz(B6HVTXs`z!R5Y=$gr+|vR{9Ed>c zX-%3FR{U=vvd8#JBV(A}3OU!mTV(r*8x@&FamO}n_2r19M`g04a2UH3MuN!yi2V&(exVY>jh|YyxmPNT`UYl-!x-}70$!U*RbRxF$e|-{7+Ekk} zTZg#i!EI{?VWBK-Tz zGVUp7mxlj03*F`q1Lmx0kSjOyr5J#@54jhi+7Amd@8>@*1L#MO6^S}Tl36hb5kzBV)_*U zJO{98^7C9hK7iF0Uvc^%HLVtWnIRw5;hs2K`{m5%np&NoUXTsRDEtY?0ffx=tv4b? z_H~uLJJTpMFo6>KVRkBDF8QSI0WW#X=k7Oy>z*X7)S`uNaUT;=r)%#FZ2D=_?Qwfs z>S}NQY@%(5vy@Gqak{uhUw{>pzq?z1XCddY@nd}oV(j*ogq)hph%h!o_>FFSDsfge zzU{?_g2m_7FEuQRCr4-s7uahl%7GNLk>^5*rqO!^8URXs0n+1xg z)XNJns^ppSqA4b{sJcz%lKoD8h;qa8X5Y6wf~cd5c`xvBaFYF-G3 zjnYl9^+&GwX9Uf$=Ys}6UiAchDGdb@MjT+TLI-tbgH}Rw+-K(lua0h2qnxbJk9lhD zu#%%n>O{dQ zgOoV!=w^z>!L+AeeVwp_*m>{7rPmlE~#Vzr}eDt6l{C`LoBpwerdhA*M0mv>Q54^?TXy zkk5!?N>2*`^+d~CX)Y-Zm9r|4L!NXBnK4| z*&m>b2mmAFKfP7FxzuBlB)>b@TI*JN9dwLfOr3NTz96H{C{x{t8xt?UC<-pEOH+ec zPPI=WGE>v+`=d%=5qf9*DX5K`Ax1rt)g9UaVOf&R``MYA@}Iviswi^?*wXh|_oW!S zP*JDHd?*hyit6HapCVs>MIFL}|MDYUgNEBP-pic%!Vq3kUJ8pJYoK(358mhUFJhPe zo9pp&RJfT-lG9K8PoMF@;%vGP;Wb)6XpSN%)7d}daBn;<_A8XNecaH$h1d_otL9^m zp6?D~VI^JR^LCOcho|eL+Z9J-64@eda7Ffea4DXWkYzYnTM;+SpYBEdZTg#EOfX%W zTv}Ed`iw&HmeinnH~GCZX=oof%i}E#$#hZXJ?utqdsEI&C9Upvwv11z%hl8 zwB$`^mDGtVcRHLY&2ivA`F9uYd1(|geclGk+ZI7ypdweHd3N^~C;DI41H6Iv-}&I! zt=A-&2&}Q!uQQH?)bpV|W`SHaDhrEtSTgH>8hg8&wJzI6Dco8OT@ht}JB zXa+gtPB|`VV2>+OW#M!TKe3kk7wghw(4Qp`_K;STl4QG51v$EkpvHiZ@gq!Dm02d zEZDBs*?57MV@fJ!Y-B~PtuzSb0aQ{I*1j;uK6 zSw+`ZvzzL@C$#B_eeQEVJ%oGwT@>aYz9D2b{8-8NZU8G@PqBygEvP-`kPD(&Q1L#^ zvh3^MVBWxoQr)K$Em@j(Ib040JP(RQ#fi$Vs zKYm&V!f2&ft1um-=^7VH-6H;`9O?8_Rm>obV|WAu;=9~oUC&EqcFH%}Aw2xOHC(7q zn^$+yh%T~yuD^9TL?bG8e&En(o9?Vdz(J+uzI&heTdfUD$ zzy8vpLtrf6^LCps3igl@%;R*WL8o&%P})_QN&Q715a4n@vw!=aK-1pA^?oV?-cS;` zH~g=0HNnP@9TB2`{@2@cBa|ky9eawOsr13~;(IN#FHIJ3#US-wJ={F~6eAQ=ZBekp zr>bAL1cK~NLI$z7&}ZwG#3e2IG6gCA_zuBf0*zMKa-MDd(yQP37D6Ww1JZM@!L*q;tOM4fBShW9f%$syz+jbEX=JAeXL z?egk`C?EOmwTNyhcn`7W5hHS#eSTm#K+Ujn0rH_eP2SC*jP}aXuxA|Hf&z#o;4i4T zYpCZhp~a5r0+S#bH}`CjM3Q=jj;)e@VV9a6CDrNPHJT{(Qf)Mc*AHuA>#Qk;xZSuX z4N3uqtS>#NraokLPHmVDq8pV7Iaxxz=f#CyWK?G4sC<$ zgA{(N@Yo0R$>hjNbvXiDo#fgihFsVwy?81%V%U2VykihCM-2$Sy(XxNh-`#+c_?Ay zHdH!Sio`5t1e$I&#H4aOuO+1)xMn~av=vtW!1IqbyhGP^{G)Kl#2z?aaD0ISuK#M9}T9|QcQs(aUF9Kh|8 zNP_*rdDnIkVVq+OwvuF74o9{hM3ZD{J>y=6|2676po)$YRKCh@X7F>rWiq%b zHF0#U{q*4rjACx$G~zhzwlfz7em^Gcxt6*!UU_;n-s@Fe?TY|#fI)7@;;rfIaNPbF z>{MpSOZwzkJb2nXt66AN_%fcqYunJE@|?hjQeNOoZz0Zzv4ZjEIqWUWh(Ce=UT+wm zvBe!H;J~i&Yh!!|=$$;j`FjBlIu;!P?hKJlo6!{#Z--4P)gRzVc1$c}18*PV8Du)4 z{uSw4;QnW@Qs(6Bh}-t#E{jp%&nbY=R83y28W9_}ff>9^qaV+XG0wbU;u>&VuKGG2 zEG$;}+zG?co#x@)+b$#j{3Nt`Y=&Hd+0kPDw8$5?uPR~0h$_9?EPh|KMLcN;YM+SD zD^EF2bXz+Ig5rvLl4lZzPgoWDzhQn=D9Q_A*H>QM9Ubq-Z7U@>%}=i+{w^5xo112v{?J({$^_G-nwP##=dpfCm;3DaX2^- zL5AdDMEu+UNzy+6KpzkS@Y9@v1OC(XHTYlk;>C0rK;goFH(-kvfAY)kJ z$gdz-i6$g0#PcFG0B%d zv~8h)KMI$lR3zZHHS3{^oPXxBpZ!H3QmzblgoAuy#v?dSsFA713D9pcV3n&cBOMrS|I_&uU&pMa0d_;{ zF{e*;&%wh6U<)KzD##8Aj9xHQ%Gr%z--aMDh4+-*G60H1yRyZrWA-~)E(lc7oJlV^R- z7&axATpfN|?T@WuypeS^8MCU0aV6ICehidU0^+HfuD`wIf5s08!owT6`Pbrs_4dJU zzknW0D8$pkYBH|lgVdi$gJ(B}O}$7xj^uGk#gIlmeQdu{Bgbo5KFNhlJ0egrW78jD z;E;a=xVRUbYR0ggs;B*Xshlg%e>DA;WL;q;~di z&MsX+s^B#gGRWS>+vemrbH%^oa3|^W-hmG8pL`?6;;J^_yN+s-P5$%(YWsjMh4{_K zA0z}Un#M0OLZLNB$z7_Y1TTj!bt*jg28$av)s4HU_qMEm?!8;d5%smOWLjb-lBVC6 zOv(0~Rn>G(2&_7)6cIe#f5>Y`k2$!Nvb15qXIW?zfafdq06g_mHlp`+O$~0>-i8OhLqRwf zL~RWr?s+RJyAR&+j}x=7go1`qbn^Ya>qZg{5GP=h?mFiC`^fgMWDUL@mrN1sSyARg%zw=vattUK|^X(mO~(#nmbXi z8H#&1`~&9u6T5BW9Q_`pi`5QAPz}HS>F7Q3@^RNz15X?Wg4=TI*2fkB_`^V^E@*!R z3CiAX1kCun=FIp-x^FG`T34T~C3RDCGQ2HH2|5Pj0@6+BUT$#$yI5NeceMm#fUqqn z1&F-`Jufvo`y23=KMS}5Dcj6Cjw;vdLV{m=soyTsnp575o&zcV*DlMSB z#UB=KCscN?vB95l{D1o}5?<0OkKE;Ujdi)Sk(Lda`Mx@m<*w@vMy**H)8G&J9p&A! zr^UDR^#Qgc`5vi~msVKK^w2A~-9`Vzmr;7gJ?4&~fJ??c2mx>&z5&rsVAgEE%7Ldt zsE}9wXOJEIyb3Pp1SU@e zZaFW`hWMtVZuHvTOz^BV>?eZ07hHLETxS5*9#dQQXX*aS+aLOeo_J1CX8Tsufs6m| z!9qP+p!cXVy#W{fX05^g&~*a_vD@6~@K)IHQF-HDI&7X?iF|W+g=iZ_r!6feT(K;S z8%7c((urrfYd-#KCGjCGxiI7b=frfyA)c^Ldh53;od7gHk#!9nkU&9=R2tVdDRck> z*+a=f*ZR7MJkmmhlttDmG}gGB6e>4=CW77WX6v`rzq#-2g2%ht+kvb4Uj_&P6Al zQcw@ZA$fYfVq?C4yKcX0IWgrCQP&U1!RypGu!(Bch!V1{Ugtv&FxPK27Yi=rnZE4< zQU1?yKJItQKnoB`-J^9BPx=2t?Ze(s0Ily*@A-Qnv@B$LGCtKDBk&<8PkRaa$M?JY z#MVuLC&nMH=$qg*j|^~k_}_A?Hv`dwC+oU2gfccUtrIKib9s#&2fbEYNJ$dWkhHJ# z!cMXN6Z_#){tZjPe!4Ndq*fUN>c+8+`#r!;^puQ4B_`=oX@@lEV#|}NDUM^$nkPy8V>wpN> zcpJ|;b8Hm&)&_LZ$+ndpsl@{*zZH+)Y)kje*rcZ&{#gQa;#OK@+YnCf(-z0g37+!e#rE`?@cjt6 z>hbWyz!Hh#f0CJ{oR8O5*5oqNa;tbcEwkbse*jHKAs_K4u_tB4)pvj0$esFknnWh3 zskdF^n|{X>X?SSmTniy}cO4L-W{58vW(D%c9?Aut>c~?+kGOFVJqr3m!Vs4<) z+E7TFvcC@!zX#JrccE=Xb>|Z}vXtecF)_AQ%=54C?E-R_D%r-{qN25eRj`_UR0P)g}FO=n4vOGIkN)H%tqo(Tp&*sJqx zj5G+|{989wiL*jYE1($kI;NyL?tS`QLl4zJ86gtR)kqvPM2FV^tLz7SgL~^@Kd=6Q zL&8Q`kGW8(e!Zjbel2k@-kKv=ID}VXZBi2Nw9HI*!0z;c-bfb_fD5?!3q;-K-R-8X z{v^n?6sB3ag-jz^&LK!B2)UGmE;cW}v03+ui2BJCXMg`ZvZrfph*U3gqPOKkscL$KC4x=;B)%0wUs7K+%2Wv3f`cRL@;V=vS@UkeS>ZPfD?x!80+{> zEx!sEG1mhMc!?xOr81R2T*>Q!knm>frXOWG-$)-3ul0EBijNyW-H{I;_7ayaBmon}DV3So8YLp0^pup4KJu|F{vV@5u z!T(jhdq3rWX_?+`;%U@tZ?89@bHby_`-e-r?f8=Oo7h2OpXs{i-V4I*w9(-fUuqml z>p2z&oG!V?bu3=Ox0(h|97x(V2Tc3-2`M5Ev8WUz-!odG=QE+)k>e z&-&ej-s4+Td_U&%m)*Z$UE><@nKy6%=6Vt3vm~H()u!RVQN?t(Fk_m4i7Z*$Cz^CyX0IZ3`-Zskx-T(%!Qo+cq%piX0y-E0D z%t|(=ZrwoWdJFX%X8H!4HpiaQbq+Jn4-$8jUGMeuX|eZt$gL(qp1dPqXWW-@n+WOV zdW8m8#@sTi6!l56L!2uo6JD~lP5v*Gz+J3-&mi!q0 zJ#a@O8=LB_2ZrPP3BkdiHs;S9MV7rK-eW#tj7_dO;T6uR9w|4Noco2|R4mUJxw;*% zl;rjtC%al&du^*;y=66c`jZWDN_c&`0b#F*MHzi?fz$adTNtpTt?%!O9V?MqS&ZQF z{{8K|gxr7EXS8gfGH$m5gW{|7_DCml0|cS1Eb-RUUPm$Q+H>M>2SQV)eE{`l+<$M( z{|PzFP(=#0OW_~%S=0PB_74>GfeSA1V1OL<4OK~1KQQAPZf3bj2mP_UI@R=B=}91u zkGLHHqy%P^8*u_Hxly>0JuNmh54$7ppr}`kB1~&`gJXP*X7wU3xt8RY()OpH-=QL{ zxEpXi`Wd{5$3?vaCzV=bMgzFjl7ieS136pyqA@63zy8%sY})AU5?sh7-VG=mChSRDX{E_}f&h;gLk#zzak0+`S(q;k{t0_@XynhlU9 zidG=w5P3*lr>m$NR5RDS%WtkPDo8Wbmo!OHe-?{%(8Ho7K$=#KMZe1wL)K@JrGE;m zX35bkf6VQPR(k%7)DM?L34P<;ae=P(W%0IOi^1i(a=|_ccUBEF;&-6?xA;iiGn?U?;PkKJ7Wj9y~`ax^jDa=*10UI*e4~6`Kyv^ zs#MIrR;PKIAF-rpy&xd_P1GnhvxOCtd$H93oooNsakp3qLlM-g+WGY!(^U@g-6Zj| zwZ>g8|G>Cwsq(zN;_|;r2AbdRl0la*oEygKUi|jGOL;JQb9V0*UF!i|!12z2s99X# zTPH*^aD#VDJ#-BdmH#z+RTCRuDq;F67oI2a?As0tEKr~3HQ`*skCwnVm)By*UP9-n zHx8n<5ZMbOpVP*>3TVW2?)iU%sH8E}ur}P`-)X!58U6YG84^W8|MY=Y7UBFTacjxY z4;Viv1nj#(DpO(TR6=DoI(RNy^oM4wU(D*yaE7Q@F9k|4kr3k@?d=FPXO6M^CQhKf z@+&<=(N5I!P=zXa=|JL_ZUe>R2N3UUEz`^V616;d+wtef3-|00#(6RkF~rJ&;xTiF zMX6Z~Q+nytcog7K-2-XOHpnc>r0Iyr(dJlj6|cs7Ftk*q*Fgtrx_sI-1MlpMe$2_=mR+v$)wFy7N7 zH{KF*?a8)cL&a*^4#AsFyFqY1aXj#GC2CXC#Wu&nVGhCt!UPb~@ts3FGp+4)7q86H z0P%+r1CTxh^ z+i~d;j;Bhf1lLtN&pI?_?4ew~PU*X|)WK@jAX%;P8+>UfV>&fpgaIbHb4H{;M6#kV zGNj7DVAF5|SH_Pud@*gXEIW{bC2Jr}hf@W_$ zF-QY@9(^_TncZS}uSGi2{nT_{)3tco?%UT9rjJ!|v0%>K|DC`$rb)JcR!>plY1;Gi z`!28+_<)LZ9bfPp2iPM*?Rp}CuQj7G>`BnpVtxpieZ!H`df_^nrT@1&(y!Vu%y;%)=a`R^XqvpxX_Fu~ghRQxG zKS~0hOT}V_y~o>eXnTh~P$oiUobWj=l1(yQ<6~5{CoO&1>_dt#SoFwM_k0b~oWCNWbli0twIwwwNwZPJt9#paVC#cnegCUwg=g1x(fK^E$TS2dNpNUSE#S z$gU>3El6fhEd`P5gCymyCsKz$C(I$=)v*Xy-cQ~RamZ`hFpL#f7Ubyh^bw#5=xfLX51Ps|OkhK1XQZ1fi%$g@)=+|^=7!(%_)FAmp;In0U#6~3wSHL;VF&G^R;dlAzIr{2_x^bMYFjt?BZ9k9kaweZq~JfMoJL;EZv)Qfg z73H}{>DGF{Kbm`E>hp}>{VW*rl+N(w4t=ReydVjENOA~MTpXoa=y>I^@3@iMoT{Yv z)Px8wcb1N61g|O|1SC5GudtvA{+hOS$dn@*&ry0mYB(Q!)YC$Cf9w(PFhFAOOeG9l zn=dG(uxlCl&7TX7+<~MXJ^OhLM1d#yYs7K!|EbKk|C5IBsR&rd_g3Jo*JwHnpT(}3 zfm*n~O`;XV3=I`7SXdj9@obdP(hSMq5;=QbIAT|I-zOGjh}!>DN|pS#|AC`?6&Is1 z)G9qe_1o{)IDe@+HD;qu`y&(mY_2|}%6r<_K95OoG0!yps=!4D_Uwu*;I|&-z^k(c z%Zt<5AUQKpcUG#Q4lv|g_|)z9Bj+uX6OvE7q^%X$ZH7uw{R5qz;%h`Jz=Dx*|{Kdj# zEI$ED2~I-x1C|yubO^`}fQP2Qa{)ULE|fbCw6Xaq(0cX_1t8Bt@0i94->?+%@rDonczZnA2l(}zxsN=(xC?z<~;G5&vD8L}s0Bm%aX>XYMe!CqKI9quMU)_HGzO>#ya0MTenizzUQ0Pp}h?dx@s} z5e4z41}2(I(2xUtckVQeK)_tSB+OGy1N;2yQ{;@kmD1*SmdC~e@%&m$2faf&l;==e zGR1TyUp64uZWPEfdTdCE{e-Q@o1t-KYR6#k#>zMUTW8IZUmtH{eZ7#C>oD_FOz->e zv5Q9|TCVwid8z8_qsr z-%638{cX{v`|g{~k$DZ?spT??PpFV1*v_5lXNYDF^Xb-N5T)sTK9;_)Nn4BgNkYR_ zZpe1&8zE+<`1S60#Y4__nnt>QFW=7No(GyvG*k~4s< zofA0j5(G>N+p6-E#Sccyais2Uy-y~37VTy3&-+&Tmi9BLBdaaKT9Fe{;nFpJXGbEP zhfYNMZ|elnYxa{@5|(SeX#Ov&4%?TdhzUjb-*1*r#@6mG3hY;nQW!3yBSwoPh?d^X z=Pxf_xl*O*(DJS8@|m?%{~$O`^r_*%*5;F4p7xtG#VO>P_}U)a)y$U9K_ zDy5Pn(47$?qPLyb=J5OA&MRSyZPHbr)3f1r27r`477eV(uj==l#rMHF0oJz=0zZ|V zMANq4^Lp+|K`{3_#)waRM*ikl|I_b+6x~WUz?4>VklV38G9F=Y)8BKK@GXQ?D88Ya z{2v=J!0o#A0y(cl3C3Rc=pZyi*~KGotq~BZ>o@|VT2O*c1MUCu)3`)6qsE@6a*^3! zXPw`&+z>1I!d2$pf?Ukv(4a8?diH#Oaz!ZgC+-8Ae)r^3$B_Glov?EJrwpjCx~^B$ zDVgkc-o^806-^OzG88h;cycRJL0_~Eo1vP|du3O|f1Z(*NyEctmOBwj_Tpca#mL@fVV>G9Iw`JR_v-NF&W}EsNh< zqy1j2!Cq0;rv0|r&51H7(ZhV`X2reB$~hQTb&)&*75QJ`@B6)S{lgxdg`&rj^+ zy?!*5b*}SI;YDPf+qRiPVgDcZ$nBW*FgBhoanLI!+KCyn$Fk0g+XEs}MgdDC6a01V zDpIc;qno_+nxufOt1a!ym;vO#n9AQ@L*Bh5YGx}%lU6a!sL^DR{d`8=`8Q1QJIeY> zWo~ZUI_ZjM1-zyGeYL7OG<>x=G6?Wu;c%E08=MHZkVXl@Zv&++SLpk|#TDAd)WWO} z*$c-%V>%HK0x%pe>no`ft%8Z)vqnL5dha@YT1jDvlQlgTgO_!qvDJE!1Fob2}% zQ#YjnR+xjhvG?+Z>IJk&eZ)cieeg#Z{6xF$8pr%ka~N*Y{jIfkXw#F|eF{BunmmOLwAP-&K+6njj0x3nNgPHIpILp_S&#}EHCEfAJKk3nQN8`crv@$GUGj5MQgo31Q8n!yx9s5y)kkTA z-Fn~skc#gv9-J-`j{2nPoi#Darrd&zC}&B2H8H77q;50;SCQ$*V%@KJZ*9*Mc)x0d z;vlFM!c0q3)RCbc_X%0oyr&{-o!$ipCiH3q!}w**Yt4IJZldoT)m_WQ2RV;c;DWhp zTbW*k3a|03P)?l^(VRkE0w) zP%P2|3!2948#d1R@p}cZ!3Ue0?3_Ou8)G^dyWAD7wR(U^3j}~MY^+Ct+VDNRDwA|P zFh2ATPglVs<@n9VXDt@YbvgB)1*gSZF#oK0XIN3+3yIM(74=#~F!Y@3wb=jUlBh+E z?aa7&csA{yKrZh)gdrKB4FM5(J?FQf z74mvc7ZXor8fBmT9riQs+iU)DdrWvxes-%B(f(D!CT?cfTiq)zTN!Lp=D8PSurjgH>qe} z73&%|4sF&w%nwlevbB`;Z0Keu@q_n_8V4R+rl0b?C_eEH*bml<&mEdFzivJe$%^(e za<|nn?CaahN#y4m$`aRgWh!Mj5!=bH;Zg2o=R=zeEbl**#7kCs!;?DvXA$2#rc{au zC%B)KRyY!3BHBWvyfta9=-8cMN&!blFG(i#s1$MM9f(-_rIMtz-K*!y;#HFPIS5&27~*v%|oNHTL4=`pqHE#T#{viQLKrx*49Y3Jy# zXurgzY@=)`t%1GzH8Ac0wy#kPD;NW3#GUn_;2W~1LjjZCPq1t#L2ta}6idGES=cuS zW7vW9avT3fDAki;j#~f|fUcQfNHct~sAZdKZhkUk71npxJau8glijg&%{gDs?9xSM z^13<#y05OoX6JvcU_2=Be+!(1Pg_n{&j8#VY#KlMeX3ijDe*;5ip{Y*W=RsajBXTQ zqHrw9MVN8hJXz?q6kKQ-GCxlDx1*xo$XI^tb4)B-9P3LjyA>t$K58+v%!_`>g^Z?! zNmQJnM$D5nBxbPT>E)XSs#6K(A5uS!KWr2N0cDBz0aJDG7OiD2hGFBM@%P`qeI3)cE>vX`*m)SGl_do6#~}f5eER|zL?^$3U@)VoMHCo;eSMyc0JC5` z3rrF4foaI_qjkK}LNjc*d@hGA8cB`IFbs!I6_4eW51|)OlJhZA!dgsyeeeA#x3(0* z^jQ9M9y?;k+@On#=swJKab;nR0G9EMnTntd{Et90o~Zx-&wEMWX3@~yc#0n$J&=0L z`eN%zH`^HT2Y%|gW<@y^v)zZuqQhSyx=il=(8^n`$D~(V&2=1HG4ATYt2MF4+HvSv zZpi#m)<1a(Q_j8!*ROKs`R`?yr8fSp!OTS{EyJ8mo|sl@Z!xjQu;lOAlTVb4*3QNcl@hbq#L zBJkiy`B7~K0KMAS*#SOJGj z2{qepL_8xIe|gFIZAO%acZ2n7aQ$4s-oTt#3K^Ybu~j3Peuom}hiI4{1?O?*O54s_ zjOLD2e(b>-#r^xKGVU8WZJW({0c+eH+B=$TT5n-e3G3BCc6%}bbw!&vOodU-`lzPl8x*z&Lw2;F+u~P?WDu>1mndZ{}?9H#nNj&BMPz}fI zez1-+cKrU}P`?lG?E^Cab$|5n+>uwCV zZ#eK5!g->DNwo@=$p|SiI+|0dZnIcLRg^Pw#c^^V_OMQf%GBGaC#gB6g0rYE?_kdY z_v_rty?}63qBZ{Pg%5AMXf|^MTYJj{pJWE~&8N?jX`PGwKF-VcM|>HMLm2Wkv*TI$ zu{zHWsHA@~v#^*ua8*g1cr5RucT_f}3|zIRYr!L``j^2qm44^7pCvCt5I_{9u9;O! z$9o$Eq;B&;z&%&?Z@Mr7IK9gD#bCigW+OR2Hh{Kqi}(bH*amX~0A9Bz3L_1`Q)5@2 zC!IjxLcl8Z?m@fqz}Wnr((^B~0|TIv(u(v~u^{lr-0|(Y&n$#418FC1qN98^CgW?z zjClsZIZApm#7AWOfm00a-fPAEr=N&?;ysR-u)k3>aiz0)HE$h+`=?+34w4!SO#Y1` z0mTV&trfCQT58U7tcIBjdsZ>~-960>3Tr>`b2U0YKOi}c^^=gqZdD=r>M4f2Gx>Nn zeH4gvv6cQMa^F@S&UsbI1k{W$sq|Zrrp0=E9Bj0`DVWdZ?3WR|B6$}#pog=>76xqf z9kGa`OV>ddO!W~w;me=Q%KH63Llm8~QUYj+g2dk~r#zk0(oBhknj)SJ;6dTLT8E%I zJVfMMg)=*yt{nZ3Nflm3st3=W?8SfePhMvX{Q9ppA%0Y}#Ssgcy^aykgvo^F&K)en zIvivbuwc+flFP)5aLakX)h@!BiU>Dq0_~M-7mef%xe6w9aM;A1>V+XAyv0qrt*`ZwQv<{HaT~ z?G34_i@QWsz}euJNlkAV8gFExUwx(?+UX(zoCqLk+w1VnxmO>(>3Gy|Fvs;UJ-K(iEX0-r2!jzlJU!FK`wkeIi7Za+)(1-f1gP@G)} z`%0=FcC0c#zO^lI-cke}D2=zqUg)L4n}K8pP$c!HpANDbvqK#moGg$!BrJL9gBx7kh06(if6Q76-N%WVAZ3P@(k)Yo zj>MFIQy*zeAoX4gmtm!=S5SV~d~ekM-z}VP0RHBb09L3OP9?=EtzZVQlyV+8L3a;a zGVl-sv`4Voq}>ndgvy{M2cI4Ej8+8 z^APxB>cbB<^Xl!p1a2sc5TzTBwKCJn+-Z@pa8*+8HCPhzv%w6ZT$aSnR^C&?P{`I` zD>GKDdX~4@`UZP^OWI{7NJ z*4;5QKZ%EP)Za`|Ec~Chk=wWu6YoiVCvbxD?1EPut;V#&`H$dPda2{T|5lOJvR#aa z`>tmXvD|aQhyhteXAR3}OF-kvK+rTJX~sjWx_9c;x^3AoDJ05V8I*Yfd0PEnUI+># zCyw)Fz`J(+r~T!JXV&61P}O0=|2t>K@Nbx+1EO|V*g6DF;z(?|@28Wh9FPz` zKrQHsmTtr>51v0N`0(oO*Vwt0<-H8A4JCuZ5dRy!%lQ@%ckIRAPnufnV@T(`N& zz2Zc9MGlecRD8anVsRJ{-(rm94%6s;ho*5TJ#n3&Bc;f@2qS}boo5FzvQRcV55EmR zZ=zgOuy{=BCemXU^Go+?NO>mZwHV){mPKJTZ2iD7;<9>P!|AS?za>mue-{J}%VW=^H=~wsiZ)%T(vqr>zP<0RDVJSMZU~ZBLceWve zzg*EC-rEg#7o-Ievdr%T(heF2#acI=iVjNxBQUHu8#>)Of zZyvw2qf>1BO^zOC$Tr)s+#OBFQ7jD8+}a~eL}E*UoiN_gdm{JrOE~f+mvPx`L(LV$ zNegvaVvOBIgr=w)CRkEeU0h*m&6`n-B&&LD?Uhm_SHT9T%^>m-0EFEQDl|W zt#~T5Sf*6$==cCGj_Iyu9BB=vn!<)efP;GGiNi=~f<#km&_Met&yyK!n#XX$z7zJLkmXT&U&@QRUp7(xw^tE= z=%KP4T)!|Py&r2r5YK1C{M3xsx+J?g zLLcqQ9f!9#_{YaQAxKr>ZuQMkj57;rv2)sb{jW3 zTC-{zp<|E$R~Wf6zoz#v;c^Jd`*;!^fWKnde%HF} z47~F&m+^>_Oi5Y`eNHmVfisd*Y(r0AV~vk;F{>-Xz=hHd#AFjPkAb8DXRrj|EE(Ts zjk?K~Wcm6;Dxrf!Om*c8f&Oaoo)e(9d~_adOy8UPHi;5w&auL zM+j)0;o^U70S57Qx5NJ@$NAmvn$9HcL~3w-p|anK2C`~V;Kdd6m^eNLfe#oatbM=D z6f*+iP@5t1XaZymBMD+dL_k&?_2o1&5#^YReqRRf&MlKME}_aTua?>L&rFpYpCsG~ zSTZdCoiuB-{JW3n*klMI+BWvkYWN#u)duexci8c;4GxVrK7}Bj#Y9 z4U5kV4qHjw?b3ALxTE!kWuo^mSs*sYaYvz6tLWpA^HuZ8R{0Mp3xB96js^9qgn4c@ zlCm$p4zW;44}_85p&rL*7Y^dbnaG>tV?-B`=pFPM3O203SNSFBF}k3Uu)oA6(Py$T zC)L23&G`Je9pftcm z8B}+TEm}?73#!(68yig%{-h!@aqJ?1_RL6(Cw5=UQOM+3^BvVD?Ww^%)!H4+!DOXE z*k0gz(PkWMp~KQHG#BRmI>S&`)dk@>?xz4t(BF%<#O^-|w@3XAf8V%WV+-K`?^rdw zt?x+1y5=Zx?V73mARr}XEPS(KR`K=+Xj1pDPVE@iRkkUbq&0U*=GzieHi9)pw6(-K zkd5o-%3k%`TuYlL(_RmjY3R=MFKOLxPf#`f)sRC6ruCilyy?n!z$(q-2j5%^FF0^| zSedyscL6psVO$7t7=L{Xy=;h$&qP5xtJ7ZD(fWl2_Po5bEvItR(V1Tw)A~0;a{zEU zuFkoZYGv8{@AZ3i-T69z@U)ZTy64v+R7msR55O!80E`=dr!zrm;c9=jAbgKH{CuRY ze5XRv8-}otri)RzAcsUmZn)T)%e-~%fyvAvwai0Ei$e+w#;C#aUa@cx(SoL!57H`k zNkFZPjoJV5pzCWo?2_2X_-nI!2eG(w^=vB4Zv{p?;sG@$I^`XOXN?pHj)%qsf%p|! z|EwU(VhdOG+NAsFb|3i3T(oc!bF-YKkw-Xgp2q-SrE$+~W|Wvc+g?T;GqBU}_B4AM z#2qTLKbD7Db&190U{?_hJ_t^=g;?yfk&3_!p!&}wc9`~5H5|{7d=4Cda0s|;eU0UP z6@wM+oI02N!`FkUDPW~g;{A(XRhAvI&8!%nXRRH5Q=?Bl%W&4S$TX?H>r=P1THpV+ z67EIxq#hMe^$3#7#%3t}MC)bP4?pt3`!7#b!qTxT>sot@c}kkLs};~yDPH|E@sA@- zjY6IaHPb^0UIsH0bL>iA=?Fj}dUu^S_*GcG9JYN&nnsLfZss+wX9%np$`9CpZ$?5W5T><7|KBN&9pFrHbBl->DI4TeV1$`(n~3G%ID6 z_Vby5UD?@7UFS=S%0McQyr?tPghSGM0u?Y4r|tC(6rXycip{psZ_NeE;lj&-C{ji( z>UBmnV~T{1tICWkTA^`dzTo?SkiVWxeRDN}&r=)%oe$opU09%@8%3z#x)oB^Q+!&0 zx23m((SssRf=6S&DmTxXIiEnc^>q(h)!yOF-K2h+7y8*{3r|EGLp*Sl%fQt!XzZc; z0%QxjiZS`^w}!+|cnGy4km!35kV>4Ga8qyL(^nK+rI#=;cQcl=yzyd{C-%MLRq2U-uofe?%W8hMtwEj%$F*}Z>`*MdSL zMK$=ZnyUG<%(WS9Ggu0w_d>S{TkbI5rRg#Cc;!Z6dGaMDU1xZxs_3CX@J2_jV1=zZ zZTZq7+Uc;r7XteqH1nVD+zlu&iR^<#^mP(Znq&a9YVg0kF&eVr#M9dgX*A~)>;u^S zWjJ+He@ELnR0qT$Uvn&Ys+ZIoaE>jzB9>R;LagqdD}(RI2I1|-ms;@1RjWemlN%?{ z_+v>$-%0nMM|B_7N~z1c55muXLNTu!ZDVMad^J{ks{$??ymuVW3*iy*IuJKmXK7pL1C;o`x100DFWF7G}^lh=0GrzZVuwXuQ`*#y_7) zLcpo!_dkdWE*b8Gqs8D&FIsW1QQ#lfCg3X=^ZmK#SG2leAMox+n@A3yuOA$x;&39w z<7b&(Hk32>_6dAi*O0ZixQrZcLVcrB*6o9OUPbyKdyJ2189R!r{nU40^ylh*);yxN zU-RDeJ+i99YxcX(s7Z+IQ>SQ5YRuH+=-;s^HB3HvQQES0sQPzDmN}Mzpt#L!W{}G>}FyXhxKG?9l2Mrf%lQS_f)(+(Y4WIS8a)NZCe8OG74+r zw`)%leyha9{20Odr#*rP<)$L4-2G5;Ify$_O32qaWy(vD^9!pCVK#tq8L9Jpx_28kye=Md!*$L+)fJBm8)j4ZwMv!OhRO-{M!vN)ng=*h- z5my@XLT}2M4yUvE%C<(V(#Gwl;%ng#(+(`O9KQqkT`_ahgYi zkDBp5mhlOm2>9ytY!Ud|FZ=`lTR;%Heq!ZJe-wd+CKG0w`E$q#>bYc}8fx!5Yb<|4Q>+jJy4b%TPl8s?nJq?{ zoT#`&4~q>KIa43YN6*Kd8Toq2{Soox4}1}XWLr55n2<7ZAX|QpqjW?7y3jJ(s|h@s z`IvpxjoK&-kVpQ9s{Oje;ls7i9vvC{nM z#iVCdVg+~jaeTbb+k=Ma!1j)=%~s7qWpcxng8er`4Gy^#+S>h9rGY;vY8vVYa;TJ( z-E}zGl(=$;LOoJ>e>2)@#mCcmZl%YW-m^++d~ z8|(cHHi~p(E{DTWFE0k`-Fv*Kajz;Js;>gNun|7w66lku%ca}d`@l{n=7IL_a^BYW zy3dlxo=L`zYO~8}Fwo;c6jPWl*8<|uM-J&*2;50|b=NcE;?0qkxS8KaqsQpvZaD5> z4Gb`1iKV}!-NI2J!0Vva@5gnaWd>T*EIEl1oxnS#)GdK<6B^J1EVJdEO#0U6Vd_)G zVE3lSv>OT_X6g0?uj+mH_*jW+i_AUZpZ-eel3>rjIsYGeG`Q0X*!|7rv=@HK>-yMF$j@^faf#Uk8@1=DAwSYc`P0t$AfBr~Q^H;^i z4owV=)U*2P>6#f&oL0VbLFb;sl)OxpYzzD~=r{`?gFE6*vuapLb9< zK9<(7G!eySR~~?5=3x~iH4H~zprv@cP09F&iytEk+b1F=9MY7VRnp*F;X7iDd~sKz z7}}7Vz{<8=c($B)MxE;wOEq)n&-S|QR}rTi-De`^F_m9}XfPD>3R}x4NOXfh-n&t1 zXD08Qb?8v6N1r?%NQYQx6$GLBT^>XB_0Y5KO9rBwGE-hRmR99{qYzE1nQfzhs$=;v zoS~-XWVRnbjskmW81Rn$zxO!sl))AN^1+QABk+U*RcSxvEy3@Ag@JDB0|{<0F^rJg z-9|&qEwoBxqVBU9@wffa^qMt}2i*-E(~{l;Po5p^O|5K*L|g=CkGfReNY*3+va&RT zZ4L=MB}_d&r5-BmC>P09y@hota%L8~sxX|rH|C4Gj4oap3S_O;lSv}IjOTazOw7F> z&lGjaWaXPfMG@?5Hg}Oittv+@Aes7fYJxiL$B=iO=av42OAGUt{m)#fH=c2w{r<8= z(Nvc;b>CErLho{ZZ!m<%dj4?}rYk~;!RRiN-p+)()QZiix2rw7gsqncX+Wx;c{d1J zZ^{!MaiavAcq9m6#$Ek^#Q=IYeeQ1|_WU~G2Q%C}|1=#?;WK+to6jXvUUS7r6U4Ut zA%=^5+-IN5iK&3F+bk7@`w7^bNxR>7T)y-OXei!zUAw}>&}x4#!$-bjUMqb28s_FB zx(+#(!)vz4P%@sy-MZ8Z!h-`&*i|bD+?Ct^wPhg!fIRvf(3BiFn}X}LF8LfRx_3!9 zC-%zoeHvM{tJq?3yGPv;Tx&S0DqYFsi|(SD?d;WXqIIeyZ?eD$_(n&YKapgPP|e7k zdpK3qdVsV;44|iA3T61&f*Skc884ero1?YLz09i0JlFYcZS?{*<7UofEuWvb?GePB z0@4SNVmWf9?lg-PiIKF?oC8H|epr1>fL=YFWv*vS`XcV4W%fWQ(Ceka27+~=bij&@ zMNp>Y5g>S|wr?kfin=I$Q2ob)XIB9l<)fHY zLmX0Q>phO;BPJ6IUYyXwKviUW_Q5}ZReV7&aRRu?r60own?}L>zyT?dD{j_9U=ouK zJpGJ5I04bnv?K$R+)@l~Hc^3sgv_yIo%{OCN%3LR2EGiMxf})sH|~XPBn-~m=PrJQ zZRjs|7=M!AaBV{ZyREZYgT}WlHAVACedj_qzk8JFq)}@T3Jijtvq1`i47Xx2pB$MS zFOU8x=b0vDY)aed%BIXO+& zK^}H4!69v5c&_i#*Al&8_eRlxIZ@qVhfbUbN$pq|8*KDv!;w5ynf8>zV?|Le+s>1i z$Z3x-!-v29-#3V^=)9xZNfrh#l4%ephQs$;km(;UCyoUpfr(OBmCQOE6_Teby*EI6 zlHDp$u9JawYyC{j1__RX%eeXJ7uq&^N*%EY@BU);b*b0Y+n`OQLPg`Me6T>2WK(qyTg?16LaStwVY z#zz@>={HKf=x24olqUXN0W#Xbg;042&-u$p;w-rDs}+B_)!GWl+x&Eq`_va=0nEg8 ztfK=OZ$A9uyX`$cokTN0jkfrKL6zC^MCXRQ*zN( z=xg1yBlnE>F9Z9xAcB`)@4eJ+QJG{_NZp7vg#D{8C|{l)tMh2BYN_K;<1-Moibx<+ zeQ@i?2H|}fg1G13;v0zD840X!yRJ@7o|_0>9e?Zp)<1mS3TrB9F5$8$Xlg^Y$~<|3 zVELZ-U67?84MrL0##EMf1Hp@!Ue6{~ES@7k7kXKT&E55)axK4g8k z{p$O?r4mX$CSH1cPBEI&ku2$e`)e{W?$wQ|iiwe(L+ZHhJbC&^D~Pu9Jv&J+0$Trt z8boQ`r2<2(xv}5Yml@u)d+|?)R;Ca#U zG*O;U*P(pYytwGK!WhVNO6*WLgdB2;dD{Vh!u;H^qmG|_1>GD)@cZxP21}awEFTp8 z4J4OkUQIB+8NA=;Ys>P@Mn2SRu+B_9f#fDw5*h^+b^TzqIk$y^XKB5wd_VF;6zdv5 zk28Rh(Z?9Lh(l`J@(wJ}=V3)kw0>M?K0Nf2)jTKpoLdhj$~V z{RrpFJ3+~57HSm$LuK*fKE7|rmrPXkc;=tp(8f!~W1Xb4y>Fn0vHxN`!r(g{kUp$7 zdgUbvKy;$mv-=9%xYCCJ)qN47b{|4OI>p^PrODtCsMXOZApbeISxy$0dTl7>&Lx`fy}HcW5XUs1J>s&2M#u;-66#0SO?{$Dj7w>jy#o@r$smM ziZ{)_1?onENi}bCYSqQ{zj+xzc4K&6x2V_iLr-{|(BAHYnNQo?L*#E6YK3FY@Adoq zd~`%Y|F>e?eVB|(9}%Wl&>s8QK}7k6SV}O}VM5t3LBiRaiD?-bDln%^bmqR~c4uA~ zyf5_JYA)u5_J^+HiVCQgJI0wwG{y@$WYf7hp`o+%MjCVTDdW{-Wmf4SSxU?=*_JW) zE!)S;?{oV?-06N6QkuE+c^3?Pd#{H_8BU;KALQo`tQJ2bzpqtMGG*5Y1{!0S}= z=JmGt5HKG~3sLwBamW2jI0&jQv0tnuu50*-Vb(At`Wg7Eh3>~73w4X1kbf?{TFalc!Kjbp}ylVVEfh^o`2Y}(9g$qch>VEwO%SMVuC;X#?qyvY| zlwBxSW!Jm9kXOaQ&zz_?c+5qX`DXJax5TFv+?IH&!~|b^d@!YMfp;GFM4)<#D5{_ z9leo4uigTS&g_k5phv=UBHJSurf)Vzaqu?0)E!ax2#{g@e&W8|6gZpu2=vFzCWk;# z{JC%@kL}OAyByN{bM;8Uz&q_6sUk{5ta5uKw>10F!D{N`OO(}4Sbhf@gSTBnYn_0K{XmL<%64A3?n)yHUwGpS$dSoyow{qVX} z9_o-SbPVbZt7_D z2)Zx+pZp_%Rl{9>ObsUo_`-pj-sfeY&i)H<$vt@Pp}VE;ePD(*mpxbLhkU+ZhMR(^ z`|szBvzaSGnkug9$^s#U^IY>E62`K=ajrFYV1@r=2+@Ibu2XkNH8_R&Z0oc zyPds|e#Eymt40(gT_7L5ntz_~NI8>@+-uyVfwoPA>&yEhJF+NUH|W=5l!Nv^If@ti zY4!Q(GL&WN&bPC6=LWo41eAYG8SQhersuY+qA@xgVy#^hk4xTmOuUmdk0&MNjb>?i<>6w90nk|l zTYjI^S}o~-uT>;^U*peMGIDG3j9$+xSn7gse>E8OqP5}j@6=lc%;$udXIe;)0z_S7 z#Z&FYH{6d|%*AvnPjmZtG2BzRRR3zbQBE8T_-w{sSDy6fLa{~X`gLn!~oAA z*jbCme)mj`Bv8=HsZID^^Jkvw4G=#YuJF0A6IKbp+n(f06+iaTxRvgNO%_(c9lK0v zX0Ny)fX<}yWpG7$n3xjk!|W)-M)0x@5^#EdEW>FR3MqCzG)0xB*3ST7&+H&9hG>YQbP zcS<2s!xYMSH^gJ|(Gkwo#$k?1Dn!w?Gwy=OtT+>io~j+E^bEEnp0ec7Hfu3MSG99O zk}Lx@V-a5i9ZF=lQQU8>;n|YoNXYiQanfWcb$gw@jHj1gx;l? zePQF0snX-ogZYT^fdOz6Gj4=yAsj?{My|^tOY1N9U{ja_s-GPS%(vX;44=I|vrJjM z<7d0@sp?E>&!P)b?AHa!FTeg^zwp1|SFeE=`e(oyT#^INh>Kbdnt!5iX*^W$eL;0BV%okp=n5+BMa!D)FmnpXxW#K2Sj%!aA zE1zaX~*>8WfJzJIoIEi|~>QY*(#`qAqyL0pnZ!Q|QZjQgS* z+5cYbzCK|T@Kj)qH+CRSQAvCJdo)fe@|CbBIJ4Whjys^Q&eoE7sB#n(%}Ci>#2`|V z*s`j#YCXFb``$W8{O_|V@faC4;377xGCX@b%>z0qI}=)tU0*$7f$e!*htk1S!38-` zjE}Oi*m0@^%Z)R9os=62u|*4NUnjmU(0>d0FrwT;<0^DvKsn22p<`#J-;h7PP4YB$ zla(781_Z;m(766jzIPDGy)!T?LuI+Hlyp5lYL+F=r^)1JAJly=(uNY~Su@sT&%v}% zb}m!D&PE$(`SZ|)KzcR4vu|kUqfu8+cbbT>JxE7@XhcCxsjoBeh>}X-(aj_=j zR?%X`>88+5wHA5@>DG5(a11?QT?qBHk=~C#keRauJKOy^%TZ@rBBrJ=FOFeJjOEDv zR5UinJP_jeCc1)ZB@&n3?;^mB#F(TTi4gwC0g~Mxx&VN3-pL&j* z;*l>+LI@cm0nVPgcm75Ah|x;px?B+OFNraLH%{wc+8Lq8TYOa>4sg%zZvpxp#_akm zsMSC7z8ST=_wt)d2yg#Exv&N%csguYO?#B3R)1&wY8KRgW7iA9n}s^YcP;3|4b~1z z+xRJ-klyPtVcKuT$tvbozUqs<*tKbeX3zW!#zl62)j|35vSKK$^MWd(Ps$^nR#kPr zJxzHQ&|sXgSE5-vXXED3lDQt^tq83u7Bv$t)A9o-_u1w>e+I5e+u9lye7!5#pu?__ zq(ksfhA=K;{L)hUwzb-W2lLMMhOutZdmm_+M{MItcVqX6x0*$dpq$GXmiNNS8eMP` ziU>gg9G_I_zhwIK;2t60(zD_|S2BbMW*QyqXcPl+q*RAiE6-*OQn!B_<*SsAoN(>K zXDM9kf3g%L3h&3w?s6SF3Eqxqr~j-llIyYzRwtnCTfEy@0jTou_!mW)bG_o8STG=j%m3?>P^@#d+eJiW@(etX58j~ zmi-M{lmm;5ELi<}?DwsXg!i(+Xe+7yp{NtnNb!)%qDvj;{P*wY&_}Q=n)HarRH0HpB(mDV_ ze(_npz{X;_$p&i`uDC*yD|yIV||1U+TsV=w7mAlQreh3Js7D5oo>@ zF3je9njhf$R=k8M)8iYjvgJ#D0=5PHPY2WO%=F2^MzYR7;-@mT^!;VU!t*>PZ`MXO zKWJn+4$lYF9q4#TRqwX9zi$B-s6e<0-B*r4l;tAW6X9Gm?B>=R>{wNZWKk$Y_6u~V z&L*lkQ^#idbdv(4wZC8)ALPyTW`S0#Viv!vVD8By@ZW0u=0iT2UMCf$=1>3Gbf_vh za0_354{b5vtXe~XyXB79$pwqe$4(%ZUdNck#}41i`_7c=P3ND!Hd6U*W#OQHU#zan z+jaKBYebg3^+A07RDJua=R!JMX_B$uNE2pb*mH?sZH1QSikzlFjtgWK=*2{%Dzz6X zzAp@#QuT)&jAb|3ugu1C;4>m+IU^Ln)0B_|EUj=sC1KkB`i0Oc+4o-V82V_*Z_exg zj8(sJ;xUk;EZPb+hR2h6XAlQih4$Jl#aW;~ilDBx8)QPAG7)fhTGe^o4?-neTSizh%Bvp=cFpoV)3K zOl715ja82+$K9wBUe2_?CoHfXezwy)q_r&e_T5%XprE!(s8v7#0e@`>p_;~cPK%hz zRbEahl7W_3*oXlg?Y+LivG$eGeZIFHLAK=jU4nb-Pkrru1yW?AE|2QaTLdnY261r3Rsw(N@D;6 z>cagzHo^X{?22@1WIC6{Fn+c)+E)67O!y_9R~ zr{%nA)QH-6i?Tp8gu90OEe>fdf=)TGlNS$y~zi_GCLdUZG>;b4`3!{m4sDN8e zPjO>vw7fvQ6pDp=h4lvQ6P)KuyGq8(WCrt(?F3p_j$e&{_wRR7*0LK-jJGI05C%(v z((sb1)UL1F6G`}we!b|r>~8ui=i2?l;2v`54u#ZN?#8#F>n@pL{<7P+_Fi?%(~}g-YEJ~=>IYG-9b%; z+tU>3y>|kFfJ#^C5Q>5b2#6v`FA7Spp$DW3gr)*g0-_>{G^Hp)=)DTkAtdyggc=~^ z{l$Cde)G-yS2CH*WG2tE=j_?tbCXV9-zu>7`fJL8>gZOgR!lDoOtV@fvEC)RuC)6N zBEQXduKSl=NDmCD5`Dj-;c~A3OdMr#^n4%Pogd~vb3+B9m&W@+5-ef+`XOJ~&T{yK z-{n!d=2|jq-^%%hq;2aAMG=iwW5NyK4;DWA#GH_?NR(tpJ4|ute2s>lAbE-L@2mt- zO37ByFMqcZd)XpWGtW9oAC{>^QANi4XUTEw!b#!aDM31C!b6Gg%p6slPg7?pl%7*u zq0F(y=RF{>{HJxNtQx~QT%E#Jo&NVS`G+HL9VQ_4Gy!T|{10jDKmPmct#={Pk|*$m zRREQ$$h|m&M589MTD2yDc9Mof`R=tb}J;ZB=&=#n93_}*@I zCH`HtY1&+pvA_;9@@radAkt1zFqaW!u$8Qp|2bRMn;jcr0Ak<1%pz(ixT`NKO?i~a>lePDWJ%NDNX-_3Y{X>Ia^|HV@QsAOV#3r3fIM@S=uhLzz&fM<3GEpM^Gsjn%v5m&D@5x zsRCPcwCAwu zKu3m{^X0?OxkHkiA21Q`Y^rPs!@<`9SzAK7L1W_F#<6_scW1H)R(Z3eLQXOf3J67@ zVf4<8V?DbeUg<|UrkB2~Mz)1D&0l@G%jHT(Ci{DxGP(f9hKY$u?a30W=zDO@rlK@d zCQZ*%E_}A>c0|Rxh!AB~{F`78-Jsr{73Sr46rS(2hoT@EZH6&VgPAsOV6tJePCC<4 zG-hWo!nR_2@H8GDyeYJn;d(>Dqjci!+vI*dwHJvJ&c=(vUbnX7ey1eh)(gR-vgTj( z&O{Q#wx4>YE`#)Ui)WcD#EI&y84b1sms5rmXhNM46Hr$plX`XY^X2cABgkEGY}Fa( zba(wD5I=Ay?-}+{ZTS}&?m1nibzF4Mp7pQt&ELX+q;n|>G3xfOx?TC#)RWr!x^WVW zu^a^#qX6e+#9TFbal%;5@eLao^%6VJ`Y@H&8?9=&Of!*u#%)VJdlx>*#I#*m8ejoU zJ^g!K@z2SoSfbPB;Z<{qM-;VB5qCAQLp<-wqn+R~(Zq9GrDyNIB*b?IxP8TAlssSm zHVDQ0JP=OPadjFs1x=~le1k<)KffXEJwx%#k8R_2e{Pamz>d`PcQ=1zIhZFZVK|wYnfHNPz^|l9M7`_m%u*;n=vOrNh z!npf(^>|C1hx388m~dUCK;yE@Bx*@!6vuD3Y&L0(hrlZvZd06S=#l=0cWJH!Sw z57}Yy@bhzp#hPXYE?_kkLbZ&5sSmsYq`BK7a1Mef<~9?qxN-8i+c6)XY&}VuiZ}by z>Ka~)95mZh6Hgp)XV2A_V80^b#7ghH#C9{|pmb}*KleNJJJ)pbtB(d~9s)Xs>ZZ?l zTbRFCI6j~};9MAYHBga?-eFOb_Q5?O56)uz9X0mTCLcD1!#vt_Cq$FcKKJjKODDKx zC(QPBBJ&88edUbMxQtw8O3pMh+ z-7Q&pkC*SuQHWuq_0M`F%1~0*<8LxEe+q>9qhQ ztGw8QBxGwgGaE7$8^i(r7mc@&lHdbFl?Xuj!M^Gi`O{9~PcT}o@xm=iSQgslp$SOB zL+M)xazwTQRsUS-6oiXVdYyySJlW%@Ie|#&v@BMP)3o4$#O9;VSNF*+r@L`I!tp&? zr)&}~73$)ZCy2A7>g8Vo(LQ7uUUT!K&JNz$vmGEJnRKBV-IaIofEP_=f=yy>qtkgX zu+UX%pmn@1wheqDM0u|ANK^r)UC{I>+qY$Sy*p3Abt($VM20B4^{btAq3-c(fa^JF z86VJ}X&Z)f=q7|NBbFlWpn)GIlqqB)?GayEUpAx-b|LKzU(~v|Xw#nr_0$xtVhocL zVq)m|*6-)2KH)guZ~FDVgx50RdKw}pFNu_}&!8GwI$&)|Ug|P@>D)1!I?2)KC_qeh z7u}bnT~g@$j`r>{skq6z6mK>B8p8Qk@FT3@MFQ?G2Xd@ah6hqZ=+m8D;Uahr%kQ@sE}ljQC(f@o5GzGmZe4M()4xQGE? z=&1y3EY)HW%fIpyZsUp`E`mpuNVXTqo^X~bQs&oa*eF70fk#nBrcDfVkzs0O2Cf-} z2{@2VF-ESIzCE#fPuzK)r!BVxMKUGpUs84XQ-6cOZ}1z* zwG@?)%`X1$z}{lXZj{f@2(Ta?hB;i0y~qGk{K?K& z<+3>HOEgo~1nDEUS)v5)GxgbaM5JcB^)M;3L^i8#4(```%^>DJPobugB|(W|Eb{_W z?_)J87pgy{o_)VMv2VTgRBuW|$2Sr8UpznykDlEUq% zGVt=(SvV?cHjTc_X+?hUCwhkW^9#yXZRuG_6{#{mtSLfR=V)t$9G$6vlts#R(lMkX z3Y~HT3T~y6c6k~*4OGm3MiZfK44Yb=uJ|(aT(UH#y}RxnD}gmt+f-9vTRmIF)U`SeA>*@ll4zzl zr5Sq=3YS?k?2CmnE?hr7UVcI=?*Rg;+woPs9Z~D}L?ap!Z%q_!C|9VhNIhmra7mtB zgLeKs@4_UQaDO(vHPfZV2G;OKPdloYkQB=!#Uquyk87Kg0<5)(lW-$fTa|x11>n)I*pAOK_^&{nuA@CswF640Hn3LcFPB?VQ#TZSQyzY={N&6*HB8@|= zzvW4&pXN2Qd7)7)d!Y}y@e=Sro-v24LQj$H#HnU-Ze<^?Z7H%ZaMVeH*Bt8A<4A$u zdx+CS>`PF11Ju9p>h*Dp4)6~WtU(vS&fi<7zVtvBX%2)Mi3Yh1P9|)(SSJNt6kYMn z6L2H1IeR^+jjWj#r^WzGcd!e$@UK_fWfk{FojUKVT=%^mDb2fUWKHn%3j3KW=YqJ% z-WKVZ?rYrsWMe2No{{W@a;uHE>LVKUa71 z+g55TgD_-ddGec*rzG0}nTKSYMlxh6My`zZpN4xIzs;@V9j1TK)!Wv96NWydj}{ub zd~_C0QlV{!x+Bf)frh9S-=X|PeT6>V=~NUfz(Clm^P?3YwlR^zP>sEJ!GkV%dI0S#JuLh4xa=|C?I&Y+pI11L zr3Nwo7Ar6nK&-N0e&#~_nYKO_qKV#>rMTW&KrUKr z`Z=y3Uxq<4G{IBeSETEf&7x>WVeV4$(epUrYjN49i?5R7tJ0GnJoBZ}mol4v8H=;) zJo!qi9YB_?*SGz4mV-l6z7s^H{1sw#W$`9!2w9D8#q=kW=6iM4_wJ^+a84jG#1pPmkBwa_yCe?6jAO)Io3`+s6Oa6l7F@4p z3y}FjE>Fc%B{K{hx;!VpZgMwc!(HsIdaRn&T@LnP$PNweMW~H2P7^XnvPe(S5uFOw zx)EckgWZU_O)Kc1ld~@HEX%PuI&XmL3gPmnRmbB#KSPbkY1Y>ur(AeAhZpY&- zo+^m0f!_YgAm3eQUyZ=(&Dv)C)9SV>DiHLC5QtA&1`BZigo3!RZr3ocwSg*gTCQAp z*w+`ew&A35I+*Q?-jsCm8&H}K>v~h|)B_U@Z4tYrg$?ddk8DjgiaM1xV@h)e zw+tUsa~nUQJQ3@dv|lja9yUz~GxSEfd@{&ilV&AF*;kd)o)mb$Ed~ehSJbz~)bAp$ z;k0aniSob5TiG%tFF79h;^xaO=qM#B5Neya!-p_U+wetFceeu_w?SRY5j>9nliOI; zm`SnACettWw_)nMvHE6j=iiKb-B8BkeEPi4W${b`7K}GUWseTE&cq{?H~c&5y`uU3 zF3v)Fe=!ATo|ObIP!U&ZUKy4Y;et`SBN8A)5O0o0%R#u~a!aH*YmwuFchEmKP?Hp( z=CLCv*Nx6I=!nA&$M-Y6KNW?`eek4GM0wzV6KAS&`-;AYk%Zh1S9Zfkm8+&{)p?aE z2S;W}rwpf&PuBp}pm{b>0@6*xA(zC7J^S*^zrvrua|*UP!NIreKI2CSw%vL)4^)YA z{>wi&9XZbF$do+fk7?Q4S_{&-f^Y%8_L@{Wj8ep+2g3Vt315Y@9aMs&w{$~AjC%yR zv&ATH)^Sk7O&Q;7Z=9yQQ3;V2a3#cQWBbxyXqQ=`Xrf~lOzT%TMpiD3PCvNv0`cdw z%DWM%bNfGB(u?_{z;{#B#qqvZ{^5Y` zgde}2H|^k}`$T=M~*wPzYo9Y=Uy@Sr?)x z8yN2)gU}poX}LZRxi{@9lQ{6eg1F?Dp+q9bi`Oi@rVEl$BW`;t1cLT&fu+~tZQj~ z8gzCLgKiKW*3f$FQOQu3fY@CK?>E)Dxc$du;_oLNu+8z#l^MI*vtj6g9BM-kNl_WF zC!otg2X=!AUlCRzDw7sydlO6Gao^4>?`klE6EWx1^9T6=ji6xnpcg0hmjL_q9K>0j z?{@kHqbFidU$ME1grMCRAhQ?9u1QNERjnmmz%70to9UxcDERG+>Wnu5))?=;tfUpx za+8qw&X~YNXMD`;{5m_==EI#sYW0Qp;B@ASwart6zcHY~5A_gMx9 z+I*!1X)*_C`|A^_?kODMBQ@J$0SA6S>+WVWNrwK4XR1D}T?()Za7!18Rfits5Y&4w z&SbQLuA|wam<8eLej1)qirOBvn&9N61z{Pes(YH?ZNiT6au@z=^2na8$tkDGDds#o`~ z>jt0-KWGal>X5Hr(|$+xD_L!6`EB=|N`S_=Cc^mn1-RpdX=Fw|Sql-&257uJ;v(cf z$0tr7|2_b2QX4W~{8R!O%;6Sja778;M^2xh9FOAu;UqpU zZ`7UEVVBj^ex2r}@B78#roe}3*G7b{Y%@xUrlH?)9ui=`rxO>0xVu$0896#+vD5d} zAjG}Et13~<+QB_oD;p^v#u=HJs}jU;BiIP$K0V_{4}GB^hf%jI@U#N*=&i(!LE%!b z(LH@72_cej+N0By>}~t7c`KdyC@k!4WEdHxSod4?C2J_&_6wdy>D1vWVcYThJABmz zTkf0(S|+TUz8o+3VDX`Ci(a|A zG(O_x6ckQ`(BsI$WngIv6Sv+H zHD!y3{5Y*0K)nS;DsNVUvN|Bm>kjSXkO=$ZTR%{+uM5FPb*Hk z(C>}pl@YrQ9Zwq&orv!d2aC^+XuB@c@I5sF!@UhTgS$83rjEG=bJ`1TcixVH+5X2~f>Lwhn> z5ooR|HX<6^?2xDq-OX7VRmQOGN;BrQxwe zVK10~Q8c)30S&xM0S*tF47bZPbl%-$MchcGvyn$7yN%SD+B#CqzLNAb=~=r(HKPVx za@*+nIArlhFvaH2LSCuCQu0U?J66S!=dB5Gw&u5rBT*3Lro{`G0IVr zp7S*f+=(lvYYRDTlWjdsA?|&`&R~fvpMHDQgyuuPEPQwz{42^-gZMceP648}QcYTJ z3-U^AZ1zcdQ)TLRewdL8Y$PUh;vdIIUW|Q$Ec)IUkB{#-fpWmWM=D8)ZTgcyolL2Z zUeo+}dro`3M->QtTwE$+<2cZAo#2L)P~uuGnY7+1K7vl=WD><3MofbYF`gHoNCpQ$ z5>bX_@w-6INme!s)K*JD;qP_(Sh7bN#y(k60KAlI`M^QtS|Q+umtsu^)DmM6@CF=w z=&P77xvUw%z;y@)l*3P#p*j#A5^5(>CnoY_<2EF+e_qm;P9u zf^d`n!KP=HF~uVZW+`c=-%6fdOZFPp5;0wtLn?6TdoJ2VJ+pVc;-eGozXk6^SGW#P zr$th#QH8GPmj6~_thBMYHX!tU)xWspo`J^^o3Q1Po@Xg@AbeHG%vC{2xUXH}t6;%~ zRL&Rm@(&Tiwlz#AarI4;db3_q1<;A?sZhp=x2iJpp%Mk0`@)o9trD1{WS?_&5SU@% zWdzTi9ZJaIk>$Pt`6bE2!gs0st0B`L#;+L&hu9`%8wI~+$`%c%rTWZM9&NOePE&T! z0p(9;NP})#m;B+LOTNWJEU9owfLe4SR-S*v`g}gO#><&{yR(4rd zsMl^>Sf2z$lN|J~2Wk>d$gi$`{vEMXbWH3=5F~xKM%ykEl`&0!Kq%orYTw||awGBN zmYihZD{?;=$|?6}#>F7+PF>?r(68d`J z+mwWHBz@KJa5hZ zXDkz);XCNlT8k;g|J4V5VVl)dEd7@t1(5x zv0I~TBdorg=~a*EzDPT{Uaq409TLjJ=sEk7#`|;({<3gtf%j((7HdFc6uy{tNTR9M zEnM7w(Q~9s5#zD6IdQ}E%3zbaR6{pdv$-&Y2)&KXMe*zyqJ?QkB9^WQE5`DKDJr6>1d1b%ma(*IXrl{pjnBc#|Q+wvhSP|?BHHJ!7cNd z;~Bo*ROC-~c73lrSiKI zgG)t<6=?b2MkqhuH;K8elH;z&T5ze`VuA^|nHY5BN(G_yFN;Gl#ENYWbS}RbtvA-- zmk`#=ggu2|gy;vQqv_xmaaEY8?oVhnV9BeK$W(P9OETMKFWnbm!`g-=D@fH zRp?#07B|$_pC{zq^(>9-J0?k5L>$ltrxiD!oA5H%Ok~OG{$xdrxn;0qGwS_;UF`%S zA`~?@=&sIa|L=r$fXn{DF+Y(-aGC`}Xu(j;m|qLunz)LG0K{e{;MNO#dSL~KfIPN< za>#~{4Uhq{ky}RaSOcwn@+CuN7~t&}3#ETYl(ko*k%WhMc41kh634V?2m07<5f-m? z0)=|IOI^SWl$l{~vm15xbG&Rx029d~7`YTRS=0%9DpbEvz)i+knra=~fw>}MNR7-FW2#ReykTg0OJlhh~;-an5aW2z0X*TZxR~t03i*y6P0UX_u~}7 z)Mwx+*10>cAL1W3Nt?&4K!=*r7bV=EPB(qoqx7d~GVKH>>|y6LO!mAY^yPQAGwzo8 zCpfJmVF$X_6^N-K5?={A>I-;$Fj(W_i@^{j3N%A)1yh6rxmJQPGxmXWf$52ha7Og~ z2Yu2SmTSjr{oxKKE?m2#PnPI}Tt1)qF5Is1e3;k@u>dX-~;a^Q;EU(~>xQqZ=H(3a3_X;~y^4AU7%-@qI(){izq5 zuGPbf0&g~;wgKFI|7dfbv8kUU<_<~uHAhglH%1aD2gl3K$`N&ObU!{CZUaRa*ePG~ zQ*`z+_-)x4BLMULO-0NTwq7>|Y#SufEmXKO2qIgr4+=LEPdWHSDr2_@@Y6Rn1Q2Aq z0zQTZUH|4uXfS&P+(H!bzhec0Hs0eMP~ksu@S^~QeW=y5FwzmduHbadBn4PK<_^`a zW(#r2{>snysO-aNpsnFGu4c&qGpV?Ucii;%!LL(JF0)+pRwB%9Qv7-0_HpHEUE5P> zKBssZEz#P3V?6Um^hzEhxPQ3d_TIxRExpiQ{6K+`ldhIUVr%Ne%9*G-#nV(z=Z}Sk z6mDTOj0oAJH+B7VrK$6lzHYf}W;IdK+P&K$PDtdi72$=#2em-IU!PN9CeNK2Xhf2Elc%* z=y~nL#Fg&Bnz$J}#I(+5x?T^zX`n?Q-xw)O*-u{vu+7M5%?8BHnTrG_qFoEA0VXL| zaG+TNLKf3i0HoY9sOB@xWK;WQah1y5l%1*DD9% zPV6t7{3tzVn;}U|B_qUnYiOK0h9k5GA}48=;6W|Ye4j&mI_GQCP4NO!`_5_Q{BHSL z!C5q6Z zeTL{plrO{4&UApe-&Pd~AtZD9-2r_K_;!O{{Vw1(y_-FfHov*E>l zOf#1RyRms+@>QCon3pv7EuwlJC{k>4b}hkTKA~L?#|#fEnQe+PxS$?0KiRZNTP3#i zRKg=GUgoZJjbv08BV)7sXs-6sM^d~TSlQS04~}pzckq~jP>SI{)@*S}$>aHl!Ia6_ zHuvSjpRx>g%dm93&GUQLytJoSZMfzt(2skm@keN2>>N5VrnzAz9l(heQpkK9X23S9 z*`xQGEmm!YM}B>@t1vh?`O2JE7$*5L?3R)UMgARIDUvSVxwd;JT#@MX7w1FbjrrQZ zcQp%@iEqGm0r-(s$9uh4xj-v1rR33wqhFda(7P^lRD|yv9T{?S-vy^}><4=K!|((9Ct$Cn!9oNCbg9hh7S{6<7&^6g8jU57~&tz>@)? zDSJ6J6+&yIyuJkvvxrM6TP^XFoF50oXBi24{1zQ}Z#IhwQMzFcL2AQQu1#NhizYN${#lFA(Vn}5@HtLXej}6zD=fdO8uhA6q8#f>UV->J4{Y|ZHlU5 zT*XhTiMLmUjn5IbZ|mA{3!hFWE_E)ahqf%JDONtsE&~yf{xkL)O464u7?GwRE!y?_ zg6V1$PI4jsuWWLj=}M$d|40~_0v0&10u5g2JtaMCE=rLHEJPL0MF>?hQe&g(2a%p;ySYPv@$AqlL)N+7>2-%)`$yk0f3C3D#@9-yTsXby>e}ygB(fR~}cs zE1&sW%xRQoSujSn;BwH@SCIo`t;Ab>3MDR#{bHT`_r{<(%H zwuut6PgX?kztcUvf5}Iyyn}9=9j&z|$jDK_e6Q_~sjVkVU7zMd&oY%sGAaU3!JZWH z5no6P%AqzS3NMF0p%`ihKg43d5Ib^*qo{j$xtXL5xPuGFO}mbV;Z@iirwp!izpMd| zYG&bd=T%m#Ij%EkR-oTNYB>|oq|D9Y~EF=Kak2?@j z%uE0o6QG~;cuJpCiUJ==f=bT0UGRB>(?HPx9py;GDg$=K4Qy!o1Q(?u*W?pk(uiRf z6sY%%_nNY$$yqpd2AC(9)FEv@mwT4*Bq|4WPMVMgs~?ZX68l=M@emS^uwi3Xnx-Cn zb`nKnN9FP8l}#odf%#Y!w~fSIIL>nfbYBr?*c;RbO}LH@7-M;#}gH1VcJ(9Ff-@I70mm8bI+h z#1$55P}seV?1N2rzjNk)W1{G7_(l1+@8MXY7a!#I#04R$q*uy zt!_egQCMeoBswj;nFDzAZ0G7*0*r`ftOo9@^ zl_(h~xE%h6W?#5X#N};L&EUy(#Pip-oFu%g>jG;2K_$4CV3hneA86uS1}^VC!5Mt| zUVNLW=0t;6ji`2sFYuXuBi;N_#yrjJRkzg2Y$+wRE9LSE#r+|8i1*>leeSi1Y{hX` zJC@gfwJEI~jLa4PSjF&t6^yXS#j_&5r0u9HKgrOizqRz;KSHss+|^7`fxm~8j_?3{ zD_R5-AAVCwN!1-(v)ts?C?ub~+~iqXdOMZ8IortiMX6ocTK_(6VOLlbjaYwMVFCSR zSGTRJ0rZWQGtY8@uV04Fo-W7zRi#CAWE6R0-iO|v$-S-N?gDi_u{3^nF7_rvu4;Q2 zQ?WBWd^=(!kx7@qb3?=`D5RL8B=@y;2jZ6j@-Y*j`iQi*;)-yA;||F&sOF|F|gfea|;%W2n#c^d*^gq-=za-|`6 z)oHhmql_+~ljK?ZBWo-{a=uiIVp*sbOCEmwkGvFt0#1{m<~%)9xz2WN&<+GJjjigh zGAAIhFi6|5hfmT;LVeELrF_JZK=sNZpE@OA!(yxVblx1Zw=tUoAc=6|UF#E7Hy0}_ z=$2o|nGrnEhly^Zlm+Z-k8d!%I{1R=HFv_#!Og`TJVriv4!W;gGFP41uXSFhzSK7Y z)vvc{1rol^b!4M6=gr$2i1?A#r*fgE87ngm8s^^5@3IPoVr{UUZbbGypaY3Bz`ey{ zij;sYIluzY3WkQ>EpEC!%1Q8<|0z&!-vZLvgBJStl}44Lz;DGeW&KDkCtRy4@f7hi zvScBIo5X}kP6C}x5nj@W*hoyZC#8@w_SaxFRhTN0Dd z8RVnG#V5>5k_@ByA43g8S#i@E$X<;&ETLJ#nMO{W2d&3iv_F8=bo0*|w!40g^;pkj zTH2m(E4%D16aEq@^1iEaysm`s(i#hwgRXiw^#n~B6zR@~;N^%vTH#bJp`|vqacOf4 zU%_aSzsK$3eAMUM6gup4yq_F2BG667@K~-{Xjo9|QsQ2-K+)Mw8R~B8T%&zuvv^OW z$|JJ7>ncQ7nikNe2WkFF2MivM!3?H=8HhK|xyX@|*azhKs*&}8VKQQ{TWVcO$3v!J zpV8psM6Uos>?^?C^f!ouX=rvHY(5w5IdH0-3`zy$4G8Og=cht|*E5KVpJ&}NLZ%Zs z5GpqsmIkC8(kSeivA@njv3K52rcLKeawi2g7mexQ$Xn}~I8((IQ+hM^9#ED$9_otT z!=X3b1m!)h@aXS-X3G{XoxKx%VyvGX+jsD=^|7VCs`?n%qEMxKZuXUG4EhRh&R_9zsOiIiYWCc_K=la8!Gv!qUpjU4ht8> zvhDOJ9idaD^POG>6m14rHpTpjqMvVQYqb*8G)!Ey3I$u}UWPu%SIJc5%@zF#(jXQd zh#@iU!MD+_Z#E6K#$ETbhm9~>(R^($oet1TV0_1|Sg3t{5_HcdTl#APH1`$sOBfN~ zLr12a2@zU(6&9Jv;3RKvwaTs@S9XhHhE{jnw;l8PjO_8$!8QT zx+k3!*M66UDvM)R&_~7KE)MxGGvK?&!#b3M;sU7)l^eK80Q=xfy}qA+X(aq1y@MFW zB92-g`7WFg$@so|Y@=9!Jn*YXZsLOO`6nUu@=7Cl#F7DWH$A({6*l?OBVe2OHBpPD zbukCQ-*UQm(&_>y8f}=uwZMe@4}Q^aQh?!vN?;L_Sg4HDjcjyTUC7Qb!u9!#6}1Dh zmLnHU%Uj!yJ-4P}tgQwEW05=wmqtmP@TDdPUxuCEn^e9dK7`o}X=p(?c+2T-1vs*Y zN2JV;0O@FK-f)AG*E9EtSLR42__^aBKYc=|Lc<%NSG%Ddl{ERb0te76mdhYx@aOzP zqBqBr2Ng@^o2@~Kzq129883hmSh$)JEqfS42iI&(s7-qd20mbYsko-$=cXFi_(-M@^cVHe;De%prT(d?p5ii|^QkWykdeabz+>aX@WGbWE2rvV(=f@O zF*7k&<{06py!^Q>L^y%7`-8Bt(*=APF+kAqG>L0k0V=u?Z}4R`iW^N2cSHztmx+c& zbaydZH{0W%nQRD-ufafK-HayaA z%~K-8Obx+rL(azgTQmq4{7bkXTClT1hTu6$J6gWR?KT6t&N~=nBBhv^u{!=usp$pfZ7%0LyIr#Sd*qIgs7fIzw zY%*0!u-UtfD})ZuYtv84n-4m`7;kRkF8z`NZUww`Qj^7yqhGP+`@Y~6l!*T|U&{_8wTqx+ZR!Tm zhu{IeG*{JJv~${Nk$%2X-AOMMs<->?oTW9vt_l57Cxu}lBWW7VGiNSofAdTbkhrxp zu-AC@BxDmwyfY1!?k}rc>pd03OVF} zD$G9XfTjTd6x?rf?DP(xTj@Kg-vG9A2~F`!q1NagMK~JV0~%o0y;o@_Jmnp}-?kT? zXgYg?$SR;g=lq#T z1M_qtqn3woLOU_gDes0*4y^c7ETY6KD*z95>d9??mk7N|E>*Et8;f7O=(9xEDWYkzgSINn(yP7 zpy}e;LndJMHV?cW3*S{_x>7J7$bauQ%x`X?VQ@sXd47Kx%=Gy8R$a|~SU?0sLn{AL z2i#0zQ+wT5dXdbyUh>a2p!p4$+h8D7yL~767Xc1}vhy!GA^Wn_9LwBA)za2cocJb<%!u@sRd?*o|Jth-?QK&n(;l@F5B*1u7nVE z-sWAdsrv;P_!_GvHJDnLVNq=){SWr_{&xRhw@ho2hq!Ql--kd1?e}?l zt|g0_qmZgvk{3t!VHV%1WzX(Z>cpeEy7Ws7j|qVIPHU*yHhIY+01 zXU=XN$Gg7gO;BbS_*h=B1z21~f&6IOgyX-#9}|>)m(`)X^(#ZN0M*8F;TOUp zJ(xr)d3Q)(#y!fEpw$sR%CZn3sj*+f(w?dF%wX^Nz(T{~UU~~Mtcx7rHCX~huoI8r zL>u1`1Tf`0tQlkdo(>O@q_n*yo@jq~1I!{&@0H@>O=yb8KmknqW-QG|!Rf#bXp{pq zfg6}302JL&j@7zy;bX2ZY$}(EM#0nzT}o(+_C0rB0DoWOB?)&MiSFgwu)r5g&LcwG zMIi?=>NZJ|!PJ&Abw=C{Q>ZkGe&z1TSR%fx zC~>5zvRSkxe?i}!50J&^AscB(hMY3gwB89*-u|8G(1o<>ZL0qWL}-;9qT-<^H?N)c zPqi$9EQlM4U^1n%uqgu?TFSnLoU#s=vskT{GGk;Erdj;lH~b=E8`&4g7)Qn|8<>(0 zE|A1-_cEP))2QQYVo12beU`lv#X<5-rG@KYrM(tuof}aqr-#|todrmH00fCj_aG7S z4baQTA&y{{u$N3J6G${`$3ow&9^vq~v(<>_uU7Fnv>Vm-)_iO0zK~q*RMKN zO#!h-Bm-`!Qig&QUZ7(KUf1QyJzG&cjE>*_!EOz-h#Me^WVj$&2(giw|ijh*7BZiC4H3QeJ(HcBp6(#gMeelRfWUB zk`fjX16Vd!JY6!>5l<5jy}<^!!?k78f+n#e;)ZrbEW~q$1dC(_>fn1<%$Ne0vc19z8`ue&FtOX*!;Ym0s$ z0X>o#&LgMQ#rtRnUQCz-5t-*tnt(RRpp5x7a!4R?k*Ar_`>YKlz%K4{pZivX3N`@~ zC#iLEHDqnT!HQJsXMWxFmNdM1aO?qH$t9xX0yUI_Cr=2U(1$~3@d0s81B!*X7bz+2%E z0MikxM~De9S}C39*iDZjbX1?$^R$s%4cVw48SyutOtC0zZpuY*50l~`R_<;O6WYoH zZ>w(Q6}3{IaRohBlqSE<;OQyaKTzYPsRN~?jIJxuhepuv|A@t9y>)}H-Nan}C_n5TSN}))V&djgKLreTw zI3UyKBqjV^;hADG&3N=_*q-E&;v|q4sn^zhnYQx`>`mX6COm4hWG;Gody-~)P)-6| zf^`^;jS3UiKFzyKG?|p0xpbX)tl_ zX*V>Ql+j}K><$_MnHxw4gkt6Gxb)-S^x^hN3&Ep}YmJ$ISk*U_OT(=KyH|{L{Zro_ zxQZ;ZylHQA&sC?~yg>Z|UEhutP?x;7eT2F0OGD;o?Sg1RMf#Aq{#He$rY|An!En#!~m zWf&=DsZ1#(wA1{+aB}!VpDb8HpT>P9*0iWAQYkpF;*s=7&)r@Z<3CrV2x1@#maW-q z%kYL<91SH)TT7toGikzHT^dxO?+tz`a>lm=?UvRF`dbquv>ifaxaS;-;vfavNpSR= zOs#65#qY?xU2j{cRx?|Fy21}i@#oNlCnzZOprIwEX$uL^#pfMRiTnRiM*z}M);+Zj z`b@yY##uK)f%tkE>w;!E_rCT!)z$-_Gl7NrVKIv*zc5d$E)g3}DWUsXqzPf0As&*< zExFw129F;f(V{G45sK?caP8zFlFaE>M!1M}b0@?eWLy>D4?tlgYc7llN=YFue90%p zA1D($kUxLP1uWtrJ;cRBO7NO8|C0G{*`L5D{KEXN{w=6L{Vui{9(H_HB@%0`LhN+G zu0o06c4g=`^3{rJ&gy1WB;6kG;WGQIRQmbMFHFCvHBM<}rd_S{eI)Y@KCLlz-f>=?(!AkXVse5v02o zL_wrPR8YDEX%M7Y8fgS1qy+>8B&2KUmhSGZB^TJ;``rGYnKRGKIl~)<*%v$au=|Ve z^|?L{WA7!s_qUfnhSj=m$Hi*6W73Q-{01}Sl2PpiYhgoS&3+8?=e7ufp@plB;nEuY z<7O9NubHFDF~OHB^0~+31r%|`EjsQP+SL~BrCvDS1H`XBc50d5O>Dn?{?( zY^$+acE5sMl7|3Gb>aA}7Ml}+yTD{1YdhkLpX_p;)kWvN#!j-6dPT3F+9{k4VLn2i z3NV=A)wD-Jp7PQFSKAht6te=}yMXB-ihAz>R%zFp4;$Mn>4=^}+6|%*J%5gH)%UFl zH$R}Mo)j@wzuYf-8h!AlGO1Ry<55SilErIv#_uoJ+=Q~Dplp@p_Os_N2$gpsUlmkL zf@qd&9z&ErTPM!9uDts6J^SNP{eb5yKv4L{Y|O17v<7L9_FU4z1L0l`8@hpY*Yg7s zSh1$(N#RWI#zu@l&#iZqQ_?PN^NwpQxcIEZk!ofQu;t2(xUtWFV7R-Cvd%s}taoJV zL=^Qa&Gwl9oX1)Q@8xq^kZtUu<66%=)^6<4Ts3MXdwKwRIwlXg{&lb8Nh(-7SwKD= zD*t%mNma_35izr!Tdx@tGgQFCi~vVLs#Z_!H*`j)Q@p43S`+7$(#Y-Wa8&HC-5Kx1 zH#C4?D7?oKDOXB_{fUz9h8_1dcfcp9E?E0dupLhthqb=&<&oxws3x94os&fR&y?xN zs>go+&C?MpWj1XYCc(>;KU@4Ha#N zsw0j5eJwm}u0|fkw;jq&>+>Vxe`k1Yg6n0Bz>5rU=0utt20Ov^I9r3`f>h(R`HU7d zsf$mbY+^5RNgyK#Du1Kuflh#g6d_I{q;vb6+;6)7{lp_-Wz6sM+CrE%wLRFf0~FS3_bf$LP@ z^oe-iYePT;$@3w&S|IkyAC1hv+eD%$1nR7bW|8vX9BS@6w) z?lX?qRs_M!wjSz1_aw;Z^BN&-HkJ0{=9}p><DV0 zVO_rlKrbW6My-5Ienu8Vpxh=+H7?h00f(5T%QjnMw2NS5q+-WP7D$#5+yTyfP1_lm zgEFrkKTrR-6ln8)EksXYOniW?Z7XJ=0M`- zxnNyeKGyw*z9(An3mp@2hu}^PeRQwL@8(iw%>O2?cF35s4+ zhQ#9j+V|@7{CqCBmm0)A3~gNbw*O2?naoK1j%14tIPS+784>Z7w5fpWA5 zS^(K-hD79Ln;~*uKpURt(#6j!lYEUza!X;KcN_l6A255KO;o3&Dt*sFfG{ZP{);HG z6Q68h{0$+RD-+F*vORe93EKhWIXcMniy(yzp)a(5U#>|APB-X|^vF8$P-Qw+LTw%nr= zuqF=O=ht{I{PsqkP|J;ZFJVn0RBAkLZ1Ct!qE;4jo5q8sRM%Gxnd(nBfD5qZ}vSuKdVe?l3;^!-X9h;e0*40e1`Jp(CGrF$O3aDQ*ZsnxtaTmwXIRc zX{e#xH*SG6P|Mk_GrT{9G4QvV%UPYm`YEq=<-1fIJ2Y`3T4e`pzdrhoz|DPUBFoSv z|EHwT{eXm?lyN}N+0y8a&hc;- z5Dv$qI_Q!^`d$?^Kk5~t#-_5=?f16>&0q)*G#mWXxI9F5!%m$g-A{sTaA}9=(E=IL z8wslgRPr)RfJ(EQfb3Ps5J_G2ep7mkF|~a%@+ig@u{yCtw1fn1w*DR4<;P7WCFMC~ zno$Tee(lW^yc0UajLkAeQU9$%!N3euKe#kZzLt4j%k8JO2Tx5;x-|O^A>B)1<$|9d zRSwqQ%EFn_y848C#@0Uhd|{TKJIIYz6lv!B_~yC>K_`AVui;yF0YUwN1;;5+T!o)e zx%F#4*Em>ySA1G`D7Uy3!>Z#)0NEyUYvYv;0%T5xYnFEed^J(?f4wg$!!fqufL%Ie zjapSW`!0Dm@3=b%pN{N*&X~U4yXiK(GFFZod-x=wNx<{xXU}d3{C3RzCFNcGU;VEs z>J}Gl-=)XQCv2-(4RJQ-@}Wt*o|LRz{Tzb7AKo+FZMPSnuCywJAl8S>S=uOR+4=nS zfUxx&>1Z&(M{#=+c*`e@bEeaF4-EC}a~U%CAV0*xL*NG94B>JSX?^^wZYBph@vwG8 zM-d^DZM@@{`f(_!aDBjOQBcvp7nR!0ibO!zyfsuvimaV=Ieo{}v1Q)@g=6 z_hU8LSVgqlvhdyZli94u+ZH!aN^1F`-qd;dIlJb&DzPp>ssu^?yL&2>e6_bVx_S&{ zJ7h_9vs_7^3PC>v`^<+c5K%ci<7!uNa#G=Rz2*5kFh?PDB29I2(`RQHXOt!?K=VY~ zIniwOcEAVAzhF%aycR~M_!~0`(3z{hj->?vav+A5R$(0UL7WWg@v_fTt zKNaHbtWPlRl^;drqct~PWe9y&CHrJA!iUG4(BYmullK9IcybJRmkSPqRNb=8IMB@` zhnDC$JC|0;t=2z+G;JK|T@PfcDREGH^sYmU#FXvuh_Hd*3bXW`gAdEAi_t+ZwE`pR zADOhiKztP{L~R#mfTpwm82@%SC_QtwK_y>KiD4;++wk~rg&zfu{PSrVQ=v_26-U_-- zq7B1{V@AJpWOzu1AAgVnRUf+sq07%Hy$gRaNW-srjS1ciXH8ao&{f~<)^&X6GbJ38 ztcqvW)@{pCJtDLekmfzAz52n<>pZx$YmHt2E(U^(Q{8Hfr|Vnt2MH_HHRCKXroSS6 zw@@mt`gFtIwc%{d7`kemHYB`$+27?jyh|ka)d#_TsCfM%ZB;Q2I>9v={pEsd62y)d zD|9qHjMbg}FiY=7B#nU~q@#5d-yUxVZ7947tCdn+&B)thEQlsHWR}J=zENq2x`K78 z;OI@Fmq6{3i>#QVM;#0Bmk@k*+-tDnNHnCVIc62kKt#@3X&o)pUm%$zb%&+pb~;ZE zkq>Q41{GZ*lhmZj`&>>{|K{V&4_&r9AMK||1XL2#(&JvWq&EKw*h1@Z2R(uqYuogb zsNi+Vk@=y4=Iv$}uR&d^O^t_h34p1?J5#PlCP4?43VGM4-Y_6W1V{ zU9jHwZ#QY7 zfL`HB77~&4Zy%}Kc2dW$3^3$-%C-dJa#LXZRCm%GZ3jw!j84b_!g-W0O#MjO z9XQ__Y$;cPgbDzE0B6)y)(VJIyo80lnhbPkq4IG{m@FyGhYL`KvD8`)ltQ(yMk;^K`n*P5;EL&^T?< zd@S@kinCNh)m6cs`GRS*cE);wlli2pY`a;&VUcXEw4wFX-0baTaFdKi$J9>ZZw=GM zZq)dvZE+>1EFO>OiUxVZ0r~U&v9?WdyBX;LUhzC6Q73+yN`Ebm0uTDu^0DxawBr5m zOa1=#U-#$8SZ+9FF>s(juFHhYL_iraaK8Lg(cIxM@4Gat!^CkJ79j1GwJ**9&y&K_(q}Ze$qM@ z{x>9C$3LOb+qYj3$#QoI%X}xe87^3Ip3OH;e~|e{Rp_8Ehs3&qwN~`1bQNYF#UrJ4 z&{6!YGT2tm`F0oHdmYe$30=ur_!b3E(Aa#x0s(hhicB|!C#Du}ofjToWfrD!Kl<+Y zunnqIA6wzKjtWd+%=cqYE55&RGKnew8pLH8?VNGSyPu+QjboyW*3#IyNdQ|H zPiskmGYW)X^C+^z(22rhKRrDSSYDX-=+=5E@`IJnyLs5(BG=W@&ftcY*j~5& zz9abGy)e#wV`1sIY0yhg0aNU_5eaSHLba-(&?%(O~aDV49fA^&fb)t`Yo^p1GJc5Mj*51 zB#!ll(u&rBuC}QN@D_3+7O2Z=yGq>6sq*-raL8SJ07XqZV_Juu#b4jY+U+g|zPQI-ztbe| z?4!*f$*$4bJ8TiEg*NbYZ4_0+VcL#LArMR@K=72?bHKUfzdB5Kn85h+n{SsgN9X5J ztVU}s#~&zr_pq0~>+P=i4A-N=D)un&g8{8#b~H4L>{aaes}4AIwO~^K1@J?jo29$F zS^oNALTLnCgcRr!l)HUnDz84laImY&LVzA~FbM%?0?cZ6Ju8#;Gdsmz$PYiX@2s6! zfv9i_YjR2sS!)?^lS?kByF6hbE#}k|&a9%cUtx>r=#S}u7ka{VQW$Sm!8=M&MH?Tx zpdxh_o3oNN@lUTXB`oWB?3h}THXdd*;=*i=qBamik2Q%!0KNjAAzIaV(OjsGhkZiy zz})XfGNWraMj*^=<=omT77{W9XaPsPs3o5nqv0{m0(m1vi~y_i?&KjRxPPFpU9=`L3t`Y z)#o>JgV7axHI*u7jv|dV5Au$NT65u7TiB)r>oL|U4o{URyCwMf zy)8VUxhy$yHE3*tx@fcEH`^6S#!Ugf-Qlto%8~j62^Y{ zTT2t}moakaTj_FMiPYRC@o`%=PLc*P`eEV@C|fw|of`W~iVS%ah3r`l?4o>181Y>1 z7KgQoX@3%XDm)~aN&k~p{-xER@}1FZ*!QrmgRHkQNgF?!^j!ns&y!J4Iv$`Ja`K+GK}l0c4dRwg28ykL6ucZV7s1aZkoMKAWlyrMo^{(5 zhjVIMeHAQ48`rw`eSv0Zo24qa(9iV^qs}Tpte4odm6l?3*UQ3(Cy@z~UHU1tPxMb^ zPCu8EDD|6F^%4iEcXG~OsA7-vq&|mhd>g+>eMoqoKOF{#lV!2|yhl~e(nJ?XD67!$ zCp!o7`uDkg$5Gue^}t|?ShDnwJ0e!mjlcP^2@B)MtbH>hGy~RzXEm#ruS)?=jI(HD z%0h@`GJ5PTg;gX}q8U)DuMCGq!!asWt3026qBD#VhvkdpJ@54JzL4+zVy+-TkJzUs ziVvTI{J|w#rI%MTZ{NEiwXzGlBGC@hphyrPT-mGe(24)LR`@?_U7KS&qBzCxUvXH0 z?GOZg+9}e>Pe2cD4Z#s2aJL)b4Y@efcYwrqF#qi9waN@#iljl{)J3!va_d|}fXR^+~)LtN{RMa}EO(FLYQ zYR0%{MvFO3;QF}b)GdJFfWPvq08e^g=Ib4rIE5CN0<(mfNkq>`XFns(H1#UY)iz2h z?AJ-@B7ZK`PDb`p;Yiv&$b6yU@48{*5#+Gh-I=U7SAOJsGBeRK?EG(JV4c+^avxb0GL&&a`6F(JlaP* z=!7>bnrEU)Kjx>;Pf!IwK3RpBq)7)F&^Tw;eZ+eflpB;Ea+?!h(hNM9w7&Ec`_$1= zLX?*AQ(!6f`|kHudPY0KgCyL<iYD)D?x(gLLmBQ~TKF02 zy-zOP!8!lJG?d69-LS$tX}!$ZEX9dVkin~*(Fe!v@1h3PeD#&bEN3iPv$QsKRMlCq zH*q07VB}Rn-bFkOW>idt*;r^|R8^#-4BlT1r1L~c@$!FI0RwZvN5O#WeqIOcb9S!t z`?s)k-(H!9_T9inD2tq6n&2D$dmuFW+5yt>tEa0d8X}68sqSY0( zte|8oA!s2>(t$)|~rqH|ovE1ij?SQP)Y$%PgME072qMm-e zN&Mf_UcOk;FJYC|Sy4-g*IVYvo$#KU?4f@wK+gXR5W#6dJIn%A^Tnzi>$d`9DPr22 z3HkRCkBkIDqSH(+$sL072-cQzyiQV4ufTym>}q{YVU3~tWLE+~`D1yhDa;qBLC{q1 zH>9JS;N6hMJ=>Qpy(p~{3n7E?pi~ry>iA7pZV3l81<98iSI{$d0^v|L!Wi%5lqJvh zzX`_(%(uO^ghX}z%dqW{cf(aP9~A&L3gJ zq#t3`&>-OsJ8|6cexPpzwC6!S9cZ@h6FP>P-@3Vo5cZ2wS1jW_ z#obyevzJL@#x)%q?#)|SDp8W1y*bhCDk#D~8VqB*^kaFQaF%#%zv_{vf$t?JLm|Y? zT!)ReW~K}NK*fMs^u%bitj&$4ia4Q>VV(1$PIR7Q%G>ro!p4*;<}&3N9<`&^rWV3^ zqre>a%XrwZrGVd6_7JNnwQAIy0~W+$`Mz$s=tod;x5ES)T=syZ9f{=b*o3M!s&eN# zEXYBT)JbyhNUwz6&{{}y8AX2y_Znnwx|6iQ7^MeH`T0*&y@^VwW_^L=v*-8;m6Z~j z`srYB{|ffHR8+nLVZ(9rdlhg2t1`L>`gc)?UsteaUWdF$c$6b6Z)XwVcoW!cj0&~5 z`Bv}rH-c1eQjb({TB@{wNJ#3lQ^^{>0)~?#E-HwGgy%E91s(1C%G5X-(ZJXF!_-HGBA?&j1bs}$lz--X!EwCOzSRpRLrhb>cy-x5)pSPp^?vPVc zD**~uHQ<_J3MI$O61|cj^Poq;xR_;1l4fI&`liiqbRF+zKjOgrICAVq9y3`_My0l3 zYO_>G%Vc@AGy3I;Oq7;Nf_nch|IBfeWZ5N=c3jMc^d~;biYFM38}WVS1j?7DN?653y?&?GgR7Ks-qEi2Kyuh`r`HHa1~L zFfh|wevg`bk4|K+?2Mh)nzl|*Kv=>?7oS%X2e*n|gu1@GNU*buu!s=vPYGQGSsA|B z>SBt@7t8KpL5xb9+u_9e?UWEQ4twLPj3 z3iM6+$jl!PLINF3g;+vl&@9bIY4YsZHzUG{$3sY-*3Q{ff6$(Q|IY=sEpA7^JSXS9 z{~+CKSM@b?=9&?k)pSY)taI?+c5K>x=Ybr;Y?XNqS>}Q{Z*yqlwiO_5*Kqx=lvzO6 z5hVQ3IW6!SQ~Y_5*fa2mhg~=y|1ND|0D9q&Sg+W|f7@zZekgXU9VSb?3jd|c2#}(T zOHf&xkdtst7G=aBW4ZZ<=v)1+f!%|AFD$(tj}rK~xP8w$`2K6vyO%NuR?#;J^M0qc zarCApIEYnZ0WYQO6Hqs$0kVh8CaL@slaaDx=>E&4EAuHs+LL47rQ>kd`6tWbPZqF; z2tqKor%HCemRR4#*A9%3YVU%e#I9f^aVDOw0oo>FyNH@W!+AqQPgJWP#4_A#! zrKu+@Cy*j^c2cYElV5JC_v0nTQG#@j6H-a{P1kXIgN*~^6GN;;No5Y5mOR_4+}h4B ziDtszJ`**#mkQb<;Y&IDi|iwZ;=QJ3;OX?bhu!1iu=H`#el^+HXZn5&&TvXx^2i>b zu2P5q?SVj!S`;I`+Y-Ymn;8b?ejAP3R!IMAVU0V6&-3roSK#Y@pS@l)K6yC^y#3X` z7P^R&v;|0F`#qEH$9hEH^pAfj7O_GbPhG*-*4{h-y89{1$mTBZ_d8Em zK7|$Am0*J59LS;TU4Nd$bfIVXq)(^i2lh)KR9p-HJ^Ln_OpO5g~%ebYd784RAT{Yxd zm`)vVXYPUIeIMz!J?}>oIglU7yvnZh?m5;ryoiQk0`lf6EVtg_OHODXm>#>~X2C2M ztYkRGZd#q^gXF^Apq$xSi|t(I2fob6FIfjpI^aUZ_;6JC%c)>qL3XV@y;RcQMV%|1 z+mh{?a$&opni@srw}q_Kr9A_Q&DOu#=)EPvakKA955^EFBk_?Bk9Zb?mv-36EA%LK zQOWR@cP3v?PVzH)C3)~MD&!EIxGeisEzQ8}QC%j$M?y}cjTfcmmvpMz4*OF@gC5hI zySh2Jnwr3Q^ zUsKxb{}%4~)2|KFqf@laqnCQwUcc36^uFG!IOYuXkMH#qyH^@+`o8-0D%Z&@cuD)8 zoNW3P*h5zu3U|hM#)3n)T#FpkVC26|Ib5#@9Lr;(%gUV1D~z4A#9*13e&6sxe`tn( zH?X@_?h)s`M^7AT(K!^h_I}3OxxC52nZw{bw5CnXZ-v3P;x1^zsN?cDInBCI#q9;2 zpgD#(847m(Gtd4@i3Hoz(b7XR&3r)nzoGC}5B?>0b7&T()EE3j>i|r4i%q%}H0QOT zMfCVP0!i+)EVFnYy;~jz35LQhnF2tn^(Ir_(F%>{vlolyNSAZ|zLM1sc0H^jR++dv z;U?z4nzdSB#V^qXE1y3-nj|rw^U6q6vrmbh&6CZ(Bw1s%{UfwHF*df7(a8S6wvKNg zX++sc?sm7$+Mpp8v)JM@{nIMz;)qR48n-1ZP4GkSANm#-S}ot5(&hbLI)zWd;|TOb zX;7NqF%&H`3YHA#ol=QAEa3{EQxO|kZ@RsH_x!ZV3@AXH)zvygUVMvp|GZbppJ9>L zYVJ(h^4xPe#gzG^cU!?hCs{_WtKx!c>C&xBWi{GA1|!INts7LIU=$iGF&lQ%RQ7>< z9t5L^lADgX6ton`t!zv|gpgDMyBtetDWO6i;+J)G!m!Mj>H6|s8)rLV36M)LqFLf^ zYyiaC*Uk@s2Oj8s0R1LvEOLh02m>kHcsH#NCD{| zef#Ehm|@pNpb~A|5y`UwJofx&BVb+%&}`~VF2Wa!O($8!Q9=`b#GoM zAl~G+5reVQ7b1!IbH#WrI-Wv**U3glZr1Y^_+IkNUWImRetEe~yrR_(Z?ivAslr8R z@cOs^w*YF;JH3a8Gfn(#?YWFV3nDAx@_k~^y=K%phZy%FbDXy7k8Rb@)Cn!mj{w15 zo*YVRDPd1Wxb?E=cCr1uy>fzloL1%BOOvNYe1CYtjcB8x(^b=;APy)*T)P3g{+oaL3R<*~F2T5s(y4)32{aM^-AFFiTzkl&#!QO*2vJeoq!2PwchT zV?{54?}SWwC(bl(%=0m}=+005 z_2Cz$DZZN-iHIUq<=2Q{5q2>v+))!ZZ^kYfhjA#~x7gXIO$nj;MBRI=AL?LsbpD3x=*S}~9 zy-?;n%!`ykyB}PF5jR-@IpmC18wcddq#cn|(g}D$lAX{)p8j>mhqkJ|3fE)LP<&@SmNF*YH7%Ps=nTF33Czjrnm{f?ix6-O}_gIEJgwUIMd z@2X$s&9$ME!?QsB5G$qLYm1uSq3~o+hWJZ|_OT%NHL=s47BT;r-+T9NkITNB zIKR)KEn;YXee~M-;nv|%?WPwb?XkCM2esb;)o`#|`B+?Dg{XtPqL_jAJ{^R~?Bbwo z?V6drxK4lC=ZfCXeC{9Lr-hw>uAGfrFpGVSFCZ>{&H1v1E^=*wQ%6&>=oER8;3Ar zyHDV~=H1bTzu=WSoMCqn&(RX$SLE@)nEC7dAY=h@Xzuq))*P7_r6)GlRWBTn!bYoQ z_Yb~29m$O=z`G-6+43~tB_CCcFwfh&^qTh!u9|BGlpjCNNPN7^l3vO~x08P!fqTschVA8(+jP50UrFw;FdLnIv^C+oj_Mbd& z3vDFd_)lyLK@aP_txitn)s6#Y0%frryicXUGIBo$JytDv177zI ze^t?4rL4jq;=*51R}Ed?g{;k5JVs@b!Sx*Me3UJE0>vF0P8MQzs}<%C3t}A4DDhxA zyQePFejj`j_n~WwJ2AgW6TkMh*`@KLSB8&apn6!RE);l0-T$ux*=qcFsIXmFsJ9%eHr7CzkP?y;~0WSNYx zeqnw{rMmjGcJuF&7`l-Xz0~C};`oe(xL?60S&Z-npzgS?%mxY4ap>7>o`6 z>%{0kFPndYE>%W%HxS|c+Jnb!@~21=GSlgYa*;)ol2+?=iH+&t4NtKh3QzzSW{+Mv zJjZ=kLlHg}V`Tp!@zKjb&c4G;g{4|wt8Z46Fi`e3-;JN!)ftcG=>DTY>Rv+_{xq>95}WK(XDt*NAKqY=Li5KSiU;OTKej!dC+@7MJ=B!S zu`B@!yl1Xq>w0B<0`yY=Ip;^d4+be6vd5%pBnKil>J**A;#^DgUqN^2(z;K_VX0b)5M*|fCt+5O+pkNPdA`obo zu(Uww9yncz35@%Y0;_CY3INqvUv{K2%>Xwkj_mO}%fb*+Y8`?_a!E3K)8q2#SXE!9 zzpn|PhssJpt@oZ{q9l11x$hc%5FUaDVU0L^mlz|GaOZa(-~t4G`BG9&KMi@wJ8gS; zUI&=Q=cYYVVIDs#u*t$TBbGi!itr~(5e|nlmyy6supOlDB#I`j z(K&tKp`%6FmrHU?1dN~{ZvUPUzLYZI4K2dzO9Xr84JZ)a2!%hT1Wx?g5vYIZb-DnC;C8){ z@XoPe-Ipbh4cGgGJ{rmh5kThx0`upNelsxE4|V(tS~bgA&)u0RP;OKG;HEiH00RKT zC~(I0$92Gu(|!MVvcEL3mKn37fD-@JowMI3~1>%}P$mJXrq-gl{I^*0c{$ZT?Yz2Xo#|b zyMDSjAYTXCdQE9H+7$=Mco16X&flHmI8W)0j)aS%o2{M&X5q1=Y3xsRbFv)t6tQ+~ z95-FI==xnj+P^sZ>dY3O#CjErEPj`@(0Wc-bq>e>I&Ee_n_ddc=_SQyi@`c)*R!si zM-nBUFbAh=wI99ZJ*H(=Z49b}k0pMOr1@pF(N;I?KWvE~ptZ z?~cc{?XiwEXf|ew*__qe?VltSX9+`m2((vaeAHXx9zJR4OZ@%_xj>$2rc6s-t`^Ed zdSGxXfwH+sw6cV<%YUA-vsOLeg(QEY?Md%jyY3TGV|sL*_IqV(wFVOxsomf;y}Qgx z2@h~6ScqD7w|*)f8dH9g46F7>}9> z?e%?p@hB#D<5Smbvoq8xM)W6lraG-^iaLwZqDZxdul_CEK%Xq!w){suX1MmaXa@s} zdv#>wshZQZHkr=fU*uWfv;a7Y3rvHlD- z$+s@}_|r()arixS{&?wEX&$6u90VA?C4VQSS-lsl`ax7Py?9ci*ZwY-2$JL_QvNFt=$rf}75`^aTsn?LLHyRn81x{$kdM~t;D#TlZv|E- zOU!(3*uyn^1n7XnKi*pVAB_=ozi$rR+s=gm3#4)09e|7DliUD6Y54I&R^~UcpM^r;&hL31IrE<{mRKs+TPJJp>h&=P z(>hghdg0W+B0Y|Dmbm3Yc4rNyYia5!nd7lZgOsETBKI`q2wffq8H^HLd7M~OM~Z+d zb=~DJu|6cfJ^L?P#Fj8qXzz}593pHK{NW8K&LIO$!CC)O^bEc__iy>q?&Q;XeGv+G zHIqZaE|YBs+E8Enu`HYb#d9Qj2cxdu{@iM=#OL^dicq@bQ{9 zcp*zzA|ZN`Edb7M1gFqiv%#i#*#Bj<1t$Ybsy~x& z>PF`5UC4L?daH+B@JR!6^b!KJa6A2q8M-6q~ zqWwfxkuB~{wwn<*%zeT*G=BX;Cq`@&~SdTLC8x!QqTC2`JzV~fbx zV-tnUzA0=sI_L5w(i+A+^$eH_(MUrh4?q{*7kCz`3mhK*gbZ$FvZ0H;@7|!+Vy`bV zvt)dquP(i^BkfjQP`YA}aJbN#G-q<>#Ox>yeNj*STXrof{$-x#a$)oD*+Qnw-rTCW z!O6(ehKI{bzV6U(c6DYjP`7hu+GR!_cz&n*G?m>UOB&=>F8_K5`o%!V3v!&6w88l< zgb{8a4!K$7ea2EJ>3xCH&LQSEuEoX4Us*<#Qs^2H2Os6zj`Q3SXghq4RqFKrbs*T7 z6K%QnD*kW0MEVP=-NqR0FH5A7DHBBF2b^nvhLvdqzDHfSc*@Ky$udDiTxGrv1Pg6o z^IsYpJ*>%hdzX2bgks~DQt1_iEt9RD=^R84iw8*J>pZ=D#dY7d?Fu>j*>dq zuS;GYaMIRG8`&Y|(Ckj0M#eh`)igQBei7 z4i!HL@5vF*o4>MuzqqG!6#JF6NdJWV^jI>a^e(KQgrfiZ>48;*{EzL}rL?>nCi{Wi z+&7<$e50y_VoN6a2J#b5%Q8G&otqCN&_kOAD{y6m$ZX1lN{L-NfT}9r)0qP+!T)Nt z15tifl|n_a?`A-VFO{6{4%iC5Vg6X)UW9P~bJW(mH!T+ACb1+f_K?!gr zcDSPl;_q}o$M?#IPUvL(7D@p9w34E=>&g+s!gHXq%U~Namuq1rt2w(#s%lW0#9LNv zlRF+=wemVEgNcX0#Wxw1jDD}R#eiBnm!dYGZ2Kb<2>B6PUay*--GA1%@NUUxp6`Y5 z!f$Yr_DQQ0_(P@Q8OJEhlVdStj>$Tg5g{eD+>g#=6jWvjE5EEu==i3RrWtYvMf{%l zj&}*?;~^-}9iy8C0+Q^?8Y8Mw0CetcKhHKpUb^jxgty0p13%9dl!Ti)$5*^>=$yj|5E*RQW4BO%Uk z^0lOaSV>w8^CyT~XP}F!gG~X>!9&RO*601s1))ax#Y`amT3?2K!OgPxi(Q6F!8qb**M$K&gfi@2XrCQ#b_qab%%sS^drsj5k zCffSwmP2BydE3PQ^Kkz?Zn4J?rQWJf?&O7=?givm=_1m5#`x`gh2>jQN`X`U&9{KW zRvp&yeK9cf>`mJ{13=0hZLN%7l>cF~mariyHp-qm9S#3~6J z1Nyvy>=E(04_Ves75Alw8_a(x>EOK~v}@aW*Nx&l{@UT)x>@}Vgk^Fb#hs@a-ZcaSI2lWfpkdne zl6yee$sX_mOf4A^!}2jT_^-EXieMQQMQum%=jngWnY>^nV*Uw!3jCd?=K?o0p%& zw>=zJ^!|yEovzjog3a`XQJt|jhXfV*;?okG1a`e1XEYLx0<8#b**$44;y3q+jI@Wi zx0DQzZFZk|bQ(M;@>m}vplskhkZc2qUMVq!Mr6h8&*u^r+s21yb~NXID6{4Q9LJjW z7RT}LMQzI;L@_aCnLXuYiP(e%b=-=1_s>`rL@v22lSmSFS zqdh>m1Yoc}Jco;zVj#aG#26exB9{hVg6I_!L072OHwZ3r76G?@+eK7;gee zYVW~r9jj&7$n{^Kgb3TPa|NpxK%`S+qYvGQ{$>G1HLu%%`x6!HZztzC12x^eP0etd zknD0FVwO7_NM1Y(66gvKs!UWTzSXU-mv$QR+(hR6k7Y3~3`a^{S-oJ!{niY!rKcS* ze7aZ0m*-Z;$uj(%@!^_LApZ7Z{V(gJqslC?oxu2cw~jxJ%&(3Z9uk>T6xG88BcZM6 z^Ee4%BJ!uk9kY+3z01Kt!~d;lrv06{|!pj#v|<*Q0yE-ruT2)H?FUnn^O z+_65b=$$@*Mj&vS{=YkSyE?$w^~M$0%m2@`lG8WfODhsTWw4`_zPyaw8f8|-P;eSJ1#NI) zi993rl|oNBA^uP%cRTOQXf`W)(BmumC9g-D!$9HYlTbCPwwZuUxRXmDs?bCOM$MZJ zEc7)@^a43_Su)1uI*m2|Qi)GPh5sH7`6KXX1aWAd=KD+UvVI;~nEw-XnrZz9zsALq zy0z7MTe8dL)tcH)UwSZcICRbe)h%yp;kN3APg&*K%HIKHxuMBRck8FDL4J#;weT`v zZU@t=qvr;g7Txpdt7?X49gT6CJ*`!AJb-_o-#3#YU_OGS(off&SDPhn=RMO%BTP>y zMyTX>tecJrj3vIp39kJ89HPbqp!1!NLAY3eq)xMf^R;qz*w_$|vf@$sC-!q4`?C(3 zC4+C-dCw`1R(Zv%B8#O$#M5SuaM0AsI^%mXS|(aZnyax_EPFmwp#5sTYmB@7yK%}-#O6`9YtMvq5N_oOyr7m@Pw?=%=%l!yMMY6XR;%c*e0TuM zr|;L~3ubjg9&HK2BW{M@X)5s;#QU~8IqNm#)59`kXMMl* z%GbwA@DQWNg{NPAAgulIVwC5Z7NI~<$J}A6r4%Aem*dYotd1~aC{49JvtwZC zi?V;CVbiRi=bWnyx&sfr?(TY1_{?(tNz}||%64Xqs zcoDeWF~KL^Of z-L&fjH2GEzT!CL#V<#A2)WWj5fGbg;p$2Mu4_fGt7K4lmi9cqZC_Lly(a9iH&-Rg6 z&($AU%zmy{#(*8%%oOlzF`>IDW?6|(f?~-5n_TVeIwdI?i!giYEhmc77kS!p!T45) z=Uu;XyV#-ikDw5{)(jk+IH!X2UDAd3uRfsq#eRGBgG1NFc^@Mp6*uAGZy%lODw9{p z#h1a|UtGziYqTd7q9t$86D*ekI*88Kh`^d$FK>oi*iHWZs{Zq4TGkepG}?q5-CUK0 zrNu9AS_RbgG*-0G9|5&Wn!0k*t7_Iy5XLD~M0}t7)xCF92hS2kJXZ62URnp&V*_u@ z0ed}>q>r?5-+?R!O{>HZaJew&lEcNAr@UO?+c<#eZjKy2oK?zOP6nHM)KrAESn24; zs>`EADm!Tdw+^sT20fUK0#@<0D!~|H@$~+%vre&J-xuORUh2m6Q&&oyVXc=s&lFs- zqA7f4gR*&02#jV5tc3RQA&;zCr|3lKc|D5^l7pd)=ml#!zn)U;Uu;5q?BB+4iQ+{I z_vd;i8?p79GkB}KqqZv$P!ts~{zRGYGJ1g$-5g?)5htNL=_Ls{pu+w&`tCvx_q`=@ z@J;}cx`-yCC&y=jb#Hh{%_ly+z^>2}N7Jjj-O-C2Cfcd=pS8elu-fI;gRYQCVmWZ( zytgPsTVeJ)-~n&0Z|lLqB4b5K3*agIq6^0aGmmesIh9{9sH}u&}q>b?T|U0B6BM@uaJ_&5S`1p*rHD$*PpvN zvo;j5o4>B)f00cr`X}OlGP&>3;RfdecKLT-b$$OB%J|s*nuSvE%{D=mTO7hMuxNeQ z9|D&>v0&k+v9If>TyL|x$vCv5O=gwaHDP(wb|MbnyZCkIBXd%O1FG7v7@c{&zoh*y zf%Q)})l!WwKbWZTa?hBa8mU{5X!pT-nbNp_1X%RG^=ckJ0<^5&4k3K;eWJ#io-*R< z-j`IWQV__Qx>)zl0b#9O*Ee93q|$o0p5ilwr1I;pb@0=cbPC`_P{N&Q(#2S0HhS_? zj|&|l`3DL_?0W-^X+(ae0;+?c)jNP`Qt#1QnCq$_fmPzXjNK-cVRQ)L^R4g0V#z_h z=OujZ8T`{_=!-MslAKoRq@GPgoi!QnYU8?VepzA5d@$e1`NQkGVkt%lDSug@uzbTe zTwB{(kiqrp5G@=KcOpfKKP@7v%n`obh8v# zPZiT+Nd+K7Md9L=sH3P2G&nqEHT>?+4K`Z+@}|iD6zj&VM*T`-3`lrL4*;_xwgQa+ zK0RQ}xZz%~Jnqf2x1JH-!!p9xK^eYJuwj7d_vTt6!f&Bw%Gv0*5YFwltrgMqaj)%YRuqUoQ6jIDjWn7a%^UQDjutTR?#&#U z2g$8*TklPLcX7;gnf+(H{ikpKS9}hWQB_V#e==ql`*5fFTeu!>`R3lWZq(lW1CZR>+E(J7JFrl!$5{i+f^Sh(5M*9 zvzG;6L%M~>ksc)j%fUs@l#7iR?nluj2OV8mjPD|j8yU0ZGaq%m#E!mwu-=vyKxwMD zjtr(>h!INF@oP~$Z?H@PR~*-_pLG#nRk%rNfr z(=La29&dA|`Zt=(ydk(~rc=4tf?KcZ_RZsH+x#!f{7=SYVv+HCP-a#8yDO^3L><0@ z=AY%&ncKWVpiavw>70>$S*n#WaxLK9uojSH9qC1*2hhxMlyjLK0dMH)BWD3AE)v9! zSO{5Mfp zHwTvW!}0j>J9NyggPH3&9NRNRL?%5UjUDLU{(DZ7x$C;bYAm0+RI-i|5y_9`BO`@e-*dF_@c^$Tj4GJ6oCmiwqA3~NjjcHK5pPNF3}mMaBUTP=Js96$|6=$BZkv8WqxOW6%rBj*O3T325y5>ow;-oS>>ARv=O_hCi57jhUkr)a{d1LNWX`frRV z;Qg%K;3m9HNVgEPRmVr^eKc%a=0h1Kv(iiQSvh{f&SX?P+_6Tv(Cw%@NpTI&!M5Ws zLIEi)&Ke%mW(pdk%ddH73k7Ch6!m3ruFV*wL{9iz8sQJMTwUMo)3U8A@osxsu@kfu zJAs&8vtc^K9ZOj`s*~bAYm@$BHfzzNqB8G#>sh}{ zg>73>Fijt7vj4N!f~VjrJ2Ad@n$1N*+0lFZs2HSj;+p`khnDqW1MhiJ9m(UTaTAlzM@au`D>v++oLir%U_F) zwv=7?Up4xB9cc^v36dkG+8@CTz^nSD^wyQ~&wJLx&=Wi4U&wG($c7}k7SZ4Wir`L@ ztJQyYG{tDW`>8?dcE;eroZ}EV099f%JLq!ATT44pogZIy7EtAl0%2+HbXuuScXxtRXbX#vMt*US2xAbUB^xCMEdK0#V|yfIX69D!Ld-8 z8pT1;@~90fu;i=wUatWmR4 z9S0R}B7=7m<-ni1NgqpUQ%nLbXP7KDUmoGfrTi8*yW4rT@h4$0+xiA?a+mXBKmj+; zyBQaj1(8OLmsJ-7STSF@!co=+doE0|rjT{j-|JD>r_le_*PeI#x7^16B|x*d1qDWF zv-i_l4HHMnKVOftaN#`WgdTgh7Ct1Lym5U3@5=L#Am}1wwfY(h*w!TT5 zPerKWVwz}+-Lam*Za0EU9w&eozo?G&>}L(h{oa}LFRcBA8-9J~&6fARsz|&7qa=er z3jX|caR}ZnUi30i==*~rev5ae#cgnNQ_bY*8XK^TNs^ZKt+0Ly8|q&*T``T65Y&8C za#C0=zh(qW5HOi$w)P}ZvT!BLf(8^$;+2i06nhJKCWRQdl_@&mB)$0001+9ih82-> zqu<1wUddvLpSn<6Xlt%G5qtx@DG_^8)&$Tm{I{nO5Sxn#@A_;sHHrw0tpP+m&CCHW zqeu|SN%aVLT0R2!h7}OxKT6!vFryMsz0(<0Eud+K+ulEb_Ous5M&5F_vjR!n!&!$) zo=JLg!jZtK$Q4+S?vkIR=dtx3BuoRpzuDOVh~Wm_up-aL-cHc>ahM(^Fj-&Xi3Bv> z`00GDf3`t2FrD*g^UO|N4*7>A>omT}Q=?B#e)Dp6-%FYd2?G{nD!QCVgB+dbYA3$M z@A)?D&P%jZ&ffFrcf4dS4jsS zk_?fZMk^S&ekoCMQfa)Cx+LXMw~IVzq-4;VYTXf_;+7!YQkof{#n}4&uXNGBXFMjf z7}8?N7g7cE0HSZxLZ$!mT13+P!o1pIX%2( zW(WwdEe!=5OyUBn=eA^LBxu0!7~l*mts4ke%rHR4g~U#E=rDK^h+%g5~` zzNW#QmEa0rB^IGxJ5X)bQ;+4PES)w+GItG^OGhgjm+QzwL9t-fy3ogNF_8D8Sz_!r zEbufnUazJxR7Co8`rJ_IuWZm4>>mS0pXW4ckG@b4(|!e`HU;>p;-OR~Jj^_F=*P9A z94!96t+`%m?+n74CbPhWb<2_W6OEer6G*v?1C031?ge#<1L$$?l={|}E3{&c;0RvlV#@XK6J5}9>8Bn2gUB03rk90zE| zS^EnwVq=uJB&od@ly5MUCI;iv>z7gESHf4SjXq#S_I$4I?qN2gck!;uAZOGY9CYL@ z6V+uyVh{p%XYj`t>l4MiYuoB!6~(dBuAiPY=U#`Y+R2NJxYD|`E0|q=e4IaJb=W^-2c=)K~y zAz#(!r$*u4WV8|{X`I+iP}p4#bw=!orFF_iuRkRIsy9&ANJBp0PVMdJhb!IfV*eGH z=cIPMg`-(10$27IxqCRWUBhhG&*KSK(C;{(% zBW)#y*lJ~kHlwr7erH>QIJz9#M{3#dm=^Xhk&mm_j6TA&sms+sja+J-=6LT>b%Gj)Oe65@Lj4YyIaH&sOjfTV&VjiMC=%Ft05PwcZfj^PESd&mH^4zP zk=BPKv$GG7A4XCLDFWxRT;}#jM$G0LoVMw`fV5wN4@JGu2Co8oKpluCv@dBUu(1?? zeH;dT_Y&3}x&wS%LV^E9G@hZpQE~q&+j@vgU)`O;p^KjQ%nX{#!2WEYms@QfQb3oc zSj!i51{ZsFzCyt5ef-Nt)xr4nxuO*v0T__%J9F#Z)Mueelslf)hZX*;3D9h9d|Y|9 zop};Sm-1DI2hXLQ=gm#nVnhA8ceobK;BynrwPKSbocJtmbtNC2ZdVzF-GIR_)Ak|i z6F+JUP$to)l*j^0F@N4QA2%DS4EEuHtPmso$g}=;mHU6>TsfbiRexrUbEm~ot3|o< zj~gKqy4?co7C1h)GMfHL8Bi*^)lq)~NT4`Y0+Q}j;M_Zek@ttMM+Nq0&5lyZ2Pjbfm??VZNMISekxCY*>n!A} z9LHdjg2#0H)n_}~^nFh*H8FmvRIP9rQos_FQ6?W5*Y@4iQ?j-Bv!tQO`K>p?$!S<# zJ11=TV$g5SMq=VE|2Y&1(It42>9lZ^+aI18uB>>e9hDY14~DhF@!w$bT0Ld8{n7lc zizpKDj?V&n1#c0BJ@)Q?9EVJIU{9*LlE-T#mTyWgk%Y7#JOGrV!^YwOZ7JB2NXYko z5M$QNIm8l5L%2V;^yafPp7yD#?48s7q_b)XdVtV@$NUL*yS5Z*Bd?A6;z_)nFtfR< zc*&7Tv`LFr=sG!(;xgZ!iO9F{@CoEt(JJ54URc)?Z$SECi16%NlBf%q^?2fgh4@}I$sy5J*0cqIy_W81=v24Y0Y z%iMZ6XtJKGv2PZT>C?YI0;bIWB1q-y`m67No=I0x#+(=2b{e|g3T=81r8zju-2}TU zw~qONzY#&#H;^8WnNQzOfG+ho6Mu-n1!xz;b(IqLOcabqctw7_a4|)(G*=gI9FW&w zk0g^tp;(&2`%AhY@Tf!Ysor4Dg50K}RjcQ5_bkaO-)KU{nq-l6fy|&|dZ|o^2SybE znJyIJ4MajVF?6=tB9i&OYM2fMUp!%aPht?7IlJrd9&&CH$S*6P6?`QUaQsa3yvJ2* zgnX*{ap8kWr4!lEPc}M=GvgJdap(VR4Cam028|Y6nkuoTT-n8MLn)rt8fEB}h!Sm5 z!6dMa5Zhx%0QaIyxnf?dG|XG8`z*{_7eNv=5K5>~>BgtK$d7Fa6J3BD?X*@Zn?^g(F zUFV;}u)5r+fi~Fj1Aj?P!OxO@%|KdW9U&~=_cdM6xLV$GlhAs;2N-C=E5F-)!S_cc=>Pvx=R$whK?z0<+BEY;|cryLZ@!SKqD8TXOx zI3?Y>IHX}Hd)auXOPNlLM_c5kR9Y=}VyokoD??Oh6mIh`Via8hByv<(iLw6mW8;%w zeuTPDs}^A`MGCA#!kluLst;hWzu4Ra@Ml7tA&pSb2Rb+ip00-?Y5>a;)rQerZ{_s> zb)!%FTfou7v;hGyh9gD`G7y(wR%>|?doA?a(aG8z;ED!3ij~S*j)AxZKxPXtHwLP` zlEGWAhSh#m;?R=#=fBLCl8$q9@T{fxoBCz{&^;L28PX`uq?#>L-aPJtD`Zm{H<%F_ z_<_5Eb-~+6`_kHDhm@4UkBI0=Ik$63@TnG}ND;`NHzVxl!cVuJ`dpH-4d2}{C67yc zAzJ2H(Bv>?qyhh^MXQ~sFWQ-QxrEoxvBnG7-`C;cisLz^8NRib!91Toa5qV_r*@&r zoe-Se*(i*|CsN+jFT4eF%0R?a{B3Hg6EfQFeoJKX&wr6YX}$I8ub7N6Bpq7feUc)6~br@*Hx5xP>9n3tgHJ1@!t^_ z;5~phrkT^sa(UH$R)_}}-Uhf+!vBD1muNBp$yR>2E$wFe#g8$uyZjSgL4*2MrGOvE zok12NXAY?Git2Q-L{eY%YaBejWU9I|3E36rdyVkzYWrxDn^;A2ksn7!m0qNY&FUHYiB12@l@P{ib%XMa3HJO_%{4g2 zzv{9PY5Nq_xp4sypDq7cx)dk7?E%zxv}1;Cy@sH`Y{(y!O~B6J_0c#Kpu4Ob_;P_5 zw+QG#A%Fdhs17IE<-O|dG6pD48D{U608d~7mbLnwp8fa(?fuM6R{yYd20}ws9-Exf?0rAJ+KNynC@q2?*xzb04 zn-T(2E`!>->XM)?Usa>)<{nIzcj~C1Ed@AN!3dSr>-0p0pvR)>g4?|IN7Dad4Nv zA<>VDEHcV`-A!|>-zb0F@s9f*{P%MPOa4EfRnRE&xL@a)`aCkGSrin~Ng3w-5s@4C zV-L$}PlbY}axTEMez$#qPG5xxlgJ4}tn(NZu=Yg;V~U0eu1rG!B(WeqEbKVRhk|DN zHSx}|)y878t@ifkFDsPscL4$AZQy6|jtN=f8?JC5PVyL#ghEcX5JRsTZvkE?NI9r7 zG-AHjA|NDjIIOABnE-{XeL^lMkGn|%Ex?qEwZZ4ykiE&3eo`oHk>`~gc07^r5;ZeT zs9a=zofk84=WA!GMbV{?qd#gY40{hE)!_Oca&+P;1@FbM%F^u$a?Tg$;&3dn1N$k5 z#sqUOc4p+3+Nl@{tk|lorBl`Md-p`6kH+*-zeR^&T;fvFc)sTDpTk+W4w}Oq#r6K$ zPc5l<-y)YELDfytw65|aKzSM^u%_qO0rn;wN*Qb&Et%cUp`h@TKU^&mQZI3xto!fb z<-dHH3-9$RNu=rABNVF|Dr^2(*>2~z)>nkHg1p3FYrIoi2=@%=0h)&Ya8_Wd)@{BLv46Z-11w!P5WuE>3@1F?ktdR-kGVi@g>%GEdu}N_bZmhr>72Mcb3-Nr|u2@I8kH<(f=b1y08>;Hy2h|_V(KOh?^mE4q) z>01sj_7w8E82O+j4-t%~)m_-7w6=P&+e-%$i}D@fF6>Q^YP*lr?$V~95p|w^>o-h} z`cnqSdFkGO4`ZG7^TLXIKm z)Og!&ii}|tBq)}=HF^A26bu6m^M(R43;0n$R7i$03DB*$@MFFuu(v`-k^wO3CAtjPUTb(2)ABsUHJPEU4aP2B8-Q#L zHs6-*vQc@KBb&+>zl75(#lq+yNY+>s8aPLWdau7zewPtDRlK!gz+EPmv#ny@n*;sL z5Sryj>a}F94?PsweaX-|DXnD%dXN6K=QgG3OnoXuO`w81q%^MMLPGQY+gaFgiiWZA z^Cx4X9UY!^9H>JOyVCo?7i#Cf_^5|g7`f$4uva#f_@csuXjb>2HF3JDr1e6P#h~Mm z@zhJGW!nnLMxdhh!NNBo7|xvW8nNd8>)g8J$QwCx4kLCPXluPKb6b9&erTu;Vut`% zGNC{vf%i26dv6Vx;AdyM#$&$*-0_$1b=t z8C44ZW8Y`>gvDgdF1087`$eZ}Ttkto#wX#QW)u~J9b|?ScDx&nLLt(9-A~Ec6K4I1 zS1zQ29Ao;CNEs}LVFzA+;=UDS9)^FC-+Y^1`xdv`(cBYx(La-$EC=5~&$-_|I$xc9 z5$gg)sqFs)YSwVs7i7JULH_aWnuguR!p=M|mdv7nB8F6&U|?9|JQ=RJ1sEMOolu7Z zwvvJfORrfXq4xl&i&s!6q^uV}SA0Ca0PckfE?f1eBLPXT<9;;|2YhXRg%hr9r?&;f ztlcBHNHVZA??Jdg^Jtc2a-y3kI1T(lJl%|bn(D6sKRkO>c5ZWf+>7b}tPce5LHD$e z$~(9x5C}h_owPNL313p_7OZ#?;`!|(kvbt#yT%v2i|ZO|3!h{X4vn&!Z+W_^$^E|Q zp_Wu*7eAGXCUZra*$U(o?M-k_oS6;IKT4ba*!f*ED$PxL9Mt}PUOsGh9rX~mUcvqg zg;F#w#jb&nu&&WK9(m#&lqaDz`4Cede0FT0E*q=gB zy#BA!ia!r7z&~l>T(99YQ`88A!4C$a9`~y+z&jMtKwSSDX>PdfQo)N_uy^Vc$Uo-^ z-)Woskw&)P>IViy;jw717MLdC$^<@{IN#FjY@T^T_i9Kj^w28X_w0D~q6Fvn=0y&) zatJ3qTn?V!F435NwPJsXp@xb}l_rKBq_kc=rBSL%m04lBu;&)IV@{Wo)aOihnM5^A z8#N4J!w-VrN5jHc$MK`~{i1x;k`V7a%a+t!sm9GR{tP&nn3LCO zqH<5rPFgsA*RVqrY4SfPn{$r3wYll*{csR8^Eh?&9N2-t)W7~WKAaz8Fn(mf4ga`6 zbmphA9-GN(+q^)*MY;T#y9FekScL*yJFTryKtB5s;cwG@e{(K?oi%i$EA|@iX(*Vj z^X7Fwpkum?Jlhx^^so_D1+1KvZVb+K!kcWnjgCC&fd=Bww?Jc8$gRC4%?unN=~=3_ z2yU{>qci*FGCnjs4l^qFiNH0@TSUSPqI`0Fw|KBStK6>)Lg5(mNx`?F&eZ-WSHC6i zRm>b%oAaoI%(@;p*mb}kY5r9H=<;4sK8+l{&u;&5FfnM95j7K0RV)^!JF)OhX6_Ko zeIf?O??Zooo-GtNzX4?= z?YT{VmSc}VHEhz)V$%g1W2C?u%La`we9f{H3htPr1OOH9vQjfK|4OR42K1_u`Z{KPhj%3@-|XbinD}2GtG%5}H{dmCd0E69Vm*sbD9kuWBqk=HQV9(Dq1;!70U+(%B6* zd#8r%nZ9)2+61#|2HTHMSI!;%O9^~n+|$JlRpwDHm= zKVezy@HNpUCF{TgK2Z@kJ`e04R+M3L`59z__iEMYgmNAf5_y2V1F+WZ{Fw)x(4hb1 zd@M>V)XccHp5WKZdit~3Ptg6N!D433hD9!X1tA8O;8CY0rIRp?5n-o?-;&uul0|j7df^V@PeP*$9nJLy zPtQk%j~3B>jMw1xAzzyncSF6W3nzL$3~%2mXIu?4h|%ok{|lc$?+Y205i328K{{<< zXJ@JZ!L6+4;oBLi8lN=mm~1Fz9Tlbw?`7*%L#fz4cg2wYMC_YFtg+t&1fPgD0fnGG zU=H&)7Y}^R#(NVA@_rz_0At-|%SZ=Zz@J}$ky2`5nXv6hjTLp%)|X9qEs2-jY>#sR zG&DZ|Ns&G{h#ClbxOG2XOSmoF0%T`*eCBYgjNn+M*smt%C@Qh`@EDaaBa|33;tfv} zrg5L$aWpVP*P)5*XQ+z3RB$7+DS%P4*OX2TKAW9>k29_c7e%I zoX=8j&(d)74eSU@jhG@DX*S7qzXWP=d4d8tmCq#E#S#AjXBKti$^Kn}_IQb{GfW8CA{X^b-KsB6mgk^=G+aK0JAp|E(B#=xfNLR0u77p4r zzzYV9T;6O=TmUCin}CKW4J9y^HFqO4a3PM+qt*d+3Jy;_P{-3(5g5?BKcDo=uA-esaw}kj0Cq5%Lr(`7m}1C-6;4y(c?ktK zuNihLhXBIpaa+Li3qWld;jB8LjLQg4e$^iaY#rsDBa|iXCXi_w&ljI1r5OYHlOVHS z5+Rq3H|`=0(@VU)fMt~pAvuF4;p)Q=VvkWNG&SI#7q@3~)ct@7@UG^yr|m63>wM#I z4BqmuWA3oNlu)W@aIjePKAYPU7Wv|2Yh22MWovDZzWkzW-X_<;Ec;8;*I#tyf*&*; z?Ri@b^No4qxlPJg%aRy)I0hzHk7=MU^{F0tlDs1DM*t zO&4JA_i*L0mx#vo9^jphutVD@5V0ezjp<<7+yO`tUcE**Zp+*~T8%EX=hh;K-?0zGGpDrI+ z^&a?dm(fqcnDZjthm_K{?;I>tTuT{ngKlzm3*6#D43do}-cd=C`{hMnC8trx;M}n9 z$7=);{g#_UBJN)~mLT;Es-&(9QF_e0Om1A+BVx^M4e08I&H-@s2YleV0=WF<#?LvX zyk7}wD-2t)`p41W^|#zLTm$f}%In*QM67_WtM$W~cTO(e;@?4}h}71G9Q3IHF>dzJ zmGMUVL7$Q)YrJ%BZG6K1DbX8;x{b#yu=d;_oL!!Io@ZC_;3-?-kz}ZElfR|kLkEw3 zkIaGbPZ9Qm28%9Vtka!$sr@0TkE?sHLMS0T;xcSxAPJMSR} z&K_Wyvo**{8)A#79XmxP*NVN}N$TQJyVE$_8E$)p1k*dbO{i9{2$Il)(ubVX`gu$? zq^mR9f2#gF9OeWG8C4oH|C1Ky`}fFWdW&v+E#x5Yt^YFquE3<$qfP-U`E4V-T9W4R z_gA9%lIJ=)#>`i7`+RlB#Z!YMc|_DhGFxNgHcHQzoyhNNq56{LhB4U?u}dB)-7jUa z5m*J6ZV21^EKcuLbz0X{~ zy4}hi8O(zep9w0mN2=FIpuB_j<~qANX}m8quhIy0+L5S{FbD>D0imm{LV2M%qNsP* zOD(QW4J-eJ1bF?m1P4hpdJ_{9-D7y{#8^Qa@Y4?~tF1-<2y7y_BuSMA*VpM-K}Pg? z6|VkcYKINiqUYiHZi~WOz#7&ajZxF-a)vg_|+#Y z_d>IA*Y^2pNN?ubLQ4Xq(VQ76esda>qLFc`WmY7X#j<@$u+(Z`epID}2Fb(w^oONG z{w^mAVt%ROEe^)svla@1PxV5ih9hFk#x+D3yr+g^t7{LUJ%Hqg=yx%GWjBngmM6wD zF{tNaf4Fp}2rLXa_Oia|b;$8#_;cgDq2)#}{Ebn;#nTt8J z9S8Njuwz%%Plas893>Dcw%O@1eb}$jfayeGmX}isSq%mS_~GRwsf!|soy?aK2EYCW z9&mx$a)+-}*(f7%Z4VmOTo@m`p3b=tN~UQ2a5El$xn(7^NF1WeDnepoyEe6=lX3kI z3ZUF+dZ)8<;zpx`Oz>G~4~C>$LvK<`gpBlvep&Nc+Hgu!tlGP26XW*2gtus`hZ@GD&*N1A z*|J6Bg>kf@t4Bh=D_y)QquENa-&gWabPAamM=F@SHKZQ1o`PZ-mHm@KtKIasxh>WS zk{cb0CCfiP=FOD~XVHyhy+=}H6GzioAJVg*I4Lo7 zP?srjsGPr}72$%*$}iy|Fg=<({PgGIK!dQ142#oG7n>pKd(i&y2YCIKxF`eA;JHjL zQ*>9S6aPwt_Qh&KnDtO<8SL9u-szdG*{S{WyDU2`snUL>bu_rLyIdZGv=)VUoFvZ; zUiT2f{kOU8=asPr!KAGSsYLwerCxuy*m{Olo}iNzc2JYp9_Df<^}gf}`UeYZY|mAV zu|R4atQBsGgI5uR_-{UU&ZlRwHN*sNq{Py+h@srZO+B@4OzVHGh!KDFyPHNw z9VI^go3CDt)@9O13TnHKj4hH!bdS2EWSI}XJB@sJL|h&zjX#G<(Y0d*sB2t~G4X$| zFsN?eM{VWhQE6U;j*cA$0jhS8wt}^__Pl>!8fD}`>FB%4vHhYm&SC__;TP&*H_V;6 zK#I-~e87kYT_TQi2_1)WX1SQ@QrVfJ&bBgQ>d7$lT_#g-jl@oN(04P_(cq zD@(dv8hwdwl8ggKBKZJm@vAQ2wFddBk;0tGkLL=k3t59@Fie}^DHks1BO9w0f~~U< z&BaiCQj*?3jWzk%UePLO8PBTzn!g^krhwFk5MaC%Od?WeCAg6w+7>sIYL3Vj7mfZC z7W4-lCi$bK?ln$IVt_?&Z@iKM*HV~<5|(~GWS|==7^Sg5==^Gdo;D!BnABZwpHjS; zwgb~@ynLiYZW9fo@3+oMe)WMu52Nwp85A0?q^yi$+p)5FU48jl4o(jRl{K_Ejxtj7 z**J9M;xaU9r!;Yp&B|~re9Yw<AZqqc|zDXKY`Mo2@AcTLEQ;ftDvRr zaa->%;3g$d+lC`lUBHvX36Y!OG)NKRTs-T%sjDz~{3X9c?W9<;Gl=(`d3h%=T*GCW zArQ`RAZuJU9PYblgjBV1j;j9}o!vPD>g{z zMt>i?&G&z?zcdb#r!^>0EAX>suk_3D&2E_{9VY1(Ua&Zw=d!K#K?FOay~~bTcgL{; z0>f@8&;Cr&Ph|NX6lXyoUV5c_2${WsncSZAbiMM@3n6f2Yt}v9oA25Y6#MzE?eQ!K^A^Eg1pwEc={IvWQ z_cJ)vVmYEzir0>FBiOO6zMu^fB(nYHbv>TX&xkm50i4sIqYLZP%H_TKc?rUa5lV*X zCd|#Gw-rjSK|{23_)AsX182g%X`H`CqhqW&5;I>#&YxN?MoH(mC0Tf1Q1w(tH?n)n zYIX+w5Y-M5i0Tmtra4t~P`H}B7{n|VqcqwB=7+Q&JmXHm(r_+Q%lZ)mA4zp}77EQ2 zIYckyB`R9Karu z0o0=)w`-5L-qz+ZPp|gA2d5LOqZ=BM_HZldE7Av-$Mq-05NJi7+EAj5%U>0}YQW`j zCJXkpzj>2cAC<9w@rEPQ=HjI1sK@lp4#6HqvrbV&BH&YRLuVc#eph`~z+CTig1lfq z!R9ydqNIA?L_bf~!Ytv&18teMk9;>a}gHa%(+xJ$5LK5%!uNlEw7V35? zS+SnZQ+*bJ&OD1E;WXTg%uHA87E@jdV@di++4$%U)l0C2SRCaQwv;6zl$w>uj0qJg&o!#=YwRoUif6pI|XQln=nYpLP`Wn!ZbhUE32$kgNl zg9@M5`SE?8=a^L~og0O;Tw=YS>6g5>+wkWXRq@*Bi}=i{oh<0+!@w<;l3um7`|eKL z{QVFWF;@k%2A>wzC@uSykv@?uHOD?s$6M6e;Ogon<4D=6!GFuNuwDHUGMt?K^5slZ z!4Jc$Oy;yabtwjbFsD*fPDLf0``|?j->Z1!pE8CF=fT8s*0Wq>7vX;Ok#a0-)XKT$ z+4j2nb7R}H61tI3zIZeyx*w^M2(hXtZowvGzG;ACWpd=TFblo9x{wl{uMbFVlZVqUbp3 zq8&vlzOE|`*bm`^+jy(+DT?k#T`>HQaOtU3504TDP2Q3FPbCjLwznwuYUvobQyHe2AqF?R8f z(E!EpI!$IAaOAvv8G``JcvpBWmv`Hj!jYDt1@!SDzPAF-DN09+r`}wc-25m4K_kk+ z9#V7V1^R0Lho)}~sKb5#-m-1mu4U_FE?djCmu)Y5t!3L@uEmpWyUug={r#VpozBba z-1qh2ebaJW>gv$ty4#H(WOf4Y$aSS1jdbx$?VN0w+y#TVeL#6nQghVUpsn;&42lYX z6@d{*`byNMv)zTvt=T>-&l804Yz!-3ww|}ZkI95t^+Zol%so!Kyw3}n3+1%LSVN7y+d}U}#v)he`XQwf9I;+cA!1a7iR&&;}Q!`Y7*(_zL z#xG_?FAN;Li&q6K%Rc@N*`Uq&Jz#O`eBeg9nwe@~yt7ZnsB}jLIbJwb0z|5jeE*T0 zPC^S(DcQeeN=wExdd60v*tWVI0$;G+L;;PN2nStDON zY}-59%Ko>x(SNuG)V)r*sDbZGn8MS?`$%-CId0T>P4;g>d(h@YF(feRYX*lnLczSw!`T_GL}#m|W)2)}Mlm$_?MIl8{=u6eXu}rmSbUxz&`yux zroS`!Z#oe78K3Et5LVH*mPrcHc;d}uHhO&KP3P9fLXW93V9$td@N&9KCBBdSI|QeMLu)eXd`;g!|n5~F<0=xu|)5+BzhaLxtN#`V&NC7DSMR#e5HptQ5- zH>lyAOiCS=HKH<-{K`nNF1U3#oefX7^)3u|32yCkGwWw7{hTa$^88h`A3hKurL@ViaL^#(IMec{1A1v*$P2aeQdO-5K&EmJc_o zpC&?3_gKoXD2o&iZwM;Kb?5XEMq=iUiI2HalnxB zAB^OwnK}YPP>O>WVRi5o3BFAoVfA|&!jbW8 z?T#h%*WpX&&|t^ zaPj%5sW}AC73!bQD<5B`&2Zob)s;1uo>)%`8c>cE10|yv>9P#(7p;WQ8p)w`pCMV4C4?rCb~_Ich~P;hNfE< zAO!aq%vD2d6315((<@Kq{LpK^#C!PC-RRJj`UL1nie z|MBtKK{5M(>%6@G?MY6+^ES5qiS~l{b{3nE?*lOqxY%I%?+f&qd3?UlC&W$iA08Tr4XTRFgOofGGfT5CZjlKlsn&cOCm2dn(!Fs zh3m{F$jFEij2r_Aj8H6wfV1M{Z;t!FVuAEU-- z=~p4GiClQ`p+ikn8cw6LgcJxY zLPfBV2SM1aPug}i^(Q;SG-+Z(s}x^qOWEbE?S*iWQYB49gX2>#u%v{9kg0;0?*KHCK~=!33dOXuR%*OAvH^YhrThiS|&NDQ++AvOvTh1 ztoR}sCw8wDQ7uq!f2Udq*A)ETz)-G46jIj<-w&@tS9woq8Ab!bA&Zhp!1w|b#o$XF zG4VQ=N3@;?D5V4w$a8BG-d^i}@5;@W%6p|{G9JH#@|b9u#y>)Omk*Jr7;C;dLg`#| z7ZGdA6__lFG!8zsGb>aHAv4bdhyaVd7Vr+ZZe( zPmMh~puAkl>FW)Id1F5@UOujoHwzUlq_h^VXcrg;#=&xTb^S=OlID>WUiN({H~k zyB-zIRX1OH1z~glzL64e>g^d*QfC0)78VN6b?xmv+D2Qs?6C5#5>Hit#Mff&krEN) zcgV;xmDmPrueX{`RJ#MD5Gr8{6p?vm)Z?sM`3Gl zh&JV?FhSE?N(+-;B59dzU66Zilh+UpQ_ryLYoPKc+o)F}P|m`DA8h9wIUR<}_-`~= zST-&uf39_H8z6#16bR-FRO>Z1G2yI1aE+9guf!&5(eFlhOWjcBQa4|?PgP3WdOB!V zq^VIb(GJLEF_BONvT3rwAxu|>a@O@jj;bE~Z`z4_$TPzsFfG%2^;y<3Kcl4qhg&6m zeJ5Rt44~C91Dw2<2H$m9BDO{U)vaBK86wnFtXkJ|+FH z25c`c2VnK+-`sE$ZcNH*xjB1?gNMpnW#j-nZ2cpBV=MT%MuzB1j>jSFQm+n1#!+2F>y3S9{w+=eWxahM04K1bt)}iiFjJWic^Eu@RAv5f{-@#cn#j- zXZf4QVkxo!B%2zhF#8+<-+#tb>IE+olOSdkUWL+@Pu0C16U0pLAw~I;@h1Bc5t8m) z5{QPAalq_z&I&~4V`_%w7dB*c-&(d+5+%<|5c9(Ln-zD*qj~O^*SpW_EmikPi*Ln* zj-0QbZTA)_)jEsDIHApFxa)8vkQTTfn<=|U*H0G{Td%MEx?>?I zTj&;+4?Tqn2n0#tX^<(yhG&{;KZ17Q!Ie9f4gBV$P=fKLmqd0`M-``?6NtE~Kh%cSm{LBSnzK*_)iZo|{-r4=N33JiqMNc5 z2ScmGq$@SYv%3}X*uY9)OmHzM&7N6Il#`RJLS#$+%8^WX=7NCtJ#gO!TP3qo51pbS zab5EI67p#ukS!MLVomsdiWbmUOyMfI*XfxQCz$* z_LE`VfcUnk!Y^*(?ALPAla&VLK8Nvw&CQ--&!zi;9xzXu7ra|c`Eoj4b9~b&b0@yt zR@>FXjL`-Dk1)j4bj{Jti91-4q;PQD_}G?p8@pa`aumuK>XvxZ63*-$@g8BN={G{+879l~(eErg0W%7p&CJz)j zN5c(MM=e9lP_Vq94K=(pHukF7ts0$kCxt8j2^NE=NbRs8ZH40(4ZNLS@R5?y@-<_H zQn>JF;veVOIF$n7`Z_TTAs1%JDTy2-{n^=Tc5vhHg_>kJ|UO_AXuXf7|&&{^=~=Vjyf`^f6@ zs+Wc5M{MWd{RWRzI?b}(e#RcI8J@r0gIw>Zg1O!xZYao7y?Gw{DBvHxGYOamZrF!( z0td~68r`f;_Ky-(rl~g^L7sAGUjdc2N(=G5krTtZ0?>qt3uEUHEGhN4mqsW*zgFM9L!ggJ=y9tCm=y3SDGO_MFfBb46>7{HaYZzYgq;VU2`zRFnSHakKH3 zB5jvwW_2;&&|jw+?%PxyflVlZ==qX+GM$z$qDEPP{L*CxQXW*1xC;bDdCo(F(Lt9bpr^Y z4@6Ci&%}nYVKxAq5ZPj606GX6odpAff&zLCfZ)O=X%;wMvyiaEc`#J3OUS>YLB;fk zP0U3g=x|0$#{^zK(4Nc`bX@gyx)bw#k0`Eh?>Yd@hXB-qkIp#-A_LJfz8Pst_BA?Q zkBj@gR$mrOhS+_R%?iXgu0fPw;VzQd3m6gFknoti{E#_^cXia84UX5y74@EYc zIcO=xQmto2v<#CuwC=w+-D>O=PeBo*pbN3`YrOxKRXcZ$+`6mNLA@uTkr>c#mWasr z(fzUSsJ3^G!yjigdG@#&5^(ySeK*CEYSaH}MA)Oy?cy`!Tx(5^{+A#9(UcW|l5B+n z^!IfU$@Sx9f#nN%b~ii`Pci`UY;kW;=!D3!IWrqKBGaOU6&atAW2@V_>wuragc>!P z;Oh^uZ%u8#F(F(;b$-or*pX5*<=RYJ9RE0~+^yG&s#K(2sZWoq@$VMjR#9*rQ{FU~ zTO6XtMv0gadVjbu5YlV>ccevD#$diYzgGG*TNPf#wsv%sb!0#OXG9%fAM#`|>?%vy zePMpbQlO37&<8064$iA4_IjD4B#@_I{*V)6-Ug**e$Wj&UW2?eZeyg9*^ODTxa*^C zlrWwpj`@-PK3TkCJu?wKrhNP~G^Z zYYkkB*6ZYC^4oq}~qgTiH_mTuhRAw!=vdA#)on;zIB z0ic)`&Os3VI99R79RZ``!6c$TrWG;-$@d)T)7=~Mb7BWHs1*%Xg(VFmlOreC=NpD? zjR{U)&T3dURH~c}$M}S!yEDJ-a~KzLVFnOwokADS0myXo{63I^JN@-#?DWo0Te<|O zuw08b{3Mm7bl%R10X(1gPjfLVzGtk`NhMIamhtIO=z`z=**?AKw`Q!b8EpwqEu&TR zVn<^{Mx7byx}u}r$7n}=@9ujX5l&$#+s6~`R`n5AeU+8JKdGvUpDMbP;Y6na?HtwG zh4Gw({;Om*XF&)>(VXtb4WOHg1Sm@&IrubNNx$24%c)o70@Zu&+%Rc z`alUIzjH?hE;0(&J}s>!^XumUIV5-+jIae~DNBewVI&EL$~exGLi4TybAzg(ZA5W` zP40)e8yAeF(1Kas=CgveWyVk=w%-Zw)ivR_tZrqe#cA3<=G&F@Bg7!OrmgEkSiaO? zPxLhkSGz`UW$aK{#DFuCTfVax88}u3?+A={D2goZTU|6m+#$pFDDHM) zqygR%xaA{Xd68nMH|D{DBuL`pKN&nB>eA2%%wV+6X^eo6zG5@)hqL!)rD^*ANLMRY zNv)dAnd^TR9|Uv2*EdyC_Fw_FN2zDQNxF?u`aId7Hzcv+K?x=cQI0qeVzQB`v(0R% zU7sz)H-^yd`}9l&NwjeqxQ$`qI<5H%Nue>@=2|k-!Ok1fXmYSQdf6aLPaC%ks z*K6e}`aC_ayR$lj!v@6-+<=!6Huz@Tb?)E)fcJxi~E=m$`U5o->_-es4V))W+f;PQ4O6<0oI~%?j zNKcE6s}HVblCv4#sF!{$d{24}OGJkPCF{qg{YnYS-F|IB6E2k&c6k|zJ0XTn4Pz=)gkvk%{DvlH6^ zAa-4Uo)n(1Od#GIv!w2b14o=3M=+A48A66JiuP}KV#^3f!Vb%`L)|o*N}n`*mpT%` zWNtkVXLI@vfRfXkLH(P+v&@D_FuBs1v@GxAxFf8X$ocR~#Dmo{4rzF^wqQmV5f&j& zCbJ9b&f5GT^T9-&O+p1>itYZl3#&HL31$87_7_Dg(wk%0)Ze}Mp?47HPhMxE;6hXa ze1|68gh_y9ViQnvh_J-#Y!TN)FmqaaaAv?pTW?FKPf`xdJ=YI=2vm(4YQW_2{dA5S zm+q+a*jNJu6MjCS;>iOm<7n1MP>809Pkb19mES|1b6&*5L8(;uj2}=?w(&OwI_-ex zaMzh+!g*acjMCVc(~_weKA0kKA8U>BUicbu<&3CH;vgJ1QTYcLETk>cC=&Gx20mTu zoKkH68x6so`$$OGgVXPX6ocB6{Dl4C&>3;5U^C+{4w*VPD1WVrt0M!XivCpCH|vUp zNlMvTT+dYAjfU2!xY_*t^Fa_dbt30tD&U^ME74Kj!qeh;>+0J13B_Q3%y!@95V(-^ zbJtUdl%92bXDXI%{ZoWw4Ew>e!mS?e)sf2*&1Y}+5Je>ZzQ|bOC}u2Ud3i_x(R~>( zq#HhkTMUGPly~(~E4Cv`g{)i|-gcU_410_yS3dmm-fuG{M{DRgckVw)j!q!NIigt$ zpJmwA?Yy)+t9^YJXXnKICftS)hB}n3b$Ex`vNdLK6?r|3 zkb1W|Hf;JTczGGcDrndSR#Jcc3cAkP&*DkKx^b6GGM8r?dADO`ZX5YGXEKF<>{?{S z=;2=I_yC(Um`26_+Ep?e24N_CF_oVpi1k{YRyRc?9xNBj5pHn4KCJ0N{}Mnh-7*|L zm+5NbNae~bBiHJUzqx~`)!BJ**SOBMOW=n@^;J}wyU4B@r4`dlAGRLj@DSI{$7MBH zb~lLo?)kar{$<&#iXE21z^6vwEF86Qy+GKxgH$LS&!VlTNAZgb*#NUUMfz@0_?38< z3?=OMog$8JwA6n|3`Q~KAdKkg2+K|JR+kJ*>6!HU?Izb>OI7I5U1m%i?HWvEr7L0} zxoNzevOn<0T!c=(7oxvRMe;B!>x(KuoH}0z$fo`H18%2J4Uj~Xq8z(y!q(*xwk0PG zAdX9g>tRI-B;jkXD5!OWt>@w>hQw34orx@y|*~_jgE?*0&Uaj}p4DVx%n)us2zndM>6`C_E=uI11{e+4r zXN&-9-V{N~?IX7f#v15{%+U1xh4IylKX$ETSAeUcJscAd;A8qRkDGD8zKY9gt8P;Z zr#=*qm=BS0NPBndd4IN2Zp^WGntcj1B977hkIu&meLC*Ya_5%=FKL+pkDG=)m0^MZ zFo7h|Wn^^2t^CevQ~+Dq<{V~_FmdiH0K!xC&CBy{BMPsXjPGJ}p}yZ?-lS7CJRiCl z0b$gd-97S%BayB-+Yp|(Fdm}!h;u=K9pX$dboiA}3SyrJ{(CD9+}||^X=*_}*bUA^ zykhpmVmKq+HmUc$UhwUf%!JIoujp9>7^3- zy>oX2a0RnU{+o|^IFXS{+orOk9cPl8Ot;Bid@TKkTcF|n`0DN9S@OkAX5H^nFi0*; z(2ZK;p5}JlV(-vdn^zo{4wrN+jp)17QacBl_x`h5OxAIclN3YJjb%e&SbZP~b~)Z` zp@M`zrO_SmQ`JND;I5<_VG8q)PhfNbb6CNI94JU@&fhPD-nF2J;ef^uN7ss5K82p+ ziZ!`uUoZbBE(YdrmG)`4OCtePu0L0@gH&IE8IVjNR+~R0$whyKvx=_0qoZYP{$3|I zq~+OY6eiOihUA_ceHD<`(w|!V06?+_l=oL()<%lY1!|*e+PX@*gmXBpvSjmqRyf;7 zQ`M*I)kcgKZbrmnaM!zw^AE%b@SgpObSy?C_+fHqFrBYlG!>@C2}RSfKr_`2L-Orw z#671}xhw_^;;~S#%vv#W)6P~0y!NX$t1lr7mM}`d(}C&6wH7Z?HjpQ&2lSEdaQTnQ z2cJ?1Q%VU(`R~VHa*4Fq+Eu(*{)`-K7^?rDx~;F@{X_PyU!Ba&_5CB^Ix-3CuO9qB zwJ2F9G8NCrvfl{n{)_9I2>NI@A(m&44?&CtkBPWny0{t^^72oi^IU5>@Z6aUFKA$X3!*z)2O7$8AwBR*lI}@DiU3uVKZ8 zhFIOeORHyqg(GQ{$i-g)jZs{CG<1weG}1?s!p}Mf?jAnV#mgee4Nefho5n;qo4;tB zP~Y`pn&WndL(tM1E9b1r=EzT)kN-41v{7J%A^HTH4xlE~Lg(gGItL~lmRsV!Upz^9 zy>!0iC#biGB^$J~*5VK? znaF`M8+N$Ox*={;PI2ni7cF{txS4~-2S}A+#_W*%SsLof_FPFn#DB)i96Gtp{bhiz zNv=TRH;hjkCU5-W-!)Hz;9!;no8v@4_?fTY=}xoL56j(!jzrfzKSCGLT}(#s#7`9# zf06j6`C(4@P6=kBUL(fIpx=(43XYA0a_8zv|(95yB;eg17*C?i;p zZLRG^yD6ApTWr+t)&Nj?_e+=o27GxMn_UJy+6slg4;iNfQVv}>ZpRjnS_6q~v&^p& z-ijg7mHx?ANFWdFETqZglbz8S{Gr|T$^g3(K^FRTGu#Twlc@BUtfg1Jp;q{)npQe7 zW%9*9_6z%LiZ#3jQ7*5m1{w^X9Z85XV;O)XvG-gg>LslVq>q@Wldra5df2t^u7J~F zM%kDu6ztX-$0(=rTCyg0iO*#l^+m;8EAU;&|%OG@>Y6w1PJDkND!bAJ(m8 z0SikuzAyTt*HMaiKs7VoC10r*m-4SdT!5nn)5Og{~YZ+YP^=D zJ64Bs1i;4#$V^j@#0Hu{a7-V@o`@@L8(uZ7(%c(952%o##e>(x2B3QGcnm|9&96(2 zCp-c_@ya2c2MH#7jEh5-n-M@9uXzix9mFFi9BU#+y?Gqn{$6i%yL*2J3woQV7Mk|^ zeHN~@RSGjhbb!%}F?|{ciR(~y)`&ouJgf)>T1%&8hDKT)Rn2AyI9y|>dl`GUj%BTI zb97?biVEOQPRWAHbZJ_AhkKiVdF{fVzf5k9!o~sS+HIllShrWB@}VwWu5WS#z3B?H zSI^gQdzuygBznrtC(^Ve1{Tecdp9ufnOzDe6HHinh?uh1`EPGNfTH}F0RTJpU$*xv z&|1y^SFw$Mgm?S;bF*Ij0>ok=Oh< zdy^>nxtk(!cioX-Ui<8B-89;LnRd1lTxT=x?6#~Zc$BD3`UL{}#ZbCqgZi#%-vnrl zBu`pG3Ztr{D-uC?9hZU+)E;Q1Td_YTXGL4*mKIH~RN||X%EN${{W}@P=-zke(2z}4 zZ5c8t3LUKvJrJQV6J}S%I>f52FC00tcMSJZ-L)egX;EGuJ0dyJ@_SAd)kGEET}Kw8 zgRBr`%@1H0fG0u+yC$IFa^T8`<2)O^K2CXtTp_2^E`mW|kaj zk^7T9QAEe?&Wsr?SMgP+Iq;^%eL1pMs%G|g$CguI2TueR!(>h z1xahEXfSYCl=Hs$r3(IoqLOQ#ali^rOR#22ibUsO_aV+s?-KfgAdI(X(>Et2mW zYFbDHtSpSZV_293LmuAA(F^g$Z%0$Mu*y}1Nd|o3{ic%tWYOF3Y(qqh$6n`DpWJuy zMLyKN_n`Whu_b|4`+*Xpi5$56wJcgekwpUHnD$=DgMJ%n}4DDkD1fa|DV1 z+hzhJ><`V57Lw%$1PkqTvJX<*`M@+3ZVolUgB535@u<|G7v7-&=8O>=|MD8DpzrUI z+kvzU?8ej9j*hDZi(%H(L!)b7kWNDl8sZuLhc5gjixGI9SxD0T zvNju6PKY%<+M&W;uK7$*YH`K)G+9k!m1+!Wof?&*VWXNUa(IL>U)-zks`&#hAlyOJ z<;ztLWYS{RWXFtsS(%FP3!es+{uc^f5?vz?3Kk~%ZIPJYmDI__dMw@{cn)kqlzTa_ zFHl;*@6-sgJW9N%R`5BF98F-(UfVfsaxe<8ilncLhjb~g6i>#_E@L-ks776AFh}|- zoEX}V^60U+^pr*ImQ?X7d4z0ty-R9K{UnO?PJ8E~R;M@t= za2?%O`nvgd<|!5@D?gMP$L z+yo7YPE2o@I0w$*Q)Z>Jx>@1IlaiR?siL!Z8Q zsKM#2Rl2<|F&|kVl=v>+S&(117Lz1E9Im5SB_LAFShrEuA2d3n+2yfPL<+n|#Zu8G z)V%h`lKgTM`0&PSKF%DQNw%F83R6JR5mm$T6rFlLdn zY+e+8$n0<@vxFB~1xh62Rg(`C@5@mPXO>K-oSY0(#$6vDKgUaoMBQLEWBWP{>A0Pb z;$}YF25vQI&c|BdIU6U0sdDJb(G-c+1Pe0nmNnV_4LK*K*Rr+FX4x6TbfSDh-3<^| z$15f0w$MGnZy`Sa9{$*x4eRIi2a%1Tx+P%NR|cP`DwLl~*^PNeHYym^*edUtz`5EE za%Z1A=x4!=O{=Lxp3j|16!>IQgIkV^S%9{K|WN>`UpazSM zh;cuDYY@9}u;oS#s4RbBqO9qUQ8<2X@<)h~AP+a*D&aR`MV@PNR81ZsbJVc@`Rjv4 z`u8`W#`%*kL|L)r#wFa{<5J82NPTC&#zLb2KPgJ>@dd#`@USU4S8w29mp=P9^)joBfADu-~oh-K{8Xp_&vzsHn6R7oC zny*rwj;l>~J4Tay1c=sX{ot4wsLrm|8`q)gjsb*>+AfCi^FSI(-M$u~L14RI$Y8Qc z+^gud9cI(%X5IuEK*s@&@PetcRTXJOZk!Z>UJWZrN0z{TmOG(J<|iv~xVjx_A5D8S z#*D;!>WkR0uJy0cTJNt$xp=OIRu?MqL(LP9Yp>7jbFHIPt0GAvEx8H-j5u$@cAH0( z*(zP}PF6iEFl0rd(PpyAKXCT-e$YlO4ZN5Z9??g(YbX$}OH%}wc+bLJs8&V*`&^h(i9xb9Dn&N5J7Ihj6dND5HzTHQ*jWnRm;$p zI&Y#~l-I1s4+==8?gN*gHhvBcxmj7W8u<=oZ{r!FhB_FAfHzF{%7GD;Wk;Rq9*}(q zeQ;TFrfc*{c<=dh{v<4oA$h)T;?wZv^-azLz&G_W2)Q(WhNXx4E!nX zDSuzdvY{Vt2D*xEo`1+4qQGAI4LV+K%--Ao4^Lv{5RuLr1qMiz(>4`XUYTSDvwM1a zRt7#AnK*s0!P#Fr96z*!h4p{9w2W@?c?df<7wpw2H;(=d><*NF^fUq=je^a&aYVjf zm3-q&JXog_5s~_Im8j$4X3;EP&fxox6sY2+TgT&^Ep9B)YcYdQCpog!r*4nad)Y z<}w38Skv!Gj6eoxs3vL;ilfv}uGr(WVR-sF8WDn@&qit4;+v5qSOrzShr^q}d=RByF;Grm|#Rvz6+4)RH`t2{qM zi8}L-lk!j7<{0E6&ULi-MqJu_w9~1k!Xqm_mCC66iwdSmBRQOOQO|;3W{zFBqbBYl z2{CC5hKT|w%WVotsd~b!kd7mgDJ9M-0Hs^bfedqJYPjU{Hbj$z-@vu4k}p3#KPsx6 zQLyNjxOINZ2*cgnMUnW;d2q3|F@K(W24P3*5!b-9gH4w7=XY1s&P013feyhdTBUIi zs*Ts`VHwwKpN>6)Zl{=u>ZhdRrl1g3R5ndGITg=bipZ-J#OG)b)VUp1oR(?tl8(|FHD$g+xC_SPy)}b2oL+e zJ!eo{lLa%;BE1s$un|ZxQ{q2v-WPv^K-ZU-KTRtlf;^2T0^iSx?F}8jLHsZ4X5uqA zD)Kr{_!9VWzj<`g9sh$x5T)nih44KebO>tl0g-|WR#e5poCFRAb_4t&x`86Xj4)C`HM@#^Ee6n$ZNs`O$TP%C;1uyVt2D7QCV`N zKewjh#|Lh**C3jhp@}g*s<yr~{a`(D#cUNAc(7hzR(Co%{rxBePzYUpPw-0|@<^AXxB1_Um@te*d;R zI>UN-WKpY^RGu<|wlu?e&o$6&nSU*=xT-=mW*I1@O1Hu74h7yp}RP?sdo>%(1Q zZXL)xvgfRg|HLGSjyv=qjD85XD?6?|@o1z*um~*^OCAOUT@Zp`2P{K_=FlaBB9io( zC2ll(8zJBK&SD*^H&bMq1M45m0wq5jA^An{E+c}6Df&oUo;6t(*q^JnFO$rdaxtay zlwKiT<~*Y0JuqjS%LFlCycs=R+pSe07zV7~zlXBV+(?A<)tF^pRck999xA#< z441{6)}azE_k0)02rA7qBZ_5hE%57ljU1+(`SxHtf+&lFy$Xg$D{>`uO>~nn#ATSo zN@Ux-P#UQP&}ZS?W956+P8jl*ibe`hSOO(knw4DTV~i=mW3>;(0*a=Dbe3(C2G2i` zI{?WIKcYr~5y#qT$5}@szy7d2hX8I}M$>FmeVT7F0-}%KBu@0A$8+AJn?l~a33I~8 z>V2_NYvXVq{RwH=5;tv%t5K9vY8$hN;>Nm>3WXt7a%f}Ld!A#`6uY6UvrDbz7Dh`^ zy^N#k_;|4x8kEEqR>RCl%HUuu|Dyl3WfT*t;=&K%oHudr*!_dW*6O6N!#m>lfPx-$gmE)c)0cwTkkD;*^mjjqtRE;&S0KJwqV+ zD|jzOvV2!e=F*2QY8|gE2gqg7X>YJPfCu_Uc-iXOF$B_pcNOt@5Zx>o4GOeIgsr99 zLl9rWJV_X*Gn68r!L>Re+=I^1GgiBpNgINbw$dWAiSkJ&0|Mp_j*dd(mCFF;ogjrb zqZ_GSY-nN*6r@(x6P_BIcSHS~@}m*)ywbs;9_CB`Lda35hY)Co7SD#uLCOngFM5tZ zwy(aap(VEnY+GazXixa=_Qg{4zjg~)4=AhLXm(UZoM@#E&7cT|&0S&8zK5E3;rwl@ z3mh^JT!zZK4d+P-~Hnj*s22k&Pad*QgGNd5c%k0ll>MkUcw0ZqiJW<{mD#AiX z^ZN951>Km~O*V?tpS+hoQzZ)s$;H`1*CG`yGTZMp{lwIT=c>!yh;j0UED{y;uRKQ_ zL@&hG&Luoez*8rE$OXE_L&%zMcE$RO=GrrXB;EpRDtK(?hTv0oKr+}KkD=j`38K<_ zIv$xGh03n#zu%vqdU8noWw&HS(-&QCPDvDQF&tvg!~0(%tD=twFDy({%bP+8nae$C zJG|*@`B5Xex<%YR0f9-D^Qcw>eba*`JopQ^k`iNIsCycwwd>6>SS?@iH#Xlr!8-SO z4;q~tI~|F4tE3OBbR8W^$deuBSDIk^86It6enphy;E){6JT#Ks0))X5^Xp_-k5o}GjqYxpPokZ> zno)>KrvRhMy{gw-`X|`+f;6a`v?b zz{|hmEjIUh3QoQt_*e1reQW3S?Kb<{vgW%w=aTBX;_`nNcV0g6Wx$=|@yo-h;j)Go zzxiX={>zKc{pG>IgpkRh*CX)kxm$VE&u-`7$O}yAfWeRxUi?Ap;cO@3yR-RmMil*n zkK3JJPiZ-yb#$WQ2wLEAPpRu4p^dc+z-`#kj!)nqo1b|chHP2Vw-^wrX(hoNPGpy< z0(UJA+DN<|c8J26i7DK#9TwNky3H0_*(!m%6gDVlJ=2}#&xJ%#!@itj#TM=Yv*a}K z9TDth)BWrZao0vj&}%a&JB!|;NtI$ZCHMHdhfFCgyv?{U&)ayQfGw-TC563R8eSr0 znl02|CFc>&eIJS3D-%hur6UpdGY82oNHt%T1Q*i#G=8aYlyUpRY)PF6)q|h%h=^M# z4*I0(7@jM!40?E^v8$)NHfeVC>H1lOJlG;I%ZbPzaS$fc{SK3*Tu`IE?axoYylyqKWPlQbc!(7k||+|fsRdvPRAXpO3+GHl6V zH{4z2QK~;zHNn{B%w0DlGl_Fsm*niLKM8Vr1wlf9%IQ|MOWB3IO@q9C)uJ*?MOR@J zk>g5>F!l`bQhmFeX&uFi>$7ny40`j6?MI)6S6k-UPPUfiT{*a4MwM9XgR0XP6c46* zBrL}N%@l808@TzXr)&wg{6F|Te;qns*S7XDr}j_g{WQPw%x7TOO<`KrUx)_A<$%XW zqX*|FJVcUQ7Wx5Y#yT-{I?5!8KfW@Aab}z*y}Y$36wQn?BCOtNg7xdanFhWd(F`Y1 zj}z~crATB;=aLT1Z_x++ZW>&r-P%b%?0eK;|1`rjd zy5#h(w7a3trh>GfQ=RV}CE}Vh--%dHuWo8cIaT z2+DI&DN`6I*VWAl|9ozZO>A*jywMVi->`C4q3jc$lmUmBsq_$F=(X{KDEEIKt)iS9 zR8kvV%7hgaS+8`9_sU10L|Xi^V`z9Xg-vA~5BBd>?Qr7A!j&Cl)jiWO%leDr@8NyO zZpwMKI%)%hX2%&O?mnjMGubzaol&I#9YZo))({BFd4S(CQ3 z!b#Pey)`&G3t@&B(EE+li)kDOdpM0vh+k-CV+RW9@&kq{CN47_Jk{N zvr*XLaAUEp;j;Tz#18Nu{a9G-T>*f9Oph0V(lqPQTPMlkJ(hxMx3yCHW;=GrPA~xe`fqb(YLyDvJp9f<6;&GUZsB?S7)Eg} zgnP`G1-rq?ath9FJovFF#?QOIf_!(x>~bw1!pWHTuUbNX<$O}>4xw<4>&TS&u*b?a zb7pz{ZWd+LmPxL8etpRDEzc!fE3(HoZMU`iZ)m;*|7lB7b$PUg%@ONb)}Od-^gtAz z!fM$QUoth|H=nkF9SBTVWsa-%f$Cdy`qaH%hf!^D$3OB*+R-seyg+$4@7)WJTX+cm8Mh%i7J22p zj*^s+zH8XEJRBnB1S_%4kV}C)=B_2f1FFCUV@Jet@vq9hpzUvrl(1-_Y0KZJEF{84 zqh@7-R1qL%t3a;FI<(C(?+%?I26C1UVstwWX`*)OoK#pdH#NN6DiGOVB?+lGw+hJu ze*3E^ms_Yc_LxswUNxnulenYnzSR&wA>jx4#$=UIbH~cDN5BRefw{h7d4o<4QvFTYdg!`h$e+H+Yu*pxshoNjt z?NW~_tRCy=v8O&Qj1FsP8uins6T4(Vnb&?&YZJv zkqB-|4G4lkfVtCqcJ^cqz(FLf2_C~`bBYBJj*TMK*`aLTI%v5eVn@)qG8$r#XTpo0 zhElUB0mHi*D;%wD`%5VC)M?AVI9-Q2@N)u9_r#?4lMjhauyzki4(Y3gHZ@^&4JMbD{9{Q;S*fId1P4?F#`TL-6Rp|f__Hsd>Tdce+>n@{y09*9XhnRF> zki&H+S zywgvKCn+spzSLB)e*XRzA-u%H06R+$CqKo~hI6;B?8yLO7NEs#1+xb|3uuO|UoQXM zm}|Q0URYN#;w?r(_wAQ!u^}2Qs>MS?mKT8*p3!_53+sH`Pdt|IeCmqWIVX{+_PP1# z^sPv#<3&HApM~f^aJfOwca!Q<_7u!|^=?uk&yxN2T$vfW>zDW1VO!pV9dTVbO!X;6 z3F`3zRGx}zal``q8h5|ZSeX4K@+GbsneCo_J`EKEzBPO3^CuNnXEojAIf0`9d$4`5FHYg&7 z+NF@3xo?dj*2N=owF0}Fbl8)QL;^uJG|UJQA>Q&mA0HPJ@7qS;yOI^EhDGVbEft(c zb@qI92ncZeA6~f2xr&*ne12{S8z6TP5i#AHST~+CeG{i5#oLb&u*{XI=dFaESAXfU zz<^F3Gu^v-(u@}180s&wGdb<7kc~Oz3w`s?H8UVUbCkrfybfL`(A|IHOB7+}CNTp? zdJWsDaqVc#VOBp6tLiG~x;=LNA*@Y(a);nuqzk#2k*3_9nsV2s8LM-=n4p!dF=s#1 znHqd2OE8IHE4fVS#Yf&b%R-C}t?aRSBZ7(#S*r$!>u5;+Wc<2$upL$(o2WT8;IMr# zBJ~aZ5V8M2)|Lh16V$pyW5|B`Ed*nGk zCj=U)%atD}=)e2;{NX4dg6JPxYdqk_{y zo?ZHQw|=im4k)cD6Q{?2Yl^Wv3<^n8>6Z-`G-D}FlroMe<{P9rRO3n)q?a+d<{xB# zc^1L3adnlJuytK?ye8ujs7WgQ(6mM}opWnd7eeQ#@pkiTIe(VbiI8czdP@_^tToT7 zbRerGSLsAOoV6aB7YbNZZpq-90tf%G7|pWLcLydlzE4T2b->fsl1urET0Nx*4AwWVX}zx1^ei`s|5I9ka3dq&W(D)( zePFS3q~ae+%ht_!XyXF$zx)nxM4bnsDd%pa|M}LNdFyvyKeS$z&|dEbM)UbmC*oZ_ z=wu17w;jfO&0I(tY)XywL=kRY%Ucop<};dLAh7?sAcRIi-dAzOd3_&z_rwus?v(K{TV!z`@5WE7r5 zEGqqOOGrV)AE7Z<&s3y^6uO8^p3w!hU z%Ou^CJNF|Cu~b~y$_A8W9X+auq_>O{S2E@wf#HUl;(BdlbO)JUb*Uxz$6tD{iCR_i zQ;tKHgT@PSJTLl?**jrmMJ>fty^iI?$n4kbD>N`Xd|lXtk~q>fS5i|xm{@SRC}z}> z_v4B+CuJj%)CQU%FK=u3iL4j@US()Nt6pNakI(0}-R-{-^bp8x*i`2K@#kMwCvB3NXHM2_P1;(^^qdc+xqpJN!hL;ucAXG1KEcfq6<{X}`b1*)yIot{YUQG&Rk z9Dg`Er`NyQy)%jbnsBcjOAebP(_XQ_ohV$<>OD7MB;d_y0{Ff!Zyp}uqq z?0EbmT}h2OD%KqHGXm$)Vd}Pf+vHE40nOH-0)D&zGB;Y-^qQDxvG&9k;XCL zOi;z=%R>(Off*6oXTKTJ78*e>u+MR!bmNPfy7bQ0dHTdf{1eF8e-Xrx(KZXRIZmIF ztd*q}O&yo|0Cf~BpN4yyght&F!M`e1Kl?%LYwZJ=mE7Fg2$lbFOqO@z6~DG%CEoeF zwS17);Ii5x9teryu4P+x?w(?DgG5HybOyg5dv0k4*HK$EXEnupf5reioz|_}%jhJX zz1fXUNe=H5>Nh);Wb~P;*u6zXQlGXjmZtkI=mn`3nXh9sNweGOZZ)tCVaUz1^BXjr zc(Pv~W4?#et%b1zW#>|#hNm-ErA(@C{SKFAxm z6zj-L9D&`7YFy2`2DpZg!blMAGwx>ErU(!-husQ!PyPiN!Hg9;$i4eG^^nC13(o{|)X7l7ts zmUn@$CzjLr>=hLUg_c45=NrGL6AGSqJ&`miDOe)hUWIDMks_$mdPf*9T2&Xp3uh76 z`^#PorNxbY%#Ia5FdcjXzUdak9xKbw64wbbfaHuP2*nA=B9}H{1HpYM4?F_-AllWw zvZ@iiS)%YVQA{~Y{i*v5!za7Us0~8m(?v?`63B~8X-s|mJ9hTI(wHKvNzW*Nia4$+ zM%shnbWLW4C?dE>jrEYB-AqrV=Y*LRz8fR2hUx}<#-d~z%|u9M5Ss)A=@KN0EC)z8 z@>L08`D7XZzA}2eP9odaN%NQxNtu`c?FR--n7(atEzQL z3oySsgAqwB#OoH!0kG7A62DTIyG>F0l)9=M`VF1<0*Z)SF-GcHX9TbiyqQJcl<9G> z7q?P-A5x(n0(KIb`-TXgy08uIcq4pZtXftGMdHz^(dDyU7fc1ClMIfLiN;OQ`5o*- zUPUcVkVo5&^O;&g`el3F?50jiub9g1xv0{dd_H_7i?)>iJ4ds#p`WjJRy=|gW>Hvh z(;;si`2TP6grln84P<0wD!XQri^FN_`EvA?Z5X=nP^|QjmPT;!i?|ViU4CEOEhJND zM8Al+Xjvt(yy$yHSsUUIO4k&R=zvRe=N9O8@=h#OioWD1h$b~<;+Nd^*^&JF9U}8@ zF!*k0gfpk-zG~hp>d(PpeD$s7X#;GAYliM9KmP6NkFrMKf}+Lh6_@--;<7ls1JL%y zlY)0z-Nq$?eHuEN3Qx@0Q_8gs)<4kkvtCVCP4(^GUEkdqO79tsji2Ojb2d9JpyuRj*2y2N@j3pKo@{1Y)<94j|zlHJ?T?KGKg@XUM< z!S~zN+0V(d#cnGw+p_Nvbzr-ANyZD?&kiZr3B+`heF-KSKRnv;B7g77Lu{IdD2a4` z8?~qcjdLf-k~2rns}QpnP?s=RIf|}`or9}cs^QX5Sh2l2xxAdxB4cbgNKwab&k`3R zYp&a#@uSJ?lA5r~qO)Wzy+Nm$y=RII?+s2xEaolA`GK!AadWL=4lL-$)rh`yk&lQhs|fJ(&qnZ2=a>JgT z{U2PnWDnM^W-DodDHVA6ap9;;9KRbrWgomJwgMB>2($Cb-56*axVX(1yY&>-Os;IMCAg$DN8%PU9pR zD3P9Z2`Vtk778raMQ-)O4E%ZPau^))njBWHQOj-zPAiqmPCOAae^pv8KB16AZDe7d zX-H(a%ji0y!4`u)xWCd)sY|5fym(|8Xe2wBnQ7?fpWFXD0?(dSawDtgxRc99C@X&Nzr#f0&BUBhJ`<2sBVPB9kuH9g1@J zwk+GLF@H!Rj#CN;$}ff|eBrl?BRy;@uR`n_@bN%E7lqYCg~u9o5Bt=_jV&dr=A-AO z$O`F8K(FA6#H*MPF0+q%`3V9eg%yf{2wl@HRNvMnl+>QVK)}szxa>@;~Fj%hX=_!1( z`TNhZ&IdW~eLwG()>K=eH!lHxq@0iAD`VxX693c z!$2BD!1n3D)=#bX6#)wbJj49T;7D{2-|25LED|@j@qQ#yQ&PH6Q)95)6pQS^HeQ_) z2G+x`*&7LizmBPdZ8N||@pe1xbIf3t9V?lH!@cKIm3A>aJzStGn439={bIhOHczV2 zxJCb!BqB@nAPEnRNFmUG0YO24SY#7+MjEB~k|uh>i8CYF7j;2d&^rd!&YZgpcE_5~ zu8wpl)Tlj|;7whC!-S=KsrY+3VnO!w+ z|3kp)%v0ItnHQMe5eH2b0!#K#ee+t!##S?WQrHGs7I`CxVmeV4Pflj?7~(GcP&r7b zz!=3z*P0MU=SShUKDxi;CZ-;H{plXi?GQT`NC2?Awl6kj#_u}n9%$>NQr2`u&f5>& zp24cvE=~8#>mD=A#5{FjstT@13@-b-@u_FqNh-M8>xo6`$L71D)ZYp3oO*N+lya}g zkSz+D7teiWlWie?OhFs1o=~dTrz}a$+fMS@Bjv*pDd3sKmi{Ie9-6Sw=g z$x?HH&^{j5GAXh{x&7=u@A^&%G;q>0KIZtYB^>MZBY*unL8H%?lj1;cRR4FwS4`)- z5W-BYf6@l3q@<+t!)vC;ksi?Wx%Jrm)Z*;(QST?)kid$vMeWHvSBn2PRf(b{JD5O9 zkZ#oQ9EBx&E7maDCwbMKQ+IcN=U5-!fB5;!8@~T{qORzUMlyzC>5{-W+2^rR#d!a` z5EX2v`nz5`*52$j`L#c<KV(_s$HK;-1Th>tIs2+d~<7!n&yJ0 z0n=;0{7rlZelt2ZBXge;vGuzXJeU?3qv$+D7ZrYLw|k|a_He8O{xM|sCSh*Y%*hEY z!O;{@82-Y4uzRX>mPXRQyp-p3H8^@1{Oe$HFWdOVXBx`kN$4YZl!Q(3z}bzg zBQ56c*mvK~0zFulWD0GOEi)SNgr101=G%DnlNDegX%JQn**Qnbb}241N!X~dW_yPZf_zy^G| zux{rhidqR4Ug)#nVDa}we?MbZD=JbG=30{V_kCVpmP^@$yjf4JbF~O2a-F8Dk(!!E z9>7z(6Q}jJ1sq#^XmYEBqZwOcE2*+Ttu>JxZ2?!~coulteCu-}<0;3em^~D(akcl~ zDb#!D(b$gos~F+Ro+yP%onwXt*Y$ZKZue^|bv<_EXCd};f1ra$Psq$jnzuu6=cShO zhtZj@DdzyU3G09*iBSJZQwguw;sgJD7{tW*M4ql#K8PY$@y&!|Ua*hjk@|BWvt9@O zf`apt9m$j|?a3hqVcMt#v2v87-;88X_+e6Tf1ZSdJb8I+2Q%-+UT&IcGg$?LAAyp!grFJv6V?$Zvr)VJr%qZkBN!F5mZnA4qVw@ z$zx|m!rD+eg%xW*@R%mEqCWJvXI1$(H@C{6=Hwo+1A+3 z^vv-hBONr>=lyDA`f*Io*n-FxAAO3|A$6G0#J0= z=_R*+?=g3@lA|eI-7eqwbK3I(#_onZoC{7X|)q$cXqhQQzr z6H!Xe@UIbos_K|AG1Gk8&l0~-uQu3C!~q^TMvc$@61L;%1cX3>ct@%6`EyBM_!LCu0KQy z>=@b*>6CY)OmLu=HVtU-v8`JN8PSm3%IH?05Z6k(!Iu)$5u>x%F^tFUosnvJ45Izh z$4j}a<;a+mXUzLVp|$_6n@CwIW2oF&r+W=4u@(1L-K4VCK#)2|l2h}k5+^efw2&~@ zj^m5$Q7CB>ai_c5bwEbh8J(aTP90qsx%ud(3vtU2XLh{3gng-dlpzMiud(B6@N;Ww zM>rO?US*6lZsyt=D@vx$|bH}=W1S^VW~TQ=JZ*qTp~F~u)3VZt{GW)qs0gwdCNR6=xy~FrdrmY=~&FL?73!MIDU9}`qM3U zV#;+BG4#`z?-DqI4!YG$14qyr^9I^3egcuJ&HvH5tY`lnE;uT*k7?ks9FIZ=<`Soa zE`TAoOR0O!=YKa|m{BBkPPX36%K_c**d_*o$ctDZKS?(?&imb7oUOeN*at!*gdb$& zC?m{W11OgAH@=s9QCNWC^m3e-S}`62Q9}Dcs3=o7<9j7nxz^Ps%92RlH5aSo5FhqW zI0Kz=2IIP&T50JK4q8eDx*?-^tsC_YBv3}YYv1|whTsxs$yk+j+VM6goKI&2-q^u6 z&cUyQR>Ybc9!uSI$n4=UESVzrHZG6h*9_HAb{l32k}c7CVP6e%ESW}O$yVIH&Dy@t zp|QMZ?X-EAt{8@g{9qwI=2%Hadez{cAq@ea#H4nVbI82tLsf2asQN|wIrL|sMP3-Ql#634iUh3w> zSLlKhitam?IOdMVD9}R=aF_hn-Zro+-$)JcUolS~ zG3~jbQEmeFn7R;Fsank{(0<*m<;li}&QZG(X>=|UGzwQvwq=_etJfdav4=f}NM$Rb z1lyn;bFJM-Ig)+hE z#&$DfAz0XeF6;#}VCW(MvxmZ4J#9Fz^ZiDo_m3Z5?LAxnS1xoiiu!R-%0pPJB58EMoINv3sDC2;o**Y7yHQE6l*GIQ-HwhkWRWa2<+Kq4zI&<+mAVk3-WT)lU@bvU;hi;s$ga>P>r=5}Tbo;N z3^-rP`loNJULV z4a2NXs2QtgQ27HpL4;T_jn^nB;)f7);A}9Ira%$~fgBAkwsY?{at6sa#dg@d8isrH zwgzO+UUS48vyf z6a}?s&&FSO{AjS!>Wh0m9(gzZ5AWQ6@OM%e-M0$9+Ml>^Z#bj=O4`3`>qeC zlbvTZKv533etLbv7B4XJ)+_{|P!b6JP*`D)MhLeZo_|U=#mO9WRCyO1Vjkj(l+*W= z!+3EB*zTA|CNS)lphq1vSK}co2IFR_q?aI*wk+U(bwN?tkbNB)a|uUoU|{RT;ToI; zmc>r0jlr6H{^Dy@RA6rQ`}^%Novj%xoMWpfR9eC&?qRQKgx?~aXLvfHNAou%r9rfB z6>$?%9-{hnvf9j#M*zm4B}JKp3f)}xY2hql6eypX`5LRjl!?oREC%;rlY1A*5ypjG ztNqZW)b36}iEAU0RY#$IpactRET~>Szy8OAstZb}g`+&`ksz|pp2EY+yOklnp z<8#L(`XXZBaBlr0VzG{R3!?HaC z%3o#?Z_Q8BNrw&w$BpjXB?U~fcP*c2Z|3Mmf{A5i0;U2}!Qe0ojxTP`odTt2uf9q1 z)%Rh+UYk4XdXZwxnv5JFWw}hPqcqHattM?L%fagzJ0=>`rIEQfI7W($O!i%^mRCDV zZf~De7l>2hGagab$}Otsn?JSAN9a50h{dmXfN0*G^!M4nC#YRLxJ+`M7XNck@)o3p z=?J~*9`Em$-QE1pDa2QjeJt5=_0-el6(H$}1xFmdr$cf^$yl4M;IcP)$vb{X>0A2m ziemy#^2^QP<>e+>o8uxJJ%Tzec!^28~y+C zn}5+*E3v`xn{u!-aIN;5O!quzO|nw+r+(r4KWU@mxV_Uu#36@M$kPl0kC6)}lZFN` zxkdayjJ)ZD^GIT2$8}f=0CM2v@z=VpH2n+E#5ZQ9X}l;_=FPvqT{;&uN+VjV7N;xb|$E%0$MNR|%m+{)q4GIpuTa2OA*Hcv=Q}&%s0B z(ev+Lw)6Rx?`QB8In!F%a8kP2by zZ~eWiHs_S?-;K0H1y~3J3c@8UfU{|IR0I0!SzL`N8PG#?d1-gt(z1;F!SO!_5s@5k zyYKsBVE5NyCl&=J+;nh6S!>_R8T|V)6JP9w(OHDcNFy zt=*d`&05(u%dgHZ1AF2$B~0{$0D5vzG>0=+>KN9<6%RgJy<*dKnwf~_@3h!h#de9;nTwmoi9H1v>DI4_)?OhgYzY?- zAkfyTskvM}xUQ(oEk{j|cN#jU8k1JTp-;R?7zW%Biz62Z>|X0tqI%U7v=OfN!^(zl zlw}X2o=w~N4H8)$V8lVT|5M&H)`LN`o>qn~zs!Y0OcEY$kxFu2S{D%OOh+}C<%c{kA@K%~}63t4)o7D+xt8*=@VjglW z;rRduWoLH>xC#5RaCK@eo=go#e%pG2(6|T+eaH3|s!9;??08JvAJhEC^z}=eW8v*^NkPV5T!TUcUZ4 zw*50lEE5#-_!(OVWY&fH8atn)pzk%{GB7H!gIQ|kj!X%$92OG6ns-Lgy-6i-Te_@8 z7}iI;*9+JrG-s;2Vj}k=>}KkvXv51nz(F~3Fie5z>vER7Vv4(Lq}+il>8&rBB#iA7 z!07qW9|2-aBfRTh_O@LtzvfZrfU{HP+IBT+0%#I;Z|sO6J8q2*%}un!V^-DW4ZDy2 zQ`pvL8f|C%$Y^mVzAV0<%XxWyPkb@h`U?HWVh%=Ig*LT%gi1oFcPLcWJ5CpjMM<;I zlf~j1M5Itbmv=R&;R&aJsX?o$K^jTCAec(h7W6elxa+erqL|taJtC(|g?U(*ohlQT z4jPsCSjQ62v^_9!)eALoTTYvISRy_v=9KcAQw4bOXa&@Upir1;5a>(O#}c(j^Y1xV z$Cm!Z75AoGD0Em)lmgvlh^${UEU^bL&3~BLw6on6t;Zv6!mI)h#INd{HS|I&@#XWc z3vLcittAWeFe5%8tX=i$H@p2h$mi_-U#&~{=j|OZ!b${G-`t7hB-^n6>*fIb9ir6H z27ZJwakFvaoP2S_PdGH9^VYfDX9iVDuntyIP^Tad;ly|;6UTa=`JvfRJbXfG>9nZW(6SdELlW%@8t4J||meqO>Cdf#c2O zbJ{ZDnddnM1skjULvT~g@*`FH2X;i-t`T5?RyiIzOTR%G>BUj-F!u4RRo^0!OaNJ@ zX^;@aHg<7HSz-uoMW*Jb!2T%Lq%WHeb2~jeM%AaZxz5&aLP$|`ICwx7^{?E{&aKAe z1rJCt$>B|w4O?5+Ib~i1M-d~gXb*D|iu-Cwvl%*))`ySn*@k}TmuRtK4rPikQH-Nt zDsfo>qmGn#N#1PO%y`U(7|V2m4R3pj+AH^JI}g_yS^|aYP0i&9Dz4K+Jj@{L_5$Pw z+9iav;+|n?aO+(q(Pq~^9EBE%frxG$8g6sY29uwEx(O~QS~1m%l`KgcBR?R=(cj5d z7O~S})3Y=7ZQ281jebt7vmQFIpSKfq6P!+JS4Byrd%w(KcEYylO=M%}?coUa69Ipv z;nI^mZ$O`rmy>YF0816&+r2P(gkjsttMp-Nyxo*a$}FR8VG_hlBJ>)2D8BgqQ0 zTJ^KHvw^Si*PPxt7sY&4WHaozYgHs5h5P%e2A)Y7j-U#Rl%Le#iX`!Kl&Y=!QX{+~ zczJC@Sxr$I1JPvcZxoX|vjnU5;_2l1RV4Sy*}wqQ0u7j#yQvSxTkAHPKuR{Syuu== zCc{R(a4?nqcSJXn+B&J6+&nv)^5BSksJ?3=6)7AKP4vxiV3Bge--BUm`WXlx4ky=Y+TtN|3x}ufjMj}mVESa4ucvC@CsOAQZE#$R~?qp zLJon^dJQ)d=936l1TWdj5Oq?@22>i2!~wP9D9G)F3V>owm2vVmSM3cKs5Nc%FE62l zG&uv-@gdg2_m2>#7_-u>Bn0kB^PcR-hFUsHyEO9?*UaFxk1@%>xTOfHmHi zkNg{*e*gD`o4+~&dLt(~KL3N4^Y!>Xt-ZhhorYW!H=osj7L0fLRD*G4Yw?c0@w*f) zlY)28OLScLP0u*_n4_uvOLO8c2e!$MbSQ;z{S=@%9K-`XqNSgW@iFFN84OSd% z%d_7)1A*H!T1*?XoMN&&Tlg2%{r=Wm|2f$Uun)_H!Dr zygE@u{{Y6jd2@MLZ3PPH$2t?B3eiqw6WfF-rwQ0HS5{ZwFP1uH3UvLgp8QsE(mmC70TB7I|oyp)dmA=vEYGP zeF#R)F@`O{B?AS=po2R8UDY^mI*|aHOVYl*y!K{0F|+TUrwXdAV=J`2pKFphDX92o zBdx9#epO|Ag0H60xUhpTM4Lkyp<8q-=qOete!Pz-FsQw81cYcpFbGPehT&U zoYpBu-zr)TM0UpeorB-*&;Ld>@NhiQqWqS+f9fFq1U7v9M&wqML{_Swf>0cz0KtnOuGn*~>&RMz_48 zK_M7&hl=fFB)sM*&Up$v%4+mF?*zPA7C-emBk4%jjSTqB7v^YrF8QAJs)}WeP6i3n zH)M0uESIw*9>WwzG_E|-S>A|nxj=*gy&D(rB`Qe=9>*;w;qhhG5zDq?6YAl(nk{xd&l>Kx>G%`18%0?Ca-$3;YJ*RWNBoe znnHTI%9I)gas)K4A*$<0E*+5V&L*w;ha9;RvGpg3Vc0v zK@Ett*qYE0eBKyA8z*qk(kC&krt(rmBfm1RMB}JNL;gg5Q7tkj{*Iua=%!YV_=9%i%A+p{gk)B06GKVPe66h zMg%?|>hZ3m*g%v^dfFHj8__MHPE2W%4SEzD}SEM9?gUA#Rmw zW55z@I~lY0j{j}obiO%e6gdjqG(?>*o*dsE(S$9@!o{uR&c=~($F?g?0E%}_(QFZs z0=aofKllkz77b8KgTOW`y-y?7y8r`u82D0>+uVM<4E6PL6aDYL%S4=?7Sx`UYzMmD zj{0N8{9vbZ{$cBwfJzB)um3tQ5+)M%2AnQB6yLNo_mXcY6yR!fa;~Wf+sddL4`V!V z?#0liV9?_&+I9gg_-!@D8Md{S8Z2U!yrCI1wxOa#C0*zd5!x7`0@9foFl(nSUUCBV zLRdYIgmJWqc)JreY3_mOR}gjHa1I`8&X8G2aL^R%X>@7H*`#Ex7g^S#&)@1oy`ivAEI zOUvx}>j{!w)tr8TA| z>HHr7J%LkZRJIB9hBYa%X-@i*S-~ih##7}yHkodeg_ zJpI`Cb+g~o+i!5j1AlAKc>hhe-hEia{dfTYD{6kO1CjV0Pn;A7L_kSoN1uS$<~WU5 zcQ$kUyXQh-5b*B`ZN!sfzk1VB#l-MWGl5{v&e53wv^fD2FlfLkq^nQh8g_m{7H>NC zX5g7;!t9H&PKB3sLrSo&)trPWow$(QA_O+qQXk9ykkoOQ@^aDoc^0I1)8z+!8YJ!-&%n`o=_1ioaMLN9}+5Cv?Ny>yzNdC>LqvW;TYWZWs#;RSY$9`mo^@nXhG5j91 zr>MPREhzcM4*mC{WyhqP!|q5d(Z1B11nf+u_UG9{2e(RHQGj@My_6$^>{sMdQwtsh zR=keBH`&XC(0xYGg&FOeH9#hP_k!EB7mws_45JdgT>?L2OCNN@40fLpQp4u~Z`N@^ zrovjOh?iF8#p#w|V{;=xU(GZui3;1z(o#Z>92yc*eXW)DMo6d2nx+k(uECAXy9<=n zGx}Iw0g?Gx!58qy{pH-{u?~t;Nylc0Np_KI5U$7b@~%V zpQJM0+XErh-Ox9c(~GZb2)FG9UZ)=A>xs4Fwv3Pt0d%w2JZh;qyHGcESR=-HA=Cy( zq#7kfd@jsrBYE$PVx+05c{sgJ8HeGMi9UFc0CjK>ms1JUFCGe9^a!D|U;D9l-+sBm z7Qra8&eje&UV4>KD}R=36U8h{Kp84pQbck`CEXY0op`b0V+~3*T=jwd{PR*)jh!&i zs5vK5iKyx!T-znNtsm`@d;RO*u~5Oeaa$`LP0T-iL6>6>{L z9A#{j5pQ0tJ40zdPc)7NLmIvJ`9^KL|A?~}ZPbN}=8TJ@XEUE6#Eamt&WBt#j6vny zp;BJAduAAUCU%tbnj~b04BB#aGdTAW*X%YRzzB`(I?;GFTf5S^nfk6AAsF84(5xV7 zJg~sfz#Mz@efAO@5dF$MbJv>zX@x6vmPSL8I%)CQM`pu468>jL&K2Km{A$AIq#E;vu(065oaZ5N@ncn^&%kRzS} ztPfpc@VL{=UFgG$e8Rk%Iy7gg6mQ~XlKl|IA4XrTWN%_IGW``iz_;CKI`HLparPaE zsXlowYvD!vc>Mpdu-oVN>Ao*Fi=E^^cM~6S^V71km)HNnJXPM$-ghGv6sOCtF<>^d z72|MTFeqNpRPJ@$aA2daQ1Qw!9^K#2pi+eSx-iLz?tY3a&pGdG5zGvC4-1;_)Q*}^LwZg4nDyKN|R2t1Pv*JDOWsWtMY z!oS=Yj2&3Z5qF(sYNhop0RiO7aI~@1Fu}PA4JRCnCk~@TEorHY$PtbAJXAODdIdQ@ zWr!(a#z~~htU#b}VMf?()|`Fl(69nv8W*1tk(=L|ekyKjCkDcuimgFT0mZ{#(-l<4yH84wfKyDDl8RlLaYu>uMbT?B&4{5tCn)AD__*3cX#g^cmc zOgXw6U3~XbxWiHa%JEKx zVEItrZC&lEBlDw#_vyyn;Tv_O=MI-dKJkJ-bdLCZuz-~beA#W@lXlM`oK8y@z@>#7 z5pOOH+pV&OOXL!eH6!ywkX}POVz;Pw1w*}Q4^98=Rs@?bge1=JSav}eC(c|{u8|e! zZAyzSoD5~0iaRp%*zzez*&@#(_^y-XlhJ|X;@Z)*Hg_^w_qFnm@z4*wXMH4Dx`l7I zwQ>1UuKSE;@9ZsRr`uCXE#cT)-N$d6)xtl`a)twG@tqHOal9CZYHN`9=wiy>#+w^l716 zNeCG}KIeTt_`}(6thFN>3XwD{`9$G3Zj*(6+6PFN_+)XPlOGtHQjga_6R!3(RX|~G zP5&QKofna=(fLUDz|K!Q9AhWvYU`zZbI5TIP$fqd84CcTbA?0b2U{Au&x`tp%*-ht z?_VVVazSe{bfWojgA?BEk!{7z6a$OVb{RB=T0H`FD5Zhm**VVs$@r;QC%r5`8w<*S zFkLZSbVG;|TVcWvle)6Z;Gg&f1drZuQ!f7Db(&JBYn)ql6^9agLuJ!hT1Bx6-aqn= zk45^n5tM7$KUCz2UB0z9B~Xv*#RBV!0odsxpy`qjd= zfEb9LSAgEh#sh;7l6H>WamO9BN1J=VY8K8H9s!1bjBW=iCv>qy~3WizpL1$A4mEd%ctOHj^Hsx zlERs~z-%59>vX&Vu!1f zWS*cEzJO{sa_ zvCqLAk{TH_7wWE*^K~iKZ`W6eEATi83ro%k+Y4BXdQg@Fy{v1*+GtjY+rZ;Vj1)!+hgBLXPujlYs|mf|n&(cAI-1w4MI&=J zoWWNY4Gtk@X|bQN)X*bo5CcnFWrr7EU_Ty?mhb((D*OuGrd!cJ#zSW|9%Frhzvddo z>2j`rP+2a7dADXDP4PEz%#C8tzmgL@D&OZF-dEz!w=dTR-~rg{c{7B)uK^X&YWMg` zRbT=loc`-~3Ucsvl&R765$*Z>$kmi_(ieUX>9opakSY0$-#B$Ni|ktAGgJ+I@v4O1qTYf+$fqbn zvK5p~3@nvzl}sW2doN|Jz*F#?bb zAVEruz@ekF<7+WD>+I~UyyZOLKl^LnkK*u`d1*=aSC!SzYwt#2<(2)MzsTp}<29J3 z_MDl$?`=fuTpjc+j?d?c>he^{{$7IQ;43tkEb(B^#pfJu|8fTwtEFTCf9CY4u%_<_-*~5^snXMwite8JA9<$(Pm3-2vNZ%0-Gg`TTqq#0dQrx-N^7^9AZNiHH`t2a333}WE zZbzWAxE7FLFA?!G)x`BrfSIA23h%-eIn#aHblX}leg{Iy#)@JZF4FJs2l*e#qAJ+T zCEMqS$gQK8FuvVl6ffJR;Hfw(Pb4c1gJNXkB?q&}!g~S3ICKuwN+Nv)HMuVd$Kw_p z9UYAL^Um{h;qrN9tistB=5mLj>H@Gt$U*Mnyf zb{&huwd1F6TqW~YgKklsZwh;L(P4lGKOII^Of)UY;mgQ-a_&HYQ?b$E_=$7$21jFP z56DC^<`}mM%#!WY~0GdE$Jho3U-otW+5bS3c z4Q2x!s2%%`tdD|%d_~B@jB%wwCV&4bHcv|z5d@IxA;K>V~d&ull zS#hUkeLQ^)(^0FwC?m!lr@3PSs>Y3?g;ed+7DCbv8JE?fjs|<(YC}Cz&2UAF9gsQJ zUu&>^)NL%m2IZyBaAC$D6cAY~e|a6sq{-f9?Fc<=e#$^yn`jYGHNvx9gaB)amcJ!# z<7;|fOR&v7Yp=DoXm_;jJ&`>mGa?kaMAK)pCB-q0K9f$U#&5SqL%VgjkPm9iH|Vq{ zV~Mdb*5MDy^?YX(mAa-^4H0Cwd0y$sZM%((#p8#{$Aq+pGUf+s;Z7;~vvx4}DMc`7 zsLKFmt*aZoGrBo2{6=P57=Q4ekwf%AzbKMGBzbTLCSu;b>~a7+i*eQUw(n00l@_w- z@sV@8bvde&Ead9i>sUuR@1iDC*p z<5S?vR-F=$!=*h!(ll6rnBf#*ng>gdNo1Q*8NA^pGU)#kBBH z(PSUfH|1ew<8#o1Mn%EgHULnLn!|ffj_Xf#?vQ(TdH`7wkMrGzB+(ZJ><@5(Ve0)X zdc*w|IK3^#URbgAmxIj^%syUjdj7WB_3ys|L=U~bGIDtx6Touw{)2R28gOp6o4n60 zQD7RtWN$@hc`iSn;N4QuF-^yudi-sT`qyDmJYsYVcyKJj^kr!YoiL!}PobP|Q#^_V zB#C-~#u2Z>o)y;J{ zhRx!oOP|qOmk#^`imBL=hB)3bOS3bp=3+YPoF{UNDBY)qfS;^`ce2YSJAY<(wCz@F zF_+}(MCyeWAI)F(`;RiZ!~Qu^mowu^S+T&+?j!V_@gNLUCw-(81ShW50F}91%oDhA z!~lSn6G~aV=RcP{hD3YqJ>-$a6$i5?V*+lXJ7304-tFNQzU~_TYpDfr)Q@eaPFx5}*4i*#9q?&iusuV8wUk&qCh3lh z@UR5Qg5gR=FkZiuO+bh*ZADYkYku>xpK*8&eWzH62C_tu0wV@hS;7W-dhEF*5z368 z6s$&$O_6jBq$96HoXy(X60eLfj9rZa)r^^nv6+$ph6&a;olKPAa>#7=T;$cJnHyr4 z4{Y9hFV^RND0{yG2*x2>AeocjWsjcQ;SMglHDeNR!H@;gYYvZxm300uyGjqf*lM32 zI{%q(tr49aL$|Q@fDkoF{ z<7DZ*`iya-L#8A9DHz~5-O_c-O2$Dwdn2rlhT3iD&u~~6VN4z|>~WakJJ7=%9f$0i zVV~fvT4h=WOfeGC4U*Pr$A^a5=-7-i57`6eVpX9#{A`~GjH+mI8^>#WT#qhB z3b;}s0oi+RGpgdP!M~-RxYBG*cj}G_-M&&RXT_|7$Hh73%y~V@`-F18K)@+}qnLJW zTH$YmKnI49oR$j6QJKbj66e$xR_3ivwt|#LIUKO7ig*irOL3*V*ObF0xk)0;ww_Q` z`EvRP9i8{{>SmLN2^fu?**!5MO{9~P7tBcF4=DDxrN(E01JlPo&- z#AtYuR29+<`ynaGWj4sutYI?ik>r!>v8tI#%e`ti?Lre-i;-Vo4X}>O%g4ok;Py=1 zLTa)S^0dDS#pR@0>(q8qCbxN$N~oOHt*fg0y~nIOrRe&fULfwMkx1y^lywiHn*C9L z7`KX$;$#~TP~$2eOwJELvs{-O4J`+AThL#SeBaV6@5LHPG{#!e4H7)%@8p4Cpv^ec-?P z2i&Y1{~gnStKc)tyLq}>7eUT$@Y*u)4EVKSM~a!~6#+FH7FD|_oX zp{*4DZU??p3xKVONmdi;vrBQ1usy1sBE`wtC!|stU-Ji-pH3bXrKO@SWILvmuG{eB zW@_bBfKNI^i>YuF6dk-b+xeSlBW$yMXmv3isY(Ww_HKYwPaudB`wENBiEZPrwFp$c zNxr)SCkk0QikwCjBg97tgJPU(Ol3r&p7xfMbutOpyK|b|=FiD7ldM2dZ?@@e)WNWu zE}tn5TT0XVHhGBU7^G=`2KGl7-JFZ?eTS#UGRp*X1o&dPpTJ^WGq7!=M#th?wGY9~ zaCld|Qgi5p?e^_qyU|h;;5iG30}~K2UD(Q9Ls#b^N9*zX799p+F>g{;EZMvR z3u^3?Z*n)(x{R_hx>weH3P17!mbnKj%YPd+JA?S>=K2n{?B~Y^qb5wmc6@Fgll{@X zBs%pVM!z0Tu&99&%R5{AoY>J(j3~31im=>zvEAvIJU2NAiV5Ytg>Up_?s#$x%!K+& z_c~Q8ZPx}+F5%{y7*#c7K@DQ$8HjnwEg33>+x{4Ut-V(cJk=t%I!62h8N<4b`4*-aoAGchMI5k4lXVJgupHySSad=VVoALliPd+@^lotmHV1nJAZtX50WLRB|_>EROLgJ$QM zm-Y}|Rn&uYW&X`2mpe%s^H-agI_CHOxVS3VS~vXw07fYv8IGxfkYl%&5F2t^a5~FA zF1mo^`)F?AM~6BB zGws8hU3vzZH0*aAiCDQ-&Ix3^_osov=DaX)eG_|m2|cg7^gc84!x*JYCeY!G0J=C5-u_f9Eicnn_s-5u|nVWELz3H;c!7P^Q~0jt>lN3KWF`%*g)Ob7)X&26 z{IBe%e@oDW%?09&Ckg3RWgCWV1~eiJ93?8WZFkA$xj~F0_k>0<#>OSrCbA0L-Yfx2 ze<>0a)q_S!V?Z0)cdhJKjw5Cd$t~pBaUyo{=%er5_q0YLb{cLGulfM8x3zc?a!4uH7dGo-uN z`I`7=1mR8m=(+&~+ZgK@h0?li0z7#bg$nmaj-hPF3N@KX)*XgRfOQLlVVPHg%REMi zlY5`h32eJAq=KVoqfb`96C3-7zpJ`3TeDnNPFhX1@fi0MxqkUL1_4Wmtv2{e08@g_ z+ItNuJ18u+udJyzNKoN-rcQnlV&cRa6` zuV)95<@?8YH%|6nd|2HITbGVrdHUMPnZcU>(5}F(p>FZer3 zPdJzcT<_Vmerc*89(k(OLo@{P!r^AfvY`|o0*uyXOAdz+PXw-~0a07O+=V3(+ls2z zx8{0mOtL)pDDnMK*JSZSEf8ZPjj1#AHr*wf)idQ63X1^suwE0*=`khc=!K?{FZx=r zRd-o~IlDoKeH-R$V~r23b;bx7Z4RH!F@oz&7;b&RrM6Huf$Z+)fg~Y+dG0!PH4CgvHs)k(@sz`bfVqC1Rq5Y@k{p9O4P+ z{K5KKGEdgwl?J>KEew7fH!XCp+(GwUWN&9&G}1ON_|<7Qo2pTU#$OUG>x%K1iU_Bd z1NZplX+moG&(vEmLo-qnv+8G7&oNdh0G*VO@^S}F-$o!bP%RT@$B=!*_b%QP`Ab)-j7U@omv=# zm_sy#%s>a-;*hHopCD|rfV`Ak7jrhX_2M-T+|lS<2l!aWtZonit@hknG!W zzHWsDTo#oV@SCR+>S)$@C0Q4w!*^%f+!H1p$Q3GhIWK?H?e}=FB8k~CUq~`2ETsNBn zWeC@5&$eqxc%_H>0`prIzM{V2`s31Df!aEhX3Q{t3fAVfBf8E#!CtenH%oK6yJ4)F zXxHr4MFF#L)@z(Nnl>VS3ChuZxp31^l;gzfQ97T8i)oLDqy0eiiS8!0OS%Hsj%@&J zAG4JXChd#GEG=!G|lX9TMjG z?hLdgUcH1Us&*+B*1teN5ZH(-vU}rW-fU=Y2}K0(gU(3gz>pMTBhPmvDLhh((4zi` zq=SI_cp%Yj%@BiD$)&H#D>;~QvFHWxdFsBYt^P*xbYSw@Q-PznOZu2Yk@tK6Iz*zp zmc`-jR0ijiylc>8g7vY%s|8F0DFc*afO+x19AavCG6}M5&_uIq z!;(yw)u?N0nbzg_8HP3xFmvSp5m-(wz|jOJCuXHfaiCIj;-r-mE@#XI7`xNB8hL!% zr9oTkj3gk=Yi*2Z0G_c zEg(yxf?6x6IvR3Y%)tMCu=HQ&FSi?|H2PbaIqG&_9WYD*nxwf#hi1R27aPfi$ zBV`;Mde(58C1#5j$B$SXOM%#?L#W{>yEGkcPiEqHRq}s6X+#e#-}i^1=O%VBF^WYF z=y4$7lv+oKQFcrq4sfjBp?=qbFK92pw=QhR^u}YhUMge)fI6ED9S=K?_Mm2DY(GI* z%$*ANPeG7-lX!*z(Z_+a?Kbe74_weZr@!H0SH+9IR z^07&i0mjb`w+^D%xN#t&DJ zw(fdTQU|7~>nJ8n7&m?^4bq8R8!HDjG9vN;quqPF?oNSw?&;ICO)ICz!tdD%zNAFj zjFJpssz_z_`J13W-6gPHiU(+-K1qL+f0ix7ir#V7Zo@@wmZW^I$tM5lps&HT{P3!j-}lppnT^${M#>!4C+ z`^ekVNOsZnq6;+?^e3fIyD)Zq<=Njj~qRfwQAdE-YL z$A7*nzD0UYM!JT%SM6}Tm#+Ui60MtQTZmc z7(IKW{iEjCu8&d9oGtg(;saq4DOYSABJGNqs$xWAZbGVFY1_&Rq!CLo=q@q6>p_JH zkHTuIzRNsC_{uBDrX*sxeUqb9Yr=G6hr2IC@9^Z_&Wy0^H0Ra)HD+`388vKNf~D5z zoHsI633t`$mk6FtJjlq&t!8fV7n{SdksG-=oWU>mrM0kcfh^VrJ%0` zu*XLrmu^Egd1&>lT%JDmguP`0IGwqxZd7zyHNMldO90UWOupM&^!1gfV6f$W(3>>^ z@>|$Vr2r49zqVA)PW`HrjC8kP+4YTl*V6p*jjN=yJ}|aCp>NtP+;>a4hk3irJ0&`6 zj;0Sf$d+YgjzGodh!D7TKrwRG2RK1 z$?Jf1mUAsb;z`WuQ1K7iGJ7gC*W^Ggy2OMM{#M>R=Wf+4$tEaQpzv(kA)uO61H2+% z%jG3Vr7G|7zu!ur~iKNIk$MIKs%+by}iQ_)T6azdL=X_*rX zmvjajBSy?nBH1+2QM1d2)tbbs>khcq`zA+vMHU>P?2!k;WaNI!!-IR(dagCAMW6nb zX=IDU%Z+7~&P-1LFu&#(YD>Qu&+r1s70cBEe!Y?Kn{0A`kz_|y0RHg!Pejj6NjqXr z+Q53z@8w<_NY%;Dh5+-{ z{q}YPs0buG=NB~9**BH&|`Pqj9&;OhksA2L_(YhZ4(uiTJNX^zc z+h_1dE}tC;*U)6oZ8TW-ycu(sMt7QwF?Zi#`Z z8fIPJG;#sg*5tucFg!qP&uk?-$?Up67-xzj73WGBWw|>dUdB*Zr0Q!!D z>V1$@B%JkBYcCKl!sVFxA*fg9Ux!fMDHKCL3!|f4qxcZdO^EsG@;3R%u0j(u*Nk@b z>n0}}WojJAXqKk{V@Uvt<=1f=Xijd}Bl;T}gS=-TS2_wC2g}(7iq^G0awgk;)L|wf z6>}d+)lYg3H=2$?m6zoNtL=SoSo@LJmMvhUKKe$|(M&hvs8yz;U7Gba$u>>Um!Yt7 z6G*l)s5x<8m&d_{dK|$bvP!GyN6?~fn$CH_N{@gu)o9^>p`2eu2mqw(iL-WT+){bf zu5EV4u=qf`9gNp!O+cii5_T{qEJQ?~{O-`p(IXHP5>8QXv?lUQQPV9>j2oIxa59ri zmuU{MJV=AfpnkLq0(bo$)YO}p@Vr5F0gyD3va1@+GhN7}tLGIqj8W3Y-Tg8YDh@^+ z+F0leNV-BiNnMRHfPtIepzPY0WiqohdrXPr*kzd@^4SFi1S$(DucfoZM@1nDUp?J-&P2RA zN<)r;*m&s#i($8;75-~)W)vsWH(|qNW5A<_+)tcm?4X5^Hh_91rUQN708*>TRE_il zCFXOxG&^}TUmKEtbZFrcR$8QJm4$!fJcfa>VWx%`lOSUDL|+Y!TTM!{TD(Ok-z53q z8{uL8ik{gDZjS2@JQ2-e@o63ah^6)P?RSz<*9ziehgi?u8ajh(YVg;nT)F#o2(A_^ z<*{oIp2mVkxMp>Jsn1W%RUK#*psK?YSrhSgw-ZBN-S1PtQygK~2Q{<{8s_IfzG5;& zx8J+}QI9a9RD}Nx^lFU#t8MHPAn2Ci`k6NL+sC=R%y_Jmt8Yf$Lo1OVm-{HnhD(oL z=>gyJqZ|B05;DliRY*zigeDKY^2UiEV)@bBNZn<+mp}S5VNn=UQGGKL=u4o}fl*f| z&+0uit#!Sr`!q9%__+8wx5WIM`x>Wq13YKQadrx1wvt0(5D$C&=URCjEms@g6kC<5 z;2zH{U|q@m;xk{aTbk-F#;vnFVLYbR5gbCx)-a{XaLUua3Hj5lr0~y`C!D5HdZ8TYZF>#S{aPS*S;ts#>Q&Jnq+-m|`$OKQ9D*Y%5X_rbg--2EKH z0oe+70mQ|XABxJhw3g`%o}0Oi4>E#9FFfS$92mjUP;Tip%tW+sYE~x}0f#xdsLWD~ z5)V|)W^jBvH464wRz|tZ-|K*wj3e2`hA5Gy%o~luk1w}4nBl;=f<;dIx*R5P*4t2- zvy73kt}QJPqd*N+*KOK=Zrb;^*44i$0w!`bjgEjN(P=vlCwb*G*v9tPRfSZucaZkY z`bSWi&8d!o_${TK@ee!6td|M}JE)u-3U6v@i(Nn<-Do9I6vgX<_&6hULHKkW%yU!# zpfE}iDD%{psz@+Lt|BJCHOU}5U}`noA=%OfS*62N53@GY*x~=HL|B zYQwz5oc_BUZfbNf0m5_Qb8p>^;CFcviC(GST8Cd(b-Q2vlO%Q+)cuaRDK*tAkn7r;n?bLET@P%61K7{J2Z#g0Z_B%P4-*{Z#Fh@ELet`gBp-OICPj7rqPrF;Al98S zLZ%AvHY``GxHrCVD>AE1{I{+U6tpsWx*M2$(`$2 zYuB?vyj8aa1Fif*Ul;Nh=%YsQ#B}?gR<%IV>73KK0L{}g+g4f;)>`el>|{9_TMW;J zDPIR;8SLE!2C78*hWO|_=HrrIyia!lE6DPNQuO;@a+M7$T5bqs(p;FG-Nnus@3%6n z@zb=qQsmB%Y9}0{vGG~dQ)F)8Q3Wd^po?_(?xoMERKS=X05xJ4xk=1Jxsp&fN#za8 z^aIk==PlLvTleqi^%D=fAin{J)DqnVV+)hc!h`)XE6jTVllvr#+=^+-jS=++cYPpT z=P5&Cgas`laYB(WewO6$+xrYsrhhvYHYC+f{idmi)|rvy=SYc<44i3@Q)s7&-&G$aF7HN~PsKPO$E4Z)U1bEj$TLVRNU&|9`QHbwlK&+wEl2{$>Zh{+P=++l~t5{0)P0p`&x7m^QWnZ#`b_>@B)XTEv&YZeYgc@9P`<0mB_F*gtLETAY-vhP4KgM}?6q zJfGETS>0&_KxJ5II)V|EzkjpEP|-ymy-{qrfFpr<#fGV5sW}PV(vY=9PO_lqVfwX~ zc_FpaeHXoS?9VfUoE~g(%X;2< z2K7t7&Ugkv!4DkaK#ZT5QVcv2fX3-W66FmtL3PaFeLSlvr#Jn1$?18hm~}22E>tR% zCTj!ItJo9=4Y*lG!yrcIG>5<~*b@-t8o?ZDuJ5LhLX!<)nn z&CEd}d8E#y=z2c~!QDG*Xg6tk!$40q?v|BqpI^8UK{BbhvyA3Eb|De53y=2dmN69) zs~R=e-RqRoi424LJgI0drD(rYca7YF*@HKkcjA<*dxE5ri48)?ZGjvN1rAnW5dNo=kF~eR5P{ z<~HHe5REq2C*J}D-s4OFB@$fotvriTg;qwSR&kdJTr1#<13|LopCW%qwvqPgm?UYg z)1GlCO<$%fVe!r#EqvZ5UmJ)7vPE2b8;`UP5+L;;Q`zR%oLGJYOo9&T_zSelSXl z8f2c+I9rLlE>{XAboE9*(V%T zr(K^3^nNHRQdw^y(0VyJZwO$+oK<^TYA(d6J7UoTETXqnz35ag*OJ5Iyl%<`k6Dzj zDUG~#zH`pqPmcJy&5$jg3tlA!6-M@hJ3Sr^h#aZ@+QKoLS)amesoZXEm+^dRN@u6$~+fh9?6UA~rH7JmNs+L$qWV0O34Lr0q5 zM;0M;NVg(d4tH~CliJG|{~8}i7GU>;<;+O$TZlj(01`NV-2eNp;Zg-q_;0Eq8~8f> zbDBm~v*uqY7oVwr(l$BT^W6s%u~^Z1T4&!LS9vv^U_LguwSujYOSslnKb@-O8-T}v zYU%Q&EeCnp1%4c56eUhH_PBHPJ}81FucU}BlMaoJDt2KT9J@Ii^rLK(uDqx^>sLjl zfN}T-EWt4)NYfOaaDpqCF(b;SnoC59uGDYC>ehYkGq}p0tn=t(ZJ^&|#iY$7`&39J zO2t+k1nS51;aK&Lw1u=tsMML%Ll4H+D(UP5Z2&X1BHc#1zqMwJW#%B71tyV*k zZ8py~4`?9HeJ+17FeVBsG^?@I6OolkudYoA9c{N#T$9DIq-Tdzkk>2}D)>z)PElHP zXCuodDJdx!D~t?eo1Kt0I2CZZ7|d$qr+yc^qZ+IwWcjN;pA3nkMXIm_ey1z>+ib7~ zW}KnLHkMmjayqg+YoPKkIv>l&KiWVYcGCtL84RXH9*wtTR<1~%;Uqb%FZ;{qCIhX{ z0;;n{!r-`#p#p$a!sEn&*0PwRlNf)qb%Bj_1(Z)9B(^j79E)Fa)dePGR}79eFGK>S z`y^0-fsGu~X#;U9$x$R|NVb>9IZ_wuj$vO;>L>#PqA#I962+vcy)%UXvr-OZSIXHL zY_SUPloBAU{N^v}f^m70xs{oi<@87ZF$vL8zAy{nmVV{RtPF9(c`7%zF-3Br2`v9F z8T+Sk0(i;5L;GJp_1}`JLt{`vEmw0N8(fre<}sLE=wwMnZDUD7!nknaVHjy7j_3uF zQC7XVqbDft^3$g!-OwgA+yw9pL3By$^+_|J@{pDB*-m>cL!!#1Lqci7f)cF=O1Ky2 zd2o~z612hR-lHrp@M@I!q>7x~Y{y@x29Vf@p_I45?g*4ENAev_*lJkg&w<+EKhoq? z=6wFxTCh{4po{08^?^*DaNa{qZ*l#FcfEx#^YRUQiRD&O;OoCjNezHow&l`_g7T!z zoPJxv1@+waAdxJgvmXG}g|gwaBL>z|*alP>9ZlxHdeOdTl_U(^L6QJvrs5u_PTbrj zxC7z|cPZdsx*iWY%HT=+8j|Cked@p0dKQwo0}YVSj2>5jpSwek&I33$`5xg|7UI5Z zjB&c0yIx8z$wEqRprJ-~2xKS?1yIWzC!GIXItP7>eiIKxq#A;jE7{8WSZT*$asvWc zaFB9lSAb2ETeKxauzsgKHO+cWP?#gcjA?0|#7TZcbl2O_c@1xOHn&!(wGi{P{qQIg z(lD}@MS@*pzgP+(;Il0ilw#ndgZq`w2*UpDgNusDu^*r=>cZr7N|=xQ61`T1h?EQ{ z)#PFW@8KakI8$QA?G{`LW%o6;PLP_hgEBk!>@aVe4Y(tvNh(%us?!J+TI6dv6_Jyp zBKl*C7+}%j6JMTS=8$HlYDsj?2Cn{FxMNa)cBF=3tcp>Kz8fL8&fvj)#d7I#bjX_O ze^d|Ux>ASY>w}Az`!4|dM+^by#2|=2+dfmn;FSA6H>gov5~5ToDf>bO@6ts=A7!kD zF#AWbt5Dv9^LTErfDLycnz>;@59tfn9__R^s=LQ<#kx`jFNsnE^=LOrSgrY_O&vKw z(qWg(A_Iejc~R5LoN%zFwgwE{#B|Mo=~1jhXWs6Z0H?1Rt?8>0uAqsD5FVvJ377gh zO-MTj7(a@*Zn>6pC^4R<1^G$@O7rkvps%H&u`L7Bkt$p$w-satjs*+}HeYCgcfGgd zz$@yxi zr?L^(4C82(Oxg;^R&$*I63MWUX6y!NH*8J1zRo0h#8P0YXzDdkr`(@r8()7W@Wit# z+6<{QD%c?7E6CFu?@yhlXj6p{FSrp9%M)gqUi~Wa&AbKStch{r#wl~pfe2UzdM9Y$ zWNzDv3@$I|us}%a_i$t$>lMdaZ$DV{BFRWmxbTT_!wQm7*Jr9FdIB|%XPs1_9PV*< zpd!bo-=BKFELesE}7uHYG(!~qaVYfW`(jcve8Q0CWR5_4_Bc6;@=R4LYgN3}{s1OEu)E>A19 zLgG?}8|hV$aR-QOXa!eR?nO*tF9KZJ*`ae3bHh1Z+;=v(SFdrvMqdNE^ z&8YKIf|GVGVnewsU_Qu~#%ZKi?wZ4!qfeVqmcwh`87!2?>{+DUE@7Gs`0VXsokbeW zdT|r=wXmR3oQoo!MlliMgdT=?az(v6;owthms*}oc z7+U&sp%x^ z6_21A;Vz}#Vg(3BRGglL(LWhAcn5FbOa`xE1&X2NEF0XPqBi#Pl{KlOr#HvoeY|MJ z7v|SMm_+WG!N1I6U;x>9STOb|wqMkramtcWEa$;W`rJta#yk5b{Y8^En!bleR?2B@ z&oBGKyeB}eS`pSjCzI;f6XB;w{%_&895?wM%53KwJ>P35bMEAkNSm}; zfDjw$i#@7tNh6F?n_kUW5R>ghvcN|sM-NvIg0p}!FX|M6ZK_(peXe+F6P$i*>Yu+b z-~!xdG`b<8W(HZ+w@e*ok__WKd>hY=Q`^%Pz-J1$*Ed~sniQr(t>xUx4*px-nhdP? zL&J~le70aBqq_l54i?c$g4p+M660z#gns(Q9tyYT=NV-S1ZjiQTaP@oIAZmVuI`(G z$p-`7IDvAm>yMgrr;k1^&!q{B@pHiOAbU1yT$V~#+$8Id4&#`g(i`FD^h&rkD zSK8#phf_{?DbDza`5?NS+md23%I6;LqlLdP5LyQ(k@#p=6n-IOpIri(u?fyZ>Q=1q@2ARey}!Ayky9cVDaI6 zsICFsmks70R;3E_r@)Dq4g~X`NMdDj9Lp%Yy3izxc&2AJeHyw~=eRtJCtCwiFQJ;- z7TW(Js*%oAG!=%}kn&I(ll>xTeqbM+vvj}l$r;qGNS;P{Z+XK_)GmqU6w%JOf+=rC z{p9nK-z%0M#?Vb61e)eYbF+OZ=dR?y9N=rjLat<0);gfpMQ`7qrn9!+3zbMMYF2tA zV*$;OOa%5ur~Ob1zG9!-L4)*FEPyh4B{bCgpcA|{@$cx05F;Aklj=+{=NvYv12vQ{ z`o(Vq#y_^DJO~uBGgGZ>iVz%V^Q%uO)_{@o@^S{~J$kf+x*Ho$Ym)qmOo`29L4lZX*7jhjWq@VMm~~ z|0_k}6?wNf+M11g84z`pKPmS#JKa1U|3{G(7qm)iedUztJpK+|a-1n*hF-(*`2k`s z(>Rb%j?%jZ8al0ldwt8mYTAG(^zsgmb~0ZxFb#+jt>)k=$(Q6BYvSZGyW05}h;3-` z0ct_=W5WCAOr`EVGtW|-k}JJ!xY)F(0QNKWg!np%kiIZqN$eq$DLu%y`9 zW|vTspagigs+i0>l`y9LGA8(~Q5&1>xRalJgRC)R4&vqJ$+>yoO{N7A#E}2DiC~b*;)EhTy@`qFI4o? zPp6e{Y~@+~pu$f14=aA_YN;?LqM5x{91`$dE$2X;GzczPb;v!zVX7ohsmbTAPn|pQ z(@HvHYdP2rR~ailuuqcVl^hMpep#C!rqS)&jD0<#K;5gQYkHuU#0`|++Pn{!j^8H_ z7`V=|(#tT7BwSks5ln75Th071f`l^}7NM#Ap^_saC~auu?A|~H7a8{$C;_-;-Ky&A zht~ze=GDr&fpiDziiEtBQ}d8ERd!%fW}hmVs3}dub|)S12(xn;L)S#J@SIT^T`Tsq z^5@{Fn5lcU{L^s3aTz`Y9G@NhrH!~Y-T|I5!Ttt#44zhG zJL`CTe5s4OI&D-yXJTP2l;MO7uIVCndqyP3x#}mrGd(J>kj52)`~;U|lE29$WJ+?V zJt`9wN-D~6t9GUBh-#6}l}6RAJFB}9n#WmA=_6}@YVx-O#+r~8^3idIt zHjC|GY5=CbA)Qa3u;G{%9^@CK1^U63j7(1#DPKg~iKm|!C0jLfvT}dD6+_d=Jc1oT z!H$(m1uVCbAyUyE*&Y%h;Eu8G8wx$0m!U%cqozn<@npkBtHU8iyQpR_p`M^51kmRL zpqA8N^~>0$5eh(XE4;VugSbT)egukPe zU|2b;)qUUquK6Y+Km+TqgW7Ota2yb2h>GeJD$HIxA{_pF-^jA(p~HF@y4$9<=ez%( zd3JlYm$mMQ=tTEZIl|VHHyT_zE@sVo3E9uwK=Enb1IJi z^2qA=-OL{Zhf;c>xQ#mJe+{niIzHJ|qTeW;v|VNvj#!eFa&C#jjr$g;PnZzx>n->> z0B#iA`x@K1hAh}uH@QD&+X$$35Ve>1CNh%;S$i@GQ!VOgz{R6HYbcT(MX*ls$9tw; zhx(z>^)Kp#^H25*U?U{cW~U+qB0aWo4~aI!J`LY_%myo-{n%IqzRC3G_`_CdcL?3rS6Y=t08K$G_NJpAF#II?z zp-;5UUykIVe$t^6b7=X%u*4GW{+urgqO`iWt`M!LU!0ng^Lz&{Y@lxa z0>tw52{`i)e+VJ2!INfSB)F7d9H}S93-fhzoP?BTNEGsXj)A}xe*=5nVz-9y2D=IR zuH>NTV7-s7_X(_1+xPpw@-2i0-eId%8b&`VCO z6TP$xg1POijH-6UZ1lWKF;Zfqke>5#^ffWKm}Qty)bK_Zn4mQ``v<_8lv@0E@lg z%+xPj;Q51Z+O+JtfOw-4hUdFtjuyM~hqEc+dd zDQ)2u9P~S`6VJVaKU83Wv_w}OfzGv>Kt_~<&+P5IMczqd2ouNtD1F+gjvu)Ti_D5b zx())b7AII!$D?*;y_g!1_4n`*LzM&csVjW&oc`h;$(zt!bwFt%(su+kTj!NtNJOjmRWJz>r-6MNLX)gw+OV{G{#Mz4maT_wb`a_cuS zQ89fqM@IBPnb}!f`S}iSUl7Kh2x{H3Jz@2?8(XU|oLTk>{0Y!$(h#3lO-{|LeAeSn z7_xYnBddPa=D_PQ63}K@tSz`GMG$rBVMP+M|G_j9FpJ@qU$4cS$$JisR-MkKjk<+b z6;E6RG{YgxM)hNlTa4vff1V^~HROM+dNRLs$=acpME<_TkLtO0vaklL=x(}SPVur9 zk)?fDDGmE~EIkAysC^Y$nf8SiarKPD(0%jIPF-k-ua|dZ7Cs z^%P9oE?C}TZ$l4fwXWeoPV*Jl<593W16AL0c!EA^WukKP{T`dP6Q$#VX3!Ut#{HgK z)rpJz+q@Y}jl^$T@%jg@g6aFfh6C(6GQy7=cM-^wCLFJit(n=R6glrb@jk+V<}4a1vcBmF+Z z3JzGb5oCVOm-) zumHIwawdzuCTWXL8Ab?`SX!MjW7r=sltx37o^R9XCE&2mN$kU`h4g^yK}>us}oR}!L2)JZ$Kvle^`z+P$mTUq%6}*HdLMp;xysT ze=P-M-Vq~{ev|KGJ-{jThXhv}#=sh;y_hWdoi))k8iLm@M(7zAc%2nH_}!JW>VOs! zAdLBA7GNigt}h+!waN@Tmt7=G$rP5kbm+Go(5nM-+UDsv@>qwK@!z%_G~6@?G$Uh+ z*?yeO0P0BUkuYOo3xRwZ-YFkO_@hI^Hs)VCd*8M^TFG#V1H zCPtstQQ|m!gcroJK6H>oX3+PfJ#P#n8Z^UO`2xuc6jn`t)Eohc#-_AaiEcs351y}N z)nD_*O8GJi3Czr|8OT>;3=!(kJlmnitjgbW&A;hmXq7iPWLx=jO3 z1-xH7VzAI!_(IETOxtY#5vM{j{Le^%nqj=_(&g0o*<#h_(OGGH)%R~5>&Ne&+2xF@ zxYnhm(a5Eq>LOuMTl4^J1x(pE^)sZjGQ=Jr&%JhRsE?+s;P zl-czZ7#0HnR9Ga_l(P1f=lS5WRBBT@=TmlpI46LXeL{}rdJYa2_uF)+cK9@E?)sRDZ`DWDf^{f{M(+N1#^a!^DP z@~WAlpnt9|Fh~}+f89ybl9m~usx}&gahYw7U%jw_K=-nIUgF0RsMLOKPF`NjSRQ+z z!lEAuyMUH|6l+G*A3K@w0}J)(v=)>dVw9A~>7lYjP$o=E+&7q)Be{H$fJVb_rFTmiHPGeKzG0J5rkh&# z7Em?Bpr3Nh(9a0`%z3MkqT)`|)3DO{ShFCe-eN@c+gr7Xd28H14gNQ~i1^ESA*2lA zv^QT8wwN>~t+L5b@*E8?(JAL&E%r1M?jd0eGtWjGS{|7P z&*C|M%jI}S{@kKCN&lQUJBS(TciR`avl_ zbz$7Pm7$T~1U_x7z42^m+sZxH0`C{^N_Da3_)n@g3oMah5p-#_9SL{f4d2qM?qXGH z4aJoce&Y(fcQ~X=mUjWQMFs_49K6X*r^KYfGH|4xVG-uES|gp4*)Mn6C{1Y$9}^Cn zW1T3dhSz-hXtxFGg~GQLeibZqkr+nyu3ST9n9SV!o*Lj4f9-N%)ojHl>jQv&Fr>FG z3Izt2MbP+`eStv~x$X-Mkan>3{&zo!1$q?a_~x@%XzHP*COVC(xzr4qMhm0)8&!?BVVU1|#~2=5Z9{ zzq?6W=$CJeuj1_4N0tbdLT{wam<)I|`oZFjiHv3@Zni#I1TH)UPMyeWpLqWs7x;4y zK4QR0SX0mb-V=Td_Zd(?jyP9206w%MR19|_U(MR0B9sS?-Ivvb?Jm<0`{~3pUzuq1 z!ur9v`3+N}Z--f)lG5>mx<&$2=MI&T+wdUJd<|KC9y@!Tr_6O*(Li)y)BdZu06(4- z-;dW0Hw$aDUgmP@=};pYtr9>y$NhAuLC3HkB){y~u~*L$VN{?6m7lxku0{;cFka77 zJ1wKSwfr$pqw0gfdA+dtcoRf?TaX6P*&MoAvdOIt`yBDmC}~c9h(fR-4UTsL`wmb- zk)pwA1M5Jdukb!XMD9D&M;|&h9@O;7AJmh5C8U>q_R;WE&b4qbSxvOnCub72&t*HNf`61;&VABxq`55m_r>ioJKD6g63 z%8v_{o7jUk2W_Wum#R8D;gKn2(V7!i;IOor*w2C72TJ`Pz+%J*Uo~ku(eB3j#Y-4% zK!7(gCz{_vSA-PP$~^PQ-LR-qw1^QE0btMH&%%O7Z}NjIves6Z!iTTera3IB>?((L zCI9?tS_Ag4L>2_nh2NNK*en&-9B?QjYddteAvGz6o{Jir-c?lcc{~C)K}yZ{Vj5am z@WwE9A-+T8IRr=I2+5o_Cpo9ECqjRqA+IZkC%uCDvhZY7%UGcJLLf0W2}-Y5QdCLh zkbu^1@AI#eXRn*;D)Dp{fO+Nzg4}lBz(EOo5hZ8vgH@-&&U-AcU%PuVnemm|kJoA+ zlVYaWZC%2L$dF>8`{MNo#u*l|bO$@lC*f^{obt~%3}cO)h~m#$_dJov?yNxIdqu1Y zlXcnzK8HGWT^*Zzp#kx(-H+>&|51%+xzA1AxLOTuW{u#w8Yv|UrQFKaY!wOwoo+BBf{mR?LIw_&Ub~{pkyRgnV@BHck zf}8tAhKH<4N3%OHzLUP_lGGvt@^8J`F|2L+X^vhMV9Rt44Xr=*DT#{`RL?}ZUP*;A zH<;g8%U7!BbeO+ipD1u$d~1dolP$?M_pQ zNL)QI)UQ1yxbbdyg%#i7xIIW^(-X!S}5RC=>)}_BAX{K8gj7~LpP`i*ahhp?IF;r_D4tZiqD^e>@D4U zH8MYC%AKgPVH(RHBXDdt>$bD=Ei`ysv`>R2oIQ0ALFKSlt(^+a&YP%;Bk3wqqa`&3 zX8Z;?+;WD^goD;Zp?if^jc^c@Uul<)jpzzcGMD+=t1bX19oE$@ofsswEC}T3q~D(x zwhrXm@gA09r|r)=a2s$eQm4r8Xhjh;ZZW5KhaDkRhm5rqa$Use%om~?UZp4CI~6c; zJ~f3VUr%7F=n(TRlXcr;DE_aCz@KnrDes+xj@Mqlw=AW!FqB>b6632*uY<;4V%DDa zzWj)RnUgca;IT-V2@)A2<=4A>(kT9|F&Hz*1hbgE8qQB zkO}xqJ>;Nd=aqUtL?#$Uwj$lRzZa}u35_a?)pnkA`bMmRIK5=lS|k$M>wX z#N00tiWnQs5YExVrJ_B)rMNju#x?2ZgPZ-KRzhohq((w3uyXLH{;ZMzbA?0)rZp|` z=&It@Q3~d1-?2u+O4v>nMoihE`{3M9KH#5{EDcoA{~6Rpzlb>?nOR1#m^M%)M5dub z5#Qosf_z23HH(5`MbCsShqdL*UQ#+XM~6#~a-?Mk4E3fN=}E-j=61eK$!x2n*8wYf z4#NscAWz}XRfDh;i?$!1b>l3(-zODRa?)6oZOb>jUE1)PPH;3~RFqSmhDw@!a9Gai z#G%|WW!H+4R!(b`EzCtjiU-MgD_P0zvMM-63|i3Ara>fkhwFpdn z;j1b)7(UHtJ$e(|`)Y^$>oK$m& zL}}cIF%_Y$s!rGv+X{g z&7ReGoGwwIY_IqoSx;J;z|%wf=}QhAn?I`kMUQ(sYCtlHA5RkV3g#@~j~|JX-HEfu z>qnC+b54dsi!z}R$EW>U#Yn3^W2_|rv>Kvyh{Z;ycbxmBq|->2CK|;yI8?1LoIS*l z%+mNTH|>Fdk2APVO&!^V@&-YFp)_?Zjndq*KTD-%dcDUQ#|>-dS@FZ5UWg5sw^55iB&K6@33JpHc*bF!JOMR@&$>RX0p_jyaSZ|2l9S0a zZ1n9-#I$_X(4fl7J}qB)=lzFz39I}%Hkoga@IJar*mr3r&5#;>SbP!D6t$$BYGvQ9 z*%JepV-gNOg~!{Wrfle7KPMo=bueQ%$s)wB9Y7U)6*BJ69#>YiX0_TWa9~s=Iu4gE zor$JH$dD7N{QI%h>_FUv$AX4ADjb8XATBDh?R)_=1+$$Fvl)KN1mtyWg1_W^*1&l| zr$ani=5hk6Sv3*?jKe+SDFLa|@@Ynbp&k}ZNiGQ{0V)7+3!r2W2%!S6&^a0(vLEjN zKT)%dQxPY(8ti8_*`VFPlL{0ui@r5Nue%5V;iAAPv+GehtF#LQCqO}?-`o{Vgo1^5 z1ibvG1pA*yDrCRn{4Yq+SnMLs>yC{7_Zt~DGY&ty4(+l>O!(641da99#&M7pd+dy= z!*q`j-}6x>E|l2q+rFeWr8^QEE3Sq`eUIV}x|&?5{hiKH9Aaq0TEs-|R_QDJ;aEFi z*;E-mg^JQ{NSOSs0W=ihOa}mbfhyuJ#RYS%_8Ej7r{!Pdst~4c z>2a!xngpf(P7ch)Tcco&qXcG>%9}!2af{1&J}DA_>e|`A+*CS*StVDe4kO;&O6qv) z#xf`N%on^;ByjZ6P-YCvSC!db+$X;?v)hoQvX2*c^I&P#P%5XNAWXbynzbr0wBWLKv#AC*7vt8_KuUG%D(m2*q0F~hPxcsDg#sER6r&|1_LbBtq zC0p-#3SgWH);y>jG`lPjpFJ=cbN_R8wzI(s;3VDAhZ)(iDavPWC5F#v^7d@PC;Mrc zvagT{J<;&Sqyadj)^I>}Qp7`d04@H>&Y&Nr#ScK`m%x9(c?RHad^KBj^Qk9cRxIu$ zzu}MInGFLV)GBNYELj*=p_*zRY{!pny8f^K5@{9$Gyd-N=UD!`Ts=Cgff@tP5* zqkko0MOyjTzuTqAJuuk~@Q}cZ5q|EW-+;efV+j_kf{S`08FFvKUJtd>ljRxKX_5N9 zxs5_U{!txHSL80;IYyMkZ83>0(AFj)!E4IbaG2^d&8dItlmT9=*{vtoW5dYbF4-&$ z6mrZQEPbvWC(WG<9|oF8W+-H#iQYrBOY)iDb*s^Bu-;~slYKk{u1UHyo)Ygsr=mgm zC38G*PMC(o7DOtWxXBPNS)puG&foMZj+>?w0@Z zdU~Z5jC9UBQrjxa2EQQO>ey;N1Z$0E&kXp8A_ZhFOFu*Bh@x7uBEgR1(>EY5)l<=ase+j*=E!R|MwMqLf4!J_=Eca9$C5cVF zO_6zwRrrfY;U>cto8BO7xPZ0RN^(t9BNssT^$?OFkB(FLodXlQA8De%Bg0C3CFC=2{ReW^ zai1h_xxG;aKf^Ws69}4d2dvVYz4AX_Xx^}ALv>nzCRPj-TXdLmaaTD&-5}w<6y_)n zkO~6qpSLq(gNQv-KJd(0!VR(&KII)Hwesc<@1^W`Z~M%gpD-Nw&RWp}SA1!;*%^3c zl?F{i?euHTq6t*?Q6FTE5B6lZq&6{uM_GRj%~ue# zrvw%U$m|W-fm^;^Xzn*H^ET`lW^Ln;2TO~dVZHe4^e6%lTb_JiU^HZ;VCmpQJ^(nh z?ZkY)Oq(Q>P^bAT%FOdb^9?KXZE z>w?Rs4jH>aD^B7t$?IbI8Vz?drcc4L6@{JjpD8sy3@X5`g844)Whtpgd;{}2!AumJ z+89(FeQfZiucvg@fP&<}ZUR?!RCy-J1mtm{3&G;0ffz2@uwvhJ0Y4)P96+oE;1Afoxtp+|yajGMTh%4&ks z@v#<|YAz7mYB9#CxR@Im?}7QJF5R))&?wMnlhQ3v-bQy4Ow+tBxizqvzH~=+_t&_* zh?ox>HZ$jL*lJR{i<%16gz{T~mMU5%CS{KjWJDPrX%#x0mr3gAaoMk&XLrWniWIK| zI|~!Z5weMUd6$X`R~A%o=gP7tFU6S6SK1XamFUkcQ^huhtykXoSRzCX`kQk>0u&2i zHO9nW5CjG*i0o6-zfEux*P2V%CI8yeo0i>hW<3KX6cC|9%FXUu9l<~reGx{N* zqOme=Ll`7Cl1kSNO;tYCn{uTIvq#`gxx-BfY=l>1cFgs>b^?g0?)JeJ>7$Fr68H@n zFlYxIG?dBLRgMj3@Ecw`dlrpvP3H;<5>LH5$VX(*ACAhT1SgJko>`TN&A0Y#vu{1V zsS>7|bBt{5%hIMHW^j3qEer6VRbJ94YwS96k*19Ev()MdKS5uaG8MjNW734EZdyDy zu>T~^6L5>~o|RjW{o@owi-ca*Kdjl^sJ_IYbP&w0<%~5cE1GU3AvXs9nJ|~>CKAY; z=bWzZ;Xk_%5EaNSiVdu4l_$e=aQR(;HioepUe$bP?9ZTHeMzM?jq_82SXS2FUeGm= zYUX&6FgO~**v+wv0IXiF3dJ`OZp2#U2=O{x+J`o&iR-{LK1dwiI8A7xv9HOGIEe|( zrc=M=^tH$cN-Mj0`oU`O_-Oa&$Z!gYaMDSp9mJ}{*$`bz6HEVUaKbEmdb(Nm1Uu_pRUdn$ytuI?8 zQEkO&_pq_RzyY3Eww5W0{A0j~6V#8{6f%c$MN3meQRAM-Wzkf(9145ua@%iv^6Ex(`n|;h+`w0DhM;t9)+ai;8fRk7 zX{FE$c1$CO`Uu?KS;J2m^^j_n;Y&@ zTq*89zkhGT3Kdi{)bwKm&khN--v4E)3VNzF681X2V#|*2cQtf1n>nu7dxk$+R0fCZ zT4Ydp%ufG-4NQ3BdmQT4)_#jUknh3sYWlc#+1Seo$Cr;xPg4-8m`DpKMe(AAK_u4Y zA0>arQVP4-KqohU+j9zyv0#t;>kK8pHki@6M?D^CgC2&Gu0Gt+fUcuI!fQMJ^1ypiTQ|2DYm)0>FW#%u7j6^1bkd z^b$M5Sn??+F!9}rlfiie$W7R{*(h!`TVqpHbxXvV2_M6B;1d&a`DZ|dy*}S1HW=AK zG}HRW?6O@7{Vk_V!8H%)Z*N3G~~PvflIINKT=!;9(iixn=!0D05+66IZWkm%ht&l^Ex{aur;}X zl6L$TpCYP6ZxwuY9AJUU;T}MX1vC4d%sWE+lm%3B)oez(fu&g-&jg}!T|YRy-+KK= zH^MlKi$IB(c)%-lo`rCSZT}x)RU95u57H{c8uow1qq*N&md7_dak10(DBf>8S`N=c z{ri`W_T#eH#a2gkz1V7s{6S(>O!nC-Us92lJH)an|E&fqYbLj~;8g%ep)ePQy^C@* z>`J|xcYQ+XEhrshNh;V^rI}`c5<9Z0EytCq5ObqFrYY#p))~6xP?>gLg6yS#+Z{r} zfn-Q0MQc*Ji#R2~poLb@;Q_a5sE?5~Pv8iewRzH}9ApR{a-!*h=%hzY7v36%s%;BQ z6Q&~II_f&9&1u91`p<%bt>AXkpR~;r_ItY7@?Cm^4L2>%3izX*U0W z8)@#17}f1hWH8e-0D4zE{RoyU8CJL#tq5LZ@p3O2i*SdiFIJ^CHG>eILQ0y=@iQf8>ApE3Fpz1aHe}-7&!i@YRSx|JIG`n(*x5XUawiX$Qs+gP_D0I1`B5uTTwrVMtPS$oaA0tx9|sJIi{ zPWH~pKg9J6F!=DB=!lL!H{NPMq#TVY01?3^1r}|T9xrLfSIm~${r#bbG%%BfALhXB z+@;>rIEmh+kgs?>C(-vMp)GTsFEa>pW<`6PCHae^J+jbl%$Sdm-^-y%0~GZMS?n^c zV6c@ZlluNYG*;>-5fXyd{a+p=kPd&evf_ppq1H$A^4s+J%Mxvo?~n$f8@tXw$YQXk z6R(oY4cVC$U|GvLrS~Vk;)8`7XHcu<$jJ0ZN~K5S%*mS2yW~~SyY#mHw3CiCDsE&6 zWQA_VV1=u>Z#iT%K+}X0O_fUa|1Dr=q_0QhXP@4UCH3FI7+^0hf@|S|z>= z`PZ3x7AH|lrUo8{5;FvN$;OpjZW1X9m70&Kk*-otY zI&lHb3FR>^aJ%U}&L(ZZ`x)ZNQj(*IuyaP@A&ORIw^N9i$s1{|pLcp?%G{4Dd!&4j zhXmkL(asQLFep?C_yw|75bejsU#AEQ`jZ$BAshxarX7I#E|trTu-iPU-FcCzmi$rN z=7%1LS&;tAArurvQ)-+;>~XA=F-!)WbJKtvWk6f2&?}N$O%!hI4oL|0sg_+*v7hA0 zu=X$D9O+D_y}5Ds#TN1ijp9U1ZXSamPN~@{g5Du>L!!7HmNY|+A-Kl~{dYQ}#^0`fZxCc0*)&>_iU}h?PJqUKE{sC}nWS`jd{dFN4EoA(0 zhJUhimRt6!O3v{RpaTNBF^kgvIwizKAU#8^slp$67o$tia;AzZgWcTtfl@)+-t2Ks z)r3f;swFegAl6W?iK$0O`?yH?%ozl?3#Cc?MDfwyoj4Vrlipv%z~VPk)qlEDSnr6$ zQ%>ih_fQg@CkQYTgK|;r{+kl5el3uyS7D)5(r8fkq4DfL@n6y#_3I}=s+0VPoKAmK zBtN;0>FWQCD}y1PVGpxcL&-a>5vU@a40?qJCI)kRA55`T9bbz#|JGoG-0Sv}rtu(m z9YEFpMJ%BDBNhEjj~vPm^ebz6mRP}-eycUOn)74^X;9_JBnLO}r;wKZuG+H>e>bA7 z`yw>O%q%=b!$%WN6!t}bb;ADY=c9}2Uh8pD#sB>adcvYjGN;z^(osO!obp=02D|AK zmU9eBOH+c+eHTAA0jWQ!taY)TSglp8E-gfmf#_LuwRwss;Y-+nn?Q5<iN z=MC8n5b{c(0j?CfFKQmIT9dFDrwd9>YEh_iZp>Ttj2wtK6owY1Rl1+x^QDe@vGlR= zVUe;ih>8DLJKWn~V^ukcWubDVaXv}ShU%R@@6vN1nJ@wJp2TNz(!^7-i~m^$8}=C3 z=*)z#QC3KDL|9_|RZbV_IPq?lxHX2;#IXxh$3XG}Aoh-YQwCq1JqnExvP4LY82fQ0 z9l*6!_32OD_B$#tM*bYHGr{j=G0V&-PCK`{SFHdp6;(*b2A*K-q_|kJ(wKtqhk^EP z;I7Pp3zb|==_e`>7;*em=n_Pyy6NGmqTJaAK(%IPGsM$969nMEO8`b4@lo+h6Z*j^ z^uwXb1?|v~DLN(oBV;ZrbiSYvVh)o!#%@3^_~2YZrK->4bVTe}(EPF{PcTyVK{x6E z^=x%S^IG@Bt%1Dm`w0={UNr{>6=JItns6kM7^JiXS41NRZ6p(DKM!wY-kViIN*VpbA z{{)O@fV^HpNu;8}{6Q^o+x*eB{MZDej|@@Xeqx7|Z)zd6N+SMSlcLS+y(?tL03=qV zG?CEPQ0K_@KDa1fv}jDt;zFR*huq#v844d=4}!Hk)mwF_w(Ck z;_S+u>3J$6Yy9iW?!xAP18piDO=Tt-Q>Qo~Z=Yf@bY!6D!U(@1bdTsfI*SJHw(JwW2HSI^03Owod~08s z#SIheyJ;>bQ%S>dpfEY0Yt3C`o*iIt6Yo<_kTh( zMgp*P%rtiV-JtjYQE1)c&s)by{MvJ1q%WC)gg|^Pnbx+V+J=EPY~YVrWtQVmRGGoV z*94fw7<&>bevr@o$Km6s^>~0DKR%S$e=YE-{%IC`o$=;x*SR2-ag>VOo%V8MIp_Hs zVT(o6oTBUcnoQeH=D6AV5{}c$2*1b6t>?)}ZGQ$45Urmj#^#;Fa>>#r6^4oSkE4L& z1@lMPmj&&D*H4tLCTNM^aI7+lRb&6YE@=Bn@cv62WkH$TnA(CAH- zv&>Vx$c~|xZY^^k?7>MhcGT#t8~T4^vPL)De@>yT@lzY@oWML{TXK2|R`2UzqfHJ7 zL+xn8{lvme3^hu4(@_`1DoQt(Bv)E*(&yLH>J(J2r^Vpn&I`KYYQr!8{J?!ot4pK$ zMu6l{m^xx@E>1%BaU|VV{y?U=M&v!o$%YlZHBZ(qvbh6- zQy`S-TSF-8&S+LgOjnk(rO4SQkF5aOAopy$Dqa^3#<3rFm8^s&D>&8LL2Bf2=K(^9 zGbf0J75>y^8>j+Es^7O(l@r5~h-2aq7r&1 z)L3;gwK`0P)*`^fSIP+`?NsYH*H|%LVdk1}QlySOGj+S_;|UO;W0EU1apu z1V*(<+<>BbNTW9%B3OsQuDt>eVbzu&XOtC(AsrfE7WpW`>w!nvN8|R5jE3gAKu+gl z;=}9oriu3C(sY)4#%9Q{KGX(LK3|rMa?3|P+T8YgjIZo^^HrfI?g!InyY5%5IN&EZ zHBgF{8+GSp()Qw{S_a@HjG0$v3@)#PEY~Ca=I2i3Lu)&)!0_;}**}V?(=VmNhofik zSXWq8=T2eGb;#Yx3ehwJLQ>ajN5#Y7yFXEltr(!qG|Kk1%vXxFYiIK3l>~Te$`+VO|=A3BTOei}q%3bDBU)YR8NvtrbHfwffi3Hy9 zIAxxt-=4QL;rd@zj?N9u+e!lQ;A*%kR(LY;YA;_a$_pF=Nak5P0w@6i5K4GgKt=yd z!nH?GDR@Dtio54Df^f0vWQM3XT52gRWtZG4K{%@$=k|0j89zZhDv8R45=nUVn#$N; zs3|Q@;z@B8yFl1xg?m>8nF z;)5+rut47H%uL|V6U;JH&8JRg3t$BUwdM~~KVC?!Wj^5|J=~)EeQ7$wo>DPe+i&Rc z-JYHIZi5#Xu4E9mW*iHMnMv!_PqXIuBo-gnJ-uRIFZ}e9Iy2ip$$gB@P3KO^_5mF) zO)(pDc}r&ctw)&);hM8Qp+Js?ES@(p`fWHy-e#3!U~{CvGHDM9)yOmY#dp9_6$UUm zEpG*25?^ejPOeBLJ%17DToTYD)h-4f`3DYERJMU|=W4yB4BJv8AoG&T8!rp|O|qfu zsS>i1!&FQmBg-r_OeokQ%0#j7h@BCVbn_G7$pU{o(cwvPgL|#;&)>^|1YLL>=K$yO zoOaO5);A#|EFvco^$WiZXoKOR%`rFbq3%J?j^>uNX)DC!z=)qijSFw18s03>3Z2I1a zM>}D}R?bxdiR)8X&sD(5a&{nnY;E$(q*!BNx20*_$vf{gyF0mkdK;H#yWdKEZ2;KL zCCM!R0=oktOv7u!OChAo5MONgfNHyKB{evYyKp!>;B&u>WI4V39D#2Bj#&1>%VHNl ziXyXJYTopQ;^q{`q@tW(HPzy?^%-=X^VsPXy)Mjo&+-*;-FUwhN8JDYlR)DLDPzU9 zD))Cg{HWW9qTd*;JFM&7@*6|jepFg%{q*n(j7Rv|{aSYZ(sffH6c#U65r>BD8FH=t zxZ~;Nwgk6uIJ?F6s%csG(WC7xBE$SRhWlZG5pI5%_kFm5hb|H`x@jhQxhuS?>%&9? zIUPd#y8RICl-u{|npFJplL>E77$AqjbmyehZ#rD-&;GWL(*4agYrPll@9bvNnTk=P z>FBo&k2aC$pY}D%HvsB;gOYf}rStR_-shZuVuM&k8nAUUr2Vjjw;@@;Ts&^OA@hAK z%f(Q?nOrGE`+B$efWq4m>vBa&CKVftq&CC5-w4dmBI>;Qkq_zBmRv5Ed zk!cs)&18w5+|)CmRhjU-GFPw3m}b@&aeq(f;y3}7o+s^YNG_kCT(7_&y&s3tZrcC( z8u#@|xOy4cO)eosnpQ%_#{iJ#p#1x)5oupF( zQ)pl`_d;i)=A^|yuU2q*2Vfqxl0Y1x1r|iYB-^;r;v*`FG;K^Jm?bVIAaRlyQ4!z- zgoi(mVQQPF>bsBYvE{6}p6azs20I%s8aOq7ivEh&xsbI!01P3`O+(%?BH&S*=+I76 z_n1i!WI|chUT;4$zKT{k+myA5HSbRrGtZdlt0!#TZXZu|GWF9Pv9df@F)OVNIa+j2 zdO2g9kdx#^665eWs<<1W5>?IHUfQgkz78#Qcpb4>r-5?X5AnV4WZ`CNiFz1c-_n2E zp4OMp%3m{M>9e^Q)#cxxnYXLu#kWtWlO0yhm)hVRSR}?`Af7pNfHpMZ&it?-0YJtu zpAZu-S_o^=z|#KvZLZ&R<@jV%1nOJ0N9X2g>q}Xe+<1<$bdtpJMm3RBZl8rfQ=i7= zgNeizp*AhQyqHLv0%b~TI4eTyg4g0$36panOCL3QHA9PSa$44K4(HWOHkH?B$wQ(I}b;10oD$P;K+G zTj_x*J@w)yY&?46a;-Y&k=7p{Qr6L_ zYmh|45P5#<=b^h*vbLISx^{t2M4pF~>&o)pa(|P3?&Ez-KM-wy*sdA9by&Mztw_># zUR7S+63K3?lg_kPDxn_t_gA>hz@cTmd%bnJeh_Q>%)&Hq;objR^%VVMqX(FK5^8*w zG4zCM6y9?-#B|)}IZtf8$GeLtX}#^Q>*r9=w#9hgta+ukKa#%TI2QGn54!HCbzfyq z$b5Ft)_o(TiY;`ysygqKosP2a*Y9Pwo=h*vgi(W)pLUaHF+0DGYzvyZZ->p^o3tC! z=%`u7`z}=ql8lj-&aJ5((f$EA88G8q-83Hm6Q@R|f!9tZzFBU&HA^~uJm|b6ta(D| zdm!a8%*$4u&Sjg6Vb%R==`!#7dC=-~3e`MUwj*@va{a1#^8UT({s8p-#`U)KJ>BZ` zg>paM@IFE9bZOak9BM+j`EH|WQ_`&56Rc`oRQ*-Ucv^>MJ#IYBysb%66>M$o=EF`v zSDzygyqDH|+`ADSy4UzHO-(1+IJCk89elo09pmX5DWOk=eXX{ymlUu$btp+HK%T5c;rU;7Dt`_rA6SyN|}} z7!-pCge#z1_Ayh*GtBqcr3RcXZlv1j#o4*D$hltVb7JGVccI|drI#?rsyC4qVF1CT zutivS{TDMMkos&Eovy%UU^NK&&X|{UxMVkMPDY$K2@i|I!`lE z<32W$;HC!jJhoa+ACXyxk>py(U!+I^mf)-MrolIy>Q9+1EzSN_Y%5i%Q&MY#nDCqa zTXAy>-t@wUZHTyB5PB_xaxE(Boc~VB2!=f@KaDiFfp*QVc zO)gypEhq8-uOPOvb4h*%{s0bBgAoumOoNc0s9+bB@mDG>pIwf)G|X3$9Q>NPwoZe^ z_crnOza_&o-=4XDx0nOLyTxhk5)nT7KO={+pG@VIdt|LORGaqVFON8B!6QC$}kZPuTrI8Je=bnRwsOVD<{CaDOU+Yjt|XOD>b zO%#l&ulkfX6g>8Kv@A7Q6;W$0t)aMBCi;IN*rwG}&!6kwMPD{gW3^mM<`hhCe$Gl% zy4y*IPH#N&dpz8}a|eXeV0Hbx!`$L67X^|uEg?@AT;-ikqp!;|oZC-ur^i0$c=Lv` z+&k%&p>R4kKO(OmGYD4rzw;({7YvUCX8b+BJD93KUVgA7%HRkA)JEU5xud&C+uUm3 zbKczh>8=iL+k{>?9tSY)v?iPnR5VTF+h82J2W{P9ePRPg!$rI?3b`(zox6 zEIcX~_EWcQ`c|?me$yOhh%C>gqDyXr0R|4eLBl|0)+SJyhe2rJ$ZR==Bo{h zc4s5@>-_RQcuNtmg{+c2K)zZ^@qg&7U*uCa)aGAd43@M}Kg>OB{Ye#~DsSd*Z>Hvx z&SUGmX0LCawku~&)V{}|>n%yvPG_{DbuRArhM9tAoFda4%=sm2=>YG_&n?&c3)ihf zOKZR#ZQe&iuJRIxQXdHiwO0GBCgPu@ATgoQ_r8u6l{9X^wI&Va(JAkz#!U5cVY9joPD zy@fa~IX`09fb%$Zuo4F@d3xqGA#3%9e~xqV#-a-&O0zC8u?V}tfGPFY{)e|+6_)Lq zNpF+3p5zCZF>0&x3A|L;`zY|H{gPHZunF4E#KZ4qe#T*254a#lbgc4Dn@CW zpp4ve&rEGekhxK&T=Q!wwo1h@SMhQ8ZAnh zYh3P*({byM#t7X~_%p1r9cadnH}VUmL6&)?{+z09w`}?FUeo52n}cU7m3n^LbDVZI zl;`ukbGg}iQ@Gl5lyzpg^YnUV)sxn0ysGQL*l8YWOX&LZhIaNB5Lb$RQuwiQNSW|U zLL#$>4V`Ya?`reGLFita@XtiTshgT?ePw^WuQA#dA6llPv8UIwcTPSnw*#6r@W$<6cb=}#^EY2; z4EA51I;QF2>GmCsw}|C$_|CgQ-R)#%@rUZSI=syVU=LcVxnr_;Z?WsqAI8$IjL*8m zguCY_Ug!Tr;K&Twna4TD-p4V|;mqIpe1CtQ|E}A)uIu%BUXRE9^>`e=!_6CH z+ahY7_|sqXaS4P2fU-2Iq1Qh|-qVq%7e3Y< znGMt5cV>j2oNTYS$35rwAAH{W;u1SnzAs=(_~2Zo8xncp*3|QtgHkA^(`v6W?5V=j zA4F4Xv{{$b5Zg0nwM;oT4e;c^?y!oV$_e8U-L8PnYSL`HAP6RMi$Swp0id^t&L>`LgEV}Pc7Sb z9({E#(+p-ZNkfBDd?N_p?e!7^_sP2yf-w=>>o=!23U5MgmFblLY31twowNOj~`pHrl^n`rR&a1IK+%SN!?awb(@Y)IvcOzX9cSDGg87H>MeQ>lAJNDQ|z zN}CNRbkJ_*D*NYF*v!~}wX*H2k&f`SZNuRXJU>RSF6zX~V<=0iA)16A_yAfBudBb- z!M}bdDS*jF4IE!#?4*&nlsjZ+JYz#W#Gif=$Cb)N9o%V9`}o#VSe59VcMs@=V>wo$ zYk9BoH16YOo09Pb0Yd*@5g7JA%zxJ*?PYhv4xm>I7+dJ49+u)tFd)q6SZtihnwp7l z_-FJ<0_}zR*R5*+u#t7>l4xvO7(w+&e2jP1Yp#`_#b|;kVMpu6LUo|>|0N5G=uL*=e{wZzuUiwUwCJ-qx-cY2du*;vh)r? zKI$|50s@g~RS|ArtU93~Zjpno6`_xCg=N;5Fp;1gNKDn` zi)xIhgt2R?^8GD((4F6k3bw9lM~*mn4L3Eq*)G(eB9?zUVZ&a-4XWyu?w=kUhT9|* z2~O&wgNiAk`*|I1ejt~Iw_9xzO%sBUpzy|4?0Eleu;J0-t3HBpa}7tm;_3~tOm=gz zS6L)B>H4Y52^Otlx72^Yr}WGI`lF8ui@V>c9@xFyfpH8Re-&clRMh*v*b_dA=gBzG z=5f}$V{}jM5+v!7jH#P9R+6tz%2-f>P<4;dKK*353O13~;U|n$bNW}SB3xstDFBuK z9Uqao_uSBOn*E-PD&_r)^A=}G4FO9QzU)gPZzNVO{@Q*L;N9~4b8zIzYT@KndXsuE zZ6kGTiD_j4U^8~Lo}Y2P_c*Q9rRkk4-n$}cc<@*p5&T&TZ{HWZ{?@C(%ih9a2K_0I zx#aB5_vhWrp7I@q7v`ZiZT^ZCbfI|eX`I^3piO7AH*PUa1->BeWtH_NbpsVWy_TDAM6~_^q3f6nP+P(kk zuVwm3L`WTFFsezbsFwAz2fZB0*RPc@^cPIAA*Iu^)A zY`y1|T_^te*}eE=Z>YM1i@Arv_Grm z#npqYy*(_l(&jN=qC%~ql_QFeGoRm4W(vL8ocHD>_m|z?uy?EgOEv}bz=a8B31&&g z)&Javh+Uu{e}19nh(+RO4II@Lv%{j?C__@JAEQ-?|saad49b{A8{^2{1>%UQy#$;r}w4#*~KgV#)L zm&`fc;;Z-7o_uo*xQ6n-I8VaoBWpjS;Uw?*))3OFgTsRFBv7#1 z)0AhY@q1kKBg_vq=WDN?wUW_u=s;X{zD&czfvZiqD0;=2ZRAp8a9=HS>sNBEA7Xrd z5aZC+&YsM9rP}m1?SwdcTdt=z=o~bN3^r(d=6h8;Ih@fv4|A zQAbOO8We?zJkim+yf!nwz39#j#OY7H2{+*Q-}nC|Aop6|qKSjJ3QaGMtYvqvyqAd> z7kX6xxXn;yi?8pt9&M`74}t%yptUuPzEC`cD;W{?KD(=d;A z-tN>z3fe|dry7Dl&}|QP!Mp`vs(|LRFf@s+l@x2zB%=&n{FQ9?%);i-alSFg5B?#7 zXNvAqOrs^VNN*7(;&|Zd`OI7reeA$IR2NeWGdZ+MW6O!O^o)sxuUj|U&#ol zoH~PqrQobOZ$z<1Op4k1JxgR8?&ZQs_2^)jg@y_(Ss=&#IJik()_i0!t-|L z@wjF{vsm5thLsc|U?>`^R*Q1`AjTFza>Zxwsp%Kd_J4b#SaBLUMYKO(^(dOyvyP*t z25eDO^J>+!mJn_M{?=}PP|)WPHkaBKTbl5e(5aLlL{s&u{1r&!i77d zt@ZGJAEeUYf|A6bOpC8IC~7}uY=z5kQ@C>ZZtYp{;M}MIA&cTfT&_t-gvk~_&TiJ! zglH0HDgB#c3jGC~WR~Dt$aH;`*5nna8HXZsnw)a zi7@(<*LN+_Vbwp0n5qBdqA~{-8o^TJAbX|gQHlInsVaZ*0w4#S>CaKbb-_kaUaQq6 ztLDufcr3Y?He0UHHmN-r_pKk|DP2CWl~2p~czL5l`qTD5iK$a#xE&9iTx54`Gx+!G z;y2BE+1?rHo0d(Ig2|0LWcB5x%U44V8Lk+s$Wfz3aZ$DxX=#%hvvcQO6z)D8KaMU+ zUw*5w4>9Im-2QL+YKZ<&q-gdCXYk zoLtF+>$iXb#f>HuJB=iVroOA0&cCky=3X1^sZKLvuAE*_IeB&^=EH%v+-u!d!MD@W zF1y>1r6Ab&oLdnG9@PlnUryfK4H{8+#Zgv+jizN)oeg+&4~BVTo?uS1AP?)Bm#XGP zBQqZFrMIJOTlrpNXuCYeU#%fU;1v_<#=x0&QhkVzcsq6q^TaQF4mQ@}W;b#7emFDW zhn_t3^h)IBIDC^vY=;;ZAvW$v?eW@B1BtP9Bw_2;;VcAE@JNi2CS^}uQB^(kf{^RB zO#IGFSWxRAcwNVV7ji{ceBk{k`fMhHF@EKEo)@ASjpBz?O9A~i?-RKY_%t!S18U|L zz{HuBB|~GoX%w!drFTkOg^;K9-Z%kkc>8=xG*HjQ`gO$;%Wp+!(OsV}|66o_7}({e z6@_mbyx>_ziW7L=x^7&hfKN;OQAhShnEfWm<56|me5lThd%6aUq^EFyXH4`KSv7J- zm~7B`L`}1>r{;>{)zM_aCW}Q|Nx|nS!`Z=6-wfjLYAw^KmL4pM?!W8-N%mV~OTKG! zur^B3m_aSbOMFy0W23?gqp`H3ggu~eK??!#Q)(Ycpyf@oqYOT7 zearb{Za^*i(Wx-9<1;N>mb9@&Kf1Q~k8w}6wqP{bt?>U&NUDTyj+6$^^mFlsJ zWGs)29yH?%;V$wY{n$=PzUm9Lo_i}R17diQI?V;4jxKZYc*` zfNA&d7C!r9SVmNeWQ$F$a(vT!clhZ!J>DB6$=K)b-%Lme4YF&y9Mdi#qAcJalhbW~M4MMYh=P~J;!#&NB%nxSB^ zO8UAe@EWFe-&7uS+b1FF4FdkQ`5x1g4{({iRio90BYn!5?pi8Do9| zMG|QfOEAAV-AL0}9px(3R{rKBsR3>OoHs0>? z3r6EYQ%_q@!#3{`r6_y#WK+{dK>;@oGoOa#r%8A0KRdq3Qkq6_K7SV2)KKx|OWVYa z0jTeccY)|_?egy(Lz}(FvZjmEuE5I=V1|WGhri&zKYV-EqoZl?o`3k&IYsgJjlS4* z7I(EtZR-8e8wSa<1s79X@y3J52lZ+$>3Vk(45VLNQSna>z)t=sUu{ZHE046@@vrSR zeM%3*@=hxcM!~SL$=fR#?Mzem>0Kx_$UcqFs;!~hEBm(XFtOd8B&w} zEIM)YS12RobKJD0GrCo1d8$$dNc^A3IDW&QM z*0CF5+eHNlMPp_tL6KV_egjpAPig00Wc<@|!#p`QtD|VoLxY4V3pjFE2Cq3t72QI) zM67^O9z_lfW5#{0>@q5?RGXt4phoWGI2@Ue2t%C0wo*aBr*y!kL=!%eFM2?@ip}*3 zZOic7-_Glh7DwSAr$NCpOhul4QCu2_Z9c;VXGn3jWZ(0o z4Y2`=8)r2Hjv8NOJE`zOe{qS#kAWkP6G?Oor*P-8kZ@M_lgAP|jhF4KK0B1x>%V0V z-=_=VVHgr_enl*nx;n{awu8+Vjjls%H=dEVC~0HR%*^ffkIwGq^^h5Ls+F-0`~jBY zT=SvM!WJ)2{OU&m978C0U^#M+Eb{eSZ423zNcAJqCeAW?LNfm`k7ltIwu45>0f=q5 z$IL1kKZHATqr*K=A1iF(Kf}X`!>7|y)`L@i!w*ifZ3t^pRIvftCu>@<6i}swOG8$# z6|tCP(X=5`@Xy1%To|Y4h>>kcP{cg<+w)Cno{Pe$2>u6YySk8D992Prjn7%>BgwWHZg#@m~0rL4KoK2~LeRF}( zo?bCd)r(z|){8s>3<x!Q8fG0W?i=_^%_JO*{4FcVJsfy&1$MnY z_UGk_N4JLr{r)@jx+j4QGPx*pwrmPA8M|4r)`%QwwtKXD}^9ay&$^ngbKk^h^%BOb(v${{Mz@d?QyRj<4 z-`dBmGX(thZUNd|EZ|ZUT`;XvR8FShD8&^1LccF-UOA)hDN?;KHv)?ll@B$W2lcvS zfb?FV4KI*(Svi|#IEA;x5|pZz__gZt7fh(cF#L<31MbV%GnpMN*hF;~F!akj$}G1- zFcbFspPzFa^;RM}Ux`O>-)eCySooh>??vQIj&DUlkJI}AqGh5%YUjdDpI=v1b1QyS z$T=7vGM5Q*uKjZ7O7K}a+qynds8BtpGa)0zMpnl~^2@mZ2fvXg%KZ_heuLUS?ra6r z`e~O0StEtCjxut@{3fgAzRB3JKCxPFVUCrWwypRQnY!~{o>PBd@6%d_tpJCbGU4L` zv$us;`M#e|YGL|OXCpRMA#H{=t?2%|!y*g~4zaL&XJttpZDE?oVMY$uh!U>d=^pSG zb$uQ5S>%_?s5|E~3)2AUm2KPp?H1=?07XJVhhwU)n$tS7k{N)Wg|5_pxmWX3^eo+R z?4vxUtf1W5uVnK$1KJ|e?Przyp4s7Ji8`r7AHEQ8vtPYwkD8F z+WznEneF^rmE6o5lK&Z%=<0q~HAYS|Ln8+RrCmoeW}P$I+_emE|IE=9vE6?E2j@O? zeg3CYzv!p7M$~QmB9wJ<_wMA=K6MW`{hMi^JI20Xp)$d0Yyf#6tqlk*<%TH@O4uET zMs79wjSL)#je{_vS5TtGuv)A;%mT4o!rN#)r>xPwcNg9{c6 zh{Xm#hg)kKYQMTS=>sE=F9-@-I}-44Uk}=ec2J#)6TymZUxLML!`7;TB969FbPJoa zuYX!1LuD#q9Yj*#VVj;1kbKI!l_~>nKxt7I6lBUJ3JJH>X!#QJJHuy4%>JEVT(;I^ zt(c#)N>I8absIpoG%ge_Treq&A{qqGv=@0pU_Qt>-!$;rs(r>)zhylA9!(wVLe3x! zgbr3=>bZh;oQ~(-XKd<&Ep!vD(+O+7$)Q1ArSPCRuidr@Mo(ck9^P~heH9^EGws(D zMH>@`z-&1%i#}qZDF0#p%?udDBeqm8*FJLmBqDHjlBYHIecIRp<|f}VbF)-wZQD}& zS=oR^`;sm)k�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

    )2-_w+d`4CrkfJ~ch*TQG5g@!9 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⪚W0M9i5ksr^37ewC$fQ z<43oAX7`3)p={w3Np808FU@`w`zn0RTAx6+PE9IZ#gliNewQ9`0mcC}0l-~T0*I|x zg!I4e5>l++uJfnUKih=N9z*DvUsFE)FBofjpY4yJy*158Je93hJ{{koI5@)y*2 z6zmnA(uxT>kyi<;ESGZR%(m;<6;Dn;ytxnSvUVP;1JzUDQL5+z)f(+^N-%VSDj+W2 zmIbhFCGI+1Dc>OQOTbXK+D9~1xz2b_#Vn*TRCC$%-0>A|XL)uscFJ@Vv{(m2k9C00 zR8Ux;u?Z?X-oY+$Eb@6WS zal`lakS2s!Vbn;e<2Uyz6b*!cl)IZsR53J zoE#hj$BY~3LbbnnpaDMFiNHN+^}u^13vGZErx}7b&Rv1WIdm?+~LKoc*1=+8&IbPyQF7sj|UR|v>Tb z6cN6GfJG%RjD=?-d80Q$!l$~LW}l5=unYI4AgAST8ilZuqa%gVt9Y&a$2O_>Pvv@jI!8@Q?53us zFo6)zxza_F0OgUyMbgBqEJ$nXiXm}LOX{Z9R&iZjT`g&pZV`N_@x_U(qit7|Y1w9hx19 z|4meX^oQ}L^l)nuk<0#-VnTLhR$^ZHLc!TmNald2{7+{cZybMKAscKh>*Y@shs+Om z&&m_~%PAWJn;)*a5h+|(AI5!)#NOjWt#5xt?%= z7K1&a@a@?$d>OG{zVtQFup~C)Kjq6RiTOEA7xd1JERcHR?XNFLakfuZ5jeQ_{{zrK zFTaQR8O^T~tO5ytO(ghkHb9$ey&x1#>#lS~)0$d+zAO__!;_#5K3_vp1mxtTso$t6 zboL_tE^cY=g4Xt~FuG+Q_%ao;v`Q|isRFVxQz1P)g|0h0)w@P(H#E0)#mkoQI7H>m z$xbD{@Ija2t6lNbtauB4vd8ch(+~N1>i2ub5NK@fRCzmlm2K>cRDWgbWFLTjB#^Do zS3>=Wk*&{HZ~D=bZ2POX18D>Dg#jk>^3{8D_7Ldql5qNLTP$A#8GC)^%L?+mWy=_W z^Omj2G(i1;!L@5qP%KI3L(=~?fUzf7PSOIAs21Lj;FRSr+nVQL)dmEQfT(Uw(rb#0 za1!V#u3wfGr_)t!ZM&L7;sH<@rkBED&+;68rVhb5X$Z|LbgZ$OS6bV;)ZEgoeuL{Z zeazi$-U(b;O4DAX+?-U%Q1ctkO)V{5(9zXxpJV&6PE}WW+7KfkBQxptV{2{#pFz6r<_1Sn(zX$pHUN z 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 ^E$*_8XUKd4UtfJjLL?KJEz&M5EL?u&H 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

    8!KXvk-lL#~Tj9I}h^ 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 Date: Fri, 12 May 2023 16:29:45 -0600 Subject: [PATCH 711/782] Implement Redis cache for block and mempool data --- backend/package-lock.json | 158 ++++++++++++++++++ backend/package.json | 3 +- .../__fixtures__/mempool-config.template.json | 5 + backend/src/__tests__/config.test.ts | 8 + backend/src/api/blocks.ts | 12 +- backend/src/api/disk-cache.ts | 6 +- backend/src/api/mempool.ts | 12 +- backend/src/api/redis-cache.ts | 140 ++++++++++++++++ backend/src/config.ts | 16 +- backend/src/index.ts | 7 +- 10 files changed, 358 insertions(+), 9 deletions(-) create mode 100644 backend/src/api/redis-cache.ts diff --git a/backend/package-lock.json b/backend/package-lock.json index 0a0b8b9d1..1a92552cb 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -19,6 +19,7 @@ "maxmind": "~4.3.11", "mysql2": "~3.5.2", "rust-gbt": "file:./rust-gbt", + "redis": "^4.6.6", "socks-proxy-agent": "~7.0.0", "typescript": "~4.9.3", "ws": "~8.13.0" @@ -1555,6 +1556,64 @@ "node": ">= 8" } }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.7.tgz", + "integrity": "sha512-gaOBOuJPjK5fGtxSseaKgSvjiZXQCdLlGg9WYQst+/GRUjmXaiB5kVkeQMRtPc7Q2t93XZcJfBMSwzs/XS9UZw==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", + "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, "node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", @@ -2718,6 +2777,14 @@ "node": ">=12" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3678,6 +3745,14 @@ "is-property": "^1.0.2" } }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6577,6 +6652,19 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/redis": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.6.tgz", + "integrity": "sha512-aLs2fuBFV/VJ28oLBqYykfnhGGkFxvx0HdCEBYdJ99FFbSEMZ7c1nVKwR6ZRv+7bb7JnC0mmCzaqu8frgOYhpA==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.7", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.2", + "@redis/time-series": "1.0.4" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8704,6 +8792,53 @@ "fastq": "^1.6.0" } }, + "@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "requires": {} + }, + "@redis/client": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.7.tgz", + "integrity": "sha512-gaOBOuJPjK5fGtxSseaKgSvjiZXQCdLlGg9WYQst+/GRUjmXaiB5kVkeQMRtPc7Q2t93XZcJfBMSwzs/XS9UZw==", + "requires": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "requires": {} + }, + "@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "requires": {} + }, + "@redis/search": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", + "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", + "requires": {} + }, + "@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "requires": {} + }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", @@ -9604,6 +9739,11 @@ "wrap-ansi": "^7.0.0" } }, + "cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -10332,6 +10472,11 @@ "is-property": "^1.0.2" } }, + "generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12454,6 +12599,19 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "redis": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.6.tgz", + "integrity": "sha512-aLs2fuBFV/VJ28oLBqYykfnhGGkFxvx0HdCEBYdJ99FFbSEMZ7c1nVKwR6ZRv+7bb7JnC0mmCzaqu8frgOYhpA==", + "requires": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.7", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.2", + "@redis/time-series": "1.0.4" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", diff --git a/backend/package.json b/backend/package.json index 7ebc2e970..24da55e17 100644 --- a/backend/package.json +++ b/backend/package.json @@ -47,13 +47,14 @@ "maxmind": "~4.3.11", "mysql2": "~3.5.2", "rust-gbt": "file:./rust-gbt", + "redis": "^4.6.6", "socks-proxy-agent": "~7.0.0", "typescript": "~4.9.3", "ws": "~8.13.0" }, "devDependencies": { - "@babel/core": "^7.21.3", "@babel/code-frame": "^7.18.6", + "@babel/core": "^7.21.3", "@types/compression": "^1.7.2", "@types/crypto-js": "^4.1.1", "@types/express": "^4.17.17", diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 4213f0ffb..ab700c466 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -10,6 +10,7 @@ "AUTOMATIC_BLOCK_REINDEXING": false, "POLL_RATE_MS": 3, "CACHE_DIR": "__MEMPOOL_CACHE_DIR__", + "CACHE_ENABLED": true, "CLEAR_PROTECTION_MINUTES": 4, "RECOMMENDED_FEE_PERCENTILE": 5, "BLOCK_WEIGHT_UNITS": 6, @@ -127,5 +128,9 @@ "AUDIT": false, "AUDIT_START_HEIGHT": 774000, "SERVERS": [] + }, + "REDIS": { + "ENABLED": false, + "UNIX_SOCKET_PATH": "/tmp/redis.sock" } } diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index dc1beaa46..0c06b03e1 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -23,6 +23,7 @@ describe('Mempool Backend Config', () => { AUTOMATIC_BLOCK_REINDEXING: false, POLL_RATE_MS: 2000, CACHE_DIR: './cache', + CACHE_ENABLED: true, CLEAR_PROTECTION_MINUTES: 20, RECOMMENDED_FEE_PERCENTILE: 50, BLOCK_WEIGHT_UNITS: 4000000, @@ -127,6 +128,11 @@ describe('Mempool Backend Config', () => { AUDIT_START_HEIGHT: 774000, SERVERS: [] }); + + expect(config.REDIS).toStrictEqual({ + ENABLED: false, + UNIX_SOCKET_PATH: '' + }); }); }); @@ -160,6 +166,8 @@ describe('Mempool Backend Config', () => { expect(config.PRICE_DATA_SERVER).toStrictEqual(fixture.PRICE_DATA_SERVER); expect(config.EXTERNAL_DATA_SERVER).toStrictEqual(fixture.EXTERNAL_DATA_SERVER); + + expect(config.REDIS).toStrictEqual(fixture.REDIS); }); }); diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index ba7a55149..f86bc53e9 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -26,6 +26,8 @@ import PricesRepository from '../repositories/PricesRepository'; import priceUpdater from '../tasks/price-updater'; import chainTips from './chain-tips'; import websocketHandler from './websocket-handler'; +import redisCache from './redis-cache'; +import rbfCache from './rbf-cache'; class Blocks { private blocks: BlockExtended[] = []; @@ -804,10 +806,18 @@ class Blocks { if (this.newBlockCallbacks.length) { this.newBlockCallbacks.forEach((cb) => cb(blockExtended, txIds, transactions)); } - if (!memPool.hasPriority() && (block.height % config.MEMPOOL.DISK_CACHE_BLOCK_INTERVAL === 0)) { + if (config.MEMPOOL.CACHE_ENABLED && !memPool.hasPriority() && (block.height % config.MEMPOOL.DISK_CACHE_BLOCK_INTERVAL === 0)) { diskCache.$saveCacheToDisk(); } + // Update Redis cache + if (config.REDIS.ENABLED) { + await redisCache.$updateBlocks(this.blocks); + await redisCache.$updateBlockSummaries(this.blockSummaries); + await redisCache.$removeTransactions(txIds); + await rbfCache.updateCache(); + } + handledBlocks++; } diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 1e428d8b6..04328a72a 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -29,7 +29,7 @@ class DiskCache { }; constructor() { - if (!cluster.isPrimary) { + if (!cluster.isPrimary || !config.MEMPOOL.CACHE_ENABLED) { return; } process.on('SIGINT', (e) => { @@ -39,7 +39,7 @@ class DiskCache { } async $saveCacheToDisk(sync: boolean = false): Promise { - if (!cluster.isPrimary) { + if (!cluster.isPrimary || !config.MEMPOOL.CACHE_ENABLED) { return; } if (this.isWritingCache) { @@ -175,7 +175,7 @@ class DiskCache { } async $loadMempoolCache(): Promise { - if (!fs.existsSync(DiskCache.FILE_NAME)) { + if (!config.MEMPOOL.CACHE_ENABLED || !fs.existsSync(DiskCache.FILE_NAME)) { return; } try { diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index e822ba329..fff7ad20e 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -9,7 +9,7 @@ import loadingIndicators from './loading-indicators'; import bitcoinClient from './bitcoin/bitcoin-client'; import bitcoinSecondClient from './bitcoin/bitcoin-second-client'; import rbfCache from './rbf-cache'; -import { IEsploraApi } from './bitcoin/esplora-api.interface'; +import redisCache from './redis-cache'; class Mempool { private inSync: boolean = false; @@ -102,6 +102,10 @@ class Mempool { await this.$asyncMempoolChangedCallback(this.mempoolCache, count, [], []); } this.addToSpendMap(Object.values(this.mempoolCache)); + if (config.MEMPOOL.CACHE_ENABLED && config.REDIS.ENABLED) { + logger.debug('copying mempool from disk cache into Redis'); + await redisCache.$addTransactions(Object.values(mempoolData)); + } } public async $reloadMempool(expectedCount: number): Promise { @@ -318,6 +322,12 @@ class Mempool { loadingIndicators.setProgress('mempool', 100); } + // Update Redis cache + if (config.REDIS.ENABLED) { + await redisCache.$addTransactions(newTransactions); + await redisCache.$removeTransactions(deletedTransactions.map(tx => tx.txid)); + } + const end = new Date().getTime(); const time = end - start; logger.debug(`Mempool updated in ${time / 1000} seconds. New size: ${Object.keys(this.mempoolCache).length} (${diff > 0 ? '+' + diff : diff})`); diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts new file mode 100644 index 000000000..c3cdc9e28 --- /dev/null +++ b/backend/src/api/redis-cache.ts @@ -0,0 +1,140 @@ +import { createClient } from 'redis'; +import memPool from './mempool'; +import blocks from './blocks'; +import logger from '../logger'; +import config from '../config'; +import { BlockExtended, BlockSummary, TransactionExtended } from '../mempool.interfaces'; + +class RedisCache { + private client; + private connected = false; + + constructor() { + if (config.REDIS.ENABLED) { + const redisConfig = { + socket: { + path: config.REDIS.UNIX_SOCKET_PATH + } + }; + this.client = createClient(redisConfig); + this.client.on('error', (e) => { + logger.err(`Error in Redis client: ${e instanceof Error ? e.message : e}`); + }); + this.$ensureConnected(); + } + } + + private async $ensureConnected(): Promise { + if (!this.connected && config.REDIS.ENABLED) { + return this.client.connect().then(() => { + this.connected = true; + logger.info(`Redis client connected`); + }); + } + } + + async $updateBlocks(blocks: BlockExtended[]) { + try { + await this.$ensureConnected(); + await this.client.json.set('blocks', '$', blocks); + } catch (e) { + logger.warn(`Failed to update blocks in Redis cache: ${e instanceof Error ? e.message : e}`); + } + } + + async $updateBlockSummaries(summaries: BlockSummary[]) { + try { + await this.$ensureConnected(); + await this.client.json.set('block-summaries', '$', summaries); + } catch (e) { + logger.warn(`Failed to update blocks in Redis cache: ${e instanceof Error ? e.message : e}`); + } + } + + async $addTransactions(newTransactions: TransactionExtended[]) { + try { + await this.$ensureConnected(); + await Promise.all(newTransactions.map(tx => { + return this.client.json.set('tx:' + tx.txid, '$', tx); + })); + } catch (e) { + logger.warn(`Failed to add ${newTransactions.length} transactions to Redis cache: ${e instanceof Error ? e.message : e}`); + } + } + + async $removeTransactions(transactions: string[]) { + try { + await this.$ensureConnected(); + await Promise.all(transactions.map(txid => { + return this.client.del('tx:' + txid); + })); + } catch (e) { + logger.warn(`Failed to remove ${transactions.length} transactions from Redis cache: ${e instanceof Error ? e.message : e}`); + } + } + + async $getBlocks(): Promise { + try { + await this.$ensureConnected(); + return this.client.json.get('blocks'); + } catch (e) { + logger.warn(`Failed to retrieve blocks from Redis cache: ${e instanceof Error ? e.message : e}`); + return []; + } + } + + async $getBlockSummaries(): Promise { + try { + await this.$ensureConnected(); + return this.client.json.get('block-summaries'); + } catch (e) { + logger.warn(`Failed to retrieve blocks from Redis cache: ${e instanceof Error ? e.message : e}`); + return []; + } + } + + async $getMempool(): Promise<{ [txid: string]: TransactionExtended }> { + const mempool = {}; + try { + await this.$ensureConnected(); + const keys = await this.client.keys('tx:*'); + const promises: Promise[] = []; + for (let i = 0; i < keys.length; i += 10000) { + const keySlice = keys.slice(i, i + 10000); + if (!keySlice.length) { + continue; + } + promises.push(this.client.json.mGet(keySlice, '$').then(chunk => { + for (const txs of chunk) { + for (const tx of txs) { + if (tx) { + mempool[tx.txid] = tx; + } + } + } + })); + } + await Promise.all(promises); + } catch (e) { + logger.warn(`Failed to retrieve mempool from Redis cache: ${e instanceof Error ? e.message : e}`); + } + return mempool; + } + + async $loadCache() { + logger.info('Restoring mempool and blocks data from Redis cache'); + // Load block data + const loadedBlocks = await this.$getBlocks(); + const loadedBlockSummaries = await this.$getBlockSummaries(); + // Load mempool + const loadedMempool = await this.$getMempool(); + + // Set loaded data + blocks.setBlocks(loadedBlocks || []); + blocks.setBlockSummaries(loadedBlockSummaries || []); + await memPool.$setMempool(loadedMempool); + } + +} + +export default new RedisCache(); diff --git a/backend/src/config.ts b/backend/src/config.ts index 09d279537..3a028d0cd 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -12,6 +12,7 @@ interface IConfig { API_URL_PREFIX: string; POLL_RATE_MS: number; CACHE_DIR: string; + CACHE_ENABLED: boolean; CLEAR_PROTECTION_MINUTES: number; RECOMMENDED_FEE_PERCENTILE: number; BLOCK_WEIGHT_UNITS: number; @@ -137,7 +138,11 @@ interface IConfig { AUDIT: boolean; AUDIT_START_HEIGHT: number; SERVERS: string[]; - } + }, + REDIS: { + ENABLED: boolean; + UNIX_SOCKET_PATH: string; + }, } const defaults: IConfig = { @@ -150,6 +155,7 @@ const defaults: IConfig = { 'API_URL_PREFIX': '/api/v1/', 'POLL_RATE_MS': 2000, 'CACHE_DIR': './cache', + 'CACHE_ENABLED': true, 'CLEAR_PROTECTION_MINUTES': 20, 'RECOMMENDED_FEE_PERCENTILE': 50, 'BLOCK_WEIGHT_UNITS': 4000000, @@ -275,7 +281,11 @@ const defaults: IConfig = { 'AUDIT': false, 'AUDIT_START_HEIGHT': 774000, 'SERVERS': [], - } + }, + 'REDIS': { + 'ENABLED': false, + 'UNIX_SOCKET_PATH': '', + }, }; class Config implements IConfig { @@ -296,6 +306,7 @@ class Config implements IConfig { EXTERNAL_DATA_SERVER: IConfig['EXTERNAL_DATA_SERVER']; MAXMIND: IConfig['MAXMIND']; REPLICATION: IConfig['REPLICATION']; + REDIS: IConfig['REDIS']; constructor() { const configs = this.merge(configFromFile, defaults); @@ -316,6 +327,7 @@ class Config implements IConfig { this.EXTERNAL_DATA_SERVER = configs.EXTERNAL_DATA_SERVER; this.MAXMIND = configs.MAXMIND; this.REPLICATION = configs.REPLICATION; + this.REDIS = configs.REDIS; } merge = (...objects: object[]): IConfig => { diff --git a/backend/src/index.ts b/backend/src/index.ts index bbfaa9ff3..51d407f6f 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -41,6 +41,7 @@ import chainTips from './api/chain-tips'; import { AxiosError } from 'axios'; import v8 from 'v8'; import { formatBytes, getBytesUnit } from './utils/format'; +import redisCache from './api/redis-cache'; class Server { private wss: WebSocket.Server | undefined; @@ -122,7 +123,11 @@ class Server { await poolsUpdater.updatePoolsJson(); // Needs to be done before loading the disk cache because we sometimes wipe it await syncAssets.syncAssets$(); if (config.MEMPOOL.ENABLED) { - await diskCache.$loadMempoolCache(); + if (config.MEMPOOL.CACHE_ENABLED) { + await diskCache.$loadMempoolCache(); + } else if (config.REDIS.ENABLED) { + await redisCache.$loadCache(); + } } if (config.STATISTICS.ENABLED && config.DATABASE.ENABLED && cluster.isPrimary) { From aea2b1ec6b46678d4072999741751b2fddbf27d2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 12 May 2023 16:31:01 -0600 Subject: [PATCH 712/782] Add RBF data to Redis cache --- backend/src/api/mempool.ts | 1 + backend/src/api/rbf-cache.ts | 104 ++++++++++++++++++++++++++++----- backend/src/api/redis-cache.ts | 48 +++++++++++++++ 3 files changed, 138 insertions(+), 15 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index fff7ad20e..dc3634a6f 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -326,6 +326,7 @@ class Mempool { if (config.REDIS.ENABLED) { await redisCache.$addTransactions(newTransactions); await redisCache.$removeTransactions(deletedTransactions.map(tx => tx.txid)); + await rbfCache.updateCache(); } const end = new Date().getTime(); diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index f28dd0de3..b5ae74072 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -1,15 +1,17 @@ +import config from "../config"; import logger from "../logger"; import { MempoolTransactionExtended, TransactionStripped } from "../mempool.interfaces"; import bitcoinApi from './bitcoin/bitcoin-api-factory'; import { Common } from "./common"; +import redisCache from "./redis-cache"; -interface RbfTransaction extends TransactionStripped { +export interface RbfTransaction extends TransactionStripped { rbf?: boolean; mined?: boolean; fullRbf?: boolean; } -interface RbfTree { +export interface RbfTree { tx: RbfTransaction; time: number; interval?: number; @@ -28,6 +30,19 @@ export interface ReplacementInfo { newVsize: number; } +enum CacheOp { + Remove = 0, + Add = 1, + Change = 2, +} + +interface CacheEvent { + op: CacheOp; + type: 'tx' | 'tree' | 'exp'; + txid: string, + value?: any, +} + class RbfCache { private replacedBy: Map = new Map(); private replaces: Map = new Map(); @@ -36,11 +51,43 @@ class RbfCache { private treeMap: Map = new Map(); // map of txids to sequence ids private txs: Map = new Map(); private expiring: Map = new Map(); + private cacheQueue: CacheEvent[] = []; constructor() { setInterval(this.cleanup.bind(this), 1000 * 60 * 10); } + private addTx(txid: string, tx: MempoolTransactionExtended): void { + this.txs.set(txid, tx); + this.cacheQueue.push({ op: CacheOp.Add, type: 'tx', txid }); + } + + private addTree(txid: string, tree: RbfTree): void { + this.rbfTrees.set(txid, tree); + this.dirtyTrees.add(txid); + this.cacheQueue.push({ op: CacheOp.Add, type: 'tree', txid }); + } + + private addExpiration(txid: string, expiry: number): void { + this.expiring.set(txid, expiry); + this.cacheQueue.push({ op: CacheOp.Add, type: 'exp', txid, value: expiry }); + } + + private removeTx(txid: string): void { + this.txs.delete(txid); + this.cacheQueue.push({ op: CacheOp.Remove, type: 'tx', txid }); + } + + private removeTree(txid: string): void { + this.rbfTrees.delete(txid); + this.cacheQueue.push({ op: CacheOp.Remove, type: 'tree', txid }); + } + + private removeExpiration(txid: string): void { + this.expiring.delete(txid); + this.cacheQueue.push({ op: CacheOp.Remove, type: 'exp', txid }); + } + public add(replaced: MempoolTransactionExtended[], newTxExtended: MempoolTransactionExtended): void { if (!newTxExtended || !replaced?.length || this.txs.has(newTxExtended.txid)) { return; @@ -49,7 +96,7 @@ class RbfCache { const newTx = Common.stripTransaction(newTxExtended) as RbfTransaction; const newTime = newTxExtended.firstSeen || (Date.now() / 1000); newTx.rbf = newTxExtended.vin.some((v) => v.sequence < 0xfffffffe); - this.txs.set(newTx.txid, newTxExtended); + this.addTx(newTx.txid, newTxExtended); // maintain rbf trees let txFullRbf = false; @@ -66,7 +113,7 @@ class RbfCache { const treeId = this.treeMap.get(replacedTx.txid); if (treeId) { const tree = this.rbfTrees.get(treeId); - this.rbfTrees.delete(treeId); + this.removeTree(treeId); if (tree) { tree.interval = newTime - tree?.time; replacedTrees.push(tree); @@ -83,7 +130,7 @@ class RbfCache { replaces: [], }); treeFullRbf = treeFullRbf || !replacedTx.rbf; - this.txs.set(replacedTx.txid, replacedTxExtended); + this.addTx(replacedTx.txid, replacedTxExtended); } } newTx.fullRbf = txFullRbf; @@ -94,10 +141,9 @@ class RbfCache { fullRbf: treeFullRbf, replaces: replacedTrees }; - this.rbfTrees.set(treeId, newTree); + this.addTree(treeId, newTree); this.updateTreeMap(treeId, newTree); this.replaces.set(newTx.txid, replacedTrees.map(tree => tree.tx.txid)); - this.dirtyTrees.add(treeId); } public has(txId: string): boolean { @@ -191,6 +237,7 @@ class RbfCache { this.setTreeMined(tree, txid); tree.mined = true; this.dirtyTrees.add(treeId); + this.cacheQueue.push({ op: CacheOp.Change, type: 'tree', txid: treeId }); } } this.evict(txid); @@ -199,7 +246,8 @@ class RbfCache { // flag a transaction as removed from the mempool public evict(txid: string, fast: boolean = false): void { if (this.txs.has(txid) && (fast || !this.expiring.has(txid))) { - this.expiring.set(txid, fast ? Date.now() + (1000 * 60 * 10) : Date.now() + (1000 * 86400)); // 24 hours + const expiryTime = fast ? Date.now() + (1000 * 60 * 10) : Date.now() + (1000 * 86400); // 24 hours + this.addExpiration(txid, expiryTime); } } @@ -220,11 +268,11 @@ class RbfCache { const now = Date.now(); for (const txid of this.expiring.keys()) { if ((this.expiring.get(txid) || 0) < now) { - this.expiring.delete(txid); + this.removeExpiration(txid); this.remove(txid); } } - logger.debug(`rbf cache contains ${this.txs.size} txs, ${this.expiring.size} due to expire`); + logger.debug(`rbf cache contains ${this.txs.size} txs, ${this.rbfTrees.size} trees, ${this.expiring.size} due to expire`); } // remove a transaction & all previous versions from the cache @@ -234,14 +282,14 @@ class RbfCache { const replaces = this.replaces.get(txid); this.replaces.delete(txid); this.treeMap.delete(txid); - this.txs.delete(txid); - this.expiring.delete(txid); + this.removeTx(txid); + this.removeExpiration(txid); for (const tx of (replaces || [])) { // recursively remove prior versions from the cache this.replacedBy.delete(tx); // if this is the id of a tree, remove that too if (this.treeMap.get(tx) === tx) { - this.rbfTrees.delete(tx); + this.removeTree(tx); } this.remove(tx); } @@ -273,6 +321,33 @@ class RbfCache { } } + public async updateCache(): Promise { + if (!config.REDIS.ENABLED) { + return; + } + // Update the Redis cache by replaying queued events + for (const e of this.cacheQueue) { + if (e.op === CacheOp.Add || e.op === CacheOp.Change) { + let value = e.value; + switch(e.type) { + case 'tx': { + value = this.txs.get(e.txid); + } break; + case 'tree': { + const tree = this.rbfTrees.get(e.txid); + value = tree ? this.exportTree(tree) : null; + } break; + } + if (value != null) { + await redisCache.$setRbfEntry(e.type, e.txid, value); + } + } else if (e.op === CacheOp.Remove) { + await redisCache.$removeRbfEntry(e.type, e.txid); + } + } + this.cacheQueue = []; + } + public dump(): any { const trees = Array.from(this.rbfTrees.values()).map((tree: RbfTree) => { return this.exportTree(tree); }); @@ -378,8 +453,7 @@ class RbfCache { }; this.treeMap.set(txid, root); if (root === txid) { - this.rbfTrees.set(root, tree); - this.dirtyTrees.add(root); + this.addTree(root, tree); } return tree; } diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index c3cdc9e28..2598c406c 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -4,6 +4,7 @@ import blocks from './blocks'; import logger from '../logger'; import config from '../config'; import { BlockExtended, BlockSummary, TransactionExtended } from '../mempool.interfaces'; +import rbfCache from './rbf-cache'; class RedisCache { private client; @@ -73,6 +74,24 @@ class RedisCache { } } + async $setRbfEntry(type: string, txid: string, value: any): Promise { + try { + await this.$ensureConnected(); + await this.client.json.set(`rbf:${type}:${txid}`, '$', value); + } catch (e) { + logger.warn(`Failed to set RBF ${type} in Redis cache: ${e instanceof Error ? e.message : e}`); + } + } + + async $removeRbfEntry(type: string, txid: string): Promise { + try { + await this.$ensureConnected(); + await this.client.del(`rbf:${type}:${txid}`); + } catch (e) { + logger.warn(`Failed to remove RBF ${type} from Redis cache: ${e instanceof Error ? e.message : e}`); + } + } + async $getBlocks(): Promise { try { await this.$ensureConnected(); @@ -121,6 +140,26 @@ class RedisCache { return mempool; } + async $getRbfEntries(type: string): Promise { + try { + await this.$ensureConnected(); + const keys = await this.client.keys(`rbf:${type}:*`); + const promises: Promise[] = []; + for (let i = 0; i < keys.length; i += 10000) { + const keySlice = keys.slice(i, i + 10000); + if (!keySlice.length) { + continue; + } + promises.push(this.client.json.mGet(keySlice, '$').then(chunk => chunk?.length ? chunk.flat().map((v, i) => [keySlice[i].slice(`rbf:${type}:`.length), v]) : [] )); + } + const entries = await Promise.all(promises); + return entries.flat(); + } catch (e) { + logger.warn(`Failed to retrieve Rbf ${type}s from Redis cache: ${e instanceof Error ? e.message : e}`); + return []; + } + } + async $loadCache() { logger.info('Restoring mempool and blocks data from Redis cache'); // Load block data @@ -128,11 +167,20 @@ class RedisCache { const loadedBlockSummaries = await this.$getBlockSummaries(); // Load mempool const loadedMempool = await this.$getMempool(); + // Load rbf data + const rbfTxs = await this.$getRbfEntries('tx'); + const rbfTrees = await this.$getRbfEntries('tree'); + const rbfExpirations = await this.$getRbfEntries('exp'); // Set loaded data blocks.setBlocks(loadedBlocks || []); blocks.setBlockSummaries(loadedBlockSummaries || []); await memPool.$setMempool(loadedMempool); + await rbfCache.load({ + txs: rbfTxs, + trees: rbfTrees.map(loadedTree => loadedTree[1]), + expiring: rbfExpirations, + }); } } From b6cb5394705fae6e8be61d4becbaa8c579c16489 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 16 Jun 2023 18:55:22 -0400 Subject: [PATCH 713/782] Fix redis feature merge conflicts --- backend/src/api/redis-cache.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index 2598c406c..e89b2302d 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -3,7 +3,7 @@ import memPool from './mempool'; import blocks from './blocks'; import logger from '../logger'; import config from '../config'; -import { BlockExtended, BlockSummary, TransactionExtended } from '../mempool.interfaces'; +import { BlockExtended, BlockSummary, MempoolTransactionExtended } from '../mempool.interfaces'; import rbfCache from './rbf-cache'; class RedisCache { @@ -52,7 +52,7 @@ class RedisCache { } } - async $addTransactions(newTransactions: TransactionExtended[]) { + async $addTransactions(newTransactions: MempoolTransactionExtended[]) { try { await this.$ensureConnected(); await Promise.all(newTransactions.map(tx => { @@ -112,12 +112,12 @@ class RedisCache { } } - async $getMempool(): Promise<{ [txid: string]: TransactionExtended }> { + async $getMempool(): Promise<{ [txid: string]: MempoolTransactionExtended }> { const mempool = {}; try { await this.$ensureConnected(); const keys = await this.client.keys('tx:*'); - const promises: Promise[] = []; + const promises: Promise[] = []; for (let i = 0; i < keys.length; i += 10000) { const keySlice = keys.slice(i, i + 10000); if (!keySlice.length) { @@ -144,7 +144,7 @@ class RedisCache { try { await this.$ensureConnected(); const keys = await this.client.keys(`rbf:${type}:*`); - const promises: Promise[] = []; + const promises: Promise[] = []; for (let i = 0; i < keys.length; i += 10000) { const keySlice = keys.slice(i, i + 10000); if (!keySlice.length) { From d65bddd30b2833872c27741d98772fb881c35562 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 16 Jun 2023 18:56:34 -0400 Subject: [PATCH 714/782] Add transactions to Redis cache in manageable batches --- backend/src/api/mempool.ts | 22 +++++++++++++++++----- backend/src/api/redis-cache.ts | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index dc3634a6f..73a6fdfeb 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -86,6 +86,10 @@ class Mempool { public async $setMempool(mempoolData: { [txId: string]: MempoolTransactionExtended }) { this.mempoolCache = mempoolData; let count = 0; + const redisTimer = Date.now(); + if (config.MEMPOOL.CACHE_ENABLED && config.REDIS.ENABLED) { + logger.debug(`Migrating ${Object.keys(this.mempoolCache).length} transactions from disk cache to Redis cache`); + } for (const txid of Object.keys(this.mempoolCache)) { if (!this.mempoolCache[txid].sigops || this.mempoolCache[txid].effectiveFeePerVsize == null) { this.mempoolCache[txid] = transactionUtils.extendMempoolTransaction(this.mempoolCache[txid]); @@ -94,6 +98,13 @@ class Mempool { this.mempoolCache[txid].order = transactionUtils.txidToOrdering(txid); } count++; + if (config.MEMPOOL.CACHE_ENABLED && config.REDIS.ENABLED) { + await redisCache.$addTransaction(this.mempoolCache[txid]); + } + } + if (config.MEMPOOL.CACHE_ENABLED && config.REDIS.ENABLED) { + await redisCache.$flushTransactions(); + logger.debug(`Finished migrating cache transactions in ${((Date.now() - redisTimer) / 1000).toFixed(2)} seconds`); } if (this.mempoolChangedCallback) { this.mempoolChangedCallback(this.mempoolCache, [], []); @@ -102,10 +113,6 @@ class Mempool { await this.$asyncMempoolChangedCallback(this.mempoolCache, count, [], []); } this.addToSpendMap(Object.values(this.mempoolCache)); - if (config.MEMPOOL.CACHE_ENABLED && config.REDIS.ENABLED) { - logger.debug('copying mempool from disk cache into Redis'); - await redisCache.$addTransactions(Object.values(mempoolData)); - } } public async $reloadMempool(expectedCount: number): Promise { @@ -212,6 +219,7 @@ class Mempool { logger.info(`Missing ${transactions.length - currentMempoolSize} mempool transactions, attempting to reload in bulk from esplora`); try { newTransactions = await this.$reloadMempool(transactions.length); + redisCache.$addTransactions(newTransactions); loaded = true; } catch (e) { logger.err('failed to load mempool in bulk from esplora, falling back to fetching individual transactions'); @@ -234,6 +242,10 @@ class Mempool { } hasChange = true; newTransactions.push(transaction); + + if (config.REDIS.ENABLED) { + await redisCache.$addTransaction(transaction); + } } catch (e: any) { if (config.MEMPOOL.BACKEND === 'esplora' && e.response?.status === 404) { this.missingTxCount++; @@ -324,7 +336,7 @@ class Mempool { // Update Redis cache if (config.REDIS.ENABLED) { - await redisCache.$addTransactions(newTransactions); + await redisCache.$flushTransactions(); await redisCache.$removeTransactions(deletedTransactions.map(tx => tx.txid)); await rbfCache.updateCache(); } diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index e89b2302d..4b3c956c0 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -10,6 +10,9 @@ class RedisCache { private client; private connected = false; + private cacheQueue: MempoolTransactionExtended[] = []; + private txFlushLimit: number = 1000; + constructor() { if (config.REDIS.ENABLED) { const redisConfig = { @@ -52,6 +55,18 @@ class RedisCache { } } + async $addTransaction(tx: MempoolTransactionExtended) { + this.cacheQueue.push(tx); + if (this.cacheQueue.length > this.txFlushLimit) { + await this.$flushTransactions(); + } + } + + async $flushTransactions() { + await this.$addTransactions(this.cacheQueue); + this.cacheQueue = []; + } + async $addTransactions(newTransactions: MempoolTransactionExtended[]) { try { await this.$ensureConnected(); @@ -118,6 +133,7 @@ class RedisCache { await this.$ensureConnected(); const keys = await this.client.keys('tx:*'); const promises: Promise[] = []; + let returned = 0; for (let i = 0; i < keys.length; i += 10000) { const keySlice = keys.slice(i, i + 10000); if (!keySlice.length) { @@ -131,6 +147,8 @@ class RedisCache { } } } + logger.info(`Loaded ${(returned * 10000) + (chunk.length)}/${keys.length} transactions from Redis cache`); + returned++; })); } await Promise.all(promises); From a9f8bbbcce197dfb62b4a1ad25930942ab861f6b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 16 Jun 2023 19:00:52 -0400 Subject: [PATCH 715/782] Add network and schema versioning to redis cache --- backend/src/api/redis-cache.ts | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index 4b3c956c0..facbafd34 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -6,9 +6,18 @@ import config from '../config'; import { BlockExtended, BlockSummary, MempoolTransactionExtended } from '../mempool.interfaces'; import rbfCache from './rbf-cache'; +enum NetworkDB { + mainnet = 0, + testnet, + signet, + liquid, + liquidtestnet, +} + class RedisCache { private client; private connected = false; + private schemaVersion = 1; private cacheQueue: MempoolTransactionExtended[] = []; private txFlushLimit: number = 1000; @@ -18,7 +27,8 @@ class RedisCache { const redisConfig = { socket: { path: config.REDIS.UNIX_SOCKET_PATH - } + }, + database: NetworkDB[config.MEMPOOL.NETWORK], }; this.client = createClient(redisConfig); this.client.on('error', (e) => { @@ -30,9 +40,16 @@ class RedisCache { private async $ensureConnected(): Promise { if (!this.connected && config.REDIS.ENABLED) { - return this.client.connect().then(() => { + return this.client.connect().then(async () => { this.connected = true; logger.info(`Redis client connected`); + const version = await this.client.get('schema_version'); + if (version !== this.schemaVersion) { + // schema changed + // perform migrations or flush DB if necessary + logger.info(`Redis schema version changed from ${version} to ${this.schemaVersion}`); + await this.client.set('schema_version', this.schemaVersion); + } }); } } @@ -63,18 +80,22 @@ class RedisCache { } async $flushTransactions() { - await this.$addTransactions(this.cacheQueue); - this.cacheQueue = []; + const success = await this.$addTransactions(this.cacheQueue); + if (success) { + this.cacheQueue = []; + } } - async $addTransactions(newTransactions: MempoolTransactionExtended[]) { + async $addTransactions(newTransactions: MempoolTransactionExtended[]): Promise { try { await this.$ensureConnected(); await Promise.all(newTransactions.map(tx => { return this.client.json.set('tx:' + tx.txid, '$', tx); })); + return true; } catch (e) { logger.warn(`Failed to add ${newTransactions.length} transactions to Redis cache: ${e instanceof Error ? e.message : e}`); + return false; } } From 6ac58f2da791fe478e42f484c9ef1cd06b157cf3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 13 Jul 2023 09:25:05 +0900 Subject: [PATCH 716/782] store redis mempool in sharded json object --- backend/src/api/redis-cache.ts | 43 +++++++++++++++------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index facbafd34..8f7d54606 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -35,6 +35,13 @@ class RedisCache { logger.err(`Error in Redis client: ${e instanceof Error ? e.message : e}`); }); this.$ensureConnected(); + this.client.exists('mempool:0').then((mempoolExists) => { + if (!mempoolExists) { + for (let i = 0; i < 16; i++) { + this.client.json.set(`mempool:${i.toString(16)}`, '$', {}); + } + } + }); } } @@ -90,7 +97,7 @@ class RedisCache { try { await this.$ensureConnected(); await Promise.all(newTransactions.map(tx => { - return this.client.json.set('tx:' + tx.txid, '$', tx); + return this.client.json.set(`mempool:${tx.txid.slice(0,1)}`, tx.txid, tx); })); return true; } catch (e) { @@ -103,7 +110,7 @@ class RedisCache { try { await this.$ensureConnected(); await Promise.all(transactions.map(txid => { - return this.client.del('tx:' + txid); + return this.client.json.del(`mempool:${txid.slice(0,1)}`, txid); })); } catch (e) { logger.warn(`Failed to remove ${transactions.length} transactions from Redis cache: ${e instanceof Error ? e.message : e}`); @@ -149,34 +156,22 @@ class RedisCache { } async $getMempool(): Promise<{ [txid: string]: MempoolTransactionExtended }> { - const mempool = {}; + const start = Date.now(); + let mempool = {}; try { await this.$ensureConnected(); - const keys = await this.client.keys('tx:*'); - const promises: Promise[] = []; - let returned = 0; - for (let i = 0; i < keys.length; i += 10000) { - const keySlice = keys.slice(i, i + 10000); - if (!keySlice.length) { - continue; - } - promises.push(this.client.json.mGet(keySlice, '$').then(chunk => { - for (const txs of chunk) { - for (const tx of txs) { - if (tx) { - mempool[tx.txid] = tx; - } - } - } - logger.info(`Loaded ${(returned * 10000) + (chunk.length)}/${keys.length} transactions from Redis cache`); - returned++; - })); + for (let i = 0; i < 16; i++) { + const shard = await this.client.json.get(`mempool:${i.toString(16)}`); + logger.info(`Loaded ${Object.keys(shard).length} transactions from redis cache ${i.toString(16)}`); + mempool = Object.assign(mempool, shard); } - await Promise.all(promises); + logger.info(`Total ${Object.keys(mempool).length} transactions loaded from redis cache `); + logger.info(`Loaded redis cache in ${Date.now() - start} ms`); + return mempool || {}; } catch (e) { logger.warn(`Failed to retrieve mempool from Redis cache: ${e instanceof Error ? e.message : e}`); } - return mempool; + return {}; } async $getRbfEntries(type: string): Promise { From a393f42b5eada9cf7cd7e01e79d9d9c13e8887a0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 25 Jul 2023 16:35:21 +0900 Subject: [PATCH 717/782] strip non-essential data from redis cache txs --- backend/src/api/bitcoin/bitcoin-api.ts | 138 +++---------------------- backend/src/api/mempool.ts | 8 +- backend/src/api/redis-cache.ts | 39 ++++++- backend/src/api/transaction-utils.ts | 116 +++++++++++++++++++++ 4 files changed, 172 insertions(+), 129 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index a1cf767d9..132cda91a 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -5,6 +5,7 @@ import { IEsploraApi } from './esplora-api.interface'; import blocks from '../blocks'; import mempool from '../mempool'; import { TransactionExtended } from '../../mempool.interfaces'; +import transactionUtils from '../transaction-utils'; class BitcoinApi implements AbstractBitcoinApi { private rawMempoolCache: IBitcoinApi.RawMempool | null = null; @@ -63,9 +64,16 @@ class BitcoinApi implements AbstractBitcoinApi { return Promise.resolve([]); } - $getTransactionHex(txId: string): Promise { - return this.$getRawTransaction(txId, true) - .then((tx) => tx.hex || ''); + async $getTransactionHex(txId: string): Promise { + const txInMempool = mempool.getMempool()[txId]; + if (txInMempool && txInMempool.hex) { + return txInMempool.hex; + } + + return this.bitcoindClient.getRawTransaction(txId, true) + .then((transaction: IBitcoinApi.Transaction) => { + return transaction.hex; + }); } $getBlockHeightTip(): Promise { @@ -209,7 +217,7 @@ class BitcoinApi implements AbstractBitcoinApi { scriptpubkey: vout.scriptPubKey.hex, scriptpubkey_address: vout.scriptPubKey && vout.scriptPubKey.address ? vout.scriptPubKey.address : vout.scriptPubKey.addresses ? vout.scriptPubKey.addresses[0] : '', - scriptpubkey_asm: vout.scriptPubKey.asm ? this.convertScriptSigAsm(vout.scriptPubKey.hex) : '', + scriptpubkey_asm: vout.scriptPubKey.asm ? transactionUtils.convertScriptSigAsm(vout.scriptPubKey.hex) : '', scriptpubkey_type: this.translateScriptPubKeyType(vout.scriptPubKey.type), }; }); @@ -219,7 +227,7 @@ class BitcoinApi implements AbstractBitcoinApi { is_coinbase: !!vin.coinbase, prevout: null, scriptsig: vin.scriptSig && vin.scriptSig.hex || vin.coinbase || '', - scriptsig_asm: vin.scriptSig && this.convertScriptSigAsm(vin.scriptSig.hex) || '', + scriptsig_asm: vin.scriptSig && transactionUtils.convertScriptSigAsm(vin.scriptSig.hex) || '', sequence: vin.sequence, txid: vin.txid || '', vout: vin.vout || 0, @@ -291,7 +299,7 @@ class BitcoinApi implements AbstractBitcoinApi { } const innerTx = await this.$getRawTransaction(vin.txid, false, false); vin.prevout = innerTx.vout[vin.vout]; - this.addInnerScriptsToVin(vin); + transactionUtils.addInnerScriptsToVin(vin); } return transaction; } @@ -330,7 +338,7 @@ class BitcoinApi implements AbstractBitcoinApi { } const innerTx = await this.$getRawTransaction(transaction.vin[i].txid, false, false); transaction.vin[i].prevout = innerTx.vout[transaction.vin[i].vout]; - this.addInnerScriptsToVin(transaction.vin[i]); + transactionUtils.addInnerScriptsToVin(transaction.vin[i]); totalIn += innerTx.vout[transaction.vin[i].vout].value; } if (lazyPrevouts && transaction.vin.length > 12) { @@ -342,122 +350,6 @@ class BitcoinApi implements AbstractBitcoinApi { return transaction; } - private convertScriptSigAsm(hex: string): string { - const buf = Buffer.from(hex, 'hex'); - - const b: string[] = []; - - let i = 0; - while (i < buf.length) { - const op = buf[i]; - if (op >= 0x01 && op <= 0x4e) { - i++; - let push: number; - if (op === 0x4c) { - push = buf.readUInt8(i); - b.push('OP_PUSHDATA1'); - i += 1; - } else if (op === 0x4d) { - push = buf.readUInt16LE(i); - b.push('OP_PUSHDATA2'); - i += 2; - } else if (op === 0x4e) { - push = buf.readUInt32LE(i); - b.push('OP_PUSHDATA4'); - i += 4; - } else { - push = op; - b.push('OP_PUSHBYTES_' + push); - } - - const data = buf.slice(i, i + push); - if (data.length !== push) { - break; - } - - b.push(data.toString('hex')); - i += data.length; - } else { - if (op === 0x00) { - b.push('OP_0'); - } else if (op === 0x4f) { - b.push('OP_PUSHNUM_NEG1'); - } else if (op === 0xb1) { - b.push('OP_CLTV'); - } else if (op === 0xb2) { - b.push('OP_CSV'); - } else if (op === 0xba) { - b.push('OP_CHECKSIGADD'); - } else { - const opcode = bitcoinjs.script.toASM([ op ]); - if (opcode && op < 0xfd) { - if (/^OP_(\d+)$/.test(opcode)) { - b.push(opcode.replace(/^OP_(\d+)$/, 'OP_PUSHNUM_$1')); - } else { - b.push(opcode); - } - } else { - b.push('OP_RETURN_' + op); - } - } - i += 1; - } - } - - return b.join(' '); - } - - private addInnerScriptsToVin(vin: IEsploraApi.Vin): void { - if (!vin.prevout) { - return; - } - - if (vin.prevout.scriptpubkey_type === 'p2sh') { - const redeemScript = vin.scriptsig_asm.split(' ').reverse()[0]; - vin.inner_redeemscript_asm = this.convertScriptSigAsm(redeemScript); - if (vin.witness && vin.witness.length > 2) { - const witnessScript = vin.witness[vin.witness.length - 1]; - vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); - } - } - - if (vin.prevout.scriptpubkey_type === 'v0_p2wsh' && vin.witness) { - const witnessScript = vin.witness[vin.witness.length - 1]; - vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); - } - - if (vin.prevout.scriptpubkey_type === 'v1_p2tr' && vin.witness) { - const witnessScript = this.witnessToP2TRScript(vin.witness); - if (witnessScript !== null) { - vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); - } - } - } - - /** - * This function must only be called when we know the witness we are parsing - * is a taproot witness. - * @param witness An array of hex strings that represents the witness stack of - * the input. - * @returns null if the witness is not a script spend, and the hex string of - * the script item if it is a script spend. - */ - private witnessToP2TRScript(witness: string[]): string | null { - if (witness.length < 2) return null; - // Note: see BIP341 for parsing details of witness stack - - // If there are at least two witness elements, and the first byte of the - // last element is 0x50, this last element is called annex a and - // is removed from the witness stack. - const hasAnnex = witness[witness.length - 1].substring(0, 2) === '50'; - // If there are at least two witness elements left, script path spending is used. - // Call the second-to-last stack element s, the script. - // (Note: this phrasing from BIP341 assumes we've *removed* the annex from the stack) - if (hasAnnex && witness.length < 3) return null; - const positionOfScript = hasAnnex ? witness.length - 3 : witness.length - 2; - return witness[positionOfScript]; - } - } export default BitcoinApi; diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 73a6fdfeb..d5214de5d 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -149,8 +149,8 @@ class Mempool { logger.err('failed to fetch bulk mempool transactions from esplora'); } } - return newTransactions; logger.info(`Done inserting loaded mempool transactions into local cache`); + return newTransactions; } public async $updateMemPoolInfo() { @@ -219,7 +219,11 @@ class Mempool { logger.info(`Missing ${transactions.length - currentMempoolSize} mempool transactions, attempting to reload in bulk from esplora`); try { newTransactions = await this.$reloadMempool(transactions.length); - redisCache.$addTransactions(newTransactions); + if (config.REDIS.ENABLED) { + for (const tx of newTransactions) { + await redisCache.$addTransaction(tx); + } + } loaded = true; } catch (e) { logger.err('failed to load mempool in bulk from esplora, falling back to fetching individual transactions'); diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index 8f7d54606..540467caf 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -5,6 +5,7 @@ import logger from '../logger'; import config from '../config'; import { BlockExtended, BlockSummary, MempoolTransactionExtended } from '../mempool.interfaces'; import rbfCache from './rbf-cache'; +import transactionUtils from './transaction-utils'; enum NetworkDB { mainnet = 0, @@ -20,7 +21,7 @@ class RedisCache { private schemaVersion = 1; private cacheQueue: MempoolTransactionExtended[] = []; - private txFlushLimit: number = 1000; + private txFlushLimit: number = 10000; constructor() { if (config.REDIS.ENABLED) { @@ -81,7 +82,7 @@ class RedisCache { async $addTransaction(tx: MempoolTransactionExtended) { this.cacheQueue.push(tx); - if (this.cacheQueue.length > this.txFlushLimit) { + if (this.cacheQueue.length >= this.txFlushLimit) { await this.$flushTransactions(); } } @@ -89,15 +90,28 @@ class RedisCache { async $flushTransactions() { const success = await this.$addTransactions(this.cacheQueue); if (success) { + logger.info(`Flushed ${this.cacheQueue.length} transactions to Redis cache`); this.cacheQueue = []; + } else { + logger.err(`Failed to flush ${this.cacheQueue.length} transactions to Redis cache`); } } - async $addTransactions(newTransactions: MempoolTransactionExtended[]): Promise { + private async $addTransactions(newTransactions: MempoolTransactionExtended[]): Promise { try { await this.$ensureConnected(); await Promise.all(newTransactions.map(tx => { - return this.client.json.set(`mempool:${tx.txid.slice(0,1)}`, tx.txid, tx); + const minified: any = { ...tx }; + delete minified.hex; + for (const vin of minified.vin) { + delete vin.inner_redeemscript_asm; + delete vin.inner_witnessscript_asm; + delete vin.scriptsig_asm; + } + for (const vout of minified.vout) { + delete vout.scriptpubkey_asm; + } + return this.client.json.set(`mempool:${tx.txid.slice(0,1)}`, tx.txid, minified); })); return true; } catch (e) { @@ -201,6 +215,7 @@ class RedisCache { const loadedBlockSummaries = await this.$getBlockSummaries(); // Load mempool const loadedMempool = await this.$getMempool(); + this.inflateLoadedTxs(loadedMempool); // Load rbf data const rbfTxs = await this.$getRbfEntries('tx'); const rbfTrees = await this.$getRbfEntries('tree'); @@ -217,6 +232,22 @@ class RedisCache { }); } + private inflateLoadedTxs(mempool: { [txid: string]: MempoolTransactionExtended }) { + for (const tx of Object.values(mempool)) { + for (const vin of tx.vin) { + if (vin.scriptsig) { + vin.scriptsig_asm = transactionUtils.convertScriptSigAsm(vin.scriptsig); + transactionUtils.addInnerScriptsToVin(vin); + } + } + for (const vout of tx.vout) { + if (vout.scriptpubkey) { + vout.scriptpubkey_asm = transactionUtils.convertScriptSigAsm(vout.scriptpubkey); + } + } + } + } + } export default new RedisCache(); diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 009fe1dde..e141a6076 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -188,6 +188,122 @@ class TransactionUtils { 16 ); } + + public addInnerScriptsToVin(vin: IEsploraApi.Vin): void { + if (!vin.prevout) { + return; + } + + if (vin.prevout.scriptpubkey_type === 'p2sh') { + const redeemScript = vin.scriptsig_asm.split(' ').reverse()[0]; + vin.inner_redeemscript_asm = this.convertScriptSigAsm(redeemScript); + if (vin.witness && vin.witness.length > 2) { + const witnessScript = vin.witness[vin.witness.length - 1]; + vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); + } + } + + if (vin.prevout.scriptpubkey_type === 'v0_p2wsh' && vin.witness) { + const witnessScript = vin.witness[vin.witness.length - 1]; + vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); + } + + if (vin.prevout.scriptpubkey_type === 'v1_p2tr' && vin.witness) { + const witnessScript = this.witnessToP2TRScript(vin.witness); + if (witnessScript !== null) { + vin.inner_witnessscript_asm = this.convertScriptSigAsm(witnessScript); + } + } + } + + public convertScriptSigAsm(hex: string): string { + const buf = Buffer.from(hex, 'hex'); + + const b: string[] = []; + + let i = 0; + while (i < buf.length) { + const op = buf[i]; + if (op >= 0x01 && op <= 0x4e) { + i++; + let push: number; + if (op === 0x4c) { + push = buf.readUInt8(i); + b.push('OP_PUSHDATA1'); + i += 1; + } else if (op === 0x4d) { + push = buf.readUInt16LE(i); + b.push('OP_PUSHDATA2'); + i += 2; + } else if (op === 0x4e) { + push = buf.readUInt32LE(i); + b.push('OP_PUSHDATA4'); + i += 4; + } else { + push = op; + b.push('OP_PUSHBYTES_' + push); + } + + const data = buf.slice(i, i + push); + if (data.length !== push) { + break; + } + + b.push(data.toString('hex')); + i += data.length; + } else { + if (op === 0x00) { + b.push('OP_0'); + } else if (op === 0x4f) { + b.push('OP_PUSHNUM_NEG1'); + } else if (op === 0xb1) { + b.push('OP_CLTV'); + } else if (op === 0xb2) { + b.push('OP_CSV'); + } else if (op === 0xba) { + b.push('OP_CHECKSIGADD'); + } else { + const opcode = bitcoinjs.script.toASM([ op ]); + if (opcode && op < 0xfd) { + if (/^OP_(\d+)$/.test(opcode)) { + b.push(opcode.replace(/^OP_(\d+)$/, 'OP_PUSHNUM_$1')); + } else { + b.push(opcode); + } + } else { + b.push('OP_RETURN_' + op); + } + } + i += 1; + } + } + + return b.join(' '); + } + + /** + * This function must only be called when we know the witness we are parsing + * is a taproot witness. + * @param witness An array of hex strings that represents the witness stack of + * the input. + * @returns null if the witness is not a script spend, and the hex string of + * the script item if it is a script spend. + */ + public witnessToP2TRScript(witness: string[]): string | null { + if (witness.length < 2) return null; + // Note: see BIP341 for parsing details of witness stack + + // If there are at least two witness elements, and the first byte of the + // last element is 0x50, this last element is called annex a and + // is removed from the witness stack. + const hasAnnex = witness[witness.length - 1].substring(0, 2) === '50'; + // If there are at least two witness elements left, script path spending is used. + // Call the second-to-last stack element s, the script. + // (Note: this phrasing from BIP341 assumes we've *removed* the annex from the stack) + if (hasAnnex && witness.length < 3) return null; + const positionOfScript = hasAnnex ? witness.length - 3 : witness.length - 2; + return witness[positionOfScript]; + } } export default new TransactionUtils(); From c79a597c96a4048d5710ec545561ac87448263c7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 30 Jul 2023 16:01:03 +0900 Subject: [PATCH 718/782] switch from redis-json to simple key-value redis entries --- backend/src/api/disk-cache.ts | 3 ++ backend/src/api/rbf-cache.ts | 6 +-- backend/src/api/redis-cache.ts | 93 ++++++++++++++++++++-------------- 3 files changed, 62 insertions(+), 40 deletions(-) diff --git a/backend/src/api/disk-cache.ts b/backend/src/api/disk-cache.ts index 04328a72a..6f603489a 100644 --- a/backend/src/api/disk-cache.ts +++ b/backend/src/api/disk-cache.ts @@ -179,6 +179,7 @@ class DiskCache { return; } try { + const start = Date.now(); let data: any = {}; const cacheData = fs.readFileSync(DiskCache.FILE_NAME, 'utf8'); if (cacheData) { @@ -220,6 +221,8 @@ class DiskCache { } } + logger.info(`Loaded mempool from disk cache in ${Date.now() - start} ms`); + await memPool.$setMempool(data.mempool); if (!this.ignoreBlocksCache) { blocks.setBlocks(data.blocks); diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index b5ae74072..b5592252c 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -360,14 +360,14 @@ class RbfCache { public async load({ txs, trees, expiring }): Promise { txs.forEach(txEntry => { - this.txs.set(txEntry[0], txEntry[1]); + this.txs.set(txEntry.key, txEntry.value); }); for (const deflatedTree of trees) { await this.importTree(deflatedTree.root, deflatedTree.root, deflatedTree, this.txs); } expiring.forEach(expiringEntry => { - if (this.txs.has(expiringEntry[0])) { - this.expiring.set(expiringEntry[0], new Date(expiringEntry[1]).getTime()); + if (this.txs.has(expiringEntry.key)) { + this.expiring.set(expiringEntry.key, new Date(expiringEntry.value).getTime()); } }); this.cleanup(); diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index 540467caf..4a1375419 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -36,13 +36,6 @@ class RedisCache { logger.err(`Error in Redis client: ${e instanceof Error ? e.message : e}`); }); this.$ensureConnected(); - this.client.exists('mempool:0').then((mempoolExists) => { - if (!mempoolExists) { - for (let i = 0; i < 16; i++) { - this.client.json.set(`mempool:${i.toString(16)}`, '$', {}); - } - } - }); } } @@ -65,7 +58,7 @@ class RedisCache { async $updateBlocks(blocks: BlockExtended[]) { try { await this.$ensureConnected(); - await this.client.json.set('blocks', '$', blocks); + await this.client.set('blocks', JSON.stringify(blocks)); } catch (e) { logger.warn(`Failed to update blocks in Redis cache: ${e instanceof Error ? e.message : e}`); } @@ -74,7 +67,7 @@ class RedisCache { async $updateBlockSummaries(summaries: BlockSummary[]) { try { await this.$ensureConnected(); - await this.client.json.set('block-summaries', '$', summaries); + await this.client.set('block-summaries', JSON.stringify(summaries)); } catch (e) { logger.warn(`Failed to update blocks in Redis cache: ${e instanceof Error ? e.message : e}`); } @@ -98,9 +91,12 @@ class RedisCache { } private async $addTransactions(newTransactions: MempoolTransactionExtended[]): Promise { + if (!newTransactions.length) { + return true; + } try { await this.$ensureConnected(); - await Promise.all(newTransactions.map(tx => { + const msetData = newTransactions.map(tx => { const minified: any = { ...tx }; delete minified.hex; for (const vin of minified.vin) { @@ -111,8 +107,9 @@ class RedisCache { for (const vout of minified.vout) { delete vout.scriptpubkey_asm; } - return this.client.json.set(`mempool:${tx.txid.slice(0,1)}`, tx.txid, minified); - })); + return [`mempool:tx:${tx.txid}`, JSON.stringify(minified)]; + }); + await this.client.MSET(msetData); return true; } catch (e) { logger.warn(`Failed to add ${newTransactions.length} transactions to Redis cache: ${e instanceof Error ? e.message : e}`); @@ -123,9 +120,9 @@ class RedisCache { async $removeTransactions(transactions: string[]) { try { await this.$ensureConnected(); - await Promise.all(transactions.map(txid => { - return this.client.json.del(`mempool:${txid.slice(0,1)}`, txid); - })); + for (let i = 0; i < Math.ceil(transactions.length / 1000); i++) { + await this.client.del(transactions.slice(i * 1000, (i + 1) * 1000).map(txid => `mempool:tx:${txid}`)); + } } catch (e) { logger.warn(`Failed to remove ${transactions.length} transactions from Redis cache: ${e instanceof Error ? e.message : e}`); } @@ -134,7 +131,7 @@ class RedisCache { async $setRbfEntry(type: string, txid: string, value: any): Promise { try { await this.$ensureConnected(); - await this.client.json.set(`rbf:${type}:${txid}`, '$', value); + await this.client.set(`rbf:${type}:${txid}`, JSON.stringify(value)); } catch (e) { logger.warn(`Failed to set RBF ${type} in Redis cache: ${e instanceof Error ? e.message : e}`); } @@ -152,7 +149,8 @@ class RedisCache { async $getBlocks(): Promise { try { await this.$ensureConnected(); - return this.client.json.get('blocks'); + const json = await this.client.get('blocks'); + return JSON.parse(json); } catch (e) { logger.warn(`Failed to retrieve blocks from Redis cache: ${e instanceof Error ? e.message : e}`); return []; @@ -162,7 +160,8 @@ class RedisCache { async $getBlockSummaries(): Promise { try { await this.$ensureConnected(); - return this.client.json.get('block-summaries'); + const json = await this.client.get('block-summaries'); + return JSON.parse(json); } catch (e) { logger.warn(`Failed to retrieve blocks from Redis cache: ${e instanceof Error ? e.message : e}`); return []; @@ -171,16 +170,14 @@ class RedisCache { async $getMempool(): Promise<{ [txid: string]: MempoolTransactionExtended }> { const start = Date.now(); - let mempool = {}; + const mempool = {}; try { await this.$ensureConnected(); - for (let i = 0; i < 16; i++) { - const shard = await this.client.json.get(`mempool:${i.toString(16)}`); - logger.info(`Loaded ${Object.keys(shard).length} transactions from redis cache ${i.toString(16)}`); - mempool = Object.assign(mempool, shard); + const mempoolList = await this.scanKeys('mempool:tx:*'); + for (const tx of mempoolList) { + mempool[tx.key] = tx.value; } - logger.info(`Total ${Object.keys(mempool).length} transactions loaded from redis cache `); - logger.info(`Loaded redis cache in ${Date.now() - start} ms`); + logger.info(`Loaded mempool from Redis cache in ${Date.now() - start} ms`); return mempool || {}; } catch (e) { logger.warn(`Failed to retrieve mempool from Redis cache: ${e instanceof Error ? e.message : e}`); @@ -191,17 +188,8 @@ class RedisCache { async $getRbfEntries(type: string): Promise { try { await this.$ensureConnected(); - const keys = await this.client.keys(`rbf:${type}:*`); - const promises: Promise[] = []; - for (let i = 0; i < keys.length; i += 10000) { - const keySlice = keys.slice(i, i + 10000); - if (!keySlice.length) { - continue; - } - promises.push(this.client.json.mGet(keySlice, '$').then(chunk => chunk?.length ? chunk.flat().map((v, i) => [keySlice[i].slice(`rbf:${type}:`.length), v]) : [] )); - } - const entries = await Promise.all(promises); - return entries.flat(); + const rbfEntries = await this.scanKeys(`rbf:${type}:*`); + return rbfEntries; } catch (e) { logger.warn(`Failed to retrieve Rbf ${type}s from Redis cache: ${e instanceof Error ? e.message : e}`); return []; @@ -227,7 +215,7 @@ class RedisCache { await memPool.$setMempool(loadedMempool); await rbfCache.load({ txs: rbfTxs, - trees: rbfTrees.map(loadedTree => loadedTree[1]), + trees: rbfTrees.map(loadedTree => loadedTree.value), expiring: rbfExpirations, }); } @@ -248,6 +236,37 @@ class RedisCache { } } + private async scanKeys(pattern): Promise<{ key: string, value: T }[]> { + logger.info(`loading Redis entries for ${pattern}`); + let keys: string[] = []; + const result: { key: string, value: T }[] = []; + const patternLength = pattern.length - 1; + let count = 0; + const processValues = async (keys): Promise => { + const values = await this.client.MGET(keys); + for (let i = 0; i < values.length; i++) { + if (values[i]) { + result.push({ key: keys[i].slice(patternLength), value: JSON.parse(values[i]) }); + count++; + } + } + logger.info(`loaded ${count} entries from Redis cache`); + }; + for await (const key of this.client.scanIterator({ + MATCH: pattern, + COUNT: 100 + })) { + keys.push(key); + if (keys.length >= 10000) { + await processValues(keys); + keys = []; + } + } + if (keys.length) { + await processValues(keys); + } + return result; + } } export default new RedisCache(); From dcfab218fbee5affecb4ffedb2b9827dada6232c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 31 Jul 2023 12:19:28 +0900 Subject: [PATCH 719/782] Improve Redis logging --- backend/src/api/redis-cache.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index 4a1375419..0c256a698 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -59,6 +59,7 @@ class RedisCache { try { await this.$ensureConnected(); await this.client.set('blocks', JSON.stringify(blocks)); + logger.debug(`Saved latest blocks to Redis cache`); } catch (e) { logger.warn(`Failed to update blocks in Redis cache: ${e instanceof Error ? e.message : e}`); } @@ -68,8 +69,9 @@ class RedisCache { try { await this.$ensureConnected(); await this.client.set('block-summaries', JSON.stringify(summaries)); + logger.debug(`Saved latest block summaries to Redis cache`); } catch (e) { - logger.warn(`Failed to update blocks in Redis cache: ${e instanceof Error ? e.message : e}`); + logger.warn(`Failed to update block summaries in Redis cache: ${e instanceof Error ? e.message : e}`); } } @@ -83,10 +85,10 @@ class RedisCache { async $flushTransactions() { const success = await this.$addTransactions(this.cacheQueue); if (success) { - logger.info(`Flushed ${this.cacheQueue.length} transactions to Redis cache`); + logger.debug(`Saved ${this.cacheQueue.length} transactions to Redis cache`); this.cacheQueue = []; } else { - logger.err(`Failed to flush ${this.cacheQueue.length} transactions to Redis cache`); + logger.err(`Failed to save ${this.cacheQueue.length} transactions to Redis cache`); } } @@ -122,6 +124,7 @@ class RedisCache { await this.$ensureConnected(); for (let i = 0; i < Math.ceil(transactions.length / 1000); i++) { await this.client.del(transactions.slice(i * 1000, (i + 1) * 1000).map(txid => `mempool:tx:${txid}`)); + logger.info(`Deleted ${transactions.length} transactions from the Redis cache`); } } catch (e) { logger.warn(`Failed to remove ${transactions.length} transactions from Redis cache: ${e instanceof Error ? e.message : e}`); From 73b71c491411e3ab2a09019e1418ac88e0b294d9 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 31 Jul 2023 14:28:56 +0900 Subject: [PATCH 720/782] Fixing docker config and tests --- backend/mempool-config.sample.json | 1 + docker/backend/mempool-config.json | 5 +++++ docker/backend/start.sh | 9 +++++++++ 3 files changed, 15 insertions(+) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index e3df7d2fe..7948049fc 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -8,6 +8,7 @@ "API_URL_PREFIX": "/api/v1/", "POLL_RATE_MS": 2000, "CACHE_DIR": "./cache", + "CACHE_ENABLED": true, "CLEAR_PROTECTION_MINUTES": 20, "RECOMMENDED_FEE_PERCENTILE": 50, "BLOCK_WEIGHT_UNITS": 4000000, diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 2ff76d5dd..8b47d53b8 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -8,6 +8,7 @@ "API_URL_PREFIX": "__MEMPOOL_API_URL_PREFIX__", "POLL_RATE_MS": __MEMPOOL_POLL_RATE_MS__, "CACHE_DIR": "__MEMPOOL_CACHE_DIR__", + "CACHE_ENABLED": __MEMPOOL_CACHE_ENABLED__, "CLEAR_PROTECTION_MINUTES": __MEMPOOL_CLEAR_PROTECTION_MINUTES__, "RECOMMENDED_FEE_PERCENTILE": __MEMPOOL_RECOMMENDED_FEE_PERCENTILE__, "BLOCK_WEIGHT_UNITS": __MEMPOOL_BLOCK_WEIGHT_UNITS__, @@ -133,5 +134,9 @@ "AUDIT": __REPLICATION_AUDIT__, "AUDIT_START_HEIGHT": __REPLICATION_AUDIT_START_HEIGHT__, "SERVERS": __REPLICATION_SERVERS__ + }, + "REDIS": { + "ENABLED": __REDIS_ENABLED__, + "UNIX_SOCKET_PATH": "__REDIS_UNIX_SOCKET_PATH__" } } diff --git a/docker/backend/start.sh b/docker/backend/start.sh index c34d804b4..7071493fa 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -9,6 +9,7 @@ __MEMPOOL_SPAWN_CLUSTER_PROCS__=${MEMPOOL_SPAWN_CLUSTER_PROCS:=0} __MEMPOOL_API_URL_PREFIX__=${MEMPOOL_API_URL_PREFIX:=/api/v1/} __MEMPOOL_POLL_RATE_MS__=${MEMPOOL_POLL_RATE_MS:=2000} __MEMPOOL_CACHE_DIR__=${MEMPOOL_CACHE_DIR:=./cache} +__MEMPOOL_CACHE_ENABLED__=${MEMPOOL_CACHE_ENABLED:=true} __MEMPOOL_CLEAR_PROTECTION_MINUTES__=${MEMPOOL_CLEAR_PROTECTION_MINUTES:=20} __MEMPOOL_RECOMMENDED_FEE_PERCENTILE__=${MEMPOOL_RECOMMENDED_FEE_PERCENTILE:=50} __MEMPOOL_BLOCK_WEIGHT_UNITS__=${MEMPOOL_BLOCK_WEIGHT_UNITS:=4000000} @@ -136,6 +137,9 @@ __REPLICATION_AUDIT__=${REPLICATION_AUDIT:=true} __REPLICATION_AUDIT_START_HEIGHT__=${REPLICATION_AUDIT_START_HEIGHT:=774000} __REPLICATION_SERVERS__=${REPLICATION_SERVERS:=[]} +# REDIS +__REDIS_ENABLED__=${REDIS_ENABLED:=true} +__REDIS_UNIX_SOCKET_PATH__=${REDIS_UNIX_SOCKET_PATH:=true} mkdir -p "${__MEMPOOL_CACHE_DIR__}" @@ -147,6 +151,7 @@ sed -i "s!__MEMPOOL_SPAWN_CLUSTER_PROCS__!${__MEMPOOL_SPAWN_CLUSTER_PROCS__}!g" sed -i "s!__MEMPOOL_API_URL_PREFIX__!${__MEMPOOL_API_URL_PREFIX__}!g" mempool-config.json sed -i "s!__MEMPOOL_POLL_RATE_MS__!${__MEMPOOL_POLL_RATE_MS__}!g" mempool-config.json sed -i "s!__MEMPOOL_CACHE_DIR__!${__MEMPOOL_CACHE_DIR__}!g" mempool-config.json +sed -i "s!__MEMPOOL_CACHE_ENABLED__!${__MEMPOOL_CACHE_ENABLED__}!g" mempool-config.json sed -i "s!__MEMPOOL_CLEAR_PROTECTION_MINUTES__!${__MEMPOOL_CLEAR_PROTECTION_MINUTES__}!g" mempool-config.json sed -i "s!__MEMPOOL_RECOMMENDED_FEE_PERCENTILE__!${__MEMPOOL_RECOMMENDED_FEE_PERCENTILE__}!g" mempool-config.json sed -i "s!__MEMPOOL_BLOCK_WEIGHT_UNITS__!${__MEMPOOL_BLOCK_WEIGHT_UNITS__}!g" mempool-config.json @@ -262,4 +267,8 @@ sed -i "s!__REPLICATION_AUDIT__!${__REPLICATION_AUDIT__}!g" mempool-config.json sed -i "s!__REPLICATION_AUDIT_START_HEIGHT__!${__REPLICATION_AUDIT_START_HEIGHT__}!g" mempool-config.json sed -i "s!__REPLICATION_SERVERS__!${__REPLICATION_SERVERS__}!g" mempool-config.json +# REDIS +sed -i "s!__REDIS_ENABLED__!${__REDIS_ENABLED__}!g" mempool-config.json +sed -i "s!__REDIS_UNIX_SOCKET_PATH__!${__REDIS_UNIX_SOCKET_PATH__}!g" mempool-config.json + node /backend/package/index.js From 363fc1b00bd336618008bfc9fa62cc5a6594f3a2 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 31 Jul 2023 15:03:54 +0900 Subject: [PATCH 721/782] Get blocks from electrs again --- backend/src/api/bitcoin/bitcoin.routes.ts | 4 ++-- backend/src/api/blocks.ts | 12 ++++++------ backend/src/api/mempool.ts | 2 +- backend/src/api/mining/mining.ts | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index ffdb2e629..b24c83932 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -6,7 +6,7 @@ import websocketHandler from '../websocket-handler'; import mempool from '../mempool'; import feeApi from '../fee-api'; import mempoolBlocks from '../mempool-blocks'; -import bitcoinApi, { bitcoinCoreApi } from './bitcoin-api-factory'; +import bitcoinApi from './bitcoin-api-factory'; import { Common } from '../common'; import backendInfo from '../backend-info'; import transactionUtils from '../transaction-utils'; @@ -483,7 +483,7 @@ class BitcoinRoutes { returnBlocks.push(localBlock); nextHash = localBlock.previousblockhash; } else { - const block = await bitcoinCoreApi.$getBlock(nextHash); + const block = await bitcoinApi.$getBlock(nextHash); returnBlocks.push(block); nextHash = block.previousblockhash; } diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index f86bc53e9..88f85ba6e 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -599,7 +599,7 @@ class Blocks { loadingIndicators.setProgress('block-indexing', progress, false); } const blockHash = await bitcoinApi.$getBlockHash(blockHeight); - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(blockHash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(blockHash); const transactions = await this.$getTransactionsExtended(blockHash, block.height, true, null, true); const blockExtended = await this.$getBlockExtended(block, transactions); @@ -656,7 +656,7 @@ class Blocks { const heightDiff = blockHeightTip % 2016; const blockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff); this.updateTimerProgress(timer, 'got block hash for initial difficulty adjustment'); - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(blockHash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(blockHash); this.updateTimerProgress(timer, 'got block for initial difficulty adjustment'); this.lastDifficultyAdjustmentTime = block.timestamp; this.currentDifficulty = block.difficulty; @@ -664,7 +664,7 @@ class Blocks { if (blockHeightTip >= 2016) { const previousPeriodBlockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff - 2016); this.updateTimerProgress(timer, 'got previous block hash for initial difficulty adjustment'); - const previousPeriodBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(previousPeriodBlockHash); + const previousPeriodBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(previousPeriodBlockHash); this.updateTimerProgress(timer, 'got previous block for initial difficulty adjustment'); this.previousDifficultyRetarget = (block.difficulty - previousPeriodBlock.difficulty) / previousPeriodBlock.difficulty * 100; logger.debug(`Initial difficulty adjustment data set.`); @@ -862,7 +862,7 @@ class Blocks { } const blockHash = await bitcoinApi.$getBlockHash(height); - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(blockHash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(blockHash); const transactions = await this.$getTransactionsExtended(blockHash, block.height, true); const blockExtended = await this.$getBlockExtended(block, transactions); @@ -874,7 +874,7 @@ class Blocks { } public async $indexStaleBlock(hash: string): Promise { - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(hash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(hash); const transactions = await this.$getTransactionsExtended(hash, block.height, true); const blockExtended = await this.$getBlockExtended(block, transactions); @@ -899,7 +899,7 @@ class Blocks { } // Bitcoin network, add our custom data on top - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(hash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(hash); if (block.stale) { return await this.$indexStaleBlock(hash); } else { diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index d5214de5d..b9b648012 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -1,5 +1,5 @@ import config from '../config'; -import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; +import bitcoinApi from './bitcoin/bitcoin-api-factory'; import { MempoolTransactionExtended, TransactionExtended, VbytesPerSecond } from '../mempool.interfaces'; import logger from '../logger'; import { Common } from './common'; diff --git a/backend/src/api/mining/mining.ts b/backend/src/api/mining/mining.ts index e190492b8..beda0bc48 100644 --- a/backend/src/api/mining/mining.ts +++ b/backend/src/api/mining/mining.ts @@ -11,7 +11,7 @@ import DifficultyAdjustmentsRepository from '../../repositories/DifficultyAdjust import config from '../../config'; import BlocksAuditsRepository from '../../repositories/BlocksAuditsRepository'; import PricesRepository from '../../repositories/PricesRepository'; -import { bitcoinCoreApi } from '../bitcoin/bitcoin-api-factory'; +import bitcoinApi from '../bitcoin/bitcoin-api-factory'; import { IEsploraApi } from '../bitcoin/esplora-api.interface'; import database from '../../database'; @@ -201,7 +201,7 @@ class Mining { try { const oldestConsecutiveBlockTimestamp = 1000 * (await BlocksRepository.$getOldestConsecutiveBlock()).timestamp; - const genesisBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(await bitcoinClient.getBlockHash(0)); + const genesisBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(await bitcoinApi.$getBlockHash(0)); const genesisTimestamp = genesisBlock.timestamp * 1000; const indexedTimestamp = await HashratesRepository.$getWeeklyHashrateTimestamps(); @@ -312,7 +312,7 @@ class Mining { const oldestConsecutiveBlockTimestamp = 1000 * (await BlocksRepository.$getOldestConsecutiveBlock()).timestamp; try { - const genesisBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(await bitcoinClient.getBlockHash(0)); + const genesisBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(await bitcoinApi.$getBlockHash(0)); const genesisTimestamp = genesisBlock.timestamp * 1000; const indexedTimestamp = (await HashratesRepository.$getRawNetworkDailyHashrate(null)).map(hashrate => hashrate.timestamp); const lastMidnight = this.getDateMidnight(new Date()); @@ -421,7 +421,7 @@ class Mining { } const blocks: any = await BlocksRepository.$getBlocksDifficulty(); - const genesisBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(await bitcoinClient.getBlockHash(0)); + const genesisBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(await bitcoinApi.$getBlockHash(0)); let currentDifficulty = genesisBlock.difficulty; let totalIndexed = 0; From 49db63d88803e7516399dc44edc7a252826c87fe Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 31 Jul 2023 16:19:51 +0900 Subject: [PATCH 722/782] Faster Redis tx deletion, fix debug log level --- backend/src/api/redis-cache.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/src/api/redis-cache.ts b/backend/src/api/redis-cache.ts index 0c256a698..fcde8013a 100644 --- a/backend/src/api/redis-cache.ts +++ b/backend/src/api/redis-cache.ts @@ -122,9 +122,10 @@ class RedisCache { async $removeTransactions(transactions: string[]) { try { await this.$ensureConnected(); - for (let i = 0; i < Math.ceil(transactions.length / 1000); i++) { - await this.client.del(transactions.slice(i * 1000, (i + 1) * 1000).map(txid => `mempool:tx:${txid}`)); - logger.info(`Deleted ${transactions.length} transactions from the Redis cache`); + for (let i = 0; i < Math.ceil(transactions.length / 10000); i++) { + const slice = transactions.slice(i * 10000, (i + 1) * 10000); + await this.client.unlink(slice.map(txid => `mempool:tx:${txid}`)); + logger.debug(`Deleted ${slice.length} transactions from the Redis cache`); } } catch (e) { logger.warn(`Failed to remove ${transactions.length} transactions from Redis cache: ${e instanceof Error ? e.message : e}`); @@ -143,7 +144,7 @@ class RedisCache { async $removeRbfEntry(type: string, txid: string): Promise { try { await this.$ensureConnected(); - await this.client.del(`rbf:${type}:${txid}`); + await this.client.unlink(`rbf:${type}:${txid}`); } catch (e) { logger.warn(`Failed to remove RBF ${type} from Redis cache: ${e instanceof Error ? e.message : e}`); } From bafc0bd9cfb579ae0e2d428164dc4c8ebb408039 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 31 Jul 2023 16:03:18 +0900 Subject: [PATCH 723/782] fix indexing log prints --- backend/src/api/blocks.ts | 42 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 88f85ba6e..2e792bdba 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -419,8 +419,8 @@ class Blocks { let newlyIndexed = 0; let totalIndexed = indexedBlockSummariesHashesArray.length; let indexedThisRun = 0; - let timer = new Date().getTime() / 1000; - const startedAt = new Date().getTime() / 1000; + let timer = Date.now() / 1000; + const startedAt = Date.now() / 1000; for (const block of indexedBlocks) { if (indexedBlockSummariesHashes[block.hash] === true) { @@ -428,13 +428,13 @@ class Blocks { } // Logging - const elapsedSeconds = Math.max(1, Math.round((new Date().getTime() / 1000) - timer)); + const elapsedSeconds = (Date.now() / 1000) - timer; if (elapsedSeconds > 5) { - const runningFor = Math.max(1, Math.round((new Date().getTime() / 1000) - startedAt)); - const blockPerSeconds = Math.max(1, indexedThisRun / elapsedSeconds); + const runningFor = (Date.now() / 1000) - startedAt; + const blockPerSeconds = indexedThisRun / elapsedSeconds; const progress = Math.round(totalIndexed / indexedBlocks.length * 10000) / 100; - logger.debug(`Indexing block summary for #${block.height} | ~${blockPerSeconds.toFixed(2)} blocks/sec | total: ${totalIndexed}/${indexedBlocks.length} (${progress}%) | elapsed: ${runningFor} seconds`, logger.tags.mining); - timer = new Date().getTime() / 1000; + logger.debug(`Indexing block summary for #${block.height} | ~${blockPerSeconds.toFixed(2)} blocks/sec | total: ${totalIndexed}/${indexedBlocks.length} (${progress}%) | elapsed: ${runningFor.toFixed(2)} seconds`, logger.tags.mining); + timer = Date.now() / 1000; indexedThisRun = 0; } @@ -477,18 +477,18 @@ class Blocks { // Logging let count = 0; let countThisRun = 0; - let timer = new Date().getTime() / 1000; - const startedAt = new Date().getTime() / 1000; + let timer = Date.now() / 1000; + const startedAt = Date.now() / 1000; for (const height of unindexedBlockHeights) { // Logging const hash = await bitcoinApi.$getBlockHash(height); - const elapsedSeconds = Math.max(1, new Date().getTime() / 1000 - timer); + const elapsedSeconds = (Date.now() / 1000) - timer; if (elapsedSeconds > 5) { - const runningFor = Math.max(1, Math.round((new Date().getTime() / 1000) - startedAt)); - const blockPerSeconds = (countThisRun / elapsedSeconds); + const runningFor = (Date.now() / 1000) - startedAt; + const blockPerSeconds = countThisRun / elapsedSeconds; const progress = Math.round(count / unindexedBlockHeights.length * 10000) / 100; - logger.debug(`Indexing cpfp clusters for #${height} | ~${blockPerSeconds.toFixed(2)} blocks/sec | total: ${count}/${unindexedBlockHeights.length} (${progress}%) | elapsed: ${runningFor} seconds`); - timer = new Date().getTime() / 1000; + logger.debug(`Indexing cpfp clusters for #${height} | ~${blockPerSeconds.toFixed(2)} blocks/sec | total: ${count}/${unindexedBlockHeights.length} (${progress}%) | elapsed: ${runningFor.toFixed(2)} seconds`); + timer = Date.now() / 1000; countThisRun = 0; } @@ -567,8 +567,8 @@ class Blocks { let totalIndexed = await blocksRepository.$blockCountBetweenHeight(currentBlockHeight, lastBlockToIndex); let indexedThisRun = 0; let newlyIndexed = 0; - const startedAt = new Date().getTime() / 1000; - let timer = new Date().getTime() / 1000; + const startedAt = Date.now() / 1000; + let timer = Date.now() / 1000; while (currentBlockHeight >= lastBlockToIndex) { const endBlock = Math.max(0, lastBlockToIndex, currentBlockHeight - chunkSize + 1); @@ -588,13 +588,13 @@ class Blocks { } ++indexedThisRun; ++totalIndexed; - const elapsedSeconds = Math.max(1, new Date().getTime() / 1000 - timer); + const elapsedSeconds = (Date.now() / 1000) - timer; if (elapsedSeconds > 5 || blockHeight === lastBlockToIndex) { - const runningFor = Math.max(1, Math.round((new Date().getTime() / 1000) - startedAt)); - const blockPerSeconds = Math.max(1, indexedThisRun / elapsedSeconds); + const runningFor = (Date.now() / 1000) - startedAt; + const blockPerSeconds = indexedThisRun / elapsedSeconds; const progress = Math.round(totalIndexed / indexingBlockAmount * 10000) / 100; - logger.debug(`Indexing block #${blockHeight} | ~${blockPerSeconds.toFixed(2)} blocks/sec | total: ${totalIndexed}/${indexingBlockAmount} (${progress}%) | elapsed: ${runningFor} seconds`, logger.tags.mining); - timer = new Date().getTime() / 1000; + logger.debug(`Indexing block #${blockHeight} | ~${blockPerSeconds.toFixed(2)} blocks/sec | total: ${totalIndexed}/${indexingBlockAmount} (${progress.toFixed(2)}%) | elapsed: ${runningFor.toFixed(2)} seconds`, logger.tags.mining); + timer = Date.now() / 1000; indexedThisRun = 0; loadingIndicators.setProgress('block-indexing', progress, false); } From 6b7d8d95f7beab28d8f5b6457c431bfbcc791517 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 31 Jul 2023 16:41:36 +0900 Subject: [PATCH 724/782] reduce mempool poll rate while indexing --- backend/src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index 51d407f6f..222537d0b 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -195,7 +195,8 @@ class Server { // rerun immediately if we skipped the mempool update, otherwise wait POLL_RATE_MS const elapsed = Date.now() - start; - const remainingTime = Math.max(0, config.MEMPOOL.POLL_RATE_MS - elapsed) + const pollRate = config.MEMPOOL.POLL_RATE_MS * (indexer.indexerRunning ? 10 : 1); + const remainingTime = Math.max(0, pollRate - elapsed); setTimeout(this.runMainUpdateLoop.bind(this), numHandledBlocks > 0 ? 0 : remainingTime); this.backendRetryCount = 0; } catch (e: any) { From 0d25ef0b5b8a05a83fde361addaae6c2ad41110f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 31 Jul 2023 18:02:18 +0900 Subject: [PATCH 725/782] Get block txs from esplora, index CPFP together with summaries --- backend/src/api/blocks.ts | 59 +++++++++++++++----- backend/src/repositories/BlocksRepository.ts | 15 ++++- 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 2e792bdba..20c015f44 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -438,7 +438,14 @@ class Blocks { indexedThisRun = 0; } - await this.$getStrippedBlockTransactions(block.hash, true, true); // This will index the block summary + + if (config.MEMPOOL.BACKEND === 'esplora') { + const txs = (await bitcoinApi.$getTxsForBlock(block.hash)).map(tx => transactionUtils.extendTransaction(tx)); + const cpfpSummary = await this.$indexCPFP(block.hash, block.height, txs); + await this.$getStrippedBlockTransactions(block.hash, true, true, cpfpSummary, block.height); // This will index the block summary + } else { + await this.$getStrippedBlockTransactions(block.hash, true, true); // This will index the block summary + } // Logging indexedThisRun++; @@ -942,10 +949,15 @@ class Blocks { }), }; } else { - // Call Core RPC - const block = await bitcoinClient.getBlock(hash, 2); - summary = this.summarizeBlock(block); - height = block.height; + if (config.MEMPOOL.BACKEND === 'esplora') { + const txs = (await bitcoinApi.$getTxsForBlock(hash)).map(tx => transactionUtils.extendTransaction(tx)); + summary = this.summarizeBlockTransactions(hash, txs); + } else { + // Call Core RPC + const block = await bitcoinClient.getBlock(hash, 2); + summary = this.summarizeBlock(block); + height = block.height; + } } if (height == null) { const block = await bitcoinApi.$getBlock(hash); @@ -1068,8 +1080,17 @@ class Blocks { if (Common.blocksSummariesIndexingEnabled() && cleanBlock.fee_amt_percentiles === null) { cleanBlock.fee_amt_percentiles = await BlocksSummariesRepository.$getFeePercentilesByBlockId(cleanBlock.hash); if (cleanBlock.fee_amt_percentiles === null) { - const block = await bitcoinClient.getBlock(cleanBlock.hash, 2); - const summary = this.summarizeBlock(block); + + let summary; + if (config.MEMPOOL.BACKEND === 'esplora') { + const txs = (await bitcoinApi.$getTxsForBlock(cleanBlock.hash)).map(tx => transactionUtils.extendTransaction(tx)); + summary = this.summarizeBlockTransactions(cleanBlock.hash, txs); + } else { + // Call Core RPC + const block = await bitcoinClient.getBlock(cleanBlock.hash, 2); + summary = this.summarizeBlock(block); + } + await BlocksSummariesRepository.$saveTransactions(cleanBlock.height, cleanBlock.hash, summary.transactions); cleanBlock.fee_amt_percentiles = await BlocksSummariesRepository.$getFeePercentilesByBlockId(cleanBlock.hash); } @@ -1129,19 +1150,29 @@ class Blocks { return this.currentBlockHeight; } - public async $indexCPFP(hash: string, height: number): Promise { - const block = await bitcoinClient.getBlock(hash, 2); - const transactions = block.tx.map(tx => { - tx.fee *= 100_000_000; - return tx; - }); + public async $indexCPFP(hash: string, height: number, txs?: TransactionExtended[]): Promise { + let transactions = txs; + if (!transactions) { + if (config.MEMPOOL.BACKEND === 'esplora') { + transactions = (await bitcoinApi.$getTxsForBlock(hash)).map(tx => transactionUtils.extendTransaction(tx)); + } + if (!transactions) { + const block = await bitcoinClient.getBlock(hash, 2); + transactions = block.tx.map(tx => { + tx.fee *= 100_000_000; + return tx; + }); + } + } - const summary = Common.calculateCpfp(height, transactions); + const summary = Common.calculateCpfp(height, transactions as TransactionExtended[]); await this.$saveCpfp(hash, height, summary); const effectiveFeeStats = Common.calcEffectiveFeeStatistics(summary.transactions); await blocksRepository.$saveEffectiveFeeStats(hash, effectiveFeeStats); + + return summary; } public async $saveCpfp(hash: string, height: number, cpfpSummary: CpfpSummary): Promise { diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 078b85a03..5f20f5abd 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -1,3 +1,4 @@ +import bitcoinApi from '../api/bitcoin/bitcoin-api-factory'; import { BlockExtended, BlockExtension, BlockPrice, EffectiveFeeStats } from '../mempool.interfaces'; import DB from '../database'; import logger from '../logger'; @@ -12,6 +13,7 @@ import config from '../config'; import chainTips from '../api/chain-tips'; import blocks from '../api/blocks'; import BlocksAuditsRepository from './BlocksAuditsRepository'; +import transactionUtils from '../api/transaction-utils'; interface DatabaseBlock { id: string; @@ -1036,8 +1038,17 @@ class BlocksRepository { { extras.feePercentiles = await BlocksSummariesRepository.$getFeePercentilesByBlockId(dbBlk.id); if (extras.feePercentiles === null) { - const block = await bitcoinClient.getBlock(dbBlk.id, 2); - const summary = blocks.summarizeBlock(block); + + let summary; + if (config.MEMPOOL.BACKEND === 'esplora') { + const txs = (await bitcoinApi.$getTxsForBlock(dbBlk.id)).map(tx => transactionUtils.extendTransaction(tx)); + summary = blocks.summarizeBlockTransactions(dbBlk.id, txs); + } else { + // Call Core RPC + const block = await bitcoinClient.getBlock(dbBlk.id, 2); + summary = blocks.summarizeBlock(block); + } + await BlocksSummariesRepository.$saveTransactions(dbBlk.height, dbBlk.id, summary.transactions); extras.feePercentiles = await BlocksSummariesRepository.$getFeePercentilesByBlockId(dbBlk.id); } From bed7c1b283944883c8467c068590b8f46aebd309 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 31 Jul 2023 18:29:40 +0900 Subject: [PATCH 726/782] Fix scripthash lookup for Electrum* --- backend/src/api/bitcoin/bitcoin.routes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index ffdb2e629..d2a77c995 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -576,7 +576,7 @@ class BitcoinRoutes { } try { - const addressData = await bitcoinApi.$getScriptHash(req.params.address); + const addressData = await bitcoinApi.$getScriptHash(req.params.scripthash); res.json(addressData); } catch (e) { if (e instanceof Error && e.message && (e.message.indexOf('too long') > 0 || e.message.indexOf('confirmed status') > 0)) { @@ -597,7 +597,7 @@ class BitcoinRoutes { if (req.query.after_txid && typeof req.query.after_txid === 'string') { lastTxId = req.query.after_txid; } - const transactions = await bitcoinApi.$getScriptHashTransactions(req.params.address, lastTxId); + const transactions = await bitcoinApi.$getScriptHashTransactions(req.params.scripthash, lastTxId); res.json(transactions); } catch (e) { if (e instanceof Error && e.message && (e.message.indexOf('too long') > 0 || e.message.indexOf('confirmed status') > 0)) { From 17f1cb8648db406a3887647b4d8be73e9951b1f8 Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Mon, 31 Jul 2023 14:10:49 -0700 Subject: [PATCH 727/782] Fix config unit test that was returning early --- backend/src/__tests__/config.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index 0c06b03e1..edfcc7f47 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -181,12 +181,12 @@ describe('Mempool Backend Config', () => { // We have a few cases where we can't follow the pattern if (root === 'MEMPOOL' && key === 'HTTP_PORT') { console.log('skipping check for MEMPOOL_HTTP_PORT'); - return; + continue; } switch (typeof value) { case 'object': { if (Array.isArray(value)) { - return; + continue; } else { parseJson(value, key); } From b7b6548cce486bace954820b6baa273a92fa52b7 Mon Sep 17 00:00:00 2001 From: Felipe Knorr Kuhn Date: Mon, 31 Jul 2023 14:11:31 -0700 Subject: [PATCH 728/782] Fix RUST GBT Docker override --- docker/backend/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/backend/start.sh b/docker/backend/start.sh index 7071493fa..e05c73710 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -170,7 +170,7 @@ sed -i "s!__MEMPOOL_POOLS_JSON_URL__!${__MEMPOOL_POOLS_JSON_URL__}!g" mempool-co sed -i "s!__MEMPOOL_POOLS_JSON_TREE_URL__!${__MEMPOOL_POOLS_JSON_TREE_URL__}!g" mempool-config.json sed -i "s!__MEMPOOL_AUDIT__!${__MEMPOOL_AUDIT__}!g" mempool-config.json sed -i "s!__MEMPOOL_ADVANCED_GBT_MEMPOOL__!${__MEMPOOL_ADVANCED_GBT_MEMPOOL__}!g" mempool-config.json -sed -i "s!__MEMPOOL_RUST_GBT__!${__MEMPOOL_GBT__}!g" mempool-config.json +sed -i "s!__MEMPOOL_RUST_GBT__!${__MEMPOOL_RUST_GBT__}!g" mempool-config.json sed -i "s!__MEMPOOL_ADVANCED_GBT_AUDIT__!${__MEMPOOL_ADVANCED_GBT_AUDIT__}!g" mempool-config.json sed -i "s!__MEMPOOL_CPFP_INDEXING__!${__MEMPOOL_CPFP_INDEXING__}!g" mempool-config.json sed -i "s!__MEMPOOL_MAX_BLOCKS_BULK_QUERY__!${__MEMPOOL_MAX_BLOCKS_BULK_QUERY__}!g" mempool-config.json From aa17f8203c58ceefd0cd120b05463cb1c7823a6b Mon Sep 17 00:00:00 2001 From: Bastien Guillaumat Date: Tue, 1 Aug 2023 03:13:58 +0200 Subject: [PATCH 729/782] Add bguillaumat.txt to contributors --- contributors/bguillaumat.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/bguillaumat.txt diff --git a/contributors/bguillaumat.txt b/contributors/bguillaumat.txt new file mode 100644 index 000000000..ac14a07c7 --- /dev/null +++ b/contributors/bguillaumat.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. + +Signed: bguillaumat From 910e67ff36c404276cfba0f1f25edd8d366e2de9 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 31 Jul 2023 15:03:54 +0900 Subject: [PATCH 730/782] Get blocks from electrs again --- backend/src/api/bitcoin/bitcoin.routes.ts | 4 ++-- backend/src/api/blocks.ts | 12 ++++++------ backend/src/api/mempool.ts | 2 +- backend/src/api/mining/mining.ts | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index d2a77c995..f27bb7797 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -6,7 +6,7 @@ import websocketHandler from '../websocket-handler'; import mempool from '../mempool'; import feeApi from '../fee-api'; import mempoolBlocks from '../mempool-blocks'; -import bitcoinApi, { bitcoinCoreApi } from './bitcoin-api-factory'; +import bitcoinApi from './bitcoin-api-factory'; import { Common } from '../common'; import backendInfo from '../backend-info'; import transactionUtils from '../transaction-utils'; @@ -483,7 +483,7 @@ class BitcoinRoutes { returnBlocks.push(localBlock); nextHash = localBlock.previousblockhash; } else { - const block = await bitcoinCoreApi.$getBlock(nextHash); + const block = await bitcoinApi.$getBlock(nextHash); returnBlocks.push(block); nextHash = block.previousblockhash; } diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index f86bc53e9..88f85ba6e 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -599,7 +599,7 @@ class Blocks { loadingIndicators.setProgress('block-indexing', progress, false); } const blockHash = await bitcoinApi.$getBlockHash(blockHeight); - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(blockHash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(blockHash); const transactions = await this.$getTransactionsExtended(blockHash, block.height, true, null, true); const blockExtended = await this.$getBlockExtended(block, transactions); @@ -656,7 +656,7 @@ class Blocks { const heightDiff = blockHeightTip % 2016; const blockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff); this.updateTimerProgress(timer, 'got block hash for initial difficulty adjustment'); - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(blockHash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(blockHash); this.updateTimerProgress(timer, 'got block for initial difficulty adjustment'); this.lastDifficultyAdjustmentTime = block.timestamp; this.currentDifficulty = block.difficulty; @@ -664,7 +664,7 @@ class Blocks { if (blockHeightTip >= 2016) { const previousPeriodBlockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff - 2016); this.updateTimerProgress(timer, 'got previous block hash for initial difficulty adjustment'); - const previousPeriodBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(previousPeriodBlockHash); + const previousPeriodBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(previousPeriodBlockHash); this.updateTimerProgress(timer, 'got previous block for initial difficulty adjustment'); this.previousDifficultyRetarget = (block.difficulty - previousPeriodBlock.difficulty) / previousPeriodBlock.difficulty * 100; logger.debug(`Initial difficulty adjustment data set.`); @@ -862,7 +862,7 @@ class Blocks { } const blockHash = await bitcoinApi.$getBlockHash(height); - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(blockHash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(blockHash); const transactions = await this.$getTransactionsExtended(blockHash, block.height, true); const blockExtended = await this.$getBlockExtended(block, transactions); @@ -874,7 +874,7 @@ class Blocks { } public async $indexStaleBlock(hash: string): Promise { - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(hash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(hash); const transactions = await this.$getTransactionsExtended(hash, block.height, true); const blockExtended = await this.$getBlockExtended(block, transactions); @@ -899,7 +899,7 @@ class Blocks { } // Bitcoin network, add our custom data on top - const block: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(hash); + const block: IEsploraApi.Block = await bitcoinApi.$getBlock(hash); if (block.stale) { return await this.$indexStaleBlock(hash); } else { diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index d5214de5d..b9b648012 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -1,5 +1,5 @@ import config from '../config'; -import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; +import bitcoinApi from './bitcoin/bitcoin-api-factory'; import { MempoolTransactionExtended, TransactionExtended, VbytesPerSecond } from '../mempool.interfaces'; import logger from '../logger'; import { Common } from './common'; diff --git a/backend/src/api/mining/mining.ts b/backend/src/api/mining/mining.ts index e190492b8..beda0bc48 100644 --- a/backend/src/api/mining/mining.ts +++ b/backend/src/api/mining/mining.ts @@ -11,7 +11,7 @@ import DifficultyAdjustmentsRepository from '../../repositories/DifficultyAdjust import config from '../../config'; import BlocksAuditsRepository from '../../repositories/BlocksAuditsRepository'; import PricesRepository from '../../repositories/PricesRepository'; -import { bitcoinCoreApi } from '../bitcoin/bitcoin-api-factory'; +import bitcoinApi from '../bitcoin/bitcoin-api-factory'; import { IEsploraApi } from '../bitcoin/esplora-api.interface'; import database from '../../database'; @@ -201,7 +201,7 @@ class Mining { try { const oldestConsecutiveBlockTimestamp = 1000 * (await BlocksRepository.$getOldestConsecutiveBlock()).timestamp; - const genesisBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(await bitcoinClient.getBlockHash(0)); + const genesisBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(await bitcoinApi.$getBlockHash(0)); const genesisTimestamp = genesisBlock.timestamp * 1000; const indexedTimestamp = await HashratesRepository.$getWeeklyHashrateTimestamps(); @@ -312,7 +312,7 @@ class Mining { const oldestConsecutiveBlockTimestamp = 1000 * (await BlocksRepository.$getOldestConsecutiveBlock()).timestamp; try { - const genesisBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(await bitcoinClient.getBlockHash(0)); + const genesisBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(await bitcoinApi.$getBlockHash(0)); const genesisTimestamp = genesisBlock.timestamp * 1000; const indexedTimestamp = (await HashratesRepository.$getRawNetworkDailyHashrate(null)).map(hashrate => hashrate.timestamp); const lastMidnight = this.getDateMidnight(new Date()); @@ -421,7 +421,7 @@ class Mining { } const blocks: any = await BlocksRepository.$getBlocksDifficulty(); - const genesisBlock: IEsploraApi.Block = await bitcoinCoreApi.$getBlock(await bitcoinClient.getBlockHash(0)); + const genesisBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(await bitcoinApi.$getBlockHash(0)); let currentDifficulty = genesisBlock.difficulty; let totalIndexed = 0; From 0924bb6ac09c4543979539738dfacd02ee8a4613 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 31 Jul 2023 18:28:08 +0900 Subject: [PATCH 731/782] Use bits to detect difficulty adjustments, not difficulty --- backend/src/api/mining/mining.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/src/api/mining/mining.ts b/backend/src/api/mining/mining.ts index beda0bc48..3eeb3e9e5 100644 --- a/backend/src/api/mining/mining.ts +++ b/backend/src/api/mining/mining.ts @@ -423,6 +423,7 @@ class Mining { const blocks: any = await BlocksRepository.$getBlocksDifficulty(); const genesisBlock: IEsploraApi.Block = await bitcoinApi.$getBlock(await bitcoinApi.$getBlockHash(0)); let currentDifficulty = genesisBlock.difficulty; + let currentBits = genesisBlock.bits; let totalIndexed = 0; if (config.MEMPOOL.INDEXING_BLOCKS_AMOUNT === -1 && indexedHeights[0] !== true) { @@ -436,17 +437,18 @@ class Mining { const oldestConsecutiveBlock = await BlocksRepository.$getOldestConsecutiveBlock(); if (config.MEMPOOL.INDEXING_BLOCKS_AMOUNT !== -1) { - currentDifficulty = oldestConsecutiveBlock.difficulty; + currentBits = oldestConsecutiveBlock.bits; } let totalBlockChecked = 0; let timer = new Date().getTime() / 1000; for (const block of blocks) { - if (block.difficulty !== currentDifficulty) { + if (block.bits !== currentBits) { if (indexedHeights[block.height] === true) { // Already indexed if (block.height >= oldestConsecutiveBlock.height) { currentDifficulty = block.difficulty; + currentBits = block.bits; } continue; } @@ -464,6 +466,7 @@ class Mining { totalIndexed++; if (block.height >= oldestConsecutiveBlock.height) { currentDifficulty = block.difficulty; + currentBits = block.bits; } } From a863c17408bade6bd3021816037992021d585e61 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 1 Aug 2023 11:16:35 +0900 Subject: [PATCH 732/782] Fix difficulty indexing db queries to return bits --- backend/src/repositories/BlocksRepository.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/repositories/BlocksRepository.ts b/backend/src/repositories/BlocksRepository.ts index 078b85a03..ca54fc1b7 100644 --- a/backend/src/repositories/BlocksRepository.ts +++ b/backend/src/repositories/BlocksRepository.ts @@ -539,7 +539,7 @@ class BlocksRepository { */ public async $getBlocksDifficulty(): Promise { try { - const [rows]: any[] = await DB.query(`SELECT UNIX_TIMESTAMP(blockTimestamp) as time, height, difficulty FROM blocks`); + const [rows]: any[] = await DB.query(`SELECT UNIX_TIMESTAMP(blockTimestamp) as time, height, difficulty, bits FROM blocks`); return rows; } catch (e) { logger.err('Cannot get blocks difficulty list from the db. Reason: ' + (e instanceof Error ? e.message : e)); @@ -848,7 +848,7 @@ class BlocksRepository { */ public async $getOldestConsecutiveBlock(): Promise { try { - const [rows]: any = await DB.query(`SELECT height, UNIX_TIMESTAMP(blockTimestamp) as timestamp, difficulty FROM blocks ORDER BY height DESC`); + const [rows]: any = await DB.query(`SELECT height, UNIX_TIMESTAMP(blockTimestamp) as timestamp, difficulty, bits FROM blocks ORDER BY height DESC`); for (let i = 0; i < rows.length - 1; ++i) { if (rows[i].height - rows[i + 1].height > 1) { return rows[i]; From b0080a5859c7a2c50fa9384fb8f29ed7d9ab5654 Mon Sep 17 00:00:00 2001 From: softsimon Date: Tue, 1 Aug 2023 15:55:03 +0900 Subject: [PATCH 733/782] Base mempool break limit of current poll rate --- backend/src/api/mempool.ts | 6 +++--- backend/src/index.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index b9b648012..85b6e6101 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -182,7 +182,7 @@ class Mempool { return txTimes; } - public async $updateMempool(transactions: string[]): Promise { + public async $updateMempool(transactions: string[], pollRate: number): Promise { logger.debug(`Updating mempool...`); // warn if this run stalls the main loop for more than 2 minutes @@ -258,7 +258,7 @@ class Mempool { } } - if (Date.now() - intervalTimer > 5_000) { + if (Date.now() - intervalTimer > Math.max(pollRate * 2, 5_000)) { if (this.inSync) { // Break and restart mempool loop if we spend too much time processing // new transactions that may lead to falling behind on block height @@ -270,7 +270,7 @@ class Mempool { if (Math.floor(progress) < 100) { loadingIndicators.setProgress('mempool', progress); } - intervalTimer = Date.now() + intervalTimer = Date.now(); } } } diff --git a/backend/src/index.ts b/backend/src/index.ts index 222537d0b..185a47067 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -188,14 +188,14 @@ class Server { } const newMempool = await bitcoinApi.$getRawMempool(); const numHandledBlocks = await blocks.$updateBlocks(); + const pollRate = config.MEMPOOL.POLL_RATE_MS * (indexer.indexerRunning ? 10 : 1); if (numHandledBlocks === 0) { - await memPool.$updateMempool(newMempool); + await memPool.$updateMempool(newMempool, pollRate); } indexer.$run(); // rerun immediately if we skipped the mempool update, otherwise wait POLL_RATE_MS const elapsed = Date.now() - start; - const pollRate = config.MEMPOOL.POLL_RATE_MS * (indexer.indexerRunning ? 10 : 1); const remainingTime = Math.max(0, pollRate - elapsed); setTimeout(this.runMainUpdateLoop.bind(this), numHandledBlocks > 0 ? 0 : remainingTime); this.backendRetryCount = 0; From a1af41804a6a8f2a0d61b5ad6fe814c40d2fd837 Mon Sep 17 00:00:00 2001 From: hunicus <93150691+hunicus@users.noreply.github.com> Date: Tue, 1 Aug 2023 16:00:16 +0900 Subject: [PATCH 734/782] Implement wiz footer suggestions --- .../global-footer/global-footer.component.html | 10 ++++++---- .../global-footer/global-footer.component.scss | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html index b1ba84109..58b7c5b1e 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.html +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html @@ -2,7 +2,10 @@

    -
    The Mempool Open Source Project ®
    +

    Explore the full Bitcoin ecosystem

    - + + + + P2PK + + + +
    diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.scss b/frontend/src/app/components/transactions-list/transactions-list.component.scss index 08d7d7486..7356bad0b 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.scss +++ b/frontend/src/app/components/transactions-list/transactions-list.component.scss @@ -140,6 +140,12 @@ h2 { font-family: monospace; } +.p2pk-address { + display: inline-block; + margin-left: 1em; + max-width: 140px; +} + .grey-info-text { color:#6c757d; font-style: italic; diff --git a/frontend/src/app/interfaces/electrs.interface.ts b/frontend/src/app/interfaces/electrs.interface.ts index 2739d2b06..df19f7491 100644 --- a/frontend/src/app/interfaces/electrs.interface.ts +++ b/frontend/src/app/interfaces/electrs.interface.ts @@ -129,6 +129,22 @@ export interface Address { address: string; chain_stats: ChainStats; mempool_stats: MempoolStats; + is_pubkey?: boolean; +} + +export interface ScriptHash { + electrum?: boolean; + scripthash: string; + chain_stats: ChainStats; + mempool_stats: MempoolStats; +} + +export interface AddressOrScriptHash { + electrum?: boolean; + address?: string; + scripthash?: string; + chain_stats: ChainStats; + mempool_stats: MempoolStats; } export interface ChainStats { diff --git a/frontend/src/app/services/electrs-api.service.ts b/frontend/src/app/services/electrs-api.service.ts index c87018741..f866eb23d 100644 --- a/frontend/src/app/services/electrs-api.service.ts +++ b/frontend/src/app/services/electrs-api.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; -import { Transaction, Address, Outspend, Recent, Asset } from '../interfaces/electrs.interface'; +import { Observable, from, of, switchMap } from 'rxjs'; +import { Transaction, Address, Outspend, Recent, Asset, ScriptHash } from '../interfaces/electrs.interface'; import { StateService } from './state.service'; import { BlockExtended } from '../interfaces/node-api.interface'; +import { calcScriptHash$ } from '../bitcoin.utils'; @Injectable({ providedIn: 'root' @@ -65,6 +66,24 @@ export class ElectrsApiService { return this.httpClient.get
    (this.apiBaseUrl + this.apiBasePath + '/api/address/' + address); } + getPubKeyAddress$(pubkey: string): Observable
    { + return this.getScriptHash$('41' + pubkey + 'ac').pipe( + switchMap((scripthash: ScriptHash) => { + return of({ + ...scripthash, + address: pubkey, + is_pubkey: true, + }); + }) + ); + } + + getScriptHash$(script: string): Observable { + return from(calcScriptHash$(script)).pipe( + switchMap(scriptHash => this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/scripthash/' + scriptHash)) + ); + } + getAddressTransactions$(address: string, txid?: string): Observable { let params = new HttpParams(); if (txid) { @@ -73,6 +92,16 @@ export class ElectrsApiService { return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/address/' + address + '/txs', { params }); } + getScriptHashTransactions$(script: string, txid?: string): Observable { + let params = new HttpParams(); + if (txid) { + params = params.append('after_txid', txid); + } + return from(calcScriptHash$(script)).pipe( + switchMap(scriptHash => this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/scripthash/' + scriptHash + '/txs', { params })), + ); + } + getAsset$(assetId: string): Observable { return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/asset/' + assetId); } From 0ce043cca9f63c51e3b9bf4685ce5fffc33f200d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 23 Jul 2023 13:55:27 +0900 Subject: [PATCH 652/782] Fix esplora error messages --- backend/src/api/bitcoin/esplora-api.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 01294cc01..5bfff5730 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -111,11 +111,11 @@ class ElectrsApi implements AbstractBitcoinApi { } $getScriptHash(scripthash: string): Promise { - throw new Error('Method getAddress not implemented.'); + throw new Error('Method getScriptHash not implemented.'); } $getScriptHashTransactions(scripthash: string, txId?: string): Promise { - throw new Error('Method getAddressTransactions not implemented.'); + throw new Error('Method getScriptHashTransactions not implemented.'); } $getAddressPrefix(prefix: string): string[] { From 48b55eed468d9515e82518ebb31d5c41fc1080a4 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 23 Jul 2023 13:55:52 +0900 Subject: [PATCH 653/782] improve script hex parsing validation --- frontend/src/app/bitcoin.utils.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/bitcoin.utils.ts b/frontend/src/app/bitcoin.utils.ts index 7ff0d9570..c4af730f6 100644 --- a/frontend/src/app/bitcoin.utils.ts +++ b/frontend/src/app/bitcoin.utils.ts @@ -283,7 +283,10 @@ export function isFeatureActive(network: string, height: number, feature: 'rbf' } export async function calcScriptHash$(script: string): Promise { - const buf = Uint8Array.from(script.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); + if (!/^[0-9a-fA-F]*$/.test(script) || script.length % 2 !== 0) { + throw new Error('script is not a valid hex string'); + } + const buf = Uint8Array.from(script.match(/.{2}/g).map((byte) => parseInt(byte, 16))); const hashBuffer = await crypto.subtle.digest('SHA-256', buf); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray From 0376467e6c9c211b7357cf61f0e1903cc631dbaa Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 23 Jul 2023 14:00:39 +0900 Subject: [PATCH 654/782] highlight matching P2PK inputs --- .../transactions-list/transactions-list.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index 3f88c61b0..d1d0673fe 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -23,7 +23,7 @@
    From 56127dce6a19039c126858953a28fcb2eb475ae3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 23 Jul 2023 14:05:04 +0900 Subject: [PATCH 655/782] Add P2PK support to search bar --- .../src/app/components/search-form/search-form.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/components/search-form/search-form.component.ts b/frontend/src/app/components/search-form/search-form.component.ts index ab42fe1f7..2361f8873 100644 --- a/frontend/src/app/components/search-form/search-form.component.ts +++ b/frontend/src/app/components/search-form/search-form.component.ts @@ -34,7 +34,7 @@ export class SearchFormComponent implements OnInit { } } - regexAddress = /^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[A-z]{2,5}1[a-zA-HJ-NP-Z0-9]{39,59})$/; + regexAddress = /^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[A-z]{2,5}1[a-zA-HJ-NP-Z0-9]{39,59}|[0-9a-fA-F]{130})$/; regexBlockhash = /^[0]{8}[a-fA-F0-9]{56}$/; regexTransaction = /^([a-fA-F0-9]{64})(:\d+)?$/; regexBlockheight = /^[0-9]{1,9}$/; From ae183210e036b0c9455d21abb5d922cd5e70f083 Mon Sep 17 00:00:00 2001 From: softsimon Date: Sun, 23 Jul 2023 14:43:43 +0900 Subject: [PATCH 656/782] Updating pubkey width on mobile and desktop --- .../transactions-list/transactions-list.component.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.scss b/frontend/src/app/components/transactions-list/transactions-list.component.scss index 7356bad0b..14559089a 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.scss +++ b/frontend/src/app/components/transactions-list/transactions-list.component.scss @@ -143,7 +143,10 @@ h2 { .p2pk-address { display: inline-block; margin-left: 1em; - max-width: 140px; + max-width: 100px; + @media (min-width: 576px) { + max-width: 200px + } } .grey-info-text { From 05affa5ad4320f0b2bc4475f4c483a497ab22f15 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 23 Jul 2023 16:19:48 +0900 Subject: [PATCH 657/782] Fix difficulty tooltip position --- .../app/components/difficulty/difficulty.component.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/difficulty/difficulty.component.ts b/frontend/src/app/components/difficulty/difficulty.component.ts index d3983c939..a2c03dc56 100644 --- a/frontend/src/app/components/difficulty/difficulty.component.ts +++ b/frontend/src/app/components/difficulty/difficulty.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, HostListener, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; import { combineLatest, Observable, timer } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { StateService } from '../..//services/state.service'; @@ -61,6 +61,7 @@ export class DifficultyComponent implements OnInit { constructor( public stateService: StateService, + private cd: ChangeDetectorRef, @Inject(LOCALE_ID) private locale: string, ) { } @@ -189,9 +190,15 @@ export class DifficultyComponent implements OnInit { return shapes; } + @HostListener('pointerdown', ['$event']) + onPointerDown(event) { + this.onPointerMove(event); + } + @HostListener('pointermove', ['$event']) onPointerMove(event) { this.tooltipPosition = { x: event.clientX, y: event.clientY }; + this.cd.markForCheck(); } onHover(event, rect): void { From a1e05c0c37bdf848c51b502cd1286bc9117120fa Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 23 Jul 2023 17:45:01 +0900 Subject: [PATCH 658/782] Lightning channel balance progress bars --- .../channel-close-box.component.html | 58 ++++++++---- .../channel-close-box.component.scss | 94 +++++++++++++++++++ .../channel-close-box.component.ts | 70 +++++++++++--- .../lightning/channel/channel.component.html | 4 +- 4 files changed, 195 insertions(+), 31 deletions(-) diff --git a/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.html b/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.html index b5615324b..08a341de4 100644 --- a/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.html +++ b/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.html @@ -1,19 +1,43 @@
    - - - - - - - - - - - - - - - - -
    Starting balance{{ minStartingBalance | number : '1.0-0' }} - {{ maxStartingBalance | number : '1.0-0' }}?
    Closing balance{{ minClosingBalance | number : '1.0-0' }} - {{ maxClosingBalance | number : '1.0-0' }}?
    +
    +
    Starting balance
    +
    +
    {{ left.alias }}
    +
    {{ right.alias }}
    +
    +
    +
    + {{ minStartingBalance | number : '1.0-0' }} - {{ maxStartingBalance | number : '1.0-0' }} + {{ minStartingBalance | number : '1.0-0' }} +
    +
    + {{ channel.capacity - maxStartingBalance | number : '1.0-0' }} - {{ channel.capacity - minStartingBalance | number : '1.0-0' }} + {{ channel.capacity - maxStartingBalance | number : '1.0-0' }} +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    Closing balance
    +
    +
    + {{ minClosingBalance | number : '1.0-0' }} - {{ maxClosingBalance | number : '1.0-0' }} + {{ minClosingBalance | number : '1.0-0' }} +
    +
    + {{ channel.capacity - maxClosingBalance | number : '1.0-0' }} - {{ channel.capacity - minClosingBalance | number : '1.0-0' }} + {{ channel.capacity - maxClosingBalance | number : '1.0-0' }} +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.scss b/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.scss index a42871308..f55550eb3 100644 --- a/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.scss +++ b/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.scss @@ -6,4 +6,98 @@ .box { margin-bottom: 20px; } +} + +.starting-balance, .closing-balance { + width: 100%; + + h5 { + text-align: center; + } +} + +.nodes { + display: none; + flex-direction: row; + align-items: baseline; + justify-content: space-between; + + @media (max-width: 768px) { + display: flex; + } +} + +.balances { + display: flex; + flex-direction: row; + align-items: baseline; + justify-content: space-between; + margin-bottom: 8px; + + .balance { + &.left { + text-align: start; + } + &.right { + text-align: end; + } + } +} + +.balance-bar { + width: 100%; + height: 2em; + position: relative; + + .bar { + position: absolute; + top: 0; + bottom: 0; + height: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + + &.left { + background: #105fb0; + } + &.center { + background: repeating-linear-gradient( + 60deg, + #105fb0 0, + #105fb0 12px, + #1a9436 12px, + #1a9436 24px + ); + } + &.right { + background: #1a9436; + } + + .value { + flex: 0; + white-space: nowrap; + } + + &.hide-value { + .value { + display: none; + } + } + } + + @media (max-width: 768px) { + height: 1em; + + .bar.center { + background: repeating-linear-gradient( + 60deg, + #105fb0 0, + #105fb0 8px, + #1a9436 8px, + #1a9436 16px + ) + } + } } \ No newline at end of file diff --git a/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.ts b/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.ts index 05cc31434..ef42464eb 100644 --- a/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.ts +++ b/frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.ts @@ -8,8 +8,8 @@ import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } f }) export class ChannelCloseBoxComponent implements OnChanges { @Input() channel: any; - @Input() local: any; - @Input() remote: any; + @Input() left: any; + @Input() right: any; showStartingBalance: boolean = false; showClosingBalance: boolean = false; @@ -18,29 +18,55 @@ export class ChannelCloseBoxComponent implements OnChanges { minClosingBalance: number; maxClosingBalance: number; + startingBalanceStyle: { + left: string, + center: string, + right: string, + } = { + left: '', + center: '', + right: '', + }; + + closingBalanceStyle: { + left: string, + center: string, + right: string, + } = { + left: '', + center: '', + right: '', + }; + + hideStartingLeft: boolean = false; + hideStartingRight: boolean = false; + hideClosingLeft: boolean = false; + hideClosingRight: boolean = false; + constructor() { } ngOnChanges(changes: SimpleChanges): void { - if (this.channel && this.local && this.remote) { - this.showStartingBalance = (this.local.funding_balance || this.remote.funding_balance) && this.channel.funding_ratio; - this.showClosingBalance = this.local.closing_balance || this.remote.closing_balance; + let closingCapacity; + if (this.channel && this.left && this.right) { + this.showStartingBalance = (this.left.funding_balance || this.right.funding_balance) && this.channel.funding_ratio; + this.showClosingBalance = this.left.closing_balance || this.right.closing_balance; if (this.channel.single_funded) { - if (this.local.funding_balance) { + if (this.left.funding_balance) { this.minStartingBalance = this.channel.capacity; this.maxStartingBalance = this.channel.capacity; - } else if (this.remote.funding_balance) { + } else if (this.right.funding_balance) { this.minStartingBalance = 0; this.maxStartingBalance = 0; } } else { - this.minStartingBalance = clampRound(0, this.channel.capacity, this.local.funding_balance * this.channel.funding_ratio); - this.maxStartingBalance = clampRound(0, this.channel.capacity, this.channel.capacity - (this.remote.funding_balance * this.channel.funding_ratio)); + this.minStartingBalance = clampRound(0, this.channel.capacity, this.left.funding_balance * this.channel.funding_ratio); + this.maxStartingBalance = clampRound(0, this.channel.capacity, this.channel.capacity - (this.right.funding_balance * this.channel.funding_ratio)); } - const closingCapacity = this.channel.capacity - this.channel.closing_fee; - this.minClosingBalance = clampRound(0, closingCapacity, this.local.closing_balance); - this.maxClosingBalance = clampRound(0, closingCapacity, closingCapacity - this.remote.closing_balance); + closingCapacity = this.channel.capacity - this.channel.closing_fee; + this.minClosingBalance = clampRound(0, closingCapacity, this.left.closing_balance); + this.maxClosingBalance = clampRound(0, closingCapacity, closingCapacity - this.right.closing_balance); // margin of error to account for 2 x 330 sat anchor outputs if (Math.abs(this.minClosingBalance - this.maxClosingBalance) <= 660) { @@ -50,6 +76,26 @@ export class ChannelCloseBoxComponent implements OnChanges { this.showStartingBalance = false; this.showClosingBalance = false; } + + const startingMinPc = (this.minStartingBalance / this.channel.capacity) * 100; + const startingMaxPc = (this.maxStartingBalance / this.channel.capacity) * 100; + this.startingBalanceStyle = { + left: `left: 0%; right: ${100 - startingMinPc}%;`, + center: `left: ${startingMinPc}%; right: ${100 -startingMaxPc}%;`, + right: `left: ${startingMaxPc}%; right: 0%;`, + }; + this.hideStartingLeft = startingMinPc < 15; + this.hideStartingRight = startingMaxPc > 85; + + const closingMinPc = (this.minClosingBalance / closingCapacity) * 100; + const closingMaxPc = (this.maxClosingBalance / closingCapacity) * 100; + this.closingBalanceStyle = { + left: `left: 0%; right: ${100 - closingMinPc}%;`, + center: `left: ${closingMinPc}%; right: ${100 - closingMaxPc}%;`, + right: `left: ${closingMaxPc}%; right: 0%;`, + }; + this.hideClosingLeft = closingMinPc < 15; + this.hideClosingRight = closingMaxPc > 85; } } diff --git a/frontend/src/app/lightning/channel/channel.component.html b/frontend/src/app/lightning/channel/channel.component.html index 2766f1d15..b9d9e09a4 100644 --- a/frontend/src/app/lightning/channel/channel.component.html +++ b/frontend/src/app/lightning/channel/channel.component.html @@ -75,14 +75,14 @@
    -
    -
    + +
    From 02f361af7334ec8e0df6206c15d328fa7807f5cf Mon Sep 17 00:00:00 2001 From: wiz Date: Sun, 23 Jul 2023 22:21:53 +0900 Subject: [PATCH 659/782] Hotfix for CLN crash --- backend/src/api/lightning/clightning/clightning-convert.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/lightning/clightning/clightning-convert.ts b/backend/src/api/lightning/clightning/clightning-convert.ts index 771dabcd7..02854a79b 100644 --- a/backend/src/api/lightning/clightning/clightning-convert.ts +++ b/backend/src/api/lightning/clightning/clightning-convert.ts @@ -257,8 +257,8 @@ async function buildIncompleteChannel(clChannel: any): Promise Date: Sun, 23 Jul 2023 22:35:32 +0900 Subject: [PATCH 660/782] Another hotfix for CLN crash --- backend/src/api/lightning/clightning/clightning-convert.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/lightning/clightning/clightning-convert.ts b/backend/src/api/lightning/clightning/clightning-convert.ts index 02854a79b..55e4bd213 100644 --- a/backend/src/api/lightning/clightning/clightning-convert.ts +++ b/backend/src/api/lightning/clightning/clightning-convert.ts @@ -217,7 +217,7 @@ async function buildFullChannel(clChannelA: any, clChannelB: any): Promise Date: Mon, 24 Jul 2023 10:18:00 +0900 Subject: [PATCH 661/782] [search bar] auto focus only in dashboards --- .../mining-dashboard.component.ts | 10 +++++++-- .../search-form/search-form.component.html | 2 +- .../search-form/search-form.component.ts | 21 ++++++++++++++++--- .../src/app/dashboard/dashboard.component.ts | 10 ++++++--- frontend/src/app/services/state.service.ts | 2 ++ 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts index df4713374..22d0e11fe 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts @@ -1,6 +1,7 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { AfterViewChecked, ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { SeoService } from '../../services/seo.service'; import { WebsocketService } from '../../services/websocket.service'; +import { StateService } from '../../services/state.service'; @Component({ selector: 'app-mining-dashboard', @@ -8,10 +9,11 @@ import { WebsocketService } from '../../services/websocket.service'; styleUrls: ['./mining-dashboard.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class MiningDashboardComponent implements OnInit { +export class MiningDashboardComponent implements OnInit, AfterViewChecked { constructor( private seoService: SeoService, private websocketService: WebsocketService, + private stateService: StateService ) { this.seoService.setTitle($localize`:@@a681a4e2011bb28157689dbaa387de0dd0aa0c11:Mining Dashboard`); } @@ -19,4 +21,8 @@ export class MiningDashboardComponent implements OnInit { ngOnInit(): void { this.websocketService.want(['blocks', 'mempool-blocks', 'stats']); } + + ngAfterViewChecked(): void { + this.stateService.searchFocus$.next(true); + } } diff --git a/frontend/src/app/components/search-form/search-form.component.html b/frontend/src/app/components/search-form/search-form.component.html index cdfcfe015..3fc03c83a 100644 --- a/frontend/src/app/components/search-form/search-form.component.html +++ b/frontend/src/app/components/search-form/search-form.component.html @@ -1,7 +1,7 @@
    - +
    diff --git a/frontend/src/app/components/search-form/search-form.component.ts b/frontend/src/app/components/search-form/search-form.component.ts index 2361f8873..2fc25748e 100644 --- a/frontend/src/app/components/search-form/search-form.component.ts +++ b/frontend/src/app/components/search-form/search-form.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, ChangeDetectionStrategy, EventEmitter, Output, ViewChild, HostListener, ElementRef } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; +import { EventType, NavigationStart, Router } from '@angular/router'; import { AssetsService } from '../../services/assets.service'; import { StateService } from '../../services/state.service'; import { Observable, of, Subject, zip, BehaviorSubject, combineLatest } from 'rxjs'; @@ -47,6 +47,8 @@ export class SearchFormComponent implements OnInit { this.handleKeyDown($event); } + @ViewChild('searchInput') searchInput: ElementRef; + constructor( private formBuilder: UntypedFormBuilder, private router: Router, @@ -55,11 +57,24 @@ export class SearchFormComponent implements OnInit { private electrsApiService: ElectrsApiService, private apiService: ApiService, private relativeUrlPipe: RelativeUrlPipe, - private elementRef: ElementRef, - ) { } + private elementRef: ElementRef + ) { + } ngOnInit(): void { this.stateService.networkChanged$.subscribe((network) => this.network = network); + + this.router.events.subscribe((e: NavigationStart) => { // Reset search focus when changing page + if (e.type === EventType.NavigationStart) { + this.searchInput.nativeElement.blur(); + } + }); + + this.stateService.searchFocus$.subscribe(focus => { + if (this.searchInput && focus === true) { + this.searchInput.nativeElement.focus(); + } + }); this.searchForm = this.formBuilder.group({ searchText: ['', Validators.required], diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index aca3593d7..a9c0bb31c 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -1,7 +1,7 @@ -import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; +import { AfterViewChecked, ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { combineLatest, merge, Observable, of, Subscription } from 'rxjs'; import { filter, map, scan, share, switchMap, tap } from 'rxjs/operators'; -import { BlockExtended, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface'; +import { BlockExtended, OptimizedMempoolStats } from '../interfaces/node-api.interface'; import { MempoolInfo, TransactionStripped, ReplacementInfo } from '../interfaces/websocket.interface'; import { ApiService } from '../services/api.service'; import { StateService } from '../services/state.service'; @@ -31,7 +31,7 @@ interface MempoolStatsData { styleUrls: ['./dashboard.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class DashboardComponent implements OnInit, OnDestroy { +export class DashboardComponent implements OnInit, OnDestroy, AfterViewChecked { featuredAssets$: Observable; network$: Observable; mempoolBlocksData$: Observable; @@ -57,6 +57,10 @@ export class DashboardComponent implements OnInit, OnDestroy { private seoService: SeoService ) { } + ngAfterViewChecked(): void { + this.stateService.searchFocus$.next(true); + } + ngOnDestroy(): void { this.currencySubscription.unsubscribe(); this.websocketService.stopTrackRbfSummary(); diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 5ebca9ba1..2c4f06b49 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -138,6 +138,8 @@ export class StateService { fiatCurrency$: BehaviorSubject; rateUnits$: BehaviorSubject; + searchFocus$: Subject = new Subject(); + constructor( @Inject(PLATFORM_ID) private platformId: any, @Inject(LOCALE_ID) private locale: string, From 44f2217a6801d343988902212c5fd2a41274564b Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 24 Jul 2023 10:45:27 +0900 Subject: [PATCH 662/782] Fix typo which skips sigop calculation --- backend/src/api/mempool.ts | 2 +- backend/src/api/transaction-utils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index bc3f33806..d988ea47a 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -86,7 +86,7 @@ class Mempool { this.mempoolCache = mempoolData; let count = 0; for (const txid of Object.keys(this.mempoolCache)) { - if (this.mempoolCache[txid].sigops == null || this.mempoolCache[txid].effectiveFeePerVsize == null) { + if (!this.mempoolCache[txid].sigops || this.mempoolCache[txid].effectiveFeePerVsize == null) { this.mempoolCache[txid] = transactionUtils.extendMempoolTransaction(this.mempoolCache[txid]); } if (this.mempoolCache[txid].order == null) { diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 849aff8f3..a48c9f259 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -74,7 +74,7 @@ class TransactionUtils { public extendMempoolTransaction(transaction: IEsploraApi.Transaction): MempoolTransactionExtended { const vsize = Math.ceil(transaction.weight / 4); const fractionalVsize = (transaction.weight / 4); - const sigops = Common.isLiquid() ? this.countSigops(transaction) : 0; + const sigops = !Common.isLiquid() ? this.countSigops(transaction) : 0; // https://github.com/bitcoin/bitcoin/blob/e9262ea32a6e1d364fb7974844fadc36f931f8c6/src/policy/policy.cpp#L295-L298 const adjustedVsize = Math.max(fractionalVsize, sigops * 5); // adjusted vsize = Max(weight, sigops * bytes_per_sigop) / witness_scale_factor const feePerVbytes = (transaction.fee || 0) / fractionalVsize; From da4a20cb8574916681602b0b995ca93fd2fe4b04 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 24 Jul 2023 11:35:46 +0900 Subject: [PATCH 663/782] [search bar] dont auto focus if touch screen --- .../mining-dashboard.component.ts | 2 +- .../src/app/dashboard/dashboard.component.ts | 2 +- frontend/src/app/services/state.service.ts | 7 +++++ .../src/app/shared/pipes/bytes-pipe/utils.ts | 26 +++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts index 22d0e11fe..c7670bc1e 100644 --- a/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts +++ b/frontend/src/app/components/mining-dashboard/mining-dashboard.component.ts @@ -23,6 +23,6 @@ export class MiningDashboardComponent implements OnInit, AfterViewChecked { } ngAfterViewChecked(): void { - this.stateService.searchFocus$.next(true); + this.stateService.focusSearchInputDesktop(); } } diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index a9c0bb31c..6d61953cf 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -58,7 +58,7 @@ export class DashboardComponent implements OnInit, OnDestroy, AfterViewChecked { ) { } ngAfterViewChecked(): void { - this.stateService.searchFocus$.next(true); + this.stateService.focusSearchInputDesktop(); } ngOnDestroy(): void { diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 2c4f06b49..bebe751d6 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -7,6 +7,7 @@ import { Router, NavigationStart } from '@angular/router'; import { isPlatformBrowser } from '@angular/common'; import { filter, map, scan, shareReplay } from 'rxjs/operators'; import { StorageService } from './storage.service'; +import { hasTouchScreen } from '../shared/pipes/bytes-pipe/utils'; export interface MarkBlockState { blockHeight?: number; @@ -357,4 +358,10 @@ export class StateService { this.blocks = this.blocks.slice(0, this.env.KEEP_BLOCKS_AMOUNT); this.blocksSubject$.next(this.blocks); } + + focusSearchInputDesktop() { + if (!hasTouchScreen()) { + this.searchFocus$.next(true); + } + } } diff --git a/frontend/src/app/shared/pipes/bytes-pipe/utils.ts b/frontend/src/app/shared/pipes/bytes-pipe/utils.ts index fc8c2b08f..86a1e1a1d 100644 --- a/frontend/src/app/shared/pipes/bytes-pipe/utils.ts +++ b/frontend/src/app/shared/pipes/bytes-pipe/utils.ts @@ -309,3 +309,29 @@ export function takeWhile(input: any[], predicate: CollectionPredicate) { return takeUntil(input, (item: any, index: number | undefined, collection: any[] | undefined) => !predicate(item, index, collection)); } + +// https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent +export function hasTouchScreen(): boolean { + let hasTouchScreen = false; + if ('maxTouchPoints' in navigator) { + hasTouchScreen = navigator.maxTouchPoints > 0; + } else if ('msMaxTouchPoints' in navigator) { + // @ts-ignore + hasTouchScreen = navigator.msMaxTouchPoints > 0; + } else { + const mQ = matchMedia?.('(pointer:coarse)'); + if (mQ?.media === '(pointer:coarse)') { + hasTouchScreen = !!mQ.matches; + } else if ('orientation' in window) { + hasTouchScreen = true; // deprecated, but good fallback + } else { + // @ts-ignore - Only as a last resort, fall back to user agent sniffing + const UA = navigator.userAgent; + hasTouchScreen = + /\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) || + /\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA); + } + } + console.log(hasTouchScreen); + return hasTouchScreen; +} \ No newline at end of file From 7db391d762514c3ed55fba67ba17f2b82729af7b Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Mon, 24 Jul 2023 11:51:15 +0900 Subject: [PATCH 664/782] [search bar] add missing autofocus on lightning dashboard --- .../lightning-dashboard/lightning-dashboard.component.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts index 6fa4b454c..adaa8d115 100644 --- a/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts +++ b/frontend/src/app/lightning/lightning-dashboard/lightning-dashboard.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { AfterViewChecked, ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { share } from 'rxjs/operators'; import { INodesRanking } from '../../interfaces/node-api.interface'; @@ -12,7 +12,7 @@ import { LightningApiService } from '../lightning-api.service'; styleUrls: ['./lightning-dashboard.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class LightningDashboardComponent implements OnInit { +export class LightningDashboardComponent implements OnInit, AfterViewChecked { statistics$: Observable; nodesRanking$: Observable; officialMempoolSpace = this.stateService.env.OFFICIAL_MEMPOOL_SPACE; @@ -30,4 +30,7 @@ export class LightningDashboardComponent implements OnInit { this.statistics$ = this.lightningApiService.getLatestStatistics$().pipe(share()); } + ngAfterViewChecked(): void { + this.stateService.focusSearchInputDesktop(); + } } From ee2d8f8c5a4d42c2ef3700cc56b92caa3cc28637 Mon Sep 17 00:00:00 2001 From: softsimon Date: Mon, 24 Jul 2023 13:21:06 +0900 Subject: [PATCH 665/782] Sanitize channel id search --- backend/src/api/explorer/channels.api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/explorer/channels.api.ts b/backend/src/api/explorer/channels.api.ts index ab29ed2c2..0b1b914fd 100644 --- a/backend/src/api/explorer/channels.api.ts +++ b/backend/src/api/explorer/channels.api.ts @@ -80,7 +80,7 @@ class ChannelsApi { public async $searchChannelsById(search: string): Promise { try { - const searchStripped = search.replace('%', '') + '%'; + const searchStripped = search.replace(/[^0-9x]/g, '') + '%'; const query = `SELECT id, short_id, capacity, status FROM channels WHERE id LIKE ? OR short_id LIKE ? LIMIT 10`; const [rows]: any = await DB.query(query, [searchStripped, searchStripped]); return rows; From 202d4122b4d811dab03ab9eaf0b79c4df6b64be0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 22 Jul 2023 14:09:11 +0900 Subject: [PATCH 666/782] load mempool txs in bulk from esplora --- .../bitcoin/bitcoin-api-abstract-factory.ts | 1 + backend/src/api/bitcoin/bitcoin-api.ts | 4 + backend/src/api/bitcoin/esplora-api.ts | 23 +++++ backend/src/api/mempool.ts | 93 ++++++++++++------- 4 files changed, 86 insertions(+), 35 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts index c233ed5d7..d195b0eeb 100644 --- a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts +++ b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts @@ -3,6 +3,7 @@ import { IEsploraApi } from './esplora-api.interface'; export interface AbstractBitcoinApi { $getRawMempool(): Promise; $getRawTransaction(txId: string, skipConversion?: boolean, addPrevout?: boolean, lazyPrevouts?: boolean): Promise; + $getMempoolTransactions(expectedCount: number); $getTransactionHex(txId: string): Promise; $getBlockHeightTip(): Promise; $getBlockHashTip(): Promise; diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index c045d8664..237c69834 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -59,6 +59,10 @@ class BitcoinApi implements AbstractBitcoinApi { }); } + $getMempoolTransactions(expectedCount: number): Promise { + return Promise.resolve([]); + } + $getTransactionHex(txId: string): Promise { return this.$getRawTransaction(txId, true) .then((tx) => tx.hex || ''); diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 5bfff5730..34de4f94f 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -5,6 +5,8 @@ import { AbstractBitcoinApi } from './bitcoin-api-abstract-factory'; import { IEsploraApi } from './esplora-api.interface'; import logger from '../../logger'; +import JsonStream from 'JSONStream'; + const axiosConnection = axios.create({ httpAgent: new http.Agent({ keepAlive: true, }) }); @@ -69,6 +71,27 @@ class ElectrsApi implements AbstractBitcoinApi { return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId); } + async $getMempoolTransactions(expectedCount: number): Promise { + const transactions: IEsploraApi.Transaction[] = []; + let count = 0; + return new Promise((resolve, reject) => { + axiosConnection.get(config.ESPLORA.REST_API_URL + '/mempool/txs', { ...this.activeAxiosConfig, timeout: 60000, responseType: 'stream' }).then(response => { + response.data.pipe(JsonStream.parse('*')).on('data', transaction => { + count++; + if (count % 10000 === 0) { + logger.info(`Fetched ${count} of ${expectedCount} mempool transactions from esplora`); + } + transactions.push(transaction); + }).on('end', () => { + logger.info(`Fetched all ${count} of ${expectedCount} mempool transactions from esplora`); + resolve(transactions); + }).on('error', (err) => { + reject(err); + }); + }); + }); + } + $getTransactionHex(txId: string): Promise { return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId + '/hex'); } diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index d988ea47a..d0e63ae78 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -1,5 +1,5 @@ import config from '../config'; -import bitcoinApi from './bitcoin/bitcoin-api-factory'; +import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; import { MempoolTransactionExtended, TransactionExtended, VbytesPerSecond } from '../mempool.interfaces'; import logger from '../logger'; import { Common } from './common'; @@ -103,6 +103,16 @@ class Mempool { this.addToSpendMap(Object.values(this.mempoolCache)); } + public async $reloadMempool(expectedCount: number): Promise { + const rawTransactions = await bitcoinApi.$getMempoolTransactions(expectedCount); + logger.info(`Inserting loaded mempool transactions into local cache`); + for (const transaction of rawTransactions) { + const extendedTransaction = transactionUtils.extendMempoolTransaction(transaction); + this.mempoolCache[extendedTransaction.txid] = extendedTransaction; + } + logger.info(`Done inserting loaded mempool transactions into local cache`); + } + public async $updateMemPoolInfo() { this.mempoolInfo = await this.$getMempoolInfo(); } @@ -162,41 +172,54 @@ class Mempool { }; let intervalTimer = Date.now(); - for (const txid of transactions) { - if (!this.mempoolCache[txid]) { - try { - const transaction = await transactionUtils.$getMempoolTransactionExtended(txid, false, false, false); - this.updateTimerProgress(timer, 'fetched new transaction'); - this.mempoolCache[txid] = transaction; - if (this.inSync) { - this.txPerSecondArray.push(new Date().getTime()); - this.vBytesPerSecondArray.push({ - unixTime: new Date().getTime(), - vSize: transaction.vsize, - }); - } - hasChange = true; - newTransactions.push(transaction); - } catch (e: any) { - if (config.MEMPOOL.BACKEND === 'esplora' && e.response?.status === 404) { - this.missingTxCount++; - } - logger.debug(`Error finding transaction '${txid}' in the mempool: ` + (e instanceof Error ? e.message : e)); - } - } - if (Date.now() - intervalTimer > 5_000) { - - if (this.inSync) { - // Break and restart mempool loop if we spend too much time processing - // new transactions that may lead to falling behind on block height - logger.debug('Breaking mempool loop because the 5s time limit exceeded.'); - break; - } else { - const progress = (currentMempoolSize + newTransactions.length) / transactions.length * 100; - logger.debug(`Mempool is synchronizing. Processed ${newTransactions.length}/${diff} txs (${Math.round(progress)}%)`); - loadingIndicators.setProgress('mempool', progress); - intervalTimer = Date.now() + let loaded = false; + if (config.MEMPOOL.BACKEND === 'esplora' && currentMempoolSize < transactions.length * 0.5 && transactions.length > 20_000) { + logger.info(`Missing ${transactions.length - currentMempoolSize} mempool transactions, attempting to reload in bulk from esplora`); + try { + await this.$reloadMempool(transactions.length); + loaded = true; + } catch (e) { + logger.err('failed to load mempool in bulk from esplora, falling back to fetching individual transactions'); + } + } + + if (!loaded) { + for (const txid of transactions) { + if (!this.mempoolCache[txid]) { + try { + const transaction = await transactionUtils.$getMempoolTransactionExtended(txid, false, false, false); + this.updateTimerProgress(timer, 'fetched new transaction'); + this.mempoolCache[txid] = transaction; + if (this.inSync) { + this.txPerSecondArray.push(new Date().getTime()); + this.vBytesPerSecondArray.push({ + unixTime: new Date().getTime(), + vSize: transaction.vsize, + }); + } + hasChange = true; + newTransactions.push(transaction); + } catch (e: any) { + if (config.MEMPOOL.BACKEND === 'esplora' && e.response?.status === 404) { + this.missingTxCount++; + } + logger.debug(`Error finding transaction '${txid}' in the mempool: ` + (e instanceof Error ? e.message : e)); + } + } + + if (Date.now() - intervalTimer > 5_000) { + if (this.inSync) { + // Break and restart mempool loop if we spend too much time processing + // new transactions that may lead to falling behind on block height + logger.debug('Breaking mempool loop because the 5s time limit exceeded.'); + break; + } else { + const progress = (currentMempoolSize + newTransactions.length) / transactions.length * 100; + logger.debug(`Mempool is synchronizing. Processed ${newTransactions.length}/${diff} txs (${Math.round(progress)}%)`); + loadingIndicators.setProgress('mempool', progress); + intervalTimer = Date.now() + } } } } From db715a1dbacd3498150d054e9a5426a328eddc89 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 23 Jul 2023 15:15:16 +0900 Subject: [PATCH 667/782] Switch to batch mempool/txs/:txid endpoint --- backend/src/api/bitcoin/esplora-api.ts | 40 +++++++++++++++----------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 34de4f94f..46b17a4d2 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -5,8 +5,6 @@ import { AbstractBitcoinApi } from './bitcoin-api-abstract-factory'; import { IEsploraApi } from './esplora-api.interface'; import logger from '../../logger'; -import JsonStream from 'JSONStream'; - const axiosConnection = axios.create({ httpAgent: new http.Agent({ keepAlive: true, }) }); @@ -74,22 +72,30 @@ class ElectrsApi implements AbstractBitcoinApi { async $getMempoolTransactions(expectedCount: number): Promise { const transactions: IEsploraApi.Transaction[] = []; let count = 0; - return new Promise((resolve, reject) => { - axiosConnection.get(config.ESPLORA.REST_API_URL + '/mempool/txs', { ...this.activeAxiosConfig, timeout: 60000, responseType: 'stream' }).then(response => { - response.data.pipe(JsonStream.parse('*')).on('data', transaction => { - count++; - if (count % 10000 === 0) { - logger.info(`Fetched ${count} of ${expectedCount} mempool transactions from esplora`); + let done = false; + let last_txid = ''; + while (!done) { + try { + const result = await this.$queryWrapper(config.ESPLORA.REST_API_URL + '/mempool/txs' + (last_txid ? '/' + last_txid : '')); + if (result) { + for (const tx of result) { + transactions.push(tx); + count++; } - transactions.push(transaction); - }).on('end', () => { - logger.info(`Fetched all ${count} of ${expectedCount} mempool transactions from esplora`); - resolve(transactions); - }).on('error', (err) => { - reject(err); - }); - }); - }); + logger.info(`Fetched ${count} of ${expectedCount} mempool transactions from esplora`); + if (result.length > 0) { + last_txid = result[result.length - 1].txid; + } else { + done = true; + } + } else { + done = true; + } + } catch(err) { + logger.err('failed to fetch bulk mempool transactions from esplora'); + } + } + return transactions; } $getTransactionHex(txId: string): Promise { From e59c961f25317d4af2bf394a3116d0ddd16b6d17 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 24 Jul 2023 14:59:51 +0900 Subject: [PATCH 668/782] Add electrs sync progress updates --- .../bitcoin/bitcoin-api-abstract-factory.ts | 2 +- backend/src/api/bitcoin/bitcoin-api.ts | 2 +- backend/src/api/bitcoin/esplora-api.ts | 29 ++-------------- backend/src/api/mempool.ts | 34 ++++++++++++++++--- 4 files changed, 33 insertions(+), 34 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts index d195b0eeb..f610ed883 100644 --- a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts +++ b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts @@ -3,7 +3,7 @@ import { IEsploraApi } from './esplora-api.interface'; export interface AbstractBitcoinApi { $getRawMempool(): Promise; $getRawTransaction(txId: string, skipConversion?: boolean, addPrevout?: boolean, lazyPrevouts?: boolean): Promise; - $getMempoolTransactions(expectedCount: number); + $getMempoolTransactions(lastTxid: string); $getTransactionHex(txId: string): Promise; $getBlockHeightTip(): Promise; $getBlockHashTip(): Promise; diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index 237c69834..3ccea01ef 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -59,7 +59,7 @@ class BitcoinApi implements AbstractBitcoinApi { }); } - $getMempoolTransactions(expectedCount: number): Promise { + $getMempoolTransactions(lastTxid: string): Promise { return Promise.resolve([]); } diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 46b17a4d2..73a44a845 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -69,33 +69,8 @@ class ElectrsApi implements AbstractBitcoinApi { return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/tx/' + txId); } - async $getMempoolTransactions(expectedCount: number): Promise { - const transactions: IEsploraApi.Transaction[] = []; - let count = 0; - let done = false; - let last_txid = ''; - while (!done) { - try { - const result = await this.$queryWrapper(config.ESPLORA.REST_API_URL + '/mempool/txs' + (last_txid ? '/' + last_txid : '')); - if (result) { - for (const tx of result) { - transactions.push(tx); - count++; - } - logger.info(`Fetched ${count} of ${expectedCount} mempool transactions from esplora`); - if (result.length > 0) { - last_txid = result[result.length - 1].txid; - } else { - done = true; - } - } else { - done = true; - } - } catch(err) { - logger.err('failed to fetch bulk mempool transactions from esplora'); - } - } - return transactions; + async $getMempoolTransactions(lastSeenTxid?: string): Promise { + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/mempool/txs' + (lastSeenTxid ? '/' + lastSeenTxid : '')); } $getTransactionHex(txId: string): Promise { diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index d0e63ae78..88533365e 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -9,6 +9,7 @@ import loadingIndicators from './loading-indicators'; import bitcoinClient from './bitcoin/bitcoin-client'; import bitcoinSecondClient from './bitcoin/bitcoin-second-client'; import rbfCache from './rbf-cache'; +import { IEsploraApi } from './bitcoin/esplora-api.interface'; class Mempool { private inSync: boolean = false; @@ -104,11 +105,34 @@ class Mempool { } public async $reloadMempool(expectedCount: number): Promise { - const rawTransactions = await bitcoinApi.$getMempoolTransactions(expectedCount); - logger.info(`Inserting loaded mempool transactions into local cache`); - for (const transaction of rawTransactions) { - const extendedTransaction = transactionUtils.extendMempoolTransaction(transaction); - this.mempoolCache[extendedTransaction.txid] = extendedTransaction; + let count = 0; + let done = false; + let last_txid; + loadingIndicators.setProgress('mempool', count / expectedCount * 100); + while (!done) { + try { + const result = await bitcoinApi.$getMempoolTransactions(last_txid); + if (result) { + for (const tx of result) { + const extendedTransaction = transactionUtils.extendMempoolTransaction(tx); + this.mempoolCache[extendedTransaction.txid] = extendedTransaction; + count++; + } + logger.info(`Fetched ${count} of ${expectedCount} mempool transactions from esplora`); + if (result.length > 0) { + last_txid = result[result.length - 1].txid; + } else { + done = true; + } + if (count < expectedCount) { + loadingIndicators.setProgress('mempool', count / expectedCount * 100); + } + } else { + done = true; + } + } catch(err) { + logger.err('failed to fetch bulk mempool transactions from esplora'); + } } logger.info(`Done inserting loaded mempool transactions into local cache`); } From de4265a6d1b616555d271540ff899fb4db9919e6 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 24 Jul 2023 16:19:19 +0900 Subject: [PATCH 669/782] More conservative mempool inSync status --- backend/src/api/mempool.ts | 15 ++++++++------- backend/src/api/websocket-handler.ts | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 88533365e..9239d6b3b 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -124,7 +124,7 @@ class Mempool { } else { done = true; } - if (count < expectedCount) { + if (Math.floor(count / expectedCount) < 1) { loadingIndicators.setProgress('mempool', count / expectedCount * 100); } } else { @@ -199,6 +199,7 @@ class Mempool { let loaded = false; if (config.MEMPOOL.BACKEND === 'esplora' && currentMempoolSize < transactions.length * 0.5 && transactions.length > 20_000) { + this.inSync = false; logger.info(`Missing ${transactions.length - currentMempoolSize} mempool transactions, attempting to reload in bulk from esplora`); try { await this.$reloadMempool(transactions.length); @@ -293,12 +294,6 @@ class Mempool { const newTransactionsStripped = newTransactions.map((tx) => Common.stripTransaction(tx)); this.latestTransactions = newTransactionsStripped.concat(this.latestTransactions).slice(0, 6); - if (!this.inSync && transactions.length === newMempoolSize) { - this.inSync = true; - logger.notice('The mempool is now in sync!'); - loadingIndicators.setProgress('mempool', 100); - } - this.mempoolCacheDelta = Math.abs(transactions.length - newMempoolSize); if (this.mempoolChangedCallback && (hasChange || deletedTransactions.length)) { @@ -310,6 +305,12 @@ class Mempool { this.updateTimerProgress(timer, 'completed async mempool callback'); } + if (!this.inSync && transactions.length === newMempoolSize) { + this.inSync = true; + logger.notice('The mempool is now in sync!'); + loadingIndicators.setProgress('mempool', 100); + } + const end = new Date().getTime(); const time = end - start; logger.debug(`Mempool updated in ${time / 1000} seconds. New size: ${Object.keys(this.mempoolCache).length} (${diff > 0 ? '+' + diff : diff})`); diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index a0c031175..ccaeb4a8b 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -644,7 +644,7 @@ class WebsocketHandler { memPool.handleMinedRbfTransactions(rbfTransactions); memPool.removeFromSpendMap(transactions); - if (config.MEMPOOL.AUDIT) { + if (config.MEMPOOL.AUDIT && memPool.isInSync()) { let projectedBlocks; let auditMempool = _memPool; // template calculation functions have mempool side effects, so calculate audits using @@ -665,7 +665,7 @@ class WebsocketHandler { projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); } - if (Common.indexingEnabled() && memPool.isInSync()) { + if (Common.indexingEnabled()) { const { censored, added, fresh, sigop, fullrbf, score, similarity } = Audit.auditBlock(transactions, projectedBlocks, auditMempool); const matchRate = Math.round(score * 100 * 100) / 100; From a6edfcc2723b40172d4006123e3170b1feb19d30 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 24 Jul 2023 16:22:35 +0900 Subject: [PATCH 670/782] show mempool skeleton while not inSync --- .../mempool-blocks/mempool-blocks.component.ts | 9 ++++++++- frontend/src/app/services/state.service.ts | 1 + frontend/src/app/services/websocket.service.ts | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index e6d5a4bf6..71075b261 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -117,7 +117,14 @@ export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { }); this.reduceMempoolBlocksToFitScreen(this.mempoolBlocks); this.stateService.isTabHidden$.subscribe((tabHidden) => this.tabHidden = tabHidden); - this.loadingBlocks$ = this.stateService.isLoadingWebSocket$; + this.loadingBlocks$ = combineLatest([ + this.stateService.isLoadingWebSocket$, + this.stateService.isLoadingMempool$ + ]).pipe( + switchMap(([loadingBlocks, loadingMempool]) => { + return of(loadingBlocks || loadingMempool); + }) + ); this.mempoolBlocks$ = merge( of(true), diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 5ebca9ba1..ea00f12ab 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -113,6 +113,7 @@ export class StateService { mempoolTxPosition$ = new Subject<{ txid: string, position: MempoolPosition}>(); blockTransactions$ = new Subject(); isLoadingWebSocket$ = new ReplaySubject(1); + isLoadingMempool$ = new BehaviorSubject(true); vbytesPerSecond$ = new ReplaySubject(1); previousRetarget$ = new ReplaySubject(1); backendInfo$ = new ReplaySubject(1); diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index f32f772ac..e70424cdc 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -368,6 +368,11 @@ export class WebsocketService { if (response.loadingIndicators) { this.stateService.loadingIndicators$.next(response.loadingIndicators); + if (response.loadingIndicators.mempool != null && response.loadingIndicators.mempool < 100) { + this.stateService.isLoadingMempool$.next(true); + } else { + this.stateService.isLoadingMempool$.next(false); + } } if (response.mempoolInfo) { From 2d463326e05d28db251dedacb3418605fe27c5d3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 24 Jul 2023 17:22:38 +0900 Subject: [PATCH 671/782] fix gbt mempool size mismatch bug --- backend/src/api/mempool.ts | 13 +++++++++---- backend/src/api/websocket-handler.ts | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 9239d6b3b..b6ac9e074 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -104,10 +104,11 @@ class Mempool { this.addToSpendMap(Object.values(this.mempoolCache)); } - public async $reloadMempool(expectedCount: number): Promise { + public async $reloadMempool(expectedCount: number): Promise { let count = 0; let done = false; let last_txid; + const newTransactions: MempoolTransactionExtended[] = []; loadingIndicators.setProgress('mempool', count / expectedCount * 100); while (!done) { try { @@ -115,7 +116,10 @@ class Mempool { if (result) { for (const tx of result) { const extendedTransaction = transactionUtils.extendMempoolTransaction(tx); - this.mempoolCache[extendedTransaction.txid] = extendedTransaction; + if (!this.mempoolCache[extendedTransaction.txid]) { + newTransactions.push(extendedTransaction); + this.mempoolCache[extendedTransaction.txid] = extendedTransaction; + } count++; } logger.info(`Fetched ${count} of ${expectedCount} mempool transactions from esplora`); @@ -134,6 +138,7 @@ class Mempool { logger.err('failed to fetch bulk mempool transactions from esplora'); } } + return newTransactions; logger.info(`Done inserting loaded mempool transactions into local cache`); } @@ -177,7 +182,7 @@ class Mempool { const currentMempoolSize = Object.keys(this.mempoolCache).length; this.updateTimerProgress(timer, 'got raw mempool'); const diff = transactions.length - currentMempoolSize; - const newTransactions: MempoolTransactionExtended[] = []; + let newTransactions: MempoolTransactionExtended[] = []; this.mempoolCacheDelta = Math.abs(diff); @@ -202,7 +207,7 @@ class Mempool { this.inSync = false; logger.info(`Missing ${transactions.length - currentMempoolSize} mempool transactions, attempting to reload in bulk from esplora`); try { - await this.$reloadMempool(transactions.length); + newTransactions = await this.$reloadMempool(transactions.length); loaded = true; } catch (e) { logger.err('failed to load mempool in bulk from esplora, falling back to fetching individual transactions'); diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index ccaeb4a8b..56c8513cd 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -604,7 +604,7 @@ class WebsocketHandler { } } - if (client['track-mempool-block'] >= 0) { + if (client['track-mempool-block'] >= 0 && memPool.isInSync()) { const index = client['track-mempool-block']; if (mBlockDeltas[index]) { response['projected-block-transactions'] = getCachedResponse(`projected-block-transactions-${index}`, { @@ -858,7 +858,7 @@ class WebsocketHandler { } } - if (client['track-mempool-block'] >= 0) { + if (client['track-mempool-block'] >= 0 && memPool.isInSync()) { const index = client['track-mempool-block']; if (mBlockDeltas && mBlockDeltas[index]) { response['projected-block-transactions'] = getCachedResponse(`projected-block-transactions-${index}`, { From 36fe5627c70a8ba9b350244f49c5228a000ac62c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 24 Jul 2023 17:49:34 +0900 Subject: [PATCH 672/782] fix mempool sync skeleton loaders on Core backend --- backend/src/api/mempool.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index b6ac9e074..945b78738 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -128,7 +128,7 @@ class Mempool { } else { done = true; } - if (Math.floor(count / expectedCount) < 1) { + if (Math.floor((count / expectedCount) * 100) < 100) { loadingIndicators.setProgress('mempool', count / expectedCount * 100); } } else { @@ -247,7 +247,9 @@ class Mempool { } else { const progress = (currentMempoolSize + newTransactions.length) / transactions.length * 100; logger.debug(`Mempool is synchronizing. Processed ${newTransactions.length}/${diff} txs (${Math.round(progress)}%)`); - loadingIndicators.setProgress('mempool', progress); + if (Math.floor(progress) < 100) { + loadingIndicators.setProgress('mempool', progress); + } intervalTimer = Date.now() } } From 0ebfd6f0170279794e6016b68e57b255423dfa64 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Mon, 24 Jul 2023 16:58:30 +0900 Subject: [PATCH 673/782] Fetch block txs from mempool/electrs in bulk --- .../bitcoin/bitcoin-api-abstract-factory.ts | 1 + backend/src/api/bitcoin/bitcoin-api.ts | 4 ++ backend/src/api/bitcoin/esplora-api.ts | 4 ++ backend/src/api/blocks.ts | 66 +++++++++---------- backend/src/api/transaction-utils.ts | 2 +- 5 files changed, 42 insertions(+), 35 deletions(-) diff --git a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts index f610ed883..7f4a5e53a 100644 --- a/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts +++ b/backend/src/api/bitcoin/bitcoin-api-abstract-factory.ts @@ -8,6 +8,7 @@ export interface AbstractBitcoinApi { $getBlockHeightTip(): Promise; $getBlockHashTip(): Promise; $getTxIdsForBlock(hash: string): Promise; + $getTxsForBlock(hash: string): Promise; $getBlockHash(height: number): Promise; $getBlockHeader(hash: string): Promise; $getBlock(hash: string): Promise; diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index 3ccea01ef..a1cf767d9 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -81,6 +81,10 @@ class BitcoinApi implements AbstractBitcoinApi { .then((rpcBlock: IBitcoinApi.Block) => rpcBlock.tx); } + $getTxsForBlock(hash: string): Promise { + throw new Error('Method getTxsForBlock not supported by the Bitcoin RPC API.'); + } + $getRawBlock(hash: string): Promise { return this.bitcoindClient.getBlock(hash, 0) .then((raw: string) => Buffer.from(raw, "hex")); diff --git a/backend/src/api/bitcoin/esplora-api.ts b/backend/src/api/bitcoin/esplora-api.ts index 73a44a845..ff10751e0 100644 --- a/backend/src/api/bitcoin/esplora-api.ts +++ b/backend/src/api/bitcoin/esplora-api.ts @@ -89,6 +89,10 @@ class ElectrsApi implements AbstractBitcoinApi { return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + '/txids'); } + $getTxsForBlock(hash: string): Promise { + return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block/' + hash + '/txs'); + } + $getBlockHash(height: number): Promise { return this.$queryWrapper(config.ESPLORA.REST_API_URL + '/block-height/' + height); } diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 7cd37f637..1f1c4ebca 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -80,40 +80,38 @@ class Blocks { quiet: boolean = false, addMempoolData: boolean = false, ): Promise { - const transactions: TransactionExtended[] = []; - if (!txIds) { - txIds = await bitcoinApi.$getTxIdsForBlock(blockHash); - } + let transactions: TransactionExtended[] = []; const mempool = memPool.getMempool(); let transactionsFound = 0; let transactionsFetched = 0; - for (let i = 0; i < txIds.length; i++) { - if (mempool[txIds[i]]) { - // We update blocks before the mempool (index.ts), therefore we can - // optimize here by directly fetching txs in the "outdated" mempool - transactions.push(mempool[txIds[i]]); - transactionsFound++; - } else if (config.MEMPOOL.BACKEND === 'esplora' || !memPool.hasPriority() || i === 0) { - // Otherwise we fetch the tx data through backend services (esplora, electrum, core rpc...) - if (!quiet && (i % (Math.round((txIds.length) / 10)) === 0 || i + 1 === txIds.length)) { // Avoid log spam - logger.debug(`Indexing tx ${i + 1} of ${txIds.length} in block #${blockHeight}`); - } - try { - const tx = await transactionUtils.$getTransactionExtended(txIds[i], false, false, false, addMempoolData); - transactions.push(tx); - transactionsFetched++; - } catch (e) { + if (config.MEMPOOL.BACKEND === 'esplora') { + const rawTransactions = await bitcoinApi.$getTxsForBlock(blockHash); + transactions = rawTransactions.map(tx => transactionUtils.extendTransaction(tx)); + + if (!quiet) { + logger.debug(`${transactions.length} fetched through backend service.`); + } + } else { + if (!txIds) { + txIds = await bitcoinApi.$getTxIdsForBlock(blockHash); + } + for (let i = 0; i < txIds.length; i++) { + if (mempool[txIds[i]]) { + // We update blocks before the mempool (index.ts), therefore we can + // optimize here by directly fetching txs in the "outdated" mempool + transactions.push(mempool[txIds[i]]); + transactionsFound++; + } else if (!memPool.hasPriority() || i === 0) { + // Otherwise we fetch the tx data through backend services (esplora, electrum, core rpc...) + if (!quiet && (i % (Math.round((txIds.length) / 10)) === 0 || i + 1 === txIds.length)) { // Avoid log spam + logger.debug(`Indexing tx ${i + 1} of ${txIds.length} in block #${blockHeight}`); + } try { - if (config.MEMPOOL.BACKEND === 'esplora') { - // Try again with core - const tx = await transactionUtils.$getTransactionExtended(txIds[i], false, false, true, addMempoolData); - transactions.push(tx); - transactionsFetched++; - } else { - throw e; - } + const tx = await transactionUtils.$getTransactionExtended(txIds[i], false, false, false, addMempoolData); + transactions.push(tx); + transactionsFetched++; } catch (e) { if (i === 0) { const msg = `Cannot fetch coinbase tx ${txIds[i]}. Reason: ` + (e instanceof Error ? e.message : e); @@ -124,17 +122,17 @@ class Blocks { } } } + + if (onlyCoinbase === true) { + break; // Fetch the first transaction and exit + } } - if (onlyCoinbase === true) { - break; // Fetch the first transaction and exit + if (!quiet) { + logger.debug(`${transactionsFound} of ${txIds.length} found in mempool. ${transactionsFetched} fetched through backend service.`); } } - if (!quiet) { - logger.debug(`${transactionsFound} of ${txIds.length} found in mempool. ${transactionsFetched} fetched through backend service.`); - } - return transactions; } diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index a48c9f259..0b10afdfb 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -53,7 +53,7 @@ class TransactionUtils { return (await this.$getTransactionExtended(txId, addPrevouts, lazyPrevouts, forceCore, true)) as MempoolTransactionExtended; } - private extendTransaction(transaction: IEsploraApi.Transaction): TransactionExtended { + public extendTransaction(transaction: IEsploraApi.Transaction): TransactionExtended { // @ts-ignore if (transaction.vsize) { // @ts-ignore From 25925751eb0f599b5df5fc865a56f27f189b9e3c Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 25 Jul 2023 11:33:13 +0900 Subject: [PATCH 674/782] refactor $getTransactionsExtended to optimise API requests --- backend/src/api/blocks.ts | 114 ++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 47 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 1f1c4ebca..4dbf4305e 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -70,6 +70,9 @@ class Blocks { * @param blockHash * @param blockHeight * @param onlyCoinbase - Set to true if you only need the coinbase transaction + * @param txIds - optional ordered list of transaction ids if already known + * @param quiet - don't print non-essential logs + * @param addMempoolData - calculate sigops etc * @returns Promise */ private async $getTransactionsExtended( @@ -80,60 +83,77 @@ class Blocks { quiet: boolean = false, addMempoolData: boolean = false, ): Promise { - let transactions: TransactionExtended[] = []; + const isEsplora = config.MEMPOOL.BACKEND === 'esplora'; + const transactionMap: { [txid: string]: TransactionExtended } = {}; + + if (!txIds) { + txIds = await bitcoinApi.$getTxIdsForBlock(blockHash); + } const mempool = memPool.getMempool(); - let transactionsFound = 0; - let transactionsFetched = 0; + let foundInMempool = 0; + let totalFound = 0; - if (config.MEMPOOL.BACKEND === 'esplora') { - const rawTransactions = await bitcoinApi.$getTxsForBlock(blockHash); - transactions = rawTransactions.map(tx => transactionUtils.extendTransaction(tx)); - - if (!quiet) { - logger.debug(`${transactions.length} fetched through backend service.`); - } - } else { - if (!txIds) { - txIds = await bitcoinApi.$getTxIdsForBlock(blockHash); - } - for (let i = 0; i < txIds.length; i++) { - if (mempool[txIds[i]]) { - // We update blocks before the mempool (index.ts), therefore we can - // optimize here by directly fetching txs in the "outdated" mempool - transactions.push(mempool[txIds[i]]); - transactionsFound++; - } else if (!memPool.hasPriority() || i === 0) { - // Otherwise we fetch the tx data through backend services (esplora, electrum, core rpc...) - if (!quiet && (i % (Math.round((txIds.length) / 10)) === 0 || i + 1 === txIds.length)) { // Avoid log spam - logger.debug(`Indexing tx ${i + 1} of ${txIds.length} in block #${blockHeight}`); - } - try { - const tx = await transactionUtils.$getTransactionExtended(txIds[i], false, false, false, addMempoolData); - transactions.push(tx); - transactionsFetched++; - } catch (e) { - if (i === 0) { - const msg = `Cannot fetch coinbase tx ${txIds[i]}. Reason: ` + (e instanceof Error ? e.message : e); - logger.err(msg); - throw new Error(msg); - } else { - logger.err(`Cannot fetch tx ${txIds[i]}. Reason: ` + (e instanceof Error ? e.message : e)); - } - } + // Copy existing transactions from the mempool + if (!onlyCoinbase) { + for (const txid of txIds) { + if (mempool[txid]) { + transactionMap[txid] = mempool[txid]; + foundInMempool++; + totalFound++; } - - if (onlyCoinbase === true) { - break; // Fetch the first transaction and exit - } - } - - if (!quiet) { - logger.debug(`${transactionsFound} of ${txIds.length} found in mempool. ${transactionsFetched} fetched through backend service.`); } } - return transactions; + // Skip expensive lookups while mempool has priority + if (onlyCoinbase) { + try { + const coinbase = await transactionUtils.$getTransactionExtended(txIds[0], false, false, false, addMempoolData); + return [coinbase]; + } catch (e) { + const msg = `Cannot fetch coinbase tx ${txIds[0]}. Reason: ` + (e instanceof Error ? e.message : e); + logger.err(msg); + throw new Error(msg); + } + } + + // Fetch remaining txs in bulk + if (isEsplora && (txIds.length - totalFound > 500)) { + try { + const rawTransactions = await bitcoinApi.$getTxsForBlock(blockHash); + for (const tx of rawTransactions) { + if (!transactionMap[tx.txid]) { + transactionMap[tx.txid] = addMempoolData ? transactionUtils.extendMempoolTransaction(tx) : transactionUtils.extendTransaction(tx); + totalFound++; + } + } + } catch (e) { + logger.err(`Cannot fetch bulk txs for block ${blockHash}. Reason: ` + (e instanceof Error ? e.message : e)); + } + } + + // Fetch remaining txs individually + for (const txid of txIds.filter(txid => !transactionMap[txid])) { + if (!transactionMap[txid]) { + if (!quiet && (totalFound % (Math.round((txIds.length) / 10)) === 0 || totalFound + 1 === txIds.length)) { // Avoid log spam + logger.debug(`Indexing tx ${totalFound + 1} of ${txIds.length} in block #${blockHeight}`); + } + try { + const tx = await transactionUtils.$getTransactionExtended(txid, false, false, false, addMempoolData); + transactionMap[txid] = tx; + totalFound++; + } catch (e) { + logger.err(`Cannot fetch tx ${txid}. Reason: ` + (e instanceof Error ? e.message : e)); + } + } + } + + if (!quiet) { + logger.debug(`${foundInMempool} of ${txIds.length} found in mempool. ${totalFound - foundInMempool} fetched through backend service.`); + } + + // Return list of transactions, preserving block order + return txIds.map(txid => transactionMap[txid]).filter(tx => tx != null); } /** From d7b874ac49a1416a71b23cb547a0d3153215a84f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 25 Jul 2023 14:00:17 +0900 Subject: [PATCH 675/782] Exclude all conflicting transactions from audit score --- backend/src/api/audit.ts | 13 +++++++------ backend/src/api/rbf-cache.ts | 18 ++++++++++++++++++ .../components/block-overview-graph/tx-view.ts | 4 ++-- .../block-overview-tooltip.component.html | 2 +- .../app/components/block/block.component.ts | 12 ++++++------ .../src/app/interfaces/node-api.interface.ts | 2 +- .../src/app/interfaces/websocket.interface.ts | 2 +- 7 files changed, 36 insertions(+), 17 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index f7aecfca8..a909fc2b6 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -15,7 +15,7 @@ class Audit { const matches: string[] = []; // present in both mined block and template const added: string[] = []; // present in mined block, not in template const fresh: string[] = []; // missing, but firstSeen or lastBoosted within PROPAGATION_MARGIN - const fullrbf: string[] = []; // either missing or present, and part of a fullrbf replacement + const rbf: string[] = []; // either missing or present, and either part of a full-rbf replacement, or a conflict with the mined block const isCensored = {}; // missing, without excuse const isDisplaced = {}; let displacedWeight = 0; @@ -36,8 +36,9 @@ class Audit { // look for transactions that were expected in the template, but missing from the mined block for (const txid of projectedBlocks[0].transactionIds) { if (!inBlock[txid]) { - if (rbfCache.isFullRbf(txid)) { - fullrbf.push(txid); + // allow missing transactions which either belong to a full rbf tree, or conflict with any transaction in the mined block + if (rbfCache.has(txid) && (rbfCache.isFullRbf(txid) || rbfCache.anyInSameTree(txid, (tx) => inBlock[tx.txid]))) { + rbf.push(txid); } else if (mempool[txid]?.firstSeen != null && (now - (mempool[txid]?.firstSeen || 0)) <= PROPAGATION_MARGIN) { // tx is recent, may have reached the miner too late for inclusion fresh.push(txid); @@ -98,8 +99,8 @@ class Audit { if (inTemplate[tx.txid]) { matches.push(tx.txid); } else { - if (rbfCache.isFullRbf(tx.txid)) { - fullrbf.push(tx.txid); + if (rbfCache.has(tx.txid)) { + rbf.push(tx.txid); } else if (!isDisplaced[tx.txid]) { added.push(tx.txid); } @@ -147,7 +148,7 @@ class Audit { added, fresh, sigop: [], - fullrbf, + fullrbf: rbf, score, similarity, }; diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 367ba1c0e..f28dd0de3 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -100,6 +100,24 @@ class RbfCache { this.dirtyTrees.add(treeId); } + public has(txId: string): boolean { + return this.txs.has(txId); + } + + public anyInSameTree(txId: string, predicate: (tx: RbfTransaction) => boolean): boolean { + const tree = this.getRbfTree(txId); + if (!tree) { + return false; + } + const txs = this.getTransactionsInTree(tree); + for (const tx of txs) { + if (predicate(tx)) { + return true; + } + } + return false; + } + public getReplacedBy(txId: string): string | undefined { return this.replacedBy.get(txId); } diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index 452bb38f5..1b8c88704 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -38,7 +38,7 @@ export default class TxView implements TransactionStripped { value: number; feerate: number; rate?: number; - status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'fullrbf'; + status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf'; context?: 'projected' | 'actual'; scene?: BlockScene; @@ -207,7 +207,7 @@ export default class TxView implements TransactionStripped { return auditColors.censored; case 'missing': case 'sigop': - case 'fullrbf': + case 'rbf': return marginalFeeColors[feeLevelIndex] || marginalFeeColors[mempoolFeeColors.length - 1]; case 'fresh': case 'freshcpfp': diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html index 59450326b..c62779b69 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html @@ -53,7 +53,7 @@
    Recently CPFP'd Added Marginal fee rateFull RBFConflicting
    Added Marginal fee rate ConflictingAccelerated
    Effective fee rateEffective fee rateAccelerated fee rate
    Effective fee rateAccelerated fee rateEffective fee rate
    diff --git a/frontend/src/app/components/transaction/transaction.component.ts b/frontend/src/app/components/transaction/transaction.component.ts index e856f34eb..f1d218a79 100644 --- a/frontend/src/app/components/transaction/transaction.component.ts +++ b/frontend/src/app/components/transaction/transaction.component.ts @@ -183,6 +183,9 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy { } else { this.tx.effectiveFeePerVsize = cpfpInfo.effectiveFeePerVsize; } + if (cpfpInfo.acceleration) { + this.tx.acceleration = cpfpInfo.acceleration; + } this.cpfpInfo = cpfpInfo; this.hasEffectiveFeeRate = hasRelatives || (this.tx.effectiveFeePerVsize && (Math.abs(this.tx.effectiveFeePerVsize - this.tx.feePerVsize) > 0.01)); diff --git a/frontend/src/app/interfaces/electrs.interface.ts b/frontend/src/app/interfaces/electrs.interface.ts index df19f7491..5c15b0ae4 100644 --- a/frontend/src/app/interfaces/electrs.interface.ts +++ b/frontend/src/app/interfaces/electrs.interface.ts @@ -19,6 +19,7 @@ export interface Transaction { ancestors?: Ancestor[]; bestDescendant?: BestDescendant | null; cpfpChecked?: boolean; + acceleration?: number; deleteAfter?: number; _unblinded?: any; _deduced?: boolean; diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 7e7acfcf3..fe6233866 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -27,6 +27,7 @@ export interface CpfpInfo { effectiveFeePerVsize?: number; sigops?: number; adjustedVsize?: number; + acceleration?: number; } export interface RbfInfo { diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index fb3c6d0c2..f8686042b 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -70,7 +70,7 @@ export interface MempoolBlockWithTransactions extends MempoolBlock { export interface MempoolBlockDelta { added: TransactionStripped[], removed: string[], - changed?: { txid: string, rate: number | undefined }[]; + changed?: { txid: string, rate: number | undefined, acc: number | undefined }[]; } export interface MempoolInfo { @@ -88,6 +88,7 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; + acc?: number; // acceleration delta rate?: number; // effective fee rate status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; From c246db1cf9d116a3796d9a5e41c245e6880f9460 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 30 May 2023 19:35:39 -0400 Subject: [PATCH 681/782] Refactor acceleration tracking --- backend/src/api/mempool-blocks.ts | 20 ++++--- backend/src/api/mempool.ts | 72 +++++++++++++++--------- backend/src/api/services/acceleration.ts | 20 +++++++ backend/src/api/websocket-handler.ts | 6 +- 4 files changed, 79 insertions(+), 39 deletions(-) create mode 100644 backend/src/api/services/acceleration.ts diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 81f2092a0..bc0def7a8 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -5,6 +5,7 @@ import { Common, OnlineFeeStatsCalculator } from './common'; import config from '../config'; import { Worker } from 'worker_threads'; import path from 'path'; +import mempool from './mempool'; const MAX_UINT32 = Math.pow(2, 32) - 1; @@ -212,9 +213,11 @@ class MempoolBlocks { // reset mempool short ids this.resetUids(); for (const tx of Object.values(newMempool)) { - this.setUid(tx); + this.setUid(tx, true); } + const accelerations = mempool.getAccelerations(); + // prepare a stripped down version of the mempool with only the minimum necessary data // to reduce the overhead of passing this data to the worker thread const strippedMempool: Map = new Map(); @@ -222,7 +225,7 @@ class MempoolBlocks { if (entry.uid !== null && entry.uid !== undefined) { const stripped = { uid: entry.uid, - fee: entry.fee + (entry.acceleration || 0), + fee: entry.fee + (accelerations[entry.txid] || 0), weight: (entry.adjustedVsize * 4), sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, @@ -273,7 +276,7 @@ class MempoolBlocks { return this.mempoolBlocks; } - public async $updateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], saveResults: boolean = false): Promise { + public async $updateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], accelerationDelta: string[] = [], saveResults: boolean = false): Promise { if (!this.txSelectionWorker) { // need to reset the worker await this.$makeBlockTemplates(newMempool, saveResults); @@ -282,17 +285,20 @@ class MempoolBlocks { const start = Date.now(); - for (const tx of Object.values(added)) { + const accelerations = mempool.getAccelerations(); + const addedAndChanged: MempoolTransactionExtended[] = accelerationDelta.map(txid => newMempool[txid]).filter(tx => tx != null).concat(added); + + for (const tx of addedAndChanged) { this.setUid(tx, true); } - const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => uid != null) as number[]; + // prepare a stripped down version of the mempool with only the minimum necessary data // to reduce the overhead of passing this data to the worker thread - const addedStripped: CompactThreadTransaction[] = added.filter(entry => (entry.uid !== null && entry.uid !== undefined)).map(entry => { + const addedStripped: CompactThreadTransaction[] = addedAndChanged.filter(entry => entry.uid != null).map(entry => { return { uid: entry.uid || 0, - fee: entry.fee + (entry.acceleration || 0), + fee: entry.fee + (accelerations[entry.txid] || 0), weight: (entry.adjustedVsize * 4), sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 8e350c4fe..7bde83df9 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -1,5 +1,5 @@ import config from '../config'; -import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; +import bitcoinApi from './bitcoin/bitcoin-api-factory'; import { MempoolTransactionExtended, TransactionExtended, VbytesPerSecond } from '../mempool.interfaces'; import logger from '../logger'; import { Common } from './common'; @@ -9,7 +9,7 @@ import loadingIndicators from './loading-indicators'; import bitcoinClient from './bitcoin/bitcoin-client'; import bitcoinSecondClient from './bitcoin/bitcoin-second-client'; import rbfCache from './rbf-cache'; -import { IEsploraApi } from './bitcoin/esplora-api.interface'; +import accelerationApi from './services/acceleration'; class Mempool { private inSync: boolean = false; @@ -19,9 +19,9 @@ class Mempool { private mempoolInfo: IBitcoinApi.MempoolInfo = { loaded: false, size: 0, bytes: 0, usage: 0, total_fee: 0, maxmempool: 300000000, mempoolminfee: 0.00001000, minrelaytxfee: 0.00001000 }; private mempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, newTransactions: MempoolTransactionExtended[], - deletedTransactions: MempoolTransactionExtended[]) => void) | undefined; + deletedTransactions: MempoolTransactionExtended[], accelerationDelta: string[]) => void) | undefined; private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, mempoolSize: number, newTransactions: MempoolTransactionExtended[], - deletedTransactions: MempoolTransactionExtended[]) => Promise) | undefined; + deletedTransactions: MempoolTransactionExtended[], accelerationDelta: string[]) => Promise) | undefined; private accelerations: { [txId: string]: number } = {}; @@ -68,12 +68,12 @@ class Mempool { } public setMempoolChangedCallback(fn: (newMempool: { [txId: string]: MempoolTransactionExtended; }, - newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]) => void): void { + newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[], accelerationDelta: string[]) => void): void { this.mempoolChangedCallback = fn; } public setAsyncMempoolChangedCallback(fn: (newMempool: { [txId: string]: MempoolTransactionExtended; }, mempoolSize: number, - newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]) => Promise): void { + newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[], accelerationDelta: string[]) => Promise): void { this.$asyncMempoolChangedCallback = fn; } @@ -98,10 +98,10 @@ class Mempool { count++; } if (this.mempoolChangedCallback) { - this.mempoolChangedCallback(this.mempoolCache, [], []); + this.mempoolChangedCallback(this.mempoolCache, [], [], []); } if (this.$asyncMempoolChangedCallback) { - await this.$asyncMempoolChangedCallback(this.mempoolCache, count, [], []); + await this.$asyncMempoolChangedCallback(this.mempoolCache, count, [], [], []); } this.addToSpendMap(Object.values(this.mempoolCache)); } @@ -303,25 +303,19 @@ class Mempool { const newTransactionsStripped = newTransactions.map((tx) => Common.stripTransaction(tx)); this.latestTransactions = newTransactionsStripped.concat(this.latestTransactions).slice(0, 6); - const newAccelerations: { txid: string, delta: number }[] = []; - newTransactions.forEach(tx => { - if (tx.txid.startsWith('00')) { - const delta = Math.floor(Math.random() * 100000) + 100000; - newAccelerations.push({ txid: tx.txid, delta }); - tx.acceleration = delta; - } - }); - this.addAccelerations(newAccelerations); - this.removeAccelerations(deletedTransactions.map(tx => tx.txid)); + const accelerationDelta = await this.$updateAccelerations(); + if (accelerationDelta.length) { + hasChange = true; + } this.mempoolCacheDelta = Math.abs(transactions.length - newMempoolSize); if (this.mempoolChangedCallback && (hasChange || deletedTransactions.length)) { - this.mempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions); + this.mempoolChangedCallback(this.mempoolCache, newTransactions, deletedTransactions, accelerationDelta); } if (this.$asyncMempoolChangedCallback && (hasChange || deletedTransactions.length)) { this.updateTimerProgress(timer, 'running async mempool callback'); - await this.$asyncMempoolChangedCallback(this.mempoolCache, newMempoolSize, newTransactions, deletedTransactions); + await this.$asyncMempoolChangedCallback(this.mempoolCache, newMempoolSize, newTransactions, deletedTransactions, accelerationDelta); this.updateTimerProgress(timer, 'completed async mempool callback'); } @@ -342,15 +336,37 @@ class Mempool { return this.accelerations; } - public addAccelerations(newAccelerations: { txid: string, delta: number }[]): void { - for (const acceleration of newAccelerations) { - this.accelerations[acceleration.txid] = acceleration.delta; - } - } + public async $updateAccelerations(): Promise { + try { + const newAccelerations = await accelerationApi.fetchAccelerations$(); - public removeAccelerations(txids: string[]): void { - for (const txid of txids) { - delete this.accelerations[txid]; + const changed: string[] = []; + + const newAccelerationMap: { [txid: string]: number } = {}; + for (const acceleration of newAccelerations) { + newAccelerationMap[acceleration.txid] = acceleration.feeDelta; + if (this.accelerations[acceleration.txid] == null) { + // new acceleration + changed.push(acceleration.txid); + } else if (this.accelerations[acceleration.txid] !== acceleration.feeDelta) { + // feeDelta changed + changed.push(acceleration.txid); + } + } + + for (const oldTxid of Object.keys(this.accelerations)) { + if (!newAccelerationMap[oldTxid]) { + // removed + changed.push(oldTxid); + } + } + + this.accelerations = newAccelerationMap; + + return changed; + } catch (e: any) { + logger.debug(`Failed to update accelerations: ` + (e instanceof Error ? e.message : e)); + return []; } } diff --git a/backend/src/api/services/acceleration.ts b/backend/src/api/services/acceleration.ts new file mode 100644 index 000000000..efbf32f5d --- /dev/null +++ b/backend/src/api/services/acceleration.ts @@ -0,0 +1,20 @@ +import { query } from '../../utils/axios-query'; +import config from '../../config'; + +export interface Acceleration { + txid: string, + feeDelta: number, +} + +class AccelerationApi { + public async fetchAccelerations$(): Promise { + if (config.MEMPOOL_SERVICES.ACCELERATIONS) { + const response = await query(`${config.MEMPOOL_SERVICES.API}/accelerations`); + return (response as Acceleration[]) || []; + } else { + return []; + } + } +} + +export default new AccelerationApi(); \ No newline at end of file diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index a33a0f0fa..3a90b29f4 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -381,7 +381,7 @@ class WebsocketHandler { } async $handleMempoolChange(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, - newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[]): Promise { + newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[], accelerationDelta: string[]): Promise { if (!this.wss) { throw new Error('WebSocket.Server is not set'); } @@ -392,7 +392,7 @@ class WebsocketHandler { if (config.MEMPOOL.RUST_GBT) { await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, mempoolSize, newTransactions, deletedTransactions); } else { - await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, true); + await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, accelerationDelta, true); } } else { mempoolBlocks.updateMempoolBlocks(newMempool, true); @@ -738,8 +738,6 @@ class WebsocketHandler { const fees = feeApi.getRecommendedFee(); const mempoolInfo = memPool.getMempoolInfo(); - memPool.removeAccelerations(txIds); - // update init data this.updateSocketDataFields({ 'mempoolInfo': mempoolInfo, From 20b3ceab1e318e088c8e2d9e266d367143c64bbc Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 30 May 2023 19:51:11 -0400 Subject: [PATCH 682/782] Implement accelerations API & config setting --- backend/mempool-config.sample.json | 4 ++++ .../src/__fixtures__/mempool-config.template.json | 4 ++++ backend/src/__tests__/config.test.ts | 7 +++++++ backend/src/api/mempool.ts | 4 ++++ backend/src/config.ts | 12 +++++++++++- docker/backend/mempool-config.json | 4 ++++ docker/backend/start.sh | 9 +++++++++ 7 files changed, 43 insertions(+), 1 deletion(-) diff --git a/backend/mempool-config.sample.json b/backend/mempool-config.sample.json index e3df7d2fe..8f8b82475 100644 --- a/backend/mempool-config.sample.json +++ b/backend/mempool-config.sample.json @@ -136,5 +136,9 @@ "trusted", "servers" ] + }, + "MEMPOOL_SERVICES": { + "API": "https://mempool.space/api", + "ACCELERATIONS": false } } diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index 4213f0ffb..d6754f966 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -127,5 +127,9 @@ "AUDIT": false, "AUDIT_START_HEIGHT": 774000, "SERVERS": [] + }, + "MEMPOOl_SERVICES": { + "API": "__MEMPOOL_SERVICES_API__", + "ACCELERATIONS": "__MEMPOOL_SERVICES_ACCELERATIONS__" } } diff --git a/backend/src/__tests__/config.test.ts b/backend/src/__tests__/config.test.ts index dc1beaa46..2c83d1af5 100644 --- a/backend/src/__tests__/config.test.ts +++ b/backend/src/__tests__/config.test.ts @@ -127,6 +127,11 @@ describe('Mempool Backend Config', () => { AUDIT_START_HEIGHT: 774000, SERVERS: [] }); + + expect(config.MEMPOOL_SERVICES).toStrictEqual({ + API: "", + ACCELERATIONS: false, + }); }); }); @@ -160,6 +165,8 @@ describe('Mempool Backend Config', () => { expect(config.PRICE_DATA_SERVER).toStrictEqual(fixture.PRICE_DATA_SERVER); expect(config.EXTERNAL_DATA_SERVER).toStrictEqual(fixture.EXTERNAL_DATA_SERVER); + + expect(config.MEMPOOL_SERVICES).toStrictEqual(fixture.MEMPOOL_SERVICES); }); }); diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 7bde83df9..b114c89fc 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -337,6 +337,10 @@ class Mempool { } public async $updateAccelerations(): Promise { + if (!config.MEMPOOL_SERVICES.ACCELERATIONS) { + return []; + } + try { const newAccelerations = await accelerationApi.fetchAccelerations$(); diff --git a/backend/src/config.ts b/backend/src/config.ts index 09d279537..ceb569e06 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -137,7 +137,11 @@ interface IConfig { AUDIT: boolean; AUDIT_START_HEIGHT: number; SERVERS: string[]; - } + }, + MEMPOOL_SERVICES: { + API: string; + ACCELERATIONS: boolean; + }, } const defaults: IConfig = { @@ -275,6 +279,10 @@ const defaults: IConfig = { 'AUDIT': false, 'AUDIT_START_HEIGHT': 774000, 'SERVERS': [], + }, + 'MEMPOOL_SERVICES': { + 'API': '', + 'ACCELERATIONS': false, } }; @@ -296,6 +304,7 @@ class Config implements IConfig { EXTERNAL_DATA_SERVER: IConfig['EXTERNAL_DATA_SERVER']; MAXMIND: IConfig['MAXMIND']; REPLICATION: IConfig['REPLICATION']; + MEMPOOL_SERVICES: IConfig['MEMPOOL_SERVICES']; constructor() { const configs = this.merge(configFromFile, defaults); @@ -316,6 +325,7 @@ class Config implements IConfig { this.EXTERNAL_DATA_SERVER = configs.EXTERNAL_DATA_SERVER; this.MAXMIND = configs.MAXMIND; this.REPLICATION = configs.REPLICATION; + this.MEMPOOL_SERVICES = configs.MEMPOOL_SERVICES; } merge = (...objects: object[]): IConfig => { diff --git a/docker/backend/mempool-config.json b/docker/backend/mempool-config.json index 2ff76d5dd..71fe3bd65 100644 --- a/docker/backend/mempool-config.json +++ b/docker/backend/mempool-config.json @@ -133,5 +133,9 @@ "AUDIT": __REPLICATION_AUDIT__, "AUDIT_START_HEIGHT": __REPLICATION_AUDIT_START_HEIGHT__, "SERVERS": __REPLICATION_SERVERS__ + }, + "MEMPOOL_SERVICES": { + "API": "__MEMPOOL_SERVICES_API__", + "ACCELERATIONS": __MEMPOOL_SERVICES_ACCELERATIONS__ } } diff --git a/docker/backend/start.sh b/docker/backend/start.sh index c34d804b4..66f873605 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -136,6 +136,10 @@ __REPLICATION_AUDIT__=${REPLICATION_AUDIT:=true} __REPLICATION_AUDIT_START_HEIGHT__=${REPLICATION_AUDIT_START_HEIGHT:=774000} __REPLICATION_SERVERS__=${REPLICATION_SERVERS:=[]} +# MEMPOOL_SERVICES +__MEMPOOL_SERVICES_API__==${MEMPOOL_SERVICES_API:=""} +__MEMPOOL_SERVICES_ACCELERATIONS__==${MEMPOOL_SERVICES_ACCELERATIONS:=false} + mkdir -p "${__MEMPOOL_CACHE_DIR__}" @@ -262,4 +266,9 @@ sed -i "s!__REPLICATION_AUDIT__!${__REPLICATION_AUDIT__}!g" mempool-config.json sed -i "s!__REPLICATION_AUDIT_START_HEIGHT__!${__REPLICATION_AUDIT_START_HEIGHT__}!g" mempool-config.json sed -i "s!__REPLICATION_SERVERS__!${__REPLICATION_SERVERS__}!g" mempool-config.json +# MEMPOOL_SERVICES +sed -i "s!__MEMPOOL_SERVICES_API__!${__MEMPOOL_SERVICES_API__}!g" mempool-config.json +sed -i "s!__MEMPOOL_SERVICES_ACCELERATIONS__!${__MEMPOOL_SERVICES_ACCELERATIONS__}!g" mempool-config.json + + node /backend/package/index.js From 083bfdba06875fd8d254b16c6db9a6070b6b2d0d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 3 Jun 2023 16:54:12 -0400 Subject: [PATCH 683/782] Refactor accelerated audits --- backend/src/api/audit.ts | 4 ++-- backend/src/api/mempool-blocks.ts | 28 +++++++++++++----------- backend/src/api/mempool.ts | 2 +- backend/src/api/services/acceleration.ts | 20 ++++++++++++++++- backend/src/api/websocket-handler.ts | 17 ++++++++++---- 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/backend/src/api/audit.ts b/backend/src/api/audit.ts index 9710d0362..e78b2796f 100644 --- a/backend/src/api/audit.ts +++ b/backend/src/api/audit.ts @@ -6,7 +6,7 @@ import rbfCache from './rbf-cache'; const PROPAGATION_MARGIN = 180; // in seconds, time since a transaction is first seen after which it is assumed to have propagated to all miners class Audit { - auditBlock(transactions: MempoolTransactionExtended[], projectedBlocks: MempoolBlockWithTransactions[], mempool: { [txId: string]: MempoolTransactionExtended }) + auditBlock(transactions: MempoolTransactionExtended[], projectedBlocks: MempoolBlockWithTransactions[], mempool: { [txId: string]: MempoolTransactionExtended }, useAccelerations: boolean = false) : { censored: string[], added: string[], fresh: string[], sigop: string[], fullrbf: string[], accelerated: string[], score: number, similarity: number } { if (!projectedBlocks?.[0]?.transactionIds || !mempool) { return { censored: [], added: [], fresh: [], sigop: [], fullrbf: [], accelerated: [], score: 0, similarity: 1 }; @@ -29,7 +29,7 @@ class Audit { const now = Math.round((Date.now() / 1000)); for (const tx of transactions) { inBlock[tx.txid] = tx; - if (tx.acceleration) { + if (mempool[tx.txid] && mempool[tx.txid].acceleration) { accelerated.push(tx.txid); } } diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index bc0def7a8..0ce0ea522 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -207,7 +207,7 @@ class MempoolBlocks { return mempoolBlockDeltas; } - public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): Promise { + public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, useAccelerations: boolean = false): Promise { const start = Date.now(); // reset mempool short ids @@ -216,7 +216,7 @@ class MempoolBlocks { this.setUid(tx, true); } - const accelerations = mempool.getAccelerations(); + const accelerations = useAccelerations ? mempool.getAccelerations() : {}; // prepare a stripped down version of the mempool with only the minimum necessary data // to reduce the overhead of passing this data to the worker thread @@ -225,7 +225,7 @@ class MempoolBlocks { if (entry.uid !== null && entry.uid !== undefined) { const stripped = { uid: entry.uid, - fee: entry.fee + (accelerations[entry.txid] || 0), + fee: entry.fee + (useAccelerations ? (accelerations[entry.txid] || 0) : 0), weight: (entry.adjustedVsize * 4), sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, @@ -265,7 +265,7 @@ class MempoolBlocks { // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - const processed = this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), saveResults); + const processed = this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), accelerations, saveResults); logger.debug(`makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); @@ -276,17 +276,17 @@ class MempoolBlocks { return this.mempoolBlocks; } - public async $updateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], accelerationDelta: string[] = [], saveResults: boolean = false): Promise { + public async $updateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], accelerationDelta: string[] = [], saveResults: boolean = false, useAccelerations: boolean = false): Promise { if (!this.txSelectionWorker) { // need to reset the worker - await this.$makeBlockTemplates(newMempool, saveResults); + await this.$makeBlockTemplates(newMempool, saveResults, useAccelerations); return; } const start = Date.now(); - const accelerations = mempool.getAccelerations(); - const addedAndChanged: MempoolTransactionExtended[] = accelerationDelta.map(txid => newMempool[txid]).filter(tx => tx != null).concat(added); + const accelerations = useAccelerations ? mempool.getAccelerations() : {}; + const addedAndChanged: MempoolTransactionExtended[] = useAccelerations ? accelerationDelta.map(txid => newMempool[txid]).filter(tx => tx != null).concat(added) : added; for (const tx of addedAndChanged) { this.setUid(tx, true); @@ -298,7 +298,7 @@ class MempoolBlocks { const addedStripped: CompactThreadTransaction[] = addedAndChanged.filter(entry => entry.uid != null).map(entry => { return { uid: entry.uid || 0, - fee: entry.fee + (accelerations[entry.txid] || 0), + fee: entry.fee + (useAccelerations ? (accelerations[entry.txid] || 0) : 0), weight: (entry.adjustedVsize * 4), sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, @@ -325,7 +325,7 @@ class MempoolBlocks { // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), saveResults); + this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), accelerations, saveResults); logger.debug(`updateBlockTemplates completed in ${(Date.now() - start) / 1000} seconds`); } catch (e) { logger.err('updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); @@ -362,7 +362,7 @@ class MempoolBlocks { if (saveResults) { this.rustInitialized = true; } - const processed = this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, saveResults); + const processed = this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, {}, saveResults); logger.debug(`RUST makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); return processed; } catch (e) { @@ -414,7 +414,7 @@ class MempoolBlocks { if (mempoolSize !== resultMempoolSize) { throw new Error('GBT returned wrong number of transactions, cache is probably out of sync'); } else { - this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, true); + this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, {}, true); } this.removeUids(removedUids); logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); @@ -424,7 +424,7 @@ class MempoolBlocks { } } - private processBlockTemplates(mempool: { [txid: string]: MempoolTransactionExtended }, blocks: string[][], blockWeights: number[] | null, rates: [string, number][], clusters: string[][], saveResults): MempoolBlockWithTransactions[] { + private processBlockTemplates(mempool: { [txid: string]: MempoolTransactionExtended }, blocks: string[][], blockWeights: number[] | null, rates: [string, number][], clusters: string[][], accelerations, saveResults): MempoolBlockWithTransactions[] { for (const [txid, rate] of rates) { if (txid in mempool) { mempool[txid].effectiveFeePerVsize = rate; @@ -503,6 +503,8 @@ class MempoolBlocks { mempoolTx.cpfpChecked = true; } + mempoolTx.acceleration = accelerations[txid]; + // online calculation of stack-of-blocks fee stats if (hasBlockStack && blockIndex === lastBlockIndex && feeStatsCalculator) { feeStatsCalculator.processNext(mempoolTx); diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index b114c89fc..4efe17731 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -342,7 +342,7 @@ class Mempool { } try { - const newAccelerations = await accelerationApi.fetchAccelerations$(); + const newAccelerations = await accelerationApi.$fetchAccelerations(); const changed: string[] = []; diff --git a/backend/src/api/services/acceleration.ts b/backend/src/api/services/acceleration.ts index efbf32f5d..8c849cdd8 100644 --- a/backend/src/api/services/acceleration.ts +++ b/backend/src/api/services/acceleration.ts @@ -1,5 +1,6 @@ import { query } from '../../utils/axios-query'; import config from '../../config'; +import { BlockExtended, PoolTag } from '../../mempool.interfaces'; export interface Acceleration { txid: string, @@ -7,7 +8,7 @@ export interface Acceleration { } class AccelerationApi { - public async fetchAccelerations$(): Promise { + public async $fetchAccelerations(): Promise { if (config.MEMPOOL_SERVICES.ACCELERATIONS) { const response = await query(`${config.MEMPOOL_SERVICES.API}/accelerations`); return (response as Acceleration[]) || []; @@ -15,6 +16,23 @@ class AccelerationApi { return []; } } + + public async $fetchPools(): Promise { + if (config.MEMPOOL_SERVICES.ACCELERATIONS) { + const response = await query(`${config.MEMPOOL_SERVICES.API}/partners`); + return (response as PoolTag[]) || []; + } else { + return []; + } + } + + public async $isAcceleratedBlock(block: BlockExtended): Promise { + const pools = await this.$fetchPools(); + if (block?.extras?.pool?.id == null) { + return false; + } + return pools.reduce((match, tag) => match || tag.uniqueId === block.extras.pool.id, false); + } } export default new AccelerationApi(); \ No newline at end of file diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 3a90b29f4..51fccbcbb 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -21,7 +21,7 @@ import Audit from './audit'; import { deepClone } from '../utils/clone'; import priceUpdater from '../tasks/price-updater'; import { ApiPrice } from '../repositories/PricesRepository'; -import mempool from './mempool'; +import accelerationApi from './services/acceleration'; // valid 'want' subscriptions const wantable = [ @@ -392,7 +392,7 @@ class WebsocketHandler { if (config.MEMPOOL.RUST_GBT) { await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, mempoolSize, newTransactions, deletedTransactions); } else { - await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, accelerationDelta, true); + await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, accelerationDelta, true, config.MEMPOOL_SERVICES.ACCELERATIONS); } } else { mempoolBlocks.updateMempoolBlocks(newMempool, true); @@ -648,6 +648,7 @@ class WebsocketHandler { if (config.MEMPOOL.AUDIT && memPool.isInSync()) { let projectedBlocks; let auditMempool = _memPool; + const isAccelerated = config.MEMPOOL_SERVICES.ACCELERATIONS && await accelerationApi.$isAcceleratedBlock(block); // template calculation functions have mempool side effects, so calculate audits using // a cloned copy of the mempool if we're running a different algorithm for mempool updates const separateAudit = config.MEMPOOL.ADVANCED_GBT_AUDIT !== config.MEMPOOL.ADVANCED_GBT_MEMPOOL; @@ -657,13 +658,17 @@ class WebsocketHandler { if (config.MEMPOOL.RUST_GBT) { projectedBlocks = await mempoolBlocks.$oneOffRustBlockTemplates(auditMempool); } else { - projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false); + projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated); } } else { projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false); } } else { - projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); + if ((config.MEMPOOL_SERVICES.ACCELERATIONS && !isAccelerated)) { + projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated); + } else { + projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); + } } if (Common.indexingEnabled()) { @@ -723,11 +728,15 @@ class WebsocketHandler { } if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { +<<<<<<< HEAD if (config.MEMPOOL.RUST_GBT) { await mempoolBlocks.$rustUpdateBlockTemplates(_memPool, Object.keys(_memPool).length, [], transactions); } else { await mempoolBlocks.$makeBlockTemplates(_memPool, true); } +======= + await mempoolBlocks.$makeBlockTemplates(_memPool, true, config.MEMPOOL_SERVICES.ACCELERATIONS); +>>>>>>> 77b0a8ecc (Refactor accelerated audits) } else { mempoolBlocks.updateMempoolBlocks(_memPool, true); } From ba54bc9d1593076a9ce380216580731df22518bb Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 13 Jun 2023 13:35:25 -0400 Subject: [PATCH 684/782] support for acceleration mempool blocks animation --- backend/src/api/websocket-handler.ts | 24 ++++++++++----- .../mempool-blocks.component.html | 2 +- .../mempool-blocks.component.scss | 30 +++++++++++++++++++ .../mempool-blocks.component.ts | 1 + .../transaction/transaction.component.html | 4 +-- .../src/app/interfaces/node-api.interface.ts | 1 + 6 files changed, 51 insertions(+), 11 deletions(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 51fccbcbb..7716ed7b7 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -173,9 +173,15 @@ class WebsocketHandler { } const tx = memPool.getMempool()[trackTxid]; if (tx && tx.position) { + const position: { block: number, vsize: number, accelerated?: number } = { + ...tx.position + }; + if (tx.acceleration) { + position.accelerated = tx.acceleration; + } response['txPosition'] = JSON.stringify({ txid: trackTxid, - position: tx.position, + position }); } } else { @@ -600,7 +606,10 @@ class WebsocketHandler { if (mempoolTx && mempoolTx.position) { response['txPosition'] = JSON.stringify({ txid: trackTxid, - position: mempoolTx.position, + position: { + ...mempoolTx.position, + accelerated: mempoolTx.acceleration || undefined, + } }); } } @@ -728,15 +737,11 @@ class WebsocketHandler { } if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { -<<<<<<< HEAD if (config.MEMPOOL.RUST_GBT) { await mempoolBlocks.$rustUpdateBlockTemplates(_memPool, Object.keys(_memPool).length, [], transactions); } else { - await mempoolBlocks.$makeBlockTemplates(_memPool, true); + await mempoolBlocks.$makeBlockTemplates(_memPool, true, config.MEMPOOL_SERVICES.ACCELERATIONS); } -======= - await mempoolBlocks.$makeBlockTemplates(_memPool, true, config.MEMPOOL_SERVICES.ACCELERATIONS); ->>>>>>> 77b0a8ecc (Refactor accelerated audits) } else { mempoolBlocks.updateMempoolBlocks(_memPool, true); } @@ -799,7 +804,10 @@ class WebsocketHandler { if (mempoolTx && mempoolTx.position) { response['txPosition'] = JSON.stringify({ txid: trackTxid, - position: mempoolTx.position, + position: { + ...mempoolTx.position, + accelerated: mempoolTx.acceleration || undefined, + } }); } } diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html index 9c5c338c0..59d35c91e 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.html @@ -49,7 +49,7 @@
    -
    +
    diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss index 40f43a015..606699d93 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.scss @@ -169,4 +169,34 @@ transform: translate(calc(-0.2 * var(--block-size)), calc(1.1 * var(--block-size))); border-radius: 2px; z-index: -1; +} + +.blink{ + width:400px; + height:400px; + border-bottom: 35px solid #FFF; + animation: blink 0.2s infinite; +} +@keyframes blink{ + 0% { + border-bottom: 35px solid green; + } + 50% { + border-bottom: 35px solid yellow; + } + 100% { + border-bottom: 35px solid orange; + } +} + +@-webkit-keyframes blink{ + 0% { + border-bottom: 35px solid green; + } + 50% { + border-bottom: 35px solid yellow; + } + 100% { + border-bottom: 35px solid orange; + } } \ No newline at end of file diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts index 71075b261..33db897a5 100644 --- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts +++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts @@ -26,6 +26,7 @@ import { animate, style, transition, trigger } from '@angular/animations'; export class MempoolBlocksComponent implements OnInit, OnChanges, OnDestroy { @Input() minimal: boolean = false; @Input() blockWidth: number = 125; + @Input() containerWidth: number = null; @Input() count: number = null; @Input() spotlight: number = 0; @Input() getHref?: (index) => string = (index) => `/mempool-block/${index}`; diff --git a/frontend/src/app/components/transaction/transaction.component.html b/frontend/src/app/components/transaction/transaction.component.html index 81a6106db..7422c6894 100644 --- a/frontend/src/app/components/transaction/transaction.component.html +++ b/frontend/src/app/components/transaction/transaction.component.html @@ -488,8 +488,8 @@
    Accelerated fee rateEffective fee rateAccelerated fee rateEffective fee rate
    diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index fe6233866..a0a3da5e6 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -188,6 +188,7 @@ export interface RbfTransaction extends TransactionStripped { export interface MempoolPosition { block: number, vsize: number, + accelerated?: boolean } export interface RewardStats { From 6494f890fe587655e5ce3c6ef56633402f3823d4 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 13 Jun 2023 17:03:36 -0400 Subject: [PATCH 685/782] include per-tx pools in /accelerations endpoint --- backend/src/api/mempool-blocks.ts | 8 +++--- backend/src/api/mempool.ts | 36 +++++++++++++++++++----- backend/src/api/services/acceleration.ts | 20 ++++--------- backend/src/api/websocket-handler.ts | 5 ++-- 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 0ce0ea522..606c98c83 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,6 +1,6 @@ import { GbtGenerator, GbtResult, ThreadTransaction as RustThreadTransaction } from '../../rust-gbt'; import logger from '../logger'; -import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats } from '../mempool.interfaces'; +import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, PoolTag } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; import config from '../config'; import { Worker } from 'worker_threads'; @@ -207,7 +207,7 @@ class MempoolBlocks { return mempoolBlockDeltas; } - public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, useAccelerations: boolean = false): Promise { + public async $makeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, useAccelerations: boolean = false, accelerationPool?: number): Promise { const start = Date.now(); // reset mempool short ids @@ -225,7 +225,7 @@ class MempoolBlocks { if (entry.uid !== null && entry.uid !== undefined) { const stripped = { uid: entry.uid, - fee: entry.fee + (useAccelerations ? (accelerations[entry.txid] || 0) : 0), + fee: entry.fee + (useAccelerations && (!accelerationPool || accelerations[entry.txid]?.pools?.includes(accelerationPool)) ? (accelerations[entry.txid]?.feeDelta || 0) : 0), weight: (entry.adjustedVsize * 4), sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, @@ -298,7 +298,7 @@ class MempoolBlocks { const addedStripped: CompactThreadTransaction[] = addedAndChanged.filter(entry => entry.uid != null).map(entry => { return { uid: entry.uid || 0, - fee: entry.fee + (useAccelerations ? (accelerations[entry.txid] || 0) : 0), + fee: entry.fee + (useAccelerations ? (accelerations[entry.txid]?.feeDelta || 0) : 0), weight: (entry.adjustedVsize * 4), sigops: entry.sigops, feePerVsize: entry.adjustedFeePerVsize || entry.feePerVsize, diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 4efe17731..107aa41cb 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -23,7 +23,7 @@ class Mempool { private $asyncMempoolChangedCallback: ((newMempool: {[txId: string]: MempoolTransactionExtended; }, mempoolSize: number, newTransactions: MempoolTransactionExtended[], deletedTransactions: MempoolTransactionExtended[], accelerationDelta: string[]) => Promise) | undefined; - private accelerations: { [txId: string]: number } = {}; + private accelerations: { [txId: string]: Acceleration } = {}; private txPerSecondArray: number[] = []; private txPerSecond: number = 0; @@ -332,7 +332,7 @@ class Mempool { this.clearTimer(timer); } - public getAccelerations(): { [txid: string]: number } { + public getAccelerations(): { [txid: string]: Acceleration } { return this.accelerations; } @@ -346,15 +346,37 @@ class Mempool { const changed: string[] = []; - const newAccelerationMap: { [txid: string]: number } = {}; + const newAccelerationMap: { [txid: string]: Acceleration } = {}; for (const acceleration of newAccelerations) { - newAccelerationMap[acceleration.txid] = acceleration.feeDelta; + newAccelerationMap[acceleration.txid] = acceleration; if (this.accelerations[acceleration.txid] == null) { // new acceleration changed.push(acceleration.txid); - } else if (this.accelerations[acceleration.txid] !== acceleration.feeDelta) { - // feeDelta changed - changed.push(acceleration.txid); + } else { + if (this.accelerations[acceleration.txid].feeDelta !== acceleration.feeDelta) { + // feeDelta changed + changed.push(acceleration.txid); + } else if (this.accelerations[acceleration.txid].pools?.length) { + let poolsChanged = false; + const pools = new Set(); + this.accelerations[acceleration.txid].pools.forEach(pool => { + pools.add(pool); + }); + acceleration.pools.forEach(pool => { + if (!pools.has(pool)) { + poolsChanged = true; + } else { + pools.delete(pool); + } + }); + if (pools.size > 0) { + poolsChanged = true; + } + if (poolsChanged) { + // pools changed + changed.push(acceleration.txid); + } + } } } diff --git a/backend/src/api/services/acceleration.ts b/backend/src/api/services/acceleration.ts index 8c849cdd8..1c2fff7c6 100644 --- a/backend/src/api/services/acceleration.ts +++ b/backend/src/api/services/acceleration.ts @@ -5,6 +5,7 @@ import { BlockExtended, PoolTag } from '../../mempool.interfaces'; export interface Acceleration { txid: string, feeDelta: number, + pools: number[], } class AccelerationApi { @@ -17,21 +18,12 @@ class AccelerationApi { } } - public async $fetchPools(): Promise { - if (config.MEMPOOL_SERVICES.ACCELERATIONS) { - const response = await query(`${config.MEMPOOL_SERVICES.API}/partners`); - return (response as PoolTag[]) || []; - } else { - return []; + public isAcceleratedBlock(block: BlockExtended, accelerations: Acceleration[]): boolean { + let anyAccelerated = false; + for (let i = 0; i < accelerations.length && !anyAccelerated; i++) { + anyAccelerated = anyAccelerated || accelerations[i].pools?.includes(block.extras.pool.id); } - } - - public async $isAcceleratedBlock(block: BlockExtended): Promise { - const pools = await this.$fetchPools(); - if (block?.extras?.pool?.id == null) { - return false; - } - return pools.reduce((match, tag) => match || tag.uniqueId === block.extras.pool.id, false); + return anyAccelerated; } } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 7716ed7b7..ced6642d8 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -22,6 +22,7 @@ import { deepClone } from '../utils/clone'; import priceUpdater from '../tasks/price-updater'; import { ApiPrice } from '../repositories/PricesRepository'; import accelerationApi from './services/acceleration'; +import mempool from './mempool'; // valid 'want' subscriptions const wantable = [ @@ -657,7 +658,7 @@ class WebsocketHandler { if (config.MEMPOOL.AUDIT && memPool.isInSync()) { let projectedBlocks; let auditMempool = _memPool; - const isAccelerated = config.MEMPOOL_SERVICES.ACCELERATIONS && await accelerationApi.$isAcceleratedBlock(block); + const isAccelerated = config.MEMPOOL_SERVICES.ACCELERATIONS && accelerationApi.isAcceleratedBlock(block, Object.values(mempool.getAccelerations())); // template calculation functions have mempool side effects, so calculate audits using // a cloned copy of the mempool if we're running a different algorithm for mempool updates const separateAudit = config.MEMPOOL.ADVANCED_GBT_AUDIT !== config.MEMPOOL.ADVANCED_GBT_MEMPOOL; @@ -667,7 +668,7 @@ class WebsocketHandler { if (config.MEMPOOL.RUST_GBT) { projectedBlocks = await mempoolBlocks.$oneOffRustBlockTemplates(auditMempool); } else { - projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated); + projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated, block.extras.pool.id); } } else { projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false); From ffc2b6c53cecbd9f5c1b2e40732469ce05bf27f3 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 18 Jul 2023 15:05:44 +0900 Subject: [PATCH 686/782] Add acceleration support to rust gbt --- backend/rust-gbt/index.d.ts | 8 ++- backend/rust-gbt/src/audit_transaction.rs | 27 +++++---- backend/rust-gbt/src/gbt.rs | 13 ++++- backend/rust-gbt/src/lib.rs | 10 +++- backend/src/api/mempool-blocks.ts | 56 ++++++++++++++----- backend/src/api/mempool.ts | 2 +- backend/src/api/websocket-handler.ts | 8 +-- backend/src/mempool.interfaces.ts | 4 +- backend/src/replication/AuditReplication.ts | 1 + .../block-overview-graph.component.ts | 2 +- .../block-overview-graph/block-scene.ts | 2 +- .../block-overview-graph/tx-view.ts | 2 +- .../fee-distribution-graph.component.ts | 2 +- .../src/app/interfaces/websocket.interface.ts | 4 +- 14 files changed, 96 insertions(+), 45 deletions(-) diff --git a/backend/rust-gbt/index.d.ts b/backend/rust-gbt/index.d.ts index 33ae32bdf..2bd8a620a 100644 --- a/backend/rust-gbt/index.d.ts +++ b/backend/rust-gbt/index.d.ts @@ -12,6 +12,10 @@ export interface ThreadTransaction { effectiveFeePerVsize: number inputs: Array } +export interface ThreadAcceleration { + uid: number + delta: number +} export class GbtGenerator { constructor() /** @@ -19,13 +23,13 @@ export class GbtGenerator { * * Rejects if the thread panics or if the Mutex is poisoned. */ - make(mempool: Array, maxUid: number): Promise + make(mempool: Array, accelerations: Array, maxUid: number): Promise /** * # Errors * * Rejects if the thread panics or if the Mutex is poisoned. */ - update(newTxs: Array, removeTxs: Array, maxUid: number): Promise + update(newTxs: Array, removeTxs: Array, accelerations: Array, maxUid: number): Promise } /** * The result from calling the gbt function. diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 3e25a18a0..9b7472c30 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -1,6 +1,6 @@ use crate::{ u32_hasher_types::{u32hashset_new, U32HasherState}, - ThreadTransaction, + ThreadTransaction, thread_acceleration::ThreadAcceleration, }; use std::{ cmp::Ordering, @@ -88,37 +88,42 @@ impl Ord for AuditTransaction { } #[inline] -fn calc_fee_rate(fee: f64, vsize: f64) -> f64 { - fee / (if vsize == 0.0 { 1.0 } else { vsize }) +fn calc_fee_rate(fee: u64, vsize: f64) -> f64 { + (fee as f64) / (if vsize == 0.0 { 1.0 } else { vsize }) } impl AuditTransaction { - pub fn from_thread_transaction(tx: &ThreadTransaction) -> Self { + pub fn from_thread_transaction(tx: &ThreadTransaction, maybe_acceleration: Option>) -> Self { + let fee_delta = match maybe_acceleration { + Some(Some(acceleration)) => acceleration.delta, + _ => 0.0 + }; + let fee = (tx.fee as u64) + (fee_delta as u64); // rounded up to the nearest integer let is_adjusted = tx.weight < (tx.sigops * 20); let sigop_adjusted_vsize = ((tx.weight + 3) / 4).max(tx.sigops * 5); let sigop_adjusted_weight = tx.weight.max(tx.sigops * 20); - let effective_fee_per_vsize = if is_adjusted { - calc_fee_rate(tx.fee, f64::from(sigop_adjusted_weight) / 4.0) + let effective_fee_per_vsize = if is_adjusted || fee_delta > 0.0 { + calc_fee_rate(fee, f64::from(sigop_adjusted_weight) / 4.0) } else { tx.effective_fee_per_vsize }; Self { uid: tx.uid, order: tx.order, - fee: tx.fee as u64, + fee, weight: tx.weight, sigop_adjusted_weight, sigop_adjusted_vsize, sigops: tx.sigops, - adjusted_fee_per_vsize: calc_fee_rate(tx.fee, f64::from(sigop_adjusted_vsize)), + adjusted_fee_per_vsize: calc_fee_rate(fee, f64::from(sigop_adjusted_vsize)), effective_fee_per_vsize, dependency_rate: f64::INFINITY, inputs: tx.inputs.clone(), relatives_set_flag: false, ancestors: u32hashset_new(), children: u32hashset_new(), - ancestor_fee: tx.fee as u64, + ancestor_fee: fee, ancestor_sigop_adjusted_weight: sigop_adjusted_weight, ancestor_sigop_adjusted_vsize: sigop_adjusted_vsize, ancestor_sigops: tx.sigops, @@ -156,7 +161,7 @@ impl AuditTransaction { // grows, so if we think of 0 as "grew infinitely" then dependency_rate would be // the smaller of the two. If either side is NaN, the other side is returned. self.dependency_rate.min(calc_fee_rate( - self.ancestor_fee as f64, + self.ancestor_fee, f64::from(self.ancestor_sigop_adjusted_weight) / 4.0, )) } @@ -172,7 +177,7 @@ impl AuditTransaction { #[inline] fn calc_new_score(&mut self) { self.score = self.adjusted_fee_per_vsize.min(calc_fee_rate( - self.ancestor_fee as f64, + self.ancestor_fee, f64::from(self.ancestor_sigop_adjusted_vsize), )); } diff --git a/backend/rust-gbt/src/gbt.rs b/backend/rust-gbt/src/gbt.rs index 09b6377e6..0bf7f9999 100644 --- a/backend/rust-gbt/src/gbt.rs +++ b/backend/rust-gbt/src/gbt.rs @@ -5,7 +5,7 @@ use tracing::{info, trace}; use crate::{ audit_transaction::{partial_cmp_uid_score, AuditTransaction}, u32_hasher_types::{u32hashset_new, u32priority_queue_with_capacity, U32HasherState}, - GbtResult, ThreadTransactionsMap, + GbtResult, ThreadTransactionsMap, thread_acceleration::ThreadAcceleration, }; const MAX_BLOCK_WEIGHT_UNITS: u32 = 4_000_000 - 4_000; @@ -53,7 +53,13 @@ impl Ord for TxPriority { // TODO: Make gbt smaller to fix these lints. #[allow(clippy::too_many_lines)] #[allow(clippy::cognitive_complexity)] -pub fn gbt(mempool: &mut ThreadTransactionsMap, max_uid: usize) -> GbtResult { +pub fn gbt(mempool: &mut ThreadTransactionsMap, accelerations: &[ThreadAcceleration], max_uid: usize) -> GbtResult { + let mut indexed_accelerations = Vec::with_capacity(max_uid + 1); + indexed_accelerations.resize(max_uid + 1, None); + for acceleration in accelerations { + indexed_accelerations[acceleration.uid as usize] = Some(acceleration); + } + let mempool_len = mempool.len(); let mut audit_pool: AuditPool = Vec::with_capacity(max_uid + 1); audit_pool.resize(max_uid + 1, None); @@ -63,7 +69,8 @@ pub fn gbt(mempool: &mut ThreadTransactionsMap, max_uid: usize) -> GbtResult { info!("Initializing working structs"); for (uid, tx) in &mut *mempool { - let audit_tx = AuditTransaction::from_thread_transaction(tx); + let acceleration = indexed_accelerations.get(*uid as usize); + let audit_tx = AuditTransaction::from_thread_transaction(tx, acceleration.copied()); // Safety: audit_pool and mempool_stack must always contain the same transactions audit_pool[*uid as usize] = Some(ManuallyDrop::new(audit_tx)); mempool_stack.push(*uid); diff --git a/backend/rust-gbt/src/lib.rs b/backend/rust-gbt/src/lib.rs index 516a26402..53db0ba21 100644 --- a/backend/rust-gbt/src/lib.rs +++ b/backend/rust-gbt/src/lib.rs @@ -9,6 +9,7 @@ use napi::bindgen_prelude::Result; use napi_derive::napi; use thread_transaction::ThreadTransaction; +use thread_acceleration::ThreadAcceleration; use tracing::{debug, info, trace}; use tracing_log::LogTracer; use tracing_subscriber::{EnvFilter, FmtSubscriber}; @@ -19,6 +20,7 @@ use std::sync::{Arc, Mutex}; mod audit_transaction; mod gbt; mod thread_transaction; +mod thread_acceleration; mod u32_hasher_types; use u32_hasher_types::{u32hashmap_with_capacity, U32HasherState}; @@ -74,10 +76,11 @@ impl GbtGenerator { /// /// Rejects if the thread panics or if the Mutex is poisoned. #[napi] - pub async fn make(&self, mempool: Vec, max_uid: u32) -> Result { + pub async fn make(&self, mempool: Vec, accelerations: Vec, max_uid: u32) -> Result { trace!("make: Current State {:#?}", self.thread_transactions); run_task( Arc::clone(&self.thread_transactions), + accelerations, max_uid as usize, move |map| { for tx in mempool { @@ -96,11 +99,13 @@ impl GbtGenerator { &self, new_txs: Vec, remove_txs: Vec, + accelerations: Vec, max_uid: u32, ) -> Result { trace!("update: Current State {:#?}", self.thread_transactions); run_task( Arc::clone(&self.thread_transactions), + accelerations, max_uid as usize, move |map| { for tx in new_txs { @@ -141,6 +146,7 @@ pub struct GbtResult { /// to the `HashMap` as the only argument. (A move closure is recommended to meet the bounds) async fn run_task( thread_transactions: Arc>, + accelerations: Vec, max_uid: usize, callback: F, ) -> Result @@ -159,7 +165,7 @@ where callback(&mut map); info!("Starting gbt algorithm for {} elements...", map.len()); - let result = gbt::gbt(&mut map, max_uid); + let result = gbt::gbt(&mut map, &accelerations, max_uid); info!("Finished gbt algorithm for {} elements...", map.len()); debug!( diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 606c98c83..16772b7cd 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -1,4 +1,4 @@ -import { GbtGenerator, GbtResult, ThreadTransaction as RustThreadTransaction } from '../../rust-gbt'; +import { GbtGenerator, GbtResult, ThreadTransaction as RustThreadTransaction, ThreadAcceleration as RustThreadAcceleration } from '../../rust-gbt'; import logger from '../logger'; import { MempoolBlock, MempoolTransactionExtended, TransactionStripped, MempoolBlockWithTransactions, MempoolBlockDelta, Ancestor, CompactThreadTransaction, EffectiveFeeStats, PoolTag } from '../mempool.interfaces'; import { Common, OnlineFeeStatsCalculator } from './common'; @@ -171,7 +171,7 @@ class MempoolBlocks { for (let i = 0; i < Math.max(mempoolBlocks.length, prevBlocks.length); i++) { let added: TransactionStripped[] = []; let removed: string[] = []; - const changed: { txid: string, rate: number | undefined, acc: number | undefined }[] = []; + const changed: { txid: string, rate: number | undefined, acc: boolean | undefined }[] = []; if (mempoolBlocks[i] && !prevBlocks[i]) { added = mempoolBlocks[i].transactions; } else if (!mempoolBlocks[i] && prevBlocks[i]) { @@ -265,7 +265,7 @@ class MempoolBlocks { // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - const processed = this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), accelerations, saveResults); + const processed = this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), accelerations, accelerationPool, saveResults); logger.debug(`makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); @@ -325,7 +325,7 @@ class MempoolBlocks { // clean up thread error listener this.txSelectionWorker?.removeListener('error', threadErrorListener); - this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), accelerations, saveResults); + this.processBlockTemplates(newMempool, blocks, null, Object.entries(rates), Object.values(clusters), accelerations, null, saveResults); logger.debug(`updateBlockTemplates completed in ${(Date.now() - start) / 1000} seconds`); } catch (e) { logger.err('updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); @@ -337,7 +337,7 @@ class MempoolBlocks { this.rustGbtGenerator = new GbtGenerator(); } - private async $rustMakeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false): Promise { + private async $rustMakeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, useAccelerations: boolean = false, accelerationPool?: number): Promise { const start = Date.now(); // reset mempool short ids @@ -353,16 +353,25 @@ class MempoolBlocks { tx.inputs = tx.vin.map(v => this.getUid(newMempool[v.txid])).filter(uid => (uid !== null && uid !== undefined)) as number[]; } + const accelerations = useAccelerations ? mempool.getAccelerations() : {}; + const acceleratedList = accelerationPool ? Object.values(accelerations).filter(acc => newMempool[acc.txid] && acc.pools.includes(accelerationPool)) : Object.values(accelerations).filter(acc => newMempool[acc.txid]); + const convertedAccelerations = acceleratedList.map(acc => { + return { + uid: this.getUid(newMempool[acc.txid]), + delta: acc.feeDelta, + }; + }); + // run the block construction algorithm in a separate thread, and wait for a result const rustGbt = saveResults ? this.rustGbtGenerator : new GbtGenerator(); try { const { blocks, blockWeights, rates, clusters } = this.convertNapiResultTxids( - await rustGbt.make(Object.values(newMempool) as RustThreadTransaction[], this.nextUid), + await rustGbt.make(Object.values(newMempool) as RustThreadTransaction[], convertedAccelerations as RustThreadAcceleration[], this.nextUid), ); if (saveResults) { this.rustInitialized = true; } - const processed = this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, {}, saveResults); + const processed = this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, accelerations, accelerationPool, saveResults); logger.debug(`RUST makeBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); return processed; } catch (e) { @@ -374,19 +383,20 @@ class MempoolBlocks { return this.mempoolBlocks; } - public async $oneOffRustBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }): Promise { - return this.$rustMakeBlockTemplates(newMempool, false); + public async $oneOffRustBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, useAccelerations: boolean, accelerationPool?: number): Promise { + return this.$rustMakeBlockTemplates(newMempool, false, useAccelerations, accelerationPool); } - public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[]): Promise { + public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], useAccelerations: boolean, accelerationPool?: number): Promise { // GBT optimization requires that uids never get too sparse // as a sanity check, we should also explicitly prevent uint32 uid overflow if (this.nextUid + added.length >= Math.min(Math.max(262144, 2 * mempoolSize), MAX_UINT32)) { this.resetRustGbt(); } + if (!this.rustInitialized) { // need to reset the worker - await this.$rustMakeBlockTemplates(newMempool, true); + await this.$rustMakeBlockTemplates(newMempool, true, useAccelerations, accelerationPool); return; } @@ -401,12 +411,22 @@ class MempoolBlocks { } const removedUids = removed.map(tx => this.getUid(tx)).filter(uid => (uid !== null && uid !== undefined)) as number[]; + const accelerations = useAccelerations ? mempool.getAccelerations() : {}; + const acceleratedList = accelerationPool ? Object.values(accelerations).filter(acc => newMempool[acc.txid] && acc.pools.includes(accelerationPool)) : Object.values(accelerations).filter(acc => newMempool[acc.txid]); + const convertedAccelerations = acceleratedList.map(acc => { + return { + uid: this.getUid(newMempool[acc.txid]), + delta: acc.feeDelta, + }; + }); + // run the block construction algorithm in a separate thread, and wait for a result try { const { blocks, blockWeights, rates, clusters } = this.convertNapiResultTxids( await this.rustGbtGenerator.update( added as RustThreadTransaction[], removedUids, + convertedAccelerations as RustThreadAcceleration[], this.nextUid, ), ); @@ -414,7 +434,7 @@ class MempoolBlocks { if (mempoolSize !== resultMempoolSize) { throw new Error('GBT returned wrong number of transactions, cache is probably out of sync'); } else { - this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, {}, true); + this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, accelerations, accelerationPool, true); } this.removeUids(removedUids); logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); @@ -424,7 +444,7 @@ class MempoolBlocks { } } - private processBlockTemplates(mempool: { [txid: string]: MempoolTransactionExtended }, blocks: string[][], blockWeights: number[] | null, rates: [string, number][], clusters: string[][], accelerations, saveResults): MempoolBlockWithTransactions[] { + private processBlockTemplates(mempool: { [txid: string]: MempoolTransactionExtended }, blocks: string[][], blockWeights: number[] | null, rates: [string, number][], clusters: string[][], accelerations, accelerationPool, saveResults): MempoolBlockWithTransactions[] { for (const [txid, rate] of rates) { if (txid in mempool) { mempool[txid].effectiveFeePerVsize = rate; @@ -503,7 +523,15 @@ class MempoolBlocks { mempoolTx.cpfpChecked = true; } - mempoolTx.acceleration = accelerations[txid]; + const acceleration = accelerations[txid]; + if (acceleration && (!accelerationPool || acceleration.pools.includes(accelerationPool))) { + mempoolTx.acceleration = true; + for (const ancestor of mempoolTx.ancestors || []) { + mempool[ancestor.txid].acceleration = true; + } + } else { + delete mempoolTx.acceleration; + } // online calculation of stack-of-blocks fee stats if (hasBlockStack && blockIndex === lastBlockIndex && feeStatsCalculator) { diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 107aa41cb..d1a2d70a9 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -9,7 +9,7 @@ import loadingIndicators from './loading-indicators'; import bitcoinClient from './bitcoin/bitcoin-client'; import bitcoinSecondClient from './bitcoin/bitcoin-second-client'; import rbfCache from './rbf-cache'; -import accelerationApi from './services/acceleration'; +import accelerationApi, { Acceleration } from './services/acceleration'; class Mempool { private inSync: boolean = false; diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index ced6642d8..e42e87acd 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -174,7 +174,7 @@ class WebsocketHandler { } const tx = memPool.getMempool()[trackTxid]; if (tx && tx.position) { - const position: { block: number, vsize: number, accelerated?: number } = { + const position: { block: number, vsize: number, accelerated?: boolean } = { ...tx.position }; if (tx.acceleration) { @@ -397,7 +397,7 @@ class WebsocketHandler { if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { if (config.MEMPOOL.RUST_GBT) { - await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, mempoolSize, newTransactions, deletedTransactions); + await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, mempoolSize, newTransactions, deletedTransactions, true,); } else { await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, accelerationDelta, true, config.MEMPOOL_SERVICES.ACCELERATIONS); } @@ -666,7 +666,7 @@ class WebsocketHandler { auditMempool = deepClone(_memPool); if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { if (config.MEMPOOL.RUST_GBT) { - projectedBlocks = await mempoolBlocks.$oneOffRustBlockTemplates(auditMempool); + projectedBlocks = await mempoolBlocks.$oneOffRustBlockTemplates(auditMempool, isAccelerated, block.extras.pool.id); } else { projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated, block.extras.pool.id); } @@ -739,7 +739,7 @@ class WebsocketHandler { if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { if (config.MEMPOOL.RUST_GBT) { - await mempoolBlocks.$rustUpdateBlockTemplates(_memPool, Object.keys(_memPool).length, [], transactions); + await mempoolBlocks.$rustUpdateBlockTemplates(_memPool, Object.keys(_memPool).length, [], transactions, true); } else { await mempoolBlocks.$makeBlockTemplates(_memPool, true, config.MEMPOOL_SERVICES.ACCELERATIONS); } diff --git a/backend/src/mempool.interfaces.ts b/backend/src/mempool.interfaces.ts index 185256619..4715440e4 100644 --- a/backend/src/mempool.interfaces.ts +++ b/backend/src/mempool.interfaces.ts @@ -92,7 +92,7 @@ export interface TransactionExtended extends IEsploraApi.Transaction { block: number, vsize: number, }; - acceleration?: number; + acceleration?: boolean; uid?: number; } @@ -184,7 +184,7 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; - acc?: number; + acc?: boolean; rate?: number; // effective fee rate } diff --git a/backend/src/replication/AuditReplication.ts b/backend/src/replication/AuditReplication.ts index 26bf6dad7..5de9de0da 100644 --- a/backend/src/replication/AuditReplication.ts +++ b/backend/src/replication/AuditReplication.ts @@ -116,6 +116,7 @@ class AuditReplication { freshTxs: auditSummary.freshTxs || [], sigopTxs: auditSummary.sigopTxs || [], fullrbfTxs: auditSummary.fullrbfTxs || [], + acceleratedTxs: auditSummary.acceleratedTxs || [], matchRate: auditSummary.matchRate, expectedFees: auditSummary.expectedFees, expectedWeight: auditSummary.expectedWeight, diff --git a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts index fe847103f..634d0f524 100644 --- a/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts +++ b/frontend/src/app/components/block-overview-graph/block-overview-graph.component.ts @@ -147,7 +147,7 @@ export class BlockOverviewGraphComponent implements AfterViewInit, OnDestroy, On } } - update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined, acc: number | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { + update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined, acc: boolean | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { if (this.scene) { this.scene.update(add, remove, change, direction, resetLayout); this.start(); diff --git a/frontend/src/app/components/block-overview-graph/block-scene.ts b/frontend/src/app/components/block-overview-graph/block-scene.ts index 94984bae2..cb0537e2a 100644 --- a/frontend/src/app/components/block-overview-graph/block-scene.ts +++ b/frontend/src/app/components/block-overview-graph/block-scene.ts @@ -150,7 +150,7 @@ export default class BlockScene { this.updateAll(startTime, 200, direction); } - update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined, acc: number | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { + update(add: TransactionStripped[], remove: string[], change: { txid: string, rate: number | undefined, acc: boolean | undefined }[], direction: string = 'left', resetLayout: boolean = false): void { const startTime = performance.now(); const removed = this.removeBatch(remove, startTime, direction); diff --git a/frontend/src/app/components/block-overview-graph/tx-view.ts b/frontend/src/app/components/block-overview-graph/tx-view.ts index 690b974e3..db2c4f6ae 100644 --- a/frontend/src/app/components/block-overview-graph/tx-view.ts +++ b/frontend/src/app/components/block-overview-graph/tx-view.ts @@ -38,7 +38,7 @@ export default class TxView implements TransactionStripped { vsize: number; value: number; feerate: number; - acc?: number; + acc?: boolean; rate?: number; status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; diff --git a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts index f275588a1..1d9c289d8 100644 --- a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts +++ b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts @@ -64,7 +64,7 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges, OnDestr return; } const samples = []; - const txs = this.transactions.map(tx => { return { vsize: tx.vsize, rate: tx.rate || (tx.fee / tx.vsize) }; }).sort((a, b) => { return b.rate - a.rate; }); + const txs = this.transactions.filter(tx => !tx.acc).map(tx => { return { vsize: tx.vsize, rate: tx.rate || (tx.fee / tx.vsize) }; }).sort((a, b) => { return b.rate - a.rate; }); const maxBlockVSize = this.stateService.env.BLOCK_WEIGHT_UNITS / 4; const sampleInterval = maxBlockVSize / this.numSamples; let cumVSize = 0; diff --git a/frontend/src/app/interfaces/websocket.interface.ts b/frontend/src/app/interfaces/websocket.interface.ts index f8686042b..43ab1e5f4 100644 --- a/frontend/src/app/interfaces/websocket.interface.ts +++ b/frontend/src/app/interfaces/websocket.interface.ts @@ -70,7 +70,7 @@ export interface MempoolBlockWithTransactions extends MempoolBlock { export interface MempoolBlockDelta { added: TransactionStripped[], removed: string[], - changed?: { txid: string, rate: number | undefined, acc: number | undefined }[]; + changed?: { txid: string, rate: number | undefined, acc: boolean | undefined }[]; } export interface MempoolInfo { @@ -88,7 +88,7 @@ export interface TransactionStripped { fee: number; vsize: number; value: number; - acc?: number; // acceleration delta + acc?: boolean; // is accelerated? rate?: number; // effective fee rate status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; From 3838d947b13f24e1abf7ef2e03147e811a22922a Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 18 Jul 2023 15:14:33 +0900 Subject: [PATCH 687/782] fix tests --- backend/src/__fixtures__/mempool-config.template.json | 6 +++--- backend/src/__tests__/gbt/gbt-tests.ts | 2 +- docker/backend/start.sh | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/src/__fixtures__/mempool-config.template.json b/backend/src/__fixtures__/mempool-config.template.json index d6754f966..21c8e51c0 100644 --- a/backend/src/__fixtures__/mempool-config.template.json +++ b/backend/src/__fixtures__/mempool-config.template.json @@ -128,8 +128,8 @@ "AUDIT_START_HEIGHT": 774000, "SERVERS": [] }, - "MEMPOOl_SERVICES": { - "API": "__MEMPOOL_SERVICES_API__", - "ACCELERATIONS": "__MEMPOOL_SERVICES_ACCELERATIONS__" + "MEMPOOL_SERVICES": { + "API": "", + "ACCELERATIONS": false } } diff --git a/backend/src/__tests__/gbt/gbt-tests.ts b/backend/src/__tests__/gbt/gbt-tests.ts index 0651faac4..0c2eb0176 100644 --- a/backend/src/__tests__/gbt/gbt-tests.ts +++ b/backend/src/__tests__/gbt/gbt-tests.ts @@ -15,7 +15,7 @@ describe('Rust GBT', () => { test('should produce the same template as getBlockTemplate from Bitcoin Core', async () => { const rustGbt = new GbtGenerator(); const { mempool, maxUid } = mempoolFromArrayBuffer(vectorBuffer.buffer); - const result = await rustGbt.make(mempool, maxUid); + const result = await rustGbt.make(mempool, [], maxUid); const blocks: [string, number][][] = result.blocks.map(block => { return block.map(uid => [vectorUidMap.get(uid) || 'missing', uid]); diff --git a/docker/backend/start.sh b/docker/backend/start.sh index 66f873605..c9088c0a6 100755 --- a/docker/backend/start.sh +++ b/docker/backend/start.sh @@ -137,8 +137,8 @@ __REPLICATION_AUDIT_START_HEIGHT__=${REPLICATION_AUDIT_START_HEIGHT:=774000} __REPLICATION_SERVERS__=${REPLICATION_SERVERS:=[]} # MEMPOOL_SERVICES -__MEMPOOL_SERVICES_API__==${MEMPOOL_SERVICES_API:=""} -__MEMPOOL_SERVICES_ACCELERATIONS__==${MEMPOOL_SERVICES_ACCELERATIONS:=false} +__MEMPOOL_SERVICES_API__=${MEMPOOL_SERVICES_API:=""} +__MEMPOOL_SERVICES_ACCELERATIONS__=${MEMPOOL_SERVICES_ACCELERATIONS:=false} mkdir -p "${__MEMPOOL_CACHE_DIR__}" From 2a2aee21fb466128225d2f3791780152c9e5372f Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 18 Jul 2023 16:08:25 +0900 Subject: [PATCH 688/782] fix audit highlightning and fee ranges --- backend/src/api/common.ts | 2 +- backend/src/api/mempool-blocks.ts | 5 +++-- backend/src/api/websocket-handler.ts | 6 +++--- backend/src/repositories/BlocksAuditsRepository.ts | 1 - frontend/src/app/components/block/block.component.ts | 3 +++ frontend/src/app/interfaces/node-api.interface.ts | 1 + 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/backend/src/api/common.ts b/backend/src/api/common.ts index 775da2643..b2f476da3 100644 --- a/backend/src/api/common.ts +++ b/backend/src/api/common.ts @@ -461,7 +461,7 @@ export class Common { }; } - static calcEffectiveFeeStatistics(transactions: { weight: number, fee: number, effectiveFeePerVsize?: number, txid: string }[]): EffectiveFeeStats { + static calcEffectiveFeeStatistics(transactions: { weight: number, fee: number, effectiveFeePerVsize?: number, txid: string, acceleration?: boolean }[]): EffectiveFeeStats { const sortedTxs = transactions.map(tx => { return { txid: tx.txid, weight: tx.weight, rate: tx.effectiveFeePerVsize || ((tx.fee || 0) / (tx.weight / 4)) }; }).sort((a, b) => a.rate - b.rate); let weightCount = 0; diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 16772b7cd..599a53c23 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -337,7 +337,8 @@ class MempoolBlocks { this.rustGbtGenerator = new GbtGenerator(); } - private async $rustMakeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, useAccelerations: boolean = false, accelerationPool?: number): Promise { + public async $rustMakeBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, saveResults: boolean = false, useAccelerations: boolean = false, accelerationPool?: number): Promise { + console.log('$rustMakeBlockTemplates'); const start = Date.now(); // reset mempool short ids @@ -569,7 +570,7 @@ class MempoolBlocks { private dataToMempoolBlocks(transactionIds: string[], transactions: MempoolTransactionExtended[], totalSize: number, totalWeight: number, totalFees: number, feeStats?: EffectiveFeeStats ): MempoolBlockWithTransactions { if (!feeStats) { - feeStats = Common.calcEffectiveFeeStatistics(transactions); + feeStats = Common.calcEffectiveFeeStatistics(transactions.filter(tx => !tx.acceleration)); } return { blockSize: totalSize, diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index e42e87acd..9eb624b2e 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -397,7 +397,7 @@ class WebsocketHandler { if (config.MEMPOOL.ADVANCED_GBT_MEMPOOL) { if (config.MEMPOOL.RUST_GBT) { - await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, mempoolSize, newTransactions, deletedTransactions, true,); + await mempoolBlocks.$rustUpdateBlockTemplates(newMempool, mempoolSize, newTransactions, deletedTransactions, config.MEMPOOL_SERVICES.ACCELERATIONS); } else { await mempoolBlocks.$updateBlockTemplates(newMempool, newTransactions, deletedTransactions, accelerationDelta, true, config.MEMPOOL_SERVICES.ACCELERATIONS); } @@ -661,7 +661,7 @@ class WebsocketHandler { const isAccelerated = config.MEMPOOL_SERVICES.ACCELERATIONS && accelerationApi.isAcceleratedBlock(block, Object.values(mempool.getAccelerations())); // template calculation functions have mempool side effects, so calculate audits using // a cloned copy of the mempool if we're running a different algorithm for mempool updates - const separateAudit = config.MEMPOOL.ADVANCED_GBT_AUDIT !== config.MEMPOOL.ADVANCED_GBT_MEMPOOL; + const separateAudit = config.MEMPOOL.ADVANCED_GBT_AUDIT !== config.MEMPOOL.ADVANCED_GBT_MEMPOOL || isAccelerated; if (separateAudit) { auditMempool = deepClone(_memPool); if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { @@ -675,7 +675,7 @@ class WebsocketHandler { } } else { if ((config.MEMPOOL_SERVICES.ACCELERATIONS && !isAccelerated)) { - projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated); + projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, false); } else { projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); } diff --git a/backend/src/repositories/BlocksAuditsRepository.ts b/backend/src/repositories/BlocksAuditsRepository.ts index 9c7568567..c17958d2b 100644 --- a/backend/src/repositories/BlocksAuditsRepository.ts +++ b/backend/src/repositories/BlocksAuditsRepository.ts @@ -85,7 +85,6 @@ class BlocksAuditRepositories { rows[0].sigopTxs = JSON.parse(rows[0].sigopTxs); rows[0].fullrbfTxs = JSON.parse(rows[0].fullrbfTxs); rows[0].acceleratedTxs = JSON.parse(rows[0].acceleratedTxs); - rows[0].transactions = JSON.parse(rows[0].transactions); rows[0].template = JSON.parse(rows[0].template); return rows[0]; diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 1e94b1a9c..1345717bd 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -347,6 +347,9 @@ export class BlockComponent implements OnInit, OnDestroy { if (blockAudit?.template) { for (const tx of blockAudit.template) { inTemplate[tx.txid] = true; + if (tx.acc) { + isAccelerated[tx.txid] = true; + } } for (const tx of transactions) { inBlock[tx.txid] = true; diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index a0a3da5e6..cb42eaed3 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -176,6 +176,7 @@ export interface TransactionStripped { vsize: number; value: number; rate?: number; // effective fee rate + acc?: boolean; status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'censored' | 'selected' | 'rbf' | 'accelerated'; context?: 'projected' | 'actual'; } From 7c641544b2fda1c48fe6d2df43bb343537ef98cc Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 18 Jul 2023 16:32:52 +0900 Subject: [PATCH 689/782] check in missing rust-gbt file --- backend/rust-gbt/src/thread_acceleration.rs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 backend/rust-gbt/src/thread_acceleration.rs diff --git a/backend/rust-gbt/src/thread_acceleration.rs b/backend/rust-gbt/src/thread_acceleration.rs new file mode 100644 index 000000000..618cac3db --- /dev/null +++ b/backend/rust-gbt/src/thread_acceleration.rs @@ -0,0 +1,8 @@ +use napi_derive::napi; + +#[derive(Debug)] +#[napi(object)] +pub struct ThreadAcceleration { + pub uid: u32, + pub delta: f64, // fee delta +} From 928a8be846779820c4290aabd02dceae65983dd7 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Tue, 18 Jul 2023 17:30:51 +0900 Subject: [PATCH 690/782] fix pool-dependent accelerated audit handling --- backend/rust-gbt/src/audit_transaction.rs | 2 +- backend/src/api/mempool-blocks.ts | 13 +++++++------ backend/src/api/websocket-handler.ts | 6 +++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/backend/rust-gbt/src/audit_transaction.rs b/backend/rust-gbt/src/audit_transaction.rs index 9b7472c30..fe20e5a14 100644 --- a/backend/rust-gbt/src/audit_transaction.rs +++ b/backend/rust-gbt/src/audit_transaction.rs @@ -130,7 +130,7 @@ impl AuditTransaction { score: 0.0, used: false, modified: false, - dirty: effective_fee_per_vsize != tx.effective_fee_per_vsize, + dirty: effective_fee_per_vsize != tx.effective_fee_per_vsize || fee_delta > 0.0, } } diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 599a53c23..6d3fa0036 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -388,7 +388,7 @@ class MempoolBlocks { return this.$rustMakeBlockTemplates(newMempool, false, useAccelerations, accelerationPool); } - public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], useAccelerations: boolean, accelerationPool?: number): Promise { + public async $rustUpdateBlockTemplates(newMempool: { [txid: string]: MempoolTransactionExtended }, mempoolSize: number, added: MempoolTransactionExtended[], removed: MempoolTransactionExtended[], useAccelerations: boolean, accelerationPool?: number): Promise { // GBT optimization requires that uids never get too sparse // as a sanity check, we should also explicitly prevent uint32 uid overflow if (this.nextUid + added.length >= Math.min(Math.max(262144, 2 * mempoolSize), MAX_UINT32)) { @@ -397,8 +397,7 @@ class MempoolBlocks { if (!this.rustInitialized) { // need to reset the worker - await this.$rustMakeBlockTemplates(newMempool, true, useAccelerations, accelerationPool); - return; + return this.$rustMakeBlockTemplates(newMempool, true, useAccelerations, accelerationPool); } const start = Date.now(); @@ -435,13 +434,15 @@ class MempoolBlocks { if (mempoolSize !== resultMempoolSize) { throw new Error('GBT returned wrong number of transactions, cache is probably out of sync'); } else { - this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, accelerations, accelerationPool, true); + const processed = this.processBlockTemplates(newMempool, blocks, blockWeights, rates, clusters, accelerations, accelerationPool, true); + this.removeUids(removedUids); + logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); + return processed; } - this.removeUids(removedUids); - logger.debug(`RUST updateBlockTemplates completed in ${(Date.now() - start)/1000} seconds`); } catch (e) { logger.err('RUST updateBlockTemplates failed. ' + (e instanceof Error ? e.message : e)); this.resetRustGbt(); + return this.mempoolBlocks; } } diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 9eb624b2e..bed059ad2 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -661,7 +661,7 @@ class WebsocketHandler { const isAccelerated = config.MEMPOOL_SERVICES.ACCELERATIONS && accelerationApi.isAcceleratedBlock(block, Object.values(mempool.getAccelerations())); // template calculation functions have mempool side effects, so calculate audits using // a cloned copy of the mempool if we're running a different algorithm for mempool updates - const separateAudit = config.MEMPOOL.ADVANCED_GBT_AUDIT !== config.MEMPOOL.ADVANCED_GBT_MEMPOOL || isAccelerated; + const separateAudit = config.MEMPOOL.ADVANCED_GBT_AUDIT !== config.MEMPOOL.ADVANCED_GBT_MEMPOOL; if (separateAudit) { auditMempool = deepClone(_memPool); if (config.MEMPOOL.ADVANCED_GBT_AUDIT) { @@ -674,8 +674,8 @@ class WebsocketHandler { projectedBlocks = mempoolBlocks.updateMempoolBlocks(auditMempool, false); } } else { - if ((config.MEMPOOL_SERVICES.ACCELERATIONS && !isAccelerated)) { - projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, false); + if ((config.MEMPOOL_SERVICES.ACCELERATIONS)) { + projectedBlocks = await mempoolBlocks.$rustUpdateBlockTemplates(auditMempool, Object.keys(auditMempool).length, [], [], isAccelerated, block.extras.pool.id); } else { projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); } From cde4af59305e9feb99ad061b8645c676720bb156 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 19 Jul 2023 11:18:04 +0900 Subject: [PATCH 691/782] fix mismatched use of gbt implementations --- backend/src/api/mempool-blocks.ts | 12 +++++++++--- backend/src/api/websocket-handler.ts | 6 +++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/backend/src/api/mempool-blocks.ts b/backend/src/api/mempool-blocks.ts index 6d3fa0036..1ea4d2af8 100644 --- a/backend/src/api/mempool-blocks.ts +++ b/backend/src/api/mempool-blocks.ts @@ -211,9 +211,12 @@ class MempoolBlocks { const start = Date.now(); // reset mempool short ids - this.resetUids(); + if (saveResults) { + this.resetUids(); + } + // set missing short ids for (const tx of Object.values(newMempool)) { - this.setUid(tx, true); + this.setUid(tx, !saveResults); } const accelerations = useAccelerations ? mempool.getAccelerations() : {}; @@ -497,6 +500,8 @@ class MempoolBlocks { } } + const isAccelerated : { [txid: string]: boolean } = {}; + const sizeLimit = (config.MEMPOOL.BLOCK_WEIGHT_UNITS / 4) * 1.2; // update this thread's mempool with the results let mempoolTx: MempoolTransactionExtended; @@ -526,10 +531,11 @@ class MempoolBlocks { } const acceleration = accelerations[txid]; - if (acceleration && (!accelerationPool || acceleration.pools.includes(accelerationPool))) { + if (isAccelerated[txid] || (acceleration && (!accelerationPool || acceleration.pools.includes(accelerationPool)))) { mempoolTx.acceleration = true; for (const ancestor of mempoolTx.ancestors || []) { mempool[ancestor.txid].acceleration = true; + isAccelerated[ancestor.txid] = true; } } else { delete mempoolTx.acceleration; diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index bed059ad2..f5c940218 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -675,7 +675,11 @@ class WebsocketHandler { } } else { if ((config.MEMPOOL_SERVICES.ACCELERATIONS)) { - projectedBlocks = await mempoolBlocks.$rustUpdateBlockTemplates(auditMempool, Object.keys(auditMempool).length, [], [], isAccelerated, block.extras.pool.id); + if (config.MEMPOOL.RUST_GBT) { + projectedBlocks = await mempoolBlocks.$rustUpdateBlockTemplates(auditMempool, Object.keys(auditMempool).length, [], [], isAccelerated, block.extras.pool.id); + } else { + projectedBlocks = await mempoolBlocks.$makeBlockTemplates(auditMempool, false, isAccelerated, block.extras.pool.id); + } } else { projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); } From 67cff804a6979ed6bf5220bdf829be8e394b82b6 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Sat, 22 Jul 2023 09:46:35 +0900 Subject: [PATCH 692/782] /accelerations -> /accelerator/accelerations --- backend/src/api/services/acceleration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/services/acceleration.ts b/backend/src/api/services/acceleration.ts index 1c2fff7c6..635dc8300 100644 --- a/backend/src/api/services/acceleration.ts +++ b/backend/src/api/services/acceleration.ts @@ -11,7 +11,7 @@ export interface Acceleration { class AccelerationApi { public async $fetchAccelerations(): Promise { if (config.MEMPOOL_SERVICES.ACCELERATIONS) { - const response = await query(`${config.MEMPOOL_SERVICES.API}/accelerations`); + const response = await query(`${config.MEMPOOL_SERVICES.API}/accelerator/accelerations`); return (response as Acceleration[]) || []; } else { return []; From 1fd5b975f152c085e21a64f86ccc205a560e2884 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 27 Jul 2023 11:45:16 +0900 Subject: [PATCH 693/782] Handle failures while fetching block transactions --- backend/src/api/blocks.ts | 64 +++++++++++++++++++--------- backend/src/api/transaction-utils.ts | 20 ++++++++- 2 files changed, 62 insertions(+), 22 deletions(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 4dbf4305e..9ad9278d0 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -105,11 +105,16 @@ class Blocks { } } - // Skip expensive lookups while mempool has priority if (onlyCoinbase) { try { - const coinbase = await transactionUtils.$getTransactionExtended(txIds[0], false, false, false, addMempoolData); - return [coinbase]; + const coinbase = await transactionUtils.$getTransactionExtendedRetry(txIds[0], false, false, false, addMempoolData); + if (coinbase && coinbase.vin[0].is_coinbase) { + return [coinbase]; + } else { + const msg = `Expected a coinbase tx, but the backend API returned something else`; + logger.err(msg); + throw new Error(msg); + } } catch (e) { const msg = `Cannot fetch coinbase tx ${txIds[0]}. Reason: ` + (e instanceof Error ? e.message : e); logger.err(msg); @@ -134,17 +139,17 @@ class Blocks { // Fetch remaining txs individually for (const txid of txIds.filter(txid => !transactionMap[txid])) { - if (!transactionMap[txid]) { - if (!quiet && (totalFound % (Math.round((txIds.length) / 10)) === 0 || totalFound + 1 === txIds.length)) { // Avoid log spam - logger.debug(`Indexing tx ${totalFound + 1} of ${txIds.length} in block #${blockHeight}`); - } - try { - const tx = await transactionUtils.$getTransactionExtended(txid, false, false, false, addMempoolData); - transactionMap[txid] = tx; - totalFound++; - } catch (e) { - logger.err(`Cannot fetch tx ${txid}. Reason: ` + (e instanceof Error ? e.message : e)); - } + if (!quiet && (totalFound % (Math.round((txIds.length) / 10)) === 0 || totalFound + 1 === txIds.length)) { // Avoid log spam + logger.debug(`Indexing tx ${totalFound + 1} of ${txIds.length} in block #${blockHeight}`); + } + try { + const tx = await transactionUtils.$getTransactionExtendedRetry(txid, false, false, false, addMempoolData); + transactionMap[txid] = tx; + totalFound++; + } catch (e) { + const msg = `Cannot fetch tx ${txid}. Reason: ` + (e instanceof Error ? e.message : e); + logger.err(msg); + throw new Error(msg); } } @@ -152,8 +157,25 @@ class Blocks { logger.debug(`${foundInMempool} of ${txIds.length} found in mempool. ${totalFound - foundInMempool} fetched through backend service.`); } + // Require the first transaction to be a coinbase + const coinbase = transactionMap[txIds[0]]; + if (!coinbase || !coinbase.vin[0].is_coinbase) { + console.log(coinbase); + const msg = `Expected first tx in a block to be a coinbase, but found something else`; + logger.err(msg); + throw new Error(msg); + } + + // Require all transactions to be present + // (we should have thrown an error already if a tx request failed) + if (txIds.some(txid => !transactionMap[txid])) { + const msg = `Failed to fetch ${txIds.length - totalFound} transactions from block`; + logger.err(msg); + throw new Error(msg); + } + // Return list of transactions, preserving block order - return txIds.map(txid => transactionMap[txid]).filter(tx => tx != null); + return txIds.map(txid => transactionMap[txid]); } /** @@ -667,14 +689,14 @@ class Blocks { const block = BitcoinApi.convertBlock(verboseBlock); const txIds: string[] = verboseBlock.tx.map(tx => tx.txid); const transactions = await this.$getTransactionsExtended(blockHash, block.height, false, txIds, false, true) as MempoolTransactionExtended[]; - if (config.MEMPOOL.BACKEND !== 'esplora') { - // fill in missing transaction fee data from verboseBlock - for (let i = 0; i < transactions.length; i++) { - if (!transactions[i].fee && transactions[i].txid === verboseBlock.tx[i].txid) { - transactions[i].fee = verboseBlock.tx[i].fee * 100_000_000; - } + + // fill in missing transaction fee data from verboseBlock + for (let i = 0; i < transactions.length; i++) { + if (!transactions[i].fee && transactions[i].txid === verboseBlock.tx[i].txid) { + transactions[i].fee = verboseBlock.tx[i].fee * 100_000_000; } } + const cpfpSummary: CpfpSummary = Common.calculateCpfp(block.height, transactions); const blockExtended: BlockExtended = await this.$getBlockExtended(block, cpfpSummary.transactions); const blockSummary: BlockSummary = this.summarizeBlockTransactions(block.id, cpfpSummary.transactions); diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 0b10afdfb..009fe1dde 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -3,6 +3,7 @@ import { IEsploraApi } from './bitcoin/esplora-api.interface'; import { Common } from './common'; import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; import * as bitcoinjs from 'bitcoinjs-lib'; +import logger from '../logger'; class TransactionUtils { constructor() { } @@ -22,6 +23,23 @@ class TransactionUtils { }; } + // Wrapper for $getTransactionExtended with an automatic retry direct to Core if the first API request fails. + // Propagates any error from the retry request. + public async $getTransactionExtendedRetry(txid: string, addPrevouts = false, lazyPrevouts = false, forceCore = false, addMempoolData = false): Promise { + try { + const result = await this.$getTransactionExtended(txid, addPrevouts, lazyPrevouts, forceCore, addMempoolData); + if (result) { + return result; + } else { + logger.err(`Cannot fetch tx ${txid}. Reason: backend returned null data`); + } + } catch (e) { + logger.err(`Cannot fetch tx ${txid}. Reason: ` + (e instanceof Error ? e.message : e)); + } + // retry direct from Core if first request failed + return this.$getTransactionExtended(txid, addPrevouts, lazyPrevouts, true, addMempoolData); + } + /** * @param txId * @param addPrevouts @@ -31,7 +49,7 @@ class TransactionUtils { public async $getTransactionExtended(txId: string, addPrevouts = false, lazyPrevouts = false, forceCore = false, addMempoolData = false): Promise { let transaction: IEsploraApi.Transaction; if (forceCore === true) { - transaction = await bitcoinCoreApi.$getRawTransaction(txId, true); + transaction = await bitcoinCoreApi.$getRawTransaction(txId, false, addPrevouts, lazyPrevouts); } else { transaction = await bitcoinApi.$getRawTransaction(txId, false, addPrevouts, lazyPrevouts); } From 589adb95c304bad01a9d32c12264325f341a2954 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Thu, 27 Jul 2023 14:49:21 +0900 Subject: [PATCH 694/782] remove stray debugging log --- backend/src/api/blocks.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 9ad9278d0..ba7a55149 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -160,7 +160,6 @@ class Blocks { // Require the first transaction to be a coinbase const coinbase = transactionMap[txIds[0]]; if (!coinbase || !coinbase.vin[0].is_coinbase) { - console.log(coinbase); const msg = `Expected first tx in a block to be a coinbase, but found something else`; logger.err(msg); throw new Error(msg); From 3f3f0db2f2631a977d4817c0cadf256f15543a62 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Fri, 28 Jul 2023 13:45:04 +0900 Subject: [PATCH 695/782] [mining] use .slug to load pool logo --- .../src/app/components/blocks-list/blocks-list.component.ts | 4 ++-- frontend/src/app/components/pool/pool-preview.component.ts | 2 +- frontend/src/app/components/pool/pool.component.ts | 2 +- frontend/src/app/dashboard/dashboard.component.ts | 2 +- frontend/src/app/interfaces/node-api.interface.ts | 1 + frontend/src/app/services/mining.service.ts | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/components/blocks-list/blocks-list.component.ts b/frontend/src/app/components/blocks-list/blocks-list.component.ts index 1af6572fc..cec925270 100644 --- a/frontend/src/app/components/blocks-list/blocks-list.component.ts +++ b/frontend/src/app/components/blocks-list/blocks-list.component.ts @@ -68,7 +68,7 @@ export class BlocksList implements OnInit { for (const block of blocks) { // @ts-ignore: Need to add an extra field for the template block.extras.pool.logo = `/resources/mining-pools/` + - block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + block.extras.pool.slug + '.svg'; } } if (this.widget) { @@ -102,7 +102,7 @@ export class BlocksList implements OnInit { if (this.stateService.env.MINING_DASHBOARD) { // @ts-ignore: Need to add an extra field for the template blocks[1][0].extras.pool.logo = `/resources/mining-pools/` + - blocks[1][0].extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + blocks[1][0].extras.pool.slug + '.svg'; } acc.unshift(blocks[1][0]); acc = acc.slice(0, this.widget ? 6 : 15); diff --git a/frontend/src/app/components/pool/pool-preview.component.ts b/frontend/src/app/components/pool/pool-preview.component.ts index 0431686d6..e03b73665 100644 --- a/frontend/src/app/components/pool/pool-preview.component.ts +++ b/frontend/src/app/components/pool/pool-preview.component.ts @@ -89,7 +89,7 @@ export class PoolPreviewComponent implements OnInit { this.openGraphService.waitOver('pool-stats-' + this.slug); - const logoSrc = `/resources/mining-pools/` + poolStats.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + const logoSrc = `/resources/mining-pools/` + poolStats.pool.slug + '.svg'; if (logoSrc === this.lastImgSrc) { this.openGraphService.waitOver('pool-img-' + this.slug); } diff --git a/frontend/src/app/components/pool/pool.component.ts b/frontend/src/app/components/pool/pool.component.ts index f2fc79ff2..edd5801fe 100644 --- a/frontend/src/app/components/pool/pool.component.ts +++ b/frontend/src/app/components/pool/pool.component.ts @@ -79,7 +79,7 @@ export class PoolComponent implements OnInit { poolStats.pool.regexes = regexes.slice(0, -3); return Object.assign({ - logo: `/resources/mining-pools/` + poolStats.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg' + logo: `/resources/mining-pools/` + poolStats.pool.slug + '.svg' }, poolStats); }) ); diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 05381453d..645ccc8d8 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -159,7 +159,7 @@ export class DashboardComponent implements OnInit, OnDestroy, AfterViewInit { for (const block of blocks) { // @ts-ignore: Need to add an extra field for the template block.extras.pool.logo = `/resources/mining-pools/` + - block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; + block.extras.pool.slug + '.svg'; } } return of(blocks.slice(0, 6)); diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 4249fd9db..59dff8e90 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -110,6 +110,7 @@ export interface PoolInfo { regexes: string; // JSON array addresses: string; // JSON array emptyBlocks: number; + slug: string; } export interface PoolStat { pool: PoolInfo; diff --git a/frontend/src/app/services/mining.service.ts b/frontend/src/app/services/mining.service.ts index 63257fa74..96723921e 100644 --- a/frontend/src/app/services/mining.service.ts +++ b/frontend/src/app/services/mining.service.ts @@ -96,7 +96,7 @@ export class MiningService { share: parseFloat((poolStat.blockCount / stats.blockCount * 100).toFixed(2)), lastEstimatedHashrate: (poolStat.blockCount / stats.blockCount * stats.lastEstimatedHashrate / hashrateDivider).toFixed(2), emptyBlockRatio: (poolStat.emptyBlocks / poolStat.blockCount * 100).toFixed(2), - logo: `/resources/mining-pools/` + poolStat.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg', + logo: `/resources/mining-pools/` + poolStat.slug + '.svg', ...poolStat }; }); From 9b65fbd98c7fac134e68705fa6be558de19699d5 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 28 Jul 2023 15:53:52 +0900 Subject: [PATCH 696/782] Show new mined transactions on the address page --- .../components/address/address.component.ts | 62 +++++++++++-------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/frontend/src/app/components/address/address.component.ts b/frontend/src/app/components/address/address.component.ts index ae1f6dbbe..64d3a4143 100644 --- a/frontend/src/app/components/address/address.component.ts +++ b/frontend/src/app/components/address/address.component.ts @@ -166,31 +166,8 @@ export class AddressComponent implements OnInit, OnDestroy { }); this.stateService.mempoolTransactions$ - .subscribe((transaction) => { - if (this.transactions.some((t) => t.txid === transaction.txid)) { - return; - } - - this.transactions.unshift(transaction); - this.transactions = this.transactions.slice(); - this.txCount++; - - if (transaction.vout.some((vout) => vout.scriptpubkey_address === this.address.address)) { - this.audioService.playSound('cha-ching'); - } else { - this.audioService.playSound('chime'); - } - - transaction.vin.forEach((vin) => { - if (vin.prevout.scriptpubkey_address === this.address.address) { - this.sent += vin.prevout.value; - } - }); - transaction.vout.forEach((vout) => { - if (vout.scriptpubkey_address === this.address.address) { - this.received += vout.value; - } - }); + .subscribe(tx => { + this.addTransaction(tx); }); this.stateService.blockTransactions$ @@ -200,12 +177,47 @@ export class AddressComponent implements OnInit, OnDestroy { tx.status = transaction.status; this.transactions = this.transactions.slice(); this.audioService.playSound('magic'); + } else { + if (this.addTransaction(transaction, false)) { + this.audioService.playSound('magic'); + } } this.totalConfirmedTxCount++; this.loadedConfirmedTxCount++; }); } + addTransaction(transaction: Transaction, playSound: boolean = true): boolean { + if (this.transactions.some((t) => t.txid === transaction.txid)) { + return false; + } + + this.transactions.unshift(transaction); + this.transactions = this.transactions.slice(); + this.txCount++; + + if (playSound) { + if (transaction.vout.some((vout) => vout?.scriptpubkey_address === this.address.address)) { + this.audioService.playSound('cha-ching'); + } else { + this.audioService.playSound('chime'); + } + } + + transaction.vin.forEach((vin) => { + if (vin?.prevout?.scriptpubkey_address === this.address.address) { + this.sent += vin.prevout.value; + } + }); + transaction.vout.forEach((vout) => { + if (vout?.scriptpubkey_address === this.address.address) { + this.received += vout.value; + } + }); + + return true; + } + loadMore() { if (this.isLoadingTransactions || !this.totalConfirmedTxCount || this.loadedConfirmedTxCount >= this.totalConfirmedTxCount) { return; From 74b87b60065b617b93cbcec6219a0f2281f26387 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Wed, 26 Jul 2023 10:47:59 +0900 Subject: [PATCH 697/782] Support p2pk track-address websocket subscriptions --- backend/src/api/transaction-utils.ts | 9 ++++ backend/src/api/websocket-handler.ts | 76 +++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index 0b10afdfb..b8a9a108a 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -3,6 +3,7 @@ import { IEsploraApi } from './bitcoin/esplora-api.interface'; import { Common } from './common'; import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; import * as bitcoinjs from 'bitcoinjs-lib'; +import crypto from 'node:crypto'; class TransactionUtils { constructor() { } @@ -170,6 +171,14 @@ class TransactionUtils { 16 ); } + + public calcScriptHash(script: string): string { + if (!/^[0-9a-fA-F]*$/.test(script) || script.length % 2 !== 0) { + throw new Error('script is not a valid hex string'); + } + const buf = Buffer.from(script, 'hex'); + return crypto.createHash('sha256').update(buf).digest('hex'); + } } export default new TransactionUtils(); diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 56c8513cd..3438e0e0c 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -183,15 +183,22 @@ class WebsocketHandler { } if (parsedMessage && parsedMessage['track-address']) { - if (/^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[a-z]{2,5}1[ac-hj-np-z02-9]{8,100}|[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100})$/ + if (/^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[a-z]{2,5}1[ac-hj-np-z02-9]{8,100}|[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|[0-9a-fA-F]{130})$/ .test(parsedMessage['track-address'])) { let matchedAddress = parsedMessage['track-address']; if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}$/.test(parsedMessage['track-address'])) { matchedAddress = matchedAddress.toLowerCase(); } - client['track-address'] = matchedAddress; + if (/^[0-9a-fA-F]{130}$/.test(parsedMessage['track-address'])) { + client['track-address'] = null; + client['track-scripthash'] = transactionUtils.calcScriptHash('41' + matchedAddress + 'ac'); + } else { + client['track-address'] = matchedAddress; + client['track-scripthash'] = null; + } } else { client['track-address'] = null; + client['track-scripthash'] = null; } } @@ -546,6 +553,44 @@ class WebsocketHandler { } } + if (client['track-scripthash']) { + const foundTransactions: TransactionExtended[] = []; + + for (const tx of newTransactions) { + const someVin = tx.vin.some((vin) => !!vin.prevout && vin.prevout.scriptpubkey_type === 'p2pk' && vin.prevout.scriptpubkey === client['track-scripthash']); + if (someVin) { + if (config.MEMPOOL.BACKEND !== 'esplora') { + try { + const fullTx = await transactionUtils.$getMempoolTransactionExtended(tx.txid, true); + foundTransactions.push(fullTx); + } catch (e) { + logger.debug('Error finding transaction in mempool: ' + (e instanceof Error ? e.message : e)); + } + } else { + foundTransactions.push(tx); + } + return; + } + const someVout = tx.vout.some((vout) => vout.scriptpubkey_type === 'p2pk' && vout.scriptpubkey === client['track-scripthash']); + if (someVout) { + if (config.MEMPOOL.BACKEND !== 'esplora') { + try { + const fullTx = await transactionUtils.$getMempoolTransactionExtended(tx.txid, true); + foundTransactions.push(fullTx); + } catch (e) { + logger.debug('Error finding transaction in mempool: ' + (e instanceof Error ? e.message : e)); + } + } else { + foundTransactions.push(tx); + } + } + } + + if (foundTransactions.length) { + response['address-transactions'] = JSON.stringify(foundTransactions); + } + } + if (client['track-asset']) { const foundTransactions: TransactionExtended[] = []; @@ -821,6 +866,33 @@ class WebsocketHandler { } } + if (client['track-scripthash']) { + const foundTransactions: TransactionExtended[] = []; + + transactions.forEach((tx) => { + if (tx.vin && tx.vin.some((vin) => !!vin.prevout && vin.prevout.scriptpubkey_type === 'p2pk' && vin.prevout.scriptpubkey === client['track-scripthash'])) { + foundTransactions.push(tx); + return; + } + if (tx.vout && tx.vout.some((vout) => vout.scriptpubkey_type === 'p2pk' && vout.scriptpubkey === client['track-scripthash'])) { + foundTransactions.push(tx); + } + }); + + if (foundTransactions.length) { + foundTransactions.forEach((tx) => { + tx.status = { + confirmed: true, + block_height: block.height, + block_hash: block.id, + block_time: block.timestamp, + }; + }); + + response['block-transactions'] = JSON.stringify(foundTransactions); + } + } + if (client['track-asset']) { const foundTransactions: TransactionExtended[] = []; From 5b2470955d480656f2f3e636bc257a9da3f7bf0d Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 28 Jul 2023 16:04:03 +0900 Subject: [PATCH 698/782] track p2pk addresses by scriptpubkey not scripthash --- backend/src/api/websocket-handler.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 3438e0e0c..74c4ed832 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -191,14 +191,14 @@ class WebsocketHandler { } if (/^[0-9a-fA-F]{130}$/.test(parsedMessage['track-address'])) { client['track-address'] = null; - client['track-scripthash'] = transactionUtils.calcScriptHash('41' + matchedAddress + 'ac'); + client['track-scriptpubkey'] = '41' + matchedAddress + 'ac'; } else { client['track-address'] = matchedAddress; - client['track-scripthash'] = null; + client['track-scriptpubkey'] = null; } } else { client['track-address'] = null; - client['track-scripthash'] = null; + client['track-scriptpubkey'] = null; } } @@ -553,11 +553,11 @@ class WebsocketHandler { } } - if (client['track-scripthash']) { + if (client['track-scriptpubkey']) { const foundTransactions: TransactionExtended[] = []; for (const tx of newTransactions) { - const someVin = tx.vin.some((vin) => !!vin.prevout && vin.prevout.scriptpubkey_type === 'p2pk' && vin.prevout.scriptpubkey === client['track-scripthash']); + const someVin = tx.vin.some((vin) => !!vin.prevout && vin.prevout.scriptpubkey_type === 'p2pk' && vin.prevout.scriptpubkey === client['track-scriptpubkey']); if (someVin) { if (config.MEMPOOL.BACKEND !== 'esplora') { try { @@ -571,7 +571,7 @@ class WebsocketHandler { } return; } - const someVout = tx.vout.some((vout) => vout.scriptpubkey_type === 'p2pk' && vout.scriptpubkey === client['track-scripthash']); + const someVout = tx.vout.some((vout) => vout.scriptpubkey_type === 'p2pk' && vout.scriptpubkey === client['track-scriptpubkey']); if (someVout) { if (config.MEMPOOL.BACKEND !== 'esplora') { try { @@ -866,15 +866,15 @@ class WebsocketHandler { } } - if (client['track-scripthash']) { + if (client['track-scriptpubkey']) { const foundTransactions: TransactionExtended[] = []; transactions.forEach((tx) => { - if (tx.vin && tx.vin.some((vin) => !!vin.prevout && vin.prevout.scriptpubkey_type === 'p2pk' && vin.prevout.scriptpubkey === client['track-scripthash'])) { + if (tx.vin && tx.vin.some((vin) => !!vin.prevout && vin.prevout.scriptpubkey_type === 'p2pk' && vin.prevout.scriptpubkey === client['track-scriptpubkey'])) { foundTransactions.push(tx); return; } - if (tx.vout && tx.vout.some((vout) => vout.scriptpubkey_type === 'p2pk' && vout.scriptpubkey === client['track-scripthash'])) { + if (tx.vout && tx.vout.some((vout) => vout.scriptpubkey_type === 'p2pk' && vout.scriptpubkey === client['track-scriptpubkey'])) { foundTransactions.push(tx); } }); From 63ccecf4107823194787e0aca8d7309f0dfde9df Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 28 Jul 2023 16:14:28 +0900 Subject: [PATCH 699/782] remove unused calcScriptHash function --- backend/src/api/transaction-utils.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/backend/src/api/transaction-utils.ts b/backend/src/api/transaction-utils.ts index b8a9a108a..0b10afdfb 100644 --- a/backend/src/api/transaction-utils.ts +++ b/backend/src/api/transaction-utils.ts @@ -3,7 +3,6 @@ import { IEsploraApi } from './bitcoin/esplora-api.interface'; import { Common } from './common'; import bitcoinApi, { bitcoinCoreApi } from './bitcoin/bitcoin-api-factory'; import * as bitcoinjs from 'bitcoinjs-lib'; -import crypto from 'node:crypto'; class TransactionUtils { constructor() { } @@ -171,14 +170,6 @@ class TransactionUtils { 16 ); } - - public calcScriptHash(script: string): string { - if (!/^[0-9a-fA-F]*$/.test(script) || script.length % 2 !== 0) { - throw new Error('script is not a valid hex string'); - } - const buf = Buffer.from(script, 'hex'); - return crypto.createHash('sha256').update(buf).digest('hex'); - } } export default new TransactionUtils(); From 2c613195cce70672f2312ce02f8a4bc1771227a0 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Fri, 28 Jul 2023 16:35:42 +0900 Subject: [PATCH 700/782] Add support for compressed p2pk addresses --- backend/src/api/websocket-handler.ts | 7 +++++-- .../components/address/address-preview.component.ts | 4 ++-- .../src/app/components/address/address.component.ts | 6 +++--- .../components/search-form/search-form.component.ts | 2 +- .../transactions-list.component.html | 12 ++++++------ frontend/src/app/services/electrs-api.service.ts | 3 ++- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/backend/src/api/websocket-handler.ts b/backend/src/api/websocket-handler.ts index 74c4ed832..0d0332523 100644 --- a/backend/src/api/websocket-handler.ts +++ b/backend/src/api/websocket-handler.ts @@ -183,15 +183,18 @@ class WebsocketHandler { } if (parsedMessage && parsedMessage['track-address']) { - if (/^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[a-z]{2,5}1[ac-hj-np-z02-9]{8,100}|[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|[0-9a-fA-F]{130})$/ + if (/^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[a-z]{2,5}1[ac-hj-np-z02-9]{8,100}|[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|04[a-fA-F0-9]{128}|(02|03)[a-fA-F0-9]{64})$/ .test(parsedMessage['track-address'])) { let matchedAddress = parsedMessage['track-address']; if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}$/.test(parsedMessage['track-address'])) { matchedAddress = matchedAddress.toLowerCase(); } - if (/^[0-9a-fA-F]{130}$/.test(parsedMessage['track-address'])) { + if (/^04[a-fA-F0-9]{128}$/.test(parsedMessage['track-address'])) { client['track-address'] = null; client['track-scriptpubkey'] = '41' + matchedAddress + 'ac'; + } else if (/^|(02|03)[a-fA-F0-9]{64}$/.test(parsedMessage['track-address'])) { + client['track-address'] = null; + client['track-scriptpubkey'] = '21' + matchedAddress + 'ac'; } else { client['track-address'] = matchedAddress; client['track-scriptpubkey'] = null; diff --git a/frontend/src/app/components/address/address-preview.component.ts b/frontend/src/app/components/address/address-preview.component.ts index 07ead8baa..844def9fd 100644 --- a/frontend/src/app/components/address/address-preview.component.ts +++ b/frontend/src/app/components/address/address-preview.component.ts @@ -64,12 +64,12 @@ export class AddressPreviewComponent implements OnInit, OnDestroy { this.address = null; this.addressInfo = null; this.addressString = params.get('id') || ''; - if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|[A-F0-9]{130}$/.test(this.addressString)) { + if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|04[a-fA-F0-9]{128}|(02|03)[a-fA-F0-9]{64}$/.test(this.addressString)) { this.addressString = this.addressString.toLowerCase(); } this.seoService.setTitle($localize`:@@address.component.browser-title:Address: ${this.addressString}:INTERPOLATION:`); - return (this.addressString.match(/[a-f0-9]{130}/) + return (this.addressString.match(/04[a-fA-F0-9]{128}|(02|03)[a-fA-F0-9]{64}/) ? this.electrsApiService.getPubKeyAddress$(this.addressString) : this.electrsApiService.getAddress$(this.addressString) ).pipe( diff --git a/frontend/src/app/components/address/address.component.ts b/frontend/src/app/components/address/address.component.ts index ae1f6dbbe..a6cbb9617 100644 --- a/frontend/src/app/components/address/address.component.ts +++ b/frontend/src/app/components/address/address.component.ts @@ -72,7 +72,7 @@ export class AddressComponent implements OnInit, OnDestroy { this.addressInfo = null; document.body.scrollTo(0, 0); this.addressString = params.get('id') || ''; - if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|[A-F0-9]{130}$/.test(this.addressString)) { + if (/^[A-Z]{2,5}1[AC-HJ-NP-Z02-9]{8,100}|04[a-fA-F0-9]{128}|(02|03)[a-fA-F0-9]{64}$/.test(this.addressString)) { this.addressString = this.addressString.toLowerCase(); } this.seoService.setTitle($localize`:@@address.component.browser-title:Address: ${this.addressString}:INTERPOLATION:`); @@ -84,7 +84,7 @@ export class AddressComponent implements OnInit, OnDestroy { ) .pipe( switchMap(() => ( - this.addressString.match(/[a-f0-9]{130}/) + this.addressString.match(/04[a-fA-F0-9]{128}|(02|03)[a-fA-F0-9]{64}/) ? this.electrsApiService.getPubKeyAddress$(this.addressString) : this.electrsApiService.getAddress$(this.addressString) ).pipe( @@ -118,7 +118,7 @@ export class AddressComponent implements OnInit, OnDestroy { this.isLoadingAddress = false; this.isLoadingTransactions = true; return address.is_pubkey - ? this.electrsApiService.getScriptHashTransactions$('41' + address.address + 'ac') + ? this.electrsApiService.getScriptHashTransactions$((address.address.length === 66 ? '21' : '41') + address.address + 'ac') : this.electrsApiService.getAddressTransactions$(address.address); }), switchMap((transactions) => { diff --git a/frontend/src/app/components/search-form/search-form.component.ts b/frontend/src/app/components/search-form/search-form.component.ts index 61b3351b7..0a794d1f5 100644 --- a/frontend/src/app/components/search-form/search-form.component.ts +++ b/frontend/src/app/components/search-form/search-form.component.ts @@ -34,7 +34,7 @@ export class SearchFormComponent implements OnInit { } } - regexAddress = /^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[A-z]{2,5}1[a-zA-HJ-NP-Z0-9]{39,59}|[0-9a-fA-F]{130})$/; + regexAddress = /^([a-km-zA-HJ-NP-Z1-9]{26,35}|[a-km-zA-HJ-NP-Z1-9]{80}|[A-z]{2,5}1[a-zA-HJ-NP-Z0-9]{39,59}|04[a-fA-F0-9]{128}|(02|03)[a-fA-F0-9]{64})$/; regexBlockhash = /^[0]{8}[a-fA-F0-9]{56}$/; regexTransaction = /^([a-fA-F0-9]{64})(:\d+)?$/; regexBlockheight = /^[0-9]{1,9}$/; diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index d1d0673fe..22486d320 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -23,7 +23,7 @@
    @@ -56,8 +56,8 @@ Peg-in - P2PK - + P2PK + @@ -184,7 +184,7 @@
    @@ -192,8 +192,8 @@ - P2PK - + P2PK + diff --git a/frontend/src/app/services/electrs-api.service.ts b/frontend/src/app/services/electrs-api.service.ts index f866eb23d..d63d49f68 100644 --- a/frontend/src/app/services/electrs-api.service.ts +++ b/frontend/src/app/services/electrs-api.service.ts @@ -67,7 +67,8 @@ export class ElectrsApiService { } getPubKeyAddress$(pubkey: string): Observable
    { - return this.getScriptHash$('41' + pubkey + 'ac').pipe( + const scriptpubkey = (pubkey.length === 130 ? '41' : '21') + pubkey + 'ac'; + return this.getScriptHash$(scriptpubkey).pipe( switchMap((scripthash: ScriptHash) => { return of({ ...scripthash, From b1bdb528512c3276c2351397e29615b4dda71aea Mon Sep 17 00:00:00 2001 From: wiz Date: Fri, 28 Jul 2023 23:39:33 +0900 Subject: [PATCH 701/782] ops: Fix a classic typo in mempool clear protection log print --- backend/src/api/mempool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/api/mempool.ts b/backend/src/api/mempool.ts index 945b78738..e822ba329 100644 --- a/backend/src/api/mempool.ts +++ b/backend/src/api/mempool.ts @@ -274,7 +274,7 @@ class Mempool { logger.warn(`Mempool clear protection triggered because transactions.length: ${transactions.length} and currentMempoolSize: ${currentMempoolSize}.`); setTimeout(() => { this.mempoolProtection = 2; - logger.warn('Mempool clear protection resumed.'); + logger.warn('Mempool clear protection ended, normal operation resumed.'); }, 1000 * 60 * config.MEMPOOL.CLEAR_PROTECTION_MINUTES); } From cc27c0159e393270bc5e1dda8cab0d3c107c9203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dni=20=E2=9A=A1?= Date: Fri, 28 Jul 2023 23:04:44 +0200 Subject: [PATCH 702/782] [BUG]: Update frontend entrypoint.sh Typo of variable LIQUID_ENABLED --- docker/frontend/entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/frontend/entrypoint.sh b/docker/frontend/entrypoint.sh index b6946578b..7d5ee313d 100644 --- a/docker/frontend/entrypoint.sh +++ b/docker/frontend/entrypoint.sh @@ -18,7 +18,7 @@ fi __TESTNET_ENABLED__=${TESTNET_ENABLED:=false} __SIGNET_ENABLED__=${SIGNET_ENABLED:=false} -__LIQUID_ENABLED__=${LIQUID_EANBLED:=false} +__LIQUID_ENABLED__=${LIQUID_ENABLED:=false} __LIQUID_TESTNET_ENABLED__=${LIQUID_TESTNET_ENABLED:=false} __BISQ_ENABLED__=${BISQ_ENABLED:=false} __BISQ_SEPARATE_BACKEND__=${BISQ_SEPARATE_BACKEND:=false} From 354c119e9990fe30788c6cc09e607d8847702533 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sat, 29 Jul 2023 15:16:28 +0900 Subject: [PATCH 703/782] fix websocket connection state observable --- .../src/app/dashboard/dashboard.component.ts | 20 +++++++++++++------ .../src/app/services/websocket.service.ts | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 05381453d..38ee5f436 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -1,6 +1,6 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; import { combineLatest, merge, Observable, of, Subscription } from 'rxjs'; -import { filter, map, scan, share, switchMap, tap } from 'rxjs/operators'; +import { catchError, filter, map, scan, share, switchMap, tap } from 'rxjs/operators'; import { BlockExtended, OptimizedMempoolStats } from '../interfaces/node-api.interface'; import { MempoolInfo, TransactionStripped, ReplacementInfo } from '../interfaces/websocket.interface'; import { ApiService } from '../services/api.service'; @@ -171,7 +171,11 @@ export class DashboardComponent implements OnInit, OnDestroy, AfterViewInit { this.mempoolStats$ = this.stateService.connectionState$ .pipe( filter((state) => state === 2), - switchMap(() => this.apiService.list2HStatistics$()), + switchMap(() => this.apiService.list2HStatistics$().pipe( + catchError((e) => { + return of(null); + }) + )), switchMap((mempoolStats) => { return merge( this.stateService.live2Chart$ @@ -186,10 +190,14 @@ export class DashboardComponent implements OnInit, OnDestroy, AfterViewInit { ); }), map((mempoolStats) => { - return { - mempool: mempoolStats, - weightPerSecond: this.handleNewMempoolData(mempoolStats.concat([])), - }; + if (mempoolStats) { + return { + mempool: mempoolStats, + weightPerSecond: this.handleNewMempoolData(mempoolStats.concat([])), + }; + } else { + return null; + } }), share(), ); diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index e70424cdc..4bd20e987 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -113,7 +113,7 @@ export class WebsocketService { this.stateService.connectionState$.next(2); } - if (this.stateService.connectionState$.value === 1) { + if (this.stateService.connectionState$.value !== 2) { this.stateService.connectionState$.next(2); } From 2719be90751fb2309abc11dc7c9d7f6df14f422c Mon Sep 17 00:00:00 2001 From: Czino Date: Sat, 29 Jul 2023 09:53:47 +0200 Subject: [PATCH 704/782] Add contributor license agreement --- contributors/Czino.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/Czino.txt diff --git a/contributors/Czino.txt b/contributors/Czino.txt new file mode 100644 index 000000000..275149d7c --- /dev/null +++ b/contributors/Czino.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. + +Signed: Czino From 1f8f40011a83b337011b88c44b1b7735a22cae7b Mon Sep 17 00:00:00 2001 From: Czino Date: Sat, 29 Jul 2023 09:57:40 +0200 Subject: [PATCH 705/782] Update date --- contributors/Czino.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributors/Czino.txt b/contributors/Czino.txt index 275149d7c..08affb095 100644 --- a/contributors/Czino.txt +++ b/contributors/Czino.txt @@ -1,3 +1,3 @@ -I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 29, 2023. Signed: Czino From 562a5f68788dbf5c1de2dab3fe556f501bac7b1c Mon Sep 17 00:00:00 2001 From: Rishabh Date: Sat, 29 Jul 2023 15:54:34 +0530 Subject: [PATCH 706/782] rishkwal contributor license agreement added --- contributors/rishkwal.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contributors/rishkwal.txt diff --git a/contributors/rishkwal.txt b/contributors/rishkwal.txt new file mode 100644 index 000000000..9a50bda6b --- /dev/null +++ b/contributors/rishkwal.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 29, 2023. + +Signed: rishkwal From 2670589293a12027d9ca5594da1525c4c4ddf735 Mon Sep 17 00:00:00 2001 From: fiatjaf_ Date: Sat, 29 Jul 2023 09:27:12 -0300 Subject: [PATCH 707/782] Create fiatjaf.txt --- contributors/fiatjaf.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 contributors/fiatjaf.txt diff --git a/contributors/fiatjaf.txt b/contributors/fiatjaf.txt new file mode 100644 index 000000000..cdd716d3c --- /dev/null +++ b/contributors/fiatjaf.txt @@ -0,0 +1,5 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. +I also regret having ever contributed to this repository since they keep asking me to sign this legalese timewaste things. +And finally I don't care about licenses and won't sue anyone over intellectual property, which is a fake statist construct invented by evil lobby lawyers. + +Signed: fiatjaf From 945a8ce92e7bc99d3ae3b1dcde746cf1799536c1 Mon Sep 17 00:00:00 2001 From: Mononaut Date: Sun, 30 Jul 2023 18:56:57 +0900 Subject: [PATCH 708/782] Use log10 scale for projected block fee graph --- .../fee-distribution-graph.component.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts index f275588a1..212510e71 100644 --- a/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts +++ b/frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.ts @@ -74,14 +74,14 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges, OnDestr this.labelInterval = this.numSamples / this.numLabels; while (nextSample <= maxBlockVSize) { if (txIndex >= txs.length) { - samples.push([(1 - (sampleIndex / this.numSamples)) * 100, 0]); + samples.push([(1 - (sampleIndex / this.numSamples)) * 100, 0.000001]); nextSample += sampleInterval; sampleIndex++; continue; } while (txs[txIndex] && nextSample < cumVSize + txs[txIndex].vsize) { - samples.push([(1 - (sampleIndex / this.numSamples)) * 100, txs[txIndex].rate]); + samples.push([(1 - (sampleIndex / this.numSamples)) * 100, txs[txIndex].rate || 0.000001]); nextSample += sampleInterval; sampleIndex++; } @@ -118,7 +118,9 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges, OnDestr }, }, yAxis: { - type: 'value', + type: 'log', + min: 1, + max: this.data.reduce((min, val) => Math.max(min, val[1]), 1), // name: 'Effective Fee Rate s/vb', // nameLocation: 'middle', splitLine: { @@ -129,12 +131,16 @@ export class FeeDistributionGraphComponent implements OnInit, OnChanges, OnDestr } }, axisLabel: { + show: true, formatter: (value: number): string => { const unitValue = this.weightMode ? value / 4 : value; const selectedPowerOfTen = selectPowerOfTen(unitValue); const newVal = Math.round(unitValue / selectedPowerOfTen.divider); return `${newVal}${selectedPowerOfTen.unit}`; }, + }, + axisTick: { + show: true, } }, series: [{ From c88b7ddc7732201b17b9e54c50b1df32f147644e Mon Sep 17 00:00:00 2001 From: wiz Date: Mon, 31 Jul 2023 11:12:54 +0900 Subject: [PATCH 709/782] ops: Use TK7 for unfurler --- production/unfurler-config.mainnet.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/production/unfurler-config.mainnet.json b/production/unfurler-config.mainnet.json index 77df23704..fd389476b 100644 --- a/production/unfurler-config.mainnet.json +++ b/production/unfurler-config.mainnet.json @@ -1,6 +1,6 @@ { "SERVER": { - "HOST": "https://mempool.fra.mempool.space", + "HOST": "https://mempool.tk7.mempool.space", "HTTP_PORT": 8001 }, "MEMPOOL": { From 16401044f6e1da00c932575876f4a78ce8aed624 Mon Sep 17 00:00:00 2001 From: wiz Date: Mon, 31 Jul 2023 11:13:56 +0900 Subject: [PATCH 710/782] Remove text from mempool.space preview image --- .../src/resources/mempool-space-preview.png | Bin 315182 -> 295855 bytes frontend/src/resources/previews/dashboard.png | Bin 742892 -> 295855 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/frontend/src/resources/mempool-space-preview.png b/frontend/src/resources/mempool-space-preview.png index bfc59f60017e436a49a081e0a3e022e5300b15a9..60c8bcc6ac4a1ef484e3df91b4fada5e068426c4 100644 GIT binary patch literal 295855 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

    -KstMjm^%t(>cpBJ+h=| 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

    #BZURfd|b4seqI)#yS(YMsz zlQK2{zQNqVx*Xd!C{D_;^usHG=G{QNGG#1{@t^hB554;?Q^4a8HGvL;hbialpL97N zj7SBI9+k7-Fg|x%VXJtSa#Xd;?k|ypphG5dqh*?xwicA!9Z?%G4Id!)lD~`JKk!wy z+g$orGb7E6vXp<{!!BbRxci6n`%JsYK}TJ25R84gwZ(!~5T`5(qjEt&luX@mcEJh=z;Hl?)3E|zIJ%_UJdqqaQQ zqsVGd)ZZQ6JA3?LRNAn~QQW7s3syJQ#VOlvcWb;S{v1ya3nL+8Qk^8cSJ{K(5aqsq ziXI-t#Ir2xVd|Lv-84aUfq2SKhqa`4n#F;>jGuCGOA&1I&6*yxbJY%z=FDsy8~s!Q z74;5^Sla*;^pTF*p?n$C{B9B<{N1nhOU0ee%olzL2qK?W{mSX6x4h7cjl9P!DTg3D=)WvbjR)TVmf{V<6kngC-IZ17uKbxGPw^@9?Vif>X&QYrd(nh9(i^NZ( z)RK1uaqoTy!e7?br}c+0@lhU6@*RY~fjLc2p_aItM+%t*Tmn(;IH2>xLs|iK2xPDB zbWJ8@RgGbX40qrZwHDrV8em~tNoQe*(fnVLr3k{!tINJv^RtMuGck|YyQ;2jKbH~P zvePklDVI)iI_j#vhTz$f({`5Ja;VDkRsR`(%es#rRtu((9uIH;8asCFA77n#T5f)2 zy24%RJ}f!V?X_&yOi0nZr9C%;n752QGJUY|U**pp{eKnyu&LU?W5;}_fy* z?c&Yr77^NQ1}jc&2C^LpqjR^XyPw5tv^Bk#BmS{xR=-&$*~V<^fZQjyP-hH3W zdHy|`Z9b)%YW0C+ynEb&%%o_LCxeP_+?Cz2YK*yuz)Xh5`j&fgOPM^|gs8Gav-hpJd8& zGrq)0V()4(*=sKCISaIEhO5ohzMpSVAZ_5M8M_|7Ys&|ij83cnpGA8gR#aCO;e>9e zs&>B#cTX=^&HyCN)wTwsJ%-(|Vl~C8sjAEl-?*y-1|;U*X)~{(EbF90-Yv$oz|uP#saAB0!f13d28G>AAC{27CuqSr~rUw=(gQ>J^-r(e*$ zRD|@iuN-w}eAHt8Uc6A2F{ecyS=q z{(4&77z3EO*_o_pdBD7x&Rf(h$#h#48jfG2BTCN!#TCa1IKUF37gY?20i;uJ{2na> zDkLYmf(*PShGi@JR$*3PQInm)gkM>kSuP0R0Wm9Mix33genAV`+6{ZB<$aZ=HQJsz zMb`sDX`04X#Y(tttHoO_E+s%CSRJk~H7xs^^_8c)f^xSNF?0S0wwfL>1nYMEFxskgNWVmu{yR_vd{5MPm~-MmgJQG0*;kkkt!=r~Sl z`%)B9>M8g|BC}8|s^23<6RRS@%M|7> z?W$ri$hcvTd6Uwx?65ZzdS^oy0G^jbKv32M&uZU0ed_o}F%qJ@8VjT$Ic-9Uk|RI3 z(yvHEENp8oa%TTW3-ERK&nuW}%-wrWAcWzGX0}Y{@4Y1je$z3geg=HEf&fzceYQU9 zHC<MZ%!2=Jx0AlE zZ8Xc<&1GRy=o!&D%NQw=Pe@lg35a}&7s7qRF_)454^{6S)l}Mde}}Gspd*M%bsR-N z!Ac7Rka19vB2}f!APUk;fRGSG#RjNDQ7H*ZM~WyVp@gDl03k?+kN_eiv;;^XkdWlP zyzlo}zvuafwO|2jCArQy-?H~-!z{zCFHZ=9U;&9!9Ot zEpTF}VG*I!Iz{kUdPiFB1aS_zC|p4(A-34D0X}Oavi7pS8L;)%`w#(eiLOSj3dE4n zSO8O++8zUBs38k~MJ{^ICXDJG=aDyZ{msUXZX)-^aPzTFoWMx1oHBqre9jj?P5!4=t544-7dbSG(V90 z#I4|Wb@NvWtLGo&wr!@AEf)mGNK>5O#3)-9K2v&5$+fbGjFM%@ps3GLC8`GiJY2DbK$8f#|><`%g0+EwhGoS0I<#%0=$2 z3DU6F<=(LOKf)G5ZN*PClYXC~RlZJow#;m>GL-Bykd47X@|b?n4q ziDTKO=D|Pxv0kaGles%iPN*hWO2^pJ)I5*c2W)sArndN=bT1B0$VtT6=ffWXpjL!5 z{K_)w_hC!TFTmbI3T;dZFF^!jfM#26=!67f?AAIdJG@DUbRq@enCJf_;;IyX=jCbG zLY_KU9DmBd&((g#U8cYw+)@9M9>8fKYX1obHk@)|0m5? z;br~+>$Yl7bYo$p`tzoOF#ktXAAD7!T7NB=o7PKQ1fh;af&Lfb%A=_D=QKQrhl1n^ zyqvmW6+HXA2phKK*Go~J>9iU-;~^+m9)dDX`}_4ESf(BC>@s*=_HQQ_4{>W1u*w?s zPRwf5!v%4)ls)J29hbyz_Tu>q73MY86}tV^XS`kPUj-&Y>F-lJ%a%>G8;vUBoL-Vg zFJQff1d~eM4bT?6OJ$Z^=|o4jxbonVj(LJV>X-Tf0%1cBnwv4jwvk&Vs11!Hq9Wtb z`bI~Olk5ZJ&>r_AQXuZm@tGR0d2$kc8s7DvyqdpeWu+yKh>WyER*c1b_C0;ynK;~L zMwKUuSE(mm-!?L@JxPswO)?m6mK}Lye}ygI8}*_$JC)Ynz00r;IhLYnNx1FRJ(4*( zGFIs8SH}$qD9>JQ%M+tuPF+fWix!Zi&4o8t|51xiO0%z9h}Rr* z4X-lT%9@&KP3_`__hvb|opXCBupAqeoD4*HFD<4qeIh>%1?4f1@UHM@+gFF8ZVK1e zQ~lj?g+K1u^;BNqh!Cr|PEmSa<1=}O{mSPX-m`>JB;jq^FN-LC#;z;=#h5m?rDB_6 zEQDg3)mg$ig7e3%_V_n%LM8-k@^?PU5f;@EGV}qZLR>$!Rk2XDHRN6XUu#^`au@JJ z!!u)-Aa(z7iW-WTA`_M!(=vL>9$^rE2R9(=LlJ2bnwC75~+Ysp=)_ z$$Ja!V?A3@Qa@ZYsTV?m8B`C^8EhaqK;vEY^@3R-equx6CNJOjgE zX_jQSl{TkDAE3&-#F|H7{*O}UCwTg~RQ>^n0#Y@_p~3e}bkdJXYHZR^U)7SH3N?HZ zJ!e?e5$9VL4Oy(5+d?mr5)U>P2i22yo`rWew`|!LN}a>I*_A~UUsJ!l7AW$HNAf+e z@Y)v%LQf|h2O37sF7N0~UUS!~S9J3KQgC48Y=8UeX+sly|P=td!Zw z(e*WS!6EcRY(66k>1wg_A;g0+e{cBU#^{6GV(2}hxQp#e^z}fPNkV3>h9ak(vo?b(eVpkku#{(*nPaw^&;3`rUrkP_lMku zZjcfgX-s9ba*G|(WQLW@`{~>0At{)jTbGZ*KM8Xim&S9=!JrVzdCVXb$|jisHu3v#ygFWg8p7g+(|+Cnkyxivo6^eXyHEcnR}lThYt)o)9BrhA!Mt(*n{&!Ke$IyL+lT+ z6SST`p1e9j7L5q~#{2W+S#*?C$#34j-z(Dg)~huPV@ve)Xw{8h+ zD{eo>_)^S84z3P;xQ&6h-(-=VE@aUUxBT&9ER}7udF2+LGiep7z`wV~*}4WQa!I$K zZuQMdC|nu)i);TMiJN-D;^5>&XNcKKGbfj_cB4Jy7=s9I@;-vDN(vuyvqR+t_X1+) zp=`V1Ei;TB$P9+^)*`p!CFp>8!uNkel(YXYU05AUJoxi^?kbk+q8)B4W;Z|P@g~~Y zEvH3&;hoG8{C%nnQeJzjU^o`SXi7-f16jcAHDrRDa;oJr3wz$qO|tt88sP5WQ@!&O zK4bkgU<~Oc-+aQiA_B0%&XJs#BX08>%Os7p`*uCoX`r^oNz4`KV*(4vYraIOlRzHn z3v^jk2x{Gj(|~T>!74i~)sQ+BZ#!EV@QxJKyQ|=zgOtH}+3&ccct?yuEv_({qoL~X z34|sVh7{|Iv1y?6Q*&qlI?gOS@>q}RNtzSGU6?a`y=w#9UwfS9NS?4ut?mGp@rE`G zDM-6PeLbj!;rXP{+APv8>}K4=q^THCAlBz;*)(LCgG1Z3{aF)$%Il?xp)uOD2h z%vIAOBThs*O97hRI3>MZl@kbQF8{WtK0OhbAGbp>CU&qI7I#-BN7DQZTWu*eocQ+V(bJU zvB4=>LzZBo#;O91lS>v2Sv;8H%irkqJ|bG&a;NOiX?$GMss}Wyg5_O`A#%whTd>B! zL=6unfoC%HNR`N>B_+r@n4Epu=gWTZwJU{2H_(T}_B#^N@Me*Aln)Jdvdk&&RD-VJ z<6U3Bs}fUp@h%`bcxSl%X?`OU#Ji*48VHe-caHN-^LaC0??ByDM_PUNE`PZz!@Sgl zGW4vr5k7ksxJHw&Tga2y5e`lFHC#E|( zAnW&B#~MA6jY9C9HFDr7M7y@>qDV;TxFzB0W2(apG{bn%0+SeLH=`DiM|4s6`Kr#N zAf&1*61{Z6PYx`sHcK8*AqX!idsSx|XpoBxf$qTi3H;(Rb!yWQGJO3pY{XnIs?VAg zz!vT4rnwOToIC0Oq@lt}A}(?98povcsoawYOfN-&4jHPqnYRUL>RSVkwJF76nuWM~ zvxT{`zsel`&ug5Oo$_5Y?p(pegrnx{{PRGUbH?02Lk_4_r6>xs*o(~2oN2(b+*2Uq z?HP!f{3{^B9)u*~?28WDC%>TyKHAZGpM(8&+Cf^;d9y;tPtYUy5J08`L_RVEC$@k* zaEOauP)x;W*OIQrf}I5)>X0fQBJ)0W6cs%E_b@m zwDxL!Q^H07bch5Vy`g+4TDryJ3)Nv*FE4otTFz1u;W?DSD+^oZFF-PGcov{(uu8}; z7Y^7OCyDh1?!NO$O(6;EG|3P>y!%rUljn_*kL0qDUzi=$1J zlEg{7j(VeaRVDWtc|Vr&icalQM|&PJw4)uE8JyaiSD!Yd69%0;jMvoN)HH`~BupfT zyT$B^X8h#(c&R0yv=#4dGF{<+X2!aylBchQ<{3R#`ufL*pahkJ%Kqic4P!AK=MH@y zB=zaUCd4$o^glMPjc#7@#7!ZVCqY%dxhdNx%*vIZ3)w_L)K0*P9mAYi&fX6Z$GjQO z<%DD-7w%R3XpW3l$TuXPfra!I*X&9RaYee<4SiNGWmN+<9;Gsk|6;%TIcj@xoY@ds zooW_uyL-aO>oUsdnbhbLvOMuXrOnnJbW&IG$Aq=IgG}py@?@a!7pCM2SI5R@6&N6M zjyTZl@3le#CtZDEYm%wN&p}Ay^1U=M2NTMlOkVr>v7Pz#vz?q*VnoM&b(j_Mt1?!J z^&77O$m)8x0D_p;dn)aJkO3b>n@415_#fikxo_hy)#_qDIfRDD4B;5~E9I4~h;W;H z7d)C}QJ8viV%f|A2Xq_uG?Pz~u3=JE=M}k7*v#>38OCw8Xn7NM68Of7cComn{ltF{)*7`^rTO+21h_ zSTcc3!|*P%lx!0OT8qP1T)im}ZcdA;Lj!4nEn8yt+W;<$B>n}F5_w&wS#%w1t9NGt zlwdbxkic(r{~&#cxLhR4|H+QL`X=oxqrtr`&U#)BAhKzPQ+Oo^!L!Trl>u+{3WJsI zOk95eL*oiVs^-UOQIg%ORf%ga-Xcr-Fw3n?!3nmwm~G7uiF z1JxL5Kp^PyFpsE2Fwk7tCeUOL(O^Lc{!{bZOdDr_#7X**gROFWOJvhUewR5H10iVp z;V;6~c;-Zna}D=qwJYMKaRvo{yJBHU3+`}_B4^hrQ`}J?^EW~=aVNN&S3vFE;hcy{ z`sE2g3PrdX&=wO4x%Ig;sstTzU%!?T=8)j%K5N7=@8{wz}>15mw{7jb;i7h zQjGY(WD#zuTwjl!vD*cxb4zau$GS9ahaS2*<#^MK5N>Kf?ymqLo5EGuw>ciGsY+zA$Qg@Hk z^a^oEz-3MYU<|-dT|ziw-fSk&I!>!M-RXtOkKm@d`Rl`e>(JOh%o{e)PXkQ_CTMHz zfkBZlx+1ZKX~Oy+&h|;2KEJr|e0(&3!kqUQ)N<7tI@70?J}q8jRBNK=hH24&G{*0N z5V8uh{IRyrC)URnax8DaAJP zM?a6WH8+j_8o7-05MxLZJpwobkAJ6(oUi}1+{}ngTy&SoRa{8NHxI)6FBprh7yU)h zsoJa78u>O=u6DpVAUtC(UIeXEYmBifviE{;$mk8Mtmg9*#2o~3YJv@9<4VQkf8ROX z1tJ)o&oZ+aCVats_T)NM6vg3j=vQz5S3uee2Gje^i@je+To4Vl)%c7S+t2RKGz#6g z+~T$PwDvpUU^UwOPPu$c@h>btW8=Ubp;o|(7 zsu(r|W&2R?39sc-uAN8xS7O97j;VRZXT2z4{$1y-K^A$-=@SN`S@&V+R`J?aF*6cj zo456?xTqzvQ)p=RZtm!QSH!K3rkV=7a|G##hpc+M7eGbU01xsn)9@SNcTd;~rSZBL ze=r$lL`k5j+i`Lb7NnrpAyc%w024O2T@}B8?%86#UY~HG~OS+d7!(&=>J0x@5M};or2tkF39LdyZUJjge{FYPLeh? zkDQ=R$6lH79H^6@jlBZ)0iOU;;)6-Czw4a|#gk@N7jvH;q}zT-#i}g6BlQgaibNQ) z%(?^Ii1M{@QnZL0aFGEdKKkK;WbZkXgj=@Lpsw-~iL;rOn~MKbWNdZ8s34ki(xc?N zs!8!#W;Vol#5e?V6$#UW-li^MET2SQo=!bU(drzku?VSu?|_q!5xBeN9=-x9qoT9* z%hxzL;As$KCBeOBRvb5pHHS~B^f!XZ>7E?3G;MY!K+WTn|KxycIlw@p@p+NEcHMQ= z-l@2qCjQ!?qTTU#%Q0%{Gosky);FyN94&Xk#d=2XVKf}F6~D_`i~gm1=lfoH-}n)r zQx*zj`$i7Z4cNcNKpb_fSIbQI3HqJ3>MT{0?}_^2M|ZfJ#OO=dNL~JvCkB_hVHsK> zIeKFu2kCvRis<;zTSxjgwa+OVb9w(+8C6H4XXj*nJASOS$ih4k*9lyNz_8dU<( zDYNC7wuKe&etPelSX7gB2q`HG`Sku4>T5w~pOYFqHyUy#1Y42L9ApVQIC1u7Wm^_1LR4G{2`O9TW zkw2qbl6QS~k^00SHO0KPGL`Bm{wv%2IWy>6@7^Fq9*vZdl={tOEa9)o{Xyq?l?Axb z;o=(!nMlc$y(zhkdP`#W?NVR|kk4K*>4kp?&%a7Myirbf{8D4A)I7Q;2;_)VB?zj> z(Y2Cbf#{XZFydH&Ug7>+f&nMTv3s??45Pk@=f{@_h=FXW^zCDeeoN z8WTysBClq*gcDB(zBq%2!g26W_%8-ERFpk4z+}hGJ`c#XFm4ZVwswcWYlTIF%i7D0 zNxbtP)SRZpX*{otIFyA1vo*e?KCd8JDkiv3B@m;72HH`m0!f3b7kq7B086^pZg8A_ zA&lBzz1N(%D-h$B!Y(=qKlj~#ivRjblv=h0yDw9LR;`*rbD=fqs)HUlgXX6$MtgS@ zFS34Pu?czfnx`W!jo|r0u9Up%89DsYOmOQ&aiG;Yu8jrhU1rI4N&pa9m1$5$O2OJt)4duK&1}y+T`|zIz zw<{g%iR+Sm$R5^?zUKa>vd+L8oDZ;~yUE7$(s@9;mk0uKIjiAfKTdlftY>WJ#~asF z(6}UedL{B$FBt{kl|%Xj*Q5w?aqIPx4C-Q`%qz8ke9g<@E`I(2cO|D!`x#sME+mP~ z?;s4FQu1zbDDy8RC%w$AvOYF^U9s19Kv*`&lF^Qln!{0zk^VqDkpiJ7oazw*Z?K@~ z6MuW&L4I7_i+n*-zy|r4 zEEPUNe2#J2Pv=FX8CS_@=&oC_6A4fC{67WF^6qMm9XIMYBugtVP>$l>k%}80WbNjrjIF_wYM0deX;-Scdk-*! zfN`>=-Kv}Sb>p9{}SR(Z|V@w1?}4HHa;NpOh-eTu0Vd!-4?mV9!BGqG9mWv|Nj zN6VdeP!{t3`HiA8=++#O)z8Q`N3WAD87MfJ`0hR@j6-o9Vz%C9hr+;lWXG``Scnhb$ z8I%jrj+9E-sSQ<(5=HsNu^ZP0S7aaTLg_p}peN;SzWpC9K&NO+W5gf-=WRw5eYNvE z8albR)m?k6)DBSPe_12{f$&MfZIaAM;UYn>*e_Vq6V}9|SWmsctO+X7M-Y11W?4&f zlx~=JNhP0u{^XuF=TnsQj#0Q``ugIZ&qR9l4w@T>AAB>wn^O(_Xj5frQIka&eUFIkKfR@3iOh zN{TtRNse>sIko>&8VP&RZrbQP`^8uOC3p37TFYx`Nx+75+O1tgwc$%pPv>+rwzcr!^sn*|MP-`@J zK^>F)8z4#)IZ1_j2Iimf1`8E{zd*;@E!%35J#N60elGJKi#A(^Lg>f?(}u&AQdpS6 zl5av4*vLgB(MY7l3pT6+;oWhQ2i{Y$F!@&FibtcL1TMQ-9qZ2y!;@>mzRVeEuDb{yxRCQPlcAFsS?bOoyA40FA~hjCOgU; zY-|H~WugVd)p#KsXiSBlBPAgCnmc|(!RuehckUoOPB2-dcSrbgvTW`3JzBs=yLIAe zuToUjJb|^2ApFY;nF9|6;qvH$Y@Zjvkc{3CLr%U1*7?EzB#nShfhc1x9}scbxwjQs z5Uy1FMeOH3Vl{U<=d0=9@2&yxRaFUL#y!=*?1)`a&hnJz-Ma%S$oiOeWXYi2=BMTA zC5PsB#z>tKV8z8DH#%$|r0zB?2nPH-2<3*zEM!RMid6>gB8}RTrSm;Ql;0pu->yI2 z$fcb^@-B`A2e3DA$NB(?+RgtYvUOFY8==i{V5&?T4Z}iezqui5(5!qA`8Ht@1aQP! zeE=~TC=N!SI?miPyNb**MAnP+0smL(Ni z#pwlqW(BZ#2h#U?%U_PTJg;UR_kflifB~63hl8NSQJ4`k@?u`n>0D=;lRWa_v>!&U z(+$5N`OT_~^P-)SxK?v_3M$H8tGC=3czjT`4eZW13u}R!90s{4@Oe#h>orN5$Ai@Q zaUJujsi-CBR9xN@G1VN0RvGiTtiMmk#iq~eD;EP7AkUEKy%zKAb zMs*TMJ-co1c0?S9^z282Qo$`R5Me%*R^CF=xHCVVm3nn#GI!}+rA^x5

    dmVn|3E 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

    oJd6d{T;=( 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 Q`0tC&+c#Bw7XHnD0G%9=*#H0l literal 315182 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

    _(5X%p*g0}R~?^N~7B1})&%-SO^_UhwMo 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

    L63g(wPjmYzG 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